package com.j1.mai.action;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.websocket.server.PathParam;

import com.j1.base.order.model.*;
import com.j1.mai.dto.base.Goods;
import com.j1.mai.util.JsonUtils;
import com.j1.model.User;
import com.j1.pay.model.oracle.OrderPaymentLog;
import com.j1.pay.model.oracle.OrderPaymentTypeList;
import com.j1.soa.common.MemberKeyUtils;
import com.j1.soa.resource.cms.api.PageIndexImgService;
import com.j1.soa.resource.item.api.GoodsDetailService;

import com.j1.soa.resource.pay.oracle.api.OrderPaymentLogService;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

import com.j1.base.dto.ServiceMessage;
import com.j1.base.page.Page;
import com.j1.base.type.MsgStatus;
import com.j1.base.type.PageIndexType;
import com.j1.base.type.SiteType;
import com.j1.cms.model.PageIndexImg;
import com.j1.mai.common.Const;
import com.j1.mai.model.common.SoaApiBaseAction;
import com.j1.mai.service.CheckMemberKeyService;
import com.j1.mai.util.NumericUtil;
import com.j1.mai.util.StringUtil;
import com.j1.soa.common.ResultMsg;
import com.j1.soa.resource.order.api.LogisticCompanyService;
import com.j1.soa.resource.order.api.OrderInfoService;
import com.j1.soa.resource.order.api.OrderItemService;
import com.j1.soa.resource.order.api.OrderLogService;
import com.j1.soa.resource.pay.api.PayQueryService;

/**
 * SOA 订单 HTTP 接口
 *
 * @author qiaoyu
 */
@Controller
@Scope("request")
@RequestMapping("/order")
public class OrderAction extends SoaApiBaseAction {

    static final Logger LOG = Logger.getLogger(OrderAction.class);

    @Autowired
    private OrderInfoService orderInfoService;
    @Autowired
    private OrderLogService orderLogService;
    @Autowired
    private LogisticCompanyService logisticCompanyService;
    @Autowired
    private OrderItemService orderItemService;
    @Autowired
    private GoodsDetailService goodsDetailService;
    @Autowired
    private PayQueryService payQueryService;
    @Autowired
    private CheckMemberKeyService checkMemberKeyService;
    @Autowired
    private PageIndexImgService pageIndexImgService;

