<?php
/**
 * Created by PhpStorm.
 * User: nizongfeng
 * Date: 2021/11/17
 * Time: 17:29
 */

namespace app\admin\service;


use app\admin\command\Util;
use app\admin\dao\OrderHotelDao;
use app\admin\dao\OrderItemDao;
use app\admin\dao\OrderMainDao;
use app\admin\dao\PaymentOrderDao;
use think\Db;

class PaymentOrderService
{
    /**
     * 保存详情
     * @param $param
     * @return array
     */
    public function save($param){
        //保存
        $dao = new PaymentOrderDao();
        $addRe = $dao->save($param);
        if (!$addRe['flag']) {
            return $addRe;
        }
        if (!empty($param['id'])) {
            $orderHotelModel = new OrderHotelDao();
            $orderHotelModel->updatePayOrderName($param['id'], $param["name"]);

            $orderItemModel = new OrderItemDao();
            $orderItemModel->updatePayOrderName($param['id'], $param["name"]);
        }
        return Util::returnArrSu();

    }

    /**
     * 获取列表
     * @param $param
     * @return array
     */
    public function getList($param){
        $dao = new PaymentOrderDao();
        return $dao->getList($param);
    }

    /**
     * 设置状态
     * @param $id
     * @param $status
     * @return array
     */
    public function setStatus($id,$status) {
        Db::startTrans();
        //1.设置收购单状态
        $dao = new PaymentOrderDao();
        $statusRe =  $dao->setStatus($id,$status);
        if (!$statusRe['flag']) {
            Db::rollback();
            return$statusRe;
        }
        //2.设置所有订单表的状态
        $hotelDao = new OrderHotelDao();
        $hotelRe = $hotelDao->setPaymentOrderStatus($id,$status);
        if (!$hotelRe['flag']) {
            Db::rollback();
            return $hotelRe;
        }
        $itemDao = new OrderItemDao();
        $itemRe = $itemDao->setPaymentOrderStatus($id,$status);
        if (!$itemRe['flag']) {
            Db::rollback();
            return $itemRe;
        }
        //3.获取所有子订单对应的主订单ID
        $hotelIds = $hotelDao->getOrderMainIdByPayment($id);
        $itemIds = $itemDao->getOrderMainIdByPayment($id);
        $orderMainIds = array_unique(array_merge($hotelIds,$itemIds));
        $orderMainDao = new OrderMainDao();
        foreach ($orderMainIds as $orderId) {
            $setRe =  $orderMainDao->setOrderAmount($orderId);
            if (!$setRe['flag']) {
                Db::rollback();
                return $setRe;
            }
        }
        Db::commit();
        return Util::returnArrSu();
    }


    /**
     * 添加子订单到付款单
     * @param $param
     * @return array
     */
    public function addSubOrder($param){
        $model = new PaymentOrderDao();
        $infoRe = $model->getInfoById($param['id']);
        if (!$infoRe['flag']) {
            return $infoRe;
        }
        if (isset($param['hotel_id']) && count($param['hotel_id'])>0) {
            $orderMainDao = new OrderHotelDao();
            $addRe = $orderMainDao->addSubOrderInPayment($infoRe['data'],$param['hotel_id']);
            if (!$addRe['flag']) {
                return $addRe;
            }
        }
        if (isset($param['item_id']) && count($param['item_id'])>0) {
            $orderMainDao = new OrderItemDao();
            $addRe = $orderMainDao->addSubOrderInPayment($infoRe['data'],$param['item_id']);
            if (!$addRe['flag']) {
                return $addRe;
            }
        }
        return Util::returnArrSu();
    }

    /**
     * 移除子订单
     * @param $param
     * @return array
     */
    public function removeSubOrder($param){
        if (isset($param['hotel_id']) && count($param['hotel_id'])>0) {
            $orderMainDao = new OrderHotelDao();
            $addRe = $orderMainDao->removeSubOrderFormPayment($param['hotel_id']);
            if (!$addRe['flag']) {
                return $addRe;
            }
        }
        if (isset($param['item_id']) && count($param['item_id'])>0) {
            $orderMainDao = new OrderItemDao();
            $addRe = $orderMainDao->removeSubOrderFormPayment($param['item_id']);
            if (!$addRe['flag']) {
                return $addRe;
            }
        }
        return Util::returnArrSu("");
    }

