Administrator
2020-02-25 fb6eb1e6b9df772d243b5ade8b9e3dd08028e935
刷单标识
10个文件已修改
12254 ■■■■ 已修改文件
fanli/src/main/java/com/yeshi/fanli/controller/admin/ExtractAdminController.java 2689 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/admin/OrderAdminController.java 1624 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/CommonOrderCountMapper.java 334 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/CommonOrderMapper.java 744 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/mapping/order/CommonOrderCountMapper.xml 654 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/mapping/order/CommonOrderMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/count/CommonOrderCountServiceImpl.java 665 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/impl/order/CommonOrderServiceImpl.java 4374 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/CommonOrderCountService.java 398 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/service/inter/order/CommonOrderService.java 758 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
fanli/src/main/java/com/yeshi/fanli/controller/admin/ExtractAdminController.java
@@ -1,1333 +1,1356 @@
package com.yeshi.fanli.controller.admin;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.ParseException;
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 javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.IPUtil;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.entity.wx.RedPackRecord;
import org.yeshi.utils.wx.WXRedPackUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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.Extract;
import com.yeshi.fanli.entity.bus.user.ExtractAuditRecord;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.common.AdminUser;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.ExtractException;
import com.yeshi.fanli.exception.NotExistObjectException;
import com.yeshi.fanli.exception.ObjectStateException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.AdminUserService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.count.UserInfoCountService;
import com.yeshi.fanli.service.inter.money.extract.ExtractAuditRecordService;
import com.yeshi.fanli.service.inter.money.extract.ExtractCountService;
import com.yeshi.fanli.service.inter.money.extract.ExtractService;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.service.inter.push.PushRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("admin/new/api/v1/extract")
public class ExtractAdminController {
    @Resource
    private ExtractService extractService;
    @Resource
    private ConfigService configService;
    @Resource
    private UserInfoCountService userInfoCountService;
    @Resource
    private ExtractCountService extractCountService;
    @Resource
    private PushRecordService pushRecordService;
    @Resource
    private PushController xingePushController;
    @Resource
    private ExtractAuditRecordService extractAuditRecordService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    @Resource
    private AdminUserService adminUserService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private TaoBaoOrderService taoBaoOrderService;
    @Resource
    private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
    @Resource
    private UserInfoExtraService userInfoExtraService;
    @Resource
    private CommonOrderCountService commonOrderCountService;
    /**
     *
     * 方法说明: 通过提现请求 可jsonP方式
     *
     * @param id
     * @param code
     *            验证码
     * @param out
     * @param request
     */
    @RequestMapping(value = "passExtractJP")
    public void passExtractJP(String callback, Long id, String code, PrintWriter out, HttpServletRequest request) {
        /* 检验是否登陆 */
        AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
        if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。"));
            return;
        }
        /* 检验是否通过验证 */
        String codeType = (String) request.getSession().getAttribute(Constant.SESSION_EXTRACT_VERIFY_RESULT);
        if (!"1".equals(codeType)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(3, "邮箱验证未通过"));
            return;
        }
        /* 允许提现 操作 */
        Integer integer = extractService.passExtract(id, admin);
        // 日志记录
        if (integer == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("已通过"));
            LogHelper
                    .userInfo("[ip:" + IPUtil.getRemotIP(request) + "]" + admin.getName() + "通过了[id=" + id + "]的提现申请!");
        } else if (integer == 1) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该提现记录已不存在,请刷新"));
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 同意提现id=" + id + "的提现申请不存在");
        } else {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户已被处理,请刷新"));
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 同意提现id=" + id + "的提现申请状态异常");
        }
    }
    /**
     *
     * 方法说明: 拒绝提现请求jsonP
     *
     * @author mawurui createTime 2018年3月14日 下午3:15:55
     * @param id
     * @param reason
     * @param out
     * @param request
     */
    @RequestMapping(value = "rejectExtractJP")
    public void rejectExtractJP(String callback, Long id, String code, String reason, PrintWriter out,
            HttpServletRequest request) {
        /* 检验是否登陆 */
        AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
        if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆"));
            return;
        }
        /* 检验是否通过验证 */
        String codeType = (String) request.getSession().getAttribute(Constant.SESSION_EXTRACT_VERIFY_RESULT);
        if (!"1".equals(codeType)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(3, "邮箱验证未通过"));
            return;
        }
        try {
            // 编码转换
            reason = URLDecoder.decode(reason, "UTF-8");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        try {
            extractService.rejectExtract(id, reason, admin);// 提现失败
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("拒绝成功"));
            LogHelper.userInfo("[ip:" + IPUtil.getRemotIP(request) + "]" + admin.getName() + "拒绝了[id=" + id
                    + "]的提现申请!拒绝原因是" + reason);
        } catch (ObjectStateException e) {
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 拒绝提现id=" + id + "的提现申请状态异常!"); //
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMessage()));
        } catch (NotExistObjectException e) {
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 拒绝提现id=" + id + "的提现申请不存在!");
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMessage()));
        }
    }
    /**
     * 获取今日提现记录:今日总额、总次数、成功次数、失败次数 获取系统提现记录:总额、总次数
     *
     * @param out
     */
    @RequestMapping(value = "countExtract")
    public void countExtract(String callback, PrintWriter out) {
        Map<String, Object> totalcount = extractCountService.getTodayCount();
        // 今日提现成功金额
        BigDecimal todayextractMoney = extractCountService.getTodayTotalSuccessMoney();
        // 当前用户余额总计:所有用户总余额
        BigDecimal amountMoney = userInfoCountService.countAllMoney(null);
        // 可提现金额限制
        String minMoney = configService.get(ConfigKeyEnum.extractMoneyMin.getKey());
        if (minMoney == null) {
            minMoney = "0";
        }
        // 当前可提现金额总计: 超过最低提现金额---计入统计
        BigDecimal extractApply = userInfoCountService.countAllMoney(Double.parseDouble(minMoney));
        // 累计已提现金额总计:已提现成功的总额/ 次数
        Map<String, Object> resultData = extractCountService.countTotalSuccess();
        JSONObject data = new JSONObject();
        data.put("todayCount", totalcount);
        data.put("todayextractMoney", todayextractMoney);
        data.put("amountMoney", amountMoney); // 所有用户总余额
        data.put("extractApply", extractApply); // 可提现金额总计
        data.put("extractNumber", resultData.get("totalamount")); // 提现成功次数
        data.put("extractMoney", resultData.get("totalmoney")); // 提现成功金额
        out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
    }
    /**
     * 查询所有审核记录信息
     *
     * @param callback
     * @param pageIndex
     * @param key
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getFinishRecordList")
    public void getFinishRecordList(String callback, Integer pageIndex, String key, String startTime, String endTime,
            PrintWriter out) {
        try {
            // 起始时间 为空设置默认值:
            if (StringUtil.isNullOrEmpty(startTime)) {
                startTime = "1970-01-01";
            }
            // 结束时间 为空设置默认值当前日期
            if (StringUtil.isNullOrEmpty(endTime)) {
                Date curDate = new Date();
                endTime = TimeUtil.getSimpleDate(curDate);
            }
            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());
            if (pageIndex == null)
                pageIndex = 1;
            int pageSize = Constant.PAGE_SIZE;
            List<ExtractAuditRecord> auditList = extractAuditRecordService.getList(pageIndex, pageSize, key, startTime,
                    endTime);
            int count = extractAuditRecordService.getCount(key, startTime, endTime);
            int totalPage = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
            PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
            if (auditList == null || auditList.size() == 0) {
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("暂无数据")));
            } else {
                for (ExtractAuditRecord extractAuditRecord : auditList) {
                    int countByUid = 0;
                    int countCancel = 0;
                    Extract extract = extractAuditRecord.getExtract();
                    if (extract != null) {
                        UserInfo userInfo = extract.getUserInfo();
                        Long id = userInfo.getId();
                        countByUid = hongBaoV2CountService.countNumberByUid(id);
                        countCancel = hongBaoV2CountService.countNumberByUidAndState(id, HongBaoV2.STATE_SHIXIAO);
                    }
                    extractAuditRecord.setCancelOrderNum((long) countCancel);
                    extractAuditRecord.setOrderNum((long) countByUid);
                }
                JSONObject data = new JSONObject();
                GsonBuilder gsonBuilder = new GsonBuilder();
                gsonBuilder.serializeNulls(); // 重点
                Gson gson = gsonBuilder.setDateFormat("yyyy/MM/dd HH:mm:ss").create();
                data.put("pe", pe);
                data.put("auditList", gson.toJson(auditList));
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
            }
        } catch (Exception e) {
            e.printStackTrace();
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("操作异常")));
        }
    }
    /**
     * 查询客服个人提现审批记录信息
     *
     * @param callback
     * @param pageIndex
     *            页码
     * @param key
     *            筛选条件
     * @param timeSlot
     *            查询时间段
     * @param state
     *            查看审核状态
     * @param out
     * @param request
     */
    @RequestMapping(value = "getMyAuditedList")
    public void getMyAuditedList(String callback, Integer pageIndex, String key, String timeSlot, Integer state,
            PrintWriter out, HttpServletRequest request) {
        try {
            // AdminUser admin = (AdminUser)
            // request.getSession().getAttribute(Constant.SESSION_ADMIN);
            // if (admin == null) {
            // JsonUtil.printMode(out, callback,
            // JsonUtil.loadFalseResult("当前账户失效,请重新登陆"));
            // return;
            // }
            int pageSize = Constant.PAGE_SIZE;
            Integer days = null;
            if ("1".equals(timeSlot)) {
                days = 0; // 今日
            } else if ("2".equals(timeSlot)) {
                days = 3; // 前3天
            } else if ("3".equals(timeSlot)) {
                days = 7; // 前7天
            }
            if (state != null && state != 0 && state != 1 && state != 2) {
                state = null;
            }
            // 查询当前人员的审核列表信息
            // Long adminId = admin.getId();
            // auditList =
            // extractAuditRecordService.getMyAuditedTimeSlotList(pageIndex,
            // pageSize, key,state, adminId, days);
            // count = extractAuditRecordService.getMyAuditedTimeSlotCount(key,
            // state, adminId,days);
            // 暂不区分账号,默认所有
            List<ExtractAuditRecord> auditList = extractAuditRecordService.getMyAuditedTimeSlotList(pageIndex, pageSize,
                    key, state, null, days);
            if (auditList == null || auditList.size() == 0) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
                return;
            }
            for (ExtractAuditRecord record : auditList) {
                AdminUser adminUser = record.getAdminUser();
                if (adminUser == null) {
                    record.setAdminUser(new AdminUser());
                }
                // 查询用户备注信息
                UserInfoExtra extra = userInfoExtraService.getUserInfoExtra(record.getExtract().getUserInfo().getId());
                if (extra != null) {
                    record.getExtract().getUserInfo().setStateDesc(extra.getMark());
                }
                int warnLevel = 0;
                Extract extract = record.getExtract();
                if (extract != null) {
                    Integer extractState = extract.getState();
                    if (extractState != null && extractState == Extract.STATE_NOT_PROCESS) {
                        UserInfo userInfo = extract.getUserInfo();
                        if (userInfo != null) {
                            BigDecimal countTodayMoney = extractService.sumTodayApplyMoney(userInfo.getId(),
                                    TimeUtil.getGernalTime(extract.getExtractTime()));
                            if (countTodayMoney.compareTo(new BigDecimal(100)) > 0) {
                                warnLevel = 1;
                            }
                        }
                    }
                }
                if (record.getExtraInfo() != null) {
                    StringBuffer desc = new StringBuffer();
                    if (System.currentTimeMillis() > TimeUtil.convertToTimeTemp("2019-06-21", "yyyy-MM-dd")) {
                        desc.append("大笔订单数:" + record.getExtraInfo().getOrderCount50More() + "\n#");
                        desc.append("维权订单数:" + record.getExtraInfo().getWeiQuanOrderCount() + "\n#");
                        desc.append("维权订单佣金:" + record.getExtraInfo().getWeiQuanOrderFanAmount() + "\n#");
                        if (record.getExtraInfo().getOrderCount50More() > 0
                                || record.getExtraInfo().getWeiQuanOrderCount() > 0
                                || record.getExtraInfo().getWeiQuanOrderFanAmount().compareTo(new BigDecimal(10)) >= 0)
                            warnLevel = 2;
                    } else {
                        if (record.getExtraInfo().getOrderCount50More() > 0
                                || record.getExtraInfo().getWeiQuanOrderCount() > 0
                                || record.getExtraInfo().getWeiQuanOrderFanAmount().compareTo(new BigDecimal(0)) > 0)
                            warnLevel = 2;
                        desc.append("大于50元订单:" + record.getExtraInfo().getOrderCount50More() + "\n#");
                        desc.append("维权订单数:" + record.getExtraInfo().getWeiQuanOrderCount() + "\n#");
                        desc.append("维权订单退回金额:" + record.getExtraInfo().getWeiQuanOrderFanAmount() + "\n#");
                        desc.append("180天安全订单数:" + record.getExtraInfo().getSafeOrderCount());
                    }
                    record.setExtraInfoStr(desc.toString());
                }
                // if (warnLevel == 0) {
                // // 查询同店铺商品,同商品订单超过一定数量的
                // List<Integer> typeList = new ArrayList<>();
                // typeList.add(HongBaoV2.TYPE_ZIGOU);
                // long sameGoodsOrderCount =
                // commonOrderCountService.countSameGoodsOrderByUidAndHongBaoType(typeList,
                // record.getExtract().getUserInfo().getId(),
                // Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameGoodsOrderCount.getKey())));
                // long sameShopOrderCount =
                // commonOrderCountService.countSameShopOrderByUidAndHongBaoType(typeList,
                // record.getExtract().getUserInfo().getId(),
                // Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameShopOrderCount.getKey())));
                // if (sameGoodsOrderCount > 0 || sameShopOrderCount > 0) {
                // warnLevel = 3;
                // record.setExtraInfoStr(
                // String.format("同店铺:%s 同商品:%s", sameShopOrderCount,
                // sameGoodsOrderCount));
                // }
                // }
                record.setWarnLevel(warnLevel);
            }
            int count = extractAuditRecordService.getMyAuditedTimeSlotCount(key, state, null, days);
            int totalPage = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
            PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.serializeNulls();
            gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss");
            Gson gson = gsonBuilder.create();
            JSONObject data = new JSONObject();
            data.put("pe", pe);
            data.put("list", gson.toJson(auditList));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            e.printStackTrace();
            out.print(JsonUtil.loadFalseResult(e.getMessage()));
        }
    }
    @RequestMapping(value = "getMyAuditedDanger")
    public void getMyAuditedDanger(String callback, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请登录"));
            return;
        }
        // 查询同店铺商品,同商品订单超过一定数量的
        List<Integer> typeList = new ArrayList<>();
        typeList.add(HongBaoV2.TYPE_ZIGOU);
        long sameGoodsOrderCount = commonOrderCountService.countSameGoodsOrderByUidAndHongBaoType(typeList, uid,
                Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameGoodsOrderCount.getKey())));
        long sameShopOrderCount = commonOrderCountService.countSameShopOrderByUidAndHongBaoType(typeList, uid,
                Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameShopOrderCount.getKey())));
        if (sameGoodsOrderCount > 0 || sameShopOrderCount > 0) {
            String text = (String.format("同店铺:%s 同商品:%s", sameShopOrderCount, sameGoodsOrderCount));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(text));
            return;
        }
        JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("店铺/商品无异常"));
    }
    /**
     * 获取今日提现记录:今日总额、总次数、成功次数、失败次数 获取系统提现记录:总额、总次数
     *
     * @param out
     */
    @RequestMapping(value = "getMyAuditedCount")
    public void getMyAuditedCount(String callback, HttpServletRequest request, PrintWriter out) {
        AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
        if (admin == null) {
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。")));
        } else {
            Long adminId = admin.getId();
            int taskToday = extractCountService.countTodayApply();
            // int countTodayComplete = extractService.countTodayComplete();
            // 今日累计处理数据
            int countToday = extractAuditRecordService.getMyAuditedCountToday(adminId);
            // 本周累计处理数据
            int countWeek = extractAuditRecordService.getMyAuditedCountWeek(adminId);
            // 本月累计处理数据
            int countMonth = extractAuditRecordService.getMyAuditedCountMonth(adminId);
            JSONObject data = new JSONObject();
            data.put("adminUser", admin);
            data.put("taskToday", taskToday);
            data.put("countToday", countToday);
            data.put("countWeek", countWeek);
            data.put("countMonth", countMonth);
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
        }
    }
    /**
     * 客服任务页面展示数据:传入提现申请id 则显示当前申请,若无id则显示客服任务下第一个申请数据
     *
     * @param callback
     * @param extractId
     *            提现id
     * @param request
     * @param out
     */
    @RequestMapping(value = "getIaskInfo")
    public void getIaskInfo(String callback, Long extractId, HttpServletRequest request, PrintWriter out) {
        try {
            String surplusTime = "";
            JSONObject data = new JSONObject();
            Extract extract = new Extract();
            AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
            if (admin == null) {
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。")));
                return;
            }
            if (extractId != null) {
                /* 传入提现申请id 查询前客服任务数据 */
                extract = extractService.selectByPrimaryKey(extractId);
                if (extract == null) {
                    out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前申请已不存在")));
                    return;
                }
                // 当前任务指定为该账户处理
                /*
                 * extract.setAdminId(admin.getId());
                 * extractService.updateByPrimaryKeySelective(extract);
                 */
                BigDecimal beforeMoney = null;
                List<ExtractAuditRecord> records = extractAuditRecordService.getbyExtractId(extract.getId());
                if (records != null && records.size() > 0) {
                    ExtractAuditRecord extractAuditRecord = records.get(0);
                    if (extractAuditRecord != null) {
                        beforeMoney = extractAuditRecord.getBeforeMoney();
                    }
                }
                Long extractTime = extract.getExtractTime();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date(extractTime);
                Calendar c = Calendar.getInstance();
                c.setTime(date);
                c.add(Calendar.DAY_OF_MONTH, 3);// 今天+3天
                Date todayTime = new Date();
                String formattodayTime = sdf.format(todayTime);
                String formatTime = sdf.format(c.getTime());
                long diff = sdf.parse(formatTime).getTime() - sdf.parse(formattodayTime).getTime();
                if (diff <= 0) {
                    surplusTime = "已超时";
                } else {
                    surplusTime = DateUtil.dateDiff(formattodayTime, formatTime);
                }
                String mark = "";
                UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(extract.getUserInfo().getId());
                if (userInfoExtra != null && !StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
                    mark = "警惕!! " + userInfoExtra.getMark();
                }
                data.put("mark", mark);
                data.put("extract", extract);
                data.put("beforeMoney", beforeMoney);
                data.put("surplusTime", surplusTime);
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
            } else {
                /* 未传入提现申请id 查询当前客服任务 中的第一个 数据 */
                boolean newTask = false;
                // 查询之前未处理完的任务
                extract = extractService.getMyTaskInfo(admin.getId());
                if (extract == null) {
                    // 新任务
                    extract = extractService.getNewTaskInfo();
                    if (extract != null)
                        newTask = true;
                }
                if (extract == null) {
                    out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("暂无用户提现申请")));
                } else {
                    if (newTask) {
                        // 当前任务指定为该账户处理
                        /*
                         * extract.setAdminId(admin.getId());
                         *
                         * extractService.updateByPrimaryKeySelective(extract);
                         */
                    }
                    BigDecimal beforeMoney = null;
                    List<ExtractAuditRecord> records = extractAuditRecordService.getbyExtractId(extract.getId());
                    if (records != null && records.size() > 0) {
                        ExtractAuditRecord extractAuditRecord = records.get(0);
                        if (extractAuditRecord != null) {
                            beforeMoney = extractAuditRecord.getBeforeMoney();
                        }
                    }
                    Long extractTime = extract.getExtractTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(extractTime);
                    Calendar c = Calendar.getInstance();
                    c.setTime(date);
                    c.add(Calendar.DAY_OF_MONTH, 3);// 今天+3天
                    Date todayTime = new Date();
                    String formattodayTime = sdf.format(todayTime);
                    String formatTime = sdf.format(c.getTime());
                    long diff = sdf.parse(formatTime).getTime() - sdf.parse(formattodayTime).getTime();
                    if (diff <= 0) {
                        surplusTime = "已超时";
                    } else {
                        surplusTime = DateUtil.dateDiff(formattodayTime, formatTime);
                    }
                    String mark = "";
                    UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(extract.getUserInfo().getId());
                    if (userInfoExtra != null && !StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
                        mark = "警惕!! " + userInfoExtra.getMark();
                    }
                    data.put("mark", mark);
                    data.put("extract", extract);
                    data.put("beforeMoney", beforeMoney);
                    data.put("surplusTime", surplusTime);
                    out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
                }
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 查询用户历史提现记录
     *
     * @param callback
     * @param pageIndex
     *            页码
     * @param key
     *            用户id
     * @param request
     * @param out
     */
    @RequestMapping(value = "getByUidList")
    public void getByUidList(String callback, Integer pageIndex, Long uid, HttpServletRequest request,
            PrintWriter out) {
        try {
            if (uid == null) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户不存在"));
                return;
            }
            if (pageIndex == null)
                pageIndex = 1;
            int pageSize = Constant.PAGE_SIZE;
            List<ExtractAuditRecord> list = extractAuditRecordService.getByUidList(pageIndex, pageSize, uid);
            if (list == null || list.size() == 0) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无提现记录"));
                return;
            }
            for (ExtractAuditRecord record : list) {
                if (record.getExtraInfo() != null) {
                    StringBuffer desc = new StringBuffer();
                    desc.append("大于50元订单:" + record.getExtraInfo().getOrderCount50More() + "\n#");
                    desc.append("维权订单数:" + record.getExtraInfo().getWeiQuanOrderCount() + "\n#");
                    desc.append("维权订单退回金额:" + record.getExtraInfo().getWeiQuanOrderFanAmount() + "\n#");
                    desc.append("180天安全订单数:" + record.getExtraInfo().getSafeOrderCount());
                    record.setExtraInfoStr(desc.toString());
                }
            }
            int count = extractAuditRecordService.getByUidCount(uid);
            int totalPage = 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("list", gson.toJson(list));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            // TODO: handle exception
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 数量统计
     *
     * @param callback
     * @param uid
     *            用户id
     * @param request
     * @param out
     */
    @RequestMapping(value = "countByUid")
    public void countByUid(String callback, Long uid, HttpServletRequest request, PrintWriter out) {
        try {
            // 统计已领取金额 账户历史总收益
            BigDecimal receiveMoneys = hongBaoV2CountService.countMoneyByUidAndState(uid, HongBaoV2.STATE_YILINGQU);
            if (receiveMoneys == null) {
                receiveMoneys = new BigDecimal(0);
            }
            // 历史提现成功金额
            double successMoneys = extractCountService.countSuccessMoneysByUid(uid);
            // 历史提现总次数、成功次数、失败次数
            Map<String, Object> map = extractCountService.countRecordsByUid(uid);
            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.serializeNulls();
            Gson gson = gsonBuilder.create();
            JSONObject data = new JSONObject();
            data.put("map", gson.toJson(map));
            data.put("successMoneys", gson.toJson(successMoneys));
            data.put("receiveMoneys", gson.toJson(receiveMoneys));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 校验用户资金是否异常
     *
     * @param uid
     * @param out
     */
    @RequestMapping(value = "checkMoney")
    public void checkMoney(String callback, String uid, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(uid)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("UID不能为空"));
            return;
        }
        try {
            extractService.checkExtract(Long.parseLong(uid));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("资金正常"));
        } catch (ExtractException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
    }
    /**
     * 统计审核次数
     *
     * @param callback
     * @param state
     *            审核状态:所有-3 通过-1 拒绝- 2
     * @param type
     *            统计类型 1-24小时 2-所有3
     * @param dateType
     *            类型 1日 2月 3年
     * @param year
     *            2018
     * @param startTime
     *            2018-12-01
     * @param endTime
     *            2018-12-01
     * @param out
     */
    @RequestMapping(value = "getAuditTotal")
    public void getAuditTotal(String callback, String stateArray, 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);
            String substring = stateArray.substring(1, stateArray.length()-1);
            List<Integer> channelList = null;
            if (stateArray != null && stateArray.trim().length() > 4) {
                channelList = gson.fromJson(stateArray, new TypeToken<ArrayList<Integer>>() {}.getType());
            }
            JSONArray line_list = new JSONArray();
            if (channelList != null && channelList.size() > 0) {
                for (Integer state : channelList) {
                    List<Object> list = getAuditData(dateList, dateType, beginDate, endDate, state);
                    String name = "";
                    if (state == 1) {
                        name = "通过";
                    } else if (state == 2) {
                        name = "驳回";
                    }
                    JSONObject innerList = new JSONObject();
                    innerList.put("name", name);
                    innerList.put("data", gson.toJson(list));
                    line_list.add(innerList);
                }
            } else {
                List<Object> list = getAuditData(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> getAuditData(List<String> dateList, Integer dateType, Date beginDate, Date endDate,
            Integer state) throws Exception{
        List<Object> list = new ArrayList<>();
        List<CountUserInfo> listHistory = extractAuditRecordService.getAuditCount(beginDate, endDate, state);
        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 callback
     * @param type
     *            统计类型 1-24小时 2-所有
     * @param dateType
     *            类型 1日 2月 3
     * @param year
     *            2018
     * @param startTime
     *            2018-12-01
     * @param endTime
     *            2018-12-01
     * @param out
     */
    @RequestMapping(value = "getExtractApplyMoney")
    public void getExtractApplyMoney(String callback, 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> list = new ArrayList<>();
            List<CountUserInfo> listHistory = extractAuditRecordService.getApplyMoney(beginDate, endDate);
            for (String date: dateList) {
                BigDecimal money = new BigDecimal("0");
                if (listHistory == null) {
                    list.add(money.toString());
                    continue;
                }
                for (CountUserInfo history: listHistory) {
                    if (dateType == 1) {
                        String gernalTime = TimeUtil.getGernalTime(history.getDay().getTime());
                        if (gernalTime.equalsIgnoreCase(date)) {
                            money = MoneyBigDecimalUtil.add(money, history.getMoney());
                            continue;
                        }
                    } else if (dateType == 2){
                        String gernalTime = TimeUtil.getMonthOnlyMM(history.getDay());
                        if(gernalTime.startsWith("0")) {
                            gernalTime = gernalTime.substring(1, 2);
                        }
                        if (gernalTime.equalsIgnoreCase(date)) {
                            money = MoneyBigDecimalUtil.add(money, history.getMoney());
                            continue;
                        }
                    } else if (dateType == 3) {
                        String gernalTime = TimeUtil.getYearOnlyYYYY(history.getDay());
                        if (gernalTime.equalsIgnoreCase(date)) {
                            money = MoneyBigDecimalUtil.add(money, history.getMoney());
                            continue;
                        }
                    }
                }
                list.add(money.toString());
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", "金额");
            innerList.put("data", gson.toJson(list));
            JSONArray line_list = new JSONArray();
            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 state
     *            所有-空值或者不传 待审核-0 通过-1 拒绝- 2
     * @param type
     *            统计类型 1-24小时 2-所有
     * @param dateType
     *            类型 1日 2月 3年
     * @param year
     *            2018
     * @param startTime
     *            2018-12-01
     * @param endTime
     *            2018-12-01
     * @param out
     */
    @RequestMapping(value = "getExtractApplyNumber")
    public void getExtractApplyNumber(String callback, Integer state, 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<Object> list = new ArrayList<>();
            List<CountUserInfo> listHistory = extractAuditRecordService.geApplyNumber(beginDate, endDate);
            for (String date: dateList) {
                int value = 0;
                if (listHistory == null) {
                    list.add(value + "");
                    continue;
                }
                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 + "");
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", "数量");
            innerList.put("data", gson.toJson(list));
            JSONArray line_list = new JSONArray();
            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();
        }
    }
    /**
     * 下载提现红包Openid
     *
     * @param callback
     * @param response
     * @param out
     */
    @RequestMapping(value = "downAutoExtractTxt")
    public void downAutoExtractTxt(String callback, HttpServletResponse response, PrintWriter out) {
        try {
            List<String> list = extractService.getAutoExtractOpenIds();
            if (list == null || list.size() <= 1) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无用户满足自动提现条件"));
                return;
            }
            String filepath = "自动提现OpenId " + java.lang.System.currentTimeMillis() + ".txt";
            response.reset();
            response.setContentType("application/octet-stream");
            String fileName = URLDecoder.decode(filepath, "utf-8");
            response.addHeader("Content-Disposition",
                    "attachment;" + "filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
            StringBuilder sb = new StringBuilder();
            for (String t : list) {
                sb.append(t + "\r\n");
            }
            String opid_str = sb.toString();
            if (!StringUtil.isNullOrEmpty(opid_str) && opid_str.endsWith("\r\n")) {
                opid_str = opid_str.substring(0, opid_str.length() - 2);
            }
            OutputStream os = response.getOutputStream();
            byte[] byt = opid_str.getBytes();
            os.write(byt);
            os.flush();
            os.close();
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 上传提现红包Excel
     *
     * @param file
     * @param out
     */
    @RequestMapping(value = "uploadExcel", method = RequestMethod.POST)
    public void uploadExcel(@RequestParam("file") CommonsMultipartFile file, PrintWriter out) {
        if (file == null) {
            out.print(JsonUtil.loadFalseResult("上传文件不能为空!"));
            return;
        }
        try {
            List<RedPackRecord> list = WXRedPackUtil.readCsv(file.getInputStream());
            extractService.updateManualExtractRecord(list);
            out.print(JsonUtil.loadTrueResult("上传成功"));
        } catch (ExtractException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            e.printStackTrace();
            out.print(JsonUtil.loadFalseResult("上传失败"));
        }
    }
    public static String getValue(String[] item,int index){
        if(item.length > index){
            String value = item[index];
            return value;
        }
        return "";
    }
    /**
     * 预览红包发生人
     *
     * @param callback
     * @param pageIndex
     * @param out
     */
    @RequestMapping(value = "preAutoUser")
    public void preAutoUser(String callback, Integer pageIndex, PrintWriter out) {
        try {
            List<UserInfo> list = extractService.preAutoUser();
            if (list == null || list.isEmpty()) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无用户满足自动提现条件"));
                return;
            }
            if (pageIndex == null || pageIndex < 1) {
                pageIndex = 1;
            }
            Integer pageSize = 100;
            if (pageSize == null || pageSize < 1) {
                pageSize = Constant.PAGE_SIZE;
            }
            int count = list.size();
            int totalPage = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
            PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
            List<UserInfo> listResult = null;
            if (pageIndex < totalPage) {
                int start = (pageIndex - 1) * pageSize;
                listResult = list.subList(start, start + pageSize);
            } else if (pageIndex == totalPage) {
                listResult = list.subList((pageIndex - 1) * pageSize, list.size());
            } else {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("没有更多了"));
                return;
            }
            JSONObject data = new JSONObject();
            data.put("pe", pe);
            data.put("result_list", listResult);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
}
package com.yeshi.fanli.controller.admin;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.net.URLEncoder;
import java.text.ParseException;
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 javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.commons.CommonsMultipartFile;
import org.yeshi.utils.DateUtil;
import org.yeshi.utils.IPUtil;
import org.yeshi.utils.JsonUtil;
import org.yeshi.utils.entity.wx.RedPackRecord;
import org.yeshi.utils.wx.WXRedPackUtil;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
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.Extract;
import com.yeshi.fanli.entity.bus.user.ExtractAuditRecord;
import com.yeshi.fanli.entity.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.bus.user.UserInfo;
import com.yeshi.fanli.entity.bus.user.UserInfoExtra;
import com.yeshi.fanli.entity.common.AdminUser;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.exception.ExtractException;
import com.yeshi.fanli.exception.NotExistObjectException;
import com.yeshi.fanli.exception.ObjectStateException;
import com.yeshi.fanli.log.LogHelper;
import com.yeshi.fanli.service.AdminUserService;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.count.UserInfoCountService;
import com.yeshi.fanli.service.inter.money.extract.ExtractAuditRecordService;
import com.yeshi.fanli.service.inter.money.extract.ExtractCountService;
import com.yeshi.fanli.service.inter.money.extract.ExtractService;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.service.inter.push.PushRecordService;
import com.yeshi.fanli.service.inter.user.UserInfoExtraService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.MoneyBigDecimalUtil;
import com.yeshi.fanli.util.RedisManager;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("admin/new/api/v1/extract")
public class ExtractAdminController {
    @Resource
    private ExtractService extractService;
    @Resource
    private ConfigService configService;
    @Resource
    private UserInfoCountService userInfoCountService;
    @Resource
    private ExtractCountService extractCountService;
    @Resource
    private PushRecordService pushRecordService;
    @Resource
    private PushController xingePushController;
    @Resource
    private ExtractAuditRecordService extractAuditRecordService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    @Resource
    private AdminUserService adminUserService;
    @Resource
    private RedisManager redisManager;
    @Resource
    private TaoBaoOrderService taoBaoOrderService;
    @Resource
    private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
    @Resource
    private UserInfoExtraService userInfoExtraService;
    @Resource
    private CommonOrderCountService commonOrderCountService;
    /**
     *
     * 方法说明: 通过提现请求 可jsonP方式
     *
     * @param id
     * @param code
     *            验证码
     * @param out
     * @param request
     */
    @RequestMapping(value = "passExtractJP")
    public void passExtractJP(String callback, Long id, String code, PrintWriter out, HttpServletRequest request) {
        /* 检验是否登陆 */
        AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
        if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。"));
            return;
        }
        /* 检验是否通过验证 */
        String codeType = (String) request.getSession().getAttribute(Constant.SESSION_EXTRACT_VERIFY_RESULT);
        if (!"1".equals(codeType)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(3, "邮箱验证未通过"));
            return;
        }
        /* 允许提现 操作 */
        Integer integer = extractService.passExtract(id, admin);
        // 日志记录
        if (integer == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("已通过"));
            LogHelper
                    .userInfo("[ip:" + IPUtil.getRemotIP(request) + "]" + admin.getName() + "通过了[id=" + id + "]的提现申请!");
        } else if (integer == 1) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该提现记录已不存在,请刷新"));
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 同意提现id=" + id + "的提现申请不存在");
        } else {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("该用户已被处理,请刷新"));
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 同意提现id=" + id + "的提现申请状态异常");
        }
    }
    /**
     *
     * 方法说明: 拒绝提现请求jsonP
     *
     * @author mawurui createTime 2018年3月14日 下午3:15:55
     * @param id
     * @param reason
     * @param out
     * @param request
     */
    @RequestMapping(value = "rejectExtractJP")
    public void rejectExtractJP(String callback, Long id, String code, String reason, PrintWriter out,
            HttpServletRequest request) {
        /* 检验是否登陆 */
        AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
        if (admin == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆"));
            return;
        }
        /* 检验是否通过验证 */
        String codeType = (String) request.getSession().getAttribute(Constant.SESSION_EXTRACT_VERIFY_RESULT);
        if (!"1".equals(codeType)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(3, "邮箱验证未通过"));
            return;
        }
        try {
            // 编码转换
            reason = URLDecoder.decode(reason, "UTF-8");
        } catch (Exception e1) {
            e1.printStackTrace();
        }
        try {
            extractService.rejectExtract(id, reason, admin);// 提现失败
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("拒绝成功"));
            LogHelper.userInfo("[ip:" + IPUtil.getRemotIP(request) + "]" + admin.getName() + "拒绝了[id=" + id
                    + "]的提现申请!拒绝原因是" + reason);
        } catch (ObjectStateException e) {
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 拒绝提现id=" + id + "的提现申请状态异常!"); //
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMessage()));
        } catch (NotExistObjectException e) {
            LogHelper.userInfo(
                    "[ip:" + IPUtil.getRemotIP(request) + "][管理员:" + admin.getName() + "] 拒绝提现id=" + id + "的提现申请不存在!");
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMessage()));
        }
    }
    /**
     * 获取今日提现记录:今日总额、总次数、成功次数、失败次数 获取系统提现记录:总额、总次数
     *
     * @param out
     */
    @RequestMapping(value = "countExtract")
    public void countExtract(String callback, PrintWriter out) {
        Map<String, Object> totalcount = extractCountService.getTodayCount();
        // 今日提现成功金额
        BigDecimal todayextractMoney = extractCountService.getTodayTotalSuccessMoney();
        // 当前用户余额总计:所有用户总余额
        BigDecimal amountMoney = userInfoCountService.countAllMoney(null);
        // 可提现金额限制
        String minMoney = configService.get(ConfigKeyEnum.extractMoneyMin.getKey());
        if (minMoney == null) {
            minMoney = "0";
        }
        // 当前可提现金额总计: 超过最低提现金额---计入统计
        BigDecimal extractApply = userInfoCountService.countAllMoney(Double.parseDouble(minMoney));
        // 累计已提现金额总计:已提现成功的总额/ 次数
        Map<String, Object> resultData = extractCountService.countTotalSuccess();
        JSONObject data = new JSONObject();
        data.put("todayCount", totalcount);
        data.put("todayextractMoney", todayextractMoney);
        data.put("amountMoney", amountMoney); // 所有用户总余额
        data.put("extractApply", extractApply); // 可提现金额总计
        data.put("extractNumber", resultData.get("totalamount")); // 提现成功次数
        data.put("extractMoney", resultData.get("totalmoney")); // 提现成功金额
        out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
    }
    /**
     * 查询所有审核记录信息
     *
     * @param callback
     * @param pageIndex
     * @param key
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getFinishRecordList")
    public void getFinishRecordList(String callback, Integer pageIndex, String key, String startTime, String endTime,
            PrintWriter out) {
        try {
            // 起始时间 为空设置默认值:
            if (StringUtil.isNullOrEmpty(startTime)) {
                startTime = "1970-01-01";
            }
            // 结束时间 为空设置默认值当前日期
            if (StringUtil.isNullOrEmpty(endTime)) {
                Date curDate = new Date();
                endTime = TimeUtil.getSimpleDate(curDate);
            }
            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());
            if (pageIndex == null)
                pageIndex = 1;
            int pageSize = Constant.PAGE_SIZE;
            List<ExtractAuditRecord> auditList = extractAuditRecordService.getList(pageIndex, pageSize, key, startTime,
                    endTime);
            int count = extractAuditRecordService.getCount(key, startTime, endTime);
            int totalPage = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
            PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
            if (auditList == null || auditList.size() == 0) {
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("暂无数据")));
            } else {
                for (ExtractAuditRecord extractAuditRecord : auditList) {
                    int countByUid = 0;
                    int countCancel = 0;
                    Extract extract = extractAuditRecord.getExtract();
                    if (extract != null) {
                        UserInfo userInfo = extract.getUserInfo();
                        Long id = userInfo.getId();
                        countByUid = hongBaoV2CountService.countNumberByUid(id);
                        countCancel = hongBaoV2CountService.countNumberByUidAndState(id, HongBaoV2.STATE_SHIXIAO);
                    }
                    extractAuditRecord.setCancelOrderNum((long) countCancel);
                    extractAuditRecord.setOrderNum((long) countByUid);
                }
                JSONObject data = new JSONObject();
                GsonBuilder gsonBuilder = new GsonBuilder();
                gsonBuilder.serializeNulls(); // 重点
                Gson gson = gsonBuilder.setDateFormat("yyyy/MM/dd HH:mm:ss").create();
                data.put("pe", pe);
                data.put("auditList", gson.toJson(auditList));
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
            }
        } catch (Exception e) {
            e.printStackTrace();
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("操作异常")));
        }
    }
    /**
     * 查询客服个人提现审批记录信息
     *
     * @param callback
     * @param pageIndex
     *            页码
     * @param key
     *            筛选条件
     * @param timeSlot
     *            查询时间段
     * @param state
     *            查看审核状态
     * @param out
     * @param request
     */
    @RequestMapping(value = "getMyAuditedList")
    public void getMyAuditedList(String callback, Integer pageIndex, String key, String timeSlot, Integer state,
            PrintWriter out, HttpServletRequest request) {
        try {
            // AdminUser admin = (AdminUser)
            // request.getSession().getAttribute(Constant.SESSION_ADMIN);
            // if (admin == null) {
            // JsonUtil.printMode(out, callback,
            // JsonUtil.loadFalseResult("当前账户失效,请重新登陆"));
            // return;
            // }
            int pageSize = Constant.PAGE_SIZE;
            Integer days = null;
            if ("1".equals(timeSlot)) {
                days = 0; // 今日
            } else if ("2".equals(timeSlot)) {
                days = 3; // 前3天
            } else if ("3".equals(timeSlot)) {
                days = 7; // 前7天
            }
            if (state != null && state != 0 && state != 1 && state != 2) {
                state = null;
            }
            // 查询当前人员的审核列表信息
            // Long adminId = admin.getId();
            // auditList =
            // extractAuditRecordService.getMyAuditedTimeSlotList(pageIndex,
            // pageSize, key,state, adminId, days);
            // count = extractAuditRecordService.getMyAuditedTimeSlotCount(key,
            // state, adminId,days);
            // 暂不区分账号,默认所有
            List<ExtractAuditRecord> auditList = extractAuditRecordService.getMyAuditedTimeSlotList(pageIndex, pageSize,
                    key, state, null, days);
            if (auditList == null || auditList.size() == 0) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无数据"));
                return;
            }
            for (ExtractAuditRecord record : auditList) {
                AdminUser adminUser = record.getAdminUser();
                if (adminUser == null) {
                    record.setAdminUser(new AdminUser());
                }
                // 查询用户备注信息
                UserInfoExtra extra = userInfoExtraService.getUserInfoExtra(record.getExtract().getUserInfo().getId());
                if (extra != null) {
                    record.getExtract().getUserInfo().setStateDesc(extra.getMark());
                }
                int warnLevel = 0;
                Extract extract = record.getExtract();
                if (extract != null) {
                    Integer extractState = extract.getState();
                    if (extractState != null && extractState == Extract.STATE_NOT_PROCESS) {
                        UserInfo userInfo = extract.getUserInfo();
                        if (userInfo != null) {
                            BigDecimal countTodayMoney = extractService.sumTodayApplyMoney(userInfo.getId(),
                                    TimeUtil.getGernalTime(extract.getExtractTime()));
                            if (countTodayMoney.compareTo(new BigDecimal(100)) > 0) {
                                warnLevel = 1;
                            }
                        }
                    }
                }
                if (record.getExtraInfo() != null) {
                    StringBuffer desc = new StringBuffer();
                    if (System.currentTimeMillis() > TimeUtil.convertToTimeTemp("2019-06-21", "yyyy-MM-dd")) {
                        desc.append("大笔订单数:" + record.getExtraInfo().getOrderCount50More() + "\n#");
                        desc.append("维权订单数:" + record.getExtraInfo().getWeiQuanOrderCount() + "\n#");
                        desc.append("维权订单佣金:" + record.getExtraInfo().getWeiQuanOrderFanAmount() + "\n#");
                        if (record.getExtraInfo().getOrderCount50More() > 0
                                || record.getExtraInfo().getWeiQuanOrderCount() > 0
                                || record.getExtraInfo().getWeiQuanOrderFanAmount().compareTo(new BigDecimal(10)) >= 0)
                            warnLevel = 2;
                    } else {
                        if (record.getExtraInfo().getOrderCount50More() > 0
                                || record.getExtraInfo().getWeiQuanOrderCount() > 0
                                || record.getExtraInfo().getWeiQuanOrderFanAmount().compareTo(new BigDecimal(0)) > 0)
                            warnLevel = 2;
                        desc.append("大于50元订单:" + record.getExtraInfo().getOrderCount50More() + "\n#");
                        desc.append("维权订单数:" + record.getExtraInfo().getWeiQuanOrderCount() + "\n#");
                        desc.append("维权订单退回金额:" + record.getExtraInfo().getWeiQuanOrderFanAmount() + "\n#");
                        desc.append("180天安全订单数:" + record.getExtraInfo().getSafeOrderCount());
                    }
                    Integer countOrder = commonOrderCountService.countOderByUidAndLess10(extract.getUserInfo().getId());
                    if (countOrder != null && countOrder > 10) {
                        desc.append("刷单嫌疑\n#");
                    }
                    record.setExtraInfoStr(desc.toString());
                }
                // if (warnLevel == 0) {
                // // 查询同店铺商品,同商品订单超过一定数量的
                // List<Integer> typeList = new ArrayList<>();
                // typeList.add(HongBaoV2.TYPE_ZIGOU);
                // long sameGoodsOrderCount =
                // commonOrderCountService.countSameGoodsOrderByUidAndHongBaoType(typeList,
                // record.getExtract().getUserInfo().getId(),
                // Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameGoodsOrderCount.getKey())));
                // long sameShopOrderCount =
                // commonOrderCountService.countSameShopOrderByUidAndHongBaoType(typeList,
                // record.getExtract().getUserInfo().getId(),
                // Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameShopOrderCount.getKey())));
                // if (sameGoodsOrderCount > 0 || sameShopOrderCount > 0) {
                // warnLevel = 3;
                // record.setExtraInfoStr(
                // String.format("同店铺:%s 同商品:%s", sameShopOrderCount,
                // sameGoodsOrderCount));
                // }
                // }
                record.setWarnLevel(warnLevel);
            }
            int count = extractAuditRecordService.getMyAuditedTimeSlotCount(key, state, null, days);
            int totalPage = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
            PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.serializeNulls();
            gsonBuilder.setDateFormat("yyyy-MM-dd HH:mm:ss");
            Gson gson = gsonBuilder.create();
            JSONObject data = new JSONObject();
            data.put("pe", pe);
            data.put("list", gson.toJson(auditList));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            e.printStackTrace();
            out.print(JsonUtil.loadFalseResult(e.getMessage()));
        }
    }
    @RequestMapping(value = "getMyAuditedDanger")
    public void getMyAuditedDanger(String callback, Long uid, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("请登录"));
            return;
        }
        // 查询同店铺商品,同商品订单超过一定数量的
        List<Integer> typeList = new ArrayList<>();
        typeList.add(HongBaoV2.TYPE_ZIGOU);
        long sameGoodsOrderCount = commonOrderCountService.countSameGoodsOrderByUidAndHongBaoType(typeList, uid,
                Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameGoodsOrderCount.getKey())));
        long sameShopOrderCount = commonOrderCountService.countSameShopOrderByUidAndHongBaoType(typeList, uid,
                Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameShopOrderCount.getKey())));
        if (sameGoodsOrderCount > 0 || sameShopOrderCount > 0) {
            String text = (String.format("同店铺:%s 同商品:%s", sameShopOrderCount, sameGoodsOrderCount));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(text));
            return;
        }
        JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("店铺/商品无异常"));
    }
    /**
     * 获取今日提现记录:今日总额、总次数、成功次数、失败次数 获取系统提现记录:总额、总次数
     *
     * @param out
     */
    @RequestMapping(value = "getMyAuditedCount")
    public void getMyAuditedCount(String callback, HttpServletRequest request, PrintWriter out) {
        AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
        if (admin == null) {
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。")));
        } else {
            Long adminId = admin.getId();
            int taskToday = extractCountService.countTodayApply();
            // int countTodayComplete = extractService.countTodayComplete();
            // 今日累计处理数据
            int countToday = extractAuditRecordService.getMyAuditedCountToday(adminId);
            // 本周累计处理数据
            int countWeek = extractAuditRecordService.getMyAuditedCountWeek(adminId);
            // 本月累计处理数据
            int countMonth = extractAuditRecordService.getMyAuditedCountMonth(adminId);
            JSONObject data = new JSONObject();
            data.put("adminUser", admin);
            data.put("taskToday", taskToday);
            data.put("countToday", countToday);
            data.put("countWeek", countWeek);
            data.put("countMonth", countMonth);
            out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
        }
    }
    /**
     * 客服任务页面展示数据:传入提现申请id 则显示当前申请,若无id则显示客服任务下第一个申请数据
     *
     * @param callback
     * @param extractId
     *            提现id
     * @param request
     * @param out
     */
    @RequestMapping(value = "getIaskInfo")
    public void getIaskInfo(String callback, Long extractId, HttpServletRequest request, PrintWriter out) {
        try {
            String surplusTime = "";
            JSONObject data = new JSONObject();
            Extract extract = new Extract();
            AdminUser admin = (AdminUser) request.getSession().getAttribute(Constant.SESSION_ADMIN);
            if (admin == null) {
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前账户失效,请重新登陆。")));
                return;
            }
            if (extractId != null) {
                /* 传入提现申请id 查询前客服任务数据 */
                extract = extractService.selectByPrimaryKey(extractId);
                if (extract == null) {
                    out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("当前申请已不存在")));
                    return;
                }
                // 当前任务指定为该账户处理
                /*
                 * extract.setAdminId(admin.getId());
                 * extractService.updateByPrimaryKeySelective(extract);
                 */
                BigDecimal beforeMoney = null;
                List<ExtractAuditRecord> records = extractAuditRecordService.getbyExtractId(extract.getId());
                if (records != null && records.size() > 0) {
                    ExtractAuditRecord extractAuditRecord = records.get(0);
                    if (extractAuditRecord != null) {
                        beforeMoney = extractAuditRecord.getBeforeMoney();
                    }
                }
                Long extractTime = extract.getExtractTime();
                SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                Date date = new Date(extractTime);
                Calendar c = Calendar.getInstance();
                c.setTime(date);
                c.add(Calendar.DAY_OF_MONTH, 3);// 今天+3天
                Date todayTime = new Date();
                String formattodayTime = sdf.format(todayTime);
                String formatTime = sdf.format(c.getTime());
                long diff = sdf.parse(formatTime).getTime() - sdf.parse(formattodayTime).getTime();
                if (diff <= 0) {
                    surplusTime = "已超时";
                } else {
                    surplusTime = DateUtil.dateDiff(formattodayTime, formatTime);
                }
                String mark = "";
                UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(extract.getUserInfo().getId());
                if (userInfoExtra != null && !StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
                    mark = "警惕!! " + userInfoExtra.getMark();
                }
                Integer countOrder = commonOrderCountService.countOderByUidAndLess10(extract.getUserInfo().getId());
                if (countOrder != null && countOrder > 10) {
                    if (StringUtil.isNullOrEmpty(mark)) {
                        mark = "刷单预警!!";
                    } else {
                        mark = mark + "     刷单预警!!";
                    }
                }
                data.put("mark", mark);
                data.put("extract", extract);
                data.put("beforeMoney", beforeMoney);
                data.put("surplusTime", surplusTime);
                out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
            } else {
                /* 未传入提现申请id 查询当前客服任务 中的第一个 数据 */
                boolean newTask = false;
                // 查询之前未处理完的任务
                extract = extractService.getMyTaskInfo(admin.getId());
                if (extract == null) {
                    // 新任务
                    extract = extractService.getNewTaskInfo();
                    if (extract != null)
                        newTask = true;
                }
                if (extract == null) {
                    out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadFalseResult("暂无用户提现申请")));
                } else {
                    if (newTask) {
                        // 当前任务指定为该账户处理
                        /*
                         * extract.setAdminId(admin.getId());
                         *
                         * extractService.updateByPrimaryKeySelective(extract);
                         */
                    }
                    BigDecimal beforeMoney = null;
                    List<ExtractAuditRecord> records = extractAuditRecordService.getbyExtractId(extract.getId());
                    if (records != null && records.size() > 0) {
                        ExtractAuditRecord extractAuditRecord = records.get(0);
                        if (extractAuditRecord != null) {
                            beforeMoney = extractAuditRecord.getBeforeMoney();
                        }
                    }
                    Long extractTime = extract.getExtractTime();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    Date date = new Date(extractTime);
                    Calendar c = Calendar.getInstance();
                    c.setTime(date);
                    c.add(Calendar.DAY_OF_MONTH, 3);// 今天+3天
                    Date todayTime = new Date();
                    String formattodayTime = sdf.format(todayTime);
                    String formatTime = sdf.format(c.getTime());
                    long diff = sdf.parse(formatTime).getTime() - sdf.parse(formattodayTime).getTime();
                    if (diff <= 0) {
                        surplusTime = "已超时";
                    } else {
                        surplusTime = DateUtil.dateDiff(formattodayTime, formatTime);
                    }
                    String mark = "";
                    UserInfoExtra userInfoExtra = userInfoExtraService.getUserInfoExtra(extract.getUserInfo().getId());
                    if (userInfoExtra != null && !StringUtil.isNullOrEmpty(userInfoExtra.getMark())) {
                        mark = "警惕!! " + userInfoExtra.getMark();
                    }
                    Integer countOrder = commonOrderCountService.countOderByUidAndLess10(extract.getUserInfo().getId());
                    if (countOrder != null && countOrder > 10) {
                        if (StringUtil.isNullOrEmpty(mark)) {
                            mark = "刷单预警!!";
                        } else {
                            mark = mark + "     刷单预警!!";
                        }
                    }
                    data.put("mark", mark);
                    data.put("extract", extract);
                    data.put("beforeMoney", beforeMoney);
                    data.put("surplusTime", surplusTime);
                    out.print(JsonUtil.loadJSONP(callback, JsonUtil.loadTrueResult(data)));
                }
            }
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    /**
     * 查询用户历史提现记录
     *
     * @param callback
     * @param pageIndex
     *            页码
     * @param key
     *            用户id
     * @param request
     * @param out
     */
    @RequestMapping(value = "getByUidList")
    public void getByUidList(String callback, Integer pageIndex, Long uid, HttpServletRequest request,
            PrintWriter out) {
        try {
            if (uid == null) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("用户不存在"));
                return;
            }
            if (pageIndex == null)
                pageIndex = 1;
            int pageSize = Constant.PAGE_SIZE;
            List<ExtractAuditRecord> list = extractAuditRecordService.getByUidList(pageIndex, pageSize, uid);
            if (list == null || list.size() == 0) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无提现记录"));
                return;
            }
            for (ExtractAuditRecord record : list) {
                if (record.getExtraInfo() != null) {
                    StringBuffer desc = new StringBuffer();
                    desc.append("大于50元订单:" + record.getExtraInfo().getOrderCount50More() + "\n#");
                    desc.append("维权订单数:" + record.getExtraInfo().getWeiQuanOrderCount() + "\n#");
                    desc.append("维权订单退回金额:" + record.getExtraInfo().getWeiQuanOrderFanAmount() + "\n#");
                    desc.append("180天安全订单数:" + record.getExtraInfo().getSafeOrderCount());
                    record.setExtraInfoStr(desc.toString());
                }
            }
            int count = extractAuditRecordService.getByUidCount(uid);
            int totalPage = 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("list", gson.toJson(list));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            // TODO: handle exception
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 数量统计
     *
     * @param callback
     * @param uid
     *            用户id
     * @param request
     * @param out
     */
    @RequestMapping(value = "countByUid")
    public void countByUid(String callback, Long uid, HttpServletRequest request, PrintWriter out) {
        try {
            // 统计已领取金额 账户历史总收益
            BigDecimal receiveMoneys = hongBaoV2CountService.countMoneyByUidAndState(uid, HongBaoV2.STATE_YILINGQU);
            if (receiveMoneys == null) {
                receiveMoneys = new BigDecimal(0);
            }
            // 历史提现成功金额
            double successMoneys = extractCountService.countSuccessMoneysByUid(uid);
            // 历史提现总次数、成功次数、失败次数
            Map<String, Object> map = extractCountService.countRecordsByUid(uid);
            GsonBuilder gsonBuilder = new GsonBuilder();
            gsonBuilder.serializeNulls();
            Gson gson = gsonBuilder.create();
            JSONObject data = new JSONObject();
            data.put("map", gson.toJson(map));
            data.put("successMoneys", gson.toJson(successMoneys));
            data.put("receiveMoneys", gson.toJson(receiveMoneys));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 校验用户资金是否异常
     *
     * @param uid
     * @param out
     */
    @RequestMapping(value = "checkMoney")
    public void checkMoney(String callback, String uid, PrintWriter out) {
        if (StringUtil.isNullOrEmpty(uid)) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("UID不能为空"));
            return;
        }
        try {
            extractService.checkExtract(Long.parseLong(uid));
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("资金正常"));
        } catch (ExtractException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        }
    }
    /**
     * 统计审核次数
     *
     * @param callback
     * @param state
     *            审核状态:所有-3 通过-1 拒绝- 2
     * @param type
     *            统计类型 1-24小时 2-所有3
     * @param dateType
     *            类型 1日 2月 3年
     * @param year
     *            2018
     * @param startTime
     *            2018-12-01
     * @param endTime
     *            2018-12-01
     * @param out
     */
    @RequestMapping(value = "getAuditTotal")
    public void getAuditTotal(String callback, String stateArray, 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);
            String substring = stateArray.substring(1, stateArray.length()-1);
            List<Integer> channelList = null;
            if (stateArray != null && stateArray.trim().length() > 4) {
                channelList = gson.fromJson(stateArray, new TypeToken<ArrayList<Integer>>() {}.getType());
            }
            JSONArray line_list = new JSONArray();
            if (channelList != null && channelList.size() > 0) {
                for (Integer state : channelList) {
                    List<Object> list = getAuditData(dateList, dateType, beginDate, endDate, state);
                    String name = "";
                    if (state == 1) {
                        name = "通过";
                    } else if (state == 2) {
                        name = "驳回";
                    }
                    JSONObject innerList = new JSONObject();
                    innerList.put("name", name);
                    innerList.put("data", gson.toJson(list));
                    line_list.add(innerList);
                }
            } else {
                List<Object> list = getAuditData(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> getAuditData(List<String> dateList, Integer dateType, Date beginDate, Date endDate,
            Integer state) throws Exception{
        List<Object> list = new ArrayList<>();
        List<CountUserInfo> listHistory = extractAuditRecordService.getAuditCount(beginDate, endDate, state);
        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 callback
     * @param type
     *            统计类型 1-24小时 2-所有
     * @param dateType
     *            类型 1日 2月 3
     * @param year
     *            2018
     * @param startTime
     *            2018-12-01
     * @param endTime
     *            2018-12-01
     * @param out
     */
    @RequestMapping(value = "getExtractApplyMoney")
    public void getExtractApplyMoney(String callback, 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> list = new ArrayList<>();
            List<CountUserInfo> listHistory = extractAuditRecordService.getApplyMoney(beginDate, endDate);
            for (String date: dateList) {
                BigDecimal money = new BigDecimal("0");
                if (listHistory == null) {
                    list.add(money.toString());
                    continue;
                }
                for (CountUserInfo history: listHistory) {
                    if (dateType == 1) {
                        String gernalTime = TimeUtil.getGernalTime(history.getDay().getTime());
                        if (gernalTime.equalsIgnoreCase(date)) {
                            money = MoneyBigDecimalUtil.add(money, history.getMoney());
                            continue;
                        }
                    } else if (dateType == 2){
                        String gernalTime = TimeUtil.getMonthOnlyMM(history.getDay());
                        if(gernalTime.startsWith("0")) {
                            gernalTime = gernalTime.substring(1, 2);
                        }
                        if (gernalTime.equalsIgnoreCase(date)) {
                            money = MoneyBigDecimalUtil.add(money, history.getMoney());
                            continue;
                        }
                    } else if (dateType == 3) {
                        String gernalTime = TimeUtil.getYearOnlyYYYY(history.getDay());
                        if (gernalTime.equalsIgnoreCase(date)) {
                            money = MoneyBigDecimalUtil.add(money, history.getMoney());
                            continue;
                        }
                    }
                }
                list.add(money.toString());
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", "金额");
            innerList.put("data", gson.toJson(list));
            JSONArray line_list = new JSONArray();
            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 state
     *            所有-空值或者不传 待审核-0 通过-1 拒绝- 2
     * @param type
     *            统计类型 1-24小时 2-所有
     * @param dateType
     *            类型 1日 2月 3年
     * @param year
     *            2018
     * @param startTime
     *            2018-12-01
     * @param endTime
     *            2018-12-01
     * @param out
     */
    @RequestMapping(value = "getExtractApplyNumber")
    public void getExtractApplyNumber(String callback, Integer state, 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<Object> list = new ArrayList<>();
            List<CountUserInfo> listHistory = extractAuditRecordService.geApplyNumber(beginDate, endDate);
            for (String date: dateList) {
                int value = 0;
                if (listHistory == null) {
                    list.add(value + "");
                    continue;
                }
                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 + "");
            }
            JSONObject innerList = new JSONObject();
            innerList.put("name", "数量");
            innerList.put("data", gson.toJson(list));
            JSONArray line_list = new JSONArray();
            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();
        }
    }
    /**
     * 下载提现红包Openid
     *
     * @param callback
     * @param response
     * @param out
     */
    @RequestMapping(value = "downAutoExtractTxt")
    public void downAutoExtractTxt(String callback, HttpServletResponse response, PrintWriter out) {
        try {
            List<String> list = extractService.getAutoExtractOpenIds();
            if (list == null || list.size() <= 1) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无用户满足自动提现条件"));
                return;
            }
            String filepath = "自动提现OpenId " + java.lang.System.currentTimeMillis() + ".txt";
            response.reset();
            response.setContentType("application/octet-stream");
            String fileName = URLDecoder.decode(filepath, "utf-8");
            response.addHeader("Content-Disposition",
                    "attachment;" + "filename=\"" + URLEncoder.encode(fileName, "utf-8") + "\"");
            StringBuilder sb = new StringBuilder();
            for (String t : list) {
                sb.append(t + "\r\n");
            }
            String opid_str = sb.toString();
            if (!StringUtil.isNullOrEmpty(opid_str) && opid_str.endsWith("\r\n")) {
                opid_str = opid_str.substring(0, opid_str.length() - 2);
            }
            OutputStream os = response.getOutputStream();
            byte[] byt = opid_str.getBytes();
            os.write(byt);
            os.flush();
            os.close();
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 上传提现红包Excel
     *
     * @param file
     * @param out
     */
    @RequestMapping(value = "uploadExcel", method = RequestMethod.POST)
    public void uploadExcel(@RequestParam("file") CommonsMultipartFile file, PrintWriter out) {
        if (file == null) {
            out.print(JsonUtil.loadFalseResult("上传文件不能为空!"));
            return;
        }
        try {
            List<RedPackRecord> list = WXRedPackUtil.readCsv(file.getInputStream());
            extractService.updateManualExtractRecord(list);
            out.print(JsonUtil.loadTrueResult("上传成功"));
        } catch (ExtractException e) {
            out.print(JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            e.printStackTrace();
            out.print(JsonUtil.loadFalseResult("上传失败"));
        }
    }
    public static String getValue(String[] item,int index){
        if(item.length > index){
            String value = item[index];
            return value;
        }
        return "";
    }
    /**
     * 预览红包发生人
     *
     * @param callback
     * @param pageIndex
     * @param out
     */
    @RequestMapping(value = "preAutoUser")
    public void preAutoUser(String callback, Integer pageIndex, PrintWriter out) {
        try {
            List<UserInfo> list = extractService.preAutoUser();
            if (list == null || list.isEmpty()) {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无用户满足自动提现条件"));
                return;
            }
            if (pageIndex == null || pageIndex < 1) {
                pageIndex = 1;
            }
            Integer pageSize = 100;
            if (pageSize == null || pageSize < 1) {
                pageSize = Constant.PAGE_SIZE;
            }
            int count = list.size();
            int totalPage = count % pageSize == 0 ? count / pageSize : count / pageSize + 1;
            PageEntity pe = new PageEntity(pageIndex, pageSize, count, totalPage);
            List<UserInfo> listResult = null;
            if (pageIndex < totalPage) {
                int start = (pageIndex - 1) * pageSize;
                listResult = list.subList(start, start + pageSize);
            } else if (pageIndex == totalPage) {
                listResult = list.subList((pageIndex - 1) * pageSize, list.size());
            } else {
                JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("没有更多了"));
                return;
            }
            JSONObject data = new JSONObject();
            data.put("pe", pe);
            data.put("result_list", listResult);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/controller/admin/OrderAdminController.java
@@ -1,812 +1,812 @@
package com.yeshi.fanli.controller.admin;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.yeshi.utils.JsonUtil;
import com.google.gson.Gson;
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.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.money.UserMoneyDebt;
import com.yeshi.fanli.entity.money.UserMoneyDebt.UserMoneyDebtTypeEnum;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.order.UserOrderWeiQuanRecord;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.order.CommonOrderException;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.count.TaoBaoOrderCountService;
import com.yeshi.fanli.service.inter.money.UserMoneyDebtService;
import com.yeshi.fanli.service.inter.money.UserMoneyDetailService;
import com.yeshi.fanli.service.inter.money.tb.TaoBaoWeiQuanDrawBackService;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.OrderProcessService;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.service.inter.order.UserOrderWeiQuanRecordService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.taobao.TaoBaoOrderUtil;
import com.yeshi.fanli.vo.order.CommonOrderVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("admin/new/api/v1/order")
public class OrderAdminController {
    @Resource
    private OrderService orderService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    @Resource
    private CommonOrderCountService commonOrderCountService;
    @Resource
    private CommonOrderService commonOrderService;
    @Resource
    private TaoBaoOrderService taoBaoOrderService;
    @Resource
    private TaoBaoOrderCountService taoBaoOrderCountService;
    @Resource
    private TaoBaoWeiQuanDrawBackService taoBaoWeiQuanDrawBackService;
    @Resource
    private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
    @Resource
    private UserMoneyDetailService userMoneyDetailService;
    @Resource
    private OrderProcessService orderProcessService;
    @Resource
    private HongBaoOrderService hongBaoOrderService;
    @Resource
    private UserMoneyDebtService userMoneyDebtService;
    @Resource
    private UserSystemCouponRecordService userSystemCouponRecordService;
    @Resource
    private ConfigService configService;
    @Resource
    private UserOrderWeiQuanRecordService userOrderWeiQuanRecordService;
    /**
     * 统计历史订单-淘宝订单
     *
     * @param callback
     * @param request
     * @param out
     */
    @RequestMapping(value = "countTaoBaoOrder")
    public void countTaoBaoOrder(String callback, HttpServletRequest request, PrintWriter out) {
        try {
            Map<String, Object> countByOdrerType = taoBaoOrderCountService.countByOdrerType();
            JSONObject data = new JSONObject();
            data.put("typeOrder", countByOdrerType);
            // 统计今日 未失效订单数量 相同订单号合并为一单
            int todayOrder = taoBaoOrderCountService.countToday();
            // 统计昨日 未失效订单数量 相同订单号合并为一单
            int yesterdayOrder = taoBaoOrderCountService.countYesterday();
            data.put("todayOrder", todayOrder);
            data.put("yesterdayOrder", yesterdayOrder);
            data.put("genzong", yesterdayOrder);
            data.put("yesterdayOrder", yesterdayOrder);
            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 uid
     * @param state
     * @param type
     * @param orderState
     * @param orderNo
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getUserOrderList")
    public void getUserOrderList(String callback, Integer pageIndex, Integer pageSize, Integer keyType, String key,
            Integer state, Integer type, Integer orderState, String startTime, String endTime, Integer sourceType,
            Integer riskType, PrintWriter out) {
        if (pageIndex == null || pageIndex < 1) {
            pageIndex = 1;
        }
        if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
        if (state != null && state == 0) {
            state = null;// 所有状态
        }
        if (type != null && type == 0) {
            type = null; // 所有类型订单
        }
        if (endTime != null && endTime.trim().length() > 0) {
            endTime += " 23:59:59";
        }
        try {
            Date minTime = null;
            BigDecimal money = null;
            List<Long> listShopId = null;
            List<Long> listGoodsId = null;
            // 风险
            if (riskType != null && !StringUtil.isNullOrEmpty(key) && keyType != null && keyType == 2) {
                long uid = Long.parseLong(key);
                // 查询同店铺商品,同商品订单超过一定数量的
                List<Integer> typeList = new ArrayList<>();
                typeList.add(HongBaoV2.TYPE_ZIGOU);
                if (riskType == 1) {
                    listGoodsId = commonOrderCountService.getSameGoodsOrderByUidAndHongBaoType(typeList, uid,
                            Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameGoodsOrderCount.getKey())));
                    if (listGoodsId == null || listGoodsId.isEmpty()) {
                        JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无同商品订单"));
                        return;
                    }
                } else if (riskType == 2) {
                    listShopId = commonOrderCountService.getSameShopOrderByUidAndHongBaoType(typeList, uid,
                            Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameShopOrderCount.getKey())));
                    if (listShopId == null || listShopId.isEmpty()) {
                        JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无同店铺订单"));
                        return;
                    }
                } else if (riskType == 3) {
                    money = new BigDecimal(100);
                    minTime = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 180L);
                }
            }
            // 查询列表
            List<CommonOrderVO> list = commonOrderService.listQuery((pageIndex - 1) * pageSize, pageSize, keyType, key,
                    state, type, orderState, startTime, endTime, sourceType, listShopId, listGoodsId, minTime, money);
            // 统计总数
            long count = commonOrderService.countQuery(keyType, key, state, type, orderState, startTime, endTime,
                    sourceType, listShopId, listGoodsId, minTime, money);
            // 查询是否维权
            for (CommonOrderVO order : list) {
                if (order.getUserId() == null)
                    continue;
                // 查询是否维权
                TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService.listByorderItemId(order.getTradeId());
                if (weiQuanOrder != null)// 有维权
                {
                    order.setWeiQuanState(weiQuanOrder.getState());
                    order.setState(CommonOrder.STATE_WQ);
                    TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackService.selectByOrderItemIdAndUid(
                            weiQuanOrder.getOrderItemId(), Long.parseLong(order.getUserId()));
                    if (drawBack != null) {// 已经退款
                        // 计算退款资金
                        UserMoneyDetail detail = null;
                        switch (order.getHongBaoType()) {
                        case 1:
                            detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                    UserMoneyDetailTypeEnum.fanliWeiQuan, Long.parseLong(order.getUserId()),
                                    drawBack.getId());
                            if (detail == null)
                                detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                        UserMoneyDetailTypeEnum.weiQuan, Long.parseLong(order.getUserId()),
                                        drawBack.getId());
                            break;
                        case 3:
                            detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                    UserMoneyDetailTypeEnum.inviteWeiQuan, Long.parseLong(order.getUserId()),
                                    drawBack.getId());
                            break;
                        case 2:
                            detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                    UserMoneyDetailTypeEnum.shareWeiQuan, Long.parseLong(order.getUserId()),
                                    drawBack.getId());
                            break;
                        }
                        if (detail != null) {
                            // 退款成功
                            order.setWeiQuanBackMoney(detail.getMoney().abs().toString());
                        } else {// 尚未退款
                            order.setWeiQuanBackMoney(drawBack.getDrawBackMoney().toString());
                            // 查询出对应的hongBaoId
                            CommonOrder commonOrder = commonOrderService.selectBySourceTypeAndTradeId(
                                    Constant.SOURCE_TYPE_TAOBAO, drawBack.getOrderItemId());
                            if (commonOrder != null) {
                                HongBaoOrder hongBaoOrder = hongBaoOrderService
                                        .selectDetailByCommonOrderId(commonOrder.getId());
                                if (hongBaoOrder != null) {
                                    UserMoneyDebt debt = userMoneyDebtService.selectByTypeAndSourceId(
                                            UserMoneyDebtTypeEnum.order, hongBaoOrder.getHongBaoV2().getId());
                                    if (debt != null && debt.getLeftMoney().compareTo(new BigDecimal(0)) > 0) {
                                        order.setWeiQuanBackMoney(
                                                new BigDecimal(0).subtract(debt.getLeftMoney()).toString());// 未扣除
                                    }
                                }
                            }
                        }
                    } else {// 尚未退款
                        UserOrderWeiQuanRecord record = userOrderWeiQuanRecordService.selectByOrderInfoAndUid(
                                Long.parseLong(order.getUserId()), weiQuanOrder.getOrderItemId(),
                                Constant.SOURCE_TYPE_TAOBAO);
                        if (record != null)
                            order.setWeiQuanBackMoney("-" + record.getMoney());
                        else {
                            order.setWeiQuanBackMoney("-" + order.getHongBao());
                        }
                    }
                }
            }
            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", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (CommonOrderException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
            e.printStackTrace();
        }
    }
    /**
     * 查询订单列表用户uid
     *
     * @param callback
     * @param pageIndex
     * @param pageSize
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param orderNo
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getHistoryOrder")
    public void getHistoryOrder(String callback, Integer pageIndex, Integer pageSize, Long uid, Integer state,
            Integer type, Integer orderState, String orderNo, String startTime, String endTime, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("uid不能为空"));
            return;
        }
        if (pageIndex == null || pageIndex < 1) {
            pageIndex = 1;
        }
        if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
        if (state != null && state == 0) {
            state = null;// 所有状态
        }
        if (type != null && type == 0) {
            type = null; // 所有类型订单
        }
        if (endTime != null && endTime.trim().length() > 0) {
            endTime += " 23:59:59";
        }
        try {
            long count = 0;
            // 查询列表
            List<CommonOrderVO> list = commonOrderService.listQueryByUid((pageIndex - 1) * pageSize, pageSize, uid,
                    state, type, orderState, orderNo, startTime, endTime, null);
            if (list != null && list.size() > 0) {
                // 统计总数
                count = commonOrderService.countQueryByUid(uid, state, type, orderState, orderNo, startTime, endTime,
                        null);
            }
            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", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (CommonOrderException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
            e.printStackTrace();
        }
    }
    /**
     * 统计提现申请总金额
     *
     * @param callback
     * @param channelArray
     *            渠道名 为空是统计所有
     * @param dateType
     *            显示视图:日-1 、月-2、 年-3
     * @param state
     *            状态: 1-未到账 2-已到账 3-已失效
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getHongBaoMoney")
    public void getHongBaoMoney(String callback, String channelArray, Integer dateType, Integer state, String year,
            String startTime, String endTime, PrintWriter out) {
        String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
        if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
        }
        try {
            JSONObject data = countHistoryHongBao(channelArray, dateType, state, year, startTime, endTime, 2);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
            e.printStackTrace();
        }
    }
    /**
     * 统计红包信息
     *
     * @param channelArray
     * @param dateType
     * @param state
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public JSONObject countHistoryHongBao(String channelArray, Integer dateType, Integer state, String year,
            String startTime, String endTime, int countType) throws Exception {
        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;
        }
        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 = null;
            if (countType == 1) {
                list = hongBaoV2CountService.countHongBaoNum(channel, dateType, state, year, startTime, endTime);
            } else if (countType == 2) {
                list = hongBaoV2CountService.countHongBaoMoney(channel, dateType, state, 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);
        return data;
    }
    /**
     * 分类型订单数与比例
     *
     * @param callback
     * @param dateType
     *            日 -1 月-2 年-3
     * @param type
     *            返利订单-1 分享订单-2 邀请订单-3
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getTypeNumber")
    public void getTypeNumber(String callback, Integer dateType, String typeArray, String year, String startTime,
            String endTime, PrintWriter out) {
        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;
        }
        List<Integer> channelList = null;
        if (typeArray != null && typeArray.trim().length() > 0) {
            Gson gson = new Gson();
            channelList = gson.fromJson(typeArray, new TypeToken<ArrayList<Integer>>() {
            }.getType());
        }
        if (channelList == null || channelList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("订单类型不能为空"));
            return;
        }
        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;
        }
        Gson gson = new Gson();
        Object objectDate = null;
        List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
        try {
            JSONArray line_list = new JSONArray();
            for (Integer type : channelList) {
                List<ChartTDO> list = hongBaoV2CountService.countHongBaoType(dateType, type, year, startTime, endTime);
                JSONObject innerList = new JSONObject();
                if (type == 1) {
                    innerList.put("name", "返利订单");
                } else if (type == 2) {
                    innerList.put("name", "分享订单");
                } else if (type == 3) {
                    innerList.put("name", "邀请订单");
                }
                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();
        }
    }
    /**
     * 当前未收货订单数
     *
     * @param callback
     * @param type
     *            订单状态-暂未使用
     * @param out
     */
    @RequestMapping(value = "getHistoryUnreceived")
    public void getHistoryUnreceived(String callback, Integer type, PrintWriter out) {
        try {
            Long total = commonOrderCountService.countByState(1);
            if (total == null) {
                total = 0L;
            }
            JSONObject data = new JSONObject();
            data.put("total", total);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 维权订单数
     *
     * @param callback
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getWeiQaunOrderNumber")
    public void getWeiQaunOrderNumber(String callback, Integer dateType, String year, String startTime, String endTime,
            PrintWriter out) {
        String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
        if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
        }
        try {
            JSONObject data = countWeiQaunOrder(dateType, year, startTime, endTime, 1);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
            e.printStackTrace();
        }
    }
    /**
     * 维权订单金额
     *
     * @param callback
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getWeiQaunOrderMoney")
    public void getWeiQaunOrderMoney(String callback, Integer dateType, String year, String startTime, String endTime,
            PrintWriter out) {
        String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
        if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
        }
        try {
            JSONObject data = countWeiQaunOrder(dateType, year, startTime, endTime, 2);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
            e.printStackTrace();
        }
    }
    /**
     * 统计红包信息
     *
     * @param channelArray
     * @param dateType
     * @param state
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public JSONObject countWeiQaunOrder(Integer dateType, String year, String startTime, String endTime, int countType)
            throws Exception {
        if (dateType != 1 && (!StringUtil.isNullOrEmpty(startTime) || !StringUtil.isNullOrEmpty(endTime))) {
            startTime = null;
            endTime = null;
        }
        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;
        }
        Gson gson = new Gson();
        Object objectDate = null;
        List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
        JSONArray line_list = new JSONArray();
        List<ChartTDO> list = null;
        if (countType == 1) {
            list = commonOrderCountService.countWeiQaunOrderNumber(dateType, year, startTime, endTime);
        } else if (countType == 2) {
            list = commonOrderCountService.countWeiQaunOrderMoney(dateType, year, startTime, endTime);
        }
        JSONObject innerList = new JSONObject();
        innerList.put("name", "总计");
        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);
        return data;
    }
    @RequestMapping(value = "uploadTaoBaoWeiQuanOrder")
    public void uploadWeiQuanOrder(String callback, HttpServletRequest request, PrintWriter out) {
        try {
            // 1. 先判断httpRequest 是否含有文件类型
            if (request instanceof MultipartHttpServletRequest) {
                MultipartHttpServletRequest fileRequest = (MultipartHttpServletRequest) request;
                MultipartFile file = fileRequest.getFile("file");
                List<TaoBaoWeiQuanOrder> orderList = TaoBaoOrderUtil.getWeiQuanOrders(file.getInputStream());
                for (TaoBaoWeiQuanOrder order : orderList)
                    taoBaoWeiQuanOrderService.addWeiQuanOrder(order);// 添加维权订单到数据库
                // 处理维权订单
                orderProcessService.weiQuanOrder(orderList);
            }
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("更新成功"));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("更新失败"));
        }
    }
}
package com.yeshi.fanli.controller.admin;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.MultipartHttpServletRequest;
import org.yeshi.utils.JsonUtil;
import com.google.gson.Gson;
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.bus.user.HongBaoV2;
import com.yeshi.fanli.entity.money.UserMoneyDebt;
import com.yeshi.fanli.entity.money.UserMoneyDebt.UserMoneyDebtTypeEnum;
import com.yeshi.fanli.entity.money.UserMoneyDetail;
import com.yeshi.fanli.entity.money.UserMoneyDetail.UserMoneyDetailTypeEnum;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.HongBaoOrder;
import com.yeshi.fanli.entity.order.UserOrderWeiQuanRecord;
import com.yeshi.fanli.entity.system.ConfigKeyEnum;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanDrawBack;
import com.yeshi.fanli.entity.taobao.TaoBaoWeiQuanOrder;
import com.yeshi.fanli.exception.order.CommonOrderException;
import com.yeshi.fanli.service.inter.config.ConfigService;
import com.yeshi.fanli.service.inter.count.HongBaoV2CountService;
import com.yeshi.fanli.service.inter.count.TaoBaoOrderCountService;
import com.yeshi.fanli.service.inter.money.UserMoneyDebtService;
import com.yeshi.fanli.service.inter.money.UserMoneyDetailService;
import com.yeshi.fanli.service.inter.money.tb.TaoBaoWeiQuanDrawBackService;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.service.inter.order.CommonOrderService;
import com.yeshi.fanli.service.inter.order.HongBaoOrderService;
import com.yeshi.fanli.service.inter.order.OrderProcessService;
import com.yeshi.fanli.service.inter.order.OrderService;
import com.yeshi.fanli.service.inter.order.UserOrderWeiQuanRecordService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoOrderService;
import com.yeshi.fanli.service.inter.order.tb.TaoBaoWeiQuanOrderService;
import com.yeshi.fanli.service.inter.user.UserSystemCouponRecordService;
import com.yeshi.fanli.tag.PageEntity;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.taobao.TaoBaoOrderUtil;
import com.yeshi.fanli.vo.order.CommonOrderVO;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Controller
@RequestMapping("admin/new/api/v1/order")
public class OrderAdminController {
    @Resource
    private OrderService orderService;
    @Resource
    private HongBaoV2CountService hongBaoV2CountService;
    @Resource
    private CommonOrderCountService commonOrderCountService;
    @Resource
    private CommonOrderService commonOrderService;
    @Resource
    private TaoBaoOrderService taoBaoOrderService;
    @Resource
    private TaoBaoOrderCountService taoBaoOrderCountService;
    @Resource
    private TaoBaoWeiQuanDrawBackService taoBaoWeiQuanDrawBackService;
    @Resource
    private TaoBaoWeiQuanOrderService taoBaoWeiQuanOrderService;
    @Resource
    private UserMoneyDetailService userMoneyDetailService;
    @Resource
    private OrderProcessService orderProcessService;
    @Resource
    private HongBaoOrderService hongBaoOrderService;
    @Resource
    private UserMoneyDebtService userMoneyDebtService;
    @Resource
    private UserSystemCouponRecordService userSystemCouponRecordService;
    @Resource
    private ConfigService configService;
    @Resource
    private UserOrderWeiQuanRecordService userOrderWeiQuanRecordService;
    /**
     * 统计历史订单-淘宝订单
     *
     * @param callback
     * @param request
     * @param out
     */
    @RequestMapping(value = "countTaoBaoOrder")
    public void countTaoBaoOrder(String callback, HttpServletRequest request, PrintWriter out) {
        try {
            Map<String, Object> countByOdrerType = taoBaoOrderCountService.countByOdrerType();
            JSONObject data = new JSONObject();
            data.put("typeOrder", countByOdrerType);
            // 统计今日 未失效订单数量 相同订单号合并为一单
            int todayOrder = taoBaoOrderCountService.countToday();
            // 统计昨日 未失效订单数量 相同订单号合并为一单
            int yesterdayOrder = taoBaoOrderCountService.countYesterday();
            data.put("todayOrder", todayOrder);
            data.put("yesterdayOrder", yesterdayOrder);
            data.put("genzong", yesterdayOrder);
            data.put("yesterdayOrder", yesterdayOrder);
            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 uid
     * @param state
     * @param type
     * @param orderState
     * @param orderNo
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getUserOrderList")
    public void getUserOrderList(String callback, Integer pageIndex, Integer pageSize, Integer keyType, String key,
            Integer state, Integer type, Integer orderState, String startTime, String endTime, Integer sourceType,
            Integer riskType, BigDecimal payment, PrintWriter out) {
        if (pageIndex == null || pageIndex < 1) {
            pageIndex = 1;
        }
        if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
        if (state != null && state == 0) {
            state = null;// 所有状态
        }
        if (type != null && type == 0) {
            type = null; // 所有类型订单
        }
        if (endTime != null && endTime.trim().length() > 0) {
            endTime += " 23:59:59";
        }
        try {
            Date minTime = null;
            BigDecimal money = null;
            List<Long> listShopId = null;
            List<Long> listGoodsId = null;
            // 风险
            if (riskType != null && !StringUtil.isNullOrEmpty(key) && keyType != null && keyType == 2) {
                long uid = Long.parseLong(key);
                // 查询同店铺商品,同商品订单超过一定数量的
                List<Integer> typeList = new ArrayList<>();
                typeList.add(HongBaoV2.TYPE_ZIGOU);
                if (riskType == 1) {
                    listGoodsId = commonOrderCountService.getSameGoodsOrderByUidAndHongBaoType(typeList, uid,
                            Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameGoodsOrderCount.getKey())));
                    if (listGoodsId == null || listGoodsId.isEmpty()) {
                        JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无同商品订单"));
                        return;
                    }
                } else if (riskType == 2) {
                    listShopId = commonOrderCountService.getSameShopOrderByUidAndHongBaoType(typeList, uid,
                            Integer.parseInt(configService.get(ConfigKeyEnum.adminMinSameShopOrderCount.getKey())));
                    if (listShopId == null || listShopId.isEmpty()) {
                        JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("暂无同店铺订单"));
                        return;
                    }
                } else if (riskType == 3) {
                    money = new BigDecimal(100);
                    minTime = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24 * 180L);
                }
            }
            // 查询列表
            List<CommonOrderVO> list = commonOrderService.listQuery((pageIndex - 1) * pageSize, pageSize, keyType, key,
                    state, type, orderState, startTime, endTime, sourceType, listShopId, listGoodsId, minTime, money, payment);
            // 统计总数
            long count = commonOrderService.countQuery(keyType, key, state, type, orderState, startTime, endTime,
                    sourceType, listShopId, listGoodsId, minTime, money, payment);
            // 查询是否维权
            for (CommonOrderVO order : list) {
                if (order.getUserId() == null)
                    continue;
                // 查询是否维权
                TaoBaoWeiQuanOrder weiQuanOrder = taoBaoWeiQuanOrderService.listByorderItemId(order.getTradeId());
                if (weiQuanOrder != null)// 有维权
                {
                    order.setWeiQuanState(weiQuanOrder.getState());
                    order.setState(CommonOrder.STATE_WQ);
                    TaoBaoWeiQuanDrawBack drawBack = taoBaoWeiQuanDrawBackService.selectByOrderItemIdAndUid(
                            weiQuanOrder.getOrderItemId(), Long.parseLong(order.getUserId()));
                    if (drawBack != null) {// 已经退款
                        // 计算退款资金
                        UserMoneyDetail detail = null;
                        switch (order.getHongBaoType()) {
                        case 1:
                            detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                    UserMoneyDetailTypeEnum.fanliWeiQuan, Long.parseLong(order.getUserId()),
                                    drawBack.getId());
                            if (detail == null)
                                detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                        UserMoneyDetailTypeEnum.weiQuan, Long.parseLong(order.getUserId()),
                                        drawBack.getId());
                            break;
                        case 3:
                            detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                    UserMoneyDetailTypeEnum.inviteWeiQuan, Long.parseLong(order.getUserId()),
                                    drawBack.getId());
                            break;
                        case 2:
                            detail = userMoneyDetailService.selectByTypeAndUidAndIdentifyCode(
                                    UserMoneyDetailTypeEnum.shareWeiQuan, Long.parseLong(order.getUserId()),
                                    drawBack.getId());
                            break;
                        }
                        if (detail != null) {
                            // 退款成功
                            order.setWeiQuanBackMoney(detail.getMoney().abs().toString());
                        } else {// 尚未退款
                            order.setWeiQuanBackMoney(drawBack.getDrawBackMoney().toString());
                            // 查询出对应的hongBaoId
                            CommonOrder commonOrder = commonOrderService.selectBySourceTypeAndTradeId(
                                    Constant.SOURCE_TYPE_TAOBAO, drawBack.getOrderItemId());
                            if (commonOrder != null) {
                                HongBaoOrder hongBaoOrder = hongBaoOrderService
                                        .selectDetailByCommonOrderId(commonOrder.getId());
                                if (hongBaoOrder != null) {
                                    UserMoneyDebt debt = userMoneyDebtService.selectByTypeAndSourceId(
                                            UserMoneyDebtTypeEnum.order, hongBaoOrder.getHongBaoV2().getId());
                                    if (debt != null && debt.getLeftMoney().compareTo(new BigDecimal(0)) > 0) {
                                        order.setWeiQuanBackMoney(
                                                new BigDecimal(0).subtract(debt.getLeftMoney()).toString());// 未扣除
                                    }
                                }
                            }
                        }
                    } else {// 尚未退款
                        UserOrderWeiQuanRecord record = userOrderWeiQuanRecordService.selectByOrderInfoAndUid(
                                Long.parseLong(order.getUserId()), weiQuanOrder.getOrderItemId(),
                                Constant.SOURCE_TYPE_TAOBAO);
                        if (record != null)
                            order.setWeiQuanBackMoney("-" + record.getMoney());
                        else {
                            order.setWeiQuanBackMoney("-" + order.getHongBao());
                        }
                    }
                }
            }
            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", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (CommonOrderException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
            e.printStackTrace();
        }
    }
    /**
     * 查询订单列表用户uid
     *
     * @param callback
     * @param pageIndex
     * @param pageSize
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param orderNo
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getHistoryOrder")
    public void getHistoryOrder(String callback, Integer pageIndex, Integer pageSize, Long uid, Integer state,
            Integer type, Integer orderState, String orderNo, String startTime, String endTime, PrintWriter out) {
        if (uid == null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("uid不能为空"));
            return;
        }
        if (pageIndex == null || pageIndex < 1) {
            pageIndex = 1;
        }
        if (pageSize == null)
            pageSize = Constant.PAGE_SIZE;
        if (state != null && state == 0) {
            state = null;// 所有状态
        }
        if (type != null && type == 0) {
            type = null; // 所有类型订单
        }
        if (endTime != null && endTime.trim().length() > 0) {
            endTime += " 23:59:59";
        }
        try {
            long count = 0;
            // 查询列表
            List<CommonOrderVO> list = commonOrderService.listQueryByUid((pageIndex - 1) * pageSize, pageSize, uid,
                    state, type, orderState, orderNo, startTime, endTime, null);
            if (list != null && list.size() > 0) {
                // 统计总数
                count = commonOrderService.countQueryByUid(uid, state, type, orderState, orderNo, startTime, endTime,
                        null);
            }
            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", list);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (CommonOrderException e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(e.getMsg()));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("查询失败"));
            e.printStackTrace();
        }
    }
    /**
     * 统计提现申请总金额
     *
     * @param callback
     * @param channelArray
     *            渠道名 为空是统计所有
     * @param dateType
     *            显示视图:日-1 、月-2、 年-3
     * @param state
     *            状态: 1-未到账 2-已到账 3-已失效
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getHongBaoMoney")
    public void getHongBaoMoney(String callback, String channelArray, Integer dateType, Integer state, String year,
            String startTime, String endTime, PrintWriter out) {
        String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
        if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
        }
        try {
            JSONObject data = countHistoryHongBao(channelArray, dateType, state, year, startTime, endTime, 2);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
            e.printStackTrace();
        }
    }
    /**
     * 统计红包信息
     *
     * @param channelArray
     * @param dateType
     * @param state
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public JSONObject countHistoryHongBao(String channelArray, Integer dateType, Integer state, String year,
            String startTime, String endTime, int countType) throws Exception {
        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;
        }
        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 = null;
            if (countType == 1) {
                list = hongBaoV2CountService.countHongBaoNum(channel, dateType, state, year, startTime, endTime);
            } else if (countType == 2) {
                list = hongBaoV2CountService.countHongBaoMoney(channel, dateType, state, 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);
        return data;
    }
    /**
     * 分类型订单数与比例
     *
     * @param callback
     * @param dateType
     *            日 -1 月-2 年-3
     * @param type
     *            返利订单-1 分享订单-2 邀请订单-3
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getTypeNumber")
    public void getTypeNumber(String callback, Integer dateType, String typeArray, String year, String startTime,
            String endTime, PrintWriter out) {
        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;
        }
        List<Integer> channelList = null;
        if (typeArray != null && typeArray.trim().length() > 0) {
            Gson gson = new Gson();
            channelList = gson.fromJson(typeArray, new TypeToken<ArrayList<Integer>>() {
            }.getType());
        }
        if (channelList == null || channelList.size() == 0) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("订单类型不能为空"));
            return;
        }
        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;
        }
        Gson gson = new Gson();
        Object objectDate = null;
        List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
        try {
            JSONArray line_list = new JSONArray();
            for (Integer type : channelList) {
                List<ChartTDO> list = hongBaoV2CountService.countHongBaoType(dateType, type, year, startTime, endTime);
                JSONObject innerList = new JSONObject();
                if (type == 1) {
                    innerList.put("name", "返利订单");
                } else if (type == 2) {
                    innerList.put("name", "分享订单");
                } else if (type == 3) {
                    innerList.put("name", "邀请订单");
                }
                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();
        }
    }
    /**
     * 当前未收货订单数
     *
     * @param callback
     * @param type
     *            订单状态-暂未使用
     * @param out
     */
    @RequestMapping(value = "getHistoryUnreceived")
    public void getHistoryUnreceived(String callback, Integer type, PrintWriter out) {
        try {
            Long total = commonOrderCountService.countByState(1);
            if (total == null) {
                total = 0L;
            }
            JSONObject data = new JSONObject();
            data.put("total", total);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("操作异常"));
            e.printStackTrace();
        }
    }
    /**
     * 维权订单数
     *
     * @param callback
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getWeiQaunOrderNumber")
    public void getWeiQaunOrderNumber(String callback, Integer dateType, String year, String startTime, String endTime,
            PrintWriter out) {
        String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
        if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
        }
        try {
            JSONObject data = countWeiQaunOrder(dateType, year, startTime, endTime, 1);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
            e.printStackTrace();
        }
    }
    /**
     * 维权订单金额
     *
     * @param callback
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @param out
     */
    @RequestMapping(value = "getWeiQaunOrderMoney")
    public void getWeiQaunOrderMoney(String callback, Integer dateType, String year, String startTime, String endTime,
            PrintWriter out) {
        String validateMsg = AdminUtils.validateParams(dateType, startTime, endTime);
        if (validateMsg != null) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult(validateMsg));
            return;
        }
        try {
            JSONObject data = countWeiQaunOrder(dateType, year, startTime, endTime, 2);
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult(data));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("系统异常"));
            e.printStackTrace();
        }
    }
    /**
     * 统计红包信息
     *
     * @param channelArray
     * @param dateType
     * @param state
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public JSONObject countWeiQaunOrder(Integer dateType, String year, String startTime, String endTime, int countType)
            throws Exception {
        if (dateType != 1 && (!StringUtil.isNullOrEmpty(startTime) || !StringUtil.isNullOrEmpty(endTime))) {
            startTime = null;
            endTime = null;
        }
        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;
        }
        Gson gson = new Gson();
        Object objectDate = null;
        List<String> dateList = AdminUtils.getDateList(dateType, startTime, endTime, year);
        JSONArray line_list = new JSONArray();
        List<ChartTDO> list = null;
        if (countType == 1) {
            list = commonOrderCountService.countWeiQaunOrderNumber(dateType, year, startTime, endTime);
        } else if (countType == 2) {
            list = commonOrderCountService.countWeiQaunOrderMoney(dateType, year, startTime, endTime);
        }
        JSONObject innerList = new JSONObject();
        innerList.put("name", "总计");
        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);
        return data;
    }
    @RequestMapping(value = "uploadTaoBaoWeiQuanOrder")
    public void uploadWeiQuanOrder(String callback, HttpServletRequest request, PrintWriter out) {
        try {
            // 1. 先判断httpRequest 是否含有文件类型
            if (request instanceof MultipartHttpServletRequest) {
                MultipartHttpServletRequest fileRequest = (MultipartHttpServletRequest) request;
                MultipartFile file = fileRequest.getFile("file");
                List<TaoBaoWeiQuanOrder> orderList = TaoBaoOrderUtil.getWeiQuanOrders(file.getInputStream());
                for (TaoBaoWeiQuanOrder order : orderList)
                    taoBaoWeiQuanOrderService.addWeiQuanOrder(order);// 添加维权订单到数据库
                // 处理维权订单
                orderProcessService.weiQuanOrder(orderList);
            }
            JsonUtil.printMode(out, callback, JsonUtil.loadTrueResult("更新成功"));
        } catch (Exception e) {
            JsonUtil.printMode(out, callback, JsonUtil.loadFalseResult("更新失败"));
        }
    }
}
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/CommonOrderCountMapper.java
@@ -1,164 +1,172 @@
package com.yeshi.fanli.dao.mybatis.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.dto.order.CountOrderDTO;
public interface CommonOrderCountMapper {
    /**
     * 当前各个状态订单数
     *
     * @param state
     *            状态
     * @return
     */
    Long countByState(@Param("state") Integer state);
    /**
     * 统计所有订单
     *
     * @param channel
     * @return
     */
    Long countOrderBySourceTypeAndDay(@Param("preDay") String preDay, @Param("sourceType") int sourceType);
    /**
     * 奖金统计
     *
     * @param uid
     * @return
     */
    Map<String, Object> countOrderNumberBySettleTime(@Param("uid") Long uid, @Param("state") Integer state,
            @Param("day") Integer day);
    /**
     * 统计自购、分享有效订单数量
     *
     * @param uid
     * @return
     */
    long countValidOrder(@Param("uid") Long uid);
    /**
     * 根据订单号 查询金额
     *
     * @param orderNo
     * @return
     */
    BigDecimal getMoneyByOrderNo(@Param("orderNo") String orderNo);
    /**
     * 统计已到账返利订单
     *
     * @param uid
     * @param dateTime
     * @return
     */
    long countValidOrderByDate(@Param("uid") Long uid, @Param("dateTime") String dateTime);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺数量
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    long countSameShopOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameShopGoodsCount") int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品数量
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    long countSameGoodsOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameGoodsOrderCount") int minSameGoodsOrderCount);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺id
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    List<Long> getSameShopOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameShopGoodsCount") int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品id
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    List<Long> getSameGoodsOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameGoodsOrderCount") int minSameGoodsOrderCount);
    /**
     * 通过uid 日期筛选   下单数量
     * @param preDay
     * @param uid
     * @return
     */
    Integer countOderByUidAndDate(@Param("preDay") Date preDay,@Param("uid") Long uid);
    /**
     *  日期筛选  每个用户下单数量
     * @param preDay
     * @param uid
     * @return
     */
    List<CountOrderDTO> countValidOrderByDay(@Param("preDay") String preDay);
    /**
     * 通过多个uid 日期筛选 下单用户数量
     * @param preDay
     * @param uid
     * @return
     */
    Integer countDownOrderUserByUidAndDate(@Param("preDay") Date preDay,@Param("list") List<Long> list);
    /**
     * 统计订单产生佣金
     * @param preDay
     * @param list
     * @return
     */
    List<CountOrderDTO> countCommissionByDay(@Param("preDay") String preDay);
    /**
     * 通过uid 日期筛选   下单数量
     * @param preDay
     * @return
     */
    Integer countOderByDate(@Param("preDay") String preDay);
    /**
     * 统计订单产生佣金
     * @param preDay
     * @return
     */
    BigDecimal countCommissionByDate(@Param("preDay") String preDay);