    /**
     * 查询订单列表
     *
     * @param request
     * @param response
     * @param mul
     *            来源
     * @param orderState
     *            订单状态
     * @param pageNum
     *            页数
     * @param pageSize
     *            每页条数
     * @date 25/11/14
     * @author qiaoyu
     * @version 1.0
     */
    @RequestMapping("/list")
    public void list(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderState", required = false) String orderState,
            @RequestParam(value = "pageNum", required = false) String pageNum,
            @RequestParam(value = "goodsSeller", required = false) String goodsSeller,
            @RequestParam(value = "pageSize", required = false) String pageSize) {
        if (null == request.getParameter("createSource")
                || (null != request.getParameter("createSource") && !request
                        .getParameter("createSource").equals("app"))) {
            String code = checkMemberKeyService.getCode(memberKey);
            if (code.equals("-99")) {
                this.setResultInfo(code, "请登录!").write(request, response);
                return;
            }
        }
        if (StringUtil.isEmpty(memberKey)) {
            this.setResultInfo(MsgStatus.PARAMS_ERROR.getCode(),
                    ResultMsg.Common.MEMBER_KEY_EMPTY).write(request, response);
            return;
        }
        // PARAMTER VALIDATION END

        OrderInfo queryParams = new OrderInfo();
        queryParams.setMemberKey(memberKey);
        queryParams.setMul(mul);
        queryParams.setOrderStateStr(orderState);
        queryParams.setIsTc("ALL");
        if(null != goodsSeller&& !"".equals(goodsSeller))
         queryParams.setGoodsSeller(goodsSeller);

        ServiceMessage<Page<OrderInfo>> orderResult = null;
        try {
            orderResult = orderInfoService.getWebOrderInfoByListPage(
                    NumericUtil.parseInt(pageNum, 1),
                    NumericUtil.parseInt(pageSize, 10), queryParams);

            JSONObject resultObj = new JSONObject();

            if (orderResult.getStatus() == MsgStatus.NORMAL) {           //通过接口拿到数据
                resultObj = JSONObject.fromObject(orderResult.getResult());          //data的json格式数据
                JSONArray data = resultObj.getJSONArray("data"), afterSetDate = new JSONArray();
                //遍历集合
                for (int i = 0; i < data.size(); i++) {
                    JSONObject orderInfo = data.getJSONObject(i);

                    OrderItem itemQueryParams = new OrderItem();
                    itemQueryParams.setMul(mul);
                    itemQueryParams.setMemberKey(memberKey);
                    itemQueryParams.setOrderId(orderInfo.getLong("orderId"));
                    itemQueryParams.setIsTc("ALL");
                    // 嵌入商品图片列表
                    ServiceMessage<List<OrderItem>> orderItemResult = orderItemService
                            .getWebOrderInfoPicByList(itemQueryParams);
                    if (orderItemResult.getStatus() == MsgStatus.NORMAL) {
                        BigDecimal orderGoodsCount = new BigDecimal(0);            //定义jsonArry
                        JSONArray goodsList = new JSONArray();
                        for (OrderItem orderItem : orderItemResult.getResult()) {             //取值
                            JSONObject itemGoods = new JSONObject();              //赋值
                            itemGoods.put("imageUrl",
                                    orderItem.getProImageUrl());
                            itemGoods
                                    .put("productId", orderItem.getProductId());
                            itemGoods.put("goodsId", orderItem.getGoodsId());
                            itemGoods.put("drugPrescriptionType", orderItem.getDrugPrescriptionType());
                            orderGoodsCount = orderGoodsCount.add(orderItem.getGoodsAmount());                  //将取出的数据放到定义的集合中
                            goodsList.add(itemGoods);

                        }                 //json格式的数据展示
                        orderInfo.put("orderGoodsCount", orderGoodsCount);
                        orderInfo.put("goodsList", goodsList);
                    }

                    OrderInfo logisticsParam = new OrderInfo();
                    logisticsParam.setOrderId(orderInfo.getLong("orderId"));
                    logisticsParam.setMul(mul);
                    logisticsParam.setMemberKey(memberKey);

                    ServiceMessage<List<LogisticCompany>> logisticsResult = logisticCompanyService
                            .queryLogisticCompany(logisticsParam);
                    if (logisticsResult.getStatus() == MsgStatus.NORMAL) {
                        orderInfo.put("logisticCompanys",
                                logisticsResult.getResult());
                    }
                    /**
                     * 18已退款;19退货完成;20退货中;21已出库;22配货中;(23已收货;23该状态现在没有用到)
                     * 24缺货中;25已取消;26已完成;27已发货;28已审核;29已提交
                     * 根据isPaid 拆分29已提交,29已支付。
                     * 根据orderButs存在canEval 拆分26已完成,26已收货
                     */
                    int orderStateNum = orderInfo.getInt("orderState");
                    String isPaid = orderInfo.getString("isPaid");
                    List<String> orderButs = orderInfo.getJSONArray("orderButs");
                    String codeValue = getOrderStatus(orderStateNum, isPaid, orderButs);
                    orderInfo.put("codeValue", codeValue);
                    afterSetDate.add(orderInfo);
                }          //最后的封装
                resultObj.put("data", afterSetDate);

                Map<String, String> orderStatMap = this.getOrderStatistics(memberKey, mul, goodsSeller);
                resultObj.put("orderStatistics", orderStatMap);
                // for (OrderInfo orderInfo : orderResult.getResult()) {
                // OrderItem itemQueryParams = new OrderItem();
                // itemQueryParams.setMul(mul);
                // itemQueryParams.setMemberKey(memberKey);
                // itemQueryParams.setOrderId(orderInfo.getOrderId());
                //
                // // 嵌入商品图片列表
                // ServiceMessage<List<OrderItem>> orderItemResult =
                // orderItemService
                // .getWebOrderInfoPicByList(itemQueryParams);
                // if (orderItemResult.getStatus() == MsgStatus.NORMAL) {
                // List<String> goodsImageList = new ArrayList<String>();
                // for (OrderItem orderItem : orderItemResult.getResult()) {
                // goodsImageList.add(orderItem.getProImageUrl());
                // }
                // orderInfo.setGoodsImageList(goodsImageList);
                // }
                // }
                  //返回给前台
                _result.setObjData(resultObj);
            }
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            this.setResultInfo(orderResult,
                    ResultMsg.OrderActionMsg.LIST_FAILRE).write(request,
                    response);
        }
    }
    private Map<String, String> getOrderStatistics(String memberKey, String mul, String orderGoodsSeller) {
        // 查询订单数量
        Map<String, String> orderNumList = new HashMap<String, String>();
        int noPaidNum = 0, noShippingNum = 0, noReceiveNum = 0, noCommentNum = 0;

        OrderInfo orderNumParam = new OrderInfo();
        orderNumParam.setMemberKey(memberKey);
        orderNumParam.setMul(mul);
        orderNumParam.setOrderStateStr(Const.OrderState.NO_PAID);
        orderNumParam.setGoodsSeller(orderGoodsSeller);
        try {
            // 待付款订单数
            ServiceMessage<Integer> noPaidResult = orderInfoService
                    .getWebOrderInfoByListCount(orderNumParam);
            if (noPaidResult.getStatus() == MsgStatus.NORMAL)
                noPaidNum = noPaidResult.getResult();
        } catch (Exception e) {
            LOG.error("OrderAction@getOrderStatistics 待付款订单数 " + e.getMessage(), e);
        }

        try {
            orderNumParam.setOrderStateStr(Const.OrderState.NO_SHIPPING);
            // 待发货订单数
            ServiceMessage<Integer> noShippingResult = orderInfoService
                    .getWebOrderInfoByListCount(orderNumParam);
            if (noShippingResult.getStatus() == MsgStatus.NORMAL)
                noShippingNum = noShippingResult.getResult();

            orderNumParam.setOrderStateStr(Const.OrderState.NO_RECEIVE);

        } catch (Exception e) {
            LOG.error("OrderAction@getOrderStatistics 待发货订单数 " + e.getMessage(), e);
        }

        try {
        // 待收货订单数
        ServiceMessage<Integer> noReceiveResult = orderInfoService
                .getWebOrderInfoByListCount(orderNumParam);
        if (noReceiveResult.getStatus() == MsgStatus.NORMAL)
            noReceiveNum = noReceiveResult.getResult();

        orderNumParam.setOrderStateStr(Const.OrderState.NO_COMMENT);

        } catch (Exception e) {
            LOG.error("OrderAction@getOrderStatistics 待收货订单数 " + e.getMessage(), e);
        }

        try {
            // 待评价订单数
            ServiceMessage<Integer> noCommentResult = orderInfoService
                    .getWebOrderInfoByListCount(orderNumParam);
            if (noCommentResult.getStatus() == MsgStatus.NORMAL)
                noCommentNum = noCommentResult.getResult();
        } catch (Exception e) {
            LOG.error("OrderAction@getOrderStatistics 待评价订单数 " + e.getMessage(), e);
        }
        orderNumList.put("noPaid", String.valueOf(noPaidNum));
        orderNumList.put("noShipping", String.valueOf(noShippingNum));
        orderNumList.put("noReceive", String.valueOf(noReceiveNum));
        orderNumList.put("noComment", String.valueOf(noCommentNum));

        return orderNumList;
    }
    private Map<String, String> getCRCOrderStatistics(String memberKey, String mul) {
        return getOrderStatistics(memberKey, mul,"2");// CRCare order type
    }
    /**
     * 查询订单详情
     *
     * @param request
     * @param response
     * @param mul
     *            来源
     * @param orderId
     *            订单ID
     * @date 26/11/14
     * @author qiaoyu
     * @version 1.0
     */
    @RequestMapping("/detail")
    public void detail(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId", required = false) String orderId) {
        if (null == request.getParameter("createSource")
                || (null != request.getParameter("createSource") && !request
                        .getParameter("createSource").equals("app"))) {
            String code = checkMemberKeyService.getCode(memberKey);
            if (code.equals("-99")) {
                this.setResultInfo(code, "请登录!").write(request, response);
                return;
            }
        }
        if (StringUtil.isEmpty(memberKey)) {
            this.setResultInfo(MsgStatus.PARAMS_ERROR.getCode(),
                    ResultMsg.Common.MEMBER_KEY_EMPTY).write(request, response);
            return;
        }

        if (StringUtil.isEmpty(orderId) || !StringUtil.isNumeric(orderId)) {
            this.setResultInfo(MsgStatus.PARAMS_ERROR.getCode(),
                    ResultMsg.OrderActionMsg.ORDER_ID_EMPTY).write(request,
                    response);
            return;
        }
        // PARAMTER VALIDATION END

        OrderInfo queryParams = new OrderInfo();
        queryParams.setMemberKey(memberKey);
        queryParams.setMul(mul);
        queryParams.setOrderId(NumericUtil.parseLong(orderId));
        queryParams.setIsTc("ALL");
        ServiceMessage<Page<OrderInfo>> orderResult = null;
        try {
            orderResult = orderInfoService.getWebOrderInfoByListPage(1, 10,
                    queryParams);
            if (orderResult.getStatus() == MsgStatus.NORMAL) {
                if (orderResult.getResult().getTotalCount() == 0) {
                    this.setResultInfo(MsgStatus.NO_RESULT.getCode(),
                            ResultMsg.OrderActionMsg.ORDER_NOT_EXISTS);
                    return;
                }

                OrderInfo orderInfo = orderResult.getResult().getData().get(0);

                //订单状态
                Integer orderState = orderInfo.getOrderState();
                String isPaid = orderInfo.getIsPaid();
                List<String> orderButs = orderInfo.getOrderButs();
                    String orderStatus = getOrderStatus(orderState, isPaid, orderButs!=null?orderButs:new  ArrayList<String>());
                    orderInfo.setCodeValue(orderStatus);
                _result.setObjData(orderInfo);

                //订单状态的集合
                List<String> orderStatusList = getOrderStatusList(orderState);
                if(orderInfo.getPaymentMode().equals("HDFK")){
                    orderStatusList.remove("已支付");
                }
                _result.put("orderStatusList",orderStatusList);

                // 订单物流列表
                OrderInfo logisticsParam = new OrderInfo();
                logisticsParam.setOrderId(NumericUtil.parseLong(orderId));
                logisticsParam.setMul(mul);
                logisticsParam.setMemberKey(memberKey);

                ServiceMessage<List<LogisticCompany>> logisticsResult = logisticCompanyService
                        .queryLogisticCompany(orderInfo);
                if (logisticsResult.getStatus() == MsgStatus.NORMAL
                        && logisticsResult.getResult() != null) {
                    _result.put("logisticCompanys", logisticsResult.getResult());
                }

                //3.71   新增物流详情
                OrderInfo orderInfo1=new OrderInfo();
                orderInfo1.setOrderId(NumericUtil.parseLong(orderId));
                ServiceMessage<List<Logistics>> serviceMessage =  logisticCompanyService.queryLogistics(orderInfo1);
                List<LogisticsInfo> logisticsInfos = sortLogisticInfo(serviceMessage);
                this.setResultInfo(serviceMessage.getStatus().getCode(),
                        serviceMessage.getMessage());
//                _result.put("result",serviceMessage.getResult());
                _result.put("lastLogisticsInfo",logisticsInfos);

                // 订单商品列表
                OrderItem orderItemQueryParams = new OrderItem();
                orderItemQueryParams.setMemberKey(memberKey);
                orderItemQueryParams.setOrderId(queryParams.getOrderId());
                orderItemQueryParams.setIsTc("ALL");

                ServiceMessage<List<OrderItem>> orderItemResult = orderItemService
                        .getWebOrderInfoPicByList(orderItemQueryParams);
                if (orderItemResult.getStatus() == MsgStatus.NORMAL) {
                    _result.put("goodsList", orderItemResult.getResult());
                }
                setResultInfo(orderResult.getStatus().getCode(),
                        orderResult.getMessage());
            }
            setResultInfo(orderResult,
                    ResultMsg.OrderActionMsg.LIST_FAILRE);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            write(request, response);
        }
    }

