ClubPortraitService.java 22 KB

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