PartnerUserServiceImpl.java 55 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320
  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.LocalDate;
  6. import java.time.LocalDateTime;
  7. import java.time.ZoneId;
  8. import java.util.*;
  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.dao.SysUserMapper;
  19. import com.ydtech.modules.admin.model.SysUser;
  20. import com.ydtech.modules.admin.model.vo.AppUserInfoVo;
  21. import com.ydtech.modules.admin.service.impl.SysUserServiceImpl;
  22. import com.ydtech.modules.base.controller.BaseController;
  23. import com.ydtech.modules.order.dao.InsUploadFilesMapper;
  24. import com.ydtech.modules.order.entity.api.zhongmei.constants.TimeConstants;
  25. import com.ydtech.modules.order.entity.po.InsUploadFiles;
  26. import com.ydtech.modules.partner.dao.PartnerLiftingRecordMapper;
  27. import com.ydtech.modules.partner.dao.PartnerPartnerAccountMapper;
  28. import com.ydtech.modules.partner.dao.PartnerPremiumDetailsMapper;
  29. import com.ydtech.modules.partner.dao.PartnerUserMapper;
  30. import com.ydtech.modules.partner.model.*;
  31. import com.ydtech.modules.partner.model.param.*;
  32. import com.ydtech.modules.partner.model.vo.*;
  33. import com.ydtech.modules.partner.service.PartnerCommissionService;
  34. import com.ydtech.modules.partner.service.PartnerLiftingRecordService;
  35. import com.ydtech.modules.partner.service.PartnerRuleService;
  36. import com.ydtech.modules.partner.service.PartnerUserService;
  37. import com.ydtech.modules.partner.utils.ConditionUtils;
  38. import com.ydtech.modules.partner.utils.ExpiredCommissionUtils;
  39. import com.ydtech.modules.partner.utils.PartnerDateUtils;
  40. import org.apache.commons.lang3.ObjectUtils;
  41. import org.apache.commons.lang3.StringUtils;
  42. import org.springframework.beans.factory.annotation.Autowired;
  43. import org.springframework.beans.factory.annotation.Value;
  44. import org.springframework.stereotype.Service;
  45. import javax.annotation.Resource;
  46. import java.util.function.Function;
  47. import java.util.stream.Collectors;
  48. @Service
  49. public class PartnerUserServiceImpl extends ServiceImpl<PartnerUserMapper, PartnerUser> implements PartnerUserService {
  50. @Autowired
  51. private PartnerRuleService ruleService;
  52. @Autowired
  53. private PartnerLiftingRecordService liftingRecordService;
  54. @Resource
  55. private SysUserMapper sysUserMapper;
  56. @Autowired
  57. private InsUploadFilesMapper uploadFilesMapper;
  58. @Autowired
  59. private PartnerPartnerAccountMapper partnerPartnerAccountMapper;
  60. @Autowired
  61. private PartnerPremiumDetailsMapper detailsMapper;
  62. @Autowired
  63. private PartnerLiftingRecordMapper liftingRecordMapper;
  64. @Autowired
  65. private PartnerPartnerAccountMapper accountMapper;
  66. @Autowired
  67. private PartnerCommissionService commissionService;
  68. @Autowired
  69. private PartnerRuleService partnerRuleService;
  70. @Value("${partner.expireDays}")
  71. private Long expireDays;
  72. @Override
  73. public IPage<PartnerUserVo> queryPage(QueryVo queryVo) {
  74. IPage<PartnerUserVo> page = baseMapper.queryPage(queryVo.getPage(),queryVo);
  75. return page;
  76. }
  77. @Override
  78. public List<RelationalVo> relationalQuery(String id) {
  79. List<RelationalVo> list = new ArrayList<>();
  80. Integer grade = baseMapper.selectGradeMin(id);
  81. List<RelationalVo> partnerUsers = baseMapper.selectByUserId(id,grade);
  82. if (1 < grade){
  83. querySuperiors(list, grade,partnerUsers);
  84. }
  85. list.addAll(partnerUsers);
  86. querySubordinates(partnerUsers, grade,list);
  87. return list;
  88. }
  89. public void querySuperiors(List<RelationalVo> list,Integer grade,List<RelationalVo> partnerUsers){
  90. if (CollectionUtil.isEmpty(partnerUsers)){
  91. return;
  92. }
  93. String userId = partnerUsers.get(0).getUserId();
  94. grade --;
  95. List<RelationalVo> relationalVos = baseMapper.selectQuerySuperiors(userId,grade);
  96. list.addAll(relationalVos);
  97. querySuperiors( list, grade, relationalVos);
  98. }
  99. public void querySubordinates(List<RelationalVo> partnerUsers,Integer grade,List<RelationalVo> list){
  100. if (CollectionUtil.isEmpty(partnerUsers)){
  101. return;
  102. }
  103. String userId = partnerUsers.get(0).getUserId();
  104. grade ++;
  105. List<RelationalVo> relationalVos = baseMapper.selectByReferrerId(userId,grade);
  106. list.addAll(relationalVos);
  107. querySubordinates(relationalVos, grade,list);
  108. }
  109. @Override
  110. public List<Map<String, String>> selectRecommender(String level) {
  111. if (StringUtils.isEmpty(level)){
  112. return new ArrayList<>(0);
  113. }
  114. if (StringUtils.equals(level,"2")){
  115. level = "1";
  116. }else if (StringUtils.equals(level,"3")){
  117. level = "2";
  118. }else if (StringUtils.equals(level,"4")){
  119. level = "3";
  120. }
  121. return baseMapper.selectRecommender(level);
  122. }
  123. @Override
  124. public HttpResult verifyUpgradeConditions(UserGradeParam userGradeParam) {
  125. if (StringUtils.isBlank(userGradeParam.getGrade())){
  126. return HttpResult.error("参数不能为空");
  127. }
  128. String grade = userGradeParam.getGrade();
  129. if (StringUtils.equals("2",grade)){
  130. return HttpResult.error("当前用户无法升级");
  131. }
  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. QueryWrapper<PartnerLiftingRecord> wrapper = new QueryWrapper<>();
  137. wrapper.eq("user_id",userGradeParam.getId());
  138. wrapper.eq("audit_status",0);
  139. Long aLong = liftingRecordMapper.selectCount(wrapper);
  140. if (count > 0 || aLong > 0){
  141. return HttpResult.error("不满足升级条件");
  142. }
  143. if (ruleService.verifyUpgradeConditions(userGradeParam.getId(),userGradeParam.getGrade())){
  144. return HttpResult.ok("满足升级条件");
  145. }
  146. return HttpResult.error("不满足升级条件");
  147. }
  148. @Override
  149. public HttpResult submitLiftingRecord(UserGradeParam userGradeParam) {
  150. if (!StringUtils.equals("4",userGradeParam.getGrade())){
  151. userGradeParam.setGrade(String.valueOf(Integer.valueOf(userGradeParam.getGrade()) + 1));
  152. }
  153. if (StringUtils.equals("1",userGradeParam.getGrade())){
  154. return HttpResult.error("当前用户无法解锁");
  155. }
  156. QueryWrapper<PartnerLiftingRecord> wrapper = new QueryWrapper<>();
  157. wrapper.eq("user_id",userGradeParam.getId());
  158. wrapper.eq("audit_status",0);
  159. wrapper.eq("type",0);
  160. Long aLong = liftingRecordMapper.selectCount(wrapper);
  161. if (aLong > 0){
  162. return HttpResult.error("重复提交,等待管理员审批");
  163. }
  164. LambdaQueryWrapper<PartnerUser> lambdaQueryWrapper = new LambdaQueryWrapper<>();
  165. lambdaQueryWrapper.eq(PartnerUser::getUserId,userGradeParam.getId());
  166. lambdaQueryWrapper.eq(PartnerUser::getGrade,userGradeParam.getGrade());
  167. PartnerUser partnerUser = baseMapper.selectOne(lambdaQueryWrapper);
  168. if (Objects.isNull(partnerUser)){
  169. return HttpResult.error("用户不存在");
  170. }
  171. // 条件
  172. PartnerLiftingRecord record = new PartnerLiftingRecord();
  173. record.setName(partnerUser.getName());
  174. record.setMobile(partnerUser.getMobile());
  175. record.setUserId(partnerUser.getUserId());
  176. record.setDeptId(partnerUser.getDeptId());
  177. record.setDeptName(partnerUser.getDeptName());
  178. record.setType("0");
  179. record.setOriginalLevel(userGradeParam.getGrade());
  180. record.setUpgradeType(userGradeParam.getUpgradeType());
  181. record.setCreateTime(new Date());
  182. switch (userGradeParam.getGrade()) {
  183. case "1":
  184. record.setAfterChange("");
  185. break;
  186. case "2":
  187. record.setAfterChange("1");
  188. break;
  189. case "3":
  190. record.setAfterChange("2");
  191. break;
  192. case "4":
  193. record.setAfterChange("3");
  194. break;
  195. }
  196. record.setConditions(ConditionUtils.upgradeConditions(record.getOriginalLevel()));
  197. record.setRules(ConditionUtils.assessmentRules(record.getOriginalLevel()));
  198. return liftingRecordService.saveLiftingRecord(record);
  199. }
  200. public String getMessage(PartnerRuleEntity ruleEntity){
  201. String message = "";
  202. PartnerAttribute entityCycle = ruleEntity.getCycle();
  203. switch (entityCycle.getCycle()){
  204. case "1":
  205. message = "成为该等级后,无限期";
  206. break;
  207. case "2":
  208. message = "成为该等级后,限期" + entityCycle.getFixedDays() + "天";
  209. break;
  210. case "3":
  211. message = "成为该等级后,固定限期" + entityCycle.getMin() + "至" + entityCycle.getMax();
  212. break;
  213. }
  214. return message;
  215. }
  216. @Override
  217. public HttpResult getHomePage(AppHomeParams params) {
  218. if (StringUtils.isBlank(params.getUserId())){
  219. return HttpResult.error("参数不能为空");
  220. }
  221. Set<String> list = baseMapper.getLevelAllUserId(params.getUserId());
  222. params.setRelatedPerList(list);
  223. params.setCountCycle("Day");
  224. HomeVo homeVo = new HomeVo();
  225. TodayOverview overview = new TodayOverview();
  226. if (CollectionUtil.isNotEmpty(list)){
  227. overview = baseMapper.selectTodayOverview(params);
  228. homeVo.setTodayOverview(overview);
  229. }else {
  230. homeVo.setTodayOverview(overview);
  231. }
  232. //查询当前用户等级
  233. List<TeamOverviewVo> teamOverviewVos = baseMapper.selectTeamOverview(params);
  234. List<PartnerUser> partnerUsers = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class)
  235. .eq(PartnerUser::getUserId,params.getUserId())
  236. .in(PartnerUser::getGrade, getGradeList(teamOverviewVos)));
  237. Map<Integer, PartnerUser> userMap = partnerUsers.stream()
  238. .collect(Collectors.toMap(PartnerUser::getGrade, Function.identity()));
  239. for (TeamOverviewVo overviewVo : teamOverviewVos) {
  240. PartnerUser partnerUser = userMap.get(Integer.valueOf(overviewVo.getGrade()));
  241. switch (overviewVo.getGrade()){
  242. case "1":
  243. overviewVo.setVo1(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  244. break;
  245. case "2":
  246. overviewVo.setVo2(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  247. break;
  248. case "3":
  249. overviewVo.setVo3(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  250. break;
  251. case "4":
  252. overviewVo.setVo4(baseMapper.selectStatistics(overviewVo.getGrade(), params));
  253. break;
  254. }
  255. if (null == partnerUser){
  256. overviewVo.setParentStatus("0");
  257. }else {
  258. if (partnerUser.isIdentityStatus()){
  259. overviewVo.setParentStatus("2");
  260. overviewVo.setLockCommission(accountMapper.selectCashFee(partnerUser.getUserId(), partnerUser.getGrade()));
  261. Long difference = calculateTimeDifference(partnerUser.getUserId(), partnerUser.getGrade());
  262. overviewVo.setZeroDays(difference);
  263. PartnerRuleEntity rule = partnerRuleService.selectByGrade(overviewVo.getGrade());
  264. overviewVo.setFallAmount(rule.getFallAmount());
  265. getRule(overviewVo, partnerUser);
  266. }else {
  267. overviewVo.setParentStatus("1");
  268. }
  269. }
  270. }
  271. homeVo.setTeamOverview(teamOverviewVos);
  272. return HttpResult.ok(homeVo);
  273. }
  274. public List<String> getGradeList(List<TeamOverviewVo> teamOverviewVos) {
  275. return teamOverviewVos.stream()
  276. .map(TeamOverviewVo::getGrade)
  277. .distinct()
  278. .collect(Collectors.toList());
  279. }
  280. @Override
  281. public List<String> getUserGradeList(String userId) {
  282. QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
  283. queryWrapper.eq("user_id", userId);
  284. List<PartnerUser> partnerUsers = baseMapper.selectList(queryWrapper);
  285. return partnerUsers.stream()
  286. .map(user -> String.valueOf(user.getGrade()))
  287. .collect(Collectors.toList());
  288. }
  289. @Override
  290. public HttpResult addUserIdentity(Map<String, Object> map) {
  291. try {
  292. if (map.containsKey("userId")){
  293. String userId = (String) map.get("userId");
  294. PartnerUser partnerUsers = baseMapper.selectMaxGradeUserId(userId);
  295. if (partnerUsers == null){
  296. return HttpResult.error("请选择用户");
  297. }
  298. if (StringUtils.equals("4",String.valueOf(partnerUsers.getGrade()))){
  299. return HttpResult.error("请邀请团队长");
  300. }
  301. if (map.containsKey("gradeList")){
  302. List<String> list = (ArrayList<String>) map.get("gradeList");
  303. List<String> gradeList = list.stream()
  304. .sorted(Comparator.comparingInt(Integer::parseInt))
  305. .collect(Collectors.toList());
  306. if (partnerUsers != null && CollectionUtil.isNotEmpty(gradeList)){
  307. SysUser sysUser = sysUserMapper.selectById(userId);
  308. for (String s : gradeList) {
  309. String deptId = sysUser.getDeptId();
  310. if (StringUtils.equals("4",s)){
  311. deptId = SpringUtil.getBean(SysUserServiceImpl.class).addDeptUser(sysUser,s);
  312. }
  313. PartnerUser partnerUser = new PartnerUser();
  314. partnerUser.setName(sysUser.getName());
  315. partnerUser.setMobile(sysUser.getMobile());
  316. partnerUser.setUserId(sysUser.getId());
  317. partnerUser.setDeptId(deptId);
  318. partnerUser.setDeptName(sysUser.getDeptName());
  319. partnerUser.setGrade(Integer.valueOf(s));
  320. partnerUser.setReferrerId(partnerUsers.getUserId());
  321. baseMapper.insert(partnerUser);
  322. }
  323. }
  324. }
  325. }
  326. }catch (Exception e){
  327. log.error("添加失败",e);
  328. return HttpResult.error();
  329. }
  330. return HttpResult.ok("添加成功");
  331. }
  332. @Override
  333. public HttpResult queryIdentityInformation(String userId) {
  334. List<PartnerRule> partnerRules = ruleService.selectAll();
  335. List<PartnerUser> partnerUsers = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, userId));
  336. Map<Integer, PartnerUser> userMap = partnerUsers.stream()
  337. .collect(Collectors.toMap(
  338. PartnerUser::getGrade,
  339. user -> user
  340. ));
  341. List<MyUserLevel> list = getUserLevels(userId, partnerRules, userMap);
  342. list.sort((o1, o2) -> Integer.compare(o2.getGrade(), o1.getGrade()));
  343. return HttpResult.ok(list);
  344. }
  345. @Override
  346. public HttpResult queryDowngradeTask(String grade, String userId) {
  347. PartnerRuleEntity partnerRuleEntity = ruleService.selectByGrade(grade);
  348. partnerRuleEntity.setStrategyArray(null);
  349. CommissionValidityPeriod period = ruleService.getCommissionValidityPeriod(partnerRuleEntity.getCycle(), userId, grade);
  350. partnerRuleEntity.setAssessmentEndDate(period.getEndDate().split(" ")[0]);
  351. BigDecimal bf = baseMapper.subordinateMembersInsurancePremiums(userId, grade, period);
  352. BigDecimal p = ruleService.getInviteData(userId, grade, period);
  353. BigDecimal ownBf = baseMapper.selectOwnSumPremium(userId, period);
  354. List<PartnerAttribute> requirement = partnerRuleEntity.getRequirement();
  355. return getAttribute(partnerRuleEntity,bf, p, ownBf, requirement);
  356. }
  357. private HttpResult getAttribute(PartnerRuleEntity partnerRuleEntity, BigDecimal bf, BigDecimal p, BigDecimal ownBf, List<PartnerAttribute> requirement) {
  358. requirement.get(0).setAchieve(String.valueOf(p));
  359. requirement.get(1).setAchieve(null != bf ? bf.toString() : BigDecimal.ZERO.toString());
  360. requirement.get(2).setAchieve(null != ownBf ? ownBf.toString() : BigDecimal.ZERO.toString());
  361. return HttpResult.ok( partnerRuleEntity);
  362. }
  363. @Override
  364. public HttpResult degradedTask(String grade, String userId) {
  365. PartnerRuleEntity partnerRuleEntity = ruleService.selectByGrade(grade);
  366. if (partnerRuleEntity == null){
  367. return HttpResult.error("等级不存在");
  368. }
  369. partnerRuleEntity.setRequirement(null);
  370. CommissionValidityPeriod period = baseMapper.selectUpgradeCycleStartTime(userId, Integer.valueOf(grade));
  371. period.setEndDate(SpringUtil.getBean(ExpiredCommissionUtils.class).generateDowngradeTime(grade,period.getStartDate()));
  372. partnerRuleEntity.setAssessmentEndDate(period.getEndDate().split(" ")[0]);
  373. BigDecimal bf = baseMapper.subordinateMembersInsurancePremiums(userId, grade, period);
  374. BigDecimal p = ruleService.getInviteData(userId, grade, period);
  375. BigDecimal ownBf = baseMapper.selectOwnSumPremium(userId, period);
  376. List<PartnerAttribute> strategyArray = partnerRuleEntity.getStrategyArray();
  377. return getAttribute(partnerRuleEntity, bf, p, ownBf, strategyArray);
  378. }
  379. @Override
  380. public Integer selectByUserIdMax(String referrerId) {
  381. return baseMapper.selectByUserIdMax(referrerId);
  382. }
  383. private List<MyUserLevel> getUserLevels(String userId, List<PartnerRule> partnerRules, Map<Integer, PartnerUser> userMap) {
  384. List<MyUserLevel> list = new ArrayList<>();
  385. // 输入参数校验
  386. if (partnerRules == null || userId == null || userMap == null) {
  387. return list;
  388. }
  389. for (PartnerRule rule : partnerRules) {
  390. Integer grade = rule.getGrade();
  391. PartnerUser partnerUser = userMap.get(grade);
  392. MyUserLevel level = createBasicUserLevel(rule);
  393. if (partnerUser == null) {
  394. handleUnregisteredUser(userId, userMap, grade, level);
  395. } else {
  396. handleRegisteredUser(userId, partnerUser, level);
  397. }
  398. list.add(level);
  399. }
  400. return list;
  401. }
  402. // 提取创建基础UserLevel的逻辑
  403. private MyUserLevel createBasicUserLevel(PartnerRule rule) {
  404. MyUserLevel level = new MyUserLevel();
  405. level.setFallAmount(rule.getFallAmount());
  406. level.setRatio(getProportion(rule.getGrade()));
  407. level.setGrade(rule.getGrade());
  408. level.setGradeName(rule.getGradeName());
  409. return level;
  410. }
  411. // 处理未注册用户的逻辑
  412. private void handleUnregisteredUser(String userId, Map<Integer, PartnerUser> userMap,
  413. Integer grade, MyUserLevel level) {
  414. level.setLockingState("0");
  415. level.setProgressBar(0);
  416. // 只有非1级才需要检查升级条件
  417. if (!grade.equals(1) && userMap.containsKey(grade + 1)) {
  418. boolean verified = ruleService.verifyUpgradeConditions(userId, String.valueOf(grade + 1));
  419. level.setProgressBar(verified ? 2 : 1);
  420. level.setUpgrade(verified);
  421. }
  422. // 检查降级记录
  423. if (liftingRecordService.selectDowngradeRecord(userId, grade, 0) > 0) {
  424. level.setUpgradeStatus(true);
  425. }
  426. }
  427. // 处理已注册用户的逻辑
  428. private void handleRegisteredUser(String userId, PartnerUser partnerUser, MyUserLevel level) {
  429. level.setUserId(userId);
  430. level.setUserName(partnerUser.getName());
  431. if (partnerUser.isIdentityStatus()) {
  432. handleActiveUser(partnerUser, level);
  433. } else {
  434. level.setLockingState("1");
  435. }
  436. level.setProgressBar(2);
  437. }
  438. // 处理活跃用户的逻辑
  439. private void handleActiveUser(PartnerUser partnerUser, MyUserLevel level) {
  440. level.setLockingState("2");
  441. level.setLockCommission(accountMapper.selectCashFee(partnerUser.getUserId(), partnerUser.getGrade()));
  442. Long difference = calculateTimeDifference(partnerUser.getUserId(), partnerUser.getGrade());
  443. level.setZeroDays(difference);
  444. Integer grade = partnerUser.getGrade();
  445. if (grade != 4){
  446. grade = grade + 1;
  447. }
  448. // 检查升级条件
  449. boolean verified = ruleService.verifyUpgradeConditions(
  450. partnerUser.getUserId(), String.valueOf(grade));
  451. level.setUpgrade(verified);
  452. // 检查降级记录
  453. if (liftingRecordService.selectDowngradeRecord(
  454. partnerUser.getUserId(), partnerUser.getGrade() + 1, 1) > 0) {
  455. level.setUpgradeStatus(true);
  456. }
  457. }
  458. public String getProportion(Integer grade){
  459. CommissionRulesVo rulesVo = commissionService.queryAll();
  460. if (grade == 1){
  461. return rulesVo.getOriginator();
  462. }else if (grade == 2){
  463. PartnerCommissionRules administrator = rulesVo.getAdministrator();
  464. List<PartnerRulesRatio> list = administrator.getRulesRatioList();
  465. return list.get(0).getKickback().stripTrailingZeros().toPlainString() + "-" + list.get(2).getKickback().stripTrailingZeros().toPlainString();
  466. }else if (grade == 3){
  467. PartnerCommissionRules partner = rulesVo.getPartner();
  468. List<PartnerRulesRatio> list = partner.getRulesRatioList();
  469. return list.get(0).getKickback().stripTrailingZeros().toPlainString() + "-" + list.get(2).getKickback().stripTrailingZeros().toPlainString();
  470. }else if (grade == 4){
  471. PartnerCommissionRules partner = rulesVo.getPartner();
  472. List<PartnerRulesRatio> list = partner.getRulesRatioList();
  473. return list.get(0).getKickback().stripTrailingZeros().toPlainString() + "-" + list.get(2).getKickback().stripTrailingZeros().toPlainString();
  474. }
  475. return "0";
  476. }
  477. @Override
  478. public void deleteByUserId(String id) {
  479. baseMapper.deleteByUserId(id);
  480. }
  481. @Override
  482. public HttpResult selectUser(AppHomeParams params) {
  483. return HttpResult.ok(baseMapper.selectUser(params));
  484. }
  485. public Integer queryLevel(Integer grade){
  486. if (!Objects.isNull(grade)){
  487. switch (grade){
  488. case 1:
  489. return 2;
  490. case 2:
  491. return 3;
  492. case 3:
  493. return 4;
  494. case 4:
  495. return 5;
  496. }
  497. }
  498. return 1;
  499. }
  500. public Map<Integer, String> getRule() {
  501. List<PartnerRule> partnerRules = ruleService.selectAll();
  502. Map<Integer, String> ruleMap = partnerRules.stream()
  503. .collect(Collectors.toMap(
  504. PartnerRule::getGrade,
  505. rule -> rule.getGradeName() != null ? rule.getGradeName() : "",
  506. (existing, replacement) -> existing
  507. ));
  508. ruleMap.put(5, "团队长");
  509. ruleMap.put(6, "业务员");
  510. return ruleMap;
  511. }
  512. @Override
  513. public HttpResult userCountVo(AppHomeParams params) {
  514. return HttpResult.ok();
  515. }
  516. @Override
  517. public HttpResult selectByIdList(PartnerApp partnerApp) {
  518. if (StringUtils.isEmpty(partnerApp.getId())) {
  519. return HttpResult.error("ID不能为空");
  520. }
  521. PartnerUser partnerUser = baseMapper.selectById(partnerApp.getId());
  522. if (ObjectUtils.isEmpty(partnerUser)) {
  523. return HttpResult.error("人员不存在");
  524. }
  525. JSONObject referrerInfo = new JSONObject();
  526. referrerInfo.put("referrerGrade",baseMapper.selectByUserIdGrade(partnerUser.getUserId()));
  527. referrerInfo.put("referrerName",baseMapper.selectByUserIdUserName(partnerUser.getUserId()));
  528. referrerInfo.put("mobile",partnerUser.getMobile());
  529. referrerInfo.put("userName",partnerUser.getName());
  530. HashMap<String, Object> map = new HashMap<>();
  531. Page page = getLevelUser(partnerUser.getUserId(), partnerUser.getGrade(), partnerApp, getRule());
  532. map.put("list",getPage( page));
  533. map.put("referrer",referrerInfo);
  534. map.put("parentStatus",partnerUser.isIdentityStatus() ? "2" : "1");
  535. return HttpResult.ok(map);
  536. }
  537. @Override
  538. public HttpResult selectByGradeList(PartnerApp partnerApp) {
  539. if (StringUtils.isEmpty(partnerApp.getUserId()) || StringUtils.isEmpty(partnerApp.getGrade())) {
  540. return HttpResult.error("用户ID和等级不能为空");
  541. }
  542. AppHomeParams params = new AppHomeParams();
  543. params.setUserId(partnerApp.getUserId());
  544. List<TeamOverviewVo> teamOverviewVos = baseMapper.selectTeamOverview(params);
  545. List<Object> list = new ArrayList<>();
  546. Map<Integer, String> rule = getRule();
  547. List<String> grades = teamOverviewVos.stream()
  548. .map(TeamOverviewVo::getGrade)
  549. .distinct()
  550. .collect(Collectors.toList());
  551. List<PartnerUser> partnerUsers = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class)
  552. .eq(PartnerUser::getUserId, partnerApp.getUserId())
  553. .in(PartnerUser::getGrade, grades));
  554. Map<Integer, PartnerUser> userMap = partnerUsers.stream()
  555. .collect(Collectors.toMap(PartnerUser::getGrade, Function.identity()));
  556. for (TeamOverviewVo overviewVo : teamOverviewVos) {
  557. JSONObject map = new JSONObject();
  558. map.put("grade",overviewVo.getGrade());
  559. map.put("gradeName",overviewVo.getGradeName());
  560. PartnerUser partnerUser = userMap.get(Integer.valueOf(overviewVo.getGrade()));
  561. HashMap<String, Object> hashMap = new HashMap<>();
  562. try {
  563. if (null == partnerUser) {
  564. setDefaultValues(hashMap);
  565. map.put("data", new JSONObject());
  566. map.put("total", hashMap);
  567. map.put("parentStatus", "0");
  568. } else {
  569. Page page = getLevelUser(partnerUser.getUserId(), partnerUser.getGrade(), partnerApp, rule);
  570. List<JSONObject> levelAllUser = getLevelAllUser(partnerUser.getUserId(), partnerUser.getGrade(), partnerApp, rule);
  571. boolean hasRecords = CollectionUtil.isNotEmpty(levelAllUser);
  572. hashMap.put("commission", hasRecords ? sumField(levelAllUser, "commission") : BigDecimal.ZERO);
  573. hashMap.put("numberOrders", hasRecords ? levelAllUser.size() : 0);
  574. hashMap.put("totalPremium", hasRecords ? sumField(levelAllUser, "premium") : BigDecimal.ZERO);
  575. map.put("data", getPage(page));
  576. map.put("total", hashMap);
  577. map.put("parentStatus", partnerUser.isIdentityStatus() ? "2" : "1");
  578. BigDecimal lockCommission = null;
  579. Long zeroDays = null;
  580. if (partnerUser.isIdentityStatus()){
  581. lockCommission = accountMapper.selectCashFee(partnerUser.getUserId(), partnerUser.getGrade());
  582. zeroDays = calculateTimeDifference(partnerUser.getUserId(), partnerUser.getGrade());
  583. }
  584. map.put("lockCommission",lockCommission);
  585. map.put("zeroDays",zeroDays);
  586. PartnerRuleEntity ruleEntity = partnerRuleService.selectByGrade(overviewVo.getGrade());
  587. map.put("fallAmount",ruleEntity.getFallAmount());
  588. getRule(overviewVo, partnerUser);
  589. map.put("upgradeStatus", new JSONObject());
  590. }
  591. } catch (Exception e) {
  592. // 记录异常日志并跳过当前项
  593. log.error("处理团队概览数据时发生错误:{}",e.fillInStackTrace());
  594. continue;
  595. }
  596. list.add(map);
  597. }
  598. return HttpResult.ok(list);
  599. }
  600. public Long calculateTimeDifference(String userId,Integer grade){
  601. Date date = liftingRecordService.selectQueryDowngradeTime(userId, grade);
  602. if (null == date){
  603. return null;
  604. }
  605. LocalDate localDate = date.toInstant()
  606. .atZone(ZoneId.systemDefault())
  607. .toLocalDate().plusDays(expireDays);
  608. return PartnerDateUtils.dateDifference(localDate);
  609. }
  610. private void getRule(TeamOverviewVo overviewVo, PartnerUser partnerUser) {
  611. Integer grade = partnerUser.getGrade();
  612. if (grade != 4){
  613. grade = grade + 1;
  614. }
  615. boolean checked = partnerRuleService.verifyUpgradeConditions(partnerUser.getUserId(),String.valueOf(grade));
  616. overviewVo.setUpgradeStatus(checked ? 1 : 0);
  617. Long count = liftingRecordService.selectDowngradeRecord(partnerUser.getUserId(), partnerUser.getGrade(),1);
  618. if (count > 0){
  619. overviewVo.setUpgradeStatus(2);
  620. }
  621. }
  622. private void setDefaultValues(HashMap<String, Object> hashMap) {
  623. hashMap.put("commission", BigDecimal.ZERO);
  624. hashMap.put("numberOrders", BigDecimal.ZERO);
  625. hashMap.put("totalPremium", BigDecimal.ZERO);
  626. }
  627. public JSONObject getPage(Page page){
  628. JSONObject jsonObject = new JSONObject();
  629. jsonObject.put("pageNum",page.getCurrent());
  630. jsonObject.put("records",page.getRecords());
  631. jsonObject.put("pageSize",page.getSize());
  632. jsonObject.put("totalSize",page.getTotal());
  633. jsonObject.put("totalPages",page.getPages());
  634. return jsonObject;
  635. }
  636. public static BigDecimal sumField(List<JSONObject> jsonList, String fieldName) {
  637. return jsonList.stream()
  638. .map(jsonObj -> {
  639. try {
  640. Object value = jsonObj.get(fieldName);
  641. if (value instanceof BigDecimal) {
  642. return (BigDecimal) value;
  643. } else if (value instanceof Number) {
  644. return BigDecimal.valueOf(((Number) value).doubleValue());
  645. } else if (value instanceof String) {
  646. return new BigDecimal((String) value);
  647. }
  648. return null;
  649. } catch (Exception e) {
  650. return null;
  651. }
  652. })
  653. .filter(value -> value != null)
  654. .reduce(BigDecimal.ZERO, BigDecimal::add);
  655. }
  656. @Override
  657. public Object myPerformance(PartnerApp partnerApp) {
  658. if (StringUtils.isBlank(partnerApp.getGrade())){
  659. return HttpResult.error("用户不能为空");
  660. }
  661. Page<JSONObject> page = baseMapper.queryDataList(partnerApp.getPage(),partnerApp);
  662. List<JSONObject> datalist = page.getRecords();
  663. HashMap<String, Object> hashMap = new HashMap<>();
  664. JSONObject totalMap = new JSONObject();
  665. totalMap.put("numberOrders",datalist.size());
  666. totalMap.put("totalPremium",sumField(datalist,"premium"));
  667. totalMap.put("commission",sumField(datalist,"commission"));
  668. hashMap.put("data",getPage(page));
  669. hashMap.put("total",totalMap);
  670. PartnerUser partnerUser = baseMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId,partnerApp.getUserId()).eq(PartnerUser::getGrade,partnerApp.getGrade()));
  671. if (null != partnerUser){
  672. hashMap.put("parentStatus",partnerUser.isIdentityStatus() ? "2" : "1");
  673. if (partnerUser.isIdentityStatus()){
  674. hashMap.put("lockData",isLockingState(partnerUser));
  675. }else {
  676. hashMap.put("lockData",null);
  677. }
  678. }else {
  679. hashMap.put("parentStatus", "1");
  680. }
  681. return hashMap;
  682. }
  683. public JSONObject isLockingState(PartnerUser partnerUser) {
  684. JSONObject jsonObject = new JSONObject();
  685. jsonObject.put("lockCommission",new BigDecimal("126"));
  686. jsonObject.put("zeroDays",10);
  687. return jsonObject;
  688. }
  689. @Override
  690. public HttpResult myPerformanceDetails(String ordersNo,String userId) {
  691. List<PartnerPremiumDetails> details = detailsMapper.selectList(new LambdaQueryWrapper<>(PartnerPremiumDetails.class).eq(PartnerPremiumDetails::getOrderno, ordersNo)
  692. .eq(PartnerPremiumDetails::getUserId, userId).orderByAsc(PartnerPremiumDetails::getSource));
  693. PartnerPremiumDetails partnerPremiumDetails = new PartnerPremiumDetails();
  694. if (CollectionUtil.isNotEmpty( details)){
  695. partnerPremiumDetails = details.get(0);
  696. }
  697. JSONObject jsonObject = new JSONObject();
  698. jsonObject.put("ordersNo",partnerPremiumDetails.getOrderno());
  699. jsonObject.put("carId",partnerPremiumDetails.getLicenseno());
  700. //收入类型
  701. jsonObject.put("incomeType",partnerPremiumDetails.getIndustrySector());
  702. //代理人
  703. jsonObject.put("agent",partnerPremiumDetails.getIssuerName());
  704. //所属团队
  705. jsonObject.put("belongingTeam",1);
  706. // 保费
  707. jsonObject.put("premium",partnerPremiumDetails.getSumpremium());
  708. BigDecimal reduce = details.stream().map(detail -> detail.getExtractFee()).reduce(BigDecimal.ZERO, BigDecimal::add);
  709. //佣金
  710. jsonObject.put("commission",reduce);
  711. //出单时间
  712. jsonObject.put("orderTime",partnerPremiumDetails.getCreateTime());
  713. //佣金比例
  714. jsonObject.put("commissionRatio",getObjects(details));
  715. return HttpResult.ok(jsonObject);
  716. }
  717. @Override
  718. public HttpResult avatarUpdate(PartnerUser partnerUser) {
  719. PartnerUser user = new PartnerUser();
  720. user.setPictureUrl(partnerUser.getPictureUrl());
  721. return baseMapper.update(user,new LambdaQueryWrapper<>(PartnerUser.class)
  722. .eq(PartnerUser::getUserId, partnerUser.getUserId())
  723. ) > 0 ? HttpResult.ok("保存成功") : HttpResult.error("保存失败");
  724. }
  725. @Override
  726. public HttpResult userCountStatisticsVo(AppHomeParams params) {
  727. Integer minGrade = baseMapper.selectGradeMin(params.getUserId());
  728. if (minGrade == null) {
  729. return HttpResult.error("人员不存在");
  730. }
  731. Map<Integer, String> rule = getRule();
  732. Map<String, Object> vo = new HashMap<>();
  733. vo.put("vo1", getV1(minGrade, params, rule));
  734. vo.put("vo2", getVo2(minGrade, params, rule));
  735. return HttpResult.ok(vo);
  736. }
  737. @Override
  738. public HttpResult userCountProportionVo(AppHomeParams params) {
  739. Integer minGrade = baseMapper.selectGradeMin(params.getUserId());
  740. if (minGrade == null) {
  741. return HttpResult.error("人员不存在");
  742. }
  743. Map<Integer, String> rule = getRule();
  744. List<JSONObject> vo3 = getVo3(minGrade, params, rule);
  745. return HttpResult.ok(vo3);
  746. }
  747. @Override
  748. public HttpResult userCountRankingVo(AppHomeParams params) {
  749. Integer minGrade = baseMapper.selectGradeMin(params.getUserId());
  750. if (minGrade == null) {
  751. return HttpResult.error("人员不存在");
  752. }
  753. Map<Integer, String> rule = getRule();
  754. List<JSONObject> vo4 = getVo4(minGrade, params, rule);
  755. return HttpResult.ok(vo4);
  756. }
  757. public List<JSONObject> getLevelAllUser(String userId, Integer grade, PartnerApp partnerApp, Map<Integer, String> rule){
  758. Integer sort = grade + 1;
  759. QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
  760. queryWrapper.eq("p.referrer_id",userId);
  761. queryWrapper.eq("grade",sort);
  762. queryWrapper.eq("u.`status`",1);
  763. if (!Objects.isNull(partnerApp)){
  764. if (StringUtils.isNotEmpty(partnerApp.getStartTime()) && StringUtils.isNotEmpty(partnerApp.getEndTime())){
  765. queryWrapper.between("p.create_time", partnerApp.getStartTime() + " " + TimeConstants.START_TIME, partnerApp.getEndTime() + " " + TimeConstants.END_TIME);
  766. }
  767. }
  768. List<PartnerUser> partnerUsers = baseMapper.selectAllListVo(queryWrapper);
  769. // 添加空值检查
  770. if (CollectionUtil.isEmpty(partnerUsers)) {
  771. return new ArrayList<>(0);
  772. }
  773. List<String> userIds = partnerUsers.stream().map(PartnerUser::getUserId).collect(Collectors.toList());
  774. // 使用参数绑定防止SQL注入,合并查询条件
  775. QueryWrapper<PartnerPremiumDetails> wrapper = new QueryWrapper<>();
  776. wrapper.in("user_id", userIds);
  777. wrapper.eq("source", sort);
  778. wrapper.groupBy("user_id");
  779. // 合并查询结果处理
  780. List<Map<String, Object>> resultMapList = detailsMapper.selectCombinedStatistics(wrapper);
  781. // 简化Map转换逻辑
  782. Map<String, BigDecimal> premiumMapDict = new HashMap<>();
  783. Map<String, BigDecimal> commissionMapDict = new HashMap<>();
  784. for (Map<String, Object> map : resultMapList) {
  785. String userIdTemp = String.valueOf(map.get("userId"));
  786. BigDecimal premium = new BigDecimal(String.valueOf(map.get("premium")));
  787. BigDecimal commission = new BigDecimal(String.valueOf(map.get("commission")));
  788. premiumMapDict.put(userIdTemp, premium);
  789. commissionMapDict.put(userIdTemp, commission);
  790. }
  791. List<JSONObject> jsonList = new ArrayList<>();
  792. for (PartnerUser partnerUser : partnerUsers) {
  793. JSONObject jsonObject = getJsonObject(rule, partnerUser);
  794. jsonObject.put("number", countByUserIdLevel(partnerUser.getUserId(),partnerUser.getGrade() + 1));
  795. String currentUserId = partnerUser.getUserId();
  796. jsonObject.put("premium", premiumMapDict.getOrDefault(currentUserId, BigDecimal.ZERO));
  797. jsonObject.put("commission", commissionMapDict.getOrDefault(currentUserId, BigDecimal.ZERO));
  798. jsonList.add(jsonObject);
  799. }
  800. List<JSONObject> sort1 = getSort(jsonList);
  801. return sort1;
  802. }
  803. public Page getLevelUser(String userId,Integer grade,PartnerApp partnerApp, Map<Integer, String> rule){
  804. Integer sort = grade + 1;
  805. QueryWrapper<PartnerUser> queryWrapper = new QueryWrapper<>();
  806. queryWrapper.eq("p.referrer_id",userId);
  807. queryWrapper.eq("grade",sort);
  808. queryWrapper.eq("u.`status`",1);
  809. if (!Objects.isNull(partnerApp)){
  810. if (StringUtils.isNotEmpty(partnerApp.getStartTime()) && StringUtils.isNotEmpty(partnerApp.getEndTime())){
  811. queryWrapper.between("p.create_time", partnerApp.getStartTime() + " " + TimeConstants.START_TIME, partnerApp.getEndTime() + " " + TimeConstants.END_TIME);
  812. }
  813. }
  814. Page page = baseMapper.selectListVo(partnerApp.getPage(), queryWrapper);
  815. List<PartnerUser> partnerUsers = page.getRecords();
  816. // 添加空值检查
  817. if (CollectionUtil.isEmpty(partnerUsers)) {
  818. return page;
  819. }
  820. List<String> userIds = partnerUsers.stream().map(PartnerUser::getUserId).collect(Collectors.toList());
  821. // 使用参数绑定防止SQL注入,合并查询条件
  822. QueryWrapper<PartnerPremiumDetails> wrapper = new QueryWrapper<>();
  823. wrapper.in("user_id", userIds);
  824. wrapper.eq("source", sort);
  825. wrapper.groupBy("user_id");
  826. // 合并查询结果处理
  827. List<Map<String, Object>> resultMapList = detailsMapper.selectCombinedStatistics(wrapper);
  828. // 简化Map转换逻辑
  829. Map<String, BigDecimal> premiumMapDict = new HashMap<>();
  830. Map<String, BigDecimal> commissionMapDict = new HashMap<>();
  831. for (Map<String, Object> map : resultMapList) {
  832. String userIdTemp = String.valueOf(map.get("userId"));
  833. BigDecimal premium = new BigDecimal(String.valueOf(map.get("premium")));
  834. BigDecimal commission = new BigDecimal(String.valueOf(map.get("commission")));
  835. premiumMapDict.put(userIdTemp, premium);
  836. commissionMapDict.put(userIdTemp, commission);
  837. }
  838. List<JSONObject> jsonList = new ArrayList<>();
  839. for (PartnerUser partnerUser : partnerUsers) {
  840. JSONObject jsonObject = getJsonObject(rule, partnerUser);
  841. jsonObject.put("number", countByUserIdLevel(partnerUser.getUserId(),partnerUser.getGrade() + 1));
  842. String currentUserId = partnerUser.getUserId();
  843. jsonObject.put("premium", premiumMapDict.getOrDefault(currentUserId, BigDecimal.ZERO));
  844. jsonObject.put("commission", commissionMapDict.getOrDefault(currentUserId, BigDecimal.ZERO));
  845. jsonList.add(jsonObject);
  846. }
  847. List<JSONObject> sort1 = getSort(jsonList);
  848. return page.setRecords(sort1);
  849. }
  850. public BigDecimal getValue(String targetKey, List<Map<String, Object>> list){
  851. if (targetKey == null || list == null) {
  852. return BigDecimal.ZERO;
  853. }
  854. return list.stream()
  855. .filter(map -> StringUtils.equals(targetKey, String.valueOf(map.get("userId"))))
  856. .findFirst()
  857. .map(map -> new BigDecimal(String.valueOf(map.get("num"))))
  858. .orElse(BigDecimal.ZERO);
  859. }
  860. @Override
  861. public boolean selectByUserIdList(String id) {
  862. List<PartnerUser> partnerUsers = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, id));
  863. for (PartnerUser partnerUser : partnerUsers) {
  864. if (partnerUser.getGrade() > 4){
  865. return false;
  866. }
  867. }
  868. return CollectionUtil.isNotEmpty(partnerUsers) ? true : false;
  869. }
  870. @Override
  871. public AppUserInfoVo getUserInfo(Integer type) {
  872. String userId = BaseController.getUserId();
  873. AppUserInfoVo appUserInfoVo = sysUserMapper.queryByUserId(userId);
  874. Integer min = baseMapper.selectGradeIntMin(userId);
  875. if (null != min){
  876. PartnerUser partnerUser = baseMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class)
  877. .eq(PartnerUser::getUserId, userId)
  878. .eq(PartnerUser::getGrade, min));
  879. InsUploadFiles insUploadFiles = uploadFilesMapper.selectById(partnerUser.getPictureUrl());
  880. appUserInfoVo.setInsUploadFiles(insUploadFiles);
  881. }else {
  882. appUserInfoVo.setInsUploadFiles(new InsUploadFiles());
  883. }
  884. appUserInfoVo.setGrade(null == min ? 4 : min);
  885. return appUserInfoVo;
  886. }
  887. public List<JSONObject> getSort(List<JSONObject> list) {
  888. return list.stream()
  889. .sorted(Comparator.comparing(
  890. jo -> parseSortField(JSONObject.parseObject(jo.toString())),
  891. Comparator.nullsLast(Comparator.naturalOrder()))
  892. .thenComparing(
  893. jo -> parseCreateTime(JSONObject.parseObject(jo.toString())),
  894. Comparator.nullsFirst(Comparator.naturalOrder())))
  895. .collect(Collectors.toList());
  896. }
  897. private static Integer parseSortField(JSONObject obj) {
  898. if (obj == null) {
  899. return 0;
  900. }
  901. Object value = obj.get("grade");
  902. if (value instanceof Number) {
  903. return ((Number) value).intValue();
  904. } else if (value instanceof String) {
  905. try {
  906. return Integer.parseInt(value.toString());
  907. } catch (NumberFormatException e) {
  908. return 0;
  909. }
  910. }
  911. return 0;
  912. }
  913. private static LocalDateTime parseCreateTime(JSONObject obj) {
  914. if (obj == null) {
  915. return LocalDateTime.MIN;
  916. }
  917. Object valueObj = obj.get("createTime");
  918. if (valueObj == null) {
  919. return LocalDateTime.MIN;
  920. }
  921. String value = valueObj.toString().trim();
  922. if (value.isEmpty()) {
  923. return LocalDateTime.MIN;
  924. }
  925. try {
  926. long epochSecond = Long.parseLong(value);
  927. return LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault());
  928. } catch (NumberFormatException e) {
  929. return LocalDateTime.MIN;
  930. }
  931. }
  932. private JSONObject getJsonObject(Map<Integer, String> rule, PartnerUser partnerUser) {
  933. JSONObject jsonObject = new JSONObject();
  934. jsonObject.put("id",partnerUser.getId());
  935. jsonObject.put("userName", partnerUser.getName());
  936. jsonObject.put("grade", partnerUser.getGrade());
  937. jsonObject.put("createTime", partnerUser.getCreateTime());
  938. jsonObject.put("gradeName", "他的" + rule.getOrDefault(Integer.valueOf(partnerUser.getGrade() + 1), ""));
  939. return jsonObject;
  940. }
  941. public Long countByUserIdLevel(String userId,Integer grade){
  942. if (Objects.isNull(userId)){
  943. return Long.parseLong("0");
  944. }
  945. return baseMapper.selectCount(new LambdaQueryWrapper<PartnerUser>().eq(PartnerUser::getReferrerId, userId).eq(PartnerUser::getGrade, grade));
  946. }
  947. public List<JSONObject> getVo4(Integer minGrade, AppHomeParams params, Map<Integer, String> rule) {
  948. Integer grade = queryLevel(minGrade);
  949. List<JSONObject> list = new ArrayList<>();
  950. List<String> currentUserIds = new ArrayList<>();
  951. currentUserIds.add(params.getUserId());
  952. while (grade < 7) {
  953. List<PartnerUser> currentUserList = new ArrayList<>();
  954. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  955. currentUserList = baseMapper.selectJuniorListUser(grade, currentUserIds, params);
  956. currentUserIds = currentUserList.stream().map(PartnerUser::getUserId).collect(Collectors.toList());
  957. }
  958. getVo4Data(list, grade, currentUserList, params, rule);
  959. grade++;
  960. }
  961. return list;
  962. }
  963. public void getVo4Data(List<JSONObject> list, int grade, List<PartnerUser> currentUser, AppHomeParams params, Map<Integer, String> rule) {
  964. JSONObject object = new JSONObject();
  965. object.put("grade", grade);
  966. object.put("gradeName", rule.getOrDefault(grade, ""));
  967. List<JSONObject> arrayList = new ArrayList<>();
  968. for (PartnerUser user : currentUser) {
  969. JSONObject jsonObject = new JSONObject();
  970. jsonObject.put("id", user.getId());
  971. jsonObject.put("userName", user.getName());
  972. jsonObject.put("number", baseMapper.userCountVo(user.getUserId(), params,(user.getGrade() + 1)));
  973. arrayList.add(jsonObject);
  974. }
  975. arrayList.sort((o1, o2) -> o2.getString("number").compareTo(o1.getString("number")));
  976. object.put("data", arrayList);
  977. list.add(object);
  978. }
  979. public List<JSONObject> getVo3(Integer minGrade, AppHomeParams params, Map<Integer, String> rule) {
  980. Integer grade = queryLevel(minGrade);
  981. List<JSONObject> list = new ArrayList<>();
  982. List<String> currentUserIds = new ArrayList<>();
  983. currentUserIds.add(params.getUserId());
  984. while (grade < 7) {
  985. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  986. currentUserIds = baseMapper.selectJuniorList(grade, currentUserIds, params);
  987. }
  988. getVo3Data(list, grade, currentUserIds, params, rule);
  989. grade++;
  990. }
  991. return list;
  992. }
  993. public void getVo3Data(List<JSONObject> list, int grade, List<String> currentUserIds, AppHomeParams params, Map<Integer, String> rule) {
  994. JSONObject object = new JSONObject();
  995. object.put("grade", grade);
  996. object.put("gradeName", rule.getOrDefault(grade, ""));
  997. Integer newNum = baseMapper.userCountIdsVo(currentUserIds, params);
  998. Integer number = baseMapper.userCountIdsVo(currentUserIds, null);
  999. JSONObject jsonObject = new JSONObject();
  1000. //新增数量
  1001. jsonObject.put("newNum", newNum);
  1002. //总数量
  1003. jsonObject.put("number", number);
  1004. //新增占比
  1005. jsonObject.put("newProportion", calculatePrecisePercentage(getToInt(newNum),getToInt(number)));
  1006. //历史占比
  1007. jsonObject.put("oldProportion",calculatePrecisePercentage(BigDecimal.valueOf(number).subtract(BigDecimal.valueOf(newNum)),getToInt(number)));
  1008. object.put("data", jsonObject);
  1009. list.add(object);
  1010. }
  1011. public static BigDecimal getToInt(Integer intValue){
  1012. return Optional.ofNullable(intValue)
  1013. .map(BigDecimal::valueOf)
  1014. .orElse(BigDecimal.ZERO);
  1015. }
  1016. public static String calculatePrecisePercentage(BigDecimal part, BigDecimal total) {
  1017. if (total.compareTo(BigDecimal.ZERO) == 0) {
  1018. return "0";
  1019. }
  1020. BigDecimal ratio = part.divide(total, 4, RoundingMode.HALF_UP) // 保留4位小数
  1021. .multiply(BigDecimal.valueOf(100))
  1022. .setScale(2, RoundingMode.DOWN); // 最终保留两位小数
  1023. return ratio + "%";
  1024. }
  1025. public List<Map<String, Object>> getVo2(Integer minGrade, AppHomeParams params, Map<Integer, String> rule) {
  1026. Integer grade = queryLevel(minGrade);
  1027. List<Map<String, Object>> list = new ArrayList<>();
  1028. List<String> currentUserIds = new ArrayList<>();
  1029. currentUserIds.add(params.getUserId());
  1030. while (grade < 7) {
  1031. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  1032. currentUserIds = baseMapper.selectJuniorList(grade, currentUserIds, params);
  1033. }
  1034. processGradeVo2(list, grade, currentUserIds, params, rule);
  1035. grade++;
  1036. }
  1037. return list;
  1038. }
  1039. public void processGradeVo2(List<Map<String, Object>> list, int grade, List<String> currentUserIds, AppHomeParams params, Map<Integer, String> rule) {
  1040. Map<String, Object> voMap = new HashMap<>();
  1041. voMap.put("grade", grade);
  1042. voMap.put("gradeName", rule.getOrDefault(grade, ""));
  1043. List<Map<String, String>> maps = new ArrayList<>(0);
  1044. if (CollectionUtil.isNotEmpty(currentUserIds)){
  1045. maps = baseMapper.userCountVo2(currentUserIds, params);
  1046. }
  1047. List<String> keys = new ArrayList<>();
  1048. List<String> values = new ArrayList<>();
  1049. for (Map<String, String> map : maps) {
  1050. for (Map.Entry<String, String> entry : map.entrySet()) {
  1051. if ("total".equals(entry.getKey())){
  1052. keys.add(String.valueOf(entry.getValue()));
  1053. }else if ("createTime".equals(entry.getKey())){
  1054. values.add(String.valueOf(entry.getValue()));
  1055. }
  1056. }
  1057. }
  1058. JSONObject jsonObject = new JSONObject();
  1059. jsonObject.put("dataTime",values);
  1060. jsonObject.put("data",keys);
  1061. voMap.put("data", jsonObject);
  1062. list.add(voMap);
  1063. }
  1064. public List<Map<String, Object>> getV1(Integer minGrade, AppHomeParams params, Map<Integer, String> rule) {
  1065. Integer grade = queryLevel(minGrade);
  1066. List<Map<String, Object>> list = new ArrayList<>();
  1067. List<String> currentUserIds = new ArrayList<>();
  1068. currentUserIds.add(params.getUserId());
  1069. while (grade < 7) {
  1070. if (CollectionUtil.isNotEmpty(currentUserIds)) {
  1071. currentUserIds = baseMapper.selectJuniorList(grade, currentUserIds,params);
  1072. }
  1073. processGrade(list, grade, currentUserIds,rule,params);
  1074. grade++;
  1075. }
  1076. return list;
  1077. }
  1078. public void processGrade(List<Map<String, Object>> list, int grade, List<String> currentUserIds, Map<Integer, String> rule,AppHomeParams params) {
  1079. Map<String, Object> map = new HashMap<>();
  1080. map.put("grade", grade);
  1081. map.put("gradeName", rule.getOrDefault(grade, ""));
  1082. map.put("count", currentUserIds.size());
  1083. list.add(map);
  1084. }
  1085. @Override
  1086. public HttpResult myCommissionRate(String userId) {
  1087. List<PartnerUser> partnerUsers = baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, userId));
  1088. if (CollectionUtil.isEmpty(partnerUsers)){
  1089. return HttpResult.error("用户无权益信息");
  1090. }
  1091. BigDecimal totalAmountSafe = BigDecimal.ZERO;
  1092. // for (PartnerUser partnerUser : partnerUsers) {
  1093. // BigDecimal bigDecimal = CalculateCommissionUtils.calculateCommission(String.valueOf(partnerUser.getGrade()),partnerUser.getUserId(),"");
  1094. // totalAmountSafe = totalAmountSafe.add(bigDecimal);
  1095. // }
  1096. JSONObject jsonObject = new JSONObject();
  1097. jsonObject.put("totalRate",totalAmountSafe);
  1098. Map<Integer, String> rule = getRule();
  1099. ArrayList<Object> list = new ArrayList<>();
  1100. for (PartnerUser user : partnerUsers) {
  1101. JSONObject object = new JSONObject();
  1102. object.put("grade",user.getGrade());
  1103. object.put("gradeName",rule.getOrDefault(user.getGrade(),""));
  1104. object.put("commissionRate","");
  1105. list.add(object);
  1106. }
  1107. jsonObject.put("data",list);
  1108. return HttpResult.ok(jsonObject);
  1109. }
  1110. @Override
  1111. public List<PartnerUser> selectByUserId(String userId) {
  1112. return baseMapper.selectList(new LambdaQueryWrapper<>(PartnerUser.class).eq(PartnerUser::getUserId, userId));
  1113. }
  1114. @Override
  1115. public PartnerUser selectByUserIdAndGrade(String referrerId, Integer grade) {
  1116. return baseMapper.selectOne(new LambdaQueryWrapper<>(PartnerUser.class)
  1117. .eq(PartnerUser::getUserId, referrerId).eq(PartnerUser::getGrade, grade));
  1118. }
  1119. @Override
  1120. public PartnerPartnerAccount newGetFee(String userId) {
  1121. return partnerPartnerAccountMapper.selectByUserId(userId);
  1122. }
  1123. private static List<JSONObject> getObjects(List<PartnerPremiumDetails> details) {
  1124. List<JSONObject> list = new ArrayList<>();
  1125. for (PartnerPremiumDetails detail : details) {
  1126. if (detail == null) {
  1127. continue;
  1128. }
  1129. JSONObject object = new JSONObject();
  1130. int source = detail.getSource();
  1131. String grade;
  1132. switch (source) {
  1133. case 1:
  1134. grade = "我的创始人佣金";
  1135. break;
  1136. case 2:
  1137. grade = "我的管理人佣金";
  1138. break;
  1139. case 3:
  1140. grade = "我的合伙人佣金";
  1141. break;
  1142. case 4:
  1143. grade = "我的工作室佣金";
  1144. break;
  1145. default:
  1146. grade = null;
  1147. break;
  1148. }
  1149. if (grade == null) {
  1150. continue;
  1151. }
  1152. object.put("grade", grade);
  1153. object.put("commission", String.format("%s*%s=%s",detail.getSumpremium(), detail.getProportional(), detail.getExtractFee()));
  1154. list.add(object);
  1155. }
  1156. return list;
  1157. }
  1158. }