    /**
     * 查询订单包裹物流
     *
     * @param request
     * @param response
     * @param mul
     *            来源
     * @param orderId
     *            订单ID
     * @date 28/11/14
     * @author qiaoyu
     * @version 1.0
     */
    @RequestMapping("/logistics")
    public void logistics(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId", required = false) String orderId) {
        if (null == request.getParameter("createSource")
                || (null != request.getParameter("createSource") && !request
                        .getParameter("createSource").equals("app"))) {
            String code = checkMemberKeyService.getCode(memberKey);
            if (code.equals("-99")) {
                this.setResultInfo(code, "请登录!").write(request, response);
                return;
            }
        }
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setOrderId(NumericUtil.parseLong(orderId));
        orderInfo.setMul(mul);
        orderInfo.setMemberKey(memberKey);

        ServiceMessage<List<LogisticCompany>> logisticsResult = null;
        try {
            logisticsResult = logisticCompanyService
                    .queryLogisticCompany(orderInfo);
            if (logisticsResult.getStatus() == MsgStatus.NORMAL
                    && logisticsResult.getResult() != null) {
                _result.put("logisticCompanys",
                        logisticsResult.getResult());
            }
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            this.setResultInfo(logisticsResult,
                    ResultMsg.OrderActionMsg.LOGISTICS_FAILURE).write(request,
                    response);
        }
    }

