ClientUserController.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397
  1. package com.fuint.module.clientApi.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.fuint.common.dto.AssetDto;
  4. import com.fuint.common.dto.UserDto;
  5. import com.fuint.common.dto.UserInfo;
  6. import com.fuint.common.enums.*;
  7. import com.fuint.common.service.*;
  8. import com.fuint.common.util.*;
  9. import com.fuint.framework.exception.BusinessCheckException;
  10. import com.fuint.framework.web.BaseController;
  11. import com.fuint.framework.web.ResponseObject;
  12. import com.fuint.module.clientApi.request.MemberInfoRequest;
  13. import com.fuint.repository.model.*;
  14. import com.fuint.utils.StringUtil;
  15. import io.swagger.annotations.Api;
  16. import io.swagger.annotations.ApiOperation;
  17. import lombok.AllArgsConstructor;
  18. import org.slf4j.Logger;
  19. import org.slf4j.LoggerFactory;
  20. import org.springframework.beans.BeanUtils;
  21. import org.springframework.web.bind.annotation.*;
  22. import javax.servlet.http.HttpServletRequest;
  23. import java.io.ByteArrayOutputStream;
  24. import java.util.Arrays;
  25. import java.util.HashMap;
  26. import java.util.List;
  27. import java.util.Map;
  28. /**
  29. * 会员类controller
  30. *
  31. * Created by FSQ
  32. * CopyRight https://www.fuint.cn
  33. */
  34. @Api(tags="会员端-会员相关接口")
  35. @RestController
  36. @AllArgsConstructor
  37. @RequestMapping(value = "/clientApi/user")
  38. public class ClientUserController extends BaseController {
  39. private static final Logger logger = LoggerFactory.getLogger(ClientUserController.class);
  40. /**
  41. * 会员服务接口
  42. * */
  43. private MemberService memberService;
  44. /**
  45. * 会员卡券服务接口
  46. * */
  47. private UserCouponService userCouponService;
  48. /**
  49. * 员工服务接口
  50. * */
  51. private StaffService staffService;
  52. /**
  53. * 卡券服务接口
  54. * */
  55. private CouponService couponService;
  56. /**
  57. * 会员等级服务接口
  58. **/
  59. private UserGradeService userGradeService;
  60. /**
  61. * 系统配置服务接口
  62. * */
  63. private SettingService settingService;
  64. /**
  65. * 微信服务接口
  66. * */
  67. private WeixinService weixinService;
  68. /**
  69. * 商户服务接口
  70. */
  71. private MerchantService merchantService;
  72. /**
  73. * 验证码接口
  74. */
  75. private VerifyCodeService verifyCodeService;
  76. /**
  77. * 获取会员信息
  78. */
  79. @ApiOperation(value = "获取会员信息")
  80. @RequestMapping(value = "/info", method = RequestMethod.GET)
  81. @CrossOrigin
  82. public ResponseObject info(HttpServletRequest request) throws BusinessCheckException {
  83. String token = request.getHeader("Access-Token");
  84. String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
  85. String isWechat = request.getHeader("isWechat") == null ? YesOrNoEnum.NO.getKey() : request.getHeader("isWechat");
  86. String platform = request.getHeader("platform") == null ? "" : request.getHeader("platform");
  87. String userNo = request.getParameter("code") == null ? "" : request.getParameter("code");
  88. UserInfo loginInfo = TokenUtil.getUserInfoByToken(token);
  89. Integer merchantId = merchantService.getMerchantId(merchantNo);
  90. MtUser mtUser = null;
  91. if (loginInfo != null) {
  92. mtUser = memberService.queryMemberById(loginInfo.getId());
  93. }
  94. if (StringUtil.isNotEmpty(userNo)) {
  95. mtUser = memberService.queryMemberByUserNo(merchantId, userNo);
  96. }
  97. MtUserGrade gradeInfo = null;
  98. if (mtUser != null) {
  99. gradeInfo = memberService.queryMemberGradeByGradeId(Integer.parseInt(mtUser.getGradeId()));
  100. }
  101. List<MtUserGrade> memberGrade = userGradeService.getPayUserGradeList(merchantId, mtUser);
  102. Map<String, Object> outParams = new HashMap<>();
  103. UserDto userInfo = null;
  104. if (mtUser != null) {
  105. userInfo = new UserDto();
  106. BeanUtils.copyProperties(mtUser, userInfo);
  107. if (StringUtil.isNotEmpty(mtUser.getPassword())) {
  108. userInfo.setHasPassword(YesOrNoEnum.YES.getKey());
  109. } else {
  110. userInfo.setHasPassword(YesOrNoEnum.NO.getKey());
  111. }
  112. }
  113. outParams.put("userInfo", userInfo);
  114. outParams.put("gradeInfo", gradeInfo);
  115. outParams.put("memberGrade", memberGrade);
  116. // 会员到期时间
  117. String gradeEndTime = "";
  118. if (mtUser != null) {
  119. if (mtUser.getEndTime() != null) {
  120. gradeEndTime = DateUtil.formatDate(mtUser.getEndTime(), "yyyy.MM.dd HH:mm");
  121. }
  122. }
  123. outParams.put("gradeEndTime", gradeEndTime);
  124. // 是否店铺员工
  125. boolean isMerchant = false;
  126. if (mtUser != null) {
  127. if (mtUser.getMobile() != null && StringUtil.isNotEmpty(mtUser.getMobile())) {
  128. MtStaff staffInfo = staffService.queryStaffByMobile(mtUser.getMobile());
  129. if (staffInfo != null && staffInfo.getAuditedStatus().equals(StatusEnum.ENABLED.getKey())) {
  130. isMerchant = true;
  131. }
  132. }
  133. }
  134. // 是否开通微信会员卡
  135. boolean openWxCard = false;
  136. if (platform.equals(PlatformTypeEnum.H5.getCode()) && isWechat.equals(YesOrNoEnum.YES.getKey()) && mtUser != null && StringUtil.isNotEmpty(mtUser.getOpenId())) {
  137. MtSetting cardSetting = settingService.querySettingByName(mtUser.getMerchantId(), SettingTypeEnum.USER.getKey(), UserSettingEnum.OPEN_WX_CARD.getKey());
  138. if (cardSetting != null && cardSetting.getValue().equals(YesOrNoEnum.TRUE.getKey())) {
  139. MtSetting cardIdSetting = settingService.querySettingByName(mtUser.getMerchantId(), SettingTypeEnum.USER.getKey(), UserSettingEnum.WX_MEMBER_CARD_ID.getKey());
  140. if (cardIdSetting != null) {
  141. Boolean isOpen = weixinService.isOpenCard(mtUser.getMerchantId(), cardIdSetting.getValue(), mtUser.getOpenId());
  142. logger.info("weixinService.isOpenCard userId = {},isOpen = {}", mtUser.getId(), isOpen);
  143. if (!isOpen) {
  144. openWxCard = true;
  145. }
  146. }
  147. }
  148. }
  149. outParams.put("isMerchant", isMerchant);
  150. outParams.put("openWxCard", openWxCard);
  151. return getSuccessResult(outParams);
  152. }
  153. /**
  154. * 获取会员资产数据
  155. */
  156. @ApiOperation(value = "获取会员资产数据")
  157. @RequestMapping(value = "/asset", method = RequestMethod.GET)
  158. @CrossOrigin
  159. public ResponseObject asset(HttpServletRequest request) throws BusinessCheckException {
  160. String token = request.getHeader("Access-Token");
  161. String userId = request.getParameter("userId");
  162. UserInfo mtUser = TokenUtil.getUserInfoByToken(token);
  163. if (StringUtil.isNotEmpty(userId)) {
  164. MtUser userInfo = memberService.queryMemberById(Integer.parseInt(userId));
  165. if (userInfo != null) {
  166. mtUser.setId(userInfo.getId());
  167. }
  168. }
  169. Integer couponNum = 0;
  170. Integer preStoreNum = 0;
  171. Integer timerNum = 0;
  172. if (mtUser != null) {
  173. List<String> statusList = Arrays.asList(UserCouponStatusEnum.UNUSED.getKey());
  174. List<MtUserCoupon> dataList = userCouponService.getUserCouponList(mtUser.getId(), statusList);
  175. for (int i = 0; i < dataList.size(); i++) {
  176. MtCoupon couponInfo = couponService.queryCouponById(dataList.get(i).getCouponId());
  177. boolean isEffective = couponService.isCouponEffective(couponInfo, dataList.get(i));
  178. if (!isEffective) {
  179. continue;
  180. }
  181. if (dataList.get(i).getType().equals(CouponTypeEnum.COUPON.getKey())) {
  182. couponNum++;
  183. }
  184. if (dataList.get(i).getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  185. preStoreNum++;
  186. }
  187. if (dataList.get(i).getType().equals(CouponTypeEnum.TIMER.getKey())) {
  188. timerNum++;
  189. }
  190. }
  191. }
  192. AssetDto asset = new AssetDto();
  193. asset.setCoupon(couponNum);
  194. asset.setPrestore(preStoreNum);
  195. asset.setTimer(timerNum);
  196. Map<String, Object> outParams = new HashMap<>();
  197. outParams.put("asset", asset);
  198. return getSuccessResult(outParams);
  199. }
  200. /**
  201. * 获取会员设置
  202. */
  203. @ApiOperation(value = "获取会员设置")
  204. @RequestMapping(value = "/setting", method = RequestMethod.GET)
  205. @CrossOrigin
  206. public ResponseObject setting(HttpServletRequest request) throws BusinessCheckException {
  207. String merchantNo = request.getHeader("merchantNo");
  208. Map<String, Object> outParams = new HashMap<>();
  209. Integer merchantId = merchantService.getMerchantId(merchantNo);
  210. List<MtSetting> settingList = settingService.getSettingList(merchantId, SettingTypeEnum.USER.getKey());
  211. for (MtSetting setting : settingList) {
  212. if (setting.getName().equals(UserSettingEnum.GET_COUPON_NEED_PHONE.getKey())) {
  213. outParams.put(UserSettingEnum.GET_COUPON_NEED_PHONE.getKey(), setting.getValue());
  214. } else if (setting.getName().equals(UserSettingEnum.SUBMIT_ORDER_NEED_PHONE.getKey())) {
  215. outParams.put(UserSettingEnum.SUBMIT_ORDER_NEED_PHONE.getKey(), setting.getValue());
  216. } else if (setting.getName().equals(UserSettingEnum.LOGIN_NEED_PHONE.getKey())) {
  217. outParams.put(UserSettingEnum.LOGIN_NEED_PHONE.getKey(), setting.getValue());
  218. }
  219. }
  220. return getSuccessResult(outParams);
  221. }
  222. /**
  223. * 保存会员信息
  224. */
  225. @ApiOperation(value = "保存会员信息")
  226. @RequestMapping(value = "/saveInfo", method = RequestMethod.POST)
  227. @CrossOrigin
  228. public ResponseObject saveInfo(HttpServletRequest request, @RequestBody MemberInfoRequest memberInfo) throws BusinessCheckException {
  229. String token = request.getHeader("Access-Token");
  230. String merchantNo = request.getHeader("merchantNo") == null ? "" : request.getHeader("merchantNo");
  231. String name = memberInfo.getName();
  232. String birthday = memberInfo.getBirthday();
  233. String avatar = memberInfo.getAvatar();
  234. Integer sex = memberInfo.getSex();
  235. String code = memberInfo.getCode();
  236. String password = memberInfo.getPassword();
  237. String passwordOld = memberInfo.getPasswordOld();
  238. String phone = memberInfo.getMobile();
  239. String verifyCode = memberInfo.getVerifyCode();
  240. String mobile = "";
  241. Integer merchantId = merchantService.getMerchantId(merchantNo);
  242. UserInfo userInfo = TokenUtil.getUserInfoByToken(token);
  243. boolean modifyPassword = false;
  244. if (userInfo == null) {
  245. return getFailureResult(1001);
  246. }
  247. // 通过短信验证码修改手机号
  248. if (StringUtil.isNotEmpty(phone) && StringUtil.isNotEmpty(verifyCode)) {
  249. MtVerifyCode mtVerifyCode = verifyCodeService.checkVerifyCode(phone, verifyCode);
  250. if (mtVerifyCode != null) {
  251. mobile = phone;
  252. } else {
  253. return getFailureResult(3002);
  254. }
  255. }
  256. // 小程序获取手机号
  257. if (StringUtil.isNotEmpty(code)) {
  258. JSONObject loginInfo = weixinService.getWxProfile(merchantId, code);
  259. if (loginInfo != null) {
  260. mobile = weixinService.getPhoneNumber(memberInfo.getEncryptedData(), loginInfo.get("session_key").toString(), memberInfo.getIv());
  261. }
  262. }
  263. MtUser mtUser = memberService.queryMemberById(userInfo.getId());
  264. if (StringUtil.isNotEmpty(name)) {
  265. mtUser.setName(name);
  266. }
  267. if (StringUtil.isNotEmpty(password)) {
  268. if (StringUtil.isNotEmpty(passwordOld) && StringUtil.isNotEmpty(mtUser.getSalt())) {
  269. String pass = memberService.deCodePassword(passwordOld, mtUser.getSalt());
  270. if (!pass.equals(mtUser.getPassword())) {
  271. return getFailureResult(201, "旧密码输入有误");
  272. }
  273. }
  274. mtUser.setPassword(password);
  275. modifyPassword = true;
  276. }
  277. if (sex.equals(1) || sex.equals(0) || sex.equals(2)) {
  278. mtUser.setSex(sex);
  279. }
  280. if (StringUtil.isNotEmpty(birthday)) {
  281. mtUser.setBirthday(birthday);
  282. }
  283. if (StringUtil.isNotEmpty(mobile)) {
  284. mtUser.setMobile(mobile);
  285. }
  286. if (StringUtil.isNotEmpty(avatar)) {
  287. mtUser.setAvatar(avatar);
  288. }
  289. MtUser result = memberService.updateMember(mtUser, modifyPassword);
  290. return getSuccessResult(result);
  291. }
  292. /**
  293. * 设置会员的默认店铺
  294. */
  295. @ApiOperation(value = "设置会员的默认店铺")
  296. @RequestMapping(value = "/defaultStore", method = RequestMethod.GET)
  297. @CrossOrigin
  298. public ResponseObject defaultStore(HttpServletRequest request) throws BusinessCheckException {
  299. Integer storeId = request.getParameter("storeId") == null ? 0 : Integer.parseInt(request.getParameter("storeId"));
  300. String token = request.getHeader("Access-Token");
  301. UserInfo userInfo = TokenUtil.getUserInfoByToken(token);
  302. if (userInfo != null && storeId > 0) {
  303. MtUser mtUser = memberService.queryMemberById(userInfo.getId());
  304. memberService.updateMember(mtUser, false);
  305. }
  306. Map<String, Object> outParams = new HashMap<>();
  307. return getSuccessResult(outParams);
  308. }
  309. /**
  310. * 获取会员二维码
  311. * */
  312. @ApiOperation(value = "获取会员二维码")
  313. @RequestMapping(value = "/qrCode", method = RequestMethod.GET)
  314. @CrossOrigin
  315. public ResponseObject qrCode(HttpServletRequest request) throws BusinessCheckException {
  316. String token = request.getHeader("Access-Token");
  317. UserInfo loginInfo = TokenUtil.getUserInfoByToken(token);
  318. if (loginInfo == null) {
  319. return getFailureResult(1001);
  320. }
  321. MtUser mtUser = memberService.queryMemberById(loginInfo.getId());
  322. String qrCode = "";
  323. try {
  324. // 生成并输出二维码
  325. ByteArrayOutputStream out = new ByteArrayOutputStream();
  326. String content = mtUser.getUserNo();
  327. QRCodeUtil.createQrCode(out, content, 800, 800, "png", "");
  328. // 对数据进行Base64编码
  329. qrCode = new String(Base64Util.baseEncode(out.toByteArray()), "UTF-8");
  330. qrCode = "data:image/jpg;base64," + qrCode;
  331. } catch (Exception e) {
  332. logger.error(e.getMessage(), e);
  333. }
  334. // 微信会员卡领取二维码
  335. String wxCardQrCode = "";
  336. MtSetting cardIdSetting = settingService.querySettingByName(mtUser.getMerchantId(), SettingTypeEnum.USER.getKey(), UserSettingEnum.WX_MEMBER_CARD_ID.getKey());
  337. if (cardIdSetting != null) {
  338. wxCardQrCode = weixinService.createCardQrCode(mtUser.getMerchantId(), cardIdSetting.getValue(), mtUser.getUserNo());
  339. }
  340. Map<String, Object> outParams = new HashMap<>();
  341. outParams.put("qrCode", qrCode);
  342. outParams.put("userInfo", mtUser);
  343. outParams.put("wxCardQrCode", wxCardQrCode);
  344. return getSuccessResult(outParams);
  345. }
  346. }