PartnerUserServiceImpl.java 59 KB

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