    /**
     * 获取物流详情
     *
     * @param request
     * @param response
     * @param memberKey
     * @param mul
     * @param orderId
     * @param orderShippingNo
     */
    @RequestMapping("/shipping")
    public void shipping(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId", required = false) String orderId,
            @RequestParam(value = "orderShippingNo", required = false) String orderShippingNo) {
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setOrderId(NumericUtil.parseLong(orderId));
        orderInfo.setMul(mul);
        orderInfo.setMemberKey(memberKey);
        orderInfo.setIsTc("ALL");
        if (null == request.getParameter("createSource")
                || (null != request.getParameter("createSource") && !request
                        .getParameter("createSource").equals("app"))) {
            String code = checkMemberKeyService.getCode(memberKey);
            if (code.equals("-99")) {
                this.setResultInfo(code, "请登录!").write(request, response);
                return;
            }
        }
        try {
            // 查询订单详情
            ServiceMessage<Page<OrderInfo>> orderResult = orderInfoService
                    .getWebOrderInfoByListPage(1, 1, orderInfo);

            // 订单
            if (orderResult.getStatus() != MsgStatus.NORMAL) {
                setResultInfo(orderResult.getStatus().getCode(),
                        orderResult.getMessage());
                return;
            }

            // 查询订单条数超过1条(按照ID查应该)
            if (orderResult.getResult().getTotalCount() > 1) {
                setResultInfo(MsgStatus.EXCEPTION.getCode(),
                        ResultMsg.OrderActionMsg.EXPECT_SIZE);
                return;
            }
            List<OrderInfo> orderInfos =orderResult.getResult().getData();
            _result.put("orderInfo", orderInfos!=null&&orderInfos.size()>0?orderInfos.get(0):"");

            ServiceMessage<List<LogisticCompany>> logisticsResult = logisticCompanyService
                    .queryLogisticCompany(orderInfo);

            LogisticCompany matchedLogisticCompany = null;
            if (logisticsResult.getStatus() == MsgStatus.NORMAL) {
                for (LogisticCompany logisticCompany : logisticsResult
                        .getResult()) {
                    if (logisticCompany.getOrderShippingNo().equals(
                            orderShippingNo)) {
                        matchedLogisticCompany = logisticCompany;
                        break;
                    }
                }
            }

            // 运单号查询不到
            if (matchedLogisticCompany == null) {
                setResultInfo(MsgStatus.NO_RESULT.getCode(),
                        ResultMsg.Common.QUERY_NO_RESULT);
                return;
            }

            _result.put("logisticCompany", matchedLogisticCompany);
            setResultInfo(MsgStatus.NORMAL.getCode(), ResultMsg.Common.OK);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            write(request, response);
        }
    }

    /**
     * 取消订单
     *
     * @param request
     * @param response
     * @param mul
     *            来源
     * @param orderId
     *            订单ID
     * @date 28/11/14
     * @author qiaoyu
     * @version 1.0
     */
    @RequestMapping("/cancel")
    public void cancel(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId", required = false) String orderId) {
        if (null == request.getParameter("createSource")
                || (null != request.getParameter("createSource") && !request
                        .getParameter("createSource").equals("app"))) {
            String code = checkMemberKeyService.getCode(memberKey);
            if (code.equals("-99")) {
                this.setResultInfo(code, "请登录!").write(request, response);
                return;
            }
        }
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setOrderId(NumericUtil.parseLong(orderId));
        orderInfo.setMemberKey(memberKey);
        orderInfo.setMul(mul);

        ServiceMessage<String> cancelResult = null;
        try {
            cancelResult = orderInfoService.rollBackOrder(orderInfo);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            this.setResult(cancelResult,
                    ResultMsg.OrderActionMsg.CANCEL_FAILURE).write(request,
                    response);
        }
    }

    /**
     * 订单确认
     *
     * @param request
     * @param response
     * @param memberKey
     * @param mul
     * @param orderId
     */
    @RequestMapping("/confirm")
    public void confirm(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId", required = false) String orderId) {
        if (null == request.getParameter("createSource")
                || (null != request.getParameter("createSource") && !request
                        .getParameter("createSource").equals("app"))) {
            String code = checkMemberKeyService.getCode(memberKey);
            if (code.equals("-99")) {
                this.setResultInfo(code, "请登录!").write(request, response);
                return;
            }
        }
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setOrderId(NumericUtil.parseLong(orderId));
        orderInfo.setMemberKey(memberKey);
        orderInfo.setMul(mul);

        ServiceMessage<String> confirmResult = null;
        try {
            confirmResult = orderInfoService.orderFinish(orderInfo);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            this.setResult(confirmResult,
                    ResultMsg.OrderActionMsg.CONFIRM_FAILURE).write(request,
                    response);
        }
    }

    /**
     * 查询订单日志
     *
     * @param request
     * @param response
     * @param mul
     *            来源
     * @param orderId
     *            订单ID
     * @date 28/11/14
     * @author qiaoyu
     * @version 1.0
     */
    @RequestMapping("/log")
    public void log(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId", required = false) String orderId) {
        if (null == request.getParameter("createSource")
                || (null != request.getParameter("createSource") && !request
                        .getParameter("createSource").equals("app"))) {
            String code = checkMemberKeyService.getCode(memberKey);
            if (code.equals("-99")) {
                this.setResultInfo(code, "请登录!").write(request, response);
                return;
            }
        }
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setMemberKey(memberKey);
        orderInfo.setOrderId(NumericUtil.parseLong(orderId));
        orderInfo.setMul(mul);

        ServiceMessage<List<OrderLog>> logResult = null;
        try {
            logResult = orderLogService.getPublicLogByOrderId(orderInfo);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            _result.put("logs", logResult.getResult());
            this.setResultInfo(logResult, ResultMsg.OrderActionMsg.LOG_FAILURE)
                    .write(request, response);
        }
    }

