package com.yeshi.fanli.controller.xcx; import java.io.PrintWriter; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.UUID; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.yeshi.utils.HttpUtil; import org.yeshi.utils.IPUtil; import org.yeshi.utils.JsonUtil; import org.yeshi.utils.tencentcloud.COSManager; import com.yeshi.fanli.entity.accept.AcceptData; import com.yeshi.fanli.entity.bus.user.UserInfo; import com.yeshi.fanli.entity.bus.user.WeiXinUser; import com.yeshi.fanli.entity.goods.CollectionGoodsV2; import com.yeshi.fanli.entity.system.System; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBrief; import com.yeshi.fanli.entity.taobao.TaoBaoGoodsBriefExtra; import com.yeshi.fanli.exception.goods.CollectionGoodsException; import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException; import com.yeshi.fanli.log.LogHelper; import com.yeshi.fanli.service.inter.config.ConfigService; import com.yeshi.fanli.service.inter.goods.CollectionGoodsV2Service; import com.yeshi.fanli.service.inter.hongbao.HongBaoManageService; import com.yeshi.fanli.service.inter.hongbao.HongBaoService; import com.yeshi.fanli.service.inter.hongbao.ThreeSaleSerivce; import com.yeshi.fanli.service.inter.order.LostOrderService; import com.yeshi.fanli.service.inter.order.OrderItemServcie; import com.yeshi.fanli.service.inter.order.OrderService; import com.yeshi.fanli.service.inter.user.AccountDetailsService; import com.yeshi.fanli.service.inter.user.AccountMessageService; import com.yeshi.fanli.service.inter.user.BindingAccountService; import com.yeshi.fanli.service.inter.user.ExtractService; import com.yeshi.fanli.service.inter.user.PassWordErrorRecordService; import com.yeshi.fanli.service.inter.user.ShamUserService; import com.yeshi.fanli.service.inter.user.UserInfoService; import com.yeshi.fanli.service.inter.user.WxDownService; import com.yeshi.fanli.util.Constant; import com.yeshi.fanli.util.GsonUtil; import com.yeshi.fanli.util.RedisManager; import com.yeshi.fanli.util.StringUtil; import com.yeshi.fanli.util.ThreadUtil; import com.yeshi.fanli.util.taobao.TaoBaoUtil; import com.yeshi.fanli.util.wx.WXLoginUtil; import net.sf.json.JSONObject; @Controller @RequestMapping("api/xcx/v1/XcxCustomer") public class XcxUserInfoController { @Resource private UserInfoService userInfoService; @Resource private OrderService orderService; @Resource private HongBaoService hongBaoService; @Resource private BindingAccountService bindingAccountService; @Resource private ExtractService extractService; @Resource private PassWordErrorRecordService passWordErrorRecordService; @Resource private ConfigService configService; @Resource private XcxMiniControllerUtil xcxMiniControllerUtil; @Resource private ShamUserService shamUserService; @Resource private ThreeSaleSerivce threeSaleSerivce; @Resource private LostOrderService lostOrderService; @Resource private OrderItemServcie orderItemServcie; @Resource private AccountDetailsService accountDetailsService; @Resource private AccountMessageService accountMessageService; @Resource private CollectionGoodsV2Service collectionGoodsV2Service; @Resource private HongBaoManageService hongBaoManageService; @Resource private WxDownService wxDownService; @Resource private RedisManager redisManager; /** * 获取用户信息 * * @param acceptData * @param form * @param requst * @param out */ @RequestMapping(value = "getuserinfo", method = RequestMethod.POST) public void getUserInfo(AcceptData acceptData, UserInfo form, String code, String create, boolean first, HttpServletRequest requst, PrintWriter out) { String remotIP = IPUtil.getRemotIP(requst); long id = form.getId(); // 判断是不是用ID登陆的,如果是用ID登陆的其他都不要管了 if (id != 0) { UserInfo find = userInfoService.getUserById(id); if (find != null) { outUserInfo(out, remotIP, find, acceptData.getDevice()); return; } else { out.print(JsonUtil.loadFalseResult("不存在该账户!")); return; } } // 不是用ID的登陆的事就多了 System system = xcxMiniControllerUtil.getSystem(acceptData); if (system == null) { out.print(JsonUtil.loadFalseResult(XcxMiniControllerUtil.NOSYSTEM)); return; } String appid = system.getAppid(); // 判断是否是第一次正常登陆 /* * String platform = acceptData.getPlatform(); if(platform == "ios") { * // 1: 安卓 2:ios if(firstIos == "1") { //第一次登陆 first = true; } else { * first = false; } } */ if (first) { int loginType = form.getLoginType(); // WeiXinUserParam wxParam = null; // 如果是微信登陆,那需要先获取到微信的unionid WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code); if (loginType == Constant.WEIXIN && StringUtil.isNullOrEmpty(form.getWxUnionId())) { // wxParam = WXinUtil.getWxParam(code); if (weiXinUser == null) { out.print(JsonUtil.loadFalseResult(XcxMiniControllerUtil.FAILED)); return; } form.setWxOpenId(weiXinUser.getOpenid()); form.setWxUnionId(weiXinUser.getUnionid()); } String openid = loginType == 1 ? form.getOpenid() : form.getWxUnionId(); LogHelper.userInfo("[ip:" + IPUtil.getRemotIP(requst) + "]" + (loginType == 1 ? "淘宝登陆" : "微信登陆") + "[openid:" + openid + "]"); if (openid == null || openid.equals("")) { out.print(JsonUtil.loadFalseResult(XcxMiniControllerUtil.FAILED)); return; } // 获取用户信息 UserInfo user = userInfoService.getUserByLoginTypeAndOpenId(loginType, openid, appid); // 判断获取的用户信息是否为空,如果不为空就做的事就又多了 if (user != null) {// 数据库中已经存在该用户 outUserInfo(out, remotIP, user, acceptData.getDevice()); UserInfo temp = user; long lastLoginTime = temp.getLastLoginTime() == null ? 0 : temp.getLastLoginTime().longValue(); if (lastLoginTime == 0) {// 等于0则是第一次登陆,那么需要判断用户是不是被传销来的,如果是的话,那需要修改相关三级分销的状态 ThreadUtil.run(new Runnable() { @Override public void run() { threeSaleSerivce.effective(temp); } }); } return; } // 查询到的用户信息为空,那么需要填充一些用户信息 if (loginType == Constant.WEIXIN) { form.setPortrait(weiXinUser.getHeadimgurl()); String wxHeadImg = COSManager.getInstance() .uploadFile(HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl()), Constant.WXHEADURL + UUID.randomUUID().toString()) .getUrl(); form.setWxPic(wxHeadImg); form.setNickName(weiXinUser.getNickname()); form.setWxName(weiXinUser.getNickname()); } else if (loginType == Constant.TAOBAO) { form.setTbName(form.getNickName()); form.setTbPic(form.getPortrait()); } form.setLastLoginIp(remotIP); form.setLastLoginTime(java.lang.System.currentTimeMillis()); form.setSystem(system); requst.getSession().setAttribute("newUser", form); out.append(JsonUtil.loadTrueResult(2, form)); return; } if (create == null || "0".equals(create)) { out.append(JsonUtil.loadFalseResult("参数create不能为空!")); return; } UserInfo newUser = (UserInfo) requst.getSession().getAttribute("newUser"); UserInfo mainUser = (UserInfo) requst.getSession().getAttribute("mainUser"); if (Constant.NEWUSER.equals(create)) { // 创建 UserInfo user; synchronized (UserInfo.class) { user = userInfoService.addUser(newUser, appid); } if (user != null) { JSONObject data = new JSONObject(); data.put("user", GsonUtil.toJsonExpose(user)); data.put("first", 1); out.print(JsonUtil.loadTrueResult(data)); LogHelper.userInfo(GsonUtil.toJsonExpose(user)); } else { LogHelper.userInfo("不存在用户:" + GsonUtil.toJsonExpose(form)); out.print(JsonUtil.loadFalseResult(XcxMiniControllerUtil.FAILED)); } requst.getSession().removeAttribute("newUser"); return; } else if (Constant.BINDUSER.equals(create) && mainUser == null) { // 绑定 int formLoginType = form.getLoginType(); int newUserLoginType = newUser.getLoginType(); if (newUserLoginType == formLoginType) { // 相同类型不能绑定 out.print(JsonUtil.loadFalseResult("相同类型的账号不能绑定!")); return; } // 判断是不是微信。如果是微信就要填充微信相关信息 if (formLoginType == Constant.WEIXIN/* * && * StringUtil.isNullOrEmpty(form * .getWxOpenId()) */) { WeiXinUser xinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code); if (xinUser == null) { out.print(JsonUtil.loadFalseResult(XcxMiniControllerUtil.FAILED)); return; } form.setWxOpenId(xinUser.getOpenid()); form.setWxUnionId(xinUser.getUnionid()); form.setPortrait(xinUser.getHeadimgurl()); form.setNickName(xinUser.getNickname()); form.setWxName(xinUser.getNickname()); String wxHeadImg = COSManager.getInstance() .uploadFile(HttpUtil.getAsInputStream(xinUser.getHeadimgurl()), Constant.WXHEADURL + UUID.randomUUID().toString()) .getUrl(); form.setWxPic(wxHeadImg); } else if (formLoginType == Constant.TAOBAO) { form.setTbName(form.getNickName()); form.setTbPic(form.getPortrait()); } form.setSystem(system); requst.getSession().setAttribute("mainUser", form); String openid = formLoginType == 1 ? form.getOpenid() : form.getWxUnionId(); // 获取主账户用户信息 UserInfo find = userInfoService.getUserByLoginTypeAndOpenId(formLoginType, openid, appid); if (find != null) { // 主账户不为空就进行绑定操作 bind(find, newUser); userInfoService.update(find); outUserInfo(out, remotIP, find, acceptData.getDevice()); requst.getSession().removeAttribute("newUser"); requst.getSession().removeAttribute("mainUser"); } else { // 为空的话就返回用户信息 out.print(JsonUtil.loadTrueResult(3, form)); return; } } else {// create=2 ,mainUser != null 创建并绑定! bind(mainUser, newUser); mainUser = userInfoService.addUser(mainUser, appid); outUserInfo(out, remotIP, mainUser, acceptData.getDevice()); requst.getSession().removeAttribute("newUser"); requst.getSession().removeAttribute("mainUser"); } } /** * 将副账户绑定到主账户上 * * @param mainUser * @param viceUser */ private void bind(UserInfo mainUser, UserInfo viceUser) { int loginType = viceUser.getLoginType(); if (loginType == Constant.TAOBAO) { mainUser.setOpenid(viceUser.getOpenid()); mainUser.setTbName(viceUser.getNickName()); mainUser.setTbPic(viceUser.getTbPic()); } else if (loginType == Constant.WEIXIN) { mainUser.setWxName(viceUser.getWxName()); mainUser.setWxOpenId(viceUser.getWxOpenId()); mainUser.setWxUnionId(viceUser.getWxUnionId()); mainUser.setWxPic(viceUser.getWxPic()); } } private void outUserInfo(PrintWriter out, String remotIP, UserInfo user, String device) { BigDecimal totalmoney = hongBaoService.getTotalHongBaoByUid(user.getId()); user.setTotalHongBao(totalmoney); BigDecimal unOpenmoney = hongBaoService.getUnOpenHongBaoByUid(user.getId()); BigDecimal canOpenMoney = hongBaoService.getCanOpenHongBaoByUid(user.getId()); user.setNoOpenHongBao(unOpenmoney); user.setCanOpenHongBao(canOpenMoney); JSONObject data = new JSONObject(); data.put("user", GsonUtil.toJsonExpose(user)); data.put("first", 0); out.print(JsonUtil.loadTrueResult(data)); final UserInfo uuser = user; ThreadUtil.run(new Runnable() { public void run() { LogHelper.userInfo(GsonUtil.toJsonExpose(uuser)); uuser.setLastLoginIp(remotIP); uuser.setLastLoginTime(java.lang.System.currentTimeMillis()); userInfoService.updateLoginInfo(uuser); wxDownService.save(device); } }); } /** * * 方法说明: 收藏商品 * * @author mawurui createTime 2018年4月25日 下午4:58:12 * @param uid * @param auctionId * @param type * @param out */ @RequestMapping("collectionGoods") public void collectionGoods(long uid, long auctionId, int type, PrintWriter out) { CollectionGoodsV2 find = collectionGoodsV2Service.findByUidAndAuctionId(uid, auctionId); if (type == 1) { if (find != null) { out.print(JsonUtil.loadFalseResult("")); return; } try { TaoBaoGoodsBrief taoBaoGoodsBrief = redisManager.getTaoBaoGoodsBrief(auctionId); collectionGoodsV2Service.addCollection(uid, taoBaoGoodsBrief); out.print(JsonUtil.loadTrueResult("收藏成功")); } catch (TaobaoGoodsDownException e) { out.print(JsonUtil.loadFalseResult(1, "商品已下架")); } catch (CollectionGoodsException e1) { out.print(JsonUtil.loadFalseResult(e1.getCode(), e1.getMsg())); } } else { if (find == null) { out.print(JsonUtil.loadTrueResult("取消收藏成功")); return; } else { try { collectionGoodsV2Service.cancelCollectionByAuctionId(uid, auctionId); out.print(JsonUtil.loadTrueResult("取消收藏成功")); } catch (CollectionGoodsException e) { out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg())); } } } } /** * * 方法说明: 查看我的收藏列表 * * @author mawurui createTime 2018年4月25日 下午4:38:32 * @param uid * @param page * @param out */ @RequestMapping("collectionGoodsList") public void collectionGoodsList(long uid, int page, int pageSize, PrintWriter out) { List coList = collectionGoodsV2Service.getCollectionGoodsList(uid, page, pageSize); long count = collectionGoodsV2Service.getCollectionGoodsCount(uid); JSONObject data = new JSONObject(); BigDecimal proportion = hongBaoManageService.getFanLiRate(); List list = new ArrayList(); coList.parallelStream().forEachOrdered(cg -> { TaoBaoGoodsBrief goodsBrief = TaoBaoUtil.convert(cg.getCommonGoods()); TaoBaoGoodsBriefExtra taoBaoGoodsBriefExtra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goodsBrief, proportion.toString(), ""); list.add(taoBaoGoodsBriefExtra); }); int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1); data.put("totalPage", totalPage); data.put("list", GsonUtil.toJsonExpose(list)); data.put("count", count); out.print(JsonUtil.loadTrueResult(data)); } /** * * 方法说明: 删除收藏商品 * * @author mawurui createTime 2018年4月25日 下午4:58:39 * @param ids * @param uid * @param out */ @RequestMapping("deleteCollectionGoods") public void deleteCollectionGoods(String ids, long uid, PrintWriter out) { if (ids != null) { Arrays.asList(ids.split(",")).parallelStream().forEach(auctionIdStr -> { try { collectionGoodsV2Service.cancelCollection(uid, Long.parseLong(auctionIdStr)); } catch (Exception e) { e.printStackTrace(); } }); } out.print(JsonUtil.loadTrueResult("删除成功")); } /** * * 方法说明: 清空收藏列表 * * @author mawurui createTime 2018年4月25日 下午4:58:46 * @param uid * @param out */ @RequestMapping("clearConllectionGoods") public void clearConllectionGoods(long uid, PrintWriter out) { try { collectionGoodsV2Service.cancelCollectionByUid(uid); } catch (CollectionGoodsException e) { e.printStackTrace(); } out.print(JsonUtil.loadTrueResult("删除成功")); } /** * * 方法说明: 微信登陆 * * @author mawurui createTime 2018年4月25日 下午5:02:02 * @param acceptData * @param out */ @RequestMapping(value = "isWxDown") public void isWxDown(AcceptData acceptData, PrintWriter out) { boolean b = wxDownService.isWxDownFirstLogin(acceptData.getDevice()); JSONObject data = new JSONObject(); data.put("isFirst", b); out.print(JsonUtil.loadTrueResult(data)); } /** * * 方法说明: 获取商品分享连接 * * @author mawurui createTime 2018年4月25日 下午5:02:09 * @param acceptData * @param id * @param out */ @RequestMapping(value = "getGoodsShareUrl") public void getGoodsShareUrl(AcceptData acceptData, long id, PrintWriter out) { out.print(JsonUtil.loadTrueResult(Constant.systemCommonConfig.getAppShareInfoUrl() + "?id=" + id)); } }