    /**
     * 获取子订单列表
     * @param $param
     * @return array
     */
    public function getSubOrderList($param){
        $dao = new PaymentOrderDao();
        $item_where_arr = ["d.del_flag=0","a.del_flag=0","a.group_id = {$param['group_id']}"];
        $hotel_where_arr = ["c.del_flag=0","b.del_flag=0","b.group_id = {$param['group_id']}"];
        $where_arr = [];
        if ($param['prod_type']=='hotel'){
            $item_where_arr[] = " a.id = 0 ";
        }else{
            $hotel_where_arr[]=" b.id = 0 ";
        }
        if (!empty($param['sub_order_id'])) {
            $item_where_arr[] = " a.id = {$param["sub_order_id"]} ";
            $hotel_where_arr[]=" b.id = {$param['sub_order_id']} ";
        }
        if (!empty($param['order_id'])) {
            $item_where_arr[] = " a.order_id = {$param["order_id"]} ";
            $hotel_where_arr[]=" b.order_id = {$param['order_id']} ";
        }
        if (!empty($param['supplier_id'])) {
            $item_where_arr[] = " d.supplier_id = {$param["supplier_id"]} ";
            $hotel_where_arr[]=" c.supplier_id = {$param['supplier_id']} ";
        }
        if (!empty($param['confirm_status']))  {
            $item_where_arr[] = " a.confirm_status = {$param["confirm_status"]} ";
            $hotel_where_arr[]=" b.confirm_status = {$param['confirm_status']} ";
        }
        if (!empty($param['customer_name'])) {
            $item_where_arr[] = " a.customer_name like '%{$param["customer_name"]}%' ";
            $hotel_where_arr[]=" b.customer_name like '%{$param['customer_name']}%' ";
        }
        if (!empty($param['item_id'])) {
            $item_where_arr[] = " a.item_id = {$param["item_id"]} ";
        }
        if (!empty($param['hotel_id'])) {
            $hotel_where_arr[] = " b.hotel_id = {$param["hotel_id"]} ";
        }

        switch ($param['inPayment']) {
            case 1:
                $item_where_arr[] = " a.payment_order_id = {$param["payment_order_id"]} ";
                $hotel_where_arr[]=" b.payment_order_id = {$param['payment_order_id']} ";
                break;
            case 2:
                $item_where_arr[] = " a.payment_order_id != {$param["payment_order_id"]} ";
                $hotel_where_arr[]=" b.payment_order_id != {$param['payment_order_id']} ";
                break;
            case 3:
                $item_where_arr[] = " a.payment_order_id = '' ";
                $hotel_where_arr[]=" b.payment_order_id = '' ";
        }

        //金额区间查询
        if (!empty($param['startMoney'])) {
            $item_where_arr[] = " a.total_cost >= {$param["startMoney"]} ";
            $hotel_where_arr[]=" b.total_cost >= {$param['startMoney']} ";
        }
        if (!empty($param['endMoney'])) {
            $item_where_arr[] = " a.total_cost <= {$param["endMoney"]} ";
            $hotel_where_arr[]=" b.total_cost <= {$param['endMoney']} ";
        }

        //时间区间查询
        if (!empty($param['startTime']) ) {
            $item_where_arr[] = " a.check_in_date >= '{$param["startTime"]} 00:00:00' ";
            $hotel_where_arr[]=" b.check_in_date >= '{$param['startTime']} 00:00:00' ";
        }
        if (!empty($param['endTime'])) {
            $item_where_arr[] = " a.check_in_date <= '{$param["endTime"]} 23:59:59' ";
            $hotel_where_arr[]=" b.check_in_date <= '{$param['endTime']} 23:59:59' ";
        }

        return $dao->getSubOrderListByWhere(join(" and ",$hotel_where_arr),join(" and ",$item_where_arr),join(" and ",$where_arr),$param);
    }

    /**
     * 删除付款单
     * @param $id
     * @return array
     */
    public function delAll($id){
        Db::startTrans();
        //1.删除付款单下的附加项目订单
        $itemDao = new OrderItemDao();
        $itemRe = $itemDao->delPaymentOrder($id);
        if (!$itemRe['flag']) {
            Db::rollback();
            return $itemRe;
        }
        //1.删除付款单下的酒店订单
        $hotelDao = new OrderHotelDao();
        $hotelRe = $hotelDao->delPaymentOrder($id);
        if (!$hotelRe['flag']) {
            Db::rollback();
            return $hotelRe;
        }
        //2.删除付款单
        $model = new PaymentOrderDao();
        $delRe = $model->del($id);
        if (!$delRe['flag']) {
            Db::rollback();
            return $delRe;
        }
        Db::commit();
        return Util::returnArrSu();
    }

}