    /**
     * 支付完成后获取订单信息
     *
     * @param request
     * @param response
     * @param memberKey
     * @param mul
     * @param orderId
     */
    @RequestMapping("/afterPay")
    public void afterPay(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId", required = false) String orderId) {
        if (StringUtil.isEmpty(memberKey)) {
            this.setResultInfo(MsgStatus.PARAMS_ERROR.getCode(),
                    ResultMsg.Common.MEMBER_KEY_EMPTY).write(request, response);

            return;
        }

        if (StringUtil.isEmpty(orderId)) {
            this.setResultInfo(MsgStatus.PARAMS_ERROR.getCode(),
                    ResultMsg.OrderActionMsg.ORDER_ID_EMPTY).write(request,
                    response);
            return;
        }
        // PARAMTER VALIDATION END
        OrderInfo queryParams = new OrderInfo();
        queryParams.setMemberKey(memberKey);
        queryParams.setMul(mul);
        queryParams.setOrderId(NumericUtil.parseLong(orderId));
        queryParams.setIsTc("ALL");
        ServiceMessage<Page<OrderInfo>> orderResult = null;
        try {
            orderResult = orderInfoService.getWebOrderInfoByListPage(1, 10,
                    queryParams);
            if (orderResult.getStatus() == MsgStatus.NORMAL) {
                if (orderResult.getResult().getTotalCount() == 0) {
                    this.setResultInfo(MsgStatus.NO_RESULT.getCode(),
                            ResultMsg.OrderActionMsg.ORDER_NOT_EXISTS);
                    return;
                }

                OrderInfo orderInfo = orderResult.getResult().getData().get(0);

                int returnPoints = 0;
                // 获取订单赠送积分
                if (StringUtil.isNotEmpty(orderInfo.getReturnType())
                        && orderInfo.getReturnType().contains("points")) {
                    returnPoints = NumericUtil.parseInt(orderInfo
                            .getReturnValue().split("/")[0], 0);
                }

                // 包裹数量
                int parcelCount = 1;
                // 订单物流列表
                // OrderInfo logisticsParam = new OrderInfo();
                // logisticsParam.setOrderId(NumericUtil.parseLong(orderId));
                // logisticsParam.setMul(mul);
                // logisticsParam.setMemberKey(memberKey);
                //
                // ServiceMessage<List<LogisticCompany>> logisticsResult =
                // logisticCompanyService
                // .queryLogisticCompany(orderInfo);
                // if (logisticsResult.getStatus() == MsgStatus.NORMAL
                // && logisticsResult.getResult() != null) {
                // parcelCount = logisticsResult.getResult().size();
                // }

                // 商品数量
                int goodsCount = 0;
                // 订单商品列表
                OrderItem orderItemQueryParams = new OrderItem();
                orderItemQueryParams.setMemberKey(memberKey);
                orderItemQueryParams.setOrderId(queryParams.getOrderId());
                orderItemQueryParams.setIsTc("ALL");

                ServiceMessage<List<OrderItem>> orderItemResult = orderItemService
                        .getWebOrderInfoPicByList(orderItemQueryParams);
                if (orderItemResult.getStatus() == MsgStatus.NORMAL) {

                    for (OrderItem orderItem : orderItemResult.getResult()) {
                        goodsCount += orderItem.getGoodsAmount() == null ? 0
                                : orderItem.getGoodsAmount().intValue();

                        // GoodsDetailto.setGoodsId(orderItem.getGoodsId());
                        // goodsDetailDto.setProductId(orderItem.getProductId().intValue());
                        // goodsDetailDtoDto goodsDetailDto = new
                        // GoodsDetailDto();
                        // goodsDetailD.setSiteType(SiteType.MOBILE);

                        // ServiceMessage<GoodsDetailDto> detailResult =
                        // goodsDetailService
                        // .getGoodDetail(goodsDetailDto);
                        // if (detailResult.getStatus() == MsgStatus.NORMAL) {
                        // TODO 根据商品所在仓库计算包裹数量
                        // }
                    }
                }
                String paymentMode = "weixin";
                ServiceMessage<List<OrderPaymentTypeList>> orderPaymentTypeList = payQueryService.getOrderPaymentTypeSingle(orderId);
                if (null != orderPaymentTypeList &&
                        orderPaymentTypeList.getStatus() == MsgStatus.NORMAL) {
                    if (orderPaymentTypeList.getResult() != null
                            && orderPaymentTypeList.getResult().size() > 0) {
                        paymentMode = orderPaymentTypeList.getResult().get(0).getPaymentTypeNo();
                    }
                }

                String ticketTitle = "";// 发票抬头
                ServiceMessage<OrderInfo> orderMessage = orderInfoService.getOrderInfoById(queryParams);
                if (orderMessage.getStatus() == MsgStatus.NORMAL) {
                    ticketTitle = orderMessage.getResult().getInvoiceTitle();
                }

                //更多优惠
                ArrayList<Map<String, String>> bottomList = new ArrayList<Map<String,String>>();
                try {
                    Map<String, String> bottomStroll = new HashMap<String, String>();
                    bottomStroll.put("title", "查看订单");
                    bottomStroll.put("imageUrl", "http://soa.app.j1.com/upload/read/2015/8/27111235738351.png");
                    bottomStroll.put("targeUrl", "/mall/orderdetail.html?orderId="+orderId);
                    bottomList.add(bottomStroll);

                    bottomStroll = new HashMap<String, String>();
                    bottomStroll.put("title", "账号充值");
                    bottomStroll.put("imageUrl", "http://soa.app.j1.com/upload/read/2015/8/27111301537528.png");
                    bottomStroll.put("targeUrl", "/mall/myAccount.html");
                    bottomList.add(bottomStroll);

                    bottomStroll = new HashMap<String, String>();
                    bottomStroll.put("title", "更多优惠");
                    bottomStroll.put("imageUrl", "http://soa.app.j1.com/upload/read/2015/8/27111329080669.png");
                    bottomStroll.put("targeUrl", "");
                    PageIndexImg  pageIndexImg = new PageIndexImg();
                    pageIndexImg.setSiteType(SiteType.MOBILE);
                    pageIndexImg.setImageType(Integer.valueOf(PageIndexType.IMAGE_CAROUSEL_APP.getCode()));
                    ServiceMessage<List<PageIndexImg>> banners = pageIndexImgService.getPageIndexImgList(pageIndexImg);
                    if (banners.getStatus() == MsgStatus.NORMAL) {
                        List<PageIndexImg> bannerList = banners.getResult();
                        if(bannerList.size()>0){
                            String  url = bannerList.get(0).getUrl();
                            bottomStroll.put("targeUrl", url);
                        }
                    }
                    bottomList.add(bottomStroll);
                } catch (Exception e) {
                    LOG.error(e.getMessage(), e);
                }

                _result.put("bottomStrollList", bottomList);
                _result.put("paymentMode", paymentMode);
                _result.put("ticketTitle", ticketTitle);
                _result.put("orderId", orderInfo.getOrderId());
                _result.put("orderPayFee", orderInfo.getOrderFee());
                _result.put("goodsSeller", orderInfo.getGoodsSeller());
                _result.put("returnPoints", returnPoints);
                _result.put("parcelCount", parcelCount);
                _result.put("goodsCount", goodsCount);
                setResultInfo(orderResult.getStatus().getCode(),
                        orderResult.getMessage());
            }
            setResultInfo(orderResult,
                    ResultMsg.OrderActionMsg.LIST_FAILRE);
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
        } finally {
            write(request, response);
        }
    }

