admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/controller/client/v1/UserInfoController.java
@@ -1,2479 +1,2489 @@
package com.yeshi.fanli.controller.client.v1;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.yeshi.fanli.util.*;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.yeshi.utils.HttpUtil;
import org.yeshi.utils.IPUtil;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.NumberUtil;
import org.yeshi.utils.taobao.TbImgUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.dto.HongBaoDTO;
import com.yeshi.fanli.dto.money.AccountDetails;
import com.yeshi.fanli.dto.order.OrderItem;
import com.yeshi.fanli.dto.user.UserInviteLevelEnum;
import com.yeshi.fanli.dto.wx.WXAccountInfoDTO;
import com.yeshi.fanli.entity.AppVersionInfo;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.user.AccountMessage;
import com.yeshi.fanli.entity.bus.user.BindRemind;
import com.yeshi.fanli.entity.bus.user.BindingAccount;
import com.yeshi.fanli.entity.bus.user.Extract;
import com.yeshi.fanli.entity.bus.user.ExtractRecord;
import com.yeshi.fanli.entity.bus.user.LostOrder;
import com.yeshi.fanli.entity.bus.user.PreviewInfo.PreviewEnum;
import com.yeshi.fanli.entity.bus.user.SMSHistory;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.ThreeSaleExtraInfo;
import com.yeshi.fanli.entity.bus.user.UserActiveLog;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.bus.user.UserInfoModifyRecord.ModifyTypeEnum;
import com.yeshi.fanli.entity.bus.user.WeiXinUser;
import com.yeshi.fanli.entity.bus.user.vip.GiveVIPApplyInfo;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.common.AdminUser;
import com.yeshi.fanli.entity.common.Config;
import com.yeshi.fanli.entity.goods.CollectionGoodsV2;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.system.BusinessSystem;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
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.TaoKeApiException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.exception.user.BindingAccountException;
import com.yeshi.fanli.exception.user.UserCustomSettingsException;
import com.yeshi.fanli.exception.user.UserInfoException;
import com.yeshi.fanli.exception.user.UserInfoExtraException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.AdminUserService;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.AppVersionService;
import com.yeshi.fanli.service.inter.config.BusinessSystemService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.goods.CollectionGoodsV2Service;
import com.yeshi.fanli.service.inter.money.UserMoneyDetailService;
import com.yeshi.fanli.service.inter.money.extract.BindingAccountService;
import com.yeshi.fanli.service.inter.money.extract.ExtractRecordService;
import com.yeshi.fanli.service.inter.money.extract.ExtractService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
import com.yeshi.fanli.service.inter.order.LostOrderService;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
import com.yeshi.fanli.service.inter.redpack.RedPackForbidService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinDetailService;
import com.yeshi.fanli.service.inter.user.AccountMessageService;
import com.yeshi.fanli.service.inter.user.BindRemindService;
import com.yeshi.fanli.service.inter.user.MaskKeyService;
import com.yeshi.fanli.service.inter.user.PreviewInfoService;
import com.yeshi.fanli.service.inter.user.ShamUserService;
import com.yeshi.fanli.service.inter.user.SpreadUserImgService;
import com.yeshi.fanli.service.inter.user.UserAccountService;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserCustomSettingsService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoModifyRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserRankService;
import com.yeshi.fanli.service.inter.user.UserShareGoodsRecordService;
import com.yeshi.fanli.service.inter.user.invite.TeamFansInfoService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleExtraInfoSerivce;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteService;
import com.yeshi.fanli.service.inter.user.vip.GiveVIPApplyInfoService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.service.inter.user.vip.UserVipConfigService;
import com.yeshi.fanli.service.manger.user.UserLevelManager;
import com.yeshi.fanli.util.account.UserUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.util.annotation.UserActive;
import com.yeshi.fanli.util.email.MailSenderUtil;
import com.yeshi.fanli.util.factory.AccountDetailsFactory;
import com.yeshi.fanli.util.factory.HongBaoFactory;
import com.yeshi.fanli.util.factory.OrderItemFactory;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import com.yeshi.fanli.util.wx.WXLoginUtil;
import com.yeshi.fanli.vo.user.MineInfoVO;
import com.yeshi.fanli.vo.user.UserInfoExtraVO;
import com.yeshi.fanli.vo.user.UserSettingsVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("api/v1/customer")
public class UserInfoController {
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private OrderService orderService;
    @Resource
    private BindingAccountService bindingAccountService;
    @Resource
    private ExtractService extractService;
    @Resource
    private ConfigService configService;
    @Resource
    private BusinessSystemService businessSystemService;
    @Resource
    private ShamUserService shamUserService;
    @Resource
    private ThreeSaleSerivce threeSaleSerivce;
    @Resource
    private ThreeSaleExtraInfoSerivce threeSaleExtraInfoSerivce;
    @Resource
    private LostOrderService lostOrderService;
    @Resource
    private HongBaoManageService hongBaoManageService;
    @Resource
    private UserAccountService loginService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private ExtractRecordService extractRecordService;
    @Resource
    private UserActiveLogService userActiveLogService;
    @Resource
    private CollectionGoodsV2Service collectionGoodsV2Service;
    @Resource
    private AdminUserService adminUserService;
    @Resource
    private UserMoneyDetailService userMoneyDetailService;
    @Resource
    private HongBaoOrderService hongBaoOrderService;
    @Resource
    private HongBaoV2Service hongBaoV2Service;
    @Resource
    private SpreadUserImgService spreadUserImgService;
    @Resource
    private UserShareGoodsRecordService userShareGoodsRecordService;
    @Resource
    private UserCustomSettingsService userCustomSettingsService;
    @Resource
    private UserInfoExtraService userInfoExtraService;
    @Resource
    private AppVersionService appVersionService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    @Resource
    private AccountMessageService accountMessageService;
    @Resource
    private MaskKeyService maskKeyService;
    @Resource
    private UserTaoLiJinDetailService userTaoLiJinDetailService;
    @Resource
    private UserInfoModifyRecordService userInfoModifyRecordService;
    @Resource
    private BindRemindService bindRemindService;
    @Resource
    private RedPackBalanceService redPackBalanceService;
    @Resource
    private UserRankService userRankService;
    @Resource
    private UserVIPInfoService userVIPInfoService;
    @Resource
    private UserVipConfigService userVipConfigService;
    @Resource
    private RedPackForbidService redPackForbidService;
    @Resource
    private UserInviteService userInviteService;
    @Resource
    private TeamFansInfoService teamFansInfoService;
    @Resource
    private UserLevelManager userLevelManager;
    @Resource
    private JumpDetailV2Service jumpDetailV2Service;
    @Resource
    private GiveVIPApplyInfoService giveVIPApplyInfoService;
    @Resource
    private PreviewInfoService previewInfoService;
    private static final String EXTRACT_MIN_MONEY = ConfigKeyEnum.extractMoneyMin.getKey();
    private static final String EXTRACT_MAX_MONEY = ConfigKeyEnum.extractMoneyMAX.getKey();
    /**
     * 获取用户信息
     *
     * @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.getUserByIdWithMybatis(id);
            // ThreadUtil.run(new Runnable() {
            // @Override
            // public void run() {
            // threeSaleSerivce.effective(find);
            // }
            // });
            if (find != null) {
                if (find.getState() != UserInfo.STATE_NORMAL) {
                    out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER,
                            Constant.FORBIDDEN_USER_REASON_DESC));
                    return;
                }
                // 邀请关系生效
                threeSaleSerivce.effective(find);
                // 添加用户活跃记录
                UserActiveLog userActiveLog = new UserActiveLog();
                userActiveLog.setChannel(acceptData.getChannel());
                userActiveLog.setIp(requst.getRemoteHost());
                userActiveLog.setUid(find.getId());
                userActiveLog.setVersionCode(acceptData.getVersion());
                userActiveLog.setOsVersion(acceptData.getOsVersion());
                userActiveLog.setDeviceType(acceptData.getDeviceType());
                userActiveLog.setDevice(acceptData.getDevice());
                userActiveLogService.addUserActiveLog(userActiveLog);
                outUserInfo(acceptData, out, remotIP, find, acceptData.getDevice());
                return;
            } else {
                out.print(JsonUtil.loadFalseResult("不存在该账户!"));
                return;
            }
        }
        // 不是用ID的登陆的事就多了
        BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                acceptData.getPackages());
        if (system == null) {
            out.print(JsonUtil.loadFalseResult("系统不存在"));
            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
            WXAccountInfoDTO account = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
            WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, account.getAppId(),
                    account.getAppSecret());
            if (loginType == Constant.WEIXIN && StringUtil.isNullOrEmpty(form.getWxUnionId())) {
                // wxParam = WXinUtil.getWxParam(code);
                if (weiXinUser == null) {
                    out.print(JsonUtil.loadFalseResult("登录失败"));
                    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("登录失败"));
                return;
            }
            // 获取用户信息
            UserInfo user = userInfoService.getUserByLoginTypeAndOpenId(loginType, openid, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            // 判断获取的用户信息是否为空,如果不为空就做的事就又多了
            if (user != null) {// 数据库中已经存在该用户
                outUserInfo(acceptData, 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()),
                                FilePathEnum.userPortrait.getPath() + 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());
            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, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            }
            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("登录失败"));
            }
            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())
             */) {
                WXAccountInfoDTO account = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
                WeiXinUser xinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, account.getAppId(),
                        account.getAppSecret());
                if (xinUser == null) {
                    out.print(JsonUtil.loadFalseResult("登录失败"));
                    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()),
                                FilePathEnum.userPortrait + UUID.randomUUID().toString())
                        .getUrl();
                form.setWxPic(wxHeadImg);
            } else if (formLoginType == Constant.TAOBAO) {
                form.setTbName(form.getNickName());
                form.setTbPic(form.getPortrait());
            }
            requst.getSession().setAttribute("mainUser", form);
            String openid = formLoginType == 1 ? form.getOpenid() : form.getWxUnionId();
            // 获取主账户用户信息
            UserInfo find = userInfoService.getUserByLoginTypeAndOpenId(formLoginType, openid, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            if (find != null) {
                // 主账户不为空就进行绑定操作
                bind(find, newUser);
                userInfoService.update(find);
                outUserInfo(acceptData, 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, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            outUserInfo(acceptData, out, remotIP, mainUser, acceptData.getDevice());
            requst.getSession().removeAttribute("newUser");
            requst.getSession().removeAttribute("mainUser");
        }
    }
    /**
     * 淘特价登录
     *
     * @param acceptData
     * @param form
     * @param code
     * @param create
     * @param first
     * @param requst
     * @param out
     */
    @RequestMapping(value = "getuserinfo_ttj", method = RequestMethod.POST)
    public void getUserInfoTTJ(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(acceptData, out, remotIP, find, acceptData.getDevice());
                return;
            } else {
                out.print(JsonUtil.loadFalseResult("不存在该账户!"));
                return;
            }
        }
        // 不是用ID的登陆的事就多了
        BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                acceptData.getPackages());
        if (system == null) {
            out.print(JsonUtil.loadFalseResult("系统不存在"));
            return;
        }
        String appid = system.getAppid();
        UserInfo user = userInfoService.getUserByLoginTypeAndOpenId(1, form.getOpenid(), SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
        if (user == null) {
            // 创建用户
            userInfoService.addUser(form, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            user = userInfoService.getUserByLoginTypeAndOpenId(1, form.getOpenid(), SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
        }
        // 返回用户信息
        outUserInfo(acceptData, out, remotIP, user, acceptData.getDevice());
    }
    /**
     * 将副账户绑定到主账户上
     *
     * @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(AcceptData acceptData, PrintWriter out, String remotIP, UserInfo user, String device) {
        user.setTotalHongBao(new BigDecimal(0));
        BigDecimal unOpenmoney = new BigDecimal(0);
        BigDecimal canOpenMoney = new BigDecimal(0);
        user.setNoOpenHongBao(unOpenmoney);
        user.setCanOpenHongBao(canOpenMoney);
        /**
         * 查询改用户返利红包
         */
        BigDecimal fanliHB = user.getTotalHongBao();
        user.setTotalHongBao(fanliHB);
        UserInfo filterForClientUser = UserUtil.filterForClientUser(user);
        // 1.5.0 版本之后返回新的等级
        String version = acceptData.getVersion();
        if (version != null && version.trim().length() > 0) {
            int versionCode = Integer.parseInt(version);
            String platform = acceptData.getPlatform();
            AppVersionInfo versionInfo = appVersionService.getByPlatformAndVersion(platform, "1.5.0",acceptData.getSystem());
            if (versionInfo != null) {
                int versionCode150 = versionInfo.getVersionCode();
                if (versionCode >= versionCode150) {
                    UserInfoExtraVO userInfoExtra = userInfoExtraService.getInfoExtraVOByUid(user.getId());
                    if (userInfoExtra != null && userInfoExtra.getUserRank() != null) {
                        String picture = userInfoExtra.getUserRank().getPicture();
                        String icon = userInfoExtra.getUserRank().getIcon();
                        filterForClientUser.setRankNamePicture(picture);
                        filterForClientUser.setRankIcon(icon);
                    }
                }
            }
        }
        GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
        JSONObject data = new JSONObject();
        data.put("user",
                JsonUtil.getConvertBigDecimalToStringBuilder(gsonBuilder).create().toJson(filterForClientUser));
        data.put("first", 0);
        int spreadImgCount = spreadUserImgService.countUserSpreadImg(user.getId());
        long shareCount = userShareGoodsRecordService.countShareRecordByUid(user.getId());
        int showTiCheng = 1; // 不显示
        if ("ios".equalsIgnoreCase(acceptData.getPlatform())
                && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()),acceptData.getSystem()))
            data.put("showTiCheng", false);
        else {
            data.put("showTiCheng", spreadImgCount + shareCount > 0);
            if (spreadImgCount + shareCount > 0) {
                showTiCheng = 0;
            }
        }
        if ("ios".equalsIgnoreCase(acceptData.getPlatform())
                && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()),acceptData.getSystem()))
            data.put("inviteList", String.format("http://%s/%s/client/share/friends_new_online.html",
                    Constant.systemCommonConfig.getProjectHost(), Constant.systemCommonConfig.getProjectName()));
        else
            data.put("inviteList", configService.getValue(ConfigKeyEnum.teamList.getKey(),acceptData.getSystem()));
        // 界面状态
        UserSettingsVO mySettings = null;
        try {
            mySettings = userCustomSettingsService.getMySettings(user.getId());
        } catch (UserCustomSettingsException e) {
            mySettings = new UserSettingsVO();
            e.printStackTrace();
        }
        if (mySettings.getCancelNotice() == null) {
            mySettings.setCancelNotice(0);
        }
        if (mySettings.getNoBonusCount() == null) {
            mySettings.setNoBonusCount(showTiCheng); // 根据showTiCheng来判断
        }
        if (mySettings.getNoNewsRedDot() == null) {
            mySettings.setNoNewsRedDot(0);
        }
        if (mySettings.getNoShareRecordAndStorage() == null) {
            mySettings.setNoShareRecordAndStorage(showTiCheng); // 根据showTiCheng来判断
        }
        if (mySettings.getNoInvitationBonus() == null) {
            mySettings.setNoInvitationBonus(0);
        }
        if (mySettings.getOpenSpreadHongBao() == null) {
            mySettings.setOpenSpreadHongBao(0);
        }
        data.put("moduleState", mySettings);
        int welfareCenterNews = 0;
        String invitCode = null;
        UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(user.getId());
        if (userInfoExtra != null) {
            if (userInfoExtra.getCouponNews() != null) {
                welfareCenterNews = userInfoExtra.getCouponNews();
            }
            if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCodeVip())) {
                invitCode = userInfoExtra.getInviteCodeVip();
            } else {
                invitCode = userInfoExtra.getInviteCode();
            }
        }
        // 邀请码
        data.put("invitCode", invitCode);
        // 福利中心消息
        data.put("welfareCenterNews", welfareCenterNews);
        out.print(JsonUtil.loadTrueResult(data));
        final UserInfo uuser = user;
        ThreadUtil.run(new Runnable() {
            public void run() {
                // 获取邀请码:若无邀请码且存在有效的队员关系 则自动生成邀请码
                userInfoExtraService.getInviteCodeByUid(uuser.getId());
                LogHelper.userInfo(GsonUtil.toJsonExpose(uuser));
                uuser.setLastLoginIp(remotIP);
                uuser.setLastLoginTime(java.lang.System.currentTimeMillis());
                userInfoService.updateLoginInfo(uuser);
                // 用户等级更新
                try {
                    userInfoExtraService.updateUserRankByUid(uuser.getId());
                } catch (UserInfoExtraException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    @RequestMapping("bindUserInfo")
    public void bindUserInfo(AcceptData acceptData, UserInfo form, String code, PrintWriter out) {
        UserInfo find = userInfoService.getUserById(form.getId());
        if (find == null) {
            out.print(JsonUtil.loadFalseResult("绑定失败,不存在该用户!"));
            return;
        }
        int loginType = form.getLoginType();
        if (loginType == Constant.WEIXIN) {
            WXAccountInfoDTO account = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
            WeiXinUser weiXinUser = WXLoginUtil.getWeiXinUserWithSavePortrait(code, account.getAppId(),
                    account.getAppSecret());
            if (weiXinUser == null) {
                out.print(JsonUtil.loadFalseResult("绑定失败,用户异常请重试!"));
                return;
            }
            LogHelper.test(
                    String.format("绑定微信:头像为  %s \n 昵称为 %s", weiXinUser.getHeadimgurl(), weiXinUser.getNickname()));
            String wxUnionId = weiXinUser.getUnionid();
            UserInfo userInfo = userInfoService.getUserByLoginTypeAndOpenId(loginType, wxUnionId, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            if (userInfo != null) {
                out.print(JsonUtil.loadFalseResult("绑定失败,该微信账户已存在!"));
                return;
            }
            find.setWxName(weiXinUser.getNickname());
            find.setWxOpenId(weiXinUser.getOpenid());
            find.setWxUnionId(weiXinUser.getUnionid());
            String wxHeadImg = COSManager.getInstance()
                    .uploadFile(HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl()),
                            FilePathEnum.userPortrait.getPath() + UUID.randomUUID().toString())
                    .getUrl();
            find.setWxPic(wxHeadImg);
        } else { // 绑定淘宝
            LogHelper.test(String.format("绑定淘宝:头像为  %s \n 昵称为 %s", form.getPortrait(), form.getTbName()));
            UserInfo userInfo = userInfoService.getUserByLoginTypeAndOpenId(loginType, form.getOpenid(),
                    SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            if (userInfo != null) {
                out.print(JsonUtil.loadFalseResult("绑定失败,该淘宝账户已存在!"));
                return;
            }
            find.setOpenid(form.getOpenid());
            find.setTbName(form.getTbName());
            find.setTbPic(form.getPortrait());
        }
        userInfoService.update(find);
        out.print(JsonUtil.loadTrueResult(GsonUtil.toJsonExpose(UserUtil.filterForClientUser(find))));
    }
    /**
     * @param data
     * @param uid  用户ID
     * @param type 需要解绑的账户类型
     */
    @RequestMapping("unBindUserInfo")
    public void unBindUserInfo(AcceptData data, long uid, int type, PrintWriter out) {
        UserInfo find = userInfoService.getUserById(uid);
        if (find == null) {
            out.print(JsonUtil.loadFalseResult("不存在该用户!"));
            return;
        }
        String openid = find.getOpenid();
        String wxUnionId = find.getWxUnionId();
        if (Constant.TAOBAO == type) {
            if (StringUtil.isNullOrEmpty(openid)) {
                out.print(JsonUtil.loadFalseResult("当前用户未绑定该类型账户!"));
                return;
            }
        } else if (Constant.WEIXIN == type) {
            if (StringUtil.isNullOrEmpty(wxUnionId)) {
                out.print(JsonUtil.loadFalseResult("当前用户未绑定该类型账户!"));
                return;
            }
        }
        int count = 0;
        if (StringUtil.isNullOrEmpty(openid)) {
            count++;
        }
        if (StringUtil.isNullOrEmpty(wxUnionId)) {
            count++;
        }
        if (count == 1) {
            out.print(JsonUtil.loadFalseResult("当前只绑定了一个账户,不能解绑!"));
            return;
        }
        userInfoService.unBindUserInfo(find, type);
        out.print(JsonUtil.loadTrueResult("解绑成功"));
    }
    /**
     * 获取用户提现账号
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getuseraccount", method = RequestMethod.POST)
    public void getUserAccount(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "请登录"));
            return;
        }
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        List<BindingAccount> bindingAccountList = bindingAccountService.getBindingAccountByUid(uid);
        JSONObject data = new JSONObject();
        data.put("user", user);
        Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
        data.put("error", "0");
        data.put("maxError", 1);
        String minMoney = configService.getValue(EXTRACT_MIN_MONEY,acceptData.getSystem()); // 单笔提现的最小金额
        String maxMoney = configService.getValue(EXTRACT_MAX_MONEY,acceptData.getSystem()); // 单笔提现的最小金额
        String maxDayMoney = configService.getValue(ConfigKeyEnum.extractMoneyDay.getKey(),acceptData.getSystem()); // 每日最大提现金额
        int maxDayCount = Integer.parseInt(configService.getValue(ConfigKeyEnum.extractDayCount.getKey(),acceptData.getSystem()));
        ExtractRecord extractRecord = extractRecordService.getExtractRecordByUid(uid);
        boolean canExtract = true;
        String errorMsg = "";
        if (extractRecord != null && extractRecord.getCount() >= maxDayCount) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s次", maxDayCount + "");
        } else if (extractRecord != null
                && extractRecord.getMoney().add(new BigDecimal(minMoney)).compareTo(new BigDecimal(maxDayMoney)) > 0) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s元", maxDayMoney);
        }
        data.put("canExtract", canExtract);
        data.put("extractErrorMsg", errorMsg);
        data.put("minMoney", minMoney);// 单笔最低
        data.put("maxMoney", maxMoney);// 单笔最高
        data.put("maxDayCount", maxDayCount);
        data.put("bindingAccountList", gson.toJson(filterBindingAccount(bindingAccountList)));
        JSONObject alipayVerify = new JSONObject();
        try {
            bindingAccountService.canVerifyAlipayAccount(uid);
            alipayVerify.put("state", 0);
            alipayVerify.put("msg", "可绑定");
        } catch (BindingAccountException e) {
            alipayVerify.put("state", e.getCode());
            alipayVerify.put("msg", e.getMsg());
        }
        data.put("alipayBindState", alipayVerify);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 是否能够提现
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "canextract", method = RequestMethod.POST)
    public void canExtract(AcceptData acceptData, Long uid, BigDecimal money, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "请登录"));
            return;
        }
        if (money == null) {
            out.print(JsonUtil.loadFalseResult(1, "请上传金额"));
            return;
        }
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        String minMoney = configService.getValue(EXTRACT_MIN_MONEY,acceptData.getSystem()); // 单笔提现的最小金额
        String maxDayMoney = configService.getValue(ConfigKeyEnum.extractMoneyDay.getKey(),acceptData.getSystem()); // 每日最大提现金额
        int maxDayCount = Integer.parseInt(configService.getValue(ConfigKeyEnum.extractDayCount.getKey(),acceptData.getSystem()));
        ExtractRecord extractRecord = extractRecordService.getExtractRecordByUid(uid);
        boolean canExtract = true;
        String errorMsg = "";
        if (extractRecord != null && extractRecord.getCount() + 1 > maxDayCount) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s次", maxDayCount + "");
        } else if (extractRecord != null
                && extractRecord.getMoney().add(money).compareTo(new BigDecimal(maxDayMoney)) > 0) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s元", maxDayMoney);
        } else if (new BigDecimal(minMoney).compareTo(money) > 0) {
            canExtract = false;
            errorMsg = String.format("每次最低提现%s元", minMoney);
        }
        if (canExtract) {
            out.print(JsonUtil.loadTrueResult(""));
        } else {
            out.print(JsonUtil.loadFalseResult(errorMsg));
        }
    }
    @RequestMapping(value = "getalipayaccount", method = RequestMethod.POST)
    public void getAlipayAccount(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "请登录"));
            return;
        }
        List<BindingAccount> bindingAccountList = bindingAccountService.getBindingAccountByUid(uid);
        if (bindingAccountList == null || bindingAccountList.size() == 0) {
            out.print(JsonUtil.loadFalseResult(2, "尚未绑定支付宝"));
            return;
        }
        out.print(JsonUtil.loadTrueResult(JsonUtil.getSimpleGsonWithDate().toJson(bindingAccountList.get(0))));
    }
    public static List<BindingAccount> filterBindingAccount(List<BindingAccount> bindingAccountList) {
        List<BindingAccount> accountList = new ArrayList<>();
        if (bindingAccountList != null)
            for (BindingAccount bindingAccount : bindingAccountList) {
                BindingAccount dest = new BindingAccount();
                try {
                    PropertyUtils.copyProperties(dest, bindingAccount);
                    if (!StringUtil.isNullOrEmpty(dest.getAccount()) && !StringUtil.isNullOrEmpty(dest.getName())) {
                        String name = "";
                        if ((dest.getName() + "").length() > 2)
                            for (int i = 0; i < (dest.getName() + "").length(); i++) {
                                if (i == 0)
                                    name += dest.getName().charAt(i);
                                else
                                    name += "*";
                            }
                        else
                            name = dest.getName().charAt(0) + "*";
                        dest.setName(name);
                        String account = "";
                        if (dest.getAccount().indexOf("@") > -1) {// 邮箱
                            int index = dest.getAccount().indexOf("@");
                            for (int i = 0; i < dest.getAccount().length(); i++) {
                                if (i < 3 || i >= index)
                                    account += dest.getAccount().charAt(i);
                                else
                                    account += "*";
                            }
                        } else if (StringUtil.isMobile(dest.getAccount())) {// 电话
                            account = dest.getAccount().substring(0, 3) + "*****" + dest.getAccount()
                                    .substring(dest.getAccount().length() - 2, dest.getAccount().length());
                        } else {// 其他
                            if (dest.getAccount().length() >= 6) {
                                for (int i = 0; i < dest.getAccount().length(); i++) {
                                    if (i < 3 || i >= dest.getAccount().length() - 2)
                                        account += dest.getAccount().charAt(i);
                                    else
                                        account += "*";
                                }
                            } else {
                                for (int i = 0; i < dest.getAccount().length(); i++) {
                                    if (i < 1 || i >= dest.getAccount().length() - 1)
                                        account += dest.getAccount().charAt(i);
                                    else
                                        account += "*";
                                }
                            }
                        }
                        dest.setAccount(account);
                    }
                    accountList.add(dest);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }
        return accountList;
    }
    public static BindingAccount filterBindingAccount(BindingAccount bindingAccount) {
        BindingAccount dest = new BindingAccount();
        try {
            PropertyUtils.copyProperties(dest, bindingAccount);
            if (!StringUtil.isNullOrEmpty(dest.getAccount()) && !StringUtil.isNullOrEmpty(dest.getName())) {
                String name = "";
                if ((dest.getName() + "").length() > 2)
                    for (int i = 0; i < (dest.getName() + "").length(); i++) {
                        if (i == 0)
                            name += dest.getName().charAt(i);
                        else
                            name += "*";
                    }
                else
                    name = dest.getName().charAt(0) + "*";
                dest.setName(name);
                String account = "";
                if (dest.getAccount().indexOf("@") > -1) {// 邮箱
                    int index = dest.getAccount().indexOf("@");
                    for (int i = 0; i < dest.getAccount().length(); i++) {
                        if (i < 3 || i >= index)
                            account += dest.getAccount().charAt(i);
                        else
                            account += "*";
                    }
                } else if (StringUtil.isMobile(dest.getAccount())) {// 电话
                    account = dest.getAccount().substring(0, 3) + "*****"
                            + dest.getAccount().substring(dest.getAccount().length() - 2, dest.getAccount().length());
                } else {// 其他
                    if (dest.getAccount().length() >= 6) {
                        for (int i = 0; i < dest.getAccount().length(); i++) {
                            if (i < 3 || i >= dest.getAccount().length() - 2)
                                account += dest.getAccount().charAt(i);
                            else
                                account += "*";
                        }
                    } else {
                        for (int i = 0; i < dest.getAccount().length(); i++) {
                            if (i < 1 || i >= dest.getAccount().length() - 1)
                                account += dest.getAccount().charAt(i);
                            else
                                account += "*";
                        }
                    }
                }
                dest.setAccount(account);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return dest;
    }
    /**
     * 添加用户提现账号
     *
     * @param acceptData
     * @param uid        用户id
     * @param account    账号
     * @param name       真实名字
     * @param type       账号类型:1.支付宝 2.微信
     * @param out
     */
    @RequestMapping(value = "addbindingaccount", method = RequestMethod.POST)
    public void addBindingAccount(AcceptData acceptData, long uid, String account, String name, int type,
                                  PrintWriter out) {
        if (Constant.ZHIFUBAO != type && Constant.WEIXIN != type) {
            out.print(JsonUtil.loadFalseResult(Constant.NOTYPE));
            return;
        }
        UserInfo user = userInfoService.getUserById(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        BindingAccount addAccount = new BindingAccount();
        addAccount.setAccount(account);
        addAccount.setType(type);
        addAccount.setUserInfo(user);
        addAccount.setName(name);
        try {
            bindingAccountService.addBindingAccount(addAccount);
        } catch (BindingAccountException e) {
            out.print(JsonUtil.loadFalseResult(e.getMessage()));
            return;
        }
        out.print(JsonUtil.loadTrueResult(Constant.BA_SUCCESS));
        return;
    }
    /**
     * 删除用户提现账号
     *
     * @param acceptData
     * @param uid        用户id
     * @param type       账号类型
     * @param out
     */
    @RequestMapping(value = "deletebindingaccount", method = RequestMethod.POST)
    public void deleteBindingAccount(AcceptData acceptData, long uid, int type, PrintWriter out) {
        if (type != Constant.ZHIFUBAO && type != Constant.WEIXIN) {
            out.print(JsonUtil.loadFalseResult(Constant.NOTYPE));
            return;
        }
        UserInfo user = userInfoService.getUserById(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        BindingAccount account = new BindingAccount();
        account.setType(type);
        account.setUserInfo(user);
        Integer deletecount = bindingAccountService.deleteBindingAccount(account);
        JSONObject data = new JSONObject();
        data.put("count", deletecount);
        out.print(JsonUtil.loadTrueResult(data));
        return;
    }
    /**
     * 新版提现
     *
     * @param acceptData
     * @param uid
     * @param money
     * @param vcode      手机验证码
     * @param request
     * @param type
     * @param out
     */
    @RequestSerializableByKey(key = "#uid")
    @RequestMapping(value = "extractmoneynew", method = RequestMethod.POST)
    public void extractMoneyNew(AcceptData acceptData, long uid, BigDecimal money, String vcode,
                                HttpServletRequest request, int type, PrintWriter out) {
        UserInfo user = userInfoService.getUserById(uid);
        if (user == null) {
            user = userInfoService.getUserByIdWithMybatis(uid);
            if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
                out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC));
                return;
            }
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        if (money == null) {
            out.print(JsonUtil.loadFalseResult(1, "请上传提现金额"));
            return;
        }
        if (!Constant.IS_TEST) {
            // 判断手机验证码的正确性
            String oldCode = redisManager.getSMSVCode(user.getPhone(), SMSHistory.TYPE_LOGIN);
            if (StringUtil.isNullOrEmpty(oldCode) || !oldCode.equalsIgnoreCase(vcode)) {
                out.print(JsonUtil.loadFalseResult(90001, "验证码错误"));
                return;
            }
        }
        BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                acceptData.getPackages());
        if (system == null) {
            LogHelper.userInfo("提现时,不存在该系统");
            out.print(JsonUtil.loadFalseResult("系统不存在"));
            return;
        }
        String minMoney = configService.getValue(EXTRACT_MIN_MONEY,acceptData.getSystem()); // 单笔提现最小金额
        if (money.compareTo(new BigDecimal("0.1")) < 0) { // 转帐到支付宝的最小金额
            out.print(JsonUtil.loadFalseResult("单笔提现金额需要大于:" + 0.1 + "元"));
            return;
        }
        if (money.compareTo(new BigDecimal(minMoney)) < 0) { // 后台设置的单笔转账的最小金额
            out.print(JsonUtil.loadFalseResult("单笔提现金额需要大于:" + minMoney + "元"));
            return;
        }
        String maxMoney = configService.getValue(EXTRACT_MAX_MONEY,acceptData.getSystem()); // 单笔提现最大金额
        if (new BigDecimal(maxMoney).compareTo(money) < 0) { // 后台设置的单笔转账的最大金额
            out.print(JsonUtil.loadFalseResult("单笔提现金额多为:" + maxMoney + "元"));
            return;
        }
        if (type != Constant.ZHIFUBAO && type != Constant.WEIXIN) { // 提现类型必须是支付宝类型或者微信类型,目前(20170506)仅支持支付宝
            out.print(JsonUtil.loadFalseResult(Constant.NOTYPE));
            return;
        }
        BindingAccount bindingAccount = bindingAccountService.getBindingAccountByUidAndType(uid, type);
        if (bindingAccount == null) {
            out.print(JsonUtil.loadFalseResult(Constant.NOACCOUNT));
            return;
        }
        Extract extract = new Extract();
        extract.setIp(IPUtil.getRemotIP(request));
        extract.setAccount(bindingAccount.getAccount());
        extract.setName(bindingAccount.getName());
        extract.setMoney(new BigDecimal(String.valueOf(money)));
        extract.setUserInfo(user);
        extract.setExtractTime(java.lang.System.currentTimeMillis());
        extract.setType(type);
        extract.setState(0);
        extract.setSystem(system);
        Integer etype = extractService.addExtract(extract);
        if (etype == null) {
            JSONObject data = new JSONObject();
            data.put("id", extract.getId());
            out.print(JsonUtil.loadTrueResult(data));
            ThreadUtil.run(new Runnable() {
                @Override
                public void run() {
                    JSONObject json = new JSONObject();
                    json.put("timeStamp", java.lang.System.currentTimeMillis());
                    json.put("adminId", 4L);
                    String sign = AESUtil.encrypt(json.toString(), Constant.ADMINH5_AESKEY);
                    String url = "";
                    try {
                        url = String.format("%s?from=emailh5&sign=%s",
                                Constant.systemCommonConfig.getExtractNotifyUrl(), URLEncoder.encode(sign, "UTF-8"));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    long[] targetUids = new long[]{3L, 4L, 5L};
                    Config config = configService.getConfig(ConfigKeyEnum.extractCodeEmailFrom.getKey(),acceptData.getSystem());
                    String[] sts = config.getValue().split(",");
                    String account = sts[0];
                    String pwd = sts[1];
                    for (long adminId : targetUids) {
                        AdminUser adminUser = adminUserService.selectByPrimaryKey(adminId);
                        String msg = "提现审核链接:" + url;
                        boolean isS = MailSenderUtil.sendEmail(adminUser.getEmail(), account, pwd, "有新的提现审核", msg);
                    }
                }
            });
            return;
        } else if (etype == 1) {
            out.print(JsonUtil.loadFalseResult("已超过当日提现次数"));
        } else if (etype == 2) {
            out.print(JsonUtil.loadFalseResult("已超过当日提现金额"));
        } else if (etype == 3) {
            out.print(JsonUtil.loadFalseResult("提现金额大于我的红包"));
        } else if (etype == 111) {
            out.print(JsonUtil.loadFalseResult("修改手机号后,7天内无法提现"));
        } else if (etype == 110) {
            out.print(JsonUtil.loadFalseResult("有售后订单尚未扣款"));
        }
    }
    /**
     * 获取提现进度
     *
     * @param acceptData
     * @param id
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getextractprocess", method = RequestMethod.POST)
    public void getExtractProcess(AcceptData acceptData, long id, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("请上传用户ID"));
            return;
        }
        Extract extract = extractService.getExtractById(id);
        if (extract == null) {
            out.print(JsonUtil.loadFalseResult("提现记录不存在"));
            return;
        }
        if (extract.getUserInfo().getId().longValue() != uid) {
            out.print(JsonUtil.loadFalseResult("不属于当前用户的提现记录"));
            return;
        }
        BindingAccount account = new BindingAccount();
        account.setAccount(extract.getAccount());
        account.setName(extract.getName());
        List<BindingAccount> bindingAccountList = new ArrayList<>();
        bindingAccountList.add(account);
        bindingAccountList = filterBindingAccount(bindingAccountList);
        JSONObject data = new JSONObject();
        data.put("id", extract.getId());
        data.put("money", "¥" + extract.getMoney().toString());
        data.put("account", bindingAccountList.get(0).getAccount());
        data.put("expireTime",
                TimeUtil.getGernalTime(extract.getExtractTime() + 1000 * 60 * 60 * 24L, "yyyy-MM-dd HH:mm"));// 24小时后到账
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findLostOrder")
    public void findLostOrder(AcceptData acceptData, LostOrder lostOrder, PrintWriter out) {
        boolean orderNum = true;
        if (!NumberUtil.isNumeric(lostOrder.getOrderId())) {
            orderNum = false;
        } else if (lostOrder.getOrderId().length() < 12 || lostOrder.getOrderId().length() > 20) {
            orderNum = false;
        } else
            orderNum = Utils.isOrderNum(lostOrder.getOrderId());
        int state;
        String stateInfo = "提交成功,请等待审核结果。";
        if (!orderNum) {
            state = -4;
            stateInfo = "请提交标准的订单号";
        } else {
            state = lostOrderService.addLostOrder(lostOrder);
            if (state == -3) {
                stateInfo = "该订单已是返利订单。";
            } else if (state == -2) {
                stateInfo = "请勿重复提交,该订单已在审核中。";
            } else if (state == -1) {
                stateInfo = "该订单申诉已通过,请稍后查看。";
            } else if (state == -5) {
                stateInfo = "该订单为分享奖金订单";
            }
        }
        JSONObject data = new JSONObject();
        data.put("state", state);
        data.put("info", stateInfo);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findOrderItemList")
    public void findOrderItemList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<HongBaoOrder> list = hongBaoOrderService.listFanLiOrder(uid, page, Constant.PAGE_SIZE);
        List<OrderItem> orderList = new ArrayList<>();
        for (HongBaoOrder oi : list) {
            OrderItem orderItem = OrderItemFactory.create(oi);
            orderItem.setDesc();
            orderItem.setPicture(TbImgUtil.getTBSize220Img(orderItem.getPicture()));
            orderList.add(orderItem);
        }
        long count = hongBaoOrderService.countFanLiOrder(uid);
        Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                .excludeFieldsWithoutExposeAnnotation().create();
        JSONObject data = new JSONObject();
        data.put("list", gson.toJson(orderList));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 获取提成订单列表
     *
     * @param acceptData
     * @param uid
     * @param page
     * @param out
     */
    @RequestMapping("getTiChengOrderList")
    public void getTiChengOrderList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<HongBaoDTO> hongBaoDTOList = hongBaoV2Service.listJiangJinByUid(uid, page, Constant.PAGE_SIZE);
        List<HongBao> list = new ArrayList<>();
        if (hongBaoDTOList != null)
            for (HongBaoDTO dto : hongBaoDTOList) {
                list.add(HongBaoFactory.createHongBao(dto));
            }
        long count = hongBaoV2Service.countJiangJinByUid(uid);
        List<OrderItem> orderItemList = HongBaoUtil.convertToTiChengOrder(list);
        Gson gson = JsonUtil.getApiCommonGson();
        JSONObject data = new JSONObject();
        data.put("list", gson.toJson(orderItemList));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findAccountMessageList")
    public void findAccountMessageList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        accountMessageService.syncSystemZnx(uid);
        List<AccountMessage> list = accountMessageService.findAccountMessageList(uid, page);
        int count = accountMessageService.getCount(uid);
        JSONObject data = new JSONObject();
        data.put("list", GsonUtil.toJsonExpose(list));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("openAccountMessage")
    public void openAccountMessage(AcceptData acceptData, long id, PrintWriter out) {
        accountMessageService.open(id);
        out.print(JsonUtil.loadTrueResult("打开成功"));
    }
    @RequestMapping("findCanOpenMessage")
    public void findCanOpenMessage(AcceptData acceptData, long uid, PrintWriter out) {
        accountMessageService.syncSystemZnx(uid);
        // count>0 有消息
        int count = accountMessageService.getCanOpenCount(uid);
        out.print(JsonUtil.loadTrueResult(count));
        ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
                // 用户等级更新
                try {
                    userInfoExtraService.updateUserRankByUid(uid);
                } catch (Exception e) {
                    LogHelper.errorDetailInfo(e);
                }
            }
        });
    }
    @RequestMapping("collectionGoods")
    public void collectionGoods(AcceptData acceptData, long uid, long auctionId, int type, PrintWriter out) {
        try {
            CollectionGoodsV2 find = collectionGoodsV2Service.findByUidAndAuctionId(uid, auctionId,
                    Constant.SOURCE_TYPE_TAOBAO);
            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, "商品已下架"));
                }
            } else {
                if (find == null) {
                    out.print(JsonUtil.loadTrueResult("取消收藏成功"));
                    return;
                } else {
                    collectionGoodsV2Service.cancelCollectionByAuctionId(uid, auctionId, Constant.SOURCE_TYPE_TAOBAO);
                    out.print(JsonUtil.loadTrueResult("取消收藏成功"));
                }
            }
        } catch (CollectionGoodsException e1) {
            out.print(JsonUtil.loadFalseResult(e1.getCode(), e1.getMsg()));
        }
    }
    /**
     * h5收藏
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param auctionId
     * @param out
     */
    @RequestMapping("collectionGoodsJp")
    public void collectionGoodsJp(String callback, AcceptData acceptData, Long uid, Long auctionId, Integer goodsType,
                                  PrintWriter out) {
        if (uid == null || auctionId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(""));
            return;
        }
        if (goodsType == null) {
            goodsType = Constant.SOURCE_TYPE_TAOBAO;
        }
        CollectionGoodsV2 find = collectionGoodsV2Service.findByUidAndAuctionId(uid, auctionId, goodsType);
        if (find == null) {
            if (goodsType == Constant.SOURCE_TYPE_JD) {
            } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
            } else {
                try {
                    TaoBaoGoodsBrief taoBaoGoodsBrief = redisManager.getTaoBaoGoodsBrief(auctionId);
                    collectionGoodsV2Service.addCollection(uid, taoBaoGoodsBrief);
                    JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(1));
                } catch (TaobaoGoodsDownException e) {
                    JsonUtil.printMode(out, callback, (JsonUtil.loadFalseResult(1, "商品已下架")));
                } catch (CollectionGoodsException e1) {
                    JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e1.getCode(), e1.getMsg()));
                }
            }
        } else {
            // 取消收藏
            try {
                collectionGoodsV2Service.cancelCollectionByAuctionId(uid, auctionId, goodsType);
                JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("取消收藏成功"));
            } catch (CollectionGoodsException e) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
            }
        }
    }
    @RequestMapping("collectionGoodsList")
    public void collectionGoodsList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<CollectionGoodsV2> collectionGoodsList = collectionGoodsV2Service.getCollectionGoodsList(uid, page + 1,
                Constant.PAGE_SIZE, Constant.SOURCE_TYPE_TAOBAO, true);
        List<TaoBaoGoodsBriefExtra> list = new ArrayList<TaoBaoGoodsBriefExtra>();
        long count = collectionGoodsV2Service.getCollectionGoodsCount(uid, Constant.SOURCE_TYPE_TAOBAO, true);
        JSONObject data = new JSONObject();
        List<TaoBaoGoodsBrief> listTaoKeGoods = new ArrayList<TaoBaoGoodsBrief>();
        if (collectionGoodsList != null && collectionGoodsList.size() > 0) {
            BigDecimal proportion = hongBaoManageService.getFanLiRate();
            List<Long> listGid = new ArrayList<Long>();
            for (CollectionGoodsV2 collectionGoodsV2 : collectionGoodsList) {
                CommonGoods commonGoods = collectionGoodsV2.getCommonGoods();
                if (commonGoods == null) {
                    continue;
                }
                listGid.add(commonGoods.getGoodsId());
            }
            try {
                // API网络接口验证是否在售
                listTaoKeGoods = TaoKeApiUtil.getBatchGoodsInfo(listGid);
            } catch (TaoKeApiException e) {
                e.printStackTrace();
            } catch (TaobaoGoodsDownException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            for (CollectionGoodsV2 collectionGoodsV2 : collectionGoodsList) {
                CommonGoods commonGoods = collectionGoodsV2.getCommonGoods();
                if (commonGoods == null) {
                    continue;
                }
                if (listTaoKeGoods != null && listTaoKeGoods.size() > 0) {
                    int state = 1; // 默认停售
                    Long goodsId = commonGoods.getGoodsId();
                    for (TaoBaoGoodsBrief taoKeGoods : listTaoKeGoods) {
                        Long auctionId = taoKeGoods.getAuctionId();
                        if (goodsId == auctionId || goodsId.equals(auctionId)) {
                            state = 0; // 在售
                            break;
                        }
                    }
                    commonGoods.setState(state);
                }
                TaoBaoGoodsBrief goodsBrief = TaoBaoUtil.convert(commonGoods);
                goodsBrief.setSalesCount(TaoBaoUtil.getSaleCount(goodsBrief.getBiz30day()));
                TaoBaoGoodsBriefExtra taoBaoGoodsBriefExtra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goodsBrief,
                        proportion.toString(), "");
                taoBaoGoodsBriefExtra.setCreatetime(collectionGoodsV2.getCreateTime());
                list.add(taoBaoGoodsBriefExtra);
            }
        }
        GsonBuilder builder = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
            @Override
            public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) {
                if (value == null) {
                    return new JsonPrimitive("");
                } else {
                    return new JsonPrimitive(value.getTime() + "");
                }
            }
        });
        Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(builder).excludeFieldsWithoutExposeAnnotation()
                .create();
        data.put("list", gson.toJson(list));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("deleteCollectionGoods")
    public void deleteCollectionGoods(AcceptData acceptData, String ids, Integer type, long uid, Integer goodsType,
                                      PrintWriter out) {
        if (type != null && type == 1) {
            clearConllectionGoods(acceptData, uid, out);
        } else {
            if (!StringUtil.isNullOrEmpty(ids)) {
                Arrays.asList(ids.split(",")).parallelStream().forEach(auctionIdStr -> {
                    try {
                        collectionGoodsV2Service.cancelCollectionByAuctionId(uid, Long.parseLong(auctionIdStr),
                                goodsType);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
            }
        }
        out.print(JsonUtil.loadTrueResult("删除成功"));
    }
    @RequestMapping("clearConllectionGoods")
    public void clearConllectionGoods(AcceptData acceptData, long uid, PrintWriter out) {
        try {
            collectionGoodsV2Service.cancelCollectionByUid(uid);
        } catch (CollectionGoodsException e) {
            e.printStackTrace();
            out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMessage()));
        }
        out.print(JsonUtil.loadTrueResult("删除成功"));
    }
    @RequestMapping("ruleMessage")
    public void ruleMessage(AcceptData acceptData, PrintWriter out) {
        JSONObject data = new JSONObject();
        data.put("rank3", String.format("成功邀请50个好友完成注册安装%sAPP(包括一度好友和二度好友之和)",
                Constant.systemCommonConfig.getProjectChineseName()));
        data.put("rank2", String.format("成功邀请5个好友完成注册安装%sAPP(包括一度好友和二度好友之和)",
                Constant.systemCommonConfig.getProjectChineseName()));
        data.put("rank1", String.format("成功邀请1个好友完成注册安装%sAPP(包括一度好友和二度好友之和)",
                Constant.systemCommonConfig.getProjectChineseName()));
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findAccountDetailsList")
    public void findAccountDetailsList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<UserMoneyDetail> detailList = userMoneyDetailService.listByUidWithState(uid, page, Constant.PAGE_SIZE);
        List<AccountDetails> list = new ArrayList<>();
        for (UserMoneyDetail detail : detailList)
            list.add(AccountDetailsFactory.create(detail));
        long count = userMoneyDetailService.countByUidWithState(uid);
        JSONObject data = new JSONObject();
        data.put("list", GsonUtil.toJsonExpose(list));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findAccountDetailsListV2")
    public void findAccountDetailsListNew(AcceptData acceptData, Long uid, int page, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "UID为空"));
            return;
        }
        List<UserMoneyDetail> detailList = userMoneyDetailService.listByUidWithState(uid, page, Constant.PAGE_SIZE);
        List<AccountDetails> list = new ArrayList<>();
        for (UserMoneyDetail detail : detailList)
            list.add(AccountDetailsFactory.create(detail));
        long count = userMoneyDetailService.countByUidWithState(uid);
        JSONObject data = new JSONObject();
        JSONArray array = new JSONArray();
        for (AccountDetails ad : list) {
            JSONObject item = JSONObject.fromObject(GsonUtil.toJsonExpose(ad));
            if (ad.getState() != null && ad.getState() != -1)
                item.put("stateIcon",
                        "http://hcj-1255749512.file.myqcloud.com/resource/app/extract_state_" + ad.getState() + ".png");
            array.add(item);
        }
        data.put("list", array);
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    // 获取商品分享链接
    @RequestMapping(value = "getGoodsShareUrl")
    public void getGoodsShareUrl(AcceptData acceptData, long id, PrintWriter out) {
        out.print(JsonUtil
                .loadTrueResult(String.format("%s?id=" + id, Constant.systemCommonConfig.getAppShareInfoUrl())));
    }
    /**
     * 用户队员列表查询 1.4.1
     *
     * @param acceptData
     * @param page
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "getMyTeam", method = RequestMethod.POST)
    public void getMyTeam(AcceptData acceptData, long page, long uid, long type, PrintWriter out) {
        try {
            int pageSize = Constant.PAGE_SIZE;
            JSONObject resultData = new JSONObject();
            if (type == 1) {
                resultData = threeSaleSerivce.getMyFirstTeam((page - 1) * pageSize, pageSize, uid);
            } else if (type == 2) {
                resultData = threeSaleSerivce.getMySecondTeam((page - 1) * pageSize, pageSize, uid);
            }
            // 安卓系统返回所有数据
            String platform = acceptData.getPlatform();
            if ("android".equalsIgnoreCase(platform)) {
                long firstTeam = threeSaleSerivce.countFirstTeam(uid);
                long secondTeam = threeSaleSerivce.countSecondTeam(uid);
                JSONObject bossData = null;
                ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
                if (threeSale != null) {
                    bossData = new JSONObject();
                    UserInfo boss = threeSale.getBoss();
                    if (boss != null) {
                        bossData.put("nickName", boss.getNickName());
                        bossData.put("portrait", boss.getPortrait());
                    }
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
                    Long createTime = threeSale.getCreateTime();
                    Date inviteTime = new Date(createTime);
                    bossData.put("inviteTime", "邀请时间: " + sdf.format(inviteTime));
                }
                String helpLink = configService.getValue(ConfigKeyEnum.teamHelpUrl.getKey(),acceptData.getSystem());
                if (helpLink == null) {
                    helpLink = "";
                }
                boolean hasCode = false;
                String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
                if (inviteCode != null && inviteCode.trim().length() > 0) {
                    hasCode = true; // 已有邀请码
                } else {
                    // 邀请激活链接
                    resultData.put("activationlink", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(),acceptData.getSystem()));
                }
                resultData.put("hasCode", hasCode);
                resultData.put("helpLink", helpLink);
                resultData.put("firstTeam", firstTeam);
                resultData.put("firstTeamTotal", firstTeam);
                resultData.put("secondTeam", secondTeam);
                resultData.put("secondTeamTotal", secondTeam);
                resultData.put("boss", bossData);
            }
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("统计失败"));
            e.printStackTrace();
        }
    }
    /**
     * 用户队员列表查询 1.5.3查询有效队员
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "getMyTeamNew", method = RequestMethod.POST)
    public void getMyTeamNew(AcceptData acceptData, long page, long uid, long type, PrintWriter out) {
        try {
            int pageSize = Constant.PAGE_SIZE;
            JSONObject resultData = new JSONObject();
            if (type == 1) {
                resultData = threeSaleSerivce.getMyFirstTeam((page - 1) * pageSize, pageSize, uid);
            } else if (type == 2) {
                resultData = threeSaleSerivce.getMySecondTeam((page - 1) * pageSize, pageSize, uid);
            }
            // 安卓系统返回所有数据
            String platform = acceptData.getPlatform();
            if ("android".equalsIgnoreCase(platform)) {
                long firstTeam = threeSaleSerivce.countFirstTeam(uid);
                long secondTeam = threeSaleSerivce.countSecondTeam(uid);
                JSONObject bossData = null;
                ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
                if (threeSale != null) {
                    bossData = new JSONObject();
                    UserInfo boss = threeSale.getBoss();
                    if (boss != null) {
                        bossData.put("nickName", boss.getNickName());
                        bossData.put("portrait", boss.getPortrait());
                    }
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
                    Long createTime = threeSale.getCreateTime();
                    Date inviteTime = new Date(createTime);
                    bossData.put("inviteTime", "邀请时间: " + sdf.format(inviteTime));
                }
                String helpLink = configService.getValue(ConfigKeyEnum.teamHelpUrl.getKey(),acceptData.getSystem());
                if (helpLink == null) {
                    helpLink = "";
                }
                boolean hasCode = false;
                String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
                if (inviteCode != null && inviteCode.trim().length() > 0) {
                    hasCode = true; // 已有邀请码
                } else {
                    // 邀请激活链接
                    resultData.put("activationlink", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(),acceptData.getSystem()));
                }
                resultData.put("hasCode", hasCode);
                resultData.put("helpLink", helpLink);
                resultData.put("firstTeam", firstTeam);
                resultData.put("secondTeam", secondTeam);
                resultData.put("boss", bossData);
            }
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("统计失败"));
            e.printStackTrace();
        }
    }
    /**
     * 用户队员统计 1.4.1
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "countMyTeam", method = RequestMethod.POST)
    public void countMyTeam(AcceptData acceptData, long uid, PrintWriter out) {
        try {
            long firstTeam = threeSaleSerivce.countFirstTeam(uid);
            long secondTeam = threeSaleSerivce.countSecondTeam(uid);
            JSONObject bossData = new JSONObject();
            ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
            if (threeSale != null) {
                UserInfo boss = threeSale.getBoss();
                if (boss != null) {
                    bossData.put("nickName", boss.getNickName());
                    bossData.put("portrait", boss.getPortrait());
                }
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
                Long createTime = threeSale.getCreateTime();
                Date inviteTime = new Date(createTime);
                bossData.put("inviteTime", "邀请时间: " + sdf.format(inviteTime));
            }
            JSONObject resultData = new JSONObject();
            String helpLink = configService.getValue(ConfigKeyEnum.teamHelpUrl.getKey(),acceptData.getSystem());
            if (helpLink == null) {
                helpLink = "";
            }
            resultData.put("helpLink", helpLink);
            resultData.put("firstTeam", firstTeam);
            resultData.put("firstTeamTotal", firstTeam);
            resultData.put("secondTeam", secondTeam);
            resultData.put("secondTeamTotal", secondTeam);
            resultData.put("boss", bossData);
            boolean hasCode = false;
            String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
            if (inviteCode != null && inviteCode.trim().length() > 0) {
                hasCode = true; // 已有邀请码
            } else {
                // 邀请激活链接
                resultData.put("activationlink", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(),acceptData.getSystem()));
            }
            resultData.put("hasCode", hasCode);
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("统计失败"));
            e.printStackTrace();
        }
    }
    /**
     * 用户队员信息保存 1.4.1
     *
     * @param acceptData
     * @param uid
     * @param inviteId   邀请id
     * @param out
     */
    @RequestMapping(value = "setextrainfo", method = RequestMethod.POST)
    public void setExtraInfo(AcceptData acceptData, long uid, long inviteId, String memoName, PrintWriter out) {
        ThreeSale threeSale = threeSaleSerivce.selectByPrimaryKey(inviteId);
        if (threeSale == null) {
            out.print(JsonUtil.loadFalseResult("该记录不存在"));
            return;
        }
        UserInfo worker = threeSale.getWorker();
        if (worker == null) {
            out.print(JsonUtil.loadFalseResult("该记录不存在"));
            return;
        }
        int type = 1;
        if (threeSale.getBoss().getId() != uid) {
            type = 2;
        }
        ThreeSaleExtraInfo extraInfo = threeSaleExtraInfoSerivce.getbyBossIdAndWorkerId(uid, worker.getId());
        if (extraInfo == null) {
            extraInfo = new ThreeSaleExtraInfo();
            Long bossUid = threeSale.getBoss().getId();
            if (uid == bossUid) {
                extraInfo.setType(1); // 直接
            } else {
                extraInfo.setType(2); // 间接
            }
            extraInfo.setWorker(worker);
            extraInfo.setNickname(memoName);
            extraInfo.setCreateTime(new Date());
            extraInfo.setUpdateTime(new Date());
            extraInfo.setBoss(new UserInfo(uid));
            threeSaleExtraInfoSerivce.insertSelective(extraInfo);
        } else {
            ThreeSaleExtraInfo updateInfo = new ThreeSaleExtraInfo();
            updateInfo.setId(extraInfo.getId());
            updateInfo.setNickname(memoName);
            updateInfo.setUpdateTime(new Date());
            threeSaleExtraInfoSerivce.updateByPrimaryKeySelective(updateInfo);
        }
        // 更新粉丝记录信息
        teamFansInfoService.updateMemoName(worker.getId(), type, memoName);
        out.print(JsonUtil.loadTrueResult("保存成功"));
    }
    /**
     * 设置界面开关状态
     *
     * @param acceptData
     * @param uid
     * @param params
     * @param out
     */
    @RequestMapping(value = "setModuleState", method = RequestMethod.POST)
    public void setModuleState(AcceptData acceptData, Long uid, String params, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        try {
            if (params == null || params.trim().length() == 0) {
                out.print(JsonUtil.loadFalseResult("传递参数为空"));
                return;
            }
            JSONObject json = JSONObject.fromObject(params);
            Iterator<String> iterator = json.keys();
            while (iterator.hasNext()) {
                String type = (String) iterator.next();
                int state = json.getInt(type);
                userCustomSettingsService.saveModuleState(uid, type, state);
            }
            out.print(JsonUtil.loadTrueResult("设置成功"));
        } catch (UserCustomSettingsException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("设置失败"));
            e.printStackTrace();
        }
    }
    /**
     * 获取等级信息
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getRankInfo", method = RequestMethod.POST)
    public void getRankInfo(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        try {
            UserInfoExtraVO rankInfo = userInfoExtraService.getRankInfo(uid);
            GsonBuilder gsonBuilder = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder());
            gsonBuilder.excludeFieldsWithoutExposeAnnotation();
            Gson gson = gsonBuilder.setDateFormat("yyyy.MM.dd").create();
            JSONObject resultData = new JSONObject();
            resultData.put("rankInfo", gson.toJson(rankInfo));
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (UserInfoExtraException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("获取失败"));
            e.printStackTrace();
        }
    }
    /**
     * 获取等级信息
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getUserConfig", method = RequestMethod.POST)
    public void getUserConfig(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        try {
            String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
            JSONObject inviteData = new JSONObject();
            if (inviteCode == null || inviteCode.trim().length() == 0) {
                // 无邀请码
                inviteData.put("content", "邀请激活");
                inviteData.put("link", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(),acceptData.getSystem()));
            } else {
                // 已有邀请码
                inviteData.put("content", "邀请码");
                inviteData.put("link", configService.getValue(ConfigKeyEnum.inviteActivationSuccessUrl.getKey(),acceptData.getSystem()));
            }
            JSONObject data = new JSONObject();
            data.put("invite", inviteData);
            out.print(JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("获取失败"));
            e.printStackTrace();
        }
    }
    /**
     * 获取用户信息
     *
     * @param acceptData
     * @param requst
     * @param out
     */
    @UserActive(uid = "#uid")
    @RequestMapping(value = "getuserinfoNew", method = RequestMethod.POST)
    public void getuserinfoNew(AcceptData acceptData, Long uid, HttpServletRequest requst, PrintWriter out) {
        try {
            BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                    acceptData.getPackages());
            if (system == null) {
                out.print(JsonUtil.loadFalseResult("系统不存在"));
                return;
            }
            if (uid == null) {
                out.print(JsonUtil.loadFalseResult("请求参数为空"));
                return;
            }
            UserInfo userInfo = userInfoService.getUserInfo(uid);
            // 添加用户活跃记录
            UserActiveLog userActiveLog = new UserActiveLog();
            userActiveLog.setChannel(acceptData.getChannel());
            userActiveLog.setIp(requst.getRemoteHost());
            userActiveLog.setUid(userInfo.getId());
            userActiveLog.setVersionCode(acceptData.getVersion());
            userActiveLog.setOsVersion(acceptData.getOsVersion());
            userActiveLog.setDeviceType(acceptData.getDeviceType());
            userActiveLog.setDevice(acceptData.getDevice());
            userActiveLogService.addUserActiveLog(userActiveLog);
            // 处理用户信息
            outUserInfoHandle(userInfo);
            GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
            JSONObject data = new JSONObject();
            // 界面状态
            UserSettingsVO mySettings = null;
            try {
                mySettings = userCustomSettingsService.getMySettings(uid);
            } catch (UserCustomSettingsException e) {
                mySettings = new UserSettingsVO();
                e.printStackTrace();
            }
            if (mySettings.getCancelNotice() == null) {
                mySettings.setCancelNotice(0);
            }
            if (mySettings.getNoBonusCount() == null) {
                mySettings.setNoBonusCount(0);
            }
            if (mySettings.getNoNewsRedDot() == null) {
                mySettings.setNoNewsRedDot(0);
            }
            if (mySettings.getNoShareRecordAndStorage() == null) {
                mySettings.setNoShareRecordAndStorage(0);
            }
            if (mySettings.getNoInvitationBonus() == null) {
                mySettings.setNoInvitationBonus(0);
            }
            if (mySettings.getNoDisplayPhoneNum() == null) {
                mySettings.setNoDisplayPhoneNum(0);
            }
            if (mySettings.getOpenSpreadHongBao() == null) {
                if (userTaoLiJinDetailService.countDetail(uid) > 0) {
                    mySettings.setOpenSpreadHongBao(1);
                } else {
                    mySettings.setOpenSpreadHongBao(0);
                }
            }
            data.put("moduleState", mySettings);
            boolean tailor = false;
            int welfareCenterNews = 0;
            String invitCode = null;
            UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
            if (userInfoExtra != null) {
                if (userInfoExtra.getCouponNews() != null) {
                    welfareCenterNews = userInfoExtra.getCouponNews();
                }
                // vip邀请码优先
                if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCodeVip())) {
                    invitCode = userInfoExtra.getInviteCodeVip();
                } else if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCode())) {
                    tailor = true;
                    invitCode = userInfoExtra.getInviteCode();
                }
                if (userInfoExtra.getUserRank() != null) {
                    String picture = userInfoExtra.getUserRank().getPicture();
                    String icon = userInfoExtra.getUserRank().getIcon();
                    userInfo.setRankNamePicture(picture);
                    userInfo.setRankIcon(icon);
                } else {
                    userInfo.setRankNamePicture(null);
                    userInfo.setRankIcon(null);
                }
                // 1.6.5 之后返回性别、微信号
                if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion())) {
                    if (userInfoExtra.getSex() != null)
                        userInfo.setSex(userInfoExtra.getSex());
                    if (!StringUtil.isNullOrEmpty(userInfoExtra.getWeiXin()))
                        userInfo.setWeiXin(userInfoExtra.getWeiXin());
                }
                // 二维码
                userInfo.setErCode(userInfoExtra.getErCode());
            }
            // 显示邀请码特制入口
            data.put("tailor", tailor);
            // 1.6.5 之后返回 微信号提示
            if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion()))
                userInfo.setWeiXinTip("添加微信号后,你的邀请人和直接粉丝可以通过微信与你建立联系。");
            // 查询是否为VIP
            if (VersionUtil.greaterThan_2_0_5(acceptData.getPlatform(), acceptData.getVersion())) {
                userInfo.setVip(userVIPInfoService.isVIP(uid));
                boolean verifyForbid = redPackForbidService.verifyForbid(uid);
                data.put("redPackLock", verifyForbid);
            }
            data.put("user", JsonUtil.getConvertBigDecimalToStringBuilder(gsonBuilder).create().toJson(userInfo));
            data.put("invitCode", invitCode); // 邀请码
            if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCodeVip()))
                data.put("invitCodeUpdated", true);// 邀请码是否已经修改过
            else
                data.put("invitCodeUpdated", false);
            data.put("welfareCenterNews", welfareCenterNews);// 福利中心消息
            data.put("vipLink", userVipConfigService.getValueByKey("vip_link"));// 超级会员升级链接
            // 2.0.1之后绑定手机号
            if (VersionUtil.greaterThan_2_0_1(acceptData.getPlatform(), acceptData.getVersion())) {
                boolean bindPhone = false;
                if (StringUtil.isNullOrEmpty(userInfo.getPhone()))
                    bindPhone = bindRemindService.bindRemind(uid, BindRemind.TYPE_PHONE);
                data.put("bindPhone", bindPhone);
            }
            if (!StringUtil.isNullOrEmpty(invitCode)) {
                // 2.0.6 返回邀请人
                if (VersionUtil.greaterThan_2_0_6(acceptData.getPlatform(), acceptData.getVersion())) {
                    String bossName = "";
                    ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
                    if (threeSale != null && threeSale.getBoss() != null) {
                        bossName = threeSale.getBoss().getNickName();
                    }
                    data.put("bossName", bossName);
                }
            }
            if (VersionUtil.greaterThan_2_0_7(acceptData.getPlatform(), acceptData.getVersion())) {
                UserInviteLevelEnum level = null;
                // VIP预览信息
                if (VersionUtil.greaterThan_2_1_1(acceptData.getPlatform(), acceptData.getVersion())) {
                    String redisContent = previewInfoService.getRedisContent(uid, PreviewEnum.mineInfo);
                    if (!StringUtil.isNullOrEmpty(redisContent)) {
                        MineInfoVO vo = new Gson().fromJson(redisContent, MineInfoVO.class);
                        if (vo != null) {
                            if (!StringUtil.isNullOrEmpty(vo.getBalance()))
                                userInfo.setMyHongBao(new BigDecimal(vo.getBalance()));
                            if (!StringUtil.isNullOrEmpty(vo.getLevel()))
                                for (UserInviteLevelEnum levelEnum : UserInviteLevelEnum.values()) {
                                    if (levelEnum.name().equals(vo.getLevel())) {
                                        level = levelEnum;
                                        break;
                                    }
                                }
                        }
                    }
                }
                if (level == null) {
                    if (VersionUtil.greaterThan_2_1(acceptData.getPlatform(), acceptData.getVersion())) {
                        level = userInviteService.getUserInviteLevelNew(uid);
                    } else {
                        level = userInviteService.getUserInviteLevel(uid);
                    }
                }
                JSONObject inviteLevel = new JSONObject();
                inviteLevel.put("level", level.name());
                inviteLevel.put("link", level.getLink());
                data.put("inviteLevel", inviteLevel);
            }
            if (VersionUtil.greaterThan_2_1_1(acceptData.getPlatform(), acceptData.getVersion())) {
                data.put("fansCountLink", configService.getValue(ConfigKeyEnum.teamStatisticsLink.getKey(),acceptData.getSystem()));
                // 会员动作
                // 查询是否为超级会员,是的话返回超会管理链接
                UserLevelEnum level = userLevelManager.getUserLevel(uid);
                JSONObject vipAction = null;
                String managerLink = userVipConfigService.getValueByKey("vip_manager_link");
                if ((level == UserLevelEnum.superVIP || level == UserLevelEnum.tearcher)
                        && !StringUtil.isNullOrEmpty(managerLink)) {
                    vipAction = new JSONObject();
                    vipAction.put("name", "超会管理");
                    vipAction.put("jumpDetail",
                            jumpDetailV2Service.getByTypeCache("web",
                                    acceptData.getPlatform().equalsIgnoreCase("android") ? 1 : 2,
                                    Integer.parseInt(acceptData.getVersion())));
                    JSONObject params = new JSONObject();
                    params.put("url", userVipConfigService.getValueByKey("vip_manager_link"));
                    vipAction.put("params", params);
                } else {
                    // 查询是否可以提交会员申请,是的话返回资料填写页面
                    List<GiveVIPApplyInfo> list = giveVIPApplyInfoService.listByStateAndTargetUid(uid,
                            GiveVIPApplyInfo.STATE_NO_INFO, 1, 20);
                    if (list != null && list.size() > 0) {
                        String link = userVipConfigService.getValueByKey("apply_vip_upload_info_link");
                        if (!StringUtil.isNullOrEmpty(link)) {
                            vipAction = new JSONObject();
                            vipAction.put("name", "申请会员");
                            vipAction.put("jumpDetail",
                                    jumpDetailV2Service.getByTypeCache("web",
                                            acceptData.getPlatform().equalsIgnoreCase("android") ? 1 : 2,
                                            Integer.parseInt(acceptData.getVersion())));
                            JSONObject params = new JSONObject();
                            params.put("url", link.replace("[ID]", list.get(0).getId()));
                            vipAction.put("params", params);
                        }
                    }
                }
                if (vipAction != null)
                    data.put("vipAction", vipAction);
            }
            data.put("user", JsonUtil.getConvertBigDecimalToStringBuilder(gsonBuilder).create().toJson(userInfo));
            out.print(JsonUtil.loadTrueResult(data));
            final UserInfo uuser = userInfo;
            ThreadUtil.run(new Runnable() {
                public void run() {
                    // 获取邀请码:若无邀请码且存在有效的队员关系 则自动生成邀请码
                    userInfoExtraService.getInviteCodeByUid(uuser.getId());
                    // 更新用户附加信息,老用户不存在的需要添加
                    try {
                        userInfoExtraService.updateUserRankByUid(uuser.getId());
                    } catch (UserInfoExtraException e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (UserInfoException e) {
            out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("获取失败"));
            LogHelper.errorDetailInfo(e);
        }
    }
    private void outUserInfoHandle(UserInfo user) {
        // 红包处理
        user.setTotalHongBao(new BigDecimal(0));
        user.setNoOpenHongBao(new BigDecimal(0));
        user.setCanOpenHongBao(new BigDecimal(0));
        // 电话号码处理
        if (!StringUtil.isNullOrEmpty(user.getPhone())) {
            if (user.getPhone().length() > 5) {
                String phone = user.getPhone().substring(0, 3);
                phone += "******";
                phone += user.getPhone().substring(user.getPhone().length() - 2, user.getPhone().length());
                user.setPhone(phone);
            }
        }
        UserInfoExtraVO userInfoExtra = userInfoExtraService.getInfoExtraVOByUid(user.getId());
        if (userInfoExtra != null && userInfoExtra.getUserRank() != null) {
            String picture = userInfoExtra.getUserRank().getPicture();
            String icon = userInfoExtra.getUserRank().getIcon();
            user.setRankNamePicture(picture);
            user.setRankIcon(icon);
        }
    }
    /**
     * 用户更换头像
     *
     * @param acceptData
     * @param uid
     * @param request
     * @param out
     */
    @RequestMapping(value = "uploadPortrait")
    public void uploadPortrait(AcceptData acceptData, MultipartFile file, Long uid, HttpServletRequest request,
                               PrintWriter out) {
        try {
            if (uid == null) {
                out.print(JsonUtil.loadFalseResult("用户未登录"));
                return;
            }
            if (file == null) {
                out.print(JsonUtil.loadFalseResult("上传文件不能为空"));
                return;
            }
            userInfoService.uploadPortrait(file, uid);
            out.print(JsonUtil.loadTrueResult("保存成功"));
        } catch (UserInfoException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        } catch (IOException e) {
            out.print(JsonUtil.loadFalseResult("图片上传失败失败"));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("保存失败"));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }
    /**
     * 更换基础信息
     *
     * @param acceptData
     * @param nickName
     * @param uid
     * @param out
     */
    @RequestMapping(value = "saveInfo")
    public void saveInfo(AcceptData acceptData, String nickName, String weiXin, Integer sex, Long uid,
                         String inviteCode, MultipartFile qrCodeFile, HttpServletRequest request, PrintWriter out) {
        try {
            if (uid == null) {
                out.print(JsonUtil.loadFalseResult("用户未登录"));
                return;
            }
            // 修改昵称
            if (!StringUtil.isNullOrEmpty(nickName)) {
                if (nickName.length() > 200) {
                    out.print(JsonUtil.loadFalseResult("昵称过长"));
                    return;
                }
                if (maskKeyService.examineContent(nickName)) {
                    out.print(JsonUtil.loadFalseResult("不能包含敏感词汇"));
                    return;
                }
                userInfoService.saveUserInfo(nickName, uid);
                userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.nickName, nickName);
            }
            // 修改微信号
            if (!StringUtil.isNullOrEmpty(weiXin)) {
                if (weiXin.length() > 32) {
                    out.print(JsonUtil.loadFalseResult("微信号过长"));
                    return;
                }
                UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
                if (userInfoExtra != null) {
                    UserInfoExtra extra = new UserInfoExtra();
                    extra.setId(userInfoExtra.getId());
                    extra.setWeiXin(weiXin);
                    userInfoExtraService.saveUserInfoExtra(extra);
                    userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.setWeiXinNum, weiXin);
                }
            }
            // 修改性别
            if (sex != null && sex > 0 && sex < 3) {
                UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
                if (userInfoExtra != null) {
                    UserInfoExtra extra = new UserInfoExtra();
                    extra.setId(userInfoExtra.getId());
                    extra.setSex(sex);
                    userInfoExtraService.saveUserInfoExtra(extra);
                    userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.gender, sex + "");
                }
            }
            // 修改邀请码
            if (!StringUtil.isNullOrEmpty(inviteCode)) {// 邀请码不为空
                inviteCode = inviteCode.trim();
                if (inviteCode.length() >= 4 && inviteCode.length() <= 12) {
                    try {
                        userInfoExtraService.updateInviteCodeVip(inviteCode, uid);
                        out.print(JsonUtil.loadTrueResult("保存成功"));
                        return;
                    } catch (UserInfoExtraException e) {
                        out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMessage()));
                    }
                } else {
                    out.print(JsonUtil.loadFalseResult(1, "邀请码必须为4到12位"));
                    return;
                }
            }
            // 二维码
            if (qrCodeFile != null) {
                userInfoExtraService.uploadERCode(qrCodeFile, uid);
            }
            out.print(JsonUtil.loadTrueResult("保存成功"));
        } catch (UserInfoException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
            e.printStackTrace();
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("保存失败"));
            e.printStackTrace();
        }
    }
}
package com.yeshi.fanli.controller.client.v1;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.yeshi.fanli.entity.SystemFunction;
import com.yeshi.fanli.entity.SystemPIDInfo;
import com.yeshi.fanli.entity.bus.user.*;
import com.yeshi.fanli.exception.user.*;
import com.yeshi.fanli.service.inter.pdd.PDDAuthService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.manger.PIDManager;
import com.yeshi.fanli.util.*;
import com.yeshi.fanli.util.GsonUtil;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoApiUtil;
import com.yeshi.fanli.util.pinduoduo.PinDuoDuoUtil;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
import org.yeshi.utils.*;
import org.yeshi.utils.entity.wx.WeiXinUser;
import org.yeshi.utils.taobao.TbImgUtil;
import org.yeshi.utils.tencentcloud.COSManager;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonPrimitive;
import com.google.gson.JsonSerializationContext;
import com.google.gson.JsonSerializer;
import com.yeshi.fanli.dto.HongBao;
import com.yeshi.fanli.dto.HongBaoDTO;
import com.yeshi.fanli.dto.money.AccountDetails;
import com.yeshi.fanli.dto.order.OrderItem;
import com.yeshi.fanli.dto.user.UserInviteLevelEnum;
import com.yeshi.fanli.dto.wx.WXAccountInfoDTO;
import com.yeshi.fanli.entity.AppVersionInfo;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.bus.user.PreviewInfo.PreviewEnum;
import com.yeshi.fanli.entity.bus.user.UserInfoModifyRecord.ModifyTypeEnum;
import com.yeshi.fanli.entity.bus.user.vip.GiveVIPApplyInfo;
import com.yeshi.fanli.entity.bus.user.vip.UserLevelEnum;
import com.yeshi.fanli.entity.common.AdminUser;
import com.yeshi.fanli.entity.common.Config;
import com.yeshi.fanli.entity.goods.CollectionGoodsV2;
import com.yeshi.fanli.entity.goods.CommonGoods;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.system.BusinessSystem;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBrief;
import com.yeshi.goods.facade.entity.taobao.TaoBaoGoodsBriefExtra;
import com.yeshi.fanli.exception.goods.CollectionGoodsException;
import com.yeshi.fanli.exception.taobao.TaoKeApiException;
import com.yeshi.fanli.exception.taobao.TaobaoGoodsDownException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.AdminUserService;
import com.yeshi.fanli.service.inter.common.JumpDetailV2Service;
import com.yeshi.fanli.service.inter.config.AppVersionService;
import com.yeshi.fanli.service.inter.config.BusinessSystemService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.goods.CollectionGoodsV2Service;
import com.yeshi.fanli.service.inter.money.UserMoneyDetailService;
import com.yeshi.fanli.service.inter.money.extract.BindingAccountService;
import com.yeshi.fanli.service.inter.money.extract.ExtractRecordService;
import com.yeshi.fanli.service.inter.money.extract.ExtractService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
import com.yeshi.fanli.service.inter.order.LostOrderService;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.service.inter.order.config.HongBaoManageService;
import com.yeshi.fanli.service.inter.redpack.RedPackBalanceService;
import com.yeshi.fanli.service.inter.redpack.RedPackForbidService;
import com.yeshi.fanli.service.inter.tlj.UserTaoLiJinDetailService;
import com.yeshi.fanli.service.inter.user.AccountMessageService;
import com.yeshi.fanli.service.inter.user.BindRemindService;
import com.yeshi.fanli.service.inter.user.MaskKeyService;
import com.yeshi.fanli.service.inter.user.PreviewInfoService;
import com.yeshi.fanli.service.inter.user.ShamUserService;
import com.yeshi.fanli.service.inter.user.SpreadUserImgService;
import com.yeshi.fanli.service.inter.user.UserAccountService;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserCustomSettingsService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoModifyRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserRankService;
import com.yeshi.fanli.service.inter.user.UserShareGoodsRecordService;
import com.yeshi.fanli.service.inter.user.invite.TeamFansInfoService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleExtraInfoSerivce;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteService;
import com.yeshi.fanli.service.inter.user.vip.GiveVIPApplyInfoService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.service.inter.user.vip.UserVipConfigService;
import com.yeshi.fanli.service.manger.user.UserLevelManager;
import com.yeshi.fanli.util.account.UserUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.util.annotation.UserActive;
import com.yeshi.fanli.util.email.MailSenderUtil;
import com.yeshi.fanli.util.factory.AccountDetailsFactory;
import com.yeshi.fanli.util.factory.HongBaoFactory;
import com.yeshi.fanli.util.factory.OrderItemFactory;
import com.yeshi.fanli.util.taobao.TaoBaoUtil;
import com.yeshi.fanli.util.taobao.TaoKeApiUtil;
import com.yeshi.fanli.util.wx.MyWXLoginUtil;
import com.yeshi.fanli.vo.user.MineInfoVO;
import com.yeshi.fanli.vo.user.UserInfoExtraVO;
import com.yeshi.fanli.vo.user.UserSettingsVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("api/v1/customer")
public class UserInfoController {
    @Resource
    private UserInfoService userInfoService;
    @Resource
    private BindingAccountService bindingAccountService;
    @Resource
    private ExtractService extractService;
    @Resource
    private ConfigService configService;
    @Resource
    private BusinessSystemService businessSystemService;
    @Resource
    private ThreeSaleSerivce threeSaleSerivce;
    @Resource
    private ThreeSaleExtraInfoSerivce threeSaleExtraInfoSerivce;
    @Resource
    private LostOrderService lostOrderService;
    @Resource
    private HongBaoManageService hongBaoManageService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private ExtractRecordService extractRecordService;
    @Resource
    private UserActiveLogService userActiveLogService;
    @Resource
    private CollectionGoodsV2Service collectionGoodsV2Service;
    @Resource
    private AdminUserService adminUserService;
    @Resource
    private UserMoneyDetailService userMoneyDetailService;
    @Resource
    private HongBaoOrderService hongBaoOrderService;
    @Resource
    private HongBaoV2Service hongBaoV2Service;
    @Resource
    private SpreadUserImgService spreadUserImgService;
    @Resource
    private UserShareGoodsRecordService userShareGoodsRecordService;
    @Resource
    private UserCustomSettingsService userCustomSettingsService;
    @Resource
    private UserInfoExtraService userInfoExtraService;
    @Resource
    private AppVersionService appVersionService;
    @Resource
    private AccountMessageService accountMessageService;
    @Resource
    private MaskKeyService maskKeyService;
    @Resource
    private UserTaoLiJinDetailService userTaoLiJinDetailService;
    @Resource
    private UserInfoModifyRecordService userInfoModifyRecordService;
    @Resource
    private BindRemindService bindRemindService;
    @Resource
    private UserVIPInfoService userVIPInfoService;
    @Resource
    private UserVipConfigService userVipConfigService;
    @Resource
    private RedPackForbidService redPackForbidService;
    @Resource
    private UserInviteService userInviteService;
    @Resource
    private TeamFansInfoService teamFansInfoService;
    @Resource
    private UserLevelManager userLevelManager;
    @Resource
    private JumpDetailV2Service jumpDetailV2Service;
    @Resource
    private GiveVIPApplyInfoService giveVIPApplyInfoService;
    @Resource
    private PreviewInfoService previewInfoService;
    @Resource
    private PDDAuthService pddAuthService;
    @Resource
    private PIDManager pidManager;
    @Resource
    private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
    private static final String EXTRACT_MIN_MONEY = ConfigKeyEnum.extractMoneyMin.getKey();
    private static final String EXTRACT_MAX_MONEY = ConfigKeyEnum.extractMoneyMAX.getKey();
    /**
     * 获取用户信息
     *
     * @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.getUserByIdWithMybatis(id);
            // ThreadUtil.run(new Runnable() {
            // @Override
            // public void run() {
            // threeSaleSerivce.effective(find);
            // }
            // });
            if (find != null) {
                if (find.getState() != UserInfo.STATE_NORMAL) {
                    out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER,
                            Constant.FORBIDDEN_USER_REASON_DESC));
                    return;
                }
                // 邀请关系生效
                threeSaleSerivce.effective(find);
                // 添加用户活跃记录
                UserActiveLog userActiveLog = new UserActiveLog();
                userActiveLog.setChannel(acceptData.getChannel());
                userActiveLog.setIp(requst.getRemoteHost());
                userActiveLog.setUid(find.getId());
                userActiveLog.setVersionCode(acceptData.getVersion());
                userActiveLog.setOsVersion(acceptData.getOsVersion());
                userActiveLog.setDeviceType(acceptData.getDeviceType());
                userActiveLog.setDevice(acceptData.getDevice());
                userActiveLogService.addUserActiveLog(userActiveLog);
                outUserInfo(acceptData, out, remotIP, find, acceptData.getDevice());
                return;
            } else {
                out.print(JsonUtil.loadFalseResult("不存在该账户!"));
                return;
            }
        }
        // 不是用ID的登陆的事就多了
        BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                acceptData.getPackages(), acceptData.getSystem());
        if (system == null) {
            out.print(JsonUtil.loadFalseResult("系统不存在"));
            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
            WXAccountInfoDTO account = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
            WeiXinUser weiXinUser = MyWXLoginUtil.getWeiXinUserWithSavePortrait(code, account.getAppId(),
                    account.getAppSecret());
            if (loginType == Constant.WEIXIN && StringUtil.isNullOrEmpty(form.getWxUnionId())) {
                // wxParam = WXinUtil.getWxParam(code);
                if (weiXinUser == null) {
                    out.print(JsonUtil.loadFalseResult("登录失败"));
                    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("登录失败"));
                return;
            }
            // 获取用户信息
            UserInfo user = userInfoService.getUserByLoginTypeAndOpenId(loginType, openid, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            // 判断获取的用户信息是否为空,如果不为空就做的事就又多了
            if (user != null) {// 数据库中已经存在该用户
                outUserInfo(acceptData, 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()),
                                FilePathEnum.userPortrait.getPath() + 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());
            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, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            }
            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("登录失败"));
            }
            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())
             */) {
                WXAccountInfoDTO account = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
                WeiXinUser xinUser = MyWXLoginUtil.getWeiXinUserWithSavePortrait(code, account.getAppId(),
                        account.getAppSecret());
                if (xinUser == null) {
                    out.print(JsonUtil.loadFalseResult("登录失败"));
                    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()),
                                FilePathEnum.userPortrait + UUID.randomUUID().toString())
                        .getUrl();
                form.setWxPic(wxHeadImg);
            } else if (formLoginType == Constant.TAOBAO) {
                form.setTbName(form.getNickName());
                form.setTbPic(form.getPortrait());
            }
            requst.getSession().setAttribute("mainUser", form);
            String openid = formLoginType == 1 ? form.getOpenid() : form.getWxUnionId();
            // 获取主账户用户信息
            UserInfo find = userInfoService.getUserByLoginTypeAndOpenId(formLoginType, openid, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            if (find != null) {
                // 主账户不为空就进行绑定操作
                bind(find, newUser);
                userInfoService.update(find);
                outUserInfo(acceptData, 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, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            outUserInfo(acceptData, out, remotIP, mainUser, acceptData.getDevice());
            requst.getSession().removeAttribute("newUser");
            requst.getSession().removeAttribute("mainUser");
        }
    }
    /**
     * 淘特价登录
     *
     * @param acceptData
     * @param form
     * @param code
     * @param create
     * @param first
     * @param requst
     * @param out
     */
    @RequestMapping(value = "getuserinfo_ttj", method = RequestMethod.POST)
    public void getUserInfoTTJ(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(acceptData, out, remotIP, find, acceptData.getDevice());
                return;
            } else {
                out.print(JsonUtil.loadFalseResult("不存在该账户!"));
                return;
            }
        }
        // 不是用ID的登陆的事就多了
        BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                acceptData.getPackages(), acceptData.getSystem());
        if (system == null) {
            out.print(JsonUtil.loadFalseResult("系统不存在"));
            return;
        }
        String appid = system.getAppid();
        UserInfo user = userInfoService.getUserByLoginTypeAndOpenId(1, form.getOpenid(), SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
        if (user == null) {
            // 创建用户
            userInfoService.addUser(form, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            user = userInfoService.getUserByLoginTypeAndOpenId(1, form.getOpenid(), SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
        }
        // 返回用户信息
        outUserInfo(acceptData, out, remotIP, user, acceptData.getDevice());
    }
    /**
     * 将副账户绑定到主账户上
     *
     * @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(AcceptData acceptData, PrintWriter out, String remotIP, UserInfo user, String device) {
        user.setTotalHongBao(new BigDecimal(0));
        BigDecimal unOpenmoney = new BigDecimal(0);
        BigDecimal canOpenMoney = new BigDecimal(0);
        user.setNoOpenHongBao(unOpenmoney);
        user.setCanOpenHongBao(canOpenMoney);
        /**
         * 查询改用户返利红包
         */
        BigDecimal fanliHB = user.getTotalHongBao();
        user.setTotalHongBao(fanliHB);
        UserInfo filterForClientUser = UserUtil.filterForClientUser(user);
        // 1.5.0 版本之后返回新的等级
        String version = acceptData.getVersion();
        if (version != null && version.trim().length() > 0) {
            int versionCode = Integer.parseInt(version);
            String platform = acceptData.getPlatform();
            AppVersionInfo versionInfo = appVersionService.getByPlatformAndVersion(platform, "1.5.0", acceptData.getSystem());
            if (versionInfo != null) {
                int versionCode150 = versionInfo.getVersionCode();
                if (versionCode >= versionCode150) {
                    UserInfoExtraVO userInfoExtra = userInfoExtraService.getInfoExtraVOByUid(user.getId());
                    if (userInfoExtra != null && userInfoExtra.getUserRank() != null) {
                        String picture = userInfoExtra.getUserRank().getPicture();
                        String icon = userInfoExtra.getUserRank().getIcon();
                        filterForClientUser.setRankNamePicture(picture);
                        filterForClientUser.setRankIcon(icon);
                    }
                }
            }
        }
        GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
        JSONObject data = new JSONObject();
        data.put("user",
                JsonUtil.getConvertBigDecimalToStringBuilder(gsonBuilder).create().toJson(filterForClientUser));
        data.put("first", 0);
        int spreadImgCount = spreadUserImgService.countUserSpreadImg(user.getId());
        long shareCount = userShareGoodsRecordService.countShareRecordByUid(user.getId());
        int showTiCheng = 1; // 不显示
        if ("ios".equalsIgnoreCase(acceptData.getPlatform())
                && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()), acceptData.getSystem()))
            data.put("showTiCheng", false);
        else {
            data.put("showTiCheng", spreadImgCount + shareCount > 0);
            if (spreadImgCount + shareCount > 0) {
                showTiCheng = 0;
            }
        }
        if ("ios".equalsIgnoreCase(acceptData.getPlatform())
                && configService.iosOnLining(Integer.parseInt(acceptData.getVersion()), acceptData.getSystem()))
            data.put("inviteList", String.format("http://%s/%s/client/share/friends_new_online.html",
                    Constant.systemCommonConfig.getProjectHost(), Constant.systemCommonConfig.getProjectName()));
        else
            data.put("inviteList", configService.getValue(ConfigKeyEnum.teamList.getKey(), acceptData.getSystem()));
        // 界面状态
        UserSettingsVO mySettings = null;
        try {
            mySettings = userCustomSettingsService.getMySettings(user.getId());
        } catch (UserCustomSettingsException e) {
            mySettings = new UserSettingsVO();
            e.printStackTrace();
        }
        if (mySettings.getCancelNotice() == null) {
            mySettings.setCancelNotice(0);
        }
        if (mySettings.getNoBonusCount() == null) {
            mySettings.setNoBonusCount(showTiCheng); // 根据showTiCheng来判断
        }
        if (mySettings.getNoNewsRedDot() == null) {
            mySettings.setNoNewsRedDot(0);
        }
        if (mySettings.getNoShareRecordAndStorage() == null) {
            mySettings.setNoShareRecordAndStorage(showTiCheng); // 根据showTiCheng来判断
        }
        if (mySettings.getNoInvitationBonus() == null) {
            mySettings.setNoInvitationBonus(0);
        }
        if (mySettings.getOpenSpreadHongBao() == null) {
            mySettings.setOpenSpreadHongBao(0);
        }
        data.put("moduleState", mySettings);
        int welfareCenterNews = 0;
        String invitCode = null;
        UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(user.getId());
        if (userInfoExtra != null) {
            if (userInfoExtra.getCouponNews() != null) {
                welfareCenterNews = userInfoExtra.getCouponNews();
            }
            if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCodeVip())) {
                invitCode = userInfoExtra.getInviteCodeVip();
            } else {
                invitCode = userInfoExtra.getInviteCode();
            }
        }
        // 邀请码
        data.put("invitCode", invitCode);
        // 福利中心消息
        data.put("welfareCenterNews", welfareCenterNews);
        out.print(JsonUtil.loadTrueResult(data));
        final UserInfo uuser = user;
        ThreadUtil.run(new Runnable() {
            public void run() {
                // 获取邀请码:若无邀请码且存在有效的队员关系 则自动生成邀请码
                userInfoExtraService.getInviteCodeByUid(uuser.getId());
                LogHelper.userInfo(GsonUtil.toJsonExpose(uuser));
                uuser.setLastLoginIp(remotIP);
                uuser.setLastLoginTime(java.lang.System.currentTimeMillis());
                userInfoService.updateLoginInfo(uuser);
                // 用户等级更新
                try {
                    userInfoExtraService.updateUserRankByUid(uuser.getId());
                } catch (UserInfoExtraException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    @RequestMapping("bindUserInfo")
    public void bindUserInfo(AcceptData acceptData, UserInfo form, String code, PrintWriter out) {
        UserInfo find = userInfoService.getUserById(form.getId());
        if (find == null) {
            out.print(JsonUtil.loadFalseResult("绑定失败,不存在该用户!"));
            return;
        }
        int loginType = form.getLoginType();
        if (loginType == Constant.WEIXIN) {
            WXAccountInfoDTO account = Constant.getWXAccount(acceptData.getPlatform(), acceptData.getVersion());
            WeiXinUser weiXinUser = MyWXLoginUtil.getWeiXinUserWithSavePortrait(code, account.getAppId(),
                    account.getAppSecret());
            if (weiXinUser == null) {
                out.print(JsonUtil.loadFalseResult("绑定失败,用户异常请重试!"));
                return;
            }
            LogHelper.test(
                    String.format("绑定微信:头像为  %s \n 昵称为 %s", weiXinUser.getHeadimgurl(), weiXinUser.getNickname()));
            String wxUnionId = weiXinUser.getUnionid();
            UserInfo userInfo = userInfoService.getUserByLoginTypeAndOpenId(loginType, wxUnionId, SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            if (userInfo != null) {
                out.print(JsonUtil.loadFalseResult("绑定失败,该微信账户已存在!"));
                return;
            }
            find.setWxName(weiXinUser.getNickname());
            find.setWxOpenId(weiXinUser.getOpenid());
            find.setWxUnionId(weiXinUser.getUnionid());
            String wxHeadImg = COSManager.getInstance()
                    .uploadFile(HttpUtil.getAsInputStream(weiXinUser.getHeadimgurl()),
                            FilePathEnum.userPortrait.getPath() + UUID.randomUUID().toString())
                    .getUrl();
            find.setWxPic(wxHeadImg);
        } else { // 绑定淘宝
            LogHelper.test(String.format("绑定淘宝:头像为  %s \n 昵称为 %s", form.getPortrait(), form.getTbName()));
            UserInfo userInfo = userInfoService.getUserByLoginTypeAndOpenId(loginType, form.getOpenid(),
                    SystemInfoUtil.getSystem(acceptData.getPlatform(), acceptData.getPackages()));
            if (userInfo != null) {
                out.print(JsonUtil.loadFalseResult("绑定失败,该淘宝账户已存在!"));
                return;
            }
            find.setOpenid(form.getOpenid());
            find.setTbName(form.getTbName());
            find.setTbPic(form.getPortrait());
        }
        userInfoService.update(find);
        out.print(JsonUtil.loadTrueResult(GsonUtil.toJsonExpose(UserUtil.filterForClientUser(find))));
    }
    /**
     * @param data
     * @param uid  用户ID
     * @param type 需要解绑的账户类型
     */
    @RequestMapping("unBindUserInfo")
    public void unBindUserInfo(AcceptData data, long uid, int type, PrintWriter out) {
        UserInfo find = userInfoService.getUserById(uid);
        if (find == null) {
            out.print(JsonUtil.loadFalseResult("不存在该用户!"));
            return;
        }
        String openid = find.getOpenid();
        String wxUnionId = find.getWxUnionId();
        if (Constant.TAOBAO == type) {
            if (StringUtil.isNullOrEmpty(openid)) {
                out.print(JsonUtil.loadFalseResult("当前用户未绑定该类型账户!"));
                return;
            }
        } else if (Constant.WEIXIN == type) {
            if (StringUtil.isNullOrEmpty(wxUnionId)) {
                out.print(JsonUtil.loadFalseResult("当前用户未绑定该类型账户!"));
                return;
            }
        }
        int count = 0;
        if (StringUtil.isNullOrEmpty(openid)) {
            count++;
        }
        if (StringUtil.isNullOrEmpty(wxUnionId)) {
            count++;
        }
        if (count == 1) {
            out.print(JsonUtil.loadFalseResult("当前只绑定了一个账户,不能解绑!"));
            return;
        }
        userInfoService.unBindUserInfo(find, type);
        out.print(JsonUtil.loadTrueResult("解绑成功"));
    }
    /**
     * 获取用户提现账号
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getuseraccount", method = RequestMethod.POST)
    public void getUserAccount(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "请登录"));
            return;
        }
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        List<BindingAccount> bindingAccountList = bindingAccountService.getBindingAccountByUid(uid);
        JSONObject data = new JSONObject();
        data.put("user", user);
        Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().create();
        data.put("error", "0");
        data.put("maxError", 1);
        String minMoney = configService.getValue(EXTRACT_MIN_MONEY, acceptData.getSystem()); // 单笔提现的最小金额
        String maxMoney = configService.getValue(EXTRACT_MAX_MONEY, acceptData.getSystem()); // 单笔提现的最小金额
        String maxDayMoney = configService.getValue(ConfigKeyEnum.extractMoneyDay.getKey(), acceptData.getSystem()); // 每日最大提现金额
        int maxDayCount = Integer.parseInt(configService.getValue(ConfigKeyEnum.extractDayCount.getKey(), acceptData.getSystem()));
        ExtractRecord extractRecord = extractRecordService.getExtractRecordByUid(uid);
        boolean canExtract = true;
        String errorMsg = "";
        if (extractRecord != null && extractRecord.getCount() >= maxDayCount) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s次", maxDayCount + "");
        } else if (extractRecord != null
                && extractRecord.getMoney().add(new BigDecimal(minMoney)).compareTo(new BigDecimal(maxDayMoney)) > 0) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s元", maxDayMoney);
        }
        data.put("canExtract", canExtract);
        data.put("extractErrorMsg", errorMsg);
        data.put("minMoney", minMoney);// 单笔最低
        data.put("maxMoney", maxMoney);// 单笔最高
        data.put("maxDayCount", maxDayCount);
        data.put("bindingAccountList", gson.toJson(filterBindingAccount(bindingAccountList)));
        JSONObject alipayVerify = new JSONObject();
        try {
            bindingAccountService.canVerifyAlipayAccount(uid);
            alipayVerify.put("state", 0);
            alipayVerify.put("msg", "可绑定");
        } catch (BindingAccountException e) {
            alipayVerify.put("state", e.getCode());
            alipayVerify.put("msg", e.getMsg());
        }
        data.put("alipayBindState", alipayVerify);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 是否能够提现
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "canextract", method = RequestMethod.POST)
    public void canExtract(AcceptData acceptData, Long uid, BigDecimal money, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "请登录"));
            return;
        }
        if (money == null) {
            out.print(JsonUtil.loadFalseResult(1, "请上传金额"));
            return;
        }
        UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        String minMoney = configService.getValue(EXTRACT_MIN_MONEY, acceptData.getSystem()); // 单笔提现的最小金额
        String maxDayMoney = configService.getValue(ConfigKeyEnum.extractMoneyDay.getKey(), acceptData.getSystem()); // 每日最大提现金额
        int maxDayCount = Integer.parseInt(configService.getValue(ConfigKeyEnum.extractDayCount.getKey(), acceptData.getSystem()));
        ExtractRecord extractRecord = extractRecordService.getExtractRecordByUid(uid);
        boolean canExtract = true;
        String errorMsg = "";
        if (extractRecord != null && extractRecord.getCount() + 1 > maxDayCount) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s次", maxDayCount + "");
        } else if (extractRecord != null
                && extractRecord.getMoney().add(money).compareTo(new BigDecimal(maxDayMoney)) > 0) {
            canExtract = false;
            errorMsg = String.format("每日最多提现%s元", maxDayMoney);
        } else if (new BigDecimal(minMoney).compareTo(money) > 0) {
            canExtract = false;
            errorMsg = String.format("每次最低提现%s元", minMoney);
        }
        if (canExtract) {
            out.print(JsonUtil.loadTrueResult(""));
        } else {
            out.print(JsonUtil.loadFalseResult(errorMsg));
        }
    }
    @RequestMapping(value = "getalipayaccount", method = RequestMethod.POST)
    public void getAlipayAccount(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "请登录"));
            return;
        }
        List<BindingAccount> bindingAccountList = bindingAccountService.getBindingAccountByUid(uid);
        if (bindingAccountList == null || bindingAccountList.size() == 0) {
            out.print(JsonUtil.loadFalseResult(2, "尚未绑定支付宝"));
            return;
        }
        out.print(JsonUtil.loadTrueResult(JsonUtil.getSimpleGsonWithDate().toJson(bindingAccountList.get(0))));
    }
    public static List<BindingAccount> filterBindingAccount(List<BindingAccount> bindingAccountList) {
        List<BindingAccount> accountList = new ArrayList<>();
        if (bindingAccountList != null)
            for (BindingAccount bindingAccount : bindingAccountList) {
                BindingAccount dest = new BindingAccount();
                try {
                    PropertyUtils.copyProperties(dest, bindingAccount);
                    if (!StringUtil.isNullOrEmpty(dest.getAccount()) && !StringUtil.isNullOrEmpty(dest.getName())) {
                        String name = "";
                        if ((dest.getName() + "").length() > 2)
                            for (int i = 0; i < (dest.getName() + "").length(); i++) {
                                if (i == 0)
                                    name += dest.getName().charAt(i);
                                else
                                    name += "*";
                            }
                        else
                            name = dest.getName().charAt(0) + "*";
                        dest.setName(name);
                        String account = "";
                        if (dest.getAccount().indexOf("@") > -1) {// 邮箱
                            int index = dest.getAccount().indexOf("@");
                            for (int i = 0; i < dest.getAccount().length(); i++) {
                                if (i < 3 || i >= index)
                                    account += dest.getAccount().charAt(i);
                                else
                                    account += "*";
                            }
                        } else if (StringUtil.isMobile(dest.getAccount())) {// 电话
                            account = dest.getAccount().substring(0, 3) + "*****" + dest.getAccount()
                                    .substring(dest.getAccount().length() - 2, dest.getAccount().length());
                        } else {// 其他
                            if (dest.getAccount().length() >= 6) {
                                for (int i = 0; i < dest.getAccount().length(); i++) {
                                    if (i < 3 || i >= dest.getAccount().length() - 2)
                                        account += dest.getAccount().charAt(i);
                                    else
                                        account += "*";
                                }
                            } else {
                                for (int i = 0; i < dest.getAccount().length(); i++) {
                                    if (i < 1 || i >= dest.getAccount().length() - 1)
                                        account += dest.getAccount().charAt(i);
                                    else
                                        account += "*";
                                }
                            }
                        }
                        dest.setAccount(account);
                    }
                    accountList.add(dest);
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                }
            }
        return accountList;
    }
    public static BindingAccount filterBindingAccount(BindingAccount bindingAccount) {
        BindingAccount dest = new BindingAccount();
        try {
            PropertyUtils.copyProperties(dest, bindingAccount);
            if (!StringUtil.isNullOrEmpty(dest.getAccount()) && !StringUtil.isNullOrEmpty(dest.getName())) {
                String name = "";
                if ((dest.getName() + "").length() > 2)
                    for (int i = 0; i < (dest.getName() + "").length(); i++) {
                        if (i == 0)
                            name += dest.getName().charAt(i);
                        else
                            name += "*";
                    }
                else
                    name = dest.getName().charAt(0) + "*";
                dest.setName(name);
                String account = "";
                if (dest.getAccount().indexOf("@") > -1) {// 邮箱
                    int index = dest.getAccount().indexOf("@");
                    for (int i = 0; i < dest.getAccount().length(); i++) {
                        if (i < 3 || i >= index)
                            account += dest.getAccount().charAt(i);
                        else
                            account += "*";
                    }
                } else if (StringUtil.isMobile(dest.getAccount())) {// 电话
                    account = dest.getAccount().substring(0, 3) + "*****"
                            + dest.getAccount().substring(dest.getAccount().length() - 2, dest.getAccount().length());
                } else {// 其他
                    if (dest.getAccount().length() >= 6) {
                        for (int i = 0; i < dest.getAccount().length(); i++) {
                            if (i < 3 || i >= dest.getAccount().length() - 2)
                                account += dest.getAccount().charAt(i);
                            else
                                account += "*";
                        }
                    } else {
                        for (int i = 0; i < dest.getAccount().length(); i++) {
                            if (i < 1 || i >= dest.getAccount().length() - 1)
                                account += dest.getAccount().charAt(i);
                            else
                                account += "*";
                        }
                    }
                }
                dest.setAccount(account);
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return dest;
    }
    /**
     * 添加用户提现账号
     *
     * @param acceptData
     * @param uid        用户id
     * @param account    账号
     * @param name       真实名字
     * @param type       账号类型:1.支付宝 2.微信
     * @param out
     */
    @RequestMapping(value = "addbindingaccount", method = RequestMethod.POST)
    public void addBindingAccount(AcceptData acceptData, long uid, String account, String name, int type,
                                  PrintWriter out) {
        if (Constant.ZHIFUBAO != type && Constant.WEIXIN != type) {
            out.print(JsonUtil.loadFalseResult(Constant.NOTYPE));
            return;
        }
        UserInfo user = userInfoService.getUserById(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        BindingAccount addAccount = new BindingAccount();
        addAccount.setAccount(account);
        addAccount.setType(type);
        addAccount.setUserInfo(user);
        addAccount.setName(name);
        try {
            bindingAccountService.addBindingAccount(addAccount);
        } catch (BindingAccountException e) {
            out.print(JsonUtil.loadFalseResult(e.getMessage()));
            return;
        }
        out.print(JsonUtil.loadTrueResult(Constant.BA_SUCCESS));
        return;
    }
    /**
     * 删除用户提现账号
     *
     * @param acceptData
     * @param uid        用户id
     * @param type       账号类型
     * @param out
     */
    @RequestMapping(value = "deletebindingaccount", method = RequestMethod.POST)
    public void deleteBindingAccount(AcceptData acceptData, long uid, int type, PrintWriter out) {
        if (type != Constant.ZHIFUBAO && type != Constant.WEIXIN) {
            out.print(JsonUtil.loadFalseResult(Constant.NOTYPE));
            return;
        }
        UserInfo user = userInfoService.getUserById(uid);
        if (user == null) {
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        BindingAccount account = new BindingAccount();
        account.setType(type);
        account.setUserInfo(user);
        Integer deletecount = bindingAccountService.deleteBindingAccount(account);
        JSONObject data = new JSONObject();
        data.put("count", deletecount);
        out.print(JsonUtil.loadTrueResult(data));
        return;
    }
    /**
     * 新版提现
     *
     * @param acceptData
     * @param uid
     * @param money
     * @param vcode      手机验证码
     * @param request
     * @param type
     * @param out
     */
    @RequestSerializableByKey(key = "#uid")
    @RequestMapping(value = "extractmoneynew", method = RequestMethod.POST)
    public void extractMoneyNew(AcceptData acceptData, long uid, BigDecimal money, String vcode,
                                HttpServletRequest request, int type, PrintWriter out) {
        UserInfo user = userInfoService.getUserById(uid);
        if (user == null) {
            user = userInfoService.getUserByIdWithMybatis(uid);
            if (user != null && user.getState() != UserInfo.STATE_NORMAL) {
                out.print(JsonUtil.loadFalseResult(Constant.CODE_FORBIDDEN_USER, Constant.FORBIDDEN_USER_REASON_DESC));
                return;
            }
            out.print(JsonUtil.loadFalseResult("用户不存在"));
            return;
        }
        if (money == null) {
            out.print(JsonUtil.loadFalseResult(1, "请上传提现金额"));
            return;
        }
        if (!Constant.IS_TEST) {
            // 判断手机验证码的正确性
            String oldCode = redisManager.getSMSVCode(user.getPhone(), SMSHistory.TYPE_LOGIN);
            if (StringUtil.isNullOrEmpty(oldCode) || !oldCode.equalsIgnoreCase(vcode)) {
                out.print(JsonUtil.loadFalseResult(90001, "验证码错误"));
                return;
            }
        }
        BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                acceptData.getPackages(), acceptData.getSystem());
        if (system == null) {
            LogHelper.userInfo("提现时,不存在该系统");
            out.print(JsonUtil.loadFalseResult("系统不存在"));
            return;
        }
        String minMoney = configService.getValue(EXTRACT_MIN_MONEY, acceptData.getSystem()); // 单笔提现最小金额
        if (money.compareTo(new BigDecimal("0.1")) < 0) { // 转帐到支付宝的最小金额
            out.print(JsonUtil.loadFalseResult("单笔提现金额需要大于:" + 0.1 + "元"));
            return;
        }
        if (money.compareTo(new BigDecimal(minMoney)) < 0) { // 后台设置的单笔转账的最小金额
            out.print(JsonUtil.loadFalseResult("单笔提现金额需要大于:" + minMoney + "元"));
            return;
        }
        String maxMoney = configService.getValue(EXTRACT_MAX_MONEY, acceptData.getSystem()); // 单笔提现最大金额
        if (new BigDecimal(maxMoney).compareTo(money) < 0) { // 后台设置的单笔转账的最大金额
            out.print(JsonUtil.loadFalseResult("单笔提现金额多为:" + maxMoney + "元"));
            return;
        }
        if (type != Constant.ZHIFUBAO && type != Constant.WEIXIN) { // 提现类型必须是支付宝类型或者微信类型,目前(20170506)仅支持支付宝
            out.print(JsonUtil.loadFalseResult(Constant.NOTYPE));
            return;
        }
        BindingAccount bindingAccount = bindingAccountService.getBindingAccountByUidAndType(uid, type);
        if (bindingAccount == null) {
            out.print(JsonUtil.loadFalseResult(Constant.NOACCOUNT));
            return;
        }
        Extract extract = new Extract();
        extract.setIp(IPUtil.getRemotIP(request));
        extract.setAccount(bindingAccount.getAccount());
        extract.setName(bindingAccount.getName());
        extract.setMoney(new BigDecimal(String.valueOf(money)));
        extract.setUserInfo(user);
        extract.setExtractTime(java.lang.System.currentTimeMillis());
        extract.setType(type);
        extract.setState(0);
        extract.setSystem(system);
        Integer etype = extractService.addExtract(extract);
        if (etype == null) {
            JSONObject data = new JSONObject();
            data.put("id", extract.getId());
            out.print(JsonUtil.loadTrueResult(data));
            ThreadUtil.run(new Runnable() {
                @Override
                public void run() {
                    JSONObject json = new JSONObject();
                    json.put("timeStamp", java.lang.System.currentTimeMillis());
                    json.put("adminId", 4L);
                    String sign = AESUtil.encrypt(json.toString(), Constant.ADMINH5_AESKEY);
                    String url = "";
                    try {
                        url = String.format("%s?from=emailh5&sign=%s",
                                Constant.systemCommonConfig.getExtractNotifyUrl(), URLEncoder.encode(sign, "UTF-8"));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                    long[] targetUids = new long[]{3L, 4L, 5L};
                    Config config = configService.getConfig(ConfigKeyEnum.extractCodeEmailFrom.getKey(), acceptData.getSystem());
                    String[] sts = config.getValue().split(",");
                    String account = sts[0];
                    String pwd = sts[1];
                    for (long adminId : targetUids) {
                        AdminUser adminUser = adminUserService.selectByPrimaryKey(adminId);
                        String msg = "提现审核链接:" + url;
                        boolean isS = MailSenderUtil.sendEmail(adminUser.getEmail(), account, pwd, "有新的提现审核", msg);
                    }
                }
            });
            return;
        } else if (etype == 1) {
            out.print(JsonUtil.loadFalseResult("已超过当日提现次数"));
        } else if (etype == 2) {
            out.print(JsonUtil.loadFalseResult("已超过当日提现金额"));
        } else if (etype == 3) {
            out.print(JsonUtil.loadFalseResult("提现金额大于我的红包"));
        } else if (etype == 111) {
            out.print(JsonUtil.loadFalseResult("修改手机号后,7天内无法提现"));
        } else if (etype == 110) {
            out.print(JsonUtil.loadFalseResult("有售后订单尚未扣款"));
        }
    }
    /**
     * 获取提现进度
     *
     * @param acceptData
     * @param id
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getextractprocess", method = RequestMethod.POST)
    public void getExtractProcess(AcceptData acceptData, long id, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("请上传用户ID"));
            return;
        }
        Extract extract = extractService.getExtractById(id);
        if (extract == null) {
            out.print(JsonUtil.loadFalseResult("提现记录不存在"));
            return;
        }
        if (extract.getUserInfo().getId().longValue() != uid) {
            out.print(JsonUtil.loadFalseResult("不属于当前用户的提现记录"));
            return;
        }
        BindingAccount account = new BindingAccount();
        account.setAccount(extract.getAccount());
        account.setName(extract.getName());
        List<BindingAccount> bindingAccountList = new ArrayList<>();
        bindingAccountList.add(account);
        bindingAccountList = filterBindingAccount(bindingAccountList);
        JSONObject data = new JSONObject();
        data.put("id", extract.getId());
        data.put("money", "¥" + extract.getMoney().toString());
        data.put("account", bindingAccountList.get(0).getAccount());
        data.put("expireTime",
                TimeUtil.getGernalTime(extract.getExtractTime() + 1000 * 60 * 60 * 24L, "yyyy-MM-dd HH:mm"));// 24小时后到账
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findLostOrder")
    public void findLostOrder(AcceptData acceptData, LostOrder lostOrder, PrintWriter out) {
        boolean orderNum = true;
        if (!NumberUtil.isNumeric(lostOrder.getOrderId())) {
            orderNum = false;
        } else if (lostOrder.getOrderId().length() < 12 || lostOrder.getOrderId().length() > 20) {
            orderNum = false;
        } else
            orderNum = Utils.isOrderNum(lostOrder.getOrderId());
        int state;
        String stateInfo = "提交成功,请等待审核结果。";
        if (!orderNum) {
            state = -4;
            stateInfo = "请提交标准的订单号";
        } else {
            state = lostOrderService.addLostOrder(lostOrder);
            if (state == -3) {
                stateInfo = "该订单已是返利订单。";
            } else if (state == -2) {
                stateInfo = "请勿重复提交,该订单已在审核中。";
            } else if (state == -1) {
                stateInfo = "该订单申诉已通过,请稍后查看。";
            } else if (state == -5) {
                stateInfo = "该订单为分享奖金订单";
            } else if (state == -1001) {
                stateInfo = "该订单为违规订单";
            } else if (state == -1002) {
                stateInfo = "该订单已发起维权";
            }
        }
        JSONObject data = new JSONObject();
        data.put("state", state);
        data.put("info", stateInfo);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findOrderItemList")
    public void findOrderItemList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<HongBaoOrder> list = hongBaoOrderService.listFanLiOrder(uid, page, Constant.PAGE_SIZE);
        List<OrderItem> orderList = new ArrayList<>();
        for (HongBaoOrder oi : list) {
            OrderItem orderItem = OrderItemFactory.create(oi);
            orderItem.setDesc();
            orderItem.setPicture(TbImgUtil.getTBSize220Img(orderItem.getPicture()));
            orderList.add(orderItem);
        }
        long count = hongBaoOrderService.countFanLiOrder(uid);
        Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder())
                .excludeFieldsWithoutExposeAnnotation().create();
        JSONObject data = new JSONObject();
        data.put("list", gson.toJson(orderList));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    /**
     * 获取提成订单列表
     *
     * @param acceptData
     * @param uid
     * @param page
     * @param out
     */
    @RequestMapping("getTiChengOrderList")
    public void getTiChengOrderList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<HongBaoDTO> hongBaoDTOList = hongBaoV2Service.listJiangJinByUid(uid, page, Constant.PAGE_SIZE);
        List<HongBao> list = new ArrayList<>();
        if (hongBaoDTOList != null)
            for (HongBaoDTO dto : hongBaoDTOList) {
                list.add(HongBaoFactory.createHongBao(dto));
            }
        long count = hongBaoV2Service.countJiangJinByUid(uid);
        List<OrderItem> orderItemList = HongBaoUtil.convertToTiChengOrder(list);
        Gson gson = JsonUtil.getApiCommonGson();
        JSONObject data = new JSONObject();
        data.put("list", gson.toJson(orderItemList));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findAccountMessageList")
    public void findAccountMessageList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        accountMessageService.syncSystemZnx(uid);
        List<AccountMessage> list = accountMessageService.findAccountMessageList(uid, page);
        int count = accountMessageService.getCount(uid);
        JSONObject data = new JSONObject();
        data.put("list", GsonUtil.toJsonExpose(list));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("openAccountMessage")
    public void openAccountMessage(AcceptData acceptData, long id, PrintWriter out) {
        accountMessageService.open(id);
        out.print(JsonUtil.loadTrueResult("打开成功"));
    }
    @RequestMapping("findCanOpenMessage")
    public void findCanOpenMessage(AcceptData acceptData, long uid, PrintWriter out) {
        accountMessageService.syncSystemZnx(uid);
        // count>0 有消息
        int count = accountMessageService.getCanOpenCount(uid);
        out.print(JsonUtil.loadTrueResult(count));
        ThreadUtil.run(new Runnable() {
            @Override
            public void run() {
                // 用户等级更新
                try {
                    userInfoExtraService.updateUserRankByUid(uid);
                } catch (Exception e) {
                    LogHelper.errorDetailInfo(e);
                }
            }
        });
    }
    @RequestMapping("collectionGoods")
    public void collectionGoods(AcceptData acceptData, long uid, String auctionId, int type, PrintWriter out) {
        try {
            CollectionGoodsV2 find = collectionGoodsV2Service.findByUidAndAuctionId(uid, auctionId,
                    Constant.SOURCE_TYPE_TAOBAO);
            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, "商品已下架"));
                }
            } else {
                if (find == null) {
                    out.print(JsonUtil.loadTrueResult("取消收藏成功"));
                    return;
                } else {
                    collectionGoodsV2Service.cancelCollectionByAuctionId(uid, auctionId, Constant.SOURCE_TYPE_TAOBAO);
                    out.print(JsonUtil.loadTrueResult("取消收藏成功"));
                }
            }
        } catch (CollectionGoodsException e1) {
            out.print(JsonUtil.loadFalseResult(e1.getCode(), e1.getMsg()));
        }
    }
    /**
     * h5收藏
     *
     * @param callback
     * @param acceptData
     * @param uid
     * @param auctionId
     * @param out
     */
    @RequestMapping("collectionGoodsJp")
    public void collectionGoodsJp(String callback, AcceptData acceptData, Long uid, String auctionId, Integer goodsType,
                                  PrintWriter out) {
        if (uid == null || auctionId == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(""));
            return;
        }
        if (goodsType == null) {
            goodsType = Constant.SOURCE_TYPE_TAOBAO;
        }
        CollectionGoodsV2 find = collectionGoodsV2Service.findByUidAndAuctionId(uid, auctionId, goodsType);
        if (find == null) {
            if (goodsType == Constant.SOURCE_TYPE_JD) {
            } else if (goodsType == Constant.SOURCE_TYPE_PDD) {
            } else {
                try {
                    TaoBaoGoodsBrief taoBaoGoodsBrief = redisManager.getTaoBaoGoodsBrief(auctionId);
                    collectionGoodsV2Service.addCollection(uid, taoBaoGoodsBrief);
                    JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(1));
                } catch (TaobaoGoodsDownException e) {
                    JsonUtil.printMode(out, callback, (JsonUtil.loadFalseResult(1, "商品已下架")));
                } catch (CollectionGoodsException e1) {
                    JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e1.getCode(), e1.getMsg()));
                }
            }
        } else {
            // 取消收藏
            try {
                collectionGoodsV2Service.cancelCollectionByAuctionId(uid, auctionId, goodsType);
                JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("取消收藏成功"));
            } catch (CollectionGoodsException e) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
            }
        }
    }
    @RequestMapping("collectionGoodsList")
    public void collectionGoodsList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<CollectionGoodsV2> collectionGoodsList = collectionGoodsV2Service.getCollectionGoodsList(uid, page + 1,
                Constant.PAGE_SIZE, Constant.SOURCE_TYPE_TAOBAO, true);
        List<TaoBaoGoodsBriefExtra> list = new ArrayList<TaoBaoGoodsBriefExtra>();
        long count = collectionGoodsV2Service.getCollectionGoodsCount(uid, Constant.SOURCE_TYPE_TAOBAO, true);
        JSONObject data = new JSONObject();
        List<TaoBaoGoodsBrief> listTaoKeGoods = new ArrayList<TaoBaoGoodsBrief>();
        if (collectionGoodsList != null && collectionGoodsList.size() > 0) {
            BigDecimal proportion = hongBaoManageService.getFanLiRate(acceptData.getSystem());
            List<String> listGid = new ArrayList<>();
            for (CollectionGoodsV2 collectionGoodsV2 : collectionGoodsList) {
                CommonGoods commonGoods = collectionGoodsV2.getCommonGoods();
                if (commonGoods == null) {
                    continue;
                }
                listGid.add(commonGoods.getGoodsId());
            }
            try {
                // API网络接口验证是否在售
                listTaoKeGoods = TaoKeApiUtil.getBatchGoodsInfo(listGid);
            } catch (TaoKeApiException e) {
                e.printStackTrace();
            } catch (TaobaoGoodsDownException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            for (CollectionGoodsV2 collectionGoodsV2 : collectionGoodsList) {
                CommonGoods commonGoods = collectionGoodsV2.getCommonGoods();
                if (commonGoods == null) {
                    continue;
                }
                if (listTaoKeGoods != null && listTaoKeGoods.size() > 0) {
                    int state = 1; // 默认停售
                    String goodsId = commonGoods.getGoodsId();
                    for (TaoBaoGoodsBrief taoKeGoods : listTaoKeGoods) {
                        String auctionId = taoKeGoods.getAuctionId();
                        if (goodsId == auctionId || goodsId.equals(auctionId)) {
                            state = 0; // 在售
                            break;
                        }
                    }
                    commonGoods.setState(state);
                }
                TaoBaoGoodsBrief goodsBrief = TaoBaoUtil.convert(commonGoods);
                goodsBrief.setSalesCount(TaoBaoUtil.getSaleCount(goodsBrief.getBiz30day()));
                TaoBaoGoodsBriefExtra taoBaoGoodsBriefExtra = TaoBaoUtil.getTaoBaoGoodsBriefExtra(goodsBrief,
                        proportion.toString(), "");
                taoBaoGoodsBriefExtra.setCreatetime(collectionGoodsV2.getCreateTime());
                list.add(taoBaoGoodsBriefExtra);
            }
        }
        GsonBuilder builder = new GsonBuilder().registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
            @Override
            public JsonElement serialize(Date value, Type theType, JsonSerializationContext context) {
                if (value == null) {
                    return new JsonPrimitive("");
                } else {
                    return new JsonPrimitive(value.getTime() + "");
                }
            }
        });
        Gson gson = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(builder).excludeFieldsWithoutExposeAnnotation()
                .create();
        data.put("list", gson.toJson(list));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("deleteCollectionGoods")
    public void deleteCollectionGoods(AcceptData acceptData, String ids, Integer type, long uid, Integer goodsType,
                                      PrintWriter out) {
        if (type != null && type == 1) {
            clearConllectionGoods(acceptData, uid, out);
        } else {
            if (!StringUtil.isNullOrEmpty(ids)) {
                Arrays.asList(ids.split(",")).parallelStream().forEach(auctionIdStr -> {
                    try {
                        collectionGoodsV2Service.cancelCollectionByAuctionId(uid, (auctionIdStr),
                                goodsType);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                });
            }
        }
        out.print(JsonUtil.loadTrueResult("删除成功"));
    }
    @RequestMapping("clearConllectionGoods")
    public void clearConllectionGoods(AcceptData acceptData, long uid, PrintWriter out) {
        try {
            collectionGoodsV2Service.cancelCollectionByUid(uid);
        } catch (CollectionGoodsException e) {
            e.printStackTrace();
            out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMessage()));
        }
        out.print(JsonUtil.loadTrueResult("删除成功"));
    }
    @RequestMapping("ruleMessage")
    public void ruleMessage(AcceptData acceptData, PrintWriter out) {
        JSONObject data = new JSONObject();
        data.put("rank3", String.format("成功邀请50个好友完成注册安装%sAPP(包括一度好友和二度好友之和)",
                Constant.systemCommonConfig.getProjectChineseName()));
        data.put("rank2", String.format("成功邀请5个好友完成注册安装%sAPP(包括一度好友和二度好友之和)",
                Constant.systemCommonConfig.getProjectChineseName()));
        data.put("rank1", String.format("成功邀请1个好友完成注册安装%sAPP(包括一度好友和二度好友之和)",
                Constant.systemCommonConfig.getProjectChineseName()));
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findAccountDetailsList")
    public void findAccountDetailsList(AcceptData acceptData, long uid, int page, PrintWriter out) {
        List<UserMoneyDetail> detailList = userMoneyDetailService.listByUidWithState(uid, page, Constant.PAGE_SIZE);
        List<AccountDetails> list = new ArrayList<>();
        for (UserMoneyDetail detail : detailList)
            list.add(AccountDetailsFactory.create(detail));
        long count = userMoneyDetailService.countByUidWithState(uid);
        JSONObject data = new JSONObject();
        data.put("list", GsonUtil.toJsonExpose(list));
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    @RequestMapping("findAccountDetailsListV2")
    public void findAccountDetailsListNew(AcceptData acceptData, Long uid, int page, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult(1, "UID为空"));
            return;
        }
        List<UserMoneyDetail> detailList = userMoneyDetailService.listByUidWithState(uid, page, Constant.PAGE_SIZE);
        List<AccountDetails> list = new ArrayList<>();
        for (UserMoneyDetail detail : detailList)
            list.add(AccountDetailsFactory.create(detail));
        long count = userMoneyDetailService.countByUidWithState(uid);
        JSONObject data = new JSONObject();
        JSONArray array = new JSONArray();
        for (AccountDetails ad : list) {
            JSONObject item = JSONObject.fromObject(GsonUtil.toJsonExpose(ad));
            if (ad.getState() != null && ad.getState() != -1)
                item.put("stateIcon",
                        "http://hcj-1255749512.file.myqcloud.com/resource/app/extract_state_" + ad.getState() + ".png");
            array.add(item);
        }
        data.put("list", array);
        data.put("count", count);
        out.print(JsonUtil.loadTrueResult(data));
    }
    // 获取商品分享链接
    @RequestMapping(value = "getGoodsShareUrl")
    public void getGoodsShareUrl(AcceptData acceptData, long id, PrintWriter out) {
        out.print(JsonUtil
                .loadTrueResult(String.format("%s?id=" + id, Constant.systemCommonConfig.getAppShareInfoUrl())));
    }
    /**
     * 用户队员列表查询 1.4.1
     *
     * @param acceptData
     * @param page
     * @param uid
     * @param type
     * @param out
     */
    @RequestMapping(value = "getMyTeam", method = RequestMethod.POST)
    public void getMyTeam(AcceptData acceptData, long page, long uid, long type, PrintWriter out) {
        try {
            int pageSize = Constant.PAGE_SIZE;
            JSONObject resultData = new JSONObject();
            if (type == 1) {
                resultData = threeSaleSerivce.getMyFirstTeam((page - 1) * pageSize, pageSize, uid);
            } else if (type == 2) {
                resultData = threeSaleSerivce.getMySecondTeam((page - 1) * pageSize, pageSize, uid);
            }
            // 安卓系统返回所有数据
            String platform = acceptData.getPlatform();
            if ("android".equalsIgnoreCase(platform)) {
                long firstTeam = threeSaleSerivce.countFirstTeam(uid);
                long secondTeam = threeSaleSerivce.countSecondTeam(uid);
                JSONObject bossData = null;
                ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
                if (threeSale != null) {
                    bossData = new JSONObject();
                    UserInfo boss = threeSale.getBoss();
                    if (boss != null) {
                        bossData.put("nickName", boss.getNickName());
                        bossData.put("portrait", boss.getPortrait());
                    }
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
                    Long createTime = threeSale.getCreateTime();
                    Date inviteTime = new Date(createTime);
                    bossData.put("inviteTime", "邀请时间: " + sdf.format(inviteTime));
                }
                String helpLink = configService.getValue(ConfigKeyEnum.teamHelpUrl.getKey(), acceptData.getSystem());
                if (helpLink == null) {
                    helpLink = "";
                }
                boolean hasCode = false;
                String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
                if (inviteCode != null && inviteCode.trim().length() > 0) {
                    hasCode = true; // 已有邀请码
                } else {
                    // 邀请激活链接
                    resultData.put("activationlink", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(), acceptData.getSystem()));
                }
                resultData.put("hasCode", hasCode);
                resultData.put("helpLink", helpLink);
                resultData.put("firstTeam", firstTeam);
                resultData.put("firstTeamTotal", firstTeam);
                resultData.put("secondTeam", secondTeam);
                resultData.put("secondTeamTotal", secondTeam);
                resultData.put("boss", bossData);
            }
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("统计失败"));
            e.printStackTrace();
        }
    }
    /**
     * 用户队员列表查询 1.5.3查询有效队员
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "getMyTeamNew", method = RequestMethod.POST)
    public void getMyTeamNew(AcceptData acceptData, long page, long uid, long type, PrintWriter out) {
        try {
            int pageSize = Constant.PAGE_SIZE;
            JSONObject resultData = new JSONObject();
            if (type == 1) {
                resultData = threeSaleSerivce.getMyFirstTeam((page - 1) * pageSize, pageSize, uid);
            } else if (type == 2) {
                resultData = threeSaleSerivce.getMySecondTeam((page - 1) * pageSize, pageSize, uid);
            }
            // 安卓系统返回所有数据
            String platform = acceptData.getPlatform();
            if ("android".equalsIgnoreCase(platform)) {
                long firstTeam = threeSaleSerivce.countFirstTeam(uid);
                long secondTeam = threeSaleSerivce.countSecondTeam(uid);
                JSONObject bossData = null;
                ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
                if (threeSale != null) {
                    bossData = new JSONObject();
                    UserInfo boss = threeSale.getBoss();
                    if (boss != null) {
                        bossData.put("nickName", boss.getNickName());
                        bossData.put("portrait", boss.getPortrait());
                    }
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
                    Long createTime = threeSale.getCreateTime();
                    Date inviteTime = new Date(createTime);
                    bossData.put("inviteTime", "邀请时间: " + sdf.format(inviteTime));
                }
                String helpLink = configService.getValue(ConfigKeyEnum.teamHelpUrl.getKey(), acceptData.getSystem());
                if (helpLink == null) {
                    helpLink = "";
                }
                boolean hasCode = false;
                String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
                if (inviteCode != null && inviteCode.trim().length() > 0) {
                    hasCode = true; // 已有邀请码
                } else {
                    // 邀请激活链接
                    resultData.put("activationlink", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(), acceptData.getSystem()));
                }
                resultData.put("hasCode", hasCode);
                resultData.put("helpLink", helpLink);
                resultData.put("firstTeam", firstTeam);
                resultData.put("secondTeam", secondTeam);
                resultData.put("boss", bossData);
            }
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("统计失败"));
            e.printStackTrace();
        }
    }
    /**
     * 用户队员统计 1.4.1
     *
     * @param acceptData
     * @param out
     */
    @RequestMapping(value = "countMyTeam", method = RequestMethod.POST)
    public void countMyTeam(AcceptData acceptData, long uid, PrintWriter out) {
        try {
            long firstTeam = threeSaleSerivce.countFirstTeam(uid);
            long secondTeam = threeSaleSerivce.countSecondTeam(uid);
            JSONObject bossData = new JSONObject();
            ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
            if (threeSale != null) {
                UserInfo boss = threeSale.getBoss();
                if (boss != null) {
                    bossData.put("nickName", boss.getNickName());
                    bossData.put("portrait", boss.getPortrait());
                }
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy.MM.dd");
                Long createTime = threeSale.getCreateTime();
                Date inviteTime = new Date(createTime);
                bossData.put("inviteTime", "邀请时间: " + sdf.format(inviteTime));
            }
            JSONObject resultData = new JSONObject();
            String helpLink = configService.getValue(ConfigKeyEnum.teamHelpUrl.getKey(), acceptData.getSystem());
            if (helpLink == null) {
                helpLink = "";
            }
            resultData.put("helpLink", helpLink);
            resultData.put("firstTeam", firstTeam);
            resultData.put("firstTeamTotal", firstTeam);
            resultData.put("secondTeam", secondTeam);
            resultData.put("secondTeamTotal", secondTeam);
            resultData.put("boss", bossData);
            boolean hasCode = false;
            String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
            if (inviteCode != null && inviteCode.trim().length() > 0) {
                hasCode = true; // 已有邀请码
            } else {
                // 邀请激活链接
                resultData.put("activationlink", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(), acceptData.getSystem()));
            }
            resultData.put("hasCode", hasCode);
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("统计失败"));
            e.printStackTrace();
        }
    }
    /**
     * 用户队员信息保存 1.4.1
     *
     * @param acceptData
     * @param uid
     * @param inviteId   邀请id
     * @param out
     */
    @RequestMapping(value = "setextrainfo", method = RequestMethod.POST)
    public void setExtraInfo(AcceptData acceptData, long uid, long inviteId, String memoName, PrintWriter out) {
        ThreeSale threeSale = threeSaleSerivce.selectByPrimaryKey(inviteId);
        if (threeSale == null) {
            out.print(JsonUtil.loadFalseResult("该记录不存在"));
            return;
        }
        UserInfo worker = threeSale.getWorker();
        if (worker == null) {
            out.print(JsonUtil.loadFalseResult("该记录不存在"));
            return;
        }
        int type = 1;
        if (threeSale.getBoss().getId() != uid) {
            type = 2;
        }
        ThreeSaleExtraInfo extraInfo = threeSaleExtraInfoSerivce.getbyBossIdAndWorkerId(uid, worker.getId());
        if (extraInfo == null) {
            extraInfo = new ThreeSaleExtraInfo();
            Long bossUid = threeSale.getBoss().getId();
            if (uid == bossUid) {
                extraInfo.setType(1); // 直接
            } else {
                extraInfo.setType(2); // 间接
            }
            extraInfo.setWorker(worker);
            extraInfo.setNickname(memoName);
            extraInfo.setCreateTime(new Date());
            extraInfo.setUpdateTime(new Date());
            extraInfo.setBoss(new UserInfo(uid));
            threeSaleExtraInfoSerivce.insertSelective(extraInfo);
        } else {
            ThreeSaleExtraInfo updateInfo = new ThreeSaleExtraInfo();
            updateInfo.setId(extraInfo.getId());
            updateInfo.setNickname(memoName);
            updateInfo.setUpdateTime(new Date());
            threeSaleExtraInfoSerivce.updateByPrimaryKeySelective(updateInfo);
        }
        // 更新粉丝记录信息
        teamFansInfoService.updateMemoName(worker.getId(), type, memoName);
        out.print(JsonUtil.loadTrueResult("保存成功"));
    }
    /**
     * 设置界面开关状态
     *
     * @param acceptData
     * @param uid
     * @param params
     * @param out
     */
    @RequestMapping(value = "setModuleState", method = RequestMethod.POST)
    public void setModuleState(AcceptData acceptData, Long uid, String params, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        try {
            if (params == null || params.trim().length() == 0) {
                out.print(JsonUtil.loadFalseResult("传递参数为空"));
                return;
            }
            JSONObject json = JSONObject.fromObject(params);
            Iterator<String> iterator = json.keys();
            while (iterator.hasNext()) {
                String type = (String) iterator.next();
                int state = json.getInt(type);
                userCustomSettingsService.saveModuleState(uid, type, state);
            }
            out.print(JsonUtil.loadTrueResult("设置成功"));
        } catch (UserCustomSettingsException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("设置失败"));
            e.printStackTrace();
        }
    }
    /**
     * 获取等级信息
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getRankInfo", method = RequestMethod.POST)
    public void getRankInfo(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        try {
            UserInfoExtraVO rankInfo = userInfoExtraService.getRankInfo(uid);
            GsonBuilder gsonBuilder = JsonUtil.getConvertBigDecimalToStringSubZeroBuilder(new GsonBuilder());
            gsonBuilder.excludeFieldsWithoutExposeAnnotation();
            Gson gson = gsonBuilder.setDateFormat("yyyy.MM.dd").create();
            JSONObject resultData = new JSONObject();
            resultData.put("rankInfo", gson.toJson(rankInfo));
            out.print(JsonUtil.loadTrueResult(resultData));
        } catch (UserInfoExtraException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("获取失败"));
            e.printStackTrace();
        }
    }
    /**
     * 获取等级信息
     *
     * @param acceptData
     * @param uid
     * @param out
     */
    @RequestMapping(value = "getUserConfig", method = RequestMethod.POST)
    public void getUserConfig(AcceptData acceptData, Long uid, PrintWriter out) {
        if (uid == null) {
            out.print(JsonUtil.loadFalseResult("用户未登录"));
            return;
        }
        try {
            String inviteCode = userInfoExtraService.getInviteCodeByUid(uid);
            JSONObject inviteData = new JSONObject();
            if (inviteCode == null || inviteCode.trim().length() == 0) {
                // 无邀请码
                inviteData.put("content", "邀请激活");
                inviteData.put("link", configService.getValue(ConfigKeyEnum.inviteActivationUrl.getKey(), acceptData.getSystem()));
            } else {
                // 已有邀请码
                inviteData.put("content", "邀请码");
                inviteData.put("link", configService.getValue(ConfigKeyEnum.inviteActivationSuccessUrl.getKey(), acceptData.getSystem()));
            }
            JSONObject data = new JSONObject();
            data.put("invite", inviteData);
            out.print(JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("获取失败"));
            e.printStackTrace();
        }
    }
    /**
     * 获取用户信息
     *
     * @param acceptData
     * @param requst
     * @param out
     */
    @UserActive(uid = "#uid")
    @RequestMapping(value = "getuserinfoNew", method = RequestMethod.POST)
    public void getuserinfoNew(AcceptData acceptData, Long uid, HttpServletRequest requst, PrintWriter out) {
        try {
            BusinessSystem system = businessSystemService.getBusinessSystemCache(acceptData.getPlatform(),
                    acceptData.getPackages(), acceptData.getSystem());
            if (system == null) {
                out.print(JsonUtil.loadFalseResult("系统不存在"));
                return;
            }
            if (uid == null) {
                out.print(JsonUtil.loadFalseResult("请求参数为空"));
                return;
            }
            UserInfo userInfo = userInfoService.getUserInfo(uid);
            // 添加用户活跃记录
            UserActiveLog userActiveLog = new UserActiveLog();
            userActiveLog.setChannel(acceptData.getChannel());
            userActiveLog.setIp(requst.getRemoteHost());
            userActiveLog.setUid(userInfo.getId());
            userActiveLog.setVersionCode(acceptData.getVersion());
            userActiveLog.setOsVersion(acceptData.getOsVersion());
            userActiveLog.setDeviceType(acceptData.getDeviceType());
            userActiveLog.setDevice(acceptData.getDevice());
            userActiveLogService.addUserActiveLog(userActiveLog);
            //是否绑定淘宝
            UserExtraTaoBaoInfo taoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
            if (taoBaoInfo != null)
                if (!StringUtil.isNullOrEmpty(taoBaoInfo.getSpecialId()) && taoBaoInfo.getSpecialValid() != null && taoBaoInfo.getSpecialValid()) {
                    if (!StringUtil.isNullOrEmpty(taoBaoInfo.getRelationId()) && taoBaoInfo.getRelationValid() != null && taoBaoInfo.getRelationValid()) {
                        userInfo.setTbName(taoBaoInfo.getTaoBaoNickName());
                        userInfo.setOpenid(taoBaoInfo.getTaoBaoUid() + "");
                    }
                }
            // 处理用户信息
            outUserInfoHandle(userInfo);
            GsonBuilder gsonBuilder = new GsonBuilder().excludeFieldsWithoutExposeAnnotation();
            JSONObject data = new JSONObject();
            // 界面状态
            UserSettingsVO mySettings = null;
            try {
                mySettings = userCustomSettingsService.getMySettings(uid);
            } catch (UserCustomSettingsException e) {
                mySettings = new UserSettingsVO();
                e.printStackTrace();
            }
            if (mySettings.getCancelNotice() == null) {
                mySettings.setCancelNotice(0);
            }
            if (mySettings.getNoBonusCount() == null) {
                mySettings.setNoBonusCount(0);
            }
            if (mySettings.getNoNewsRedDot() == null) {
                mySettings.setNoNewsRedDot(0);
            }
            if (mySettings.getNoShareRecordAndStorage() == null) {
                mySettings.setNoShareRecordAndStorage(0);
            }
            if (mySettings.getNoInvitationBonus() == null) {
                mySettings.setNoInvitationBonus(0);
            }
            if (mySettings.getNoDisplayPhoneNum() == null) {
                mySettings.setNoDisplayPhoneNum(0);
            }
            if (mySettings.getOpenSpreadHongBao() == null) {
                if (userTaoLiJinDetailService.countDetail(uid) > 0) {
                    mySettings.setOpenSpreadHongBao(1);
                } else {
                    mySettings.setOpenSpreadHongBao(0);
                }
            }
            data.put("moduleState", mySettings);
            boolean tailor = false;
            int welfareCenterNews = 0;
            String invitCode = null;
            UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
            if (userInfoExtra != null) {
                if (userInfoExtra.getCouponNews() != null) {
                    welfareCenterNews = userInfoExtra.getCouponNews();
                }
                // vip邀请码优先
                if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCodeVip())) {
                    invitCode = userInfoExtra.getInviteCodeVip();
                } else if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCode())) {
                    tailor = true;
                    invitCode = userInfoExtra.getInviteCode();
                }
                if (userInfoExtra.getUserRank() != null) {
                    String picture = userInfoExtra.getUserRank().getPicture();
                    String icon = userInfoExtra.getUserRank().getIcon();
                    userInfo.setRankNamePicture(picture);
                    userInfo.setRankIcon(icon);
                } else {
                    userInfo.setRankNamePicture(null);
                    userInfo.setRankIcon(null);
                }
                // 1.6.5 之后返回性别、微信号
                if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion())) {
                    if (userInfoExtra.getSex() != null)
                        userInfo.setSex(userInfoExtra.getSex());
                    if (!StringUtil.isNullOrEmpty(userInfoExtra.getWeiXin()))
                        userInfo.setWeiXin(userInfoExtra.getWeiXin());
                }
                // 二维码
                userInfo.setErCode(userInfoExtra.getErCode());
            }
            // 显示邀请码特制入口
            data.put("tailor", tailor);
            // 1.6.5 之后返回 微信号提示
            if (VersionUtil.greaterThan_1_6_5(acceptData.getPlatform(), acceptData.getVersion()))
                userInfo.setWeiXinTip("添加微信号后,你的邀请人和直接粉丝可以通过微信与你建立联系。");
            // 查询是否为VIP
            if (VersionUtil.greaterThan_2_0_5(acceptData.getPlatform(), acceptData.getVersion())) {
                userInfo.setVip(userVIPInfoService.isVIP(uid));
                boolean verifyForbid = redPackForbidService.verifyForbid(uid);
                data.put("redPackLock", verifyForbid);
            }
            data.put("user", JsonUtil.getConvertBigDecimalToStringBuilder(gsonBuilder).create().toJson(userInfo));
            data.put("invitCode", invitCode); // 邀请码
            if (!StringUtil.isNullOrEmpty(userInfoExtra.getInviteCodeVip()))
                data.put("invitCodeUpdated", true);// 邀请码是否已经修改过
            else
                data.put("invitCodeUpdated", false);
            data.put("welfareCenterNews", welfareCenterNews);// 福利中心消息
            data.put("vipLink", userVipConfigService.getValueByKey("vip_link"));// 超级会员升级链接
            if (SystemInfoUtil.hasFunctions(acceptData.getSystem(), SystemFunction.bindPhone)) {
                // 2.0.1之后绑定手机号
                if (VersionUtil.greaterThan_2_0_1(acceptData.getPlatform(), acceptData.getVersion())) {
                    boolean bindPhone = false;
                    if (StringUtil.isNullOrEmpty(userInfo.getPhone()))
                        bindPhone = bindRemindService.bindRemind(uid, BindRemind.TYPE_PHONE);
                    data.put("bindPhone", bindPhone);
                }
            }
            if (!StringUtil.isNullOrEmpty(invitCode)) {
                // 2.0.6 返回邀请人
                if (VersionUtil.greaterThan_2_0_6(acceptData.getPlatform(), acceptData.getVersion())) {
                    String bossName = "";
                    ThreeSale threeSale = threeSaleSerivce.getMyBoss(uid);
                    if (threeSale != null && threeSale.getBoss() != null) {
                        bossName = threeSale.getBoss().getNickName();
                    }
                    data.put("bossName", bossName);
                }
            }
            if (VersionUtil.greaterThan_2_0_7(acceptData.getPlatform(), acceptData.getVersion())) {
                UserInviteLevelEnum level = null;
                // VIP预览信息
                if (VersionUtil.greaterThan_2_1_1(acceptData.getPlatform(), acceptData.getVersion())) {
                    String redisContent = previewInfoService.getRedisContent(uid, PreviewEnum.mineInfo);
                    if (!StringUtil.isNullOrEmpty(redisContent)) {
                        MineInfoVO vo = new Gson().fromJson(redisContent, MineInfoVO.class);
                        if (vo != null) {
                            if (!StringUtil.isNullOrEmpty(vo.getBalance()))
                                userInfo.setMyHongBao(new BigDecimal(vo.getBalance()));
                            if (!StringUtil.isNullOrEmpty(vo.getLevel()))
                                for (UserInviteLevelEnum levelEnum : UserInviteLevelEnum.values()) {
                                    if (levelEnum.name().equals(vo.getLevel())) {
                                        level = levelEnum;
                                        break;
                                    }
                                }
                        }
                    }
                }
                if (level == null) {
                    if (VersionUtil.greaterThan_2_1(acceptData.getPlatform(), acceptData.getVersion())) {
                        level = userInviteService.getUserInviteLevelNew(uid);
                    } else {
                        level = userInviteService.getUserInviteLevel(uid);
                    }
                }
                JSONObject inviteLevel = new JSONObject();
                inviteLevel.put("level", level.name());
                inviteLevel.put("link", level.getLink());
                data.put("inviteLevel", inviteLevel);
            }
            if (VersionUtil.greaterThan_2_1_1(acceptData.getPlatform(), acceptData.getVersion())) {
                data.put("fansCountLink", configService.getValue(ConfigKeyEnum.teamStatisticsLink.getKey(), acceptData.getSystem()));
                // 会员动作
                // 查询是否为超级会员,是的话返回超会管理链接
                UserLevelEnum level = userLevelManager.getUserLevel(uid);
                JSONObject vipAction = null;
                String managerLink = userVipConfigService.getValueByKey("vip_manager_link");
                if ((level == UserLevelEnum.superVIP || level == UserLevelEnum.tearcher)
                        && !StringUtil.isNullOrEmpty(managerLink)) {
                    vipAction = new JSONObject();
                    vipAction.put("name", "超会管理");
                    vipAction.put("jumpDetail",
                            jumpDetailV2Service.getByTypeCache("web",
                                    acceptData.getPlatform().equalsIgnoreCase("android") ? 1 : 2,
                                    Integer.parseInt(acceptData.getVersion()), acceptData.getSystem()));
                    JSONObject params = new JSONObject();
                    params.put("url", userVipConfigService.getValueByKey("vip_manager_link"));
                    vipAction.put("params", params);
                } else {
                    // 查询是否可以提交会员申请,是的话返回资料填写页面
                    List<GiveVIPApplyInfo> list = giveVIPApplyInfoService.listByStateAndTargetUid(uid,
                            GiveVIPApplyInfo.STATE_NO_INFO, 1, 20);
                    if (list != null && list.size() > 0) {
                        String link = userVipConfigService.getValueByKey("apply_vip_upload_info_link");
                        if (!StringUtil.isNullOrEmpty(link)) {
                            vipAction = new JSONObject();
                            vipAction.put("name", "申请会员");
                            vipAction.put("jumpDetail",
                                    jumpDetailV2Service.getByTypeCache("web",
                                            acceptData.getPlatform().equalsIgnoreCase("android") ? 1 : 2,
                                            Integer.parseInt(acceptData.getVersion()), acceptData.getSystem()));
                            JSONObject params = new JSONObject();
                            params.put("url", link.replace("[ID]", list.get(0).getId()));
                            vipAction.put("params", params);
                        }
                    }
                }
                if (vipAction != null)
                    data.put("vipAction", vipAction);
            }
            data.put("user", JsonUtil.getConvertBigDecimalToStringBuilder(gsonBuilder).create().toJson(userInfo));
            //拼多多是否绑定
            if (VersionUtil.greaterThan_2_1_5(acceptData.getPlatform(), acceptData.getVersion())) {
                boolean pddBuyBind = PinDuoDuoApiUtil.isAuth(pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.fanli), pddAuthService.getFanliCustomParams(uid));
                boolean pddShareBind = PinDuoDuoApiUtil.isAuth(pidManager.getPidCache(acceptData.getSystem(), Constant.SOURCE_TYPE_PDD, SystemPIDInfo.PidType.share), pddAuthService.getFanliCustomParams(uid));
                data.put("pddBuyBind", pddBuyBind);
                data.put("pddShareBind", pddShareBind);
            }
            out.print(JsonUtil.loadTrueResult(data));
            final UserInfo uuser = userInfo;
            ThreadUtil.run(new Runnable() {
                public void run() {
                    // 获取邀请码:若无邀请码且存在有效的队员关系 则自动生成邀请码
                    userInfoExtraService.getInviteCodeByUid(uuser.getId());
                    // 更新用户附加信息,老用户不存在的需要添加
                    try {
                        userInfoExtraService.updateUserRankByUid(uuser.getId());
                    } catch (UserInfoExtraException e) {
                        e.printStackTrace();
                    }
                }
            });
        } catch (UserInfoException e) {
            out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMsg()));
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("获取失败"));
            LogHelper.errorDetailInfo(e);
        }
    }
    private void outUserInfoHandle(UserInfo user) {
        // 红包处理
        user.setTotalHongBao(new BigDecimal(0));
        user.setNoOpenHongBao(new BigDecimal(0));
        user.setCanOpenHongBao(new BigDecimal(0));
        // 电话号码处理
        if (!StringUtil.isNullOrEmpty(user.getPhone())) {
            if (user.getPhone().length() > 5) {
                String phone = user.getPhone().substring(0, 3);
                phone += "******";
                phone += user.getPhone().substring(user.getPhone().length() - 2, user.getPhone().length());
                user.setPhone(phone);
            }
        }
        UserInfoExtraVO userInfoExtra = userInfoExtraService.getInfoExtraVOByUid(user.getId());
        if (userInfoExtra != null && userInfoExtra.getUserRank() != null) {
            String picture = userInfoExtra.getUserRank().getPicture();
            String icon = userInfoExtra.getUserRank().getIcon();
            user.setRankNamePicture(picture);
            user.setRankIcon(icon);
        }
    }
    /**
     * 用户更换头像
     *
     * @param acceptData
     * @param uid
     * @param request
     * @param out
     */
    @RequestMapping(value = "uploadPortrait")
    public void uploadPortrait(AcceptData acceptData, MultipartFile file, Long uid, HttpServletRequest request,
                               PrintWriter out) {
        try {
            if (uid == null) {
                out.print(JsonUtil.loadFalseResult("用户未登录"));
                return;
            }
            if (file == null) {
                out.print(JsonUtil.loadFalseResult("上传文件不能为空"));
                return;
            }
            userInfoService.uploadPortrait(file, uid);
            out.print(JsonUtil.loadTrueResult("保存成功"));
        } catch (UserInfoException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        } catch (IOException e) {
            out.print(JsonUtil.loadFalseResult("图片上传失败失败"));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("保存失败"));
            try {
                LogHelper.errorDetailInfo(e);
            } catch (Exception e1) {
                e1.printStackTrace();
            }
        }
    }
    /**
     * 更换基础信息
     *
     * @param acceptData
     * @param nickName
     * @param uid
     * @param out
     */
    @RequestMapping(value = "saveInfo")
    public void saveInfo(AcceptData acceptData, String nickName, String weiXin, Integer sex, Long uid,
                         String inviteCode, MultipartFile qrCodeFile, HttpServletRequest request, PrintWriter out) {
        try {
            if (uid == null) {
                out.print(JsonUtil.loadFalseResult("用户未登录"));
                return;
            }
            // 修改昵称
            if (!StringUtil.isNullOrEmpty(nickName)) {
                if (nickName.length() > 200) {
                    out.print(JsonUtil.loadFalseResult("昵称过长"));
                    return;
                }
                if (maskKeyService.examineContent(nickName)) {
                    out.print(JsonUtil.loadFalseResult("不能包含敏感词汇"));
                    return;
                }
                userInfoService.saveUserInfo(nickName, uid);
                userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.nickName, nickName);
            }
            // 修改微信号
            if (!StringUtil.isNullOrEmpty(weiXin)) {
                if (weiXin.length() > 32) {
                    out.print(JsonUtil.loadFalseResult("微信号过长"));
                    return;
                }
                UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
                if (userInfoExtra != null) {
                    UserInfoExtra extra = new UserInfoExtra();
                    extra.setId(userInfoExtra.getId());
                    extra.setWeiXin(weiXin);
                    userInfoExtraService.saveUserInfoExtra(extra);
                    userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.setWeiXinNum, weiXin);
                }
            }
            // 修改性别
            if (sex != null && sex > 0 && sex < 3) {
                UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
                if (userInfoExtra != null) {
                    UserInfoExtra extra = new UserInfoExtra();
                    extra.setId(userInfoExtra.getId());
                    extra.setSex(sex);
                    userInfoExtraService.saveUserInfoExtra(extra);
                    userInfoModifyRecordService.addModifyRecord(uid, ModifyTypeEnum.gender, sex + "");
                }
            }
            // 修改邀请码
            if (!StringUtil.isNullOrEmpty(inviteCode)) {// 邀请码不为空
                inviteCode = inviteCode.trim();
                if (inviteCode.length() >= 4 && inviteCode.length() <= 12) {
                    try {
                        userInfoExtraService.updateInviteCodeVip(inviteCode, uid);
                        out.print(JsonUtil.loadTrueResult("保存成功"));
                        return;
                    } catch (UserInfoExtraException e) {
                        out.print(JsonUtil.loadFalseResult(e.getCode(), e.getMessage()));
                    }
                } else {
                    out.print(JsonUtil.loadFalseResult(1, "邀请码必须为4到12位"));
                    return;
                }
            }
            // 二维码
            if (qrCodeFile != null) {
                userInfoExtraService.uploadERCode(qrCodeFile, uid);
            }
            out.print(JsonUtil.loadTrueResult("保存成功"));
        } catch (UserInfoException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
            e.printStackTrace();
        } catch (Exception e) {
            out.print(JsonUtil.loadFalseResult("保存失败"));
            e.printStackTrace();
        }
    }
}