admin
2025-02-25 30d8e227e8d823b6c38c3b9c90ac2df03b63befe
fanli/src/main/java/com/yeshi/fanli/controller/admin/UserInfoAdminController.java
@@ -1,1677 +1,1675 @@
package com.yeshi.fanli.controller.admin;
import java.io.PrintWriter;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.yeshi.fanli.entity.accept.AdminAcceptData;
import org.apache.commons.beanutils.PropertyUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.yeshi.utils.IPUtil;
import org.yeshi.utils.JsonUtil;
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.google.gson.reflect.TypeToken;
import com.yeshi.fanli.controller.admin.utils.AdminUtils;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.entity.admin.count.CountUserInfo;
import com.yeshi.fanli.entity.bus.user.BindingAccount;
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode;
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode.ForbiddenUserIdentifyCodeTypeEnum;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.UserActiveLog;
import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.bus.user.UserInviteValidNum;
import com.yeshi.fanli.entity.bus.user.UserRank;
import com.yeshi.fanli.entity.bus.user.vip.TearcherInfo;
import com.yeshi.fanli.entity.bus.user.vip.UserVIPInfo;
import com.yeshi.fanli.entity.common.AdminUser;
import com.yeshi.fanli.entity.dynamic.DynamicInfo;
import com.yeshi.fanli.entity.integral.IntegralDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
import com.yeshi.fanli.exception.user.ForbiddenUserIdentifyCodeException;
import com.yeshi.fanli.exception.user.vip.UserVIPInfoException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.count.UserInfoCountService;
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.ExtractService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
import com.yeshi.fanli.service.inter.user.UserAccountService;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserInfoDeleteRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserRankService;
import com.yeshi.fanli.service.inter.user.integral.IntegralDetailService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleDetailService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteValidNumService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.inter.user.vip.TearcherService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.vo.user.UserGoldCoinVO;
import com.yeshi.fanli.vo.user.UserInfoVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("admin/new/api/v1/user")
public class UserInfoAdminController {
   @Resource
   private UserInfoService userInfoService;
   @Resource
   private ThreeSaleSerivce threeSaleService;
   @Resource
   private BindingAccountService bindingAccountService;
   @Resource
   private UserInfoCountService userInfoCountService;
   @Resource
   private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private UserRankService userRankService;
   @Resource
   private UserMoneyDetailService userMoneyDetailService;
   @Resource
   private UserInfoDeleteRecordService userInfoDeleteRecordService;
   @Resource
   private UserAccountService userAccountService;
   @Resource
   private UserActiveLogService userActiveLogService;
   @Resource
   private UserVIPInfoService userVIPInfoService;
   @Resource
   private IntegralDetailService integralDetailService;
   @Resource
   private UserInviteValidNumService userInviteValidNumService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   @Resource
   private ExtractService extractService;
   @Resource
   private HongBaoV2Service hongBaoV2Service;
   @Resource
   private TearcherService tearcherService;
   @Resource
   private ThreeSaleDetailService threeSaleDetailService;
   @Resource
   private HongBaoV2CountService hongBaoV2CountService;
   /**
    * 查询用户信息列表 正常用户/异常用户
    *
    * @param callback
    * @param pageIndex
    * @param key       查询条件
    * @param userType  用户类型:金冠、银冠、铜冠
    * @param days      查询天数
    * @param startTime 注册时间
    * @param endTime   注册时间
    * @param orderMode 排序方式 订单数量 今日订单 累计队员
    * @param out
    */
   @RequestMapping(value = "query")
   public void query(AdminAcceptData acceptData, String callback, Integer pageIndex, Integer pageSize, String key, Integer keyType, Integer rank,
                 Integer userType, Integer days, String startTime, String endTime, Integer orderMode, Integer type,
                 String level, Integer activeCode, PrintWriter out) {
      try {
         if (type == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户类型type不能为空"));
            return;
         }
         if (pageIndex == null)
            pageIndex = 1;
         if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
         Integer orderField = null;
         if (orderMode != null) {
            if (orderMode == 1 || orderMode == 2) {
               orderField = orderMode;
               orderMode = 1;
            } else if (orderMode == 3 || orderMode == 4) {
               orderField = orderMode;
               orderMode = 2;
            } else if (orderMode == 5 || orderMode == 6) {
               orderField = orderMode;
               orderMode = 3;
            }
         }
         String userRank = null;
         if (rank != null) {
            switch (rank) {
            case 1:
               userRank = "青铜";
               break;
            case 2:
               userRank = "白银";
               break;
            case 3:
               userRank = "黄金";
               break;
            case 4:
               userRank = "铂金";
               break;
            default:
               break;
            }
         }
         List<UserInfoVO> userList = userInfoService.query((pageIndex - 1) * pageSize, pageSize, type, key, keyType,
               userRank, days, startTime, endTime, orderField, orderMode, userType, level, activeCode,acceptData.getSystem());
         if (userList == null || userList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无相关数据"));
            return;
         }
         long count = userInfoService.queryCount(type, key, keyType, userRank, days, startTime, endTime, userType,
               level, activeCode,acceptData.getSystem());
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder();
         gsonBuilder.serializeNulls();
         Gson gson = gsonBuilder.create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("resultList", gson.toJson(userList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 用户基础信息查询
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param key
    * @param keyType
    * @param rank
    * @param userType
    * @param days
    * @param startTime
    * @param endTime
    * @param type
    * @param level
    * @param activeCode
    * @param out
    */
   @RequestMapping(value = "queryInfo")
   public void queryInfo(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, String key, Integer keyType,
         Integer rank, Integer userType, Integer days, String startTime, String endTime, Integer state, String level,
         Integer activeCode, PrintWriter out) {
      try {
         if (pageIndex == null)
            pageIndex = 1;
         if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
         String userRank = null;
         if (rank != null) {
            switch (rank) {
            case 1:
               userRank = "青铜";
               break;
            case 2:
               userRank = "白银";
               break;
            case 3:
               userRank = "黄金";
               break;
            case 4:
               userRank = "铂金";
               break;
            default:
               break;
            }
         }
         List<UserInfoVO> userList = userInfoService.queryInfo((pageIndex - 1) * pageSize, pageSize, state, key,
               keyType, userRank, days, startTime, endTime, userType, level, activeCode,acceptData.getSystem());
         if (userList == null || userList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无相关数据"));
            return;
         }
         long count = userInfoService.countInfo(state, key, keyType, userRank, days, startTime, endTime, userType,
               level, activeCode,acceptData.getSystem());
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder();
         gsonBuilder.serializeNulls();
         Gson gson = gsonBuilder.create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("resultList", gson.toJson(userList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 资金统计
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "statisticsMoney")
   public void statisticsMoney(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      try {
         UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
         if (user == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户ID不存在"));
            return;
         }
         Date minDate = null;
         Date maxDate = null;
         long timeStamp = System.currentTimeMillis();
         Calendar calendar = Calendar.getInstance();
         calendar.setTimeInMillis(timeStamp);
         List<UserMoneyDetailTypeEnum> typeList = new ArrayList<>();
         typeList.add(UserMoneyDetailTypeEnum.extract);
         typeList.add(UserMoneyDetailTypeEnum.extractNew);
         typeList.add(UserMoneyDetailTypeEnum.extractVerify);
         typeList.add(UserMoneyDetailTypeEnum.extractVerifyNew);
         typeList.add(UserMoneyDetailTypeEnum.extractReject);
         typeList.add(UserMoneyDetailTypeEnum.extractAutoWX);
         minDate = new Date(0L);
         maxDate = new Date(timeStamp);
         // 累计成功提现
         BigDecimal totalExtractMoney = userMoneyDetailService
               .statisticUserTypeMoneyWithDate(uid, typeList, minDate, maxDate, 1).abs();
         // 提现中金额
         BigDecimal extractingMoney = extractService.sumVerifyingMoney(uid);
         // 全部未到账
         minDate = new Date(0);
         maxDate = new Date(timeStamp);
         BigDecimal unRecievedMoney = hongBaoV2Service.getUnRecievedMoneyWithCreateTime(uid, minDate, maxDate);
         JSONObject data = new JSONObject();
         data.put("totalExtractMoney", totalExtractMoney);
         data.put("extractingMoney", extractingMoney);
         data.put("balanceMoney", user.getMyHongBao());
         data.put("unRecievedMoney", unRecievedMoney);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 权益统计
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "statisticsGoldCoin")
   public void statisticsEquity(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      try {
         int goldCoin = 0;
         UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
         if (userInfoExtra != null) {
            goldCoin = userInfoExtra.getGoldCoin();
         }
         JSONObject data = new JSONObject();
         data.put("goldCoin", goldCoin);
         data.put("exchangeGoldCoin", new BigDecimal(integralDetailService.sumUseGoldCoin(uid)).abs());
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
    /**
     * 用户粉丝统计
     * @param acceptData
     * @param callback
     * @param uid
     * @param out
     */
   @RequestMapping(value = "countTeamFans")
   public void countTeamFans(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      JSONObject data = new JSONObject();
      // 导师
      String tearcherName = "";
      TearcherInfo tearcherInfo = tearcherService.selectByUid(uid);
      if (tearcherInfo != null) {
         tearcherName = tearcherInfo.getNickName();
      }
      data.put("tearcherName", tearcherName);
      // 邀请人
      String bossName = "";
      UserInfo boss = threeSaleSerivce.getBoss(uid);
      if (boss != null) {
         bossName = boss.getNickName();
      }
      data.put("bossName", bossName);
      // 邀请粉丝
      int doneFirst = 0;
      int doneSecond = 0;
      UserInviteValidNum userInviteValidNum = userInviteValidNumService.selectByPrimaryKey(uid);
      if (userInviteValidNum != null) {
         doneFirst = userInviteValidNum.getNumFirst() == null ? 0 : userInviteValidNum.getNumFirst();
         doneSecond = userInviteValidNum.getNumSecond() == null ? 0 : userInviteValidNum.getNumSecond();
      }
      data.put("doneFirst", doneFirst);
      data.put("doneSecond", doneSecond);
      // 九代粉丝数量
      data.put("nineFans", threeSaleDetailService.countByBossUidAndMaxLevel(uid, 9));
      // 有效粉丝
      data.put("first", threeSaleSerivce.countFirstTeam(uid));
      data.put("second", threeSaleSerivce.countSecondTeam(uid));
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    * 用户详细信息
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getInfoDetail")
   public void getInfoDetail(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      UserInfo user = userInfoService.selectByPKey(uid);
      UserInfoVO userInfoVO = new UserInfoVO();
      userInfoVO.setId(uid);
      userInfoVO.setPhone(user.getPhone());
      userInfoVO.setState(user.getState());
      userInfoVO.setCreatetime(user.getCreatetime());
      UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
      if (userInfoExtra != null) {
         if (!StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
            userInfoVO.setMark(userInfoExtra.getMark());
         }
         userInfoVO.setInviteCode(userInfoExtra.getInviteCode());
         userInfoVO.setInviteCodeVip(userInfoExtra.getInviteCodeVip());
         userInfoVO.setWxId(userInfoExtra.getWeiXin());
      }
      // 最近一次下单时间
      Date lastOrderTime = hongBaoV2CountService.getLastHongBaoTime(uid);
      if (lastOrderTime != null) {
         userInfoVO.setLastOrderTime(lastOrderTime.getTime());
      }
      // 最近登录时间
      UserActiveLog userActiveLog = userActiveLogService.getUserLatestActiveInfo(uid);
      if (userActiveLog != null) {
         userInfoVO.setLastLoginTime(userActiveLog.getCreateTime().getTime());
      }
      // 显示用户微信 淘宝 老版本存在
      String wxId = userInfoVO.getWxId();
      if (wxId == null) {
         userInfoVO.setWxId("");
      }
      // 是否绑定支付宝(购买 + 分享权限)
      UserExtraTaoBaoInfo extraTaoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
      if (extraTaoBaoInfo != null) {
         String taoBaoUid = extraTaoBaoInfo.getTaoBaoUid();
         String specialId = extraTaoBaoInfo.getSpecialId();
         String relationId = extraTaoBaoInfo.getRelationId();
         if (StringUtil.isNullOrEmpty(taoBaoUid) || StringUtil.isNullOrEmpty(specialId)
               || StringUtil.isNullOrEmpty(relationId)) {
            userInfoVO.setTbName(null);
            userInfoVO.setTaoBaoUid(null);
         } else {
            userInfoVO.setTbName(extraTaoBaoInfo.getTaoBaoNickName());
            userInfoVO.setTaoBaoUid(extraTaoBaoInfo.getTaoBaoUid());
         }
      }
      /* 绑定收款账号信息 */
      List<BindingAccount> account = bindingAccountService.getBindingAccountByUid(uid);
      if (account != null && account.size() > 0) {
         BindingAccount bindingAccount = account.get(0);
         Integer type = bindingAccount.getType();
         if (type != null && type == 1) {
            // 支付宝
            userInfoVO.setAccountAlipay(bindingAccount.getAccount());
            userInfoVO.setAccountName(bindingAccount.getName());
            userInfoVO.setAccountBindId(bindingAccount.getId());
         } else if (type != null && type == 2) {
            // 微信
            userInfoVO.setAccountWX(bindingAccount.getAccount());
            userInfoVO.setAccountNameWX(bindingAccount.getName());
            userInfoVO.setAccountBindIdWX(bindingAccount.getId());
         }
      }
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(userInfoVO));
   }
   /**
    *  绑定详情
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getBindDetail")
   public void getBindDetail(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      UserInfo user = userInfoService.selectByPKey(uid);
      JSONObject data = new JSONObject();
      Integer state = user.getState();
      if (state == UserInfo.STATE_NORMAL) {
         data.put("stateDesc", "正常");
      } else if (state == UserInfo.STATE_DELETE) {
         data.put("stateDesc", "已删除");
      } else if (state == UserInfo.STATE_FORBIDDEN) {
         data.put("stateDesc", "已封禁");
      } else if (state == UserInfo.STATE_DELETE_OUT_OF_DATE) {
         data.put("stateDesc",  "长期未登录删除");
      }
      data.put("state", state);
      data.put("phone", user.getPhone());
      // 微信授权
      String wxUnionId = user.getWxUnionId();
      if(StringUtil.isNullOrEmpty(wxUnionId)) {
         data.put("wxName", "");
         data.put("wxState", false);
      } else {
         data.put("wxName", user.getWxName());
         data.put("wxnState", true);
      }
      String mark = "";
      UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
      if (userInfoExtra != null) {
         if (!StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
            mark = userInfoExtra.getMark();
         }
      }
      data.put("mark", mark);
      // 淘宝授权
      String tbName = "";
      boolean tbState = false;
      UserExtraTaoBaoInfo extraTaoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
      if (extraTaoBaoInfo != null) {
         String taoBaoUid = extraTaoBaoInfo.getTaoBaoUid();
         String specialId = extraTaoBaoInfo.getSpecialId();
         String relationId = extraTaoBaoInfo.getRelationId();
         if (!StringUtil.isNullOrEmpty(taoBaoUid) && StringUtil.isNullOrEmpty(specialId) && StringUtil.isNullOrEmpty(relationId)) {
            tbState = true;
            tbName = extraTaoBaoInfo.getTaoBaoNickName();
         }
      }
      data.put("tbName", tbName);
      data.put("tbState", tbState);
      /* 绑定收款账号信息 */
      String accountName = "";
      boolean accountState = false;
      List<BindingAccount> account = bindingAccountService.getBindingAccountByUid(uid);
      if (account != null && account.size() > 0) {
         BindingAccount bindingAccount = account.get(0);
         Integer type = bindingAccount.getType();
         // 支付宝
         if (type != null && type == 1) {
            accountState = true;
            accountName = bindingAccount.getAccount();
         }
      }
      data.put("account", accountName);
      data.put("accountState", accountState);
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    * 统计今日用户总情况
    *
    * @param callback
    * @param out
    */
   @RequestMapping(value = "countInfo")
   public void countInfo(AdminAcceptData acceptData,String callback, PrintWriter out) {
      try {
         // 累计用户数量
         long totalUser = userInfoCountService.countNewUser(null, null);
         // 流失用户数量(180天未使用登录并且无任何资金流动的账号数量)
         long loseUser = userInfoCountService.countLoseUser(180);
         // 累计有购买用户数
         long orderUser = userInfoCountService.countHasOrderUser();
         // 总数-普通用户
         long countNormal = 0;
         // 总数-铜用户
         long countCuprum = 0;
         // 总数-银用户
         long countSilver = 0;
         // 总数-金用户
         long countGold = 0;
         List<UserRank> listRank = userRankService.getAllRank();
         if (listRank != null && listRank.size() > 0) {
            for (UserRank userRank : listRank) {
               Long id = userRank.getId();
               String name = userRank.getName();
               if ("青铜".equals(name)) {
                  continue;
               }
               long count = userInfoExtraService.countByRankId(id);
               if ("白银".equals(name)) {
                  countCuprum = count;
               } else if ("黄金".equals(name)) {
                  countSilver = count;
               } else if ("铂金".equals(name)) {
                  countGold = count;
               }
            }
         }
         // 普通用户计算
         countNormal = totalUser - (countCuprum + countSilver + countGold);
         JSONObject data = new JSONObject();
         data.put("totalUser", totalUser);
         data.put("loseUser", loseUser);
         data.put("orderUser", orderUser);
         data.put("countNormal", countNormal);
         data.put("countCuprum", countCuprum);
         data.put("countSilver", countSilver);
         data.put("countGold", countGold);
         /*
          * // 统计所有总金额 BigDecimal countTotalMoney =
          * userInfoCountService.countAllMoney(null);
          *
          * // 统计所有可提现金额 String minMoney = configService.get(Constant.EXTRACT_MIN_MONEY);
          * if (minMoney == null) { minMoney = "20"; } double min =
          * Double.parseDouble(minMoney); BigDecimal countCanAssets =
          * userInfoCountService.countAllMoney(min); data.put("countTotalMoney",
          * countTotalMoney); data.put("countCanAssets", countCanAssets);
          */
         // 今日新增用户数量
         long todayUser = userInfoCountService.countNewUser(1, null);
         // 本月新增用户数量
         long monthUser = userInfoCountService.countNewUser(null, 1);
         data.put("todayUser", todayUser);
         data.put("monthUser", monthUser);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
    /**
     *
     * @param acceptData
     * @param callback
     * @param uid
     * @param typeArray
     * @param out
     */
   @RequestMapping("unBindUserInfo")
   public void unBindUserInfo(AdminAcceptData acceptData,String callback, Long uid, String typeArray, PrintWriter out) {
      try {
         if (typeArray == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("没有可更改的内容"));
            return;
         }
         Gson gson = new Gson();
         List<Integer> list = gson.fromJson(typeArray, new TypeToken<ArrayList<Integer>>() {
         }.getType());
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("没有可更改的内容"));
            return;
         }
         if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户id不能为空"));
            return;
         }
         UserInfo find = userInfoService.getUserById(uid);
         if (find == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户被封禁或不存在"));
            return;
         }
         for (Integer type : list) {
            String openid = find.getOpenid();
            String wxUnionId = find.getWxUnionId();
            String phone = find.getPhone();
            if (1 == type) {
               if (StringUtil.isNullOrEmpty(openid)) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定淘宝!"));
                  return;
               } else {
                  userInfoService.deleteBindInfo(find, type);
               }
            } else if (2 == type) {
               if (StringUtil.isNullOrEmpty(wxUnionId)) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定微信!"));
                  return;
               } else {
                  userInfoService.deleteBindInfo(find, type);
               }
            } else if (3 == type) {
               if (StringUtil.isNullOrEmpty(phone)) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定手机号!"));
                  return;
               } else {
                  userInfoService.deleteBindInfo(find, type);
               }
            } else if (4 == type) {
               // 查询支付宝绑定
               BindingAccount account = bindingAccountService.getBindingAccountByUidAndType(uid,
                     BindingAccount.TYPE_ALIPAY);
               if (account == null) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定支付宝!"));
                  return;
               } else {
                  bindingAccountService.deleteBindingAccount(account);
               }
            } else {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("账户类型不匹配!"));
               return;
            }
         }
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("解绑成功"));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 修改用户备注
    *
    * @param callback
    * @param uid
    * @param mark
    * @param out
    */
   @RequestMapping("addUserMark")
   public void addUserMark(AdminAcceptData acceptData,String callback, Long uid, String mark, PrintWriter out) {
      try {
         if (uid == null || uid <= 0 || StringUtil.isNullOrEmpty(mark))
            return;
         UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
         if (userInfoExtra == null)
            return;
         UserInfoExtra updateExtra = new UserInfoExtra();
         updateExtra.setId(userInfoExtra.getId());
         updateExtra.setMark(mark);
         userInfoExtraService.saveUserInfoExtra(updateExtra);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   /**
    * 删除用户-改变其状态
    *
    * @param callback
    * @param idArray
    * @param out
    */
   @RequestMapping(value = "deleteUser")
   public void delete(AdminAcceptData acceptData,String callback, String idArray, HttpServletRequest request, PrintWriter out) {
      try {
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。")));
            return;
         }
         if (StringUtil.isNullOrEmpty(idArray)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请选择操作的数据"));
            return;
         }
         Gson gson = new Gson();
         List<Long> list = gson.fromJson(idArray, new TypeToken<ArrayList<Long>>() {
         }.getType());
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("未检测到删除的数据"));
            return;
         }
         for (Long id : list) {
            UserInfo user = new UserInfo(id);
            user.setState(UserInfo.STATE_DELETE);
            user.setStateDesc(admin.getId() + " " + admin.getName() + "后台手动删除");
            userInfoService.updateByPrimaryKeySelective(user);
         }
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("成功删除"));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("删除失败"));
         e.printStackTrace();
      }
   }
   /**
    * 封禁用户ID
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "forbiddenUser")
   public void forbiddenUser(AdminAcceptData acceptData,String callback, Long uid, HttpServletRequest request, PrintWriter out) {
      try {
         if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请传递正确数据"));
            return;
         }
         UserInfo currentInfo = userInfoService.selectByPKey(uid);
         if (currentInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户已不存在"));
            return;
         }
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("登录失效,请登录"));
            return;
         }
         String reason = "后台封禁,操作人:" + admin.getId() + "-" + admin.getName();
         userAccountService.forbiddenUserAll(uid, reason);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("用户封禁成功"));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
      }
   }
   /**
    * 解除封禁用户ID
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "relieveForbiddenUser")
   public void relieveForbiddenUser(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      try {
         if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请传递正确数据"));
            return;
         }
         UserInfo currentInfo = userInfoService.selectByPKey(uid);
         if (currentInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户已不存在"));
            return;
         }
         currentInfo.setState(UserInfo.STATE_NORMAL);
         currentInfo.setStateDesc("管理员已解封");
         userInfoService.updateByPrimaryKeySelective(currentInfo);
         // 解封微信
         ForbiddenUserIdentifyCode forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService
               .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId, currentInfo.getWxUnionId());
         if (forbiddenUserIdentifyCode != null)
            forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
         // 解封手机
         forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService
               .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, currentInfo.getPhone());
         if (forbiddenUserIdentifyCode != null)
            forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
         // 解封淘宝
         UserExtraTaoBaoInfo taoBao = userExtraTaoBaoInfoService.getByUid(uid);
         if (taoBao != null && !StringUtil.isNullOrEmpty(taoBao.getTaoBaoUid())) {
            forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService
                  .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.taobaoUid, taoBao.getTaoBaoUid());
            if (forbiddenUserIdentifyCode != null)
               forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
         }
         // 解封支付宝
         List<BindingAccount> list = bindingAccountService.getBindingAccountByUid(uid);
         if (list != null) {
            for (BindingAccount ba : list) {
               forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService.listByTypeAndIdentifyCode(
                     ForbiddenUserIdentifyCodeTypeEnum.alipayAccount, ba.getAccount());
               if (forbiddenUserIdentifyCode != null)
                  forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
            }
         }
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("用户解封成功"));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
      }
   }
   /**
    * 用户账号- 封禁/解封
    *
    * @param callback
    * @param code
    * @param type     1("微信unionId"), 2("淘宝ID"), 3("手机号"), 4("支付宝账号");
    * @param out
    */
   @RequestMapping(value = "saveForbiddenInfo")
   public void saveForbiddenInfo(AdminAcceptData acceptData,String callback, String code, Integer type, PrintWriter out) {
      try {
         if (code == null || code.trim().length() == 0 || type == null || "NULL".equalsIgnoreCase(code)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("参数不能为空"));
            return;
         }
         forbiddenUserIdentifyCodeService.saveForbiddenInfo(code, type);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("修改成功"));
      } catch (ForbiddenUserIdentifyCodeException e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 队员关系
    *
    * @param pageIndex
    * @param state
    * @param startTime
    * @param endTime
    * @param out
    */
   @RequestMapping(value = "getRelationList")
   public void getRelationList(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, Long uid, Integer type,
         Integer state, String startTime, String endTime, Integer validState, PrintWriter out) {
      if (pageIndex == null || pageIndex < 1) {
         pageIndex = 1;
      }
      if (pageSize == null || pageSize < 1) {
         pageSize = Constant.PAGE_SIZE;
      }
      try {
         if (!StringUtil.isNullOrEmpty(endTime)) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date enddate = sdf.parse(endTime);
            Calendar c = Calendar.getInstance();
            c.setTime(enddate);
            c.add(Calendar.DAY_OF_MONTH, 1);// 今天+1天
            endTime = sdf.format(c.getTime());
         }
         List<ThreeSale> listQuery = null;
         if (type == 0) {
            // 上级用户
            if (uid == null) {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询上级需输入用户id"));
               return;
            }
            listQuery = threeSaleService.listSuperiorQuery((pageIndex - 1) * pageSize, pageSize, state, uid);
         } else if (type == 1) {
            // 一级用户
            listQuery = threeSaleService.listFirstTeamQuery((pageIndex - 1) * pageSize, pageSize, uid, state,
                  startTime, endTime, validState);
         } else if (type == 2) {
            // 二级用户
            listQuery = threeSaleService.listSecondTeamQuery((pageIndex - 1) * pageSize, pageSize, uid, state,
                  startTime, endTime, validState);
         }
         if (listQuery == null || listQuery.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         for (ThreeSale threeSale : listQuery) {
            // 用户信息
            UserInfo boss = threeSale.getBoss();
            threeSale.setBoss(userInfoService.selectByPKey(boss.getId()));
            UserInfo worker = threeSale.getWorker();
            threeSale.setWorker(userInfoService.selectByPKey(worker.getId()));
            Integer expire = threeSale.getExpire();
            if (threeSale.getState()) {
               threeSale.setExpire(1); // 邀请成功
            } else {
               if (expire != null && expire == 1) {
                  threeSale.setExpire(2); // 邀请失效
               } else {
                  threeSale.setExpire(0);// 已邀请
               }
            }
         }
         long count = 0;
         if (type == 0) {
            // 上级用户
            count = threeSaleService.countSuperiorQuery(state, uid);
         } else if (type == 1) {
            // 一级用户
            count = threeSaleService.countFirstTeamQuery(uid, state, startTime, endTime, validState);
         } else if (type == 2) {
            // 二级用户
            count = threeSaleService.countSecondTeamQuery(uid, state, startTime, endTime, validState);
         }
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", listQuery);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
         e.printStackTrace();
      }
   }
   /**
    * 用户账户明细
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param out
    */
   @RequestMapping(value = "getAccountDetails")
   public void getAccountDetails(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, Long uid, PrintWriter out) {
      if (pageIndex == null || pageIndex < 1) {
         pageIndex = 1;
      }
      if (pageSize == null || pageSize < 1) {
         pageSize = Constant.PAGE_SIZE;
      }
      if (uid == null) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请传递正确数据"));
         return;
      }
      try {
         List<UserMoneyDetail> userMoneyDetailsList = userMoneyDetailService.listByUidWithState(uid, pageIndex,
               pageSize);
         if (userMoneyDetailsList == null || userMoneyDetailsList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         long count = userMoneyDetailService.countByUidWithState(uid);
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", gson.toJson(userMoneyDetailsList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
      }
   }
   /**
    * 根据渠道 统计当日新增用户数量
    *
    * @param channelArray 名字数组
    * @param dateType     类型 1日 2月 3年
    * @param year         2018
    * @param startTime    2018-12-01
    * @param endTime      2018-12-01
    * @param out
    */
   @RequestMapping(value = "getNewUserCharts")
   public void getNewUserCharts(AdminAcceptData acceptData,String callback, String channelArray, Integer dateType, String year, String startTime,
         String endTime, PrintWriter out) {
      try {
         String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
         if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
         }
         if (dateType != 1 && (!StringUtil.isNullOrEmpty(startTime) || !StringUtil.isNullOrEmpty(endTime))) {
            startTime = null;
            endTime = null;
         }
         Date beginDate = null;
         Date endDate = null;
         if (dateType == 1) {
            beginDate = TimeUtil.parse(startTime);
            endDate = TimeUtil.parse(endTime);
         } else if (dateType == 2) {
            Calendar calendar = Calendar.getInstance();
            int currentYear = calendar.get(Calendar.YEAR);
            if (!StringUtil.isNullOrEmpty(year)) {
               currentYear = Integer.parseInt(year);
            }
            calendar.clear();
            calendar.set(Calendar.YEAR, currentYear);
            beginDate = calendar.getTime();
            calendar.clear();
            calendar.set(Calendar.YEAR, currentYear);
            calendar.roll(Calendar.DAY_OF_YEAR, -1);
            endDate = calendar.getTime();
         } else if (dateType == 3) {
            beginDate = TimeUtil.parse("2018-01-01");
            endDate = new Date();
         }
         Gson gson = new Gson();
         List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
         // 渠道
         List<String> channelList = null;
         if (channelArray != null && channelArray.trim().length() > 0) {
            channelList = gson.fromJson(channelArray, new TypeToken<ArrayList<String>>() {
            }.getType());
         }
         JSONArray line_list = new JSONArray();
         if (channelList != null && channelList.size() > 0) {
            for (String channel : channelList) {
               List<Object> list = getNewUserData(dateList, dateType, beginDate, endDate, channel);
               JSONObject innerList = new JSONObject();
               innerList.put("name", channel);
               innerList.put("data", gson.toJson(list));
               line_list.add(innerList);
            }
         } else {
            List<Object> list = getNewUserData(dateList, dateType, beginDate, endDate, null);
            JSONObject innerList = new JSONObject();
            innerList.put("name", "全部");
            innerList.put("data", gson.toJson(list));
            line_list.add(innerList);
         }
         JSONObject data = new JSONObject();
         data.put("line_list", line_list);
         data.put("xAxis_list", gson.toJson(dateList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
         e.printStackTrace();
      }
   }
   private List<Object> getNewUserData(List<String> dateList, Integer dateType, Date beginDate, Date endDate,
         String channel) {
      List<Object> list = new ArrayList<>();
      List<CountUserInfo> listHistory = userInfoCountService.getNewUserData(beginDate, endDate, channel);
      for (String date : dateList) {
         int value = 0;
         if (listHistory != null) {
            for (CountUserInfo history : listHistory) {
               if (dateType == 1) {
                  String gernalTime = TimeUtil.getGernalTime(history.getDay().getTime());
                  if (gernalTime.equalsIgnoreCase(date)) {
                     value += history.getNum();
                     continue;
                  }
               } else if (dateType == 2) {
                  String gernalTime = TimeUtil.getMonthOnlyMM(history.getDay());
                  if (gernalTime.startsWith("0")) {
                     gernalTime = gernalTime.substring(1, 2);
                  }
                  if (gernalTime.equalsIgnoreCase(date)) {
                     value += history.getNum();
                     continue;
                  }
               } else if (dateType == 3) {
                  String gernalTime = TimeUtil.getYearOnlyYYYY(history.getDay());
                  if (gernalTime.equalsIgnoreCase(date)) {
                     value += history.getNum();
                     continue;
                  }
               }
            }
         }
         list.add(value + "");
      }
      return list;
   }
   /**
    * 根据渠道 统计当日新增用户数量
    *
    * @param channelArray 名字数组
    * @param dateType     类型 1日 2月 3年
    * @param year         2018
    * @param startTime    2018-12-01
    * @param endTime      2018-12-01
    * @param out
    */
   @RequestMapping(value = "getTodayBuyRate")
   public void getTodayBuyRate(AdminAcceptData acceptData,String callback, String channelArray, Integer dateType, String year, String startTime,
         String endTime, Integer orderNum, PrintWriter out) {
      String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
      if (validateMsg != null) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
         return;
      }
      if (dateType == 2 && StringUtil.isNullOrEmpty(year)) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请输入年份"));
         return;
      }
      if (dateType != 1 && (!StringUtil.isNullOrEmpty(startTime) || !StringUtil.isNullOrEmpty(endTime))) {
         startTime = null;
         endTime = null;
      }
      List<String> channelList = null;
      if (channelArray != null && channelArray.trim().length() > 0) {
         Gson gson = new Gson();
         channelList = gson.fromJson(channelArray, new TypeToken<ArrayList<String>>() {
         }.getType());
      }
      if (channelList == null || channelList.size() == 0) {
         channelList = new ArrayList<String>();
         channelList.add("all");
      }
      if (dateType == 1 && year != null) {
         year = null; // 设置为空
      } else if (dateType == 2) {
         if (startTime != null)
            startTime = null;
         if (endTime != null)
            endTime = null;
      } else if (dateType == 3) {
         if (year != null)
            year = null;
         if (startTime != null)
            startTime = null;
         if (endTime != null)
            endTime = null;
      }
      try {
         Gson gson = new Gson();
         Object objectDate = null;
         List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
         JSONArray line_list = new JSONArray();
         for (String channel : channelList) {
            List<ChartTDO> list = userInfoCountService.getTodayBuyRate(channel, dateType, year, startTime, endTime);
            if ("all".equalsIgnoreCase(channel)) {
               channel = "总计";
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", channel);
            if (dateType != 3) {
               innerList.put("data", gson.toJson(AdminUtils.dayOrMonthDataFactory(dateType, dateList, list)));
            } else {
               // 年视图
               Map<String, Object> map = AdminUtils.yearsDataFactory(list);
               if (objectDate == null) {
                  objectDate = map.get("date");
               }
               innerList.put("data", gson.toJson(map.get("value")));
            }
            line_list.add(innerList);
         }
         JSONObject data = new JSONObject();
         if (objectDate != null) {
            data.put("xAxis_list", gson.toJson(objectDate));
         } else {
            data.put("xAxis_list", gson.toJson(dateList));
         }
         data.put("line_list", line_list);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 当周产生3单的新增用户概率
    *
    * @param callback
    * @param channelArray 渠道名称
    * @param startTime
    * @param endTime
    * @param orderNum     订单数量
    * @param out
    */
   @RequestMapping(value = "getWeekBuyRate")
   public void getWeekBuyRate(AdminAcceptData acceptData,String callback, String channelArray, String startTime, String endTime, Integer orderNum,
         PrintWriter out) {
      if (StringUtil.isNullOrEmpty(startTime) || StringUtil.isNullOrEmpty(endTime)) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当周订单统计对应时间区域不能为空"));
         return;
      }
      List<String> channelList = null;
      if (channelArray != null && channelArray.trim().length() > 0) {
         Gson gson = new Gson();
         channelList = gson.fromJson(channelArray, new TypeToken<ArrayList<String>>() {
         }.getType());
      }
      if (channelList == null || channelList.size() == 0) {
         channelList = new ArrayList<String>();
         channelList.add("all");
      }
      if (orderNum < 1) {
         orderNum = 1;
      }
      try {
         Gson gson = new Gson();
         List<String> dateList = AdminUtils.getDateList(1, startTime, endTime, null);
         JSONArray line_list = new JSONArray();
         for (String channel : channelList) {
            List<Object> list = userInfoCountService.getWeekBuyRate(channel, startTime, endTime, orderNum,
                  dateList);
            if ("all".equalsIgnoreCase(channel)) {
               channel = "总计";
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", channel);
            innerList.put("data", gson.toJson(list));
            line_list.add(innerList);
         }
         JSONObject data = new JSONObject();
         data.put("xAxis_list", gson.toJson(dateList));
         data.put("line_list", line_list);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 获取金币排行榜
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param type
    * @param out
    */
   @RequestMapping(value = "getGoldTop")
   public void getGoldTop(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, Integer type, String key,
         PrintWriter out) {
      if (type == null) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("type不能为空"));
         return;
      }
      if (pageIndex == null)
         pageIndex = 1;
      if (pageSize == null)
         pageSize = 50;
      long count = 0;
      List<UserGoldCoinVO> list = null;
      if (type == 0) {
         count = userInfoCountService.countByHasGoldCoin(key);
         list = userInfoCountService.listByHasGoldCoin((pageIndex - 1) * pageSize, pageSize, key);
      } else if (type == 1 || type == 2) {
         count = userInfoCountService.countByUserGoldCoin(type, key);
         list = userInfoCountService.listByUserGoldCoin((pageIndex - 1) * pageSize, pageSize, type, key);
      }
      if (list == null)
         list = new ArrayList<>();
      int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
      JSONObject data = new JSONObject();
      data.put("pe", pe);
      data.put("list", list);
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    * 获取金币排行榜
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param out
    */
   @RequestMapping(value = "getGoldCoinRecord")
   public void getGoldCoinRecord(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, String key, PrintWriter out) {
      if (pageIndex == null)
         pageIndex = 1;
      if (pageSize == null)
         pageSize = 20;
      List<IntegralDetail> list = integralDetailService.listQuery((pageIndex - 1) * pageSize, pageSize, key);
      if (list == null || list.size() == 0) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无相关信息"));
         return;
      }
      for (IntegralDetail integralDetail : list) {
         Long uid = integralDetail.getUid();
         UserInfo userInfo = userInfoService.getUserById(uid);
         if (userInfo != null) {
            integralDetail.setNickName(userInfo.getNickName());
            integralDetail.setPortrait(userInfo.getPortrait());
         }
      }
      long count = integralDetailService.countQuery(key);
      int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
      GsonBuilder gsonBuilder = new GsonBuilder();
      gsonBuilder.serializeNulls();
      Gson gson = gsonBuilder.setDateFormat("yyyy/MM/dd HH:mm:ss").create();
      JSONObject data = new JSONObject();
      data.put("pe", pe);
      data.put("list", gson.toJson(list));
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param key       搜索:暂只提供uid
    * @param state     状态:
    * @param out
    */
   @RequestMapping(value = "queryVip")
   public void queryVip(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, String key, Integer state,
         PrintWriter out) {
      try {
         List<UserVIPInfo> list = userVIPInfoService.listQuery(pageIndex, pageSize, key, state);
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         long count = userVIPInfoService.countQuery(key, state);
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder();
         gsonBuilder.serializeNulls();
         Gson gson = gsonBuilder.setDateFormat("yyyy/MM/dd HH:mm:ss").create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", gson.toJson(list));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 超级会员升级通过
    *
    * @param callback
    * @param id
    * @param out
    * @param request
    */
   @RequestSerializableByKey(key = "'passVIP-' +#id")
   @RequestMapping(value = "passVIP")
   public void passVIP(AdminAcceptData acceptData,String callback, Long id, PrintWriter out, HttpServletRequest request) {
      try {
         /* 检验是否登陆 */
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。"));
            return;
         }
         userVIPInfoService.passVIPApply(id);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("操作成功"));
         LogHelper.userInfo(
               "[ip:" + IPUtil.getRemotIP(request) + "]" + admin.getName() + "通过了[id=" + id + "]的升级超级会员申请!");
      } catch (UserVIPInfoException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
         return;
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
         return;
      }
   }
   /**
    * 超级会员升级拒绝
    *
    * @param callback
    * @param id
    * @param reason
    * @param out
    * @param request
    */
   @RequestMapping(value = "rejectVIP")
   public void rejectVIP(AdminAcceptData acceptData,String callback, Long id, String reason, PrintWriter out, HttpServletRequest request) {
      try {
         /* 检验是否登陆 */
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆"));
            return;
         }
         userVIPInfoService.rejectVIPApply(id, reason);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("拒绝成功"));
         LogHelper.userInfo("[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 拒绝提现id=" + id
               + "的升级超级会员申请不存在!");
      } catch (UserVIPInfoException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
         return;
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
         return;
      }
   }
   /**
    * 用户账户明细
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param id
    * @param out
    */
   @RequestMapping(value = "getMoneyDetails")
   public void getMoneyDetails(AdminAcceptData acceptData,String callback, Integer pageIndex, String key, Integer keyType, PrintWriter out) {
      if (pageIndex == null) {
         pageIndex = 1;
      }
      int pageSize = Constant.PAGE_SIZE;
      try {
         List<UserMoneyDetail> list = userMoneyDetailService.listQuery(pageIndex, pageSize, key, keyType);
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         for (UserMoneyDetail detail : list) {
            UserInfo userInfo = detail.getUserInfo();
            if (userInfo == null) {
               detail.setUserInfo(new UserInfo());
               continue;
            }
            UserInfo user = userInfoService.selectByPKey(userInfo.getId());
            if (user != null) {
               detail.setUserInfo(user);
            }
         }
         long count = userMoneyDetailService.countQuery(key, keyType);
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss");
         gsonBuilder.registerTypeAdapter(UserMoneyDetailTypeEnum.class,
               new JsonSerializer<UserMoneyDetailTypeEnum>() {
                  @Override
                  public JsonElement serialize(UserMoneyDetailTypeEnum value, Type theType,
                        JsonSerializationContext context) {
                     if (value == null) {
                        return new JsonPrimitive("");
                     } else {
                        return new JsonPrimitive(value.getDesc());
                     }
                  }
               });
         Gson gson = gsonBuilder.create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", gson.toJson(list));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
      }
   }
}
package com.yeshi.fanli.controller.admin;
import java.io.PrintWriter;
import java.lang.reflect.Type;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import com.yeshi.fanli.entity.accept.AdminAcceptData;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.yeshi.utils.IPUtil;
import org.yeshi.utils.JsonUtil;
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.google.gson.reflect.TypeToken;
import com.yeshi.fanli.controller.admin.utils.AdminUtils;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.entity.admin.count.CountUserInfo;
import com.yeshi.fanli.entity.bus.user.BindingAccount;
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode;
import com.yeshi.fanli.entity.bus.user.ForbiddenUserIdentifyCode.ForbiddenUserIdentifyCodeTypeEnum;
import com.yeshi.fanli.entity.bus.user.ThreeSale;
import com.yeshi.fanli.entity.bus.user.UserActiveLog;
import com.yeshi.fanli.entity.bus.user.UserExtraTaoBaoInfo;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.bus.user.UserInviteValidNum;
import com.yeshi.fanli.entity.bus.user.UserRank;
import com.yeshi.fanli.entity.bus.user.vip.TearcherInfo;
import com.yeshi.fanli.entity.bus.user.vip.UserVIPInfo;
import com.yeshi.fanli.entity.common.AdminUser;
import com.yeshi.fanli.entity.integral.IntegralDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
import com.yeshi.fanli.exception.user.ForbiddenUserIdentifyCodeException;
import com.yeshi.fanli.exception.user.vip.UserVIPInfoException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.count.UserInfoCountService;
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.ExtractService;
import com.yeshi.fanli.service.inter.order.HongBaoV2Service;
import com.yeshi.fanli.service.inter.user.ForbiddenUserIdentifyCodeService;
import com.yeshi.fanli.service.inter.user.UserAccountService;
import com.yeshi.fanli.service.inter.user.UserActiveLogService;
import com.yeshi.fanli.service.inter.user.UserInfoDeleteRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.service.inter.user.UserInfoService;
import com.yeshi.fanli.service.inter.user.UserRankService;
import com.yeshi.fanli.service.inter.user.integral.IntegralDetailService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleDetailService;
import com.yeshi.fanli.service.inter.user.invite.ThreeSaleSerivce;
import com.yeshi.fanli.service.inter.user.invite.UserInviteValidNumService;
import com.yeshi.fanli.service.inter.user.tb.UserExtraTaoBaoInfoService;
import com.yeshi.fanli.service.inter.user.vip.TearcherService;
import com.yeshi.fanli.service.inter.user.vip.UserVIPInfoService;
import com.yeshi.common.entity.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import org.yeshi.utils.TimeUtil;
import com.yeshi.fanli.util.annotation.RequestSerializableByKey;
import com.yeshi.fanli.vo.user.UserGoldCoinVO;
import com.yeshi.fanli.vo.user.UserInfoVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("admin/new/api/v1/user")
public class UserInfoAdminController {
   @Resource
   private UserInfoService userInfoService;
   @Resource
   private ThreeSaleSerivce threeSaleService;
   @Resource
   private BindingAccountService bindingAccountService;
   @Resource
   private UserInfoCountService userInfoCountService;
   @Resource
   private ForbiddenUserIdentifyCodeService forbiddenUserIdentifyCodeService;
   @Resource
   private UserExtraTaoBaoInfoService userExtraTaoBaoInfoService;
   @Resource
   private UserInfoExtraService userInfoExtraService;
   @Resource
   private UserRankService userRankService;
   @Resource
   private UserMoneyDetailService userMoneyDetailService;
   @Resource
   private UserInfoDeleteRecordService userInfoDeleteRecordService;
   @Resource
   private UserAccountService userAccountService;
   @Resource
   private UserActiveLogService userActiveLogService;
   @Resource
   private UserVIPInfoService userVIPInfoService;
   @Resource
   private IntegralDetailService integralDetailService;
   @Resource
   private UserInviteValidNumService userInviteValidNumService;
   @Resource
   private ThreeSaleSerivce threeSaleSerivce;
   @Resource
   private ExtractService extractService;
   @Resource
   private HongBaoV2Service hongBaoV2Service;
   @Resource
   private TearcherService tearcherService;
   @Resource
   private ThreeSaleDetailService threeSaleDetailService;
   @Resource
   private HongBaoV2CountService hongBaoV2CountService;
   /**
    * 查询用户信息列表 正常用户/异常用户
    *
    * @param callback
    * @param pageIndex
    * @param key       查询条件
    * @param userType  用户类型:金冠、银冠、铜冠
    * @param days      查询天数
    * @param startTime 注册时间
    * @param endTime   注册时间
    * @param orderMode 排序方式 订单数量 今日订单 累计队员
    * @param out
    */
   @RequestMapping(value = "query")
   public void query(AdminAcceptData acceptData, String callback, Integer pageIndex, Integer pageSize, String key, Integer keyType, Integer rank,
                 Integer userType, Integer days, String startTime, String endTime, Integer orderMode, Integer type,
                 String level, Integer activeCode, PrintWriter out) {
      try {
         if (type == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户类型type不能为空"));
            return;
         }
         if (pageIndex == null)
            pageIndex = 1;
         if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
         Integer orderField = null;
         if (orderMode != null) {
            if (orderMode == 1 || orderMode == 2) {
               orderField = orderMode;
               orderMode = 1;
            } else if (orderMode == 3 || orderMode == 4) {
               orderField = orderMode;
               orderMode = 2;
            } else if (orderMode == 5 || orderMode == 6) {
               orderField = orderMode;
               orderMode = 3;
            }
         }
         String userRank = null;
         if (rank != null) {
            switch (rank) {
            case 1:
               userRank = "青铜";
               break;
            case 2:
               userRank = "白银";
               break;
            case 3:
               userRank = "黄金";
               break;
            case 4:
               userRank = "铂金";
               break;
            default:
               break;
            }
         }
         List<UserInfoVO> userList = userInfoService.query((pageIndex - 1) * pageSize, pageSize, type, key, keyType,
               userRank, days, startTime, endTime, orderField, orderMode, userType, level, activeCode,acceptData.getSystem());
         if (userList == null || userList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无相关数据"));
            return;
         }
         long count = userInfoService.queryCount(type, key, keyType, userRank, days, startTime, endTime, userType,
               level, activeCode,acceptData.getSystem());
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder();
         gsonBuilder.serializeNulls();
         Gson gson = gsonBuilder.create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("resultList", gson.toJson(userList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 用户基础信息查询
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param key
    * @param keyType
    * @param rank
    * @param userType
    * @param days
    * @param startTime
    * @param endTime
    * @param type
    * @param level
    * @param activeCode
    * @param out
    */
   @RequestMapping(value = "queryInfo")
   public void queryInfo(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, String key, Integer keyType,
         Integer rank, Integer userType, Integer days, String startTime, String endTime, Integer state, String level,
         Integer activeCode, PrintWriter out) {
      try {
         if (pageIndex == null)
            pageIndex = 1;
         if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
         String userRank = null;
         if (rank != null) {
            switch (rank) {
            case 1:
               userRank = "青铜";
               break;
            case 2:
               userRank = "白银";
               break;
            case 3:
               userRank = "黄金";
               break;
            case 4:
               userRank = "铂金";
               break;
            default:
               break;
            }
         }
         List<UserInfoVO> userList = userInfoService.queryInfo((pageIndex - 1) * pageSize, pageSize, state, key,
               keyType, userRank, days, startTime, endTime, userType, level, activeCode,acceptData.getSystem());
         if (userList == null || userList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无相关数据"));
            return;
         }
         long count = userInfoService.countInfo(state, key, keyType, userRank, days, startTime, endTime, userType,
               level, activeCode,acceptData.getSystem());
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder();
         gsonBuilder.serializeNulls();
         Gson gson = gsonBuilder.create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("resultList", gson.toJson(userList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 资金统计
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "statisticsMoney")
   public void statisticsMoney(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      try {
         UserInfo user = userInfoService.getUserByIdWithMybatis(uid);
         if (user == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户ID不存在"));
            return;
         }
         Date minDate = null;
         Date maxDate = null;
         long timeStamp = System.currentTimeMillis();
         Calendar calendar = Calendar.getInstance();
         calendar.setTimeInMillis(timeStamp);
         List<UserMoneyDetailTypeEnum> typeList = new ArrayList<>();
         typeList.add(UserMoneyDetailTypeEnum.extract);
         typeList.add(UserMoneyDetailTypeEnum.extractNew);
         typeList.add(UserMoneyDetailTypeEnum.extractVerify);
         typeList.add(UserMoneyDetailTypeEnum.extractVerifyNew);
         typeList.add(UserMoneyDetailTypeEnum.extractReject);
         typeList.add(UserMoneyDetailTypeEnum.extractAutoWX);
         minDate = new Date(0L);
         maxDate = new Date(timeStamp);
         // 累计成功提现
         BigDecimal totalExtractMoney = userMoneyDetailService
               .statisticUserTypeMoneyWithDate(uid, typeList, minDate, maxDate, 1).abs();
         // 提现中金额
         BigDecimal extractingMoney = extractService.sumVerifyingMoney(uid);
         // 全部未到账
         minDate = new Date(0);
         maxDate = new Date(timeStamp);
         BigDecimal unRecievedMoney = hongBaoV2Service.getUnRecievedMoneyWithCreateTime(uid, minDate, maxDate);
         JSONObject data = new JSONObject();
         data.put("totalExtractMoney", totalExtractMoney);
         data.put("extractingMoney", extractingMoney);
         data.put("balanceMoney", user.getMyHongBao());
         data.put("unRecievedMoney", unRecievedMoney);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 权益统计
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "statisticsGoldCoin")
   public void statisticsEquity(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      try {
         int goldCoin = 0;
         UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
         if (userInfoExtra != null) {
            goldCoin = userInfoExtra.getGoldCoin();
         }
         JSONObject data = new JSONObject();
         data.put("goldCoin", goldCoin);
         data.put("exchangeGoldCoin", new BigDecimal(integralDetailService.sumUseGoldCoin(uid)).abs());
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
    /**
     * 用户粉丝统计
     * @param acceptData
     * @param callback
     * @param uid
     * @param out
     */
   @RequestMapping(value = "countTeamFans")
   public void countTeamFans(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      JSONObject data = new JSONObject();
      // 导师
      String tearcherName = "";
      TearcherInfo tearcherInfo = tearcherService.selectByUid(uid);
      if (tearcherInfo != null) {
         tearcherName = tearcherInfo.getNickName();
      }
      data.put("tearcherName", tearcherName);
      // 邀请人
      String bossName = "";
      UserInfo boss = threeSaleSerivce.getBoss(uid);
      if (boss != null) {
         bossName = boss.getNickName();
      }
      data.put("bossName", bossName);
      // 邀请粉丝
      int doneFirst = 0;
      int doneSecond = 0;
      UserInviteValidNum userInviteValidNum = userInviteValidNumService.selectByPrimaryKey(uid);
      if (userInviteValidNum != null) {
         doneFirst = userInviteValidNum.getNumFirst() == null ? 0 : userInviteValidNum.getNumFirst();
         doneSecond = userInviteValidNum.getNumSecond() == null ? 0 : userInviteValidNum.getNumSecond();
      }
      data.put("doneFirst", doneFirst);
      data.put("doneSecond", doneSecond);
      // 九代粉丝数量
      data.put("nineFans", threeSaleDetailService.countByBossUidAndMaxLevel(uid, 9));
      // 有效粉丝
      data.put("first", threeSaleSerivce.countFirstTeam(uid));
      data.put("second", threeSaleSerivce.countSecondTeam(uid));
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    * 用户详细信息
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getInfoDetail")
   public void getInfoDetail(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      UserInfo user = userInfoService.selectByPKey(uid);
      UserInfoVO userInfoVO = new UserInfoVO();
      userInfoVO.setId(uid);
      userInfoVO.setPhone(user.getPhone());
      userInfoVO.setState(user.getState());
      userInfoVO.setCreatetime(user.getCreatetime());
      UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
      if (userInfoExtra != null) {
         if (!StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
            userInfoVO.setMark(userInfoExtra.getMark());
         }
         userInfoVO.setInviteCode(userInfoExtra.getInviteCode());
         userInfoVO.setInviteCodeVip(userInfoExtra.getInviteCodeVip());
         userInfoVO.setWxId(userInfoExtra.getWeiXin());
      }
      // 最近一次下单时间
      Date lastOrderTime = hongBaoV2CountService.getLastHongBaoTime(uid);
      if (lastOrderTime != null) {
         userInfoVO.setLastOrderTime(lastOrderTime.getTime());
      }
      // 最近登录时间
      UserActiveLog userActiveLog = userActiveLogService.getUserLatestActiveInfo(uid);
      if (userActiveLog != null) {
         userInfoVO.setLastLoginTime(userActiveLog.getCreateTime().getTime());
      }
      // 显示用户微信 淘宝 老版本存在
      String wxId = userInfoVO.getWxId();
      if (wxId == null) {
         userInfoVO.setWxId("");
      }
      // 是否绑定支付宝(购买 + 分享权限)
      UserExtraTaoBaoInfo extraTaoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
      if (extraTaoBaoInfo != null) {
         String taoBaoUid = extraTaoBaoInfo.getTaoBaoUid();
         String specialId = extraTaoBaoInfo.getSpecialId();
         String relationId = extraTaoBaoInfo.getRelationId();
         if (StringUtil.isNullOrEmpty(taoBaoUid) || StringUtil.isNullOrEmpty(specialId)
               || StringUtil.isNullOrEmpty(relationId)) {
            userInfoVO.setTbName(null);
            userInfoVO.setTaoBaoUid(null);
         } else {
            userInfoVO.setTbName(extraTaoBaoInfo.getTaoBaoNickName());
            userInfoVO.setTaoBaoUid(extraTaoBaoInfo.getTaoBaoUid());
         }
      }
      /* 绑定收款账号信息 */
      List<BindingAccount> account = bindingAccountService.getBindingAccountByUid(uid);
      if (account != null && account.size() > 0) {
         BindingAccount bindingAccount = account.get(0);
         Integer type = bindingAccount.getType();
         if (type != null && type == 1) {
            // 支付宝
            userInfoVO.setAccountAlipay(bindingAccount.getAccount());
            userInfoVO.setAccountName(bindingAccount.getName());
            userInfoVO.setAccountBindId(bindingAccount.getId());
         } else if (type != null && type == 2) {
            // 微信
            userInfoVO.setAccountWX(bindingAccount.getAccount());
            userInfoVO.setAccountNameWX(bindingAccount.getName());
            userInfoVO.setAccountBindIdWX(bindingAccount.getId());
         }
      }
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(userInfoVO));
   }
   /**
    *  绑定详情
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "getBindDetail")
   public void getBindDetail(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      UserInfo user = userInfoService.selectByPKey(uid);
      JSONObject data = new JSONObject();
      Integer state = user.getState();
      if (state == UserInfo.STATE_NORMAL) {
         data.put("stateDesc", "正常");
      } else if (state == UserInfo.STATE_DELETE) {
         data.put("stateDesc", "已删除");
      } else if (state == UserInfo.STATE_FORBIDDEN) {
         data.put("stateDesc", "已封禁");
      } else if (state == UserInfo.STATE_DELETE_OUT_OF_DATE) {
         data.put("stateDesc",  "长期未登录删除");
      }
      data.put("state", state);
      data.put("phone", user.getPhone());
      // 微信授权
      String wxUnionId = user.getWxUnionId();
      if(StringUtil.isNullOrEmpty(wxUnionId)) {
         data.put("wxName", "");
         data.put("wxState", false);
      } else {
         data.put("wxName", user.getWxName());
         data.put("wxnState", true);
      }
      String mark = "";
      UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
      if (userInfoExtra != null) {
         if (!StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
            mark = userInfoExtra.getMark();
         }
      }
      data.put("mark", mark);
      // 淘宝授权
      String tbName = "";
      boolean tbState = false;
      UserExtraTaoBaoInfo extraTaoBaoInfo = userExtraTaoBaoInfoService.getByUid(uid);
      if (extraTaoBaoInfo != null) {
         String taoBaoUid = extraTaoBaoInfo.getTaoBaoUid();
         String specialId = extraTaoBaoInfo.getSpecialId();
         String relationId = extraTaoBaoInfo.getRelationId();
         if (!StringUtil.isNullOrEmpty(taoBaoUid) && StringUtil.isNullOrEmpty(specialId) && StringUtil.isNullOrEmpty(relationId)) {
            tbState = true;
            tbName = extraTaoBaoInfo.getTaoBaoNickName();
         }
      }
      data.put("tbName", tbName);
      data.put("tbState", tbState);
      /* 绑定收款账号信息 */
      String accountName = "";
      boolean accountState = false;
      List<BindingAccount> account = bindingAccountService.getBindingAccountByUid(uid);
      if (account != null && account.size() > 0) {
         BindingAccount bindingAccount = account.get(0);
         Integer type = bindingAccount.getType();
         // 支付宝
         if (type != null && type == 1) {
            accountState = true;
            accountName = bindingAccount.getAccount();
         }
      }
      data.put("account", accountName);
      data.put("accountState", accountState);
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    * 统计今日用户总情况
    *
    * @param callback
    * @param out
    */
   @RequestMapping(value = "countInfo")
   public void countInfo(AdminAcceptData acceptData,String callback, PrintWriter out) {
      try {
         // 累计用户数量
         long totalUser = userInfoCountService.countNewUser(null, null);
         // 流失用户数量(180天未使用登录并且无任何资金流动的账号数量)
         long loseUser = userInfoCountService.countLoseUser(180);
         // 累计有购买用户数
         long orderUser = userInfoCountService.countHasOrderUser();
         // 总数-普通用户
         long countNormal = 0;
         // 总数-铜用户
         long countCuprum = 0;
         // 总数-银用户
         long countSilver = 0;
         // 总数-金用户
         long countGold = 0;
         List<UserRank> listRank = userRankService.getAllRank();
         if (listRank != null && listRank.size() > 0) {
            for (UserRank userRank : listRank) {
               Long id = userRank.getId();
               String name = userRank.getName();
               if ("青铜".equals(name)) {
                  continue;
               }
               long count = userInfoExtraService.countByRankId(id);
               if ("白银".equals(name)) {
                  countCuprum = count;
               } else if ("黄金".equals(name)) {
                  countSilver = count;
               } else if ("铂金".equals(name)) {
                  countGold = count;
               }
            }
         }
         // 普通用户计算
         countNormal = totalUser - (countCuprum + countSilver + countGold);
         JSONObject data = new JSONObject();
         data.put("totalUser", totalUser);
         data.put("loseUser", loseUser);
         data.put("orderUser", orderUser);
         data.put("countNormal", countNormal);
         data.put("countCuprum", countCuprum);
         data.put("countSilver", countSilver);
         data.put("countGold", countGold);
         /*
          * // 统计所有总金额 BigDecimal countTotalMoney =
          * userInfoCountService.countAllMoney(null);
          *
          * // 统计所有可提现金额 String minMoney = configService.get(Constant.EXTRACT_MIN_MONEY);
          * if (minMoney == null) { minMoney = "20"; } double min =
          * Double.parseDouble(minMoney); BigDecimal countCanAssets =
          * userInfoCountService.countAllMoney(min); data.put("countTotalMoney",
          * countTotalMoney); data.put("countCanAssets", countCanAssets);
          */
         // 今日新增用户数量
         long todayUser = userInfoCountService.countNewUser(1, null);
         // 本月新增用户数量
         long monthUser = userInfoCountService.countNewUser(null, 1);
         data.put("todayUser", todayUser);
         data.put("monthUser", monthUser);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
    /**
     *
     * @param acceptData
     * @param callback
     * @param uid
     * @param typeArray
     * @param out
     */
   @RequestMapping("unBindUserInfo")
   public void unBindUserInfo(AdminAcceptData acceptData,String callback, Long uid, String typeArray, PrintWriter out) {
      try {
         if (typeArray == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("没有可更改的内容"));
            return;
         }
         Gson gson = new Gson();
         List<Integer> list = gson.fromJson(typeArray, new TypeToken<ArrayList<Integer>>() {
         }.getType());
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("没有可更改的内容"));
            return;
         }
         if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户id不能为空"));
            return;
         }
         UserInfo find = userInfoService.getUserById(uid);
         if (find == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户被封禁或不存在"));
            return;
         }
         for (Integer type : list) {
            String openid = find.getOpenid();
            String wxUnionId = find.getWxUnionId();
            String phone = find.getPhone();
            if (1 == type) {
               if (StringUtil.isNullOrEmpty(openid)) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定淘宝!"));
                  return;
               } else {
                  userInfoService.deleteBindInfo(find, type);
               }
            } else if (2 == type) {
               if (StringUtil.isNullOrEmpty(wxUnionId)) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定微信!"));
                  return;
               } else {
                  userInfoService.deleteBindInfo(find, type);
               }
            } else if (3 == type) {
               if (StringUtil.isNullOrEmpty(phone)) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定手机号!"));
                  return;
               } else {
                  userInfoService.deleteBindInfo(find, type);
               }
            } else if (4 == type) {
               // 查询支付宝绑定
               BindingAccount account = bindingAccountService.getBindingAccountByUidAndType(uid,
                     BindingAccount.TYPE_ALIPAY);
               if (account == null) {
                  JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前用户未绑定支付宝!"));
                  return;
               } else {
                  bindingAccountService.deleteBindingAccount(account);
               }
            } else {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("账户类型不匹配!"));
               return;
            }
         }
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("解绑成功"));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 修改用户备注
    *
    * @param callback
    * @param uid
    * @param mark
    * @param out
    */
   @RequestMapping("addUserMark")
   public void addUserMark(AdminAcceptData acceptData,String callback, Long uid, String mark, PrintWriter out) {
      try {
         if (uid == null || uid <= 0 || StringUtil.isNullOrEmpty(mark))
            return;
         UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(uid);
         if (userInfoExtra == null)
            return;
         UserInfoExtra updateExtra = new UserInfoExtra();
         updateExtra.setId(userInfoExtra.getId());
         updateExtra.setMark(mark);
         userInfoExtraService.saveUserInfoExtra(updateExtra);
      } catch (Exception e) {
         e.printStackTrace();
      }
   }
   /**
    * 删除用户-改变其状态
    *
    * @param callback
    * @param idArray
    * @param out
    */
   @RequestMapping(value = "deleteUser")
   public void delete(AdminAcceptData acceptData,String callback, String idArray, HttpServletRequest request, PrintWriter out) {
      try {
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。")));
            return;
         }
         if (StringUtil.isNullOrEmpty(idArray)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请选择操作的数据"));
            return;
         }
         Gson gson = new Gson();
         List<Long> list = gson.fromJson(idArray, new TypeToken<ArrayList<Long>>() {
         }.getType());
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("未检测到删除的数据"));
            return;
         }
         for (Long id : list) {
            UserInfo user = new UserInfo(id);
            user.setState(UserInfo.STATE_DELETE);
            user.setStateDesc(admin.getId() + " " + admin.getName() + "后台手动删除");
            userInfoService.updateByPrimaryKeySelective(user);
         }
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("成功删除"));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("删除失败"));
         e.printStackTrace();
      }
   }
   /**
    * 封禁用户ID
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "forbiddenUser")
   public void forbiddenUser(AdminAcceptData acceptData,String callback, Long uid, HttpServletRequest request, PrintWriter out) {
      try {
         if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请传递正确数据"));
            return;
         }
         UserInfo currentInfo = userInfoService.selectByPKey(uid);
         if (currentInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户已不存在"));
            return;
         }
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("登录失效,请登录"));
            return;
         }
         String reason = "后台封禁,操作人:" + admin.getId() + "-" + admin.getName();
         userAccountService.forbiddenUserAll(uid, reason);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("用户封禁成功"));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
      }
   }
   /**
    * 解除封禁用户ID
    *
    * @param callback
    * @param uid
    * @param out
    */
   @RequestMapping(value = "relieveForbiddenUser")
   public void relieveForbiddenUser(AdminAcceptData acceptData,String callback, Long uid, PrintWriter out) {
      try {
         if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请传递正确数据"));
            return;
         }
         UserInfo currentInfo = userInfoService.selectByPKey(uid);
         if (currentInfo == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户已不存在"));
            return;
         }
         currentInfo.setState(UserInfo.STATE_NORMAL);
         currentInfo.setStateDesc("管理员已解封");
         userInfoService.updateByPrimaryKeySelective(currentInfo);
         // 解封微信
         ForbiddenUserIdentifyCode forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService
               .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.wxUnionId, currentInfo.getWxUnionId());
         if (forbiddenUserIdentifyCode != null)
            forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
         // 解封手机
         forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService
               .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.phone, currentInfo.getPhone());
         if (forbiddenUserIdentifyCode != null)
            forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
         // 解封淘宝
         UserExtraTaoBaoInfo taoBao = userExtraTaoBaoInfoService.getByUid(uid);
         if (taoBao != null && !StringUtil.isNullOrEmpty(taoBao.getTaoBaoUid())) {
            forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService
                  .listByTypeAndIdentifyCode(ForbiddenUserIdentifyCodeTypeEnum.taobaoUid, taoBao.getTaoBaoUid());
            if (forbiddenUserIdentifyCode != null)
               forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
         }
         // 解封支付宝
         List<BindingAccount> list = bindingAccountService.getBindingAccountByUid(uid);
         if (list != null) {
            for (BindingAccount ba : list) {
               forbiddenUserIdentifyCode = forbiddenUserIdentifyCodeService.listByTypeAndIdentifyCode(
                     ForbiddenUserIdentifyCodeTypeEnum.alipayAccount, ba.getAccount());
               if (forbiddenUserIdentifyCode != null)
                  forbiddenUserIdentifyCodeService.delete(forbiddenUserIdentifyCode);
            }
         }
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("用户解封成功"));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
      }
   }
   /**
    * 用户账号- 封禁/解封
    *
    * @param callback
    * @param code
    * @param type     1("微信unionId"), 2("淘宝ID"), 3("手机号"), 4("支付宝账号");
    * @param out
    */
   @RequestMapping(value = "saveForbiddenInfo")
   public void saveForbiddenInfo(AdminAcceptData acceptData,String callback, String code, Integer type, PrintWriter out) {
      try {
         if (code == null || code.trim().length() == 0 || type == null || "NULL".equalsIgnoreCase(code)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("参数不能为空"));
            return;
         }
         forbiddenUserIdentifyCodeService.saveForbiddenInfo(code, type);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("修改成功"));
      } catch (ForbiddenUserIdentifyCodeException e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
      }
   }
   /**
    * 队员关系
    *
    * @param pageIndex
    * @param state
    * @param startTime
    * @param endTime
    * @param out
    */
   @RequestMapping(value = "getRelationList")
   public void getRelationList(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, Long uid, Integer type,
         Integer state, String startTime, String endTime, Integer validState, PrintWriter out) {
      if (pageIndex == null || pageIndex < 1) {
         pageIndex = 1;
      }
      if (pageSize == null || pageSize < 1) {
         pageSize = Constant.PAGE_SIZE;
      }
      try {
         if (!StringUtil.isNullOrEmpty(endTime)) {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date enddate = sdf.parse(endTime);
            Calendar c = Calendar.getInstance();
            c.setTime(enddate);
            c.add(Calendar.DAY_OF_MONTH, 1);// 今天+1天
            endTime = sdf.format(c.getTime());
         }
         List<ThreeSale> listQuery = null;
         if (type == 0) {
            // 上级用户
            if (uid == null) {
               JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询上级需输入用户id"));
               return;
            }
            listQuery = threeSaleService.listSuperiorQuery((pageIndex - 1) * pageSize, pageSize, state, uid);
         } else if (type == 1) {
            // 一级用户
            listQuery = threeSaleService.listFirstTeamQuery((pageIndex - 1) * pageSize, pageSize, uid, state,
                  startTime, endTime, validState);
         } else if (type == 2) {
            // 二级用户
            listQuery = threeSaleService.listSecondTeamQuery((pageIndex - 1) * pageSize, pageSize, uid, state,
                  startTime, endTime, validState);
         }
         if (listQuery == null || listQuery.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         for (ThreeSale threeSale : listQuery) {
            // 用户信息
            UserInfo boss = threeSale.getBoss();
            threeSale.setBoss(userInfoService.selectByPKey(boss.getId()));
            UserInfo worker = threeSale.getWorker();
            threeSale.setWorker(userInfoService.selectByPKey(worker.getId()));
            Integer expire = threeSale.getExpire();
            if (threeSale.getState()) {
               threeSale.setExpire(1); // 邀请成功
            } else {
               if (expire != null && expire == 1) {
                  threeSale.setExpire(2); // 邀请失效
               } else {
                  threeSale.setExpire(0);// 已邀请
               }
            }
         }
         long count = 0;
         if (type == 0) {
            // 上级用户
            count = threeSaleService.countSuperiorQuery(state, uid);
         } else if (type == 1) {
            // 一级用户
            count = threeSaleService.countFirstTeamQuery(uid, state, startTime, endTime, validState);
         } else if (type == 2) {
            // 二级用户
            count = threeSaleService.countSecondTeamQuery(uid, state, startTime, endTime, validState);
         }
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", listQuery);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
         e.printStackTrace();
      }
   }
   /**
    * 用户账户明细
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param out
    */
   @RequestMapping(value = "getAccountDetails")
   public void getAccountDetails(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, Long uid, PrintWriter out) {
      if (pageIndex == null || pageIndex < 1) {
         pageIndex = 1;
      }
      if (pageSize == null || pageSize < 1) {
         pageSize = Constant.PAGE_SIZE;
      }
      if (uid == null) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请传递正确数据"));
         return;
      }
      try {
         List<UserMoneyDetail> userMoneyDetailsList = userMoneyDetailService.listByUidWithState(uid, pageIndex,
               pageSize);
         if (userMoneyDetailsList == null || userMoneyDetailsList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         long count = userMoneyDetailService.countByUidWithState(uid);
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", gson.toJson(userMoneyDetailsList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
      }
   }
   /**
    * 根据渠道 统计当日新增用户数量
    *
    * @param channelArray 名字数组
    * @param dateType     类型 1日 2月 3年
    * @param year         2018
    * @param startTime    2018-12-01
    * @param endTime      2018-12-01
    * @param out
    */
   @RequestMapping(value = "getNewUserCharts")
   public void getNewUserCharts(AdminAcceptData acceptData,String callback, String channelArray, Integer dateType, String year, String startTime,
         String endTime, PrintWriter out) {
      try {
         String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
         if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
         }
         if (dateType != 1 && (!StringUtil.isNullOrEmpty(startTime) || !StringUtil.isNullOrEmpty(endTime))) {
            startTime = null;
            endTime = null;
         }
         Date beginDate = null;
         Date endDate = null;
         if (dateType == 1) {
            beginDate = TimeUtil.parse(startTime);
            endDate = TimeUtil.parse(endTime);
         } else if (dateType == 2) {
            Calendar calendar = Calendar.getInstance();
            int currentYear = calendar.get(Calendar.YEAR);
            if (!StringUtil.isNullOrEmpty(year)) {
               currentYear = Integer.parseInt(year);
            }
            calendar.clear();
            calendar.set(Calendar.YEAR, currentYear);
            beginDate = calendar.getTime();
            calendar.clear();
            calendar.set(Calendar.YEAR, currentYear);
            calendar.roll(Calendar.DAY_OF_YEAR, -1);
            endDate = calendar.getTime();
         } else if (dateType == 3) {
            beginDate = TimeUtil.parse("2018-01-01");
            endDate = new Date();
         }
         Gson gson = new Gson();
         List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
         // 渠道
         List<String> channelList = null;
         if (channelArray != null && channelArray.trim().length() > 0) {
            channelList = gson.fromJson(channelArray, new TypeToken<ArrayList<String>>() {
            }.getType());
         }
         JSONArray line_list = new JSONArray();
         if (channelList != null && channelList.size() > 0) {
            for (String channel : channelList) {
               List<Object> list = getNewUserData(dateList, dateType, beginDate, endDate, channel);
               JSONObject innerList = new JSONObject();
               innerList.put("name", channel);
               innerList.put("data", gson.toJson(list));
               line_list.add(innerList);
            }
         } else {
            List<Object> list = getNewUserData(dateList, dateType, beginDate, endDate, null);
            JSONObject innerList = new JSONObject();
            innerList.put("name", "全部");
            innerList.put("data", gson.toJson(list));
            line_list.add(innerList);
         }
         JSONObject data = new JSONObject();
         data.put("line_list", line_list);
         data.put("xAxis_list", gson.toJson(dateList));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
         e.printStackTrace();
      }
   }
   private List<Object> getNewUserData(List<String> dateList, Integer dateType, Date beginDate, Date endDate,
         String channel) {
      List<Object> list = new ArrayList<>();
      List<CountUserInfo> listHistory = userInfoCountService.getNewUserData(beginDate, endDate, channel);
      for (String date : dateList) {
         int value = 0;
         if (listHistory != null) {
            for (CountUserInfo history : listHistory) {
               if (dateType == 1) {
                  String gernalTime = TimeUtil.getGernalTime(history.getDay().getTime());
                  if (gernalTime.equalsIgnoreCase(date)) {
                     value += history.getNum();
                     continue;
                  }
               } else if (dateType == 2) {
                  String gernalTime = TimeUtil.getMonthOnlyMM(history.getDay());
                  if (gernalTime.startsWith("0")) {
                     gernalTime = gernalTime.substring(1, 2);
                  }
                  if (gernalTime.equalsIgnoreCase(date)) {
                     value += history.getNum();
                     continue;
                  }
               } else if (dateType == 3) {
                  String gernalTime = TimeUtil.getYearOnlyYYYY(history.getDay());
                  if (gernalTime.equalsIgnoreCase(date)) {
                     value += history.getNum();
                     continue;
                  }
               }
            }
         }
         list.add(value + "");
      }
      return list;
   }
   /**
    * 根据渠道 统计当日新增用户数量
    *
    * @param channelArray 名字数组
    * @param dateType     类型 1日 2月 3年
    * @param year         2018
    * @param startTime    2018-12-01
    * @param endTime      2018-12-01
    * @param out
    */
   @RequestMapping(value = "getTodayBuyRate")
   public void getTodayBuyRate(AdminAcceptData acceptData,String callback, String channelArray, Integer dateType, String year, String startTime,
         String endTime, Integer orderNum, PrintWriter out) {
      String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
      if (validateMsg != null) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
         return;
      }
      if (dateType == 2 && StringUtil.isNullOrEmpty(year)) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请输入年份"));
         return;
      }
      if (dateType != 1 && (!StringUtil.isNullOrEmpty(startTime) || !StringUtil.isNullOrEmpty(endTime))) {
         startTime = null;
         endTime = null;
      }
      List<String> channelList = null;
      if (channelArray != null && channelArray.trim().length() > 0) {
         Gson gson = new Gson();
         channelList = gson.fromJson(channelArray, new TypeToken<ArrayList<String>>() {
         }.getType());
      }
      if (channelList == null || channelList.size() == 0) {
         channelList = new ArrayList<String>();
         channelList.add("all");
      }
      if (dateType == 1 && year != null) {
         year = null; // 设置为空
      } else if (dateType == 2) {
         if (startTime != null)
            startTime = null;
         if (endTime != null)
            endTime = null;
      } else if (dateType == 3) {
         if (year != null)
            year = null;
         if (startTime != null)
            startTime = null;
         if (endTime != null)
            endTime = null;
      }
      try {
         Gson gson = new Gson();
         Object objectDate = null;
         List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
         JSONArray line_list = new JSONArray();
         for (String channel : channelList) {
            List<ChartTDO> list = userInfoCountService.getTodayBuyRate(channel, dateType, year, startTime, endTime);
            if ("all".equalsIgnoreCase(channel)) {
               channel = "总计";
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", channel);
            if (dateType != 3) {
               innerList.put("data", gson.toJson(AdminUtils.dayOrMonthDataFactory(dateType, dateList, list)));
            } else {
               // 年视图
               Map<String, Object> map = AdminUtils.yearsDataFactory(list);
               if (objectDate == null) {
                  objectDate = map.get("date");
               }
               innerList.put("data", gson.toJson(map.get("value")));
            }
            line_list.add(innerList);
         }
         JSONObject data = new JSONObject();
         if (objectDate != null) {
            data.put("xAxis_list", gson.toJson(objectDate));
         } else {
            data.put("xAxis_list", gson.toJson(dateList));
         }
         data.put("line_list", line_list);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 当周产生3单的新增用户概率
    *
    * @param callback
    * @param channelArray 渠道名称
    * @param startTime
    * @param endTime
    * @param orderNum     订单数量
    * @param out
    */
   @RequestMapping(value = "getWeekBuyRate")
   public void getWeekBuyRate(AdminAcceptData acceptData,String callback, String channelArray, String startTime, String endTime, Integer orderNum,
         PrintWriter out) {
      if (StringUtil.isNullOrEmpty(startTime) || StringUtil.isNullOrEmpty(endTime)) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当周订单统计对应时间区域不能为空"));
         return;
      }
      List<String> channelList = null;
      if (channelArray != null && channelArray.trim().length() > 0) {
         Gson gson = new Gson();
         channelList = gson.fromJson(channelArray, new TypeToken<ArrayList<String>>() {
         }.getType());
      }
      if (channelList == null || channelList.size() == 0) {
         channelList = new ArrayList<String>();
         channelList.add("all");
      }
      if (orderNum < 1) {
         orderNum = 1;
      }
      try {
         Gson gson = new Gson();
         List<String> dateList = AdminUtils.getDateList(1, startTime, endTime, null);
         JSONArray line_list = new JSONArray();
         for (String channel : channelList) {
            List<Object> list = userInfoCountService.getWeekBuyRate(channel, startTime, endTime, orderNum,
                  dateList);
            if ("all".equalsIgnoreCase(channel)) {
               channel = "总计";
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", channel);
            innerList.put("data", gson.toJson(list));
            line_list.add(innerList);
         }
         JSONObject data = new JSONObject();
         data.put("xAxis_list", gson.toJson(dateList));
         data.put("line_list", line_list);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 获取金币排行榜
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param type
    * @param out
    */
   @RequestMapping(value = "getGoldTop")
   public void getGoldTop(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, Integer type, String key,
         PrintWriter out) {
      if (type == null) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("type不能为空"));
         return;
      }
      if (pageIndex == null)
         pageIndex = 1;
      if (pageSize == null)
         pageSize = 50;
      long count = 0;
      List<UserGoldCoinVO> list = null;
      if (type == 0) {
         count = userInfoCountService.countByHasGoldCoin(key);
         list = userInfoCountService.listByHasGoldCoin((pageIndex - 1) * pageSize, pageSize, key);
      } else if (type == 1 || type == 2) {
         count = userInfoCountService.countByUserGoldCoin(type, key);
         list = userInfoCountService.listByUserGoldCoin((pageIndex - 1) * pageSize, pageSize, type, key);
      }
      if (list == null)
         list = new ArrayList<>();
      int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
      JSONObject data = new JSONObject();
      data.put("pe", pe);
      data.put("list", list);
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    * 获取金币排行榜
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param out
    */
   @RequestMapping(value = "getGoldCoinRecord")
   public void getGoldCoinRecord(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, String key, PrintWriter out) {
      if (pageIndex == null)
         pageIndex = 1;
      if (pageSize == null)
         pageSize = 20;
      List<IntegralDetail> list = integralDetailService.listQuery((pageIndex - 1) * pageSize, pageSize, key);
      if (list == null || list.size() == 0) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无相关信息"));
         return;
      }
      for (IntegralDetail integralDetail : list) {
         Long uid = integralDetail.getUid();
         UserInfo userInfo = userInfoService.getUserById(uid);
         if (userInfo != null) {
            integralDetail.setNickName(userInfo.getNickName());
            integralDetail.setPortrait(userInfo.getPortrait());
         }
      }
      long count = integralDetailService.countQuery(key);
      int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
      PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
      GsonBuilder gsonBuilder = new GsonBuilder();
      gsonBuilder.serializeNulls();
      Gson gson = gsonBuilder.setDateFormat("yyyy/MM/dd HH:mm:ss").create();
      JSONObject data = new JSONObject();
      data.put("pe", pe);
      data.put("list", gson.toJson(list));
      JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
   }
   /**
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param key       搜索:暂只提供uid
    * @param state     状态:
    * @param out
    */
   @RequestMapping(value = "queryVip")
   public void queryVip(AdminAcceptData acceptData,String callback, Integer pageIndex, Integer pageSize, String key, Integer state,
         PrintWriter out) {
      try {
         List<UserVIPInfo> list = userVIPInfoService.listQuery(pageIndex, pageSize, key, state);
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         long count = userVIPInfoService.countQuery(key, state);
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder();
         gsonBuilder.serializeNulls();
         Gson gson = gsonBuilder.setDateFormat("yyyy/MM/dd HH:mm:ss").create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", gson.toJson(list));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
         e.printStackTrace();
      }
   }
   /**
    * 超级会员升级通过
    *
    * @param callback
    * @param id
    * @param out
    * @param request
    */
   @RequestSerializableByKey(key = "'passVIP-' +#id")
   @RequestMapping(value = "passVIP")
   public void passVIP(AdminAcceptData acceptData,String callback, Long id, PrintWriter out, HttpServletRequest request) {
      try {
         /* 检验是否登陆 */
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。"));
            return;
         }
         userVIPInfoService.passVIPApply(id);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("操作成功"));
         LogHelper.userInfo(
               "[ip:" + IPUtil.getRemotIP(request) + "]" + admin.getName() + "通过了[id=" + id + "]的升级超级会员申请!");
      } catch (UserVIPInfoException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
         return;
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
         return;
      }
   }
   /**
    * 超级会员升级拒绝
    *
    * @param callback
    * @param id
    * @param reason
    * @param out
    * @param request
    */
   @RequestMapping(value = "rejectVIP")
   public void rejectVIP(AdminAcceptData acceptData,String callback, Long id, String reason, PrintWriter out, HttpServletRequest request) {
      try {
         /* 检验是否登陆 */
         AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
         if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆"));
            return;
         }
         userVIPInfoService.rejectVIPApply(id, reason);
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("拒绝成功"));
         LogHelper.userInfo("[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 拒绝提现id=" + id
               + "的升级超级会员申请不存在!");
      } catch (UserVIPInfoException e) {
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
         return;
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作失败"));
         return;
      }
   }
   /**
    * 用户账户明细
    *
    * @param callback
    * @param pageIndex
    * @param pageSize
    * @param id
    * @param out
    */
   @RequestMapping(value = "getMoneyDetails")
   public void getMoneyDetails(AdminAcceptData acceptData,String callback, Integer pageIndex, String key, Integer keyType, PrintWriter out) {
      if (pageIndex == null) {
         pageIndex = 1;
      }
      int pageSize = Constant.PAGE_SIZE;
      try {
         List<UserMoneyDetail> list = userMoneyDetailService.listQuery(pageIndex, pageSize, key, keyType);
         if (list == null || list.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
            return;
         }
         for (UserMoneyDetail detail : list) {
            UserInfo userInfo = detail.getUserInfo();
            if (userInfo == null) {
               detail.setUserInfo(new UserInfo());
               continue;
            }
            UserInfo user = userInfoService.selectByPKey(userInfo.getId());
            if (user != null) {
               detail.setUserInfo(user);
            }
         }
         long count = userMoneyDetailService.countQuery(key, keyType);
         int totalPage = (int) (count % pageSize == 0 ? count / pageSize : count / pageSize + 1);
         PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
         GsonBuilder gsonBuilder = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss");
         gsonBuilder.registerTypeAdapter(UserMoneyDetailTypeEnum.class,
               new JsonSerializer<UserMoneyDetailTypeEnum>() {
                  @Override
                  public JsonElement serialize(UserMoneyDetailTypeEnum value, Type theType,
                        JsonSerializationContext context) {
                     if (value == null) {
                        return new JsonPrimitive("");
                     } else {
                        return new JsonPrimitive(value.getDesc());
                     }
                  }
               });
         Gson gson = gsonBuilder.create();
         JSONObject data = new JSONObject();
         data.put("pe", pe);
         data.put("result_list", gson.toJson(list));
         JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
      } catch (Exception e) {
         e.printStackTrace();
         JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
      }
   }
}