    @RequestMapping("/payInfoCheck")
    public void PayInfocheck(
            HttpServletRequest request,
            HttpServletResponse response,
            @RequestParam(value = "memberKey", required = false) String memberKey,
            @RequestParam(value = "mul", required = false) String mul,
            @RequestParam(value = "orderId",required = false)String orderId
    ){
        if (StringUtil.isEmpty(memberKey)) {
            this.setResultInfo(MsgStatus.PARAMS_ERROR.getCode(),
                    ResultMsg.Common.MEMBER_KEY_EMPTY).write(request, response);

            return;
        }
        if (StringUtil.isEmpty(orderId)) {
            this.setResultInfo(MsgStatus.PARAMS_ERROR.getCode(),
                    ResultMsg.OrderActionMsg.ORDER_ID_EMPTY).write(request,
                    response);
            return;
        }
        try {
            Long memberId = MemberKeyUtils.getMemberKey(memberKey);
            OrderInfo orderInfoparam = new OrderInfo();
            orderInfoparam.setOrderId(NumericUtil.parseLong(orderId));
            orderInfoparam.setMemberKey(memberKey);
            orderInfoparam.setMemberId(memberId);
            orderInfoparam.setMul(mul);
            //查询订单信息
            ServiceMessage<OrderInfo> orderInfoById = orderInfoService.getOrderInfoById(orderInfoparam);
            if (orderInfoById.getStatus() != MsgStatus.NORMAL || orderInfoById.getResult() == null) {
                this.setResultInfo("0", "查询订单信息失败");
            }
            OrderInfo orderInfo = orderInfoById.getResult();
            //支付状态,N:未支付,Y:已全额支付,P:部分支付'
            String paidState=orderInfo.getIsPaid();
            String padiMsg=null;
            ArrayList<Map<String, String>> bottomList = new ArrayList<Map<String,String>>();
            if (paidState.equals("Y")||orderInfo.getPaymentMode().equals("HDFK")){
                padiMsg="支付成功!";
                //更多优惠
                Map<String, String> bottomStroll = new HashMap<String, String>();
                bottomStroll.put("title", "查看订单");
                bottomStroll.put("imageUrl", "http://soa.app.j1.com/upload/read/2015/8/27111235738351.png");
                bottomStroll.put("targeUrl", "/mall/orderdetail.html?orderId="+orderId);
                bottomList.add(bottomStroll);
                bottomStroll = new HashMap<String, String>();
                bottomStroll.put("title", "账号充值");
                bottomStroll.put("imageUrl", "http://soa.app.j1.com/upload/read/2015/8/27111301537528.png");
                bottomStroll.put("targeUrl", "/mall/myAccount.html");
                bottomList.add(bottomStroll);
                bottomStroll = new HashMap<String, String>();
                bottomStroll.put("title", "更多优惠");
                bottomStroll.put("imageUrl", "http://soa.app.j1.com/upload/read/2015/8/27111329080669.png");
                bottomStroll.put("targeUrl", "");
                PageIndexImg  pageIndexImg = new PageIndexImg();
                pageIndexImg.setSiteType(SiteType.MOBILE);
                pageIndexImg.setImageType(Integer.valueOf(PageIndexType.IMAGE_CAROUSEL_APP.getCode()));
                ServiceMessage<List<PageIndexImg>> banners = pageIndexImgService.getPageIndexImgList(pageIndexImg);
                if (banners.getStatus() == MsgStatus.NORMAL) {
                    List<PageIndexImg> bannerList = banners.getResult();
                    if(bannerList.size()>0){
                        String  url = bannerList.get(0).getUrl();
                        bottomStroll.put("targeUrl", url);
                    }
                }
                bottomList.add(bottomStroll);
            }else if (paidState.equals("P")){
                padiMsg="卡内余额不足,支付未完成,您还需要支付余款,请重新选择其他支付方式!";
            }else {
                padiMsg="支付未完成,请重新支付!";
            }
            _result.put("paidState",paidState);
            _result.put("paidMsg",padiMsg);
            float orderFee = orderInfo.getOrderFee().floatValue();
            _result.put("orderFee",orderFee);
            float needPaiFee = orderFee-orderInfo.getPaidFee().floatValue();
            //格式化价格,显示小数点后两位
            DecimalFormat fnum=new DecimalFormat("##0.00");
            String needPayfee = fnum.format(needPaiFee);
            //待支付余额
            _result.put("needPaiFee",needPayfee);
//            _result.put("payTime",orderInfo.getPaidTime());
            _result.put("payModel",orderInfo.getPaymentMode());
            _result.put("goodsSeller",orderInfo.getGoodsSeller());
            if (bottomList.size()>0){
                _result.put("bottomList",bottomList);
            }
            this.setResultInfo("0","查询成功").write(request,response);
        }catch (Exception e){
            LOG.error(e.getMessage());
            this.setResultInfo("1","网路异常,请稍后重试").write(request,response);
        }

    }

