MemberServiceImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  1. package com.fuint.common.service.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  4. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  5. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  6. import com.fuint.common.dto.AccountInfo;
  7. import com.fuint.common.dto.GroupMemberDto;
  8. import com.fuint.common.dto.MemberTopDto;
  9. import com.fuint.common.dto.UserDto;
  10. import com.fuint.common.enums.GenderEnum;
  11. import com.fuint.common.enums.MemberSourceEnum;
  12. import com.fuint.common.enums.StatusEnum;
  13. import com.fuint.common.enums.UserActionEnum;
  14. import com.fuint.common.service.*;
  15. import com.fuint.common.util.*;
  16. import com.fuint.framework.annoation.OperationServiceLog;
  17. import com.fuint.framework.exception.BusinessCheckException;
  18. import com.fuint.framework.pagination.PaginationRequest;
  19. import com.fuint.framework.pagination.PaginationResponse;
  20. import com.fuint.repository.bean.MemberTopBean;
  21. import com.fuint.repository.mapper.MtUserActionMapper;
  22. import com.fuint.repository.mapper.MtUserGradeMapper;
  23. import com.fuint.repository.mapper.MtUserMapper;
  24. import com.fuint.repository.model.*;
  25. import com.fuint.utils.StringUtil;
  26. import com.github.pagehelper.Page;
  27. import com.github.pagehelper.PageHelper;
  28. import lombok.AllArgsConstructor;
  29. import org.apache.commons.lang.StringUtils;
  30. import org.springframework.beans.BeanUtils;
  31. import org.springframework.context.annotation.Lazy;
  32. import org.springframework.data.domain.PageImpl;
  33. import org.springframework.data.domain.PageRequest;
  34. import org.springframework.stereotype.Service;
  35. import org.springframework.transaction.annotation.Transactional;
  36. import javax.servlet.http.HttpServletRequest;
  37. import java.math.BigDecimal;
  38. import java.util.*;
  39. /**
  40. * 会员业务接口实现类
  41. *
  42. * Created by FSQ
  43. * CopyRight https://www.fuint.cn
  44. */
  45. @Service
  46. @AllArgsConstructor(onConstructor_= {@Lazy})
  47. public class MemberServiceImpl extends ServiceImpl<MtUserMapper, MtUser> implements MemberService {
  48. private MtUserMapper mtUserMapper;
  49. private MtUserGradeMapper mtUserGradeMapper;
  50. private MtUserActionMapper mtUserActionMapper;
  51. /**
  52. * 短信发送接口
  53. */
  54. private SendSmsService sendSmsService;
  55. /**
  56. * 会员等级接口
  57. * */
  58. private UserGradeService userGradeService;
  59. /**
  60. * 会员等级接口
  61. * */
  62. private OpenGiftService openGiftService;
  63. /**
  64. * 后台账户服务接口
  65. */
  66. private AccountService accountService;
  67. /**
  68. * 员工接口
  69. */
  70. private StaffService staffService;
  71. /**
  72. * 店铺接口
  73. */
  74. private StoreService storeService;
  75. /**
  76. * 会员行为接口
  77. */
  78. private UserActionService userActionService;
  79. /**
  80. * 更新活跃时间
  81. * @param userId 会员ID
  82. * @return
  83. * */
  84. @Override
  85. @Transactional(rollbackFor = Exception.class)
  86. public Boolean updateActiveTime(Integer userId) throws BusinessCheckException {
  87. MtUser mtUser = queryMemberById(userId);
  88. if (mtUser != null) {
  89. if (!mtUser.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  90. return false;
  91. }
  92. Date lastUpdateTime = mtUser.getUpdateTime();
  93. Date registerTime = mtUser.getCreateTime();
  94. if (lastUpdateTime != null) {
  95. Long timestampLast = Long.valueOf(TimeUtils.date2timeStamp(lastUpdateTime));
  96. Long timestampNow = System.currentTimeMillis() / 1000;
  97. Long minute = timestampNow - timestampLast;
  98. // 5分钟更新一次
  99. if (minute >= 300 || registerTime.equals(lastUpdateTime)) {
  100. synchronized(MemberServiceImpl.class) {
  101. Date activeTime = new Date();
  102. mtUserMapper.updateActiveTime(mtUser.getId(), activeTime);
  103. // 记录会员行为
  104. MtUserAction mtUserAction = new MtUserAction();
  105. mtUserAction.setUserId(mtUser.getId());
  106. mtUserAction.setStoreId(mtUser.getStoreId());
  107. mtUserAction.setMerchantId(mtUser.getMerchantId());
  108. mtUserAction.setParam(TimeUtils.formatDate(activeTime, "yyyy-MM-dd HH:mm:ss"));
  109. mtUserAction.setAction(UserActionEnum.LOGIN.getKey());
  110. mtUserAction.setDescription(UserActionEnum.LOGIN.getValue());
  111. userActionService.addUserAction(mtUserAction);
  112. }
  113. }
  114. }
  115. }
  116. return true;
  117. }
  118. /**
  119. * 获取当前操作会员信息
  120. * @param userId
  121. * @param token
  122. * @return
  123. * */
  124. @Override
  125. public MtUser getCurrentUserInfo(HttpServletRequest request, Integer userId, String token) throws BusinessCheckException {
  126. MtUser mtUser = null;
  127. // 没有会员信息,则查询是否是后台收银员下单
  128. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  129. if (accountInfo != null) {
  130. // 输入了会员ID就用会员的账号下单,否则用员工账号下单
  131. if (userId > 0) {
  132. mtUser = queryMemberById(userId);
  133. } else {
  134. Integer accountId = accountInfo.getId();
  135. TAccount account = accountService.getAccountInfoById(accountId);
  136. if (account != null) {
  137. if (account.getStaffId() > 0) {
  138. MtStaff staff = staffService.queryStaffById(account.getStaffId());
  139. if (staff != null) {
  140. mtUser = queryMemberById(staff.getUserId());
  141. if (mtUser != null && (mtUser.getStoreId() == null || mtUser.getStoreId() <= 0)) {
  142. mtUser.setStoreId(staff.getStoreId());
  143. updateById(mtUser);
  144. }
  145. }
  146. }
  147. }
  148. }
  149. }
  150. return mtUser;
  151. }
  152. /**
  153. * 分页查询会员列表
  154. *
  155. * @param paginationRequest
  156. * @return
  157. */
  158. @Override
  159. public PaginationResponse<UserDto> queryMemberListByPagination(PaginationRequest paginationRequest) throws BusinessCheckException {
  160. Page<MtUser> pageHelper = PageHelper.startPage(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
  161. LambdaQueryWrapper<MtUser> wrapper = Wrappers.lambdaQuery();
  162. wrapper.ne(MtUser::getStatus, StatusEnum.DISABLE.getKey());
  163. String name = paginationRequest.getSearchParams().get("name") == null ? "" : paginationRequest.getSearchParams().get("name").toString();
  164. if (StringUtils.isNotBlank(name)) {
  165. wrapper.like(MtUser::getName, name);
  166. }
  167. String id = paginationRequest.getSearchParams().get("id") == null ? "" : paginationRequest.getSearchParams().get("id").toString();
  168. if (StringUtils.isNotBlank(id)) {
  169. wrapper.eq(MtUser::getId, id);
  170. }
  171. String mobile = paginationRequest.getSearchParams().get("mobile") == null ? "" : paginationRequest.getSearchParams().get("mobile").toString();
  172. if (StringUtils.isNotBlank(mobile)) {
  173. wrapper.like(MtUser::getMobile, mobile);
  174. }
  175. String birthday = paginationRequest.getSearchParams().get("birthday") == null ? "" : paginationRequest.getSearchParams().get("birthday").toString();
  176. if (StringUtils.isNotBlank(birthday)) {
  177. wrapper.like(MtUser::getBirthday, birthday);
  178. }
  179. String userNo = paginationRequest.getSearchParams().get("userNo") == null ? "" : paginationRequest.getSearchParams().get("userNo").toString();
  180. if (StringUtils.isNotBlank(userNo)) {
  181. wrapper.eq(MtUser::getUserNo, userNo);
  182. }
  183. String gradeId = paginationRequest.getSearchParams().get("gradeId") == null ? "" : paginationRequest.getSearchParams().get("gradeId").toString();
  184. if (StringUtils.isNotBlank(gradeId)) {
  185. wrapper.eq(MtUser::getGradeId, gradeId);
  186. }
  187. String merchantId = paginationRequest.getSearchParams().get("merchantId") == null ? "" : paginationRequest.getSearchParams().get("merchantId").toString();
  188. if (StringUtils.isNotBlank(merchantId)) {
  189. wrapper.eq(MtUser::getMerchantId, merchantId);
  190. }
  191. String storeId = paginationRequest.getSearchParams().get("storeId") == null ? "" : paginationRequest.getSearchParams().get("storeId").toString();
  192. if (StringUtils.isNotBlank(storeId)) {
  193. wrapper.eq(MtUser::getStoreId, storeId);
  194. }
  195. String storeIds = paginationRequest.getSearchParams().get("storeIds") == null ? "" : paginationRequest.getSearchParams().get("storeIds").toString();
  196. if (StringUtils.isNotBlank(storeIds)) {
  197. List<String> idList = Arrays.asList(storeIds.split(","));
  198. if (idList.size() > 0) {
  199. wrapper.in(MtUser::getStoreId, idList);
  200. }
  201. }
  202. String groupIds = paginationRequest.getSearchParams().get("groupIds") == null ? "" : paginationRequest.getSearchParams().get("groupIds").toString();
  203. if (StringUtils.isNotBlank(groupIds)) {
  204. List<String> idList = Arrays.asList(groupIds.split(","));
  205. if (idList.size() > 0) {
  206. wrapper.in(MtUser::getGroupId, idList);
  207. }
  208. }
  209. String status = paginationRequest.getSearchParams().get("status") == null ? "" : paginationRequest.getSearchParams().get("status").toString();
  210. if (StringUtils.isNotBlank(status)) {
  211. wrapper.eq(MtUser::getStatus, status);
  212. }
  213. // 注册开始、结束时间
  214. String startTime = paginationRequest.getSearchParams().get("startTime") == null ? "" : paginationRequest.getSearchParams().get("startTime").toString();
  215. String endTime = paginationRequest.getSearchParams().get("endTime") == null ? "" : paginationRequest.getSearchParams().get("endTime").toString();
  216. if (StringUtil.isNotEmpty(startTime)) {
  217. wrapper.ge(MtUser::getCreateTime, startTime);
  218. }
  219. if (StringUtil.isNotEmpty(endTime)) {
  220. wrapper.le(MtUser::getCreateTime, endTime);
  221. }
  222. // 注册时间
  223. String regTime = paginationRequest.getSearchParams().get("regTime") == null ? "" : paginationRequest.getSearchParams().get("regTime").toString();
  224. if (StringUtil.isNotEmpty(regTime)) {
  225. String[] dateTime = regTime.split("~");
  226. if (dateTime.length == 2) {
  227. wrapper.ge(MtUser::getCreateTime, dateTime[0]);
  228. wrapper.le(MtUser::getCreateTime, dateTime[1]);
  229. }
  230. }
  231. // 活跃时间
  232. String activeTime = paginationRequest.getSearchParams().get("activeTime") == null ? "" : paginationRequest.getSearchParams().get("activeTime").toString();
  233. if (StringUtil.isNotEmpty(activeTime)) {
  234. String[] dateTime = activeTime.split("~");
  235. if (dateTime.length == 2) {
  236. wrapper.ge(MtUser::getUpdateTime, dateTime[0]);
  237. wrapper.le(MtUser::getUpdateTime, dateTime[1]);
  238. }
  239. }
  240. // 会员有效期
  241. String memberTime = paginationRequest.getSearchParams().get("memberTime") == null ? "" : paginationRequest.getSearchParams().get("memberTime").toString();
  242. if (StringUtil.isNotEmpty(memberTime)) {
  243. String[] dateTime = memberTime.split("~");
  244. if (dateTime.length == 2) {
  245. wrapper.ge(MtUser::getStartTime, dateTime[0]);
  246. wrapper.le(MtUser::getEndTime, dateTime[1]);
  247. }
  248. }
  249. wrapper.orderByDesc(MtUser::getUpdateTime);
  250. List<MtUser> userList = mtUserMapper.selectList(wrapper);
  251. List<UserDto> dataList = new ArrayList<>();
  252. for (MtUser mtUser : userList) {
  253. String phone = mtUser.getMobile();
  254. UserDto userDto = new UserDto();
  255. BeanUtils.copyProperties(mtUser, userDto);
  256. // 隐藏手机号中间四位
  257. if (phone != null && StringUtil.isNotEmpty(phone) && phone.length() == 11) {
  258. userDto.setMobile(phone.substring(0, 3) + "****" + phone.substring(7));
  259. }
  260. if (userDto.getStoreId() != null && userDto.getStoreId() > 0) {
  261. MtStore mtStore = storeService.queryStoreById(userDto.getStoreId());
  262. if (mtStore != null) {
  263. userDto.setStoreName(mtStore.getName());
  264. }
  265. }
  266. if (userDto.getGradeId() != null) {
  267. Integer mchId = StringUtil.isNotEmpty(merchantId) ? Integer.parseInt(merchantId) : 0;
  268. MtUserGrade mtGrade = userGradeService.queryUserGradeById(mchId, Integer.parseInt(userDto.getGradeId()), mtUser.getId());
  269. if (mtGrade != null) {
  270. userDto.setGradeName(mtGrade.getName());
  271. }
  272. }
  273. if (mtUser.getUserNo() == null || StringUtil.isEmpty(mtUser.getUserNo())) {
  274. mtUser.setUserNo(CommonUtil.createUserNo());
  275. updateById(mtUser);
  276. }
  277. userDto.setLastLoginTime(TimeUtil.showTime(new Date(), mtUser.getUpdateTime()));
  278. dataList.add(userDto);
  279. }
  280. PageRequest pageRequest = PageRequest.of(paginationRequest.getCurrentPage(), paginationRequest.getPageSize());
  281. PageImpl pageImpl = new PageImpl(dataList, pageRequest, pageHelper.getTotal());
  282. PaginationResponse<UserDto> paginationResponse = new PaginationResponse(pageImpl, UserDto.class);
  283. paginationResponse.setTotalPages(pageHelper.getPages());
  284. paginationResponse.setTotalElements(pageHelper.getTotal());
  285. paginationResponse.setContent(dataList);
  286. return paginationResponse;
  287. }
  288. /**
  289. * 添加会员
  290. *
  291. * @param mtUser
  292. * @throws BusinessCheckException
  293. */
  294. @Override
  295. @OperationServiceLog(description = "新增会员信息")
  296. public MtUser addMember(MtUser mtUser) throws BusinessCheckException {
  297. // 手机号已存在
  298. if (StringUtil.isNotEmpty(mtUser.getMobile())) {
  299. MtUser userInfo = queryMemberByMobile(mtUser.getMerchantId(), mtUser.getMobile());
  300. if (userInfo != null) {
  301. return userInfo;
  302. }
  303. }
  304. String userNo = CommonUtil.createUserNo();
  305. // 会员名称已存在
  306. List<MtUser> userList = mtUserMapper.queryMemberByName(mtUser.getMerchantId(), mtUser.getName());
  307. if (userList.size() > 0) {
  308. mtUser.setName(userNo);
  309. }
  310. // 默认会员等级
  311. if (StringUtil.isEmpty(mtUser.getGradeId())) {
  312. MtUserGrade grade = userGradeService.getInitUserGrade(mtUser.getMerchantId());
  313. if (grade != null) {
  314. mtUser.setGradeId(grade.getId().toString());
  315. }
  316. }
  317. mtUser.setUserNo(userNo);
  318. mtUser.setBalance(new BigDecimal(0));
  319. if (mtUser.getPoint() == null || mtUser.getPoint() < 1) {
  320. mtUser.setPoint(0);
  321. }
  322. if (StringUtil.isEmpty(mtUser.getIdcard())) {
  323. mtUser.setIdcard("");
  324. }
  325. mtUser.setSex(mtUser.getSex());
  326. mtUser.setStatus(StatusEnum.ENABLED.getKey());
  327. Date time = new Date();
  328. mtUser.setCreateTime(time);
  329. mtUser.setUpdateTime(time);
  330. mtUser.setStartTime(mtUser.getStartTime());
  331. mtUser.setEndTime(mtUser.getEndTime());
  332. if (mtUser.getStoreId() != null) {
  333. mtUser.setStoreId(mtUser.getStoreId());
  334. } else {
  335. mtUser.setStoreId(0);
  336. }
  337. // 密码加密
  338. if (mtUser.getPassword() != null && StringUtil.isNotEmpty(mtUser.getPassword())) {
  339. String salt = SeqUtil.getRandomLetter(4);
  340. mtUser.setSalt(salt);
  341. String password = enCodePassword(mtUser.getPassword(), salt);
  342. mtUser.setPassword(password);
  343. mtUser.setSource(MemberSourceEnum.REGISTER_BY_ACCOUNT.getKey());
  344. }
  345. if (mtUser.getSource() == null || StringUtil.isEmpty(mtUser.getSource())) {
  346. mtUser.setSource(MemberSourceEnum.BACKEND_ADD.getKey());
  347. }
  348. boolean result = save(mtUser);
  349. if (!result) {
  350. return null;
  351. }
  352. mtUser = queryMemberById(mtUser.getId());
  353. // 开卡赠礼
  354. openGiftService.openGift(mtUser.getId(), Integer.parseInt(mtUser.getGradeId()), true);
  355. // 新增用户发短信通知
  356. if (mtUser.getId() > 0 && mtUser.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  357. // 发送短信
  358. List<String> mobileList = new ArrayList<>();
  359. mobileList.add(mtUser.getMobile());
  360. // 短信模板
  361. try {
  362. Map<String, String> params = new HashMap<>();
  363. sendSmsService.sendSms(mtUser.getMerchantId(), "register-sms", mobileList, params);
  364. } catch (BusinessCheckException e) {
  365. // empty
  366. }
  367. }
  368. return mtUser;
  369. }
  370. /**
  371. * 更新会员信息
  372. *
  373. * @param mtUser
  374. * @throws BusinessCheckException
  375. */
  376. @Override
  377. @Transactional(rollbackFor = Exception.class)
  378. @OperationServiceLog(description = "修改会员信息")
  379. public MtUser updateMember(MtUser mtUser) throws BusinessCheckException {
  380. mtUser.setUpdateTime(new Date());
  381. MtUser oldUserInfo = mtUserMapper.selectById(mtUser.getId());
  382. if (mtUser.getGradeId() != null && StringUtil.isNotEmpty(mtUser.getGradeId())) {
  383. if (!CommonUtil.isNumeric(mtUser.getGradeId())) {
  384. throw new BusinessCheckException("该会员等级有误");
  385. }
  386. }
  387. String mobile = mtUser.getMobile();
  388. if (PhoneFormatCheckUtils.isChinaPhoneLegal(mobile)) {
  389. mtUser.setMobile(mobile);
  390. }
  391. // 检查会员号是否重复
  392. if (StringUtil.isNotEmpty(mtUser.getUserNo())) {
  393. List<MtUser> userList = mtUserMapper.findMembersByUserNo(mtUser.getMerchantId(), mtUser.getUserNo());
  394. if (userList.size() > 0) {
  395. for(MtUser user: userList) {
  396. MtUser userInfo = user;
  397. if (userInfo.getId().intValue() != mtUser.getId().intValue()) {
  398. throw new BusinessCheckException("该会员号与会员ID等于" + userInfo.getId() + "重复啦");
  399. }
  400. }
  401. }
  402. }
  403. if (mtUser.getPassword() != null) {
  404. String salt = SeqUtil.getRandomLetter(4);
  405. mtUser.setSalt(salt);
  406. mtUser.setPassword(enCodePassword(mtUser.getPassword(), salt));
  407. }
  408. String gradeId = mtUser.getGradeId();
  409. mtUser.setGradeId(oldUserInfo.getGradeId());
  410. mtUser.setMerchantId(oldUserInfo.getMerchantId());
  411. mtUser.setStoreId(oldUserInfo.getStoreId());
  412. Boolean result = updateById(mtUser);
  413. if (result && mtUser.getGradeId() != null) {
  414. // 修改了会员等级,开卡赠礼
  415. if (!gradeId.equals(oldUserInfo.getGradeId())) {
  416. openGiftService.openGift(mtUser.getId(), Integer.parseInt(gradeId), false);
  417. }
  418. }
  419. return mtUser;
  420. }
  421. /**
  422. * 通过手机号新增会员
  423. *
  424. * @param mobile
  425. * @throws BusinessCheckException
  426. */
  427. @Override
  428. @Transactional(rollbackFor = Exception.class)
  429. @OperationServiceLog(description = "通过手机号新增会员")
  430. public MtUser addMemberByMobile(Integer merchantId, String mobile) throws BusinessCheckException {
  431. MtUser mtUser = new MtUser();
  432. mtUser.setUserNo(CommonUtil.createUserNo());
  433. String nickName = mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
  434. mtUser.setName(nickName);
  435. mtUser.setMobile(mobile);
  436. MtUserGrade grade = userGradeService.getInitUserGrade(merchantId);
  437. if (grade != null) {
  438. mtUser.setGradeId(grade.getId() + "");
  439. }
  440. Date time = new Date();
  441. mtUser.setCreateTime(time);
  442. mtUser.setUpdateTime(time);
  443. mtUser.setBalance(new BigDecimal(0));
  444. mtUser.setPoint(0);
  445. mtUser.setDescription("手机号登录自动注册");
  446. mtUser.setIdcard("");
  447. mtUser.setStatus(StatusEnum.ENABLED.getKey());
  448. mtUser.setMerchantId(merchantId);
  449. mtUser.setStoreId(0);
  450. mtUser.setSource(MemberSourceEnum.MOBILE_LOGIN.getKey());
  451. mtUserMapper.insert(mtUser);
  452. mtUser = queryMemberByMobile(merchantId, mobile);
  453. // 开卡赠礼
  454. openGiftService.openGift(mtUser.getId(), Integer.parseInt(mtUser.getGradeId()), true);
  455. return mtUser;
  456. }
  457. /**
  458. * 根据手机号获取会员信息
  459. *
  460. * @param merchantId
  461. * @param mobile 手机号
  462. * @throws BusinessCheckException
  463. */
  464. @Override
  465. public MtUser queryMemberByMobile(Integer merchantId, String mobile) {
  466. if (mobile == null || StringUtil.isEmpty(mobile)) {
  467. return null;
  468. }
  469. List<MtUser> mtUser = mtUserMapper.queryMemberByMobile(merchantId, mobile);
  470. if (mtUser.size() > 0) {
  471. return mtUser.get(0);
  472. } else {
  473. return null;
  474. }
  475. }
  476. /**
  477. * 根据会员号号获取会员信息
  478. *
  479. * @param merchantId 商户ID
  480. * @param userNo 会员号
  481. * @throws BusinessCheckException
  482. */
  483. @Override
  484. public MtUser queryMemberByUserNo(Integer merchantId, String userNo) {
  485. if (userNo == null || StringUtil.isEmpty(userNo)) {
  486. return null;
  487. }
  488. List<MtUser> mtUser = mtUserMapper.findMembersByUserNo(merchantId, userNo);
  489. if (mtUser.size() > 0) {
  490. return mtUser.get(0);
  491. } else {
  492. return null;
  493. }
  494. }
  495. /**
  496. * 根据会员ID获取会员信息
  497. *
  498. * @param id 会员ID
  499. * @return
  500. * @throws BusinessCheckException
  501. */
  502. @Override
  503. public MtUser queryMemberById(Integer id) throws BusinessCheckException {
  504. MtUser mtUser = mtUserMapper.selectById(id);
  505. if (mtUser != null) {
  506. // 检查会员是否过期,过期就把会员等级置为初始等级
  507. MtUserGrade initGrade = userGradeService.getInitUserGrade(mtUser.getMerchantId());
  508. if (initGrade != null) {
  509. Date endTime = mtUser.getEndTime();
  510. if (endTime != null) {
  511. Date now = new Date();
  512. if (endTime.before(now)) {
  513. if (!mtUser.getGradeId().equals(initGrade.getId())) {
  514. mtUser.setGradeId(initGrade.getId().toString());
  515. updateById(mtUser);
  516. }
  517. }
  518. }
  519. // 会员等级为空,就把会员等级置为初始等级
  520. String userGradeId = mtUser.getGradeId();
  521. if (userGradeId == null && initGrade != null) {
  522. mtUser.setGradeId(initGrade.getId().toString());
  523. updateById(mtUser);
  524. openGiftService.openGift(mtUser.getId(), initGrade.getId(), false);
  525. } else {
  526. // 会员等级不存在或已禁用、删除,就把会员等级置为初始等级
  527. MtUserGrade myGrade = userGradeService.queryUserGradeById(mtUser.getMerchantId(), Integer.parseInt(userGradeId), id);
  528. if (myGrade == null || !myGrade.getStatus().equals(StatusEnum.ENABLED.getKey())) {
  529. mtUser.setGradeId(initGrade.getId().toString());
  530. updateById(mtUser);
  531. }
  532. }
  533. }
  534. }
  535. return mtUser;
  536. }
  537. /**
  538. * 根据会员名称获取会员信息
  539. *
  540. * @param merchantId 商户ID
  541. * @param name 会员名称
  542. * @throws BusinessCheckException
  543. */
  544. @Override
  545. public MtUser queryMemberByName(Integer merchantId, String name) {
  546. if (StringUtil.isNotEmpty(name)) {
  547. List<MtUser> userList = mtUserMapper.queryMemberByName(merchantId, name);
  548. if (userList.size() == 1) {
  549. return userList.get(0);
  550. }
  551. }
  552. return null;
  553. }
  554. /**
  555. * 根据openId获取会员信息(为空就注册)
  556. *
  557. * @param merchantId
  558. * @param openId
  559. * @throws BusinessCheckException
  560. */
  561. @Override
  562. public MtUser queryMemberByOpenId(Integer merchantId, String openId, JSONObject userInfo) throws BusinessCheckException {
  563. MtUser user = mtUserMapper.queryMemberByOpenId(merchantId, openId);
  564. String avatar = StringUtil.isNotEmpty(userInfo.getString("avatarUrl")) ? userInfo.getString("avatarUrl") : "";
  565. String gender = StringUtil.isNotEmpty(userInfo.getString("gender")) ? userInfo.getString("gender") : GenderEnum.MAN.getKey().toString();
  566. String country = StringUtil.isNotEmpty(userInfo.getString("country")) ? userInfo.getString("country") : "";
  567. String province = StringUtil.isNotEmpty(userInfo.getString("province")) ? userInfo.getString("province") : "";
  568. String city = StringUtil.isNotEmpty(userInfo.getString("city")) ? userInfo.getString("city") : "";
  569. String storeId = StringUtil.isNotEmpty(userInfo.getString("storeId")) ? userInfo.getString("storeId") : "0";
  570. String nickName = StringUtil.isNotEmpty(userInfo.getString("nickName")) ? userInfo.getString("nickName") : "";
  571. String mobile = StringUtil.isNotEmpty(userInfo.getString("phone")) ? userInfo.getString("phone") : "";
  572. String source = StringUtil.isNotEmpty(userInfo.getString("source")) ? userInfo.getString("source") : MemberSourceEnum.WECHAT_LOGIN.getKey();
  573. if (user == null) {
  574. MtUser mtUser = new MtUser();
  575. if (StringUtil.isNotEmpty(mobile)) {
  576. MtUser mtUserMobile = queryMemberByMobile(merchantId, mobile);
  577. if (mtUserMobile != null) {
  578. mtUser = mtUserMobile;
  579. }
  580. }
  581. // 昵称为空,用手机号
  582. if (StringUtil.isEmpty(nickName) && StringUtil.isNotEmpty(mobile)) {
  583. nickName = mobile.replaceAll("(\\d{3})\\d{4}(\\d{4})","$1****$2");
  584. }
  585. mtUser.setMerchantId(merchantId);
  586. String userNo = CommonUtil.createUserNo();
  587. mobile = CommonUtil.replaceXSS(mobile);
  588. avatar = CommonUtil.replaceXSS(avatar);
  589. nickName = CommonUtil.replaceXSS(nickName);
  590. mtUser.setUserNo(userNo);
  591. mtUser.setMobile(mobile);
  592. mtUser.setAvatar(avatar);
  593. mtUser.setName(nickName);
  594. mtUser.setOpenId(openId);
  595. MtUserGrade grade = userGradeService.getInitUserGrade(merchantId);
  596. if (grade != null) {
  597. mtUser.setGradeId(grade.getId() + "");
  598. }
  599. Date time = new Date();
  600. mtUser.setCreateTime(time);
  601. mtUser.setUpdateTime(time);
  602. mtUser.setBalance(new BigDecimal(0));
  603. mtUser.setPoint(0);
  604. mtUser.setDescription("微信登录自动注册");
  605. mtUser.setIdcard("");
  606. mtUser.setStatus(StatusEnum.ENABLED.getKey());
  607. mtUser.setAddress(country + province + city);
  608. // 微信用户 1:男;2:女 0:未知
  609. if (gender.equals(GenderEnum.FEMALE.getKey().toString())) {
  610. gender = GenderEnum.UNKNOWN.getKey().toString();
  611. } else if (gender.equals(GenderEnum.UNKNOWN.getKey().toString())) {
  612. gender = GenderEnum.FEMALE.getKey().toString();
  613. }
  614. mtUser.setSex(Integer.parseInt(gender));
  615. if (StringUtil.isNotEmpty(storeId)) {
  616. mtUser.setStoreId(Integer.parseInt(storeId));
  617. } else {
  618. mtUser.setStoreId(0);
  619. }
  620. mtUser.setSource(source);
  621. if (mtUser.getId() == null || mtUser.getId() <= 0) {
  622. save(mtUser);
  623. } else {
  624. updateById(mtUser);
  625. }
  626. user = mtUserMapper.queryMemberByOpenId(merchantId, openId);
  627. // 开卡赠礼
  628. openGiftService.openGift(user.getId(), Integer.parseInt(user.getGradeId()), true);
  629. } else {
  630. // 已被禁用
  631. if (user.getStatus().equals(StatusEnum.DISABLE.getKey())) {
  632. return null;
  633. }
  634. // 补充手机号
  635. if (StringUtil.isNotEmpty(mobile) && PhoneFormatCheckUtils.isChinaPhoneLegal(mobile)) {
  636. user.setMobile(mobile);
  637. updateById(user);
  638. }
  639. // 补充会员号
  640. if (StringUtil.isEmpty(user.getUserNo())) {
  641. user.setUserNo(CommonUtil.createUserNo());
  642. updateById(user);
  643. }
  644. }
  645. return user;
  646. }
  647. /**
  648. * 根据等级ID获取会员等级信息
  649. *
  650. * @param id 等级ID
  651. * @throws BusinessCheckException
  652. */
  653. @Override
  654. public MtUserGrade queryMemberGradeByGradeId(Integer id) {
  655. MtUserGrade gradeInfo = mtUserGradeMapper.selectById(id);
  656. return gradeInfo;
  657. }
  658. /**
  659. * 删除会员
  660. *
  661. * @param id 会员ID
  662. * @param operator 操作人
  663. * @throws BusinessCheckException
  664. */
  665. @Override
  666. @OperationServiceLog(description = "删除会员信息")
  667. public Integer deleteMember(Integer id, String operator) throws BusinessCheckException {
  668. MtUser mtUser = mtUserMapper.selectById(id);
  669. if (null == mtUser) {
  670. throw new BusinessCheckException("该会员不存在,请确认");
  671. }
  672. // 是否是店铺员工
  673. MtStaff mtStaff = staffService.queryStaffByUserId(id);
  674. if (mtStaff != null && mtStaff.getAuditedStatus().equals(StatusEnum.ENABLED.getKey())) {
  675. throw new BusinessCheckException("该会员已关联店铺员工”"+ mtStaff.getRealName()+"“,若要删除请先删除该员工信息");
  676. }
  677. mtUser.setStatus(StatusEnum.DISABLE.getKey());
  678. mtUser.setUpdateTime(new Date());
  679. mtUser.setOperator(operator);
  680. updateById(mtUser);
  681. return mtUser.getId();
  682. }
  683. /**
  684. * 根据条件搜索会员分组
  685. *
  686. * @param params
  687. * @return
  688. * */
  689. @Override
  690. public List<MtUserGrade> queryMemberGradeByParams(Map<String, Object> params) {
  691. if (params == null) {
  692. params = new HashMap<>();
  693. }
  694. List<MtUserGrade> result = mtUserGradeMapper.selectByMap(params);
  695. return result;
  696. }
  697. /**
  698. * 获取会员数量
  699. *
  700. * @param merchantId
  701. * @param storeId
  702. * @return
  703. * */
  704. @Override
  705. public Long getUserCount(Integer merchantId, Integer storeId) {
  706. if (storeId > 0) {
  707. return mtUserMapper.getStoreUserCount(storeId);
  708. } else {
  709. return mtUserMapper.getUserCount(merchantId);
  710. }
  711. }
  712. /**
  713. * 获取会员数量
  714. *
  715. * @param merchantId
  716. * @param storeId
  717. * @param beginTime
  718. * @param endTime
  719. * @return
  720. * */
  721. @Override
  722. public Long getUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) {
  723. if (storeId > 0) {
  724. return mtUserMapper.getStoreUserCountByTime(storeId, beginTime, endTime);
  725. } else {
  726. return mtUserMapper.getUserCountByTime(merchantId, beginTime, endTime);
  727. }
  728. }
  729. /**
  730. * 获取会员数量
  731. *
  732. * @param merchantId
  733. * @param storeId
  734. * @param beginTime
  735. * @param endTime
  736. * @return
  737. * */
  738. @Override
  739. public Long getActiveUserCount(Integer merchantId, Integer storeId, Date beginTime, Date endTime) {
  740. if (storeId > 0) {
  741. return mtUserActionMapper.getStoreActiveUserCount(storeId, beginTime, endTime);
  742. } else {
  743. return mtUserActionMapper.getActiveUserCount(merchantId, beginTime, endTime);
  744. }
  745. }
  746. /**
  747. * 重置手机号
  748. *
  749. * @param mobile 手机号码
  750. * @param userId 会员ID
  751. * @return
  752. */
  753. @Override
  754. public void resetMobile(String mobile, Integer userId) {
  755. if (mobile == null || StringUtil.isEmpty(mobile)) {
  756. return;
  757. }
  758. mtUserMapper.resetMobile(mobile, userId);
  759. }
  760. /**
  761. * 获取会员消费排行榜
  762. *
  763. * @param merchantId
  764. * @param storeId
  765. * @param startTime
  766. * @param endTime
  767. * @return
  768. * */
  769. @Override
  770. public List<MemberTopDto> getMemberConsumeTopList(Integer merchantId, Integer storeId, Date startTime, Date endTime) {
  771. List<MemberTopBean> memberList = mtUserMapper.getMemberConsumeTopList(merchantId, storeId, startTime, endTime);
  772. List<MemberTopDto> dataList = new ArrayList<>();
  773. if (memberList != null && memberList.size() > 0) {
  774. for (MemberTopBean bean : memberList) {
  775. MemberTopDto dto = new MemberTopDto();
  776. BeanUtils.copyProperties(bean, dto);
  777. dataList.add(dto);
  778. }
  779. }
  780. return dataList;
  781. }
  782. /**
  783. * 查找会员列表
  784. *
  785. * @param merchantId
  786. * @param keyword
  787. * @param groupIds
  788. * @param page
  789. * @param pageSize
  790. * @return
  791. * */
  792. @Override
  793. public List<GroupMemberDto> searchMembers(Integer merchantId, String keyword, String groupIds, Integer page, Integer pageSize) {
  794. PageHelper.startPage(page, pageSize);
  795. LambdaQueryWrapper<MtUser> lambdaQueryWrapper = Wrappers.lambdaQuery();
  796. lambdaQueryWrapper.ne(MtUser::getStatus, StatusEnum.DISABLE.getKey());
  797. if (merchantId != null && merchantId > 0) {
  798. lambdaQueryWrapper.eq(MtUser::getMerchantId, merchantId);
  799. }
  800. if (StringUtils.isNotBlank(groupIds)) {
  801. List<String> idList = Arrays.asList(groupIds.split(","));
  802. if (idList.size() > 0) {
  803. lambdaQueryWrapper.in(MtUser::getGroupId, idList);
  804. }
  805. }
  806. if (StringUtil.isNotEmpty(keyword)) {
  807. List<String> itemList = Arrays.asList(keyword.split(","));
  808. lambdaQueryWrapper.and(wq -> wq
  809. .in(MtUser::getUserNo, itemList)
  810. .or()
  811. .in(MtUser::getMobile, itemList));
  812. }
  813. lambdaQueryWrapper.orderByDesc(MtUser::getUpdateTime);
  814. List<MtUser> userList = mtUserMapper.selectList(lambdaQueryWrapper);
  815. List<GroupMemberDto> dataList = new ArrayList<>();
  816. if (userList != null && userList.size() > 0) {
  817. for (MtUser mtUser : userList) {
  818. GroupMemberDto memberDto = new GroupMemberDto();
  819. memberDto.setId(mtUser.getId());
  820. memberDto.setName(mtUser.getName());
  821. memberDto.setUserNo(mtUser.getUserNo());
  822. // 隐藏手机号中间四位
  823. String phone = mtUser.getMobile();
  824. if (phone != null && StringUtil.isNotEmpty(phone) && phone.length() == 11) {
  825. memberDto.setMobile(phone.substring(0, 3) + "****" + phone.substring(7));
  826. }
  827. dataList.add(memberDto);
  828. }
  829. }
  830. return dataList;
  831. }
  832. /**
  833. * 设定安全的密码
  834. *
  835. * @param password
  836. * @param salt
  837. * @return
  838. */
  839. @Override
  840. public String enCodePassword(String password, String salt) {
  841. return MD5Util.getMD5(password + salt);
  842. }
  843. /**
  844. * 获取加密密码
  845. *
  846. * @param password
  847. * @param salt
  848. * @return
  849. * */
  850. @Override
  851. public String deCodePassword(String password, String salt) {
  852. return MD5Util.getMD5(password + salt);
  853. }
  854. /**
  855. * 获取会员ID列表
  856. *
  857. * @param merchantId
  858. * @param storeId
  859. * @return
  860. * */
  861. @Override
  862. public List<Integer> getUserIdList(Integer merchantId, Integer storeId) {
  863. return mtUserMapper.getUserIdList(merchantId, storeId);
  864. }
  865. }