MemberServiceImpl.java 31 KB

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