package com.yeshi.fanli.dao.mybatis.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.dto.order.CountOrderDTO;
public interface CommonOrderCountMapper {
    /**
     * 当前各个状态订单数
     *
     * @param state
     *            状态
     * @return
     */
    Long countByState(@Param("state") Integer state);
    /**
     * 统计所有订单
     *
     * @param channel
     * @return
     */
    Long countOrderBySourceTypeAndDay(@Param("preDay") String preDay, @Param("sourceType") int sourceType);
    /**
     * 奖金统计
     *
     * @param uid
     * @return
     */
    Map<String, Object> countOrderNumberBySettleTime(@Param("uid") Long uid, @Param("state") Integer state,
            @Param("day") Integer day);
    /**
     * 统计自购、分享有效订单数量
     *
     * @param uid
     * @return
     */
    long countValidOrder(@Param("uid") Long uid);
    /**
     * 根据订单号 查询金额
     *
     * @param orderNo
     * @return
     */
    BigDecimal getMoneyByOrderNo(@Param("orderNo") String orderNo);
    /**
     * 统计已到账返利订单
     *
     * @param uid
     * @param dateTime
     * @return
     */
    long countValidOrderByDate(@Param("uid") Long uid, @Param("dateTime") String dateTime);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺数量
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    long countSameShopOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameShopGoodsCount") int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品数量
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    long countSameGoodsOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameGoodsOrderCount") int minSameGoodsOrderCount);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺id
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    List<Long> getSameShopOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameShopGoodsCount") int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品id
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    List<Long> getSameGoodsOrderByUidAndHongBaoType(@Param("typeList") List<Integer> typeList, @Param("uid") Long uid,
            @Param("minSameGoodsOrderCount") int minSameGoodsOrderCount);
    /**
     * 通过uid 日期筛选   下单数量
     * @param preDay
     * @param uid
     * @return
     */
    Integer countOderByUidAndDate(@Param("preDay") Date preDay,@Param("uid") Long uid);
    /**
     *  日期筛选  每个用户下单数量
     * @param preDay
     * @param uid
     * @return
     */
    List<CountOrderDTO> countValidOrderByDay(@Param("preDay") String preDay);
    /**
     * 通过多个uid 日期筛选 下单用户数量
     * @param preDay
     * @param uid
     * @return
     */
    Integer countDownOrderUserByUidAndDate(@Param("preDay") Date preDay,@Param("list") List<Long> list);
    /**
     * 统计订单产生佣金
     * @param preDay
     * @param list
     * @return
     */
    List<CountOrderDTO> countCommissionByDay(@Param("preDay") String preDay);
    /**
     * 通过uid 日期筛选   下单数量
     * @param preDay
     * @return
     */
    Integer countOderByDate(@Param("preDay") String preDay);
    /**
     * 统计订单产生佣金
     * @param preDay
     * @return
     */
    BigDecimal countCommissionByDate(@Param("preDay") String preDay);
    /**
     * 查询最近50小于10的订单数量
     * @param uid
     * @return
     */
    Integer countOderByUidAndLess10(@Param("uid") Long uid);
}
fanli/src/main/java/com/yeshi/fanli/dao/mybatis/order/CommonOrderMapper.java
@@ -1,373 +1,373 @@
package com.yeshi.fanli.dao.mybatis.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.yeshi.fanli.dao.BaseMapper;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.ESOrder;
import com.yeshi.fanli.vo.order.CommonOrderVO;
import com.yeshi.fanli.vo.order.OrderCountVO;
public interface CommonOrderMapper extends BaseMapper<CommonOrder> {
    /**
     * 查询用户订单 并订单号分组
     *
     * @param start
     * @param count
     * @param uid
     * @return
     */
    List<CommonOrderVO> listUserOrder(@Param("start") long start, @Param("count") int count, @Param("uid") Long uid,
            @Param("state") Integer state, @Param("type") Integer type, @Param("orderState") Integer orderState,
            @Param("orderNo") String orderNo, @Param("startTime") String startTime, @Param("endTime") String endTime,
            @Param("day") Integer day, @Param("listSource") List<Integer> listSource);
    /**
     * 统计用户订单 并订单号分组
     *
     * @param start
     * @param count
     * @param uid
     * @return
     */
    long countUserOrder(@Param("uid") Long uid, @Param("state") Integer state, @Param("type") Integer type,
            @Param("orderState") Integer orderState, @Param("orderNo") String orderNo,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("day") Integer day,
            @Param("listSource") List<Integer> listSource);
    /**
     * 判断部分失效状态
     *
     * @param uid
     * @param orderNo
     * @return
     */
    CommonOrderVO getBuFenOrderState(@Param("uid") Long uid, @Param("orderNo") String orderNo);
    /**
     * 根据用户ID,订单状态和订单结算时间统计订单的数量
     *
     * @param uid
     * @param state
     * @param minDate
     * @param maxDate
     * @return
     */
    long countByUidAndOrderStateWithOrderBalanceTime(@Param("uid") Long uid, @Param("state") int state,
            @Param("minDate") Date minDate, @Param("maxDate") Date maxDate);
    /**
     * 根据订单号、订单类型查询商品
     *
     * @param list
     *            订单对象
     * @return
     */
    List<CommonOrderVO> listOrderGoodsInfo(List<CommonOrderVO> list);
    /**
     * 统计历史订单数量
     *
     * @param uid
     * @return
     */
    Map<String, BigDecimal> countHistoryOrder(@Param("uid") Long uid, @Param("day") Integer day,
            @Param("source") Integer source);
    /**
     * 统计有效订单数量
     * @param uid
     * @return
     */
    OrderCountVO getOrderCount(@Param("uid") Long uid, @Param("day")Integer day, @Param("listSource") List<Integer> listSource);
    /**
     * 昨日总订单-根据红包类型 自购 邀请 分享
     *
     * @param uid
     * @return
     */
    long countUserOrderToApp(@Param("uid") Long uid, @Param("type") Integer type,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("day") Integer day,
            @Param("source") Integer source,@Param("state") Integer state, @Param("stateOrder") Integer stateOrder);
    /**
     * 奖金订单数量
     *
     * @param uid
     * @return
     */
    long countBonusOrderNumber(@Param("uid") Long uid, @Param("type") Integer type, @Param("day") Integer day,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("source") Integer source);
    /**
     * 奖金统计
     *
     * @param uid
     * @return
     */
    BigDecimal countBonusOrderMoney(@Param("uid") Long uid, @Param("type") Integer type, @Param("day") Integer day,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("source") Integer source);
    /**
     * 奖金统计
     *
     * @param uid
     * @return
     */
    Map<String, Object> countBonusOrderMoneyAndNumber(@Param("uid") Long uid, @Param("type") Integer type,
            @Param("day") Integer day, @Param("startTime") String startTime, @Param("endTime") String endTime,
            @Param("source") Integer source);
    int countByOrderNOAndOrderType(@Param("orderNO") String orderNO, @Param("orderType") int orderType);
    /**
     * 根据订单号与订单排序值获取详情
     *
     * @param orderNo
     *            -订单号
     * @param orderBy
     *            -订单排序值
     * @param orderType
     *            -订单类型
     * @return
     */
    CommonOrder selectByOrderNoAndOrderTypeAndOrderBy(@Param("orderNo") String orderNo,
            @Param("orderType") int orderType, @Param("orderBy") int orderBy);
    /**
     * 订单列表查询
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @return
     */
    List<CommonOrderVO> listQueryByUid(@Param("start") long start, @Param("count") int count, @Param("uid") Long uid,
            @Param("state") Integer state, @Param("type") Integer type, @Param("orderState") Integer orderState,
            @Param("orderNo") String orderNo, @Param("startTime") String startTime, @Param("endTime") String endTime,
            @Param("day") Integer day);
    /**
     * 统计
     */
    long countQueryByUid(@Param("uid") Long uid, @Param("state") Integer state, @Param("type") Integer type,
            @Param("orderState") Integer orderState, @Param("orderNo") String orderNo,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("day") Integer day);
    /**
     * 订单列表查询
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @return
     */
    List<CommonOrderVO> listQuery(@Param("start") long start, @Param("count") int count,
            @Param("keyType") Integer keyType, @Param("key") String key, @Param("state") Integer state,
            @Param("type") Integer type, @Param("orderState") Integer orderState, @Param("startTime") String startTime,
            @Param("endTime") String endTime, @Param("source") Integer source,
            @Param("listShopId")List<Long> listShopId, @Param("listGoodsId")List<Long> listGoodsId,
            @Param("minTime")Date minTime, @Param("money")BigDecimal money);
    /**
     * 订单列表查询(不包含子订单)
     *
     * @param start
     * @param count
     * @param keyType
     * @param key
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @param source
     * @return
     */
    List<CommonOrderVO> listQueryWithNoChild(@Param("start") long start, @Param("count") int count,
            @Param("keyType") Integer keyType, @Param("key") String key, @Param("state") Integer state,
            @Param("type") Integer type, @Param("orderState") Integer orderState, @Param("startTime") String startTime,
            @Param("endTime") String endTime, @Param("source") Integer source);
    /**
     * 统计
     */
    long countQuery(@Param("keyType") Integer keyType, @Param("key") String key, @Param("state") Integer state,
            @Param("type") Integer type, @Param("orderState") Integer orderState, @Param("startTime") String startTime,
            @Param("endTime") String endTime, @Param("source") Integer source,
            @Param("listShopId")List<Long> listShopId, @Param("listGoodsId")List<Long> listGoodsId,
            @Param("minTime")Date minTime, @Param("money")BigDecimal money);
    long countQueryWithNoChild(@Param("keyType") Integer keyType, @Param("key") String key,
            @Param("state") Integer state, @Param("type") Integer type, @Param("orderState") Integer orderState,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("source") Integer source);
    /**
     * 根据来源类型与订单号查询列表
     *
     * @param sourceType
     * @param orderNo
     * @return
     */
    List<CommonOrder> listBySourceTypeAndOrderNo(@Param("sourceType") int sourceType, @Param("orderNo") String orderNo);
    /**
     * 查询券奖励金额以及订单信息
     *
     * @param uid
     * @param state
     * @param orderNo
     * @return
     */
    List<CommonOrderVO> getCouponHongbaoByOrderNo(@Param("uid") Long uid, @Param("hongBaoState") Integer hongBaoState,
            @Param("orderNo") String orderNo);
    /**
     * 查询券奖励金额以及订单信息
     *
     * @param uid
     * @param state
     * @param orderNo
     * @return
     */
    CommonOrderVO getCommonOrderByOrderNo(@Param("uid") Long uid, @Param("orderNo") String orderNo,
            @Param("orderState") Integer orderState, @Param("sourceType") Integer sourceType);
    /**
     * 根据来源和交易ID获取订单详情
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    CommonOrder selectBySourceTypeAndTradeId(@Param("sourceType") int sourceType, @Param("tradeId") String tradeId);
    /**
     * 根据来源和交易ID获取订单列表
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    List<CommonOrder> listBySourceTypeAndTradeId(@Param("sourceType") int sourceType, @Param("tradeId") String tradeId);
    /**
     * 根据来源和交易ID获取订单列表
     *
     * @param sourceType
     * @param tradeIdList
     * @return
     */
    List<CommonOrder> listBySourceTypeAndTradeIdList(@Param("sourceType") int sourceType,
            @Param("tradeIdList") List<String> tradeIdList);
    /**
     *
     * @param sourceType
     * @param state
     * @param minTime
     *            -最大创建时间
     * @param maxTime
     *            -最小创建时间
     * @return
     */
    List<CommonOrder> listBySourceTypeAndStateAndThirdCrateTime(@Param("sourceType") int sourceType,
            @Param("state") Integer state, @Param("minTime") Long minTime, @Param("maxTime") Long maxTime,
            @Param("start") long start, @Param("count") int count);
    /**
     * 根据订单号查询
     *
     * @param orderNO
     * @return
     */
    List<CommonOrder> getByOrderNo(@Param("uid") Long uid, @Param("orderNo") String orderNo);
    /**
     * 根据用户ID查询
     * @param uid
     * @param stateList
     * @param start
     * @param count
     * @return
     */
    List<CommonOrder> listByUid(@Param("uid")Long uid,@Param("stateList") List<Integer> stateList,@Param("start") long start,@Param("count") int count);
    /**
     * 查询首笔有效到账订单
     * @param uid
     * @param typeHB 类型: 1自购  2分享 3邀请
     * @param typeDate 日期类型: 3本月 4上月
     * @return
     */
    CommonOrderVO firstValidOrderByUid(@Param("uid") Long uid, @Param("typeHB") Integer typeHB,
            @Param("typeDate") Integer typeDate);
    /**
     * 获取首笔分享订单;
     * @param uid
     * @return
     */
    CommonOrder getFirstShareOrderByUid(@Param("uid") Long uid);
    /**
     * 统计订单号到账金额
     * @param uid
     * @return
     */
    BigDecimal getTotalRewardMoneyByOrderNoAndSourceType(@Param("orderNo") String orderNo, @Param("sourceType") Integer sourceType);
    /**
     * 统计24小时有效自购订单
     * @param uid
     * @return
     */
    long count24HValidOrderByUid(@Param("uid") Long uid, @Param("minTime") Date minTime);
    /**
     * 搜索订单
     * @param start
     * @param count
     * @param uid
     * @param list
     * @return
     */
    List<CommonOrderVO> searchOrderByUid(@Param("start") long start, @Param("count") int count, @Param("uid") Long uid,
            @Param("list")List<ESOrder> list);
    /**
     * 搜索订单
     * @param start
     * @param count
     * @param uid
     * @param list
     * @return
     */
    long countSearchOrderByUid(@Param("uid") Long uid, @Param("list")List<ESOrder> list);
package com.yeshi.fanli.dao.mybatis.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.annotations.Param;
import com.yeshi.fanli.dao.BaseMapper;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.ESOrder;
import com.yeshi.fanli.vo.order.CommonOrderVO;
import com.yeshi.fanli.vo.order.OrderCountVO;
public interface CommonOrderMapper extends BaseMapper<CommonOrder> {
    /**
     * 查询用户订单 并订单号分组
     *
     * @param start
     * @param count
     * @param uid
     * @return
     */
    List<CommonOrderVO> listUserOrder(@Param("start") long start, @Param("count") int count, @Param("uid") Long uid,
            @Param("state") Integer state, @Param("type") Integer type, @Param("orderState") Integer orderState,
            @Param("orderNo") String orderNo, @Param("startTime") String startTime, @Param("endTime") String endTime,
            @Param("day") Integer day, @Param("listSource") List<Integer> listSource);
    /**
     * 统计用户订单 并订单号分组
     *
     * @param start
     * @param count
     * @param uid
     * @return
     */
    long countUserOrder(@Param("uid") Long uid, @Param("state") Integer state, @Param("type") Integer type,
            @Param("orderState") Integer orderState, @Param("orderNo") String orderNo,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("day") Integer day,
            @Param("listSource") List<Integer> listSource);
    /**
     * 判断部分失效状态
     *
     * @param uid
     * @param orderNo
     * @return
     */
    CommonOrderVO getBuFenOrderState(@Param("uid") Long uid, @Param("orderNo") String orderNo);
    /**
     * 根据用户ID,订单状态和订单结算时间统计订单的数量
     *
     * @param uid
     * @param state
     * @param minDate
     * @param maxDate
     * @return
     */
    long countByUidAndOrderStateWithOrderBalanceTime(@Param("uid") Long uid, @Param("state") int state,
            @Param("minDate") Date minDate, @Param("maxDate") Date maxDate);
    /**
     * 根据订单号、订单类型查询商品
     *
     * @param list
     *            订单对象
     * @return
     */
    List<CommonOrderVO> listOrderGoodsInfo(List<CommonOrderVO> list);
    /**
     * 统计历史订单数量
     *
     * @param uid
     * @return
     */
    Map<String, BigDecimal> countHistoryOrder(@Param("uid") Long uid, @Param("day") Integer day,
            @Param("source") Integer source);
    /**
     * 统计有效订单数量
     * @param uid
     * @return
     */
    OrderCountVO getOrderCount(@Param("uid") Long uid, @Param("day")Integer day, @Param("listSource") List<Integer> listSource);
    /**
     * 昨日总订单-根据红包类型 自购 邀请 分享
     *
     * @param uid
     * @return
     */
    long countUserOrderToApp(@Param("uid") Long uid, @Param("type") Integer type,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("day") Integer day,
            @Param("source") Integer source,@Param("state") Integer state, @Param("stateOrder") Integer stateOrder);
    /**
     * 奖金订单数量
     *
     * @param uid
     * @return
     */
    long countBonusOrderNumber(@Param("uid") Long uid, @Param("type") Integer type, @Param("day") Integer day,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("source") Integer source);
    /**
     * 奖金统计
     *
     * @param uid
     * @return
     */
    BigDecimal countBonusOrderMoney(@Param("uid") Long uid, @Param("type") Integer type, @Param("day") Integer day,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("source") Integer source);
    /**
     * 奖金统计
     *
     * @param uid
     * @return
     */
    Map<String, Object> countBonusOrderMoneyAndNumber(@Param("uid") Long uid, @Param("type") Integer type,
            @Param("day") Integer day, @Param("startTime") String startTime, @Param("endTime") String endTime,
            @Param("source") Integer source);
    int countByOrderNOAndOrderType(@Param("orderNO") String orderNO, @Param("orderType") int orderType);
    /**
     * 根据订单号与订单排序值获取详情
     *
     * @param orderNo
     *            -订单号
     * @param orderBy
     *            -订单排序值
     * @param orderType
     *            -订单类型
     * @return
     */
    CommonOrder selectByOrderNoAndOrderTypeAndOrderBy(@Param("orderNo") String orderNo,
            @Param("orderType") int orderType, @Param("orderBy") int orderBy);
    /**
     * 订单列表查询
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @return
     */
    List<CommonOrderVO> listQueryByUid(@Param("start") long start, @Param("count") int count, @Param("uid") Long uid,
            @Param("state") Integer state, @Param("type") Integer type, @Param("orderState") Integer orderState,
            @Param("orderNo") String orderNo, @Param("startTime") String startTime, @Param("endTime") String endTime,
            @Param("day") Integer day);
    /**
     * 统计
     */
    long countQueryByUid(@Param("uid") Long uid, @Param("state") Integer state, @Param("type") Integer type,
            @Param("orderState") Integer orderState, @Param("orderNo") String orderNo,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("day") Integer day);
    /**
     * 订单列表查询
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @return
     */
    List<CommonOrderVO> listQuery(@Param("start") long start, @Param("count") int count,
            @Param("keyType") Integer keyType, @Param("key") String key, @Param("state") Integer state,
            @Param("type") Integer type, @Param("orderState") Integer orderState, @Param("startTime") String startTime,
            @Param("endTime") String endTime, @Param("source") Integer source,
            @Param("listShopId")List<Long> listShopId, @Param("listGoodsId")List<Long> listGoodsId,
            @Param("minTime")Date minTime, @Param("money")BigDecimal money, @Param("payment") BigDecimal payment);
    /**
     * 订单列表查询(不包含子订单)
     *
     * @param start
     * @param count
     * @param keyType
     * @param key
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @param source
     * @return
     */
    List<CommonOrderVO> listQueryWithNoChild(@Param("start") long start, @Param("count") int count,
            @Param("keyType") Integer keyType, @Param("key") String key, @Param("state") Integer state,
            @Param("type") Integer type, @Param("orderState") Integer orderState, @Param("startTime") String startTime,
            @Param("endTime") String endTime, @Param("source") Integer source, @Param("payment") BigDecimal payment);
    /**
     * 统计
     */
    long countQuery(@Param("keyType") Integer keyType, @Param("key") String key, @Param("state") Integer state,
            @Param("type") Integer type, @Param("orderState") Integer orderState, @Param("startTime") String startTime,
            @Param("endTime") String endTime, @Param("source") Integer source,
            @Param("listShopId")List<Long> listShopId, @Param("listGoodsId")List<Long> listGoodsId,
            @Param("minTime")Date minTime, @Param("money")BigDecimal money,@Param("payment") BigDecimal payment);
    long countQueryWithNoChild(@Param("keyType") Integer keyType, @Param("key") String key,
            @Param("state") Integer state, @Param("type") Integer type, @Param("orderState") Integer orderState,
            @Param("startTime") String startTime, @Param("endTime") String endTime, @Param("source") Integer source, @Param("payment") BigDecimal payment);
    /**
     * 根据来源类型与订单号查询列表
     *
     * @param sourceType
     * @param orderNo
     * @return
     */
    List<CommonOrder> listBySourceTypeAndOrderNo(@Param("sourceType") int sourceType, @Param("orderNo") String orderNo);
    /**
     * 查询券奖励金额以及订单信息
     *
     * @param uid
     * @param state
     * @param orderNo
     * @return
     */
    List<CommonOrderVO> getCouponHongbaoByOrderNo(@Param("uid") Long uid, @Param("hongBaoState") Integer hongBaoState,
            @Param("orderNo") String orderNo);
    /**
     * 查询券奖励金额以及订单信息
     *
     * @param uid
     * @param state
     * @param orderNo
     * @return
     */
    CommonOrderVO getCommonOrderByOrderNo(@Param("uid") Long uid, @Param("orderNo") String orderNo,
            @Param("orderState") Integer orderState, @Param("sourceType") Integer sourceType);
    /**
     * 根据来源和交易ID获取订单详情
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    CommonOrder selectBySourceTypeAndTradeId(@Param("sourceType") int sourceType, @Param("tradeId") String tradeId);
    /**
     * 根据来源和交易ID获取订单列表
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    List<CommonOrder> listBySourceTypeAndTradeId(@Param("sourceType") int sourceType, @Param("tradeId") String tradeId);
    /**
     * 根据来源和交易ID获取订单列表
     *
     * @param sourceType
     * @param tradeIdList
     * @return
     */
    List<CommonOrder> listBySourceTypeAndTradeIdList(@Param("sourceType") int sourceType,
            @Param("tradeIdList") List<String> tradeIdList);
    /**
     *
     * @param sourceType
     * @param state
     * @param minTime
     *            -最大创建时间
     * @param maxTime
     *            -最小创建时间
     * @return
     */
    List<CommonOrder> listBySourceTypeAndStateAndThirdCrateTime(@Param("sourceType") int sourceType,
            @Param("state") Integer state, @Param("minTime") Long minTime, @Param("maxTime") Long maxTime,
            @Param("start") long start, @Param("count") int count);
    /**
     * 根据订单号查询
     *
     * @param orderNO
     * @return
     */
    List<CommonOrder> getByOrderNo(@Param("uid") Long uid, @Param("orderNo") String orderNo);
    /**
     * 根据用户ID查询
     * @param uid
     * @param stateList
     * @param start
     * @param count
     * @return
     */
    List<CommonOrder> listByUid(@Param("uid")Long uid,@Param("stateList") List<Integer> stateList,@Param("start") long start,@Param("count") int count);
    /**
     * 查询首笔有效到账订单
     * @param uid
     * @param typeHB 类型: 1自购  2分享 3邀请
     * @param typeDate 日期类型: 3本月 4上月
     * @return
     */
    CommonOrderVO firstValidOrderByUid(@Param("uid") Long uid, @Param("typeHB") Integer typeHB,
            @Param("typeDate") Integer typeDate);
    /**
     * 获取首笔分享订单;
     * @param uid
     * @return
     */
    CommonOrder getFirstShareOrderByUid(@Param("uid") Long uid);
    /**
     * 统计订单号到账金额
     * @param uid
     * @return
     */
    BigDecimal getTotalRewardMoneyByOrderNoAndSourceType(@Param("orderNo") String orderNo, @Param("sourceType") Integer sourceType);
    /**
     * 统计24小时有效自购订单
     * @param uid
     * @return
     */
    long count24HValidOrderByUid(@Param("uid") Long uid, @Param("minTime") Date minTime);
    /**
     * 搜索订单
     * @param start
     * @param count
     * @param uid
     * @param list
     * @return
     */
    List<CommonOrderVO> searchOrderByUid(@Param("start") long start, @Param("count") int count, @Param("uid") Long uid,
            @Param("list")List<ESOrder> list);
    /**
     * 搜索订单
     * @param start
     * @param count
     * @param uid
     * @param list
     * @return
     */
    long countSearchOrderByUid(@Param("uid") Long uid, @Param("list")List<ESOrder> list);
}
fanli/src/main/java/com/yeshi/fanli/mapping/order/CommonOrderCountMapper.xml
@@ -1,323 +1,331 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeshi.fanli.dao.mybatis.order.CommonOrderCountMapper">
    <resultMap id="ChartMap" type="com.yeshi.fanli.dto.ChartTDO">
        <result column="showDate" property="showDate" jdbcType="VARCHAR" />
        <result column="showValue" property="showValue" jdbcType="VARCHAR" />
    </resultMap>
     <resultMap id="CountOrderMap" type="com.yeshi.fanli.dto.order.CountOrderDTO">
        <result column="uid" property="uid" jdbcType="BIGINT" />
        <result column="totalOrder" property="totalOrder" jdbcType="INTEGER" />
        <result column="commission" property="commission" jdbcType="DECIMAL" />
    </resultMap>
    <sql id="Column_DateType">
        <if test="dateType == 1">
            DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d') AS 'showDate'
        </if>
        <if test="dateType == 2">
            DATE_FORMAT(t.`co_third_create_time`,'%m') AS 'showDate'
        </if>
        <if test="dateType == 3">
            DATE_FORMAT(t.`co_third_create_time`,'%Y') AS 'showDate'
        </if>
    </sql>
    <sql id="Count_Select_DateType">
        <if test="startTime != null and startTime != '' ">
            AND DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d')<![CDATA[ >= ]]>'${startTime}'
        </if>
        <if test="endTime != null and endTime != '' ">
            AND DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d') <![CDATA[ <= ]]>'${endTime}'
        </if>
        <if test="year != null and year != '' ">
            AND DATE_FORMAT(t.`co_third_create_time`,'%Y') = '${year}'
        </if>
    </sql>
    <sql id="Count_Group_DateType">
        <if test="dateType == 1">
            GROUP BY DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d')
        </if>
        <if test="dateType == 2">
            GROUP BY DATE_FORMAT(t.`co_third_create_time`,'%Y-%m')
        </if>
        <if test="dateType == 3">
            GROUP BY DATE_FORMAT(t.`co_third_create_time`,'%Y')
        </if>
    </sql>
    <select id="countByState" resultType="java.lang.Long">
        SELECT IFNULL(COUNT(t.`co_id`),0) FROM  `yeshi_ec_common_order` t
        WHERE 1=1
            <if test="type != null">
                AND t.`co_state` = #{state}
            </if>
    </select>
    <select id="countOrderBySourceTypeAndDay" resultType="java.lang.Long">
        SELECT COUNT(t.`co_id`) FROM `yeshi_ec_common_order` t
        WHERE t.co_source_type=#{sourceType} AND DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d') = #{preDay}
    </select>
    <select id="countOrderNumberBySettleTime" resultType="java.util.HashMap">
        <!-- 统计历史订单数量  根据结算时间 -->
        SELECT SUM(A.self)AS totalSelf,SUM(A.shared)AS totalShared,SUM(A.invite)AS totalInvite
        FROM (
            <!-- 返利订单 -->
            SELECT IFNULL(COUNT(ho_id),0) AS self,0 AS shared,0 AS invite
            FROM  (SELECT ho.`ho_id` FROM yeshi_ec_hongbao_order ho
                LEFT JOIN (
                    SELECT * FROM yeshi_ec_hongbao_v2 v2
                    WHERE v2.`hb_uid`= ${uid} and v2.hb_state!=4 AND (v2.`hb_type` = 1 OR v2.`hb_type` = 2)
                    ) hb  ON hb.hb_id=ho.`ho_hongbao_id` <!-- 自购订单 -->
            LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
            WHERE hb.hb_id IS NOT NULL
                 <if test="state != null">
                    AND co.`co_state` = ${state}
                </if>
                <if test="day != null and day == 1"> <!-- 今天 -->
                    AND TO_DAYS(co.`co_settle_time`) = TO_DAYS(NOW())
                </if>
                <if test="day != null and day == 2">  <!-- 昨天 -->
                    AND TO_DAYS(NOW()) - TO_DAYS(co.co_settle_time) = 1
                </if>
                <if test="day != null and day == 3">  <!-- 本月 -->
                    AND DATE_FORMAT(co.`co_settle_time`,'%Y%m') =
                    DATE_FORMAT(CURDATE(),'%Y%m')
                </if>
                <if test="day != null and day == 4">  <!-- 上月 -->
                    AND PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'),
                    DATE_FORMAT(co.`co_settle_time`, '%Y%m')) = 1
                </if>
            GROUP BY co.`co_order_no`, co.`co_source_type`)YX
            UNION ALL
            <!-- 分享订单 -->
            SELECT 0 AS self,IFNULL(COUNT(ho_id),0) AS shared,0 AS invite
            FROM  (SELECT ho.`ho_id` FROM yeshi_ec_hongbao_order ho
                    LEFT JOIN (
                        SELECT * FROM yeshi_ec_hongbao_v2 v2
                        WHERE v2.`hb_uid`= ${uid} AND v2.`hb_type` = 20 and v2.hb_state!=4
                    ) hb  ON hb.hb_id=ho.`ho_hongbao_id`  <!-- 分享订单 -->
                LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
                WHERE hb.hb_id IS NOT NULL and hb.hb_state!=4
                    <if test="state != null">
                        AND co.`co_state` = ${state}
                    </if>
                    <if test="day != null and day == 1"> <!-- 今天 -->
                        AND TO_DAYS(co.`co_settle_time`) = TO_DAYS(NOW())
                    </if>
                    <if test="day != null and day == 2">  <!-- 昨天 -->
                        AND TO_DAYS(NOW()) - TO_DAYS(co.`co_settle_time`) = 1
                    </if>
                    <if test="day != null and day == 3">  <!-- 本月 -->
                        AND DATE_FORMAT(co.`co_settle_time`,'%Y%m') =
                        DATE_FORMAT(CURDATE(),'%Y%m')
                    </if>
                    <if test="day != null and day == 4">  <!-- 上月 -->
                        AND PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'),
                        DATE_FORMAT(co.`co_settle_time`, '%Y%m')) = 1
                    </if>
                GROUP BY co.`co_order_no`, co.`co_source_type`)WQ
            UNION ALL
            <!-- 邀请订单 -->
            SELECT 0 AS self,0 AS shared,IFNULL(COUNT(ho_id),0) AS invite
            FROM  (SELECT ho.`ho_id` FROM yeshi_ec_hongbao_order ho
                LEFT JOIN (
                    SELECT * FROM yeshi_ec_hongbao_v2 v2
                    WHERE v2.`hb_uid`= ${uid}
                         AND (v2.`hb_type` = 5 OR v2.`hb_type` = 6 OR v2.`hb_type` = 7
                               OR v2.`hb_type` = 21 OR v2.`hb_type` = 22 ) and v2.hb_state!=4
                    ) hbp  ON hbp.hb_pid=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
                WHERE  hbp.hb_id IS NOT NULL and hbp.hb_state!=4
                    <if test="state != null">
                        AND co.`co_state` = ${state}
                    </if>
                    <if test="day != null and day == 1"> <!-- 今天 -->
                        AND TO_DAYS(co.`co_settle_time`) = TO_DAYS(NOW())
                    </if>
                    <if test="day != null and day == 2">  <!-- 昨天 -->
                        AND TO_DAYS(NOW()) - TO_DAYS(co.`co_settle_time`) = 1
                    </if>
                    <if test="day != null and day == 3">  <!-- 本月 -->
                        AND DATE_FORMAT(co.`co_settle_time`,'%Y%m') =
                        DATE_FORMAT(CURDATE(),'%Y%m')
                    </if>
                    <if test="day != null and day == 4">  <!-- 上月 -->
                        AND PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'),
                        DATE_FORMAT(co.`co_settle_time`, '%Y%m')) = 1
                    </if>
                GROUP BY co.`co_order_no`, co.`co_source_type`)SX
        )A
    </select>
    <select id="countValidOrder" resultType="java.lang.Long">
        SELECT IFNULL(COUNT(co.`co_id`),0) FROM yeshi_ec_hongbao_order ho
        LEFT JOIN (SELECT * FROM yeshi_ec_hongbao_v2 v2
            WHERE v2.`hb_uid`= #{uid}  AND v2.`hb_type` IN(1,20))hb
            ON IF(hb.hb_pid IS NULL,hb.hb_id,hb.hb_pid)=ho.`ho_hongbao_id`
        LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
        WHERE hb.hb_id IS NOT NULL AND <![CDATA[co.`co_state` <> 4]]>
    </select>
    <select id="getMoneyByOrderNo" resultType="java.math.BigDecimal">
        SELECT SUM(v2.`hb_money`) FROM yeshi_ec_common_order co
        LEFT JOIN  yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
        LEFT JOIN yeshi_ec_hongbao_v2 v2 ON  v2.hb_id=ho.`ho_hongbao_id`
        WHERE co.`co_order_no` = #{orderNo}
    </select>
    <select id="countValidOrderByDate" resultType="Long">
        SELECT IFNULL(COUNT(co_order_no),0) FROM
            (SELECT DISTINCT co.co_order_no FROM yeshi_ec_common_order co
             LEFT JOIN  yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
             LEFT JOIN yeshi_ec_hongbao_v2 v2 ON  v2.hb_id=ho.`ho_hongbao_id`
             WHERE co.`co_uid` = #{uid} AND v2.`hb_type` = 1
                   AND v2.`hb_state` = 3 AND  AND co.`co_third_create_time` <![CDATA[>]]> #{dateTime})A
    </select>
    <select id="countSameShopOrderByUidAndHongBaoType" resultType="Long">
        SELECT COUNT(*) FROM
        (
            SELECT a.*,COUNT(*) AS num FROM
            (
                SELECT co.*,COUNT(*) AS c,g.`cog_shop_id` AS shopId FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE  co.`co_uid`=#{uid}  AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                AND g.`cog_shop_id`>0 GROUP BY co.`co_order_no`,co.`co_source_type`
            ) a GROUP BY a.shopId
        ) b WHERE b.num>=#{minSameShopGoodsCount};
    </select>
    <select id="countSameGoodsOrderByUidAndHongBaoType" resultType="Long">
        SELECT COUNT(*) FROM
        (
            SELECT a.goodsId,COUNT(*) AS c FROM
            (
                SELECT co.`co_order_goods_id` AS goodsId,co.`co_order_no` FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE co.`co_uid`=#{uid} AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                GROUP BY co.`co_order_no`,co.`co_order_goods_id`
            ) a GROUP BY goodsId
        ) b WHERE b.c>=#{minSameGoodsOrderCount}
    </select>
    <select id="getSameShopOrderByUidAndHongBaoType" resultType="Long">
        SELECT b.shopId FROM
        (
            SELECT a.*,COUNT(*) AS num FROM
            (
                SELECT co.*,COUNT(*) AS c,g.`cog_shop_id` AS shopId FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE  co.`co_uid`=#{uid} AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                AND g.`cog_shop_id`>0 GROUP BY co.`co_order_no`,co.`co_source_type`
            ) a GROUP BY a.shopId
        ) b WHERE b.num>=#{minSameShopGoodsCount};
    </select>
    <select id="getSameGoodsOrderByUidAndHongBaoType" resultType="Long">
        SELECT b.goodsId FROM
        (
            SELECT a.goodsId,COUNT(*) AS c FROM
            (
                SELECT co.`co_order_goods_id` AS goodsId,co.`co_order_no` FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE co.`co_uid`=#{uid} AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                GROUP BY co.`co_order_no`,co.`co_order_goods_id`
            ) a GROUP BY goodsId
        ) b WHERE b.c>=#{minSameGoodsOrderCount}
    </select>
    <select id="countOderByUidAndDate" resultType="Integer">
        SELECT COUNT(1) FROM (SELECT d.`co_id` FROM `yeshi_ec_common_order` d
        WHERE d.`co_third_create_time`<![CDATA[<=]]> #{preDay} AND d.`co_uid` = #{uid}
              AND (d.`co_state`=1 OR d.`co_state`=2)
        GROUP BY d.`co_order_no`,d.`co_source_type`)A
    </select>
    <select id="countValidOrderByDay" resultMap="CountOrderMap">
        SELECT co_uid AS uid ,totalOrder FROM (
            SELECT COUNT(d.`co_id`) AS totalOrder,d.`co_uid` FROM `yeshi_ec_common_order` d
            WHERE DATE_FORMAT(d.`co_third_create_time`,'%Y-%m-%d') = '2019-11-11'  AND (d.`co_state`=1 OR d.`co_state`=2)
            GROUP BY d.`co_order_no`,d.`co_source_type`)A
        GROUP BY co_uid
    </select>
    <select id="countDownOrderUserByUidAndDate" resultType="Integer">
        SELECT COUNT(DISTINCT d.`co_uid`) FROM `yeshi_ec_common_order` d
        WHERE  d.`co_third_create_time`<![CDATA[<=]]> #{preDay} AND (d.`co_state`=1 OR d.`co_state`=2)
        <foreach collection="list" item="uid" open="AND (" separator="OR" close=")" >
            d.`co_uid` = #{uid}
        </foreach>
    </select>
    <select id="countCommissionByDay" resultMap="CountOrderMap">
    SELECT co_uid AS uid ,commission FROM (
            SELECT SUM(IFNULL(d.`co_eIncome`,d.`co_estimate`)) AS commission,d.`co_uid` FROM `yeshi_ec_common_order` d
            WHERE DATE_FORMAT(d.`co_third_create_time`,'%Y-%m-%d') = '2019-11-11'  AND (d.`co_state`=1 OR d.`co_state`=2)
            GROUP BY d.`co_order_no`,d.`co_source_type`)A
        GROUP BY co_uid
    </select>
    <select id="countOderByDate" resultType="Integer">
        SELECT COUNT(1) FROM (SELECT d.`co_id` FROM `yeshi_ec_common_order` d
        WHERE DATE_FORMAT(d.`co_third_create_time`,'%Y-%m-%d') = #{preDay} AND (d.`co_state`=1 OR d.`co_state`=2)
        GROUP BY d.`co_order_no`,d.`co_source_type`)A
    </select>
    <select id="countCommissionByDate" resultType="BigDecimal">
        SELECT SUM(IFNULL(d.`co_eIncome`,d.`co_estimate`)) FROM `yeshi_ec_common_order` d
        WHERE d.`co_third_create_time`= #{preDay} AND (d.`co_state`=1 OR d.`co_state`=2)
    </select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yeshi.fanli.dao.mybatis.order.CommonOrderCountMapper">
    <resultMap id="ChartMap" type="com.yeshi.fanli.dto.ChartTDO">
        <result column="showDate" property="showDate" jdbcType="VARCHAR" />
        <result column="showValue" property="showValue" jdbcType="VARCHAR" />
    </resultMap>
     <resultMap id="CountOrderMap" type="com.yeshi.fanli.dto.order.CountOrderDTO">
        <result column="uid" property="uid" jdbcType="BIGINT" />
        <result column="totalOrder" property="totalOrder" jdbcType="INTEGER" />
        <result column="commission" property="commission" jdbcType="DECIMAL" />
    </resultMap>
    <sql id="Column_DateType">
        <if test="dateType == 1">
            DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d') AS 'showDate'
        </if>
        <if test="dateType == 2">
            DATE_FORMAT(t.`co_third_create_time`,'%m') AS 'showDate'
        </if>
        <if test="dateType == 3">
            DATE_FORMAT(t.`co_third_create_time`,'%Y') AS 'showDate'
        </if>
    </sql>
    <sql id="Count_Select_DateType">
        <if test="startTime != null and startTime != '' ">
            AND DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d')<![CDATA[ >= ]]>'${startTime}'
        </if>
        <if test="endTime != null and endTime != '' ">
            AND DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d') <![CDATA[ <= ]]>'${endTime}'
        </if>
        <if test="year != null and year != '' ">
            AND DATE_FORMAT(t.`co_third_create_time`,'%Y') = '${year}'
        </if>
    </sql>
    <sql id="Count_Group_DateType">
        <if test="dateType == 1">
            GROUP BY DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d')
        </if>
        <if test="dateType == 2">
            GROUP BY DATE_FORMAT(t.`co_third_create_time`,'%Y-%m')
        </if>
        <if test="dateType == 3">
            GROUP BY DATE_FORMAT(t.`co_third_create_time`,'%Y')
        </if>
    </sql>
    <select id="countByState" resultType="java.lang.Long">
        SELECT IFNULL(COUNT(t.`co_id`),0) FROM  `yeshi_ec_common_order` t
        WHERE 1=1
            <if test="type != null">
                AND t.`co_state` = #{state}
            </if>
    </select>
    <select id="countOrderBySourceTypeAndDay" resultType="java.lang.Long">
        SELECT COUNT(t.`co_id`) FROM `yeshi_ec_common_order` t
        WHERE t.co_source_type=#{sourceType} AND DATE_FORMAT(t.`co_third_create_time`,'%Y-%m-%d') = #{preDay}
    </select>
    <select id="countOrderNumberBySettleTime" resultType="java.util.HashMap">
        <!-- 统计历史订单数量  根据结算时间 -->
        SELECT SUM(A.self)AS totalSelf,SUM(A.shared)AS totalShared,SUM(A.invite)AS totalInvite
        FROM (
            <!-- 返利订单 -->
            SELECT IFNULL(COUNT(ho_id),0) AS self,0 AS shared,0 AS invite
            FROM  (SELECT ho.`ho_id` FROM yeshi_ec_hongbao_order ho
                LEFT JOIN (
                    SELECT * FROM yeshi_ec_hongbao_v2 v2
                    WHERE v2.`hb_uid`= ${uid} and v2.hb_state!=4 AND (v2.`hb_type` = 1 OR v2.`hb_type` = 2)
                    ) hb  ON hb.hb_id=ho.`ho_hongbao_id` <!-- 自购订单 -->
            LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
            WHERE hb.hb_id IS NOT NULL
                 <if test="state != null">
                    AND co.`co_state` = ${state}
                </if>
                <if test="day != null and day == 1"> <!-- 今天 -->
                    AND TO_DAYS(co.`co_settle_time`) = TO_DAYS(NOW())
                </if>
                <if test="day != null and day == 2">  <!-- 昨天 -->
                    AND TO_DAYS(NOW()) - TO_DAYS(co.co_settle_time) = 1
                </if>
                <if test="day != null and day == 3">  <!-- 本月 -->
                    AND DATE_FORMAT(co.`co_settle_time`,'%Y%m') =
                    DATE_FORMAT(CURDATE(),'%Y%m')
                </if>
                <if test="day != null and day == 4">  <!-- 上月 -->
                    AND PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'),
                    DATE_FORMAT(co.`co_settle_time`, '%Y%m')) = 1
                </if>
            GROUP BY co.`co_order_no`, co.`co_source_type`)YX
            UNION ALL
            <!-- 分享订单 -->
            SELECT 0 AS self,IFNULL(COUNT(ho_id),0) AS shared,0 AS invite
            FROM  (SELECT ho.`ho_id` FROM yeshi_ec_hongbao_order ho
                    LEFT JOIN (
                        SELECT * FROM yeshi_ec_hongbao_v2 v2
                        WHERE v2.`hb_uid`= ${uid} AND v2.`hb_type` = 20 and v2.hb_state!=4
                    ) hb  ON hb.hb_id=ho.`ho_hongbao_id`  <!-- 分享订单 -->
                LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
                WHERE hb.hb_id IS NOT NULL and hb.hb_state!=4
                    <if test="state != null">
                        AND co.`co_state` = ${state}
                    </if>
                    <if test="day != null and day == 1"> <!-- 今天 -->
                        AND TO_DAYS(co.`co_settle_time`) = TO_DAYS(NOW())
                    </if>
                    <if test="day != null and day == 2">  <!-- 昨天 -->
                        AND TO_DAYS(NOW()) - TO_DAYS(co.`co_settle_time`) = 1
                    </if>
                    <if test="day != null and day == 3">  <!-- 本月 -->
                        AND DATE_FORMAT(co.`co_settle_time`,'%Y%m') =
                        DATE_FORMAT(CURDATE(),'%Y%m')
                    </if>
                    <if test="day != null and day == 4">  <!-- 上月 -->
                        AND PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'),
                        DATE_FORMAT(co.`co_settle_time`, '%Y%m')) = 1
                    </if>
                GROUP BY co.`co_order_no`, co.`co_source_type`)WQ
            UNION ALL
            <!-- 邀请订单 -->
            SELECT 0 AS self,0 AS shared,IFNULL(COUNT(ho_id),0) AS invite
            FROM  (SELECT ho.`ho_id` FROM yeshi_ec_hongbao_order ho
                LEFT JOIN (
                    SELECT * FROM yeshi_ec_hongbao_v2 v2
                    WHERE v2.`hb_uid`= ${uid}
                         AND (v2.`hb_type` = 5 OR v2.`hb_type` = 6 OR v2.`hb_type` = 7
                               OR v2.`hb_type` = 21 OR v2.`hb_type` = 22 ) and v2.hb_state!=4
                    ) hbp  ON hbp.hb_pid=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
                WHERE  hbp.hb_id IS NOT NULL and hbp.hb_state!=4
                    <if test="state != null">
                        AND co.`co_state` = ${state}
                    </if>
                    <if test="day != null and day == 1"> <!-- 今天 -->
                        AND TO_DAYS(co.`co_settle_time`) = TO_DAYS(NOW())
                    </if>
                    <if test="day != null and day == 2">  <!-- 昨天 -->
                        AND TO_DAYS(NOW()) - TO_DAYS(co.`co_settle_time`) = 1
                    </if>
                    <if test="day != null and day == 3">  <!-- 本月 -->
                        AND DATE_FORMAT(co.`co_settle_time`,'%Y%m') =
                        DATE_FORMAT(CURDATE(),'%Y%m')
                    </if>
                    <if test="day != null and day == 4">  <!-- 上月 -->
                        AND PERIOD_DIFF(DATE_FORMAT(NOW(), '%Y%m'),
                        DATE_FORMAT(co.`co_settle_time`, '%Y%m')) = 1
                    </if>
                GROUP BY co.`co_order_no`, co.`co_source_type`)SX
        )A
    </select>
    <select id="countValidOrder" resultType="java.lang.Long">
        SELECT IFNULL(COUNT(co.`co_id`),0) FROM yeshi_ec_hongbao_order ho
        LEFT JOIN (SELECT * FROM yeshi_ec_hongbao_v2 v2
            WHERE v2.`hb_uid`= #{uid}  AND v2.`hb_type` IN(1,20))hb
            ON IF(hb.hb_pid IS NULL,hb.hb_id,hb.hb_pid)=ho.`ho_hongbao_id`
        LEFT JOIN yeshi_ec_common_order co ON co.`co_id`=ho.`ho_order_id`
        WHERE hb.hb_id IS NOT NULL AND <![CDATA[co.`co_state` <> 4]]>
    </select>
    <select id="getMoneyByOrderNo" resultType="java.math.BigDecimal">
        SELECT SUM(v2.`hb_money`) FROM yeshi_ec_common_order co
        LEFT JOIN  yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
        LEFT JOIN yeshi_ec_hongbao_v2 v2 ON  v2.hb_id=ho.`ho_hongbao_id`
        WHERE co.`co_order_no` = #{orderNo}
    </select>
    <select id="countValidOrderByDate" resultType="Long">
        SELECT IFNULL(COUNT(co_order_no),0) FROM
            (SELECT DISTINCT co.co_order_no FROM yeshi_ec_common_order co
             LEFT JOIN  yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
             LEFT JOIN yeshi_ec_hongbao_v2 v2 ON  v2.hb_id=ho.`ho_hongbao_id`
             WHERE co.`co_uid` = #{uid} AND v2.`hb_type` = 1
                   AND v2.`hb_state` = 3 AND  AND co.`co_third_create_time` <![CDATA[>]]> #{dateTime})A
    </select>
    <select id="countSameShopOrderByUidAndHongBaoType" resultType="Long">
        SELECT COUNT(*) FROM
        (
            SELECT a.*,COUNT(*) AS num FROM
            (
                SELECT co.*,COUNT(*) AS c,g.`cog_shop_id` AS shopId FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE  co.`co_uid`=#{uid}  AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                AND g.`cog_shop_id`>0 GROUP BY co.`co_order_no`,co.`co_source_type`
            ) a GROUP BY a.shopId
        ) b WHERE b.num>=#{minSameShopGoodsCount};
    </select>
    <select id="countSameGoodsOrderByUidAndHongBaoType" resultType="Long">
        SELECT COUNT(*) FROM
        (
            SELECT a.goodsId,COUNT(*) AS c FROM
            (
                SELECT co.`co_order_goods_id` AS goodsId,co.`co_order_no` FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE co.`co_uid`=#{uid} AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                GROUP BY co.`co_order_no`,co.`co_order_goods_id`
            ) a GROUP BY goodsId
        ) b WHERE b.c>=#{minSameGoodsOrderCount}
    </select>
    <select id="getSameShopOrderByUidAndHongBaoType" resultType="Long">
        SELECT b.shopId FROM
        (
            SELECT a.*,COUNT(*) AS num FROM
            (
                SELECT co.*,COUNT(*) AS c,g.`cog_shop_id` AS shopId FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE  co.`co_uid`=#{uid} AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                AND g.`cog_shop_id`>0 GROUP BY co.`co_order_no`,co.`co_source_type`
            ) a GROUP BY a.shopId
        ) b WHERE b.num>=#{minSameShopGoodsCount};
    </select>
    <select id="getSameGoodsOrderByUidAndHongBaoType" resultType="Long">
        SELECT b.goodsId FROM
        (
            SELECT a.goodsId,COUNT(*) AS c FROM
            (
                SELECT co.`co_order_goods_id` AS goodsId,co.`co_order_no` FROM yeshi_ec_common_order co
                LEFT JOIN yeshi_ec_hongbao_order ho ON co.`co_id`=ho.`ho_order_id`
                LEFT JOIN yeshi_ec_hongbao_v2 v ON v.`hb_id`=ho.`ho_hongbao_id`
                LEFT JOIN yeshi_ec_common_order_goods g  ON co.`co_order_goods_id`=g.`cog_id`
                WHERE co.`co_uid`=#{uid} AND g.`cog_shop_id` <![CDATA[<>]]> 725677994  <!-- 天猫超市 -->
                <if test="typeList!=null">
                    <foreach collection="typeList" item="type" open=" and (" separator=" or " close=")">
                        v.`hb_type`=#{type}
                    </foreach>
                </if>
                AND v.`hb_id` IS NOT NULL
                AND (co.`co_state`=1 OR  co.`co_state`=2 OR co.`co_state`=3)
                GROUP BY co.`co_order_no`,co.`co_order_goods_id`
            ) a GROUP BY goodsId
        ) b WHERE b.c>=#{minSameGoodsOrderCount}
    </select>
    <select id="countOderByUidAndDate" resultType="Integer">
        SELECT COUNT(1) FROM (SELECT d.`co_id` FROM `yeshi_ec_common_order` d
        WHERE d.`co_third_create_time`<![CDATA[<=]]> #{preDay} AND d.`co_uid` = #{uid}
              AND (d.`co_state`=1 OR d.`co_state`=2)
        GROUP BY d.`co_order_no`,d.`co_source_type`)A
    </select>
    <select id="countValidOrderByDay" resultMap="CountOrderMap">
        SELECT co_uid AS uid ,totalOrder FROM (
            SELECT COUNT(d.`co_id`) AS totalOrder,d.`co_uid` FROM `yeshi_ec_common_order` d
            WHERE DATE_FORMAT(d.`co_third_create_time`,'%Y-%m-%d') = '2019-11-11'  AND (d.`co_state`=1 OR d.`co_state`=2)
            GROUP BY d.`co_order_no`,d.`co_source_type`)A
        GROUP BY co_uid
    </select>
    <select id="countDownOrderUserByUidAndDate" resultType="Integer">
        SELECT COUNT(DISTINCT d.`co_uid`) FROM `yeshi_ec_common_order` d
        WHERE  d.`co_third_create_time`<![CDATA[<=]]> #{preDay} AND (d.`co_state`=1 OR d.`co_state`=2)
        <foreach collection="list" item="uid" open="AND (" separator="OR" close=")" >
            d.`co_uid` = #{uid}
        </foreach>
    </select>
    <select id="countCommissionByDay" resultMap="CountOrderMap">
    SELECT co_uid AS uid ,commission FROM (
            SELECT SUM(IFNULL(d.`co_eIncome`,d.`co_estimate`)) AS commission,d.`co_uid` FROM `yeshi_ec_common_order` d
            WHERE DATE_FORMAT(d.`co_third_create_time`,'%Y-%m-%d') = '2019-11-11'  AND (d.`co_state`=1 OR d.`co_state`=2)
            GROUP BY d.`co_order_no`,d.`co_source_type`)A
        GROUP BY co_uid
    </select>
    <select id="countOderByDate" resultType="Integer">
        SELECT COUNT(1) FROM (SELECT d.`co_id` FROM `yeshi_ec_common_order` d
        WHERE DATE_FORMAT(d.`co_third_create_time`,'%Y-%m-%d') = #{preDay} AND (d.`co_state`=1 OR d.`co_state`=2)
        GROUP BY d.`co_order_no`,d.`co_source_type`)A
    </select>
    <select id="countCommissionByDate" resultType="BigDecimal">
        SELECT SUM(IFNULL(d.`co_eIncome`,d.`co_estimate`)) FROM `yeshi_ec_common_order` d
        WHERE d.`co_third_create_time`= #{preDay} AND (d.`co_state`=1 OR d.`co_state`=2)
    </select>
    <select id="countOderByUidAndLess10" resultType="Integer">
        SELECT count(1) from (SELECT SUM(d.co_payment) as payment FROM `yeshi_ec_common_order` d
        where d.co_uid = #{uid} and d.co_source_type = 1  and d.co_state <![CDATA[<>]]> 4
        GROUP BY d.`co_order_no`
        ORDER BY d.co_third_create_time desc
        limit 50)A where A.payment<![CDATA[<]]> 10
    </select>
</mapper>
fanli/src/main/java/com/yeshi/fanli/mapping/order/CommonOrderMapper.xml
@@ -810,6 +810,11 @@
        <include refid="SELECT_PARAM_ORDER_CREATE_TIME" />
        <!-- 订单时间 -->
        <if test="orderNo != null and orderNo !='' ">AND co.co_order_no = #{orderNo}</if>
        <if test="payment != null">
            AND co.co_payment <![CDATA[<]]> #{payment}
        </if>
        ORDER BY co.co_third_create_time DESC LIMIT ${start},${count}
    </select>
    <select id="countQueryByUid" resultType="java.lang.Long">
@@ -908,6 +913,9 @@
        </if>
        <!-- 订单来源 -->
        <if test="source != null">AND co.co_source_type = #{source}</if>
        <if test="payment != null">
            AND co.co_payment <![CDATA[<]]> #{payment}
        </if>
        ORDER BY co.co_third_create_time DESC LIMIT ${start},${count} ) A LEFT
        JOIN yeshi_ec_user u ON u.id = A.hb_uid
    </select>
@@ -944,6 +952,9 @@
            <foreach collection="listShopId" item="shopId" open=" and ("
                separator=" or " close=")">g.`cog_shop_id` =#{shopId}</foreach>
        </if>
        <if test="payment != null">
            AND co.co_payment <![CDATA[<]]> #{payment}
        </if>
        <if test="minTime != null">
            <!-- 高风险订单 -->
            AND co.`co_third_create_time`&gt;#{minTime} AND<![CDATA[ (co.`co_estimate`>=  ${money} OR co.`co_eIncome`> ${money})]]>
@@ -968,6 +979,9 @@
            <if test="keyType == 1 ">AND co.co_order_no = '${key}'</if>
            <if test="keyType == 2 ">AND hb.hb_uid = ${key}</if>
        </if>
        <if test="payment != null">
            AND co.co_payment <![CDATA[<]]> #{payment}
        </if>
        <!-- 订单来源 -->
        <if test="source != null">AND co.co_source_type = #{source}</if>
    </select>
fanli/src/main/java/com/yeshi/fanli/service/impl/count/CommonOrderCountServiceImpl.java
@@ -1,330 +1,335 @@
package com.yeshi.fanli.service.impl.count;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.yeshi.utils.DateUtil;
import com.yeshi.fanli.dao.mybatis.jd.JDOrderItemMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderCountMapper;
import com.yeshi.fanli.dao.mybatis.pdd.PDDOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanOrderMapper;
import com.yeshi.fanli.dao.user.count.CountOrderInfoDao;
import com.yeshi.fanli.dao.user.count.CountOrderTrackRateDao;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.dto.order.CountOrderDTO;
import com.yeshi.fanli.entity.admin.count.CountOrderTrackRate;
import com.yeshi.fanli.entity.admin.count.CountOrderTrackRate.OrderTrackRateEnum;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
@Service
public class CommonOrderCountServiceImpl implements CommonOrderCountService {
    @Resource
    private TaoBaoWeiQuanOrderMapper taoBaoWeiQuanOrderMapper;
    @Resource
    private TaoBaoOrderMapper taoBaoOrderMapper;
    @Resource
    private JDOrderItemMapper jdOrderItemMapper;
    @Resource
    private PDDOrderMapper pddOrderMapper;
    @Resource
    private CommonOrderCountMapper commonOrderCountMapper;
    @Resource
    private CountOrderInfoDao countOrderInfoDao;
    @Resource
    private CountOrderTrackRateDao countOrderTrackRateDao;
    @Override
    public Long countByState(Integer state) {
        return commonOrderCountMapper.countByState(state);
    }
    public List<ChartTDO> dayFactory(String startTime, String endTime, List<ChartTDO> list) throws Exception {
        List<ChartTDO> listObject = new ArrayList<ChartTDO>();
        if (startTime.equals(endTime)) {
            ChartTDO chartTDO = list.get(0);
            String showValue = chartTDO.getShowValue();
            if (showValue == null) {
                chartTDO.setShowValue("0");
            }
            listObject.add(chartTDO);
            return listObject;
        }
        String plusDay = "";
        for (int i = 0; i < 1000; i++) {
            if (i == 0) {
                plusDay = startTime;
            } else {
                plusDay = DateUtil.plusDay(i, startTime);
            }
            String total = null;
            for (int j = 0; j < list.size(); j++) {
                ChartTDO chartTDO = list.get(j);
                String showDate = chartTDO.getShowDate();
                if (plusDay.equalsIgnoreCase(showDate)) {
                    total = chartTDO.getShowValue();
                    break;
                }
            }
            if (total == null) {
                total = "0";
            }
            ChartTDO chartTDO = new ChartTDO();
            chartTDO.setShowDate(plusDay);
            chartTDO.setShowValue(total);
            listObject.add(chartTDO);
            if (plusDay.equals(endTime)) {
                break; // 时间结束
            }
        }
        return listObject;
    }
    public List<ChartTDO> monthFactory(List<ChartTDO> list) {
        List<ChartTDO> listObject = new ArrayList<ChartTDO>();
        // 12 个月处理
        for (int i = 1; i <= 12; i++) {
            String total = null;
            for (int j = 0; j < list.size(); j++) {
                ChartTDO chartTDO = list.get(j);
                String month = chartTDO.getShowDate();
                if ((i + "").equalsIgnoreCase(month) || i == Integer.parseInt(month)) {
                    total = chartTDO.getShowValue();
                    break;
                }
            }
            if (total == null) {
                total = "0";
            }
            ChartTDO chartTDO = new ChartTDO();
            chartTDO.setShowValue(total);
            if (i < 10) {
                chartTDO.setShowDate("0" + i);
            } else {
                chartTDO.setShowDate(i + "");
            }
            listObject.add(chartTDO);
        }
        return listObject;
    }
    public List<ChartTDO> yearFactory(List<ChartTDO> list) {
        List<ChartTDO> listObject = new ArrayList<ChartTDO>();
        for (int i = 0; i < list.size(); i++) {
            ChartTDO chartTDO = list.get(i);
            String showValue = chartTDO.getShowValue();
            if (showValue == null) {
                chartTDO.setShowValue("0");
            }
            listObject.add(chartTDO);
        }
        return listObject;
    }
    @Override
    public List<ChartTDO> countWeiQaunOrderMoney(Integer dateType, String year, String startTime, String endTime)
            throws Exception {
        return taoBaoWeiQuanOrderMapper.countWeiQaunOrderMoney(dateType, year, startTime, endTime);
    }
    @Override
    public List<ChartTDO> countWeiQaunOrderNumber(Integer dateType, String year, String startTime, String endTime)
            throws Exception {
        return taoBaoWeiQuanOrderMapper.countWeiQaunOrderNumber(dateType, year, startTime, endTime);
    }
    @Override
    public Map<String, Object> countOrderNumberBySettleTime(Long uid, Integer state, Integer day) {
        return commonOrderCountMapper.countOrderNumberBySettleTime(uid, state, day);
    }
    /**
     * 根据结算时间筛选 上个月已结算的订订单数量
     *
     * @param uid
     * @return
     */
    @Override
    public Map<String, Object> lastMonthSettleOrderNumber(Long uid) {
        return countOrderNumberBySettleTime(uid, 2, 4); // 根据
    }
    @Override
    public BigDecimal getMoneyByOrderNo(String orderNo) {
        return commonOrderCountMapper.getMoneyByOrderNo(orderNo);
    }
    @Override
    public long countValidOrderByDate(Long uid, String dateTime) {
        return commonOrderCountMapper.countValidOrderByDate(uid, dateTime);
    }
    @Override
    public long countSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount) {
        return commonOrderCountMapper.countSameShopOrderByUidAndHongBaoType(typeList, uid, minSameShopGoodsCount);
    }
    @Override
    public long countSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount) {
        return commonOrderCountMapper.countSameGoodsOrderByUidAndHongBaoType(typeList, uid, minSameGoodsOrderCount);
    }
    @Override
    public List<Long> getSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount) {
        return commonOrderCountMapper.getSameShopOrderByUidAndHongBaoType(typeList, uid, minSameShopGoodsCount);
    }
    @Override
    public List<Long> getSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount) {
        return commonOrderCountMapper.getSameGoodsOrderByUidAndHongBaoType(typeList, uid, minSameGoodsOrderCount);
    }
    @Override
    public Integer countOderByUidAndDate(Date preDay, Long uid) {
        return commonOrderCountMapper.countOderByUidAndDate(preDay, uid);
    }
    @Override
    public List<CountOrderDTO> countValidOrderByDay(String preDay) {
        return commonOrderCountMapper.countValidOrderByDay(preDay);
    }
    @Override
    public Integer countDownOrderUserByUidAndDate(Date preDay, List<Long> list) {
        return commonOrderCountMapper.countDownOrderUserByUidAndDate(preDay, list);
    }
    @Override
    public List<CountOrderDTO> countCommissionByDay(String preDay) {
        return commonOrderCountMapper.countCommissionByDay(preDay);
    }
    @Override
    public Integer countOderByDate(String preDay) {
        return commonOrderCountMapper.countOderByDate(preDay);
    }
    @Override
    public BigDecimal countCommissionByDate(String preDay) {
        return commonOrderCountMapper.countCommissionByDate(preDay);
    }
    @Override
    public List<CountOrderTrackRate> getOrderTrackRate(int type, Date startTime, Date endTime) {
        OrderTrackRateEnum trackRateEnum = null;
        if (type == 1) {
            trackRateEnum = OrderTrackRateEnum.taobao;
        } else if (type == 2) {
            trackRateEnum = OrderTrackRateEnum.jd;
        } else if (type == 3) {
            trackRateEnum = OrderTrackRateEnum.pdd;
        } else {
            trackRateEnum = OrderTrackRateEnum.taobao;
        }
        // 重新查询统计今日以及空缺
        initOrderTrackRate(trackRateEnum);
        return countOrderTrackRateDao.query(trackRateEnum, startTime, endTime);
    }
    // 初始化统计
    private void initOrderTrackRate(OrderTrackRateEnum trackRateEnum) {
        try {
            CountOrderTrackRate lastRecord = countOrderTrackRateDao.getMaxDate(trackRateEnum);
            Date lastDay = null;
            if (lastRecord != null && lastRecord.getDay() != null) {
                lastDay = lastRecord.getDay();
            }
            if (lastDay == null) {
                lastDay = TimeUtil.parse("2018-01-01");
            }
            Date today = new Date();
            int betweenDays = DateUtil.daysBetween2(lastDay, today);
            if (betweenDays > 0) {
                for (int i = 0; i <= betweenDays; i++) {
                    addOrderTrackRateCount(DateUtil.plusDay(i, lastDay), trackRateEnum);
                }
            } else {
                // 重新统计昨日
                addOrderTrackRateCount(DateUtil.reduceDay2(1, lastDay), trackRateEnum);
                // 重新统计今日
                addOrderTrackRateCount(TimeUtil.getGernalTime(today.getTime()), trackRateEnum);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void addOrderTrackRateCount(String preDay, OrderTrackRateEnum trackRateEnum) throws Exception {
        int value = trackRateEnum.getValue();
        Long count = commonOrderCountMapper.countOrderBySourceTypeAndDay(preDay,value);
        if (count == null) {
            count = 0L;
        }
        Long total = null;
        switch (value) {
        case Constant.SOURCE_TYPE_TAOBAO:
            total = taoBaoOrderMapper.countOrderByDay(preDay);
            break;
        case Constant.SOURCE_TYPE_JD:
            total = jdOrderItemMapper.countOrderByDay(preDay);
            break;
        case Constant.SOURCE_TYPE_PDD:
            total = pddOrderMapper.countOrderByDay(preDay);
            break;
        }
        if(total == null)
            total = 0L;
        CountOrderTrackRate record = new CountOrderTrackRate();
        record.setNum(count);
        record.setTotalNum(total);
        record.setDay(TimeUtil.parse(preDay));
        record.setType(trackRateEnum.name());
        record.setId(StringUtil.Md5(preDay + trackRateEnum.name()));
        countOrderTrackRateDao.save(record);
    }
}
package com.yeshi.fanli.service.impl.count;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import org.yeshi.utils.DateUtil;
import com.yeshi.fanli.dao.mybatis.jd.JDOrderItemMapper;
import com.yeshi.fanli.dao.mybatis.order.CommonOrderCountMapper;
import com.yeshi.fanli.dao.mybatis.pdd.PDDOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoOrderMapper;
import com.yeshi.fanli.dao.mybatis.taobao.TaoBaoWeiQuanOrderMapper;
import com.yeshi.fanli.dao.user.count.CountOrderInfoDao;
import com.yeshi.fanli.dao.user.count.CountOrderTrackRateDao;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.dto.order.CountOrderDTO;
import com.yeshi.fanli.entity.admin.count.CountOrderTrackRate;
import com.yeshi.fanli.entity.admin.count.CountOrderTrackRate.OrderTrackRateEnum;
import com.yeshi.fanli.service.inter.order.CommonOrderCountService;
import com.yeshi.fanli.util.Constant;
import com.yeshi.fanli.util.StringUtil;
import com.yeshi.fanli.util.TimeUtil;
@Service
public class CommonOrderCountServiceImpl implements CommonOrderCountService {
    @Resource
    private TaoBaoWeiQuanOrderMapper taoBaoWeiQuanOrderMapper;
    @Resource
    private TaoBaoOrderMapper taoBaoOrderMapper;
    @Resource
    private JDOrderItemMapper jdOrderItemMapper;
    @Resource
    private PDDOrderMapper pddOrderMapper;
    @Resource
    private CommonOrderCountMapper commonOrderCountMapper;
    @Resource
    private CountOrderInfoDao countOrderInfoDao;
    @Resource
    private CountOrderTrackRateDao countOrderTrackRateDao;
    @Override
    public Long countByState(Integer state) {
        return commonOrderCountMapper.countByState(state);
    }
    @Override
    public Integer countOderByUidAndLess10(Long uid) {
        return commonOrderCountMapper.countOderByUidAndLess10(uid);
    }
    public List<ChartTDO> dayFactory(String startTime, String endTime, List<ChartTDO> list) throws Exception {
        List<ChartTDO> listObject = new ArrayList<ChartTDO>();
        if (startTime.equals(endTime)) {
            ChartTDO chartTDO = list.get(0);
            String showValue = chartTDO.getShowValue();
            if (showValue == null) {
                chartTDO.setShowValue("0");
            }
            listObject.add(chartTDO);
            return listObject;
        }
        String plusDay = "";
        for (int i = 0; i < 1000; i++) {
            if (i == 0) {
                plusDay = startTime;
            } else {
                plusDay = DateUtil.plusDay(i, startTime);
            }
            String total = null;
            for (int j = 0; j < list.size(); j++) {
                ChartTDO chartTDO = list.get(j);
                String showDate = chartTDO.getShowDate();
                if (plusDay.equalsIgnoreCase(showDate)) {
                    total = chartTDO.getShowValue();
                    break;
                }
            }
            if (total == null) {
                total = "0";
            }
            ChartTDO chartTDO = new ChartTDO();
            chartTDO.setShowDate(plusDay);
            chartTDO.setShowValue(total);
            listObject.add(chartTDO);
            if (plusDay.equals(endTime)) {
                break; // 时间结束
            }
        }
        return listObject;
    }
    public List<ChartTDO> monthFactory(List<ChartTDO> list) {
        List<ChartTDO> listObject = new ArrayList<ChartTDO>();
        // 12 个月处理
        for (int i = 1; i <= 12; i++) {
            String total = null;
            for (int j = 0; j < list.size(); j++) {
                ChartTDO chartTDO = list.get(j);
                String month = chartTDO.getShowDate();
                if ((i + "").equalsIgnoreCase(month) || i == Integer.parseInt(month)) {
                    total = chartTDO.getShowValue();
                    break;
                }
            }
            if (total == null) {
                total = "0";
            }
            ChartTDO chartTDO = new ChartTDO();
            chartTDO.setShowValue(total);
            if (i < 10) {
                chartTDO.setShowDate("0" + i);
            } else {
                chartTDO.setShowDate(i + "");
            }
            listObject.add(chartTDO);
        }
        return listObject;
    }
    public List<ChartTDO> yearFactory(List<ChartTDO> list) {
        List<ChartTDO> listObject = new ArrayList<ChartTDO>();
        for (int i = 0; i < list.size(); i++) {
            ChartTDO chartTDO = list.get(i);
            String showValue = chartTDO.getShowValue();
            if (showValue == null) {
                chartTDO.setShowValue("0");
            }
            listObject.add(chartTDO);
        }
        return listObject;
    }
    @Override
    public List<ChartTDO> countWeiQaunOrderMoney(Integer dateType, String year, String startTime, String endTime)
            throws Exception {
        return taoBaoWeiQuanOrderMapper.countWeiQaunOrderMoney(dateType, year, startTime, endTime);
    }
    @Override
    public List<ChartTDO> countWeiQaunOrderNumber(Integer dateType, String year, String startTime, String endTime)
            throws Exception {
        return taoBaoWeiQuanOrderMapper.countWeiQaunOrderNumber(dateType, year, startTime, endTime);
    }
    @Override
    public Map<String, Object> countOrderNumberBySettleTime(Long uid, Integer state, Integer day) {
        return commonOrderCountMapper.countOrderNumberBySettleTime(uid, state, day);
    }
    /**
     * 根据结算时间筛选 上个月已结算的订订单数量
     *
     * @param uid
     * @return
     */
    @Override
    public Map<String, Object> lastMonthSettleOrderNumber(Long uid) {
        return countOrderNumberBySettleTime(uid, 2, 4); // 根据
    }
    @Override
    public BigDecimal getMoneyByOrderNo(String orderNo) {
        return commonOrderCountMapper.getMoneyByOrderNo(orderNo);
    }
    @Override
    public long countValidOrderByDate(Long uid, String dateTime) {
        return commonOrderCountMapper.countValidOrderByDate(uid, dateTime);
    }
    @Override
    public long countSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount) {
        return commonOrderCountMapper.countSameShopOrderByUidAndHongBaoType(typeList, uid, minSameShopGoodsCount);
    }
    @Override
    public long countSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount) {
        return commonOrderCountMapper.countSameGoodsOrderByUidAndHongBaoType(typeList, uid, minSameGoodsOrderCount);
    }
    @Override
    public List<Long> getSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount) {
        return commonOrderCountMapper.getSameShopOrderByUidAndHongBaoType(typeList, uid, minSameShopGoodsCount);
    }
    @Override
    public List<Long> getSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount) {
        return commonOrderCountMapper.getSameGoodsOrderByUidAndHongBaoType(typeList, uid, minSameGoodsOrderCount);
    }
    @Override
    public Integer countOderByUidAndDate(Date preDay, Long uid) {
        return commonOrderCountMapper.countOderByUidAndDate(preDay, uid);
    }
    @Override
    public List<CountOrderDTO> countValidOrderByDay(String preDay) {
        return commonOrderCountMapper.countValidOrderByDay(preDay);
    }
    @Override
    public Integer countDownOrderUserByUidAndDate(Date preDay, List<Long> list) {
        return commonOrderCountMapper.countDownOrderUserByUidAndDate(preDay, list);
    }
    @Override
    public List<CountOrderDTO> countCommissionByDay(String preDay) {
        return commonOrderCountMapper.countCommissionByDay(preDay);
    }
    @Override
    public Integer countOderByDate(String preDay) {
        return commonOrderCountMapper.countOderByDate(preDay);
    }
    @Override
    public BigDecimal countCommissionByDate(String preDay) {
        return commonOrderCountMapper.countCommissionByDate(preDay);
    }
    @Override
    public List<CountOrderTrackRate> getOrderTrackRate(int type, Date startTime, Date endTime) {
        OrderTrackRateEnum trackRateEnum = null;
        if (type == 1) {
            trackRateEnum = OrderTrackRateEnum.taobao;
        } else if (type == 2) {
            trackRateEnum = OrderTrackRateEnum.jd;
        } else if (type == 3) {
            trackRateEnum = OrderTrackRateEnum.pdd;
        } else {
            trackRateEnum = OrderTrackRateEnum.taobao;
        }
        // 重新查询统计今日以及空缺
        initOrderTrackRate(trackRateEnum);
        return countOrderTrackRateDao.query(trackRateEnum, startTime, endTime);
    }
    // 初始化统计
    private void initOrderTrackRate(OrderTrackRateEnum trackRateEnum) {
        try {
            CountOrderTrackRate lastRecord = countOrderTrackRateDao.getMaxDate(trackRateEnum);
            Date lastDay = null;
            if (lastRecord != null && lastRecord.getDay() != null) {
                lastDay = lastRecord.getDay();
            }
            if (lastDay == null) {
                lastDay = TimeUtil.parse("2018-01-01");
            }
            Date today = new Date();
            int betweenDays = DateUtil.daysBetween2(lastDay, today);
            if (betweenDays > 0) {
                for (int i = 0; i <= betweenDays; i++) {
                    addOrderTrackRateCount(DateUtil.plusDay(i, lastDay), trackRateEnum);
                }
            } else {
                // 重新统计昨日
                addOrderTrackRateCount(DateUtil.reduceDay2(1, lastDay), trackRateEnum);
                // 重新统计今日
                addOrderTrackRateCount(TimeUtil.getGernalTime(today.getTime()), trackRateEnum);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private void addOrderTrackRateCount(String preDay, OrderTrackRateEnum trackRateEnum) throws Exception {
        int value = trackRateEnum.getValue();
        Long count = commonOrderCountMapper.countOrderBySourceTypeAndDay(preDay,value);
        if (count == null) {
            count = 0L;
        }
        Long total = null;
        switch (value) {
        case Constant.SOURCE_TYPE_TAOBAO:
            total = taoBaoOrderMapper.countOrderByDay(preDay);
            break;
        case Constant.SOURCE_TYPE_JD:
            total = jdOrderItemMapper.countOrderByDay(preDay);
            break;
        case Constant.SOURCE_TYPE_PDD:
            total = pddOrderMapper.countOrderByDay(preDay);
            break;
        }
        if(total == null)
            total = 0L;
        CountOrderTrackRate record = new CountOrderTrackRate();
        record.setNum(count);
        record.setTotalNum(total);
        record.setDay(TimeUtil.parse(preDay));
        record.setType(trackRateEnum.name());
        record.setId(StringUtil.Md5(preDay + trackRateEnum.name()));
        countOrderTrackRateDao.save(record);
    }
}
fanli/src/main/java/com/yeshi/fanli/service/impl/order/CommonOrderServiceImpl.java
Diff too large
fanli/src/main/java/com/yeshi/fanli/service/inter/order/CommonOrderCountService.java
@@ -1,195 +1,203 @@
package com.yeshi.fanli.service.inter.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.dto.order.CountOrderDTO;
import com.yeshi.fanli.entity.admin.count.CountOrderTrackRate;
public interface CommonOrderCountService {
    /**
     * 当前各个状态订单数
     *
     * @param state
     *            状态
     * @return
     */
    public Long countByState(Integer state);
    /**
     * 统计总金额
     *
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public List<ChartTDO> countWeiQaunOrderMoney(Integer dateType, String year, String startTime, String endTime)
            throws Exception;
    /**
     * 统计总个数
     *
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public List<ChartTDO> countWeiQaunOrderNumber(Integer dateType, String year, String startTime, String endTime)
            throws Exception;
    /**
     * 根据结算时间统计
     *
     * @param uid
     * @param state
     * @param day
     * @return
     * @throws Exception
     */
    public Map<String, Object> countOrderNumberBySettleTime(Long uid, Integer state, Integer day);
    /**
     * 根据结算时间筛选 上个月已结算的订订单数量
     *
     * @param uid
     * @return
     */
    public Map<String, Object> lastMonthSettleOrderNumber(Long uid);
    /**
     * 根据订单号 统计奖励券加成金额
     *
     * @param orderNo
     * @return
     */
    BigDecimal getMoneyByOrderNo(String orderNo);
    /**
     * 统计已到账返利订单
     *
     * @param uid
     * @param dateTime
     * @return
     */
    public long countValidOrderByDate(Long uid, String dateTime);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺数量
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    long countSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品数量
     *
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    long countSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺id
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    List<Long> getSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品id
     *
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    List<Long> getSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount);
    /**
     * 统计日期内产生有效订单数量(返利 + 分享)
     * @param preDay
     * @param uid
     * @return
     */
    public Integer countOderByUidAndDate(Date preDay, Long uid);
    /**
     * 统计日期内产生有效订单数量(返利 + 分享) 多个uid
     * @param preDay
     * @param uid
     * @return
     */
    //public Integer countOrderByUidsAndDate(Date preDay, List<Long> list);
    /**
     * 统计再此时间内  产生订单的用户数量
     * @param preDay
     * @param list
     * @return
     */
    public Integer countDownOrderUserByUidAndDate(Date preDay, List<Long> list);
    /**
     * 统计订单佣金
     * @param preDay
     * @param list
     * @return
     */
    List<CountOrderDTO> countCommissionByDay(String preDay);
    /**
     * 总订单数 每-天
     * @param preDay
     * @return
     */
    public Integer countOderByDate(String preDay);
    /**
     * 统计订单佣金
     * @param preDay
     * @return
     */
    public BigDecimal countCommissionByDate(String preDay);
    /**
     * 当日每个用户下单数量
     * @param preDay
     * @return
     */
    public List<CountOrderDTO> countValidOrderByDay(String preDay);
    /**
     * 统计跟踪率
     * @param type
     * @param startTime
     * @param endTime
     * @return
     */
    public List<CountOrderTrackRate> getOrderTrackRate(int type, Date startTime, Date endTime);
}
package com.yeshi.fanli.service.inter.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.yeshi.fanli.dto.ChartTDO;
import com.yeshi.fanli.dto.order.CountOrderDTO;
import com.yeshi.fanli.entity.admin.count.CountOrderTrackRate;
public interface CommonOrderCountService {
    /**
     * 当前各个状态订单数
     *
     * @param state
     *            状态
     * @return
     */
    public Long countByState(Integer state);
    /**
     * 统计总金额
     *
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public List<ChartTDO> countWeiQaunOrderMoney(Integer dateType, String year, String startTime, String endTime)
            throws Exception;
    /**
     * 统计总个数
     *
     * @param dateType
     * @param year
     * @param startTime
     * @param endTime
     * @return
     * @throws Exception
     */
    public List<ChartTDO> countWeiQaunOrderNumber(Integer dateType, String year, String startTime, String endTime)
            throws Exception;
    /**
     * 根据结算时间统计
     *
     * @param uid
     * @param state
     * @param day
     * @return
     * @throws Exception
     */
    public Map<String, Object> countOrderNumberBySettleTime(Long uid, Integer state, Integer day);
    /**
     * 根据结算时间筛选 上个月已结算的订订单数量
     *
     * @param uid
     * @return
     */
    public Map<String, Object> lastMonthSettleOrderNumber(Long uid);
    /**
     * 根据订单号 统计奖励券加成金额
     *
     * @param orderNo
     * @return
     */
    BigDecimal getMoneyByOrderNo(String orderNo);
    /**
     * 统计已到账返利订单
     *
     * @param uid
     * @param dateTime
     * @return
     */
    public long countValidOrderByDate(Long uid, String dateTime);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺数量
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    long countSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品数量
     *
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    long countSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount);
    /**
     * 查询用户在同一店铺购买超过一定数量商品的店铺id
     *
     * @param typeList
     *            -红包类型
     * @param uid
     *            -用户ID
     * @param minSameShopGoodsCount
     *            -同一店铺买的最小订单数
     * @return
     */
    List<Long> getSameShopOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameShopGoodsCount);
    /**
     * 查询用户购买相同商品超过一定的订单数量的商品id
     *
     * @param typeList
     * @param uid
     * @param minSameGoodsOrderCount
     * @return
     */
    List<Long> getSameGoodsOrderByUidAndHongBaoType(List<Integer> typeList, Long uid, int minSameGoodsOrderCount);
    /**
     * 统计日期内产生有效订单数量(返利 + 分享)
     * @param preDay
     * @param uid
     * @return
     */
    public Integer countOderByUidAndDate(Date preDay, Long uid);
    /**
     * 统计日期内产生有效订单数量(返利 + 分享) 多个uid
     * @param preDay
     * @param uid
     * @return
     */
    //public Integer countOrderByUidsAndDate(Date preDay, List<Long> list);
    /**
     * 统计再此时间内  产生订单的用户数量
     * @param preDay
     * @param list
     * @return
     */
    public Integer countDownOrderUserByUidAndDate(Date preDay, List<Long> list);
    /**
     * 统计订单佣金
     * @param preDay
     * @param list
     * @return
     */
    List<CountOrderDTO> countCommissionByDay(String preDay);
    /**
     * 总订单数 每-天
     * @param preDay
     * @return
     */
    public Integer countOderByDate(String preDay);
    /**
     * 统计订单佣金
     * @param preDay
     * @return
     */
    public BigDecimal countCommissionByDate(String preDay);
    /**
     * 当日每个用户下单数量
     * @param preDay
     * @return
     */
    public List<CountOrderDTO> countValidOrderByDay(String preDay);
    /**
     * 统计跟踪率
     * @param type
     * @param startTime
     * @param endTime
     * @return
     */
    public List<CountOrderTrackRate> getOrderTrackRate(int type, Date startTime, Date endTime);
    /**
     * 查询最近50小于10的订单数量
     * @param uid
     * @return
     */
    public Integer countOderByUidAndLess10(Long uid);
}
fanli/src/main/java/com/yeshi/fanli/service/inter/order/CommonOrderService.java
@@ -1,379 +1,379 @@
package com.yeshi.fanli.service.inter.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.yeshi.fanli.dto.order.CommonOrderAddResultDTO;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.jd.JDOrder;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.ESOrder;
import com.yeshi.fanli.entity.pdd.PDDOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.exception.order.CommonOrderException;
import com.yeshi.fanli.vo.order.CommonOrderVO;
import com.yeshi.fanli.vo.order.OrderCountVO;
import net.sf.json.JSONObject;
public interface CommonOrderService {
    public int insert(CommonOrder record);
    public int insertSelective(CommonOrder record);
    public int updateByPrimaryKey(CommonOrder record);
    public int updateByPrimaryKeySelective(CommonOrder record);
    public int deleteByPrimaryKey(Long id);
    public CommonOrder selectByPrimaryKey(Long id);
    /**
     * 查询用户订单 并订单号分组
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderNo
     *            订单号
     * @param startTime
     *            起始系统录入时间
     * @param endTime
     *            结束系统录入时间
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderVO> listGroupOrderNoByUid(long start, int count, Long uid, Integer state, Integer type,
            Integer orderState, String orderNo, String startTime, String endTime, Integer dateType, Integer source)
            throws CommonOrderException;
    /**
     * 统计查询
     *
     * @param uid
     * @param state
     * @param type
     * @param orderNo
     * @param startTime
     * @param endTime
     * @return
     * @throws CommonOrderException
     */
    long countGroupOrderNoByUid(Long uid, Integer state, Integer type, Integer orderState, String orderNo,
            String startTime, String endTime, Integer dateType, List<Integer> listSource) throws CommonOrderException;
    /**
     * 移动段订单列表
     *
     * @param start
     * @param count
     * @param uid
     *            用户id
     * @param type
     *            到账状态
     * @return
     */
    public List<CommonOrderVO> getOrderByUid(AcceptData acceptData, Integer page, Long uid, Integer state, Integer type,
            Integer orderState, String orderNo, String startTime, String endTime, Integer dateType, List<Integer> listSource)
            throws CommonOrderException,Exception;
    /**
     * 统计订单-根据红包类型 自购 邀请 分享
     *
     * @param uid
     * @return
     */
    public Map<String, BigDecimal> countHistoryOrder(Long uid, Integer day, Integer source);
    /**
     * 统计订单
     *
     * @param uid
     * @return
     */
    public long countBonusOrderNumber(Long uid, Integer type, Integer isToday, String startTime, String endTime,
            Integer source);
    /**
     * 统计订单
     *
     * @param uid
     * @return
     */
    public BigDecimal countBonusOrderMoney(Long uid, Integer type, Integer isToday, String startTime, String endTime,
            Integer source);
    /**
     * 统计奖金订单数量、金额
     *
     * @param uid
     * @param type
     * @param day
     * @param startTime
     * @param endTime
     * @return
     */
    public Map<String, Object> countBonusOrderMoneyAndNumber(Long uid, Integer type, Integer day, String startTime,
            String endTime, Integer source);
    /**
     * 根据条件统计
     *
     * @param uid
     * @param type
     * @param startTime
     * @param endTime
     * @return
     */
    public Long countUserOrderToApp(Long uid, Integer type, String startTime, String endTime,
            Integer day, Integer source, Integer state, Integer stateOrder);
    /**
     * 根据订单号与订单类型查询订单
     *
     * @param sourceType
     * @param orderId
     * @return
     */
    public List<CommonOrder> listBySourceTypeAndOrderId(int sourceType, String orderId);
    /**
     * 缓存淘宝类普通订单
     *
     * @param taoBaoOrder
     * @param uid
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderAddResultDTO> addTaoBaoOrder(List<TaoBaoOrder> taoBaoOrder, Long uid) throws CommonOrderException;
    /**
     * 缓存拼多多类普通订单
     *
     * @param pddOrderList
     * @param uid
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderAddResultDTO> addPDDOrder(List<PDDOrder> pddOrderList, Long uid) throws CommonOrderException;
    /**
     * 缓存京东普通订单
     *
     * @param jdOrderList
     * @param uid
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderAddResultDTO> addJDOrder(JDOrder jdOrder, Long uid) throws CommonOrderException;
    /**
     * 根据用户ID,订单状态,结算时间统计订单数量
     *
     * @param uid
     * @param state
     * @param minDate
     * @param maxDate
     * @return
     */
    public long countByUidAndOrderStateWithOrderBalanceTime(Long uid, int state, Date minDate, Date maxDate);
    /**
     * 后端查询订单列表
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param orderNo
     * @param startTime
     * @param endTime
     * @param dateType
     *            1昨天 2今天 3本月 4 上月
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderVO> listQueryByUid(long start, int count, Long uid, Integer state, Integer type,
            Integer orderState, String orderNo, String startTime, String endTime, Integer dateType)
            throws CommonOrderException;
    public long countQueryByUid(Long uid, Integer state, Integer type, Integer orderState, String orderNo,
            String startTime, String endTime, Integer dateType) throws CommonOrderException;
    /**
     * 查询所有用户订单
     *
     * @param start
     * @param count
     * @param keyType
     * @param key
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderVO> listQuery(long start, int count, Integer keyType, String key, Integer state,
            Integer type, Integer orderState, String startTime, String endTime, Integer source,
            List<Long> listShopId, List<Long> listGoodsId, Date minTime, BigDecimal money)
            throws CommonOrderException;
    public long countQuery(Integer keyType, String key, Integer state, Integer type, Integer orderState,
            String startTime, String endTime, Integer source,
            List<Long> listShopId, List<Long> listGoodsId,Date minTime, BigDecimal money) throws CommonOrderException;
    /**
     * 查询订单
     *
     * @param uid
     * @param orderNo
     * @return
     * @throws CommonOrderException
     */
    public CommonOrderVO getCommonOrderByOrderNo(Long uid, String orderNo, Integer orderState, Integer sourceType)
            throws CommonOrderException;
    /**
     * 使用奖励券成功后跳转 修改
     *
     * @param orderNo
     * @return
     */
    public JSONObject getRewardJumpInfo(String orderNo, Integer goodsType);
    /**
     * 根据交易号获取订单详情
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    public CommonOrder selectBySourceTypeAndTradeId(int sourceType, String tradeId);
    /**
     * 删除错误订单
     *
     * @param coId
     */
    public void deleteErrorCommonOrder(Long coId);
    /**
     * 根据订单类型与交易ID查询
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    public List<CommonOrder> listBySourceTypeAndTradeId(int sourceType, String tradeId);
    /**
     * 根据条件查询订单
     *
     * @param sourceType
     * @param state
     * @param minTime
     * @param maxTime
     * @param page
     * @param pageSize
     * @return
     */
    public List<CommonOrder> listBySourceTypeAndStateAndThirdCrateTime(int sourceType, Integer state, Long minTime,
            Long maxTime, int page, int pageSize);
    /**
     * 查询订单 -根据订单号
     *
     * @param uid
     * @param orderNO
     * @return
     */
    public List<CommonOrder> getByOrderNo(Long uid, String orderNO);
    /**
     * 根据用户ID查询最近一条有效的订单
     *
     * @param uid
     * @return
     */
    public CommonOrder selectLatestValidByUid(Long uid);
    /**
     * 查询首笔有效订单
     * @param uid
     * @return
     */
    public CommonOrderVO firstValidOrderByUid(Long uid);
    /**
     * 查询首笔有效订单
     * @param uid
     * @param type 类型: 1自购  2分享 3邀请
     * @return
     */
    public CommonOrderVO firstValidOrderByUidAndType(Long uid, Integer type);
    /**
     * 查询是否上月到账订单
     * @param uid
     * @param type 类型: 1自购  2分享 3邀请
     * @return
     */
    public CommonOrderVO firstValidOrderLastMonthByUidAndType(Long uid, Integer type);
    /**
     * 首个分享订单
     * @param uid
     * @return
     */
    public CommonOrder getFirstShareOrderByUid(Long uid);
    /**
     * 订单中获得有效奖金
     * @param orderNo
     * @param sourceType
     * @return
     */
    public BigDecimal getTotalRewardMoneyByOrderNoAndSourceType(String orderNo, Integer sourceType);
    /**
     * 统计24小时有效自购订单
     * @param uid
     * @param minTime
     * @return
     */
    public long count24HValidOrderByUid(Long uid, Date minTime);
    /**
     * 订单统计有效数量
     * @param uid
     * @param day
     * @param source
     * @return
     */
    public OrderCountVO getOrderCount(Long uid, Integer day,  List<Integer> listSource);
    /**
     * 搜索订单信息
     * @param page
     * @param size
     * @param uid
     * @param list
     * @return
     */
    public List<CommonOrderVO> searchOrderByUid(int page, int size, Long uid, List<ESOrder> list) throws Exception;
    public long countSearchOrderByUid(Long uid, List<ESOrder> list);
}
package com.yeshi.fanli.service.inter.order;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
import com.yeshi.fanli.dto.order.CommonOrderAddResultDTO;
import com.yeshi.fanli.entity.accept.AcceptData;
import com.yeshi.fanli.entity.jd.JDOrder;
import com.yeshi.fanli.entity.order.CommonOrder;
import com.yeshi.fanli.entity.order.ESOrder;
import com.yeshi.fanli.entity.pdd.PDDOrder;
import com.yeshi.fanli.entity.taobao.TaoBaoOrder;
import com.yeshi.fanli.exception.order.CommonOrderException;
import com.yeshi.fanli.vo.order.CommonOrderVO;
import com.yeshi.fanli.vo.order.OrderCountVO;
import net.sf.json.JSONObject;
public interface CommonOrderService {
    public int insert(CommonOrder record);
    public int insertSelective(CommonOrder record);
    public int updateByPrimaryKey(CommonOrder record);
    public int updateByPrimaryKeySelective(CommonOrder record);
    public int deleteByPrimaryKey(Long id);
    public CommonOrder selectByPrimaryKey(Long id);
    /**
     * 查询用户订单 并订单号分组
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderNo
     *            订单号
     * @param startTime
     *            起始系统录入时间
     * @param endTime
     *            结束系统录入时间
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderVO> listGroupOrderNoByUid(long start, int count, Long uid, Integer state, Integer type,
            Integer orderState, String orderNo, String startTime, String endTime, Integer dateType, Integer source)
            throws CommonOrderException;
    /**
     * 统计查询
     *
     * @param uid
     * @param state
     * @param type
     * @param orderNo
     * @param startTime
     * @param endTime
     * @return
     * @throws CommonOrderException
     */
    long countGroupOrderNoByUid(Long uid, Integer state, Integer type, Integer orderState, String orderNo,
            String startTime, String endTime, Integer dateType, List<Integer> listSource) throws CommonOrderException;
    /**
     * 移动段订单列表
     *
     * @param start
     * @param count
     * @param uid
     *            用户id
     * @param type
     *            到账状态
     * @return
     */
    public List<CommonOrderVO> getOrderByUid(AcceptData acceptData, Integer page, Long uid, Integer state, Integer type,
            Integer orderState, String orderNo, String startTime, String endTime, Integer dateType, List<Integer> listSource)
            throws CommonOrderException,Exception;
    /**
     * 统计订单-根据红包类型 自购 邀请 分享
     *
     * @param uid
     * @return
     */
    public Map<String, BigDecimal> countHistoryOrder(Long uid, Integer day, Integer source);
    /**
     * 统计订单
     *
     * @param uid
     * @return
     */
    public long countBonusOrderNumber(Long uid, Integer type, Integer isToday, String startTime, String endTime,
            Integer source);
    /**
     * 统计订单
     *
     * @param uid
     * @return
     */
    public BigDecimal countBonusOrderMoney(Long uid, Integer type, Integer isToday, String startTime, String endTime,
            Integer source);
    /**
     * 统计奖金订单数量、金额
     *
     * @param uid
     * @param type
     * @param day
     * @param startTime
     * @param endTime
     * @return
     */
    public Map<String, Object> countBonusOrderMoneyAndNumber(Long uid, Integer type, Integer day, String startTime,
            String endTime, Integer source);
    /**
     * 根据条件统计
     *
     * @param uid
     * @param type
     * @param startTime
     * @param endTime
     * @return
     */
    public Long countUserOrderToApp(Long uid, Integer type, String startTime, String endTime,
            Integer day, Integer source, Integer state, Integer stateOrder);
    /**
     * 根据订单号与订单类型查询订单
     *
     * @param sourceType
     * @param orderId
     * @return
     */
    public List<CommonOrder> listBySourceTypeAndOrderId(int sourceType, String orderId);
    /**
     * 缓存淘宝类普通订单
     *
     * @param taoBaoOrder
     * @param uid
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderAddResultDTO> addTaoBaoOrder(List<TaoBaoOrder> taoBaoOrder, Long uid) throws CommonOrderException;
    /**
     * 缓存拼多多类普通订单
     *
     * @param pddOrderList
     * @param uid
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderAddResultDTO> addPDDOrder(List<PDDOrder> pddOrderList, Long uid) throws CommonOrderException;
    /**
     * 缓存京东普通订单
     *
     * @param jdOrderList
     * @param uid
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderAddResultDTO> addJDOrder(JDOrder jdOrder, Long uid) throws CommonOrderException;
    /**
     * 根据用户ID,订单状态,结算时间统计订单数量
     *
     * @param uid
     * @param state
     * @param minDate
     * @param maxDate
     * @return
     */
    public long countByUidAndOrderStateWithOrderBalanceTime(Long uid, int state, Date minDate, Date maxDate);
    /**
     * 后端查询订单列表
     *
     * @param start
     * @param count
     * @param uid
     * @param state
     * @param type
     * @param orderState
     * @param orderNo
     * @param startTime
     * @param endTime
     * @param dateType
     *            1昨天 2今天 3本月 4 上月
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderVO> listQueryByUid(long start, int count, Long uid, Integer state, Integer type,
            Integer orderState, String orderNo, String startTime, String endTime, Integer dateType)
            throws CommonOrderException;
    public long countQueryByUid(Long uid, Integer state, Integer type, Integer orderState, String orderNo,
            String startTime, String endTime, Integer dateType) throws CommonOrderException;
    /**
     * 查询所有用户订单
     *
     * @param start
     * @param count
     * @param keyType
     * @param key
     * @param state
     * @param type
     * @param orderState
     * @param startTime
     * @param endTime
     * @return
     * @throws CommonOrderException
     */
    public List<CommonOrderVO> listQuery(long start, int count, Integer keyType, String key, Integer state,
            Integer type, Integer orderState, String startTime, String endTime, Integer source,
            List<Long> listShopId, List<Long> listGoodsId, Date minTime, BigDecimal money,BigDecimal payment)
            throws CommonOrderException;
    public long countQuery(Integer keyType, String key, Integer state, Integer type, Integer orderState,
            String startTime, String endTime, Integer source,
            List<Long> listShopId, List<Long> listGoodsId,Date minTime, BigDecimal money,BigDecimal payment) throws CommonOrderException;
    /**
     * 查询订单
     *
     * @param uid
     * @param orderNo
     * @return
     * @throws CommonOrderException
     */
    public CommonOrderVO getCommonOrderByOrderNo(Long uid, String orderNo, Integer orderState, Integer sourceType)
            throws CommonOrderException;
    /**
     * 使用奖励券成功后跳转 修改
     *
     * @param orderNo
     * @return
     */
    public JSONObject getRewardJumpInfo(String orderNo, Integer goodsType);
    /**
     * 根据交易号获取订单详情
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    public CommonOrder selectBySourceTypeAndTradeId(int sourceType, String tradeId);
    /**
     * 删除错误订单
     *
     * @param coId
     */
    public void deleteErrorCommonOrder(Long coId);
    /**
     * 根据订单类型与交易ID查询
     *
     * @param sourceType
     * @param tradeId
     * @return
     */
    public List<CommonOrder> listBySourceTypeAndTradeId(int sourceType, String tradeId);
    /**
     * 根据条件查询订单
     *
     * @param sourceType
     * @param state
     * @param minTime
     * @param maxTime
     * @param page
     * @param pageSize
     * @return
     */
    public List<CommonOrder> listBySourceTypeAndStateAndThirdCrateTime(int sourceType, Integer state, Long minTime,
            Long maxTime, int page, int pageSize);
    /**
     * 查询订单 -根据订单号
     *
     * @param uid
     * @param orderNO
     * @return
     */
    public List<CommonOrder> getByOrderNo(Long uid, String orderNO);
    /**
     * 根据用户ID查询最近一条有效的订单
     *
     * @param uid
     * @return
     */
    public CommonOrder selectLatestValidByUid(Long uid);
    /**
     * 查询首笔有效订单
     * @param uid
     * @return
     */
    public CommonOrderVO firstValidOrderByUid(Long uid);
    /**
     * 查询首笔有效订单
     * @param uid
     * @param type 类型: 1自购  2分享 3邀请
     * @return
     */
    public CommonOrderVO firstValidOrderByUidAndType(Long uid, Integer type);
    /**
     * 查询是否上月到账订单
     * @param uid
     * @param type 类型: 1自购  2分享 3邀请
     * @return
     */
    public CommonOrderVO firstValidOrderLastMonthByUidAndType(Long uid, Integer type);
    /**
     * 首个分享订单
     * @param uid
     * @return
     */
    public CommonOrder getFirstShareOrderByUid(Long uid);
    /**
     * 订单中获得有效奖金
     * @param orderNo
     * @param sourceType
     * @return
     */
    public BigDecimal getTotalRewardMoneyByOrderNoAndSourceType(String orderNo, Integer sourceType);
    /**
     * 统计24小时有效自购订单
     * @param uid
     * @param minTime
     * @return
     */
    public long count24HValidOrderByUid(Long uid, Date minTime);
    /**
     * 订单统计有效数量
     * @param uid
     * @param day
     * @param source
     * @return
     */
    public OrderCountVO getOrderCount(Long uid, Integer day,  List<Integer> listSource);
    /**
     * 搜索订单信息
     * @param page
     * @param size
     * @param uid
     * @param list
     * @return
     */
    public List<CommonOrderVO> searchOrderByUid(int page, int size, Long uid, List<ESOrder> list) throws Exception;
    public long countSearchOrderByUid(Long uid, List<ESOrder> list);
}