ClubPortraitService.java 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. package com.caimei.modules.user.service;
  2. import com.caimei.modules.order.entity.NewOrder;
  3. import com.caimei.modules.user.dao.CmPortraitDao;
  4. import com.caimei.modules.user.entity.*;
  5. import com.thinkgem.jeesite.common.utils.ObjectUtils;
  6. import com.thinkgem.jeesite.common.utils.StringUtils;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.stereotype.Service;
  9. import javax.annotation.Resource;
  10. import java.text.NumberFormat;
  11. import java.text.SimpleDateFormat;
  12. import java.util.*;
  13. /**
  14. * Description
  15. *
  16. * @author : Charles
  17. * @date : 2023/2/15
  18. */
  19. @Service
  20. public class ClubPortraitService {
  21. @Resource
  22. private CmPortraitDao cmPortraitDao;
  23. /**
  24. * 查询画像资料总数
  25. *
  26. * @param cmPortrait
  27. * @return
  28. */
  29. public CmPortrait dataTotal(CmPortrait cmPortrait) {
  30. CmPortrait cmPortraits = cmPortraitDao.selTotal(cmPortrait);
  31. return cmPortraits;
  32. }
  33. public ClubStatistics clubData(Integer clubID) {
  34. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  35. ClubStatistics clubStatistics = cmPortraitDao.selClubData(clubID);
  36. if (clubStatistics != null) {
  37. String type = "";
  38. if (StringUtils.isNotBlank(clubStatistics.getFirstClubType())) {
  39. type += clubStatistics.getFirstClubType();
  40. }
  41. if (StringUtils.isNotBlank(clubStatistics.getClassify())) {
  42. type += "-" + clubStatistics.getClassify();
  43. }
  44. clubStatistics.setClubType(type);
  45. setClubNum(clubStatistics);
  46. // 设置机构信息
  47. CmClubRemarks clubRemarksInfo = cmPortraitDao.getClubRemarksInfo(clubID);
  48. if (null != clubRemarksInfo) {
  49. clubStatistics.setCustomerSource(clubRemarksInfo.getCustomerSource() != null ? clubRemarksInfo.getCustomerSource() : 4);
  50. clubStatistics.setGroupAddition(clubRemarksInfo.getGroupAddition() != null ? clubRemarksInfo.getGroupAddition() : 1);
  51. clubStatistics.setMobileReach(1);
  52. if (null != clubRemarksInfo.getCommunicationMethods() && clubRemarksInfo.getCommunicationMethods().contains("1")) {
  53. clubStatistics.setMobileReach(0);
  54. }
  55. clubStatistics.setWxReach(1);
  56. if (null != clubRemarksInfo.getCommunicationMethods() && clubRemarksInfo.getCommunicationMethods().contains("2")) {
  57. clubStatistics.setWxReach(0);
  58. }
  59. clubStatistics.setSex(clubRemarksInfo.getCustomerGender() != null ? clubRemarksInfo.getGroupAddition() : null);
  60. clubStatistics.setAge(StringUtils.isNotBlank(clubRemarksInfo.getCustomerAge()) ? clubRemarksInfo.getCustomerAge() : null);
  61. clubStatistics.setFillTime(dateFormat.format(clubRemarksInfo.getAddTime()));
  62. clubStatistics.setFirstTime(dateFormat.format(clubRemarksInfo.getFirstTime() != null ? clubRemarksInfo.getFirstTime() : null));
  63. clubStatistics.setRecentlyTime(dateFormat.format(clubRemarksInfo.getRecentlyTime() != null ? clubRemarksInfo.getRecentlyTime() : null));
  64. }
  65. }
  66. return clubStatistics;
  67. }
  68. public Map<String, Object> getDemand(Integer clubId, Integer dataType, String demandStart, String demandEnd) {
  69. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  70. Date date = new Date();
  71. String endTime = "";
  72. Calendar calendar = Calendar.getInstance();
  73. calendar.setTime(date);
  74. calendar.add(Calendar.DAY_OF_MONTH, -1);
  75. Date time = calendar.getTime();
  76. calendar.setTime(time);
  77. boolean expty = ObjectUtils.isEmpty(demandStart) && ObjectUtils.isEmpty(demandEnd);
  78. if (expty) {
  79. endTime = dateFormat.format(time);
  80. Date start = null;
  81. String startTime = "";
  82. demandEnd = endTime;
  83. // 日期参数为 日
  84. if (1 == dataType) {
  85. demandStart = endTime;
  86. }
  87. if (2 == dataType) {
  88. calendar.setTime(time);
  89. calendar.add(Calendar.MONTH, -1);
  90. start = calendar.getTime();
  91. startTime = dateFormat.format(start);
  92. demandStart = startTime;
  93. }
  94. if (3 == dataType) {
  95. calendar.setTime(time);
  96. calendar.add(Calendar.MONTH, -6);
  97. start = calendar.getTime();
  98. startTime = dateFormat.format(start);
  99. demandStart = startTime;
  100. }
  101. if (4 == dataType) {
  102. calendar.setTime(time);
  103. calendar.add(Calendar.YEAR, -1);
  104. start = calendar.getTime();
  105. startTime = dateFormat.format(start);
  106. demandStart = startTime;
  107. }
  108. }
  109. List<String> demandList = new ArrayList<>();
  110. // 咨询记录
  111. List<String> clubRemarks = cmPortraitDao.getClubRemarks(clubId, demandStart, demandEnd);
  112. if (clubRemarks.size() > 0) {
  113. for (String clubRemark : clubRemarks) {
  114. if (clubRemark.contains(",")) {
  115. String[] split = clubRemark.split(",");
  116. for (String s : split) {
  117. if (demandList.size() < 10 && StringUtils.isNotBlank(s)) {
  118. demandList.add(s);
  119. }
  120. }
  121. } else {
  122. if (demandList.size() < 10 && StringUtils.isNotBlank(clubRemark)) {
  123. demandList.add(clubRemark);
  124. }
  125. }
  126. }
  127. }
  128. // 访问记录
  129. List<String> clubBehaviors = cmPortraitDao.getClubBehavior(clubId, demandStart, demandEnd);
  130. if (clubBehaviors.size() > 0) {
  131. for (String clubBehavior : clubBehaviors) {
  132. if (clubBehavior.contains(",")) {
  133. String[] split = clubBehavior.split(",");
  134. for (String s : split) {
  135. if (demandList.size() < 10 && StringUtils.isNotBlank(s)) {
  136. demandList.add(s);
  137. }
  138. }
  139. } else {
  140. if (demandList.size() < 10 && StringUtils.isNotBlank(clubBehavior)) {
  141. demandList.add(clubBehavior);
  142. }
  143. }
  144. }
  145. }
  146. Map<String, Object> map = new HashMap<>();
  147. map.put("startTime", demandStart);
  148. map.put("endTime", demandEnd);
  149. map.put("demandList", demandList);
  150. return map;
  151. }
  152. /**
  153. * 查询机构画像数据
  154. *
  155. * @param cmPortrait
  156. * @return
  157. */
  158. public CmPortrait dataList(CmPortrait cmPortrait) {
  159. SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
  160. Date date = new Date();
  161. String endTime = "";
  162. Calendar calendar = Calendar.getInstance();
  163. calendar.setTime(date);
  164. calendar.add(Calendar.DAY_OF_MONTH, -1);
  165. Date time = calendar.getTime();
  166. endTime = dateFormat.format(time);
  167. String time1 = "";
  168. String time2 = "";
  169. boolean expty = ObjectUtils.isEmpty(cmPortrait.getStartTime()) && ObjectUtils.isEmpty(cmPortrait.getEndTime());
  170. if (expty) {
  171. Date start = null;
  172. String startTime = "";
  173. cmPortrait.setEndTime(endTime);
  174. // 日期参数为 日
  175. if (1 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) {
  176. // cmPortrait.setAccessDate(endTime);
  177. cmPortrait.setStartTime(endTime);
  178. // cmPortrait.setEndTime(endTime);
  179. }
  180. if (2 == cmPortrait.getDateType()) {
  181. // cmPortrait.setEndTime(endTime);
  182. calendar.setTime(time);
  183. calendar.add(Calendar.MONTH, -1);
  184. start = calendar.getTime();
  185. startTime = dateFormat.format(start);
  186. cmPortrait.setStartTime(startTime);
  187. }
  188. if (3 == cmPortrait.getDateType()) {
  189. // cmPortrait.setEndTime(endTime);
  190. calendar.setTime(time);
  191. calendar.add(Calendar.MONTH, -6);
  192. start = calendar.getTime();
  193. startTime = dateFormat.format(start);
  194. cmPortrait.setStartTime(startTime);
  195. }
  196. if (4 == cmPortrait.getDateType()) {
  197. // cmPortrait.setEndTime(endTime);
  198. calendar.setTime(time);
  199. calendar.add(Calendar.YEAR, -1);
  200. start = calendar.getTime();
  201. startTime = dateFormat.format(start);
  202. cmPortrait.setStartTime(startTime);
  203. }
  204. } else {
  205. time1 = cmPortrait.getStartTime();
  206. time2 = cmPortrait.getEndTime();
  207. }
  208. // 机构订单
  209. if (0 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
  210. if ((0 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) && expty) {
  211. cmPortrait.setEndTime(dateFormat.format(date));
  212. }
  213. if (cmPortrait.getEndTime().equals(endTime)) {
  214. cmPortrait.setEndTime(dateFormat.format(date));
  215. }
  216. int ordinary = 0, secondHand = 0, rebate = 0, partialRefund = 0, total = 0; //, fullRefund = 0, closed = 0
  217. double orderScopeTotalFee = 0.0;
  218. ArrayList<OrderPortrait> orderPortraits = new ArrayList<>();
  219. OrderPortrait orderPortrait = new OrderPortrait();
  220. List<NewOrder> orderList = cmPortraitDao.selOrderList(cmPortrait);
  221. int length = orderList.size();
  222. NumberFormat instance = NumberFormat.getInstance();
  223. instance.setMaximumFractionDigits(2);
  224. if (length != 0) {
  225. for (NewOrder order : orderList) {
  226. // 普通订单
  227. if (("0".equals(order.getSecondHandOrderFlag()) || StringUtils.isEmpty(order.getSecondHandOrderFlag()))
  228. && (!"1".equals(order.getRebateFlag()) || "".equals(order.getRebateFlag()) || StringUtils.isEmpty(order.getRebateFlag()))
  229. && (!"2".equals(order.getRefundType()) || "".equals(order.getRefundType()) || StringUtils.isEmpty(order.getRefundType()))
  230. && !"4".equals(order.getStatus())) {
  231. ordinary++;
  232. }
  233. // 二手订单
  234. if ("1".equals(order.getSecondHandOrderFlag()) && !"1".equals(order.getRebateFlag())
  235. && (!"2".equals(order.getRefundType())) && !"4".equals(order.getStatus())) {
  236. secondHand++;
  237. }
  238. // 返佣订单
  239. /*if ("1".equals(order.getRebateFlag()) &&
  240. (!"2".equals(order.getRefundType()) || StringUtils.isEmpty(order.getRefundType())) && !"4".equals(order.getStatus())) {
  241. rebate++;
  242. }*/
  243. // 部分退款
  244. /*if ("1".equals(order.getRefundType()) && !"4".equals(order.getStatus())) {
  245. partialRefund++;
  246. }*/
  247. // 全部退款
  248. /*if ("2".equals(order.getRefundType()) && !"6".equals(order.getStatus())) {
  249. fullRefund++;
  250. }
  251. // 已关闭
  252. if ("6".equals(order.getStatus()) || StringUtils.isEmpty(order.getStatus())) {
  253. closed++;
  254. }*/
  255. orderScopeTotalFee += order.getPayTotalFee();
  256. }
  257. /*cmPortrait.setOrderTotalAmount(orderList.get(0).getTotalMoney());
  258. cmPortrait.setOrderTotal(orderList.get(0).getNumbers());*/
  259. cmPortrait.setOrderTotal(length);
  260. // 当前单位订单总额
  261. cmPortrait.setOrderScopeTotalFee(Double.valueOf(String.format("%.2f", orderScopeTotalFee)));
  262. orderPortrait.setValue(ordinary);
  263. if (ordinary != 0) {
  264. orderPortrait.setName("普通订单 【" + instance.format((float) ordinary / (float) length * 100) + "%】 【" + ordinary + "个】");
  265. } else {
  266. orderPortrait.setName("普通订单 【 0 %】 【" + ordinary + "个】");
  267. }
  268. orderPortraits.add(orderPortrait);
  269. orderPortrait = new OrderPortrait();
  270. orderPortrait.setValue(secondHand);
  271. if (secondHand != 0) {
  272. orderPortrait.setName("二手订单 【" + instance.format((float) secondHand / (float) length * 100) + "%】 【" + secondHand + "个】");
  273. } else {
  274. orderPortrait.setName("二手订单 【 0 %】 【" + secondHand + "个】");
  275. }
  276. orderPortraits.add(orderPortrait);
  277. /*orderPortrait = new OrderPortrait();
  278. orderPortrait.setValue(rebate);
  279. if (rebate != 0) {
  280. orderPortrait.setName("返佣订单 【" + instance.format((float) rebate / (float) length * 100) + "%】 【" + rebate + "个】");
  281. } else {
  282. orderPortrait.setName("返佣订单 【 0 %】 【" + rebate + "个】");
  283. }
  284. orderPortraits.add(orderPortrait);*/
  285. /*orderPortrait = new OrderPortrait();
  286. orderPortrait.setValue(partialRefund);
  287. if (partialRefund != 0) {
  288. orderPortrait.setName("部分退款订单 【" + instance.format((float) partialRefund / (float) length * 100) + "%】 【" + partialRefund + "个】");
  289. } else {
  290. orderPortrait.setName("部分退款订单 【 0 %】 【" + partialRefund + "个】");
  291. }
  292. orderPortraits.add(orderPortrait);*/
  293. /*orderPortrait = new OrderPortrait();
  294. orderPortrait.setValue(fullRefund);
  295. if (fullRefund != 0) {
  296. orderPortrait.setName("全部退款订单 【" + instance.format((float)fullRefund / (float) length * 100) + "%】 【" + fullRefund + "个】");
  297. } else {
  298. orderPortrait.setName("全部退款订单 【 0 %】 【" + fullRefund + "个】");
  299. }
  300. orderPortraits.add(orderPortrait);
  301. orderPortrait = new OrderPortrait();
  302. orderPortrait.setValue(closed);
  303. if (closed != 0) {
  304. orderPortrait.setName("已关闭订单 【" + instance.format((float)closed / (float) length * 100) + "%】 【" + closed + "个】");
  305. } else {
  306. orderPortrait.setName("已关闭订单 【 0 %】 【" + closed + "个】");
  307. }
  308. orderPortraits.add(orderPortrait);*/
  309. cmPortrait.setOrderPortrait(orderPortraits);
  310. }
  311. // 总量
  312. total = ordinary + secondHand + rebate + partialRefund; // + fullRefund + closed
  313. cmPortrait.setOrderScopeNum(total);
  314. calendar.setTime(date);
  315. calendar.add(Calendar.DAY_OF_MONTH, -1);
  316. time = calendar.getTime();
  317. endTime = dateFormat.format(time);
  318. cmPortrait.setEndTime(endTime);
  319. }
  320. // 搜索关键词
  321. if (1 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
  322. List<CmBehaviorRecord> behaviorRecordList = cmPortraitDao.selBehaviorList(cmPortrait);
  323. int keywordsTotal = 0;
  324. ArrayList<Integer> integers = new ArrayList<>();
  325. ArrayList<String> strings = new ArrayList<>();
  326. if (behaviorRecordList.size() != 0) {
  327. for (CmBehaviorRecord record : behaviorRecordList) {
  328. keywordsTotal += record.getNumber();
  329. integers.add(record.getNumber());
  330. if (!ObjectUtils.isEmpty(record.getPageLabel())) {
  331. strings.add(record.getPageLabel());
  332. } else {
  333. strings.add("未知");
  334. }
  335. cmPortrait.setTotalkeywords(behaviorRecordList.get(0).getNumbers());
  336. cmPortrait.setBehaviorValue(integers);
  337. cmPortrait.setBehaviorType(strings);
  338. }
  339. }
  340. cmPortrait.setKeyWordsScopeNum(keywordsTotal);
  341. }
  342. // 咨询记录
  343. if (2 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
  344. if ((0 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) && expty) {
  345. cmPortrait.setEndTime(dateFormat.format(date));
  346. }
  347. if (cmPortrait.getEndTime().equals(endTime)) {
  348. cmPortrait.setEndTime(dateFormat.format(date));
  349. }
  350. List<CmClubRemarks> remarksList = cmPortraitDao.selRemarksList(cmPortrait);
  351. // int remarksTotal = 0;
  352. ArrayList<Integer> integers = new ArrayList<>();
  353. ArrayList<String> strings = new ArrayList<>();
  354. ArrayList<String> strRemark = new ArrayList<>();
  355. ArrayList<String> remarkAll = new ArrayList<>();
  356. int number = 0;
  357. if (remarksList.size() != 0) {
  358. for (CmClubRemarks remarks : remarksList) {
  359. String[] split = remarks.getRemarks().split(",");
  360. for (String str : split) {
  361. if (!strRemark.contains(str)) {
  362. strRemark.add(str);
  363. }
  364. remarkAll.add(str);
  365. }
  366. }
  367. for (String str : strRemark) {
  368. for (int i = 0; i < remarkAll.size(); i++) {
  369. if (str.equals(remarkAll.get(i))) {
  370. number++;
  371. }
  372. }
  373. integers.add(number);
  374. // remarksTotal += number;
  375. if (!ObjectUtils.isEmpty(str)) {
  376. strings.add(str);
  377. } else {
  378. strings.add("未知");
  379. }
  380. number = 0;
  381. }
  382. // 数组根据出现次数排序
  383. int temp = 0;
  384. String strTemp = "";
  385. for (int i = 0; i < integers.size() - 1; i++) {
  386. for (int k = 0; k < integers.size() - 1 - i; k++) {
  387. if (integers.get(k) > integers.get(k + 1)) {
  388. temp = integers.get(k);
  389. integers.set(k, integers.get(k + 1));
  390. integers.set(k + 1, temp);
  391. strTemp = strings.get(k);
  392. strings.set(k, strings.get(k + 1));
  393. strings.set(k + 1, strTemp);
  394. }
  395. }
  396. }
  397. // cmPortrait.setRemarksTotal(remarksList.get(0).getNumbers());
  398. cmPortrait.setRemarksValue(integers);
  399. cmPortrait.setRemarksType(strings);
  400. }
  401. cmPortrait.setRemarksScopeNum(remarksList.size());
  402. calendar.setTime(date);
  403. calendar.add(Calendar.DAY_OF_MONTH, -1);
  404. time = calendar.getTime();
  405. endTime = dateFormat.format(time);
  406. cmPortrait.setEndTime(endTime);
  407. }
  408. // 访问记录
  409. if (3 == cmPortrait.getType() || 4 == cmPortrait.getType()) {
  410. List<CmBehaviorRecord> pageTypeList = cmPortraitDao.selBehaviorPageTypeList(cmPortrait);
  411. ArrayList<Integer> integers = new ArrayList<>();
  412. ArrayList<String> strings = new ArrayList<>();
  413. if (pageTypeList.size() != 0) {
  414. for (CmBehaviorRecord record : pageTypeList) {
  415. integers.add(record.getNumbers());
  416. strings.add(record.getPageLabel());
  417. }
  418. cmPortrait.setPageTypeValue(integers);
  419. cmPortrait.setPageType(strings);
  420. cmPortrait.setVisitNum(pageTypeList.size());
  421. }
  422. }
  423. if (!expty) {
  424. cmPortrait.setStartTime(time1);
  425. if ((0 == cmPortrait.getDateType() || 1 == cmPortrait.getDateType()) && ObjectUtils.isEmpty(cmPortrait.getStartTime())) {
  426. cmPortrait.setStartTime(time2);
  427. }
  428. cmPortrait.setEndTime(time2);
  429. }
  430. return cmPortrait;
  431. }
  432. /**
  433. * 设置机构资料完整度
  434. * @param clubStatistics
  435. */
  436. public void setClubNum(ClubStatistics clubStatistics) {
  437. Integer number = 0;
  438. if (null != clubStatistics) {
  439. // 计算资料完整度
  440. if (StringUtils.isNotBlank(clubStatistics.getName())) {
  441. number += 10;
  442. }
  443. if (StringUtils.isNotBlank(clubStatistics.getLinkMan())) {
  444. number += 10;
  445. }
  446. if (StringUtils.isNotBlank(clubStatistics.getContractMobile())) {
  447. number += 10;
  448. }
  449. if (StringUtils.isNotBlank(clubStatistics.getLinkManIdentity())) {
  450. number += 10;
  451. }
  452. if (StringUtils.isNotBlank(clubStatistics.getAddress())) {
  453. number += 10;
  454. }
  455. if (StringUtils.isNotBlank(clubStatistics.getBusinessLicenseImage())) {
  456. number += 10;
  457. }
  458. if (StringUtils.isNotBlank(clubStatistics.getUserIdentity())) {
  459. number += 10;
  460. }
  461. if (StringUtils.isNotBlank(clubStatistics.getSname())) {
  462. number += 3;
  463. }
  464. if (StringUtils.isNotBlank(clubStatistics.getContractEmail())) {
  465. number += 5;
  466. }
  467. if (StringUtils.isNotBlank(clubStatistics.getContractPhone())) {
  468. number += 4;
  469. }
  470. if (StringUtils.isNotBlank(clubStatistics.getFax())) {
  471. number += 3;
  472. }
  473. if (StringUtils.isNotBlank(clubStatistics.getHeadpic())) {
  474. number += 5;
  475. }
  476. if (StringUtils.isNotBlank(clubStatistics.getSocialCreditCode())) {
  477. number += 5;
  478. }
  479. if (StringUtils.isNotBlank(clubStatistics.getInfo())) {
  480. number += 5;
  481. }
  482. }
  483. clubStatistics.setNumber(number);
  484. clubStatistics.setClubDataIntegrity(number + "%");
  485. }
  486. }