    private static List<String> getOrderStatusList(Integer orderState){
        List<String> orderStatusMs=new ArrayList<String>();

        if (orderState==29 ||orderState==28 ||orderState==27||
                orderState==26||orderState==23||
                orderState==22 || orderState==21||orderState==431
                ){
            orderStatusMs.add("已提交");
            orderStatusMs.add("已支付");
            orderStatusMs.add("已审核");
            orderStatusMs.add("配货中");
            orderStatusMs.add("已出库");
            orderStatusMs.add("已发货");
            orderStatusMs.add("已收货");
            orderStatusMs.add("已完成");
        }
        if (orderState==18 || orderState==19||orderState==20){
            orderStatusMs.add("退货中");
            orderStatusMs.add("已退款");
            orderStatusMs.add("退货完成");
        }
        if(orderState==25){
            orderStatusMs.add("已取消");
        }
        if(orderState==24){
            orderStatusMs.add("缺货中");
        }
        return orderStatusMs;
    }

    /**
     * 18已退款;19退货完成;20退货中;21已出库;22配货中;(23已收货;23该状态现在没有用到)
     * 24缺货中;25已取消;26已完成;27已发货;28已审核;29已提交
     * 根据isPaid 拆分29已提交,29已支付。
     * 根据orderButs存在canEval 拆分26已完成,26已收货
     */
    private static String getOrderStatus(Integer orderInt,String isPay,List<String> orderButs){
        String  orderStatus="已提交";
        switch (orderInt) {
        case 29:
            if ("Y" .equals(isPay)) {
                orderStatus="已支付";
            }else {
                orderStatus="已提交";
            }
            break;
        case 28:
            orderStatus="已审核";
            break;
        case 27:
            orderStatus="已发货";
            break;
        case 26:
            if (orderButs.contains("canEval")) {
                orderStatus="已收货";
            }else {
                orderStatus="已完成";
            }
            break;
        case 25:
            orderStatus="已取消";
            break;
        case 24:
            orderStatus="缺货中";
            break;
        case 23:
            orderStatus="已收货";
            break;
        case 22:
            orderStatus="配货中";
            break;
        case 21:
            orderStatus="已出库";
            break;
        case 20:
            orderStatus="退货中";
            break;
        case 19:
            orderStatus="退货完成";
            break;
        case 18:
            orderStatus="已退款";
            break;
        case 431:
            orderStatus="部分发货";
            break;
        }
        return orderStatus;
    }
    private List<LogisticsInfo> sortLogisticInfo(ServiceMessage<List<Logistics>> serviceMessage) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        List<Logistics> result = serviceMessage.getResult();
        ArrayList<LogisticsInfo> list = new ArrayList<LogisticsInfo>();
        for(Logistics logistics: result){
            LogisticsInfo logisticsInfo = logistics.getLogisticsInfos().get(0);
            list.add(logisticsInfo);
        }
//        System.out.println("最新++++++++++"+list.toString());
        //排序
        for (int i = 0; i <list.size() ; i++) {
            for (int j = i+1; j <list.size() ; j++) {
                boolean flag = df.parse(list.get(i).getLogisticsTime()).before(df.parse(list.get(j).getLogisticsTime()));
                if (flag){
                    LogisticsInfo temp=list.get(i);
                    list.set((i), list.get(j));
                    list.set(j, temp);
                }
            }
        }
//        for (LogisticsInfo s : list) {
//            System.out.println("11111111111111111"+s.toString());
//        }
//        System.out.println("11111111111111"+list.toString());
    return list;
    }

    @RequestMapping("/insertFromStore")
    public void insertFromStore(
            HttpServletRequest request,
            HttpServletResponse response){
        StringBuffer json = new StringBuffer();
        String line = null;
        String orderMsg = "";
        try {
            BufferedReader reader = request.getReader();
            while((line = reader.readLine()) != null) {
                json.append(line);
            }
            orderMsg = json.toString();
        }
        catch(Exception e) {
            logger.error(e);
        }
        if (StringUtil.isEmpty(orderMsg)){
                this.setResultInfo("-1", "params error!").write(request, response);
                return;
        }
        com.alibaba.fastjson.JSONObject jsonObject = null;

        try {
            jsonObject = com.alibaba.fastjson.JSONObject.parseObject(orderMsg);
        } catch (Exception e) {
            this.setResultInfo("-1", "params error!").write(request, response);
            return;
        }

        //门店渠道id
        int storeMutilId = 46;

        String mTel = jsonObject.getString("mTel");
        String tranid = jsonObject.getString("tranid");
        com.alibaba.fastjson.JSONArray artiitem = jsonObject.getJSONArray("artiitem");
        String tranDate = jsonObject.getString("tranDate");
        String discount = jsonObject.getString("discount");
        String deptName = jsonObject.getString("deptName");
        String sumSaleAmt = jsonObject.getString("sumSaleAmt");
        String memberId = jsonObject.getString("memberId");

        if(StringUtil.isEmpty(mTel)||StringUtil.isEmpty(tranid)||StringUtil.isEmpty(tranDate)||StringUtil.isEmpty
                (discount)||StringUtil.isEmpty(deptName)||StringUtil.isEmpty(sumSaleAmt)||StringUtil.isEmpty(memberId)){
            this.setResultInfo("-1", "params error!").write(request, response);
            return;
        }

        List<OrderItem> itemList = new ArrayList<OrderItem>();

        String orderIsTC ="N";

        //订单详情信息
        for (Object o : artiitem) {
            OrderItem item = new OrderItem();
            String jsonStr = com.alibaba.fastjson.JSONObject.toJSONString(o);
            com.alibaba.fastjson.JSONObject itemJson = com.alibaba.fastjson.JSONObject.parseObject(jsonStr);
            String artiCode = itemJson.getString("artiCode");
            String artiName = itemJson.getString("artiName");
            String isCFY = itemJson.getString("isCFY");
            String artiQty = itemJson.getString("artiQty");
            String saleAmt = itemJson.getString("saleAmt");
            String salePrice = itemJson.getString("salePrice");

            if(StringUtil.isEmpty(artiCode)||StringUtil.isEmpty(artiQty)||StringUtil.isEmpty(saleAmt)||StringUtil
                    .isEmpty(salePrice)||StringUtil.isEmpty(artiName)||StringUtil.isEmpty(isCFY)){
                this.setResultInfo("-1", "params error!").write(request, response);
                return;
            }

            if(new BigDecimal(saleAmt).compareTo(new BigDecimal(salePrice).multiply(new BigDecimal(artiQty))) != 0){
                this.setResultInfo("3", "单品金额校验失败").write(request, response);
                return;
            }

            if(!isCFY.equals("0")){
                orderIsTC = "Y";
            }

            item.setGoodsName(artiName);
            item.setGoodsNo(artiCode);
            item.setGoodsPrice(new BigDecimal(salePrice));
            item.setGoodsAmount(new BigDecimal(artiQty));
            item.setGoodsSumFee(new BigDecimal(saleAmt));

            item.setGoodsType("general");
            itemList.add(item);
        }

        //订单信息
        OrderInfo orderInfo = new OrderInfo();
        orderInfo.setMemberId(Long.valueOf(memberId));
        orderInfo.setMemberMobile(mTel);
        orderInfo.setReceiveMobile(mTel);
        orderInfo.setMultiChannelId(storeMutilId);
        orderInfo.setMultiChannelOrderId(Long.valueOf(tranid));
        orderInfo.setOtherDiscounts(new BigDecimal(discount));
        orderInfo.setFinishTime(tranDate);
        orderInfo.setOrderFee(new BigDecimal(sumSaleAmt));
        orderInfo.setIsTc(orderIsTC);

        ServiceMessage<String> insertResult= null;
        String resultMsg = ResultMsg.Common.OK;
        try {
             insertResult= orderInfoService.insertOrderInfoFromStore(orderInfo,itemList,deptName);
             resultMsg = insertResult.getMessage();
        } catch (Exception e) {
            LOG.error(e.getMessage(), e);
            resultMsg = ResultMsg.OrderActionMsg.INSERT_STORE_FAILURE;
        } finally {
            this.setResult(insertResult,
                    resultMsg).write(request,
                    response);
        }
    }
}

JSON 解析(门店)的更多相关文章

  1. Android okHttp网络请求之Json解析

    前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...

  2. Json解析工具的选择

    前言 前段时间@寒江不钓同学针对国内Top500和Google Play Top200 Android应用做了全面的分析(具体分析报告见文末的参考资料),其中有涉及到对主流应用使用json框架Gson ...

  3. iOS json 解析遇到error: Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed.

    Error Domain=NSCocoaErrorDomain Code=3840 "The operation couldn’t be completed. (Cocoa error 38 ...

  4. Android之JSON解析

    做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...

  5. Android总结之json解析(FastJson Gson 对比)

    前言: 最近为了统一项目中使用的框架,发现项目中用到了两种json解析框架,他们就是当今非常主流的json解析框架:google的Gson 和阿里巴巴的FastJson,为了废除其中一个所以来个性能和 ...

  6. JSON解析和XML解析对比

    JSON解析和XML解析是较为普遍的两种解析方式,其中JSON解析的市场分额更大.本文系统的分析两种解析方式的区别,为更好地处理数据作准备.由于目前阶段主要是做移动开发,所以本文所描述的JSON解析和 ...

  7. iOS json解析的几种方法 NSJSONSerialization,JSONKit,SBJson ,TouchJson

    相关的第三方类库大家可以去github上下载 1.NSJSONSerialization 具体代码如下 : - (void)viewDidLoad { [super viewDidLoad]; NSD ...

  8. Json解析工具Jackson(使用注解)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 接上一篇文章Json解析工具Jackson(简单应用),jackson在实际应用中给 ...

  9. Json解析工具Jackson(简单应用)

    原文http://blog.csdn.net/nomousewch/article/details/8955796 概述 Jackson库(http://jackson.codehaus.org),是 ...

随机推荐

  1. OBJC运行时方法替换(Method swizzling)

    在上周associated objects一文中,我们开始探索Objective-C运行时的一些黑魔法.本周我们继续前行,来讨论可能是最受争议的运行时技术:method swizzling.   Me ...

  2. iOS9 未受信任的企业级开发者

    升级iOS9,app打不开怎么办?6个步骤让你应对“未受信任的企业及开发者账号” 点开App,弹出未受信任的开发者,记住弹框中冒号后面的大写字母.关闭,进入设置. 进入通用 进入描述文件 找到所对应的 ...

  3. BZOJ 1823 满汉全席

    Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...

  4. Oracle三组难缠的hint no_unnest/unnest,push_subq,push_pred--平展化(转)

    经常有人把这三个hint搞混,主如果因为对三种重写道理不清楚.特总结如下.(实验景象为10204)1. no_unnest, unnestunnest我们称为对子查询展开,顾名思义,就是别让子查询孤单 ...

  5. Unity NGUI实现技能CD效果

    unity版本:4.5.1 NGUI版本:3.6.5 脚本代码:C# 在游戏中经常要实现技能的CD效果,NGUI中已经实现了这个功能,即在button上创建一个半透明的Sprite实现这个功能. 首先 ...

  6. 【动态规划】Vijos P1104 采药(NOIP2005普及组第三题)

    题目链接: https://vijos.org/p/1104 题目大意: T时间,n个物品,每个耗时ti,可获得收益ci,求最大收益. 题目思路: [动态规划] 01背包裸题.一维二维都过了,放个一维 ...

  7. call, apply && bind, currying

    简要概括: apply(): 将函数作为指定对象的方法来调用,传递给它的是指定的参数数组 ——function.apply(thisobj, args) 或者 function.apply(thiso ...

  8. DFS 10.1.5.253 1501

    #include <iostream> using namespace std; #define N 20 int a[N][N],m[N],bz[N],n,s; void dfs(int ...

  9. SRM 403(1-250pt, 1-500pt)

    DIV1 250pt 题意:称各个数位只含有4和7的数为lucky number,给定a,b,求[a, b]中的lucky number有多少个.a, b <= 10^9 解法:很明显的数位dp ...

  10. E - 食物链 poj1182

    题目告诉有  3  种动物,互相吃与被吃,现在告诉你  m  句话,其中有真有假,叫你判断假的个数  (  如果前面没有与当前话冲突的,即认为其为真话  ).每句话开始都有三个数 D A B,当D = ...