MemberServiceImpl.java 37 KB

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