ClubPortraitService.java 23 KB

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