ClientUserController.java 15 KB

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