<?php
/**
 * Created by PhpStorm.
 * User: Gss
 * Date: 2021/4/8 0008
 * Time: 19:35
 */

namespace JinDouYun\Model\Finance;

use Jindouyun\Cache\EnterpriseCache;
use JinDouYun\Dao\Customer\DCustomer;
use JinDouYun\Dao\Order\DOrderIndex;
use JinDouYun\Model\System\MSystemPushMessage;
use Mall\Framework\Core\ErrorCode;
use Mall\Framework\Core\StatusCode;
use Mall\Framework\Core\ResultWrapper;

use JinDouYun\Model\Order\MPay;

use JinDouYun\Dao\Finance\DRefund;
use JinDouYun\Dao\Finance\DRefundAccount;
use JinDouYun\Dao\Finance\DRefundIndex;
use JinDouYun\Dao\Order\DOrder;
use JinDouYun\Dao\Finance\DPay;
use JinDouYun\Dao\Finance\DPayReceiptIndex;
use JinDouYun\Dao\Finance\DReceive;
use JinDouYun\Dao\Finance\DReceiveReceiptIndex;

use Util\WeiXin\Pay;


class MRefund
{
    private $enterpriseId;
    private $userCenterId;

    private $objDReceiveReceiptIndex;
    private $objDReceive;
    private $objDay;
    private $objDPayReceiptIndex;
    private $objDOrder;
    private $objDRefund;
    private $objDRefundIndex;
    private $objDRefundAccount;
    private $objMFinanceType;
    private $objMCustomerBalance;
    private $objMCustomerBalanceDetail;
    private $objMSupplierBalanceDetail;
    private $objMSupplierBalance;

    private $cutTable = 200000;
    /**
     * @param $enterpriseId
     * @param $userCenterId
     * @throws \Exception
     */
    public function __construct($enterpriseId, $userCenterId)
    {
        $this->userCenterId = $userCenterId;
        $this->enterpriseId = $enterpriseId;

        $this->objDReceive = new DReceive('finance');
        $this->objDReceiveReceiptIndex = new DReceiveReceiptIndex('finance');
        $this->objDay = new DPay('finance');
        $this->objDPayReceiptIndex = new DPayReceiptIndex('finance');
        $this->objDOrder = new DOrder();
        $this->objDRefund = new DRefund('finance');
        $this->objDRefundIndex = new DRefundIndex('finance');
        $this->objDRefundAccount = new DRefundAccount('finance');

        $this->objMFinanceType = new MFinanceType($enterpriseId, $userCenterId);
        $this->objMCustomerBalance = new MCustomerBalance($enterpriseId, $userCenterId);
        $this->objMCustomerBalanceDetail = new MCustomerBalanceDetail($enterpriseId,$userCenterId);

        $this->objMSupplierBalance = new MSupplierBalance($enterpriseId, $userCenterId);
        $this->objMSupplierBalanceDetail = new MSupplierBalanceDetail($enterpriseId, $userCenterId);


//        $this->objDReceiveOffset->setTable('qianniao_receive_offset_'. $enterpriseId);
        $this->objDRefund->setTable('qianniao_refund_' . $enterpriseId . '_' . date('Y') . '_' . ceil(date('m') / 3));
        $this->objDRefundAccount->setTable('qianniao_refund_account_' . $enterpriseId . '_' . date('Y') . '_' . ceil(date('m') / 3));
        $this->objDRefundIndex->setTable('qianniao_refund_index_' . $enterpriseId);
        $this->objDPayReceiptIndex->setTable('qianniao_pay_receipt_index_'.$this->enterpriseId);
        $this->objDReceiveReceiptIndex->setTable('qianniao_receive_receipt_index_'.$this->enterpriseId);

    }

    /**
     * 添加退款单
     */
    public function addRefund($params, $autoCheck= false)
    {
        $accountList = $params['accountList'];
        unset($params['accountList']);

        $beginTransactionStatus = $this->objDRefund->beginTransaction();
        // 生成编号
        $dbResult =  $this->objDRefund->get('createTime >='.strtotime(date('Ymd'.'0:0:0')), 'no', 'createTime desc');
        if ($dbResult === false) {
            return ResultWrapper::fail($this->objDRefund->error(), ErrorCode::$dberror);
        }
        if(empty($dbResult)){
            $params['no'] = createSerialNumberByDate('');
        }else{
            $params['no'] = createSerialNumberByDate($dbResult['no']);
        }

        $refundId = $this->objDRefund->insert($params);
        if ($refundId === false) {
            $this->objDRefund->rollBack();
            return ResultWrapper::fail($this->objDRefund->error(), ErrorCode::$dberror);
        }
        //索引表数据
        $indexData = [
            'no'                 => $params['no'],
            'refundId'         => $refundId,
            'unitId'            => isset($params['unitId']) ? isset($params['unitId']): '',
            'originId'         => isset($params['originId']) ? isset($params['originId']): '',
            'originNo'         => isset($params['originNo']) ? isset($params['originNo']): '',
            'type'              => getArrayItem($params,'type',''),
            'payType'              => getArrayItem($params,'payType',''),
            'currentAccountName' => $params['currentAccountName'],//制单人
            'sourceNo'           => $params['sourceNo'],
            'auditStatus'        => $params['auditStatus'],
            'financeTypeId'      => $params['financeTypeId'],
            'financeType'        => $params['financeType'],
            'createTime'         => $params['createTime'],
            'updateTime'         => $params['updateTime'],
            'refundTime'         => $params['refundTime'],
        ];
        $result = $this->objDRefundIndex->insert($indexData);

        if ($result === false) {
            $this->objDRefund->rollBack();
            return ResultWrapper::fail($this->objDRefundIndex->error(), ErrorCode::$dberror);
        }
        unset($result);
        //收款账户数据
        foreach ($accountList as $account) {
            $account['operatorId'] = $this->userCenterId;
            $account['refundId'] = $refundId;
            $account = self::buildAccountData($account);
            $result = $this->objDRefundAccount->insert($account);
            if ($result === false) {
                $this->objDRefund->rollBack();
                return ResultWrapper::fail($this->objDRefundAccount->error(), ErrorCode::$dberror);
            }
            unset($result);
        }

        if( $beginTransactionStatus ){
            $this->objDRefund->commit();
        }
        return ResultWrapper::success($refundId);

    }

    public static function buildAccountData(array $params)
    {
        return [
            'refundId' => isset($params['refundId']) ? $params['refundId'] : 0,
            'accountId' => isset($params['accountId']) ? $params['accountId'] : 0,
            'accountNumber' => isset($params['accountNumber']) ? $params['accountNumber'] : 0,
            'accountName' => getArrayItem($params, 'accountName', ''),
            'money' => isset($params['money']) ? $params['money'] : 0,
            'payWay' => isset($params['payWay']) ? $params['payWay'] : 0,
            'remark' => isset($params['remark']) ? $params['remark'] : '',
            'createTime' => time(),
            'updateTime' => time(),
            'operatorId' => isset($params['operatorId']) ? $params['operatorId'] : 0,
        ];
    }

    /**
     * 修改退款单
     */
    public function editRefund($params)
    {
        $this->objDRefund->setTable('qianniao_refund_' . $this->enterpriseId . '_' . date('Y', $params['createTime']) . '_' . ceil(date('m', $params['createTime']) / 3));
        $this->objDRefundAccount->setTable('qianniao_refund_account_' . $this->enterpriseId . '_' . date('Y', $params['createTime']) . '_' . ceil(date('m', $params['createTime']) / 3));

        $beginTransactionstatus = $this->objDRefund->beginTransaction();
        $accountList = $params['accountList'];
        unset($params['accountList']);

        $params['money'] = 0;
        foreach ($accountList as $account) {
            $params['money'] += $account['money'];
        }

        $refundId = $params['id'];
        unset($params['id']);

        $dbResult = $this->objDRefund->update($params, $refundId);
        if ($dbResult === false) {
            $this->objDRefund->rollBack();
            return ResultWrapper::fail($this->objDRefund->error(), ErrorCode::$dberror);
        }
        //索引表数据
        $indexData = [
            'refundId'         => $refundId,
            'unitId'         => isset($params['unitId']) ? isset($params['unitId']): '',
            'originId'         => isset($params['originId']) ? isset($params['originId']): '',
            'originNo'         => isset($params['originNo']) ? isset($params['originNo']): '',
            'type'              => getArrayItem($params,'type',''),
            'currentAccountName' => $params['currentAccountName'],
            'no'                 => $params['no'],
            'sourceNo'           => $params['sourceNo'],
            'auditStatus'        => $params['auditStatus'],
            'financeTypeId'      => $params['financeTypeId'],
            'financeType'        => $params['financeType'],
            'createTime'         => $params['createTime'],
            'updateTime'         => $params['updateTime'],
            'refundTime'        => $params['refundTime'],
        ];
        $result = $this->objDRefundIndex->update($indexData,['refundId'=>$refundId]);
        if ($result === false) {
            $this->objDRefund->rollBack();
            return ResultWrapper::fail($this->objDRefundIndex->error(), ErrorCode::$dberror);
        }
        unset($result);
        //收款账户数据
        foreach ($accountList as $account) {
            if (isset($account['id'])) {
                $account['refundId'] = $refundId;
                $account['operatorId'] = $this->userCenterId;
                $account['updateTime'] = $params['updateTime'];
                $result = $this->objDRefundAccount->update($account, $account['id']);

                if ($result === false) {
                    $this->objDRefund->rollBack();
                    return ResultWrapper::fail($this->objDRefundAccount->error(), ErrorCode::$dberror);
                }
                unset($result);
            }
        }
        if($beginTransactionstatus){
            $this->objDRefund->commit();
        }

        return ResultWrapper::success($dbResult);


    }

    /**
     * 退款单审核
     */
    public function updateRefundStatus($params)
    {
        $this->objDRefund->setTable('qianniao_refund_' . $this->enterpriseId . '_' . date('Y', $params['createTime']) . '_' . ceil(date('m', $params['createTime']) / 3));
        $this->objDRefundAccount->setTable('qianniao_refund_account_' . $this->enterpriseId . '_' . date('Y', $params['createTime']) . '_' . ceil(date('m', $params['createTime']) / 3));
        // 查询退款单数据
        $refundData = $this->objDRefund->get(['id' => $params['id']]);
        if ($refundData === false) {
            return ResultWrapper::fail($this->objDRefund->error(), ErrorCode::$dberror);
        }
        if(empty($refundData)){
            return ResultWrapper::fail('要操作得单据不存在', ErrorCode::$contentNotExists);
        }
        if($refundData['auditStatus'] == StatusCode:: $auditStatus['auditPass']){
            return ResultWrapper::fail('当前退款单已经审核过了', ErrorCode::$notAllowAccess);
        }
        // 1,根据退款单中的originId（来源订单id）查询订单的source来源是否为销售订单
        $orderIndexId = $refundData['originId'];
        $objDOrderIndex = new DOrderIndex('default');
        $objDOrderIndex->setTable('qianniao_order_index_' . $this->enterpriseId);
        $orderData = $objDOrderIndex->get($orderIndexId);
        if($orderData === false){
            return ResultWrapper::fail($objDOrderIndex->error(), ErrorCode::$dberror);
        }
        if( empty($orderData) ){
            return ResultWrapper::fail('该订单为空', ErrorCode::$contentNotExists);
        }
    
        // 根据订单的来源判断是否为销售订单
        if($orderData['source'] == StatusCode::$orderType['saleOrder']){
            // 根据客户id (customerId) 获取 openId
            $customerId = $orderData['customerId'];
            $objDCustomer = new DCustomer('default');
            $objDCustomer->setTable('qianniao_customer_' . $this->enterpriseId);
            $customerData = $objDCustomer->get($customerId);
            if($customerData === false){
                return ResultWrapper::fail($objDCustomer->error(), ErrorCode::$dberror);
            }
            if( empty($customerData) ){
                return ResultWrapper::fail('查找不到该客户数据', ErrorCode::$contentNotExists);
            }
        // 小程序订阅消息退款通知
        if (isset($customerData['openId']) && !empty($customerData['openId'])) {
            // 发送小程序订阅消息
            $sendMessageData = [
                'time8'             => ['value' => date('Y-m-d H:i:s',$orderData['createTime'])], // 下单时间
                'character_string7' => ['value' => StatusCode::$noPrefix[1].'-'.$orderData['no']], // 订单编号
                'amount9'           => ['value' => '￥'.$refundData['money']], // 支付金额
                'amount3'           => ['value' => '￥'.$refundData['money']], // 退款金额
                'thing1'            => ['value' =>'退款成功(店主已同意退款)'], // 退款状态
            ];
            $objMSystemPushMessage = new MSystemPushMessage($this->userCenterId,$this->enterpriseId);
            $result = $objMSystemPushMessage->sendWeiXinPushMessage(7,$customerData['openId'],$sendMessageData);
            if (!$result->isSuccess()) {
                file_put_contents('/www/wwwroot/logs/api.junhailan.com/sendMessageError.log', date('Y-m-d H:i:s') . 'bb' . var_export($result->getData(), true) . PHP_EOL, FILE_APPEND);
            }
        }
        }
        $beginTransactionStatus = $this->objDRefund->beginTransaction();

        // 更新退款单审核状态
        $dbResult = $this->objDRefund->update(['auditStatus' => StatusCode:: $auditStatus['auditPass']], ['id' => $params['id']]);
        if ($dbResult === false) {
            $this->objDRefund->rollBack();
            return ResultWrapper::fail($this->objDRefund->error(), ErrorCode::$dberror);
        }

        // 更新退款单索引表审核状态
        $dbResult = $this->objDRefundIndex->update(['auditStatus' => StatusCode:: $auditStatus['auditPass']], ['refundId' => $params['id']]);
        if ($dbResult === false) {
            $this->objDRefund->rollBack();
            return ResultWrapper::fail($this->objDRefundIndex->error(), ErrorCode::$dberror);
        }

        if (isset($refundData['offsetId'])){//有核销id说明有应收单id
            //自动核销
            //self::autoMoney($refundData['offsetId'],$refundData['money'],$refundData['createTime'],$refundData['type']);
        }


        if ($refundData['type'] == StatusCode::$standard){//客户
            // 获取客户往来余额
            $customerBalance = $this->objMCustomerBalance->getCustomerBalance($refundData['unitId']);
            $detailData = [
                'customerId'             => $refundData['unitId'],//'客户id',
                'receiptTime'            => $refundData['createTime'],//'单据日期',
                'sourceNo'               => $refundData['no'],//'单据编号',
                'sourceId'               => $refundData['id'],//'单据编号',
                'financeType'            => $refundData['financeType'],//'财务类型名称',
                'financeTypeId'          => $refundData['financeTypeId'],//'财务类型id',
                'originId'               => $refundData['sourceId'], //
                'originNo'               => $refundData['sourceNo'],//
                'salesAmount'            => 0,//总金额
                'discountMoney'          => 0,// '优惠金额',
                'customerAmount'         => 0,// '客户承担金额',
                'receivableAmount'       => 0,// '应收金额',
                'actualReceivableAmount' => 0,//'实际收款金额',
                'refundMoney'            => $refundData['money'],
                'receivableBalance'      => bcadd($customerBalance , $refundData['money'], 4),//'应收后余额',
                'remark'                 => '退款单审核通过，本次退款' . $refundData['money'] . '元',//'备注',
                'createTime'             => time(),//'创建日期',
                'updateTime'             => time(),//'修改日期',
            ];
            // 添加客户往来余额明细
            $result = $this->objMCustomerBalanceDetail->addCustomerBalanceDetail($detailData);
            if (!$result->isSuccess()) {
                $this->objDRefund->rollBack();
                return ResultWrapper::fail($result->getData(), $result->getErrorCode());
            }

            // 编辑客户往来余额
            $changedMoney = $refundData['money'] < 0 ? -1 * $refundData['money'] : abs($refundData['money']);
            $result = $this->objMCustomerBalance->addCustomerBalance($refundData['unitId'], $changedMoney);
            if (!$result->isSuccess()) {
                $this->objDRefund->rollBack();
                return ResultWrapper::fail($result->getData(), $result->getErrorCode());
            }

            // 如果是订单生成的退款单，同步操作订单
            if ( !empty($refundData['originId']) && !empty($refundData['payType'])){
                // 获取订单outerTradeNo
                $tableName = $this->objDOrder->getTableName('qianniao_order_' . $this->enterpriseId, $this->userCenterId, $this->cutTable);
                $this->objDOrder->setTable($tableName);
                $orderDate = $this->objDOrder->get($refundData['originId']);
                if( $orderDate === false ){
                    return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
                }
                if( empty($orderDate) ){
                    return ResultWrapper::fail('查询指定订单数据为空', ErrorCode::$contentNotExists);
                }

                // 读取后台设置的退款返还方式
                $refundWay = StatusCode::$standard;
                $objEnterpriseCache = new EnterpriseCache();
                $enterSettingData = $objEnterpriseCache->getEnterpriseSetting($this->enterpriseId);
                if( isset($enterSettingData['returnWay'])){
                    $refundWay = $enterSettingData['returnWay'];
                }

                // 进行退款操作
                $objMPay = new MPay($this->enterpriseId, $this->userCenterId);
                $result = $objMPay->refund($orderDate, false, $refundData, $refundWay);
                if(!$result->isSuccess()){
                    $this->objDRefund->rollBack();
                    return ResultWrapper::fail($result->getData(), $result->getErrorCode());
                }

                //判断退款金额
                if($refundData['money'] < $orderDate['payAmount']){
                    $payStatus = StatusCode::$payStatus['partRefund'];
                }else{
                    $payStatus = StatusCode::$payStatus['refund'];
                }

                // 修改订单支付状态为已经退款
                $updateData = [
                    'isRet'   => StatusCode::$standard,
                    'retTime' => time(),
                    'retMoney' => $refundData['money'],
                    'payStatus' => $payStatus
                ];
                $dbResult = $this->objDOrder->update($updateData, $orderDate['id']);
                if($dbResult == false){
                    return ResultWrapper::fail($this->objDOrder->error(), ErrorCode::$dberror);
                }
                $objDOrderIndex = new DOrderIndex('default');
                $objDOrderIndex->setTable('qianniao_order_index_'.$this->enterpriseId);
                $updateData = [
                    'isRet'   => StatusCode::$standard,
                    'payStatus' => $payStatus
                ];
                $orderIndex = $objDOrderIndex->update($updateData, $orderDate['id']);
                if ($orderIndex===false){
                    return ResultWrapper::fail($objDOrderIndex->error(),ErrorCode::$dberror);
                }
            }
        }

        if($refundData['type'] == StatusCode::$delete){
            // 查询供应商当前的余额
            $supplierMoney = $this->objMSupplierBalance->getSupplierBalance($refundData['unitId']);
            // 组装供应商余额明细数据
            $detailData = [
                'supplierId'       => $refundData['unitId'],
                'receiptTime'      => $refundData['createTime'],//'单据日期',
                'no'               => $refundData['no'],//'单据编号',
                'financeType'      => $refundData['financeType'],//'财务类型名称',
                'financeTypeId'    => $refundData['financeTypeId'],//'财务类型id',
                'sourceId'         => $refundData['sourceId'], //
                'sourceNo'         => $refundData['sourceNo'],
                'salesAmount'      => $refundData['money'],
                'discountMoney'    => 0.00,// '优惠金额',
                'supplierAmount'   => 0.00,
                'shouldPayAmount'  => 0.00,//实际应付金额
                'actualPaidAmount' => 0,
                'refundMoney'            => $refundData['money'],
//                'actualPaidAmount' => $refundData['money'],
//                'shouldPayBalance' => bcadd($supplierMoney,$refundData['money'],2),//应付款余额 当前供应商余额 + 退款金额
                'shouldPayBalance' => 0, // 退款直接记录退款金额
                'remark'           => '退款单审核通过，应付供应商'.$refundData['payMoney'].'元',//'备注',
                'createTime'       => time(),//'创建日期',
                'updateTime'       => time(),//'修改日期',
            ];

            //供应商余额明细
            $result = $this->objMSupplierBalanceDetail->addSupplierBalanceDetail($detailData);
            if ($result->isSuccess() === false) {
                $this->objDRefund->rollBack();
                return ResultWrapper::fail($result->getData(), $result->getErrorCode());
            }

            //供应商余额
            $changedMoney = $refundData['money'];
            $changedMoney = $changedMoney > 0 ? -1 * $refundData['money'] : abs($refundData['money']);
            $result = $this->objMSupplierBalance->addSupplierBalance($refundData['unitId'], $changedMoney);
            if ($result->isSuccess() === false) {
                $this->objDRefund->rollBack();
                return ResultWrapper::fail($result->getData(), $result->getErrorCode());
            }
        }

        if ($beginTransactionStatus){
            $this->objDRefund->commit();
        }

        return ResultWrapper::success($dbResult);

    }

    /**
     * 自动核销退款单
     */
    public function autoMoney($offsetId,$money,$createTime,$type)
    {
        if($type == StatusCode::$standard){//type  5  说明是订单退款
            //查询负应收
            $suffix = date('Y', $createTime) . '_' . ceil(date('m', $createTime) / 3);
            $this->objDReceive->setTable('qianniao_receive_receipt_' . $this->enterpriseId . '_' . $suffix);
            $receiveDate = $this->objDReceive->get(['id'=>$offsetId]);
            if ($receiveDate === false) {
                return ResultWrapper::fail($this->objDReceive->error(), ErrorCode::$dberror);
            }
            if(empty($receiveDate)){
                return ResultWrapper::fail('要操作得应收单据不存在', ErrorCode::$contentNotExists);
            }
            //判断如果金额为负
            if($receiveDate['receiveMoney'] < 0){
                $updata = [ // 负应收没有核销金额一说
//                    $offsetMoney = $money,
//                    $notOffsetMoney = 0,
                    'offsetStatus' => StatusCode::$standard,
                ];
                $updataIndex = [
                    'offsetStatus' => StatusCode::$standard,
                ];
                $updataReceive = $this->objDReceive->update($updata,['id'=>$receiveDate['id']]);
                if ($updataReceive === false) {
                    $this->objDRefund->rollBack();
                    return ResultWrapper::fail($this->objDReceive->error(), ErrorCode::$dberror);
                }
                //更新index表核销状态
                $updataReceivesIndex = $this->objDReceiveReceiptIndex->update($updataIndex,['id'=>$receiveDate['id']]);
                if ($updataReceivesIndex === false) {
                    $this->objDRefund->rollBack();
                    return ResultWrapper::fail($this->objDReceiveReceiptIndex->error(), ErrorCode::$dberror);
                }
            }
        }else{//  说明是采购单
            //查询负应付
            $suffix = date('Y', $createTime) . '_' . ceil(date('m', $createTime) / 3);
            $this->objDay->setTable('qianniao_pay_receipt_' . $this->enterpriseId . '_' . $suffix);
            $payDate = $this->objDay->get(['id'=>$offsetId]);
            if ($payDate === false) {
                return ResultWrapper::fail($this->objDay->error(), ErrorCode::$dberror);
            }
            if(empty($payDate)){
                return ResultWrapper::fail('要操作得单据不存在', ErrorCode::$contentNotExists);
            }
            //判断如果金额为负，并且财务类型为采购退款单
            if($payDate['financeType'] == '采购退款单' && $payDate['payMoney'] == $money){
                $updata = [
                    $offsetMoney = $money,
                    $notOffsetMoney = 0,
                    $offsetStatus = StatusCode::$standard,
                ];
                $updataIndex = [
                    $offsetStatus = StatusCode::$standard,
                ];
                $updataPay = $this->objDay->update($updata,['id'=>$payDate['id']]);
                if ($updataPay === false) {
                    $this->objDRefund->rollBack();
                    return ResultWrapper::fail($this->objDay->error(), ErrorCode::$dberror);
                }
                //更新index表核销状态
                $updataPayIndex = $this->objDPayReceiptIndex->update($updataIndex,['id'=>$payDate['id']]);
                if ($updataPayIndex === false) {
                    $this->objDRefund->rollBack();
                    return ResultWrapper::fail($this->objDPayReceiptIndex->error(), ErrorCode::$dberror);
                }
            }
        }

        return ResultWrapper::success([]);
    }


    /**
     * 获取指定退款单信息
     * @throws \Exception
     */
    public function getRefundInfo($refundParams)
    {
        $this->objDRefund->setTable('qianniao_refund_' . $this->enterpriseId . '_' . date('Y', $refundParams['createTime']) . '_' . ceil(date('m', $refundParams['createTime']) / 3));
        $this->objDRefundAccount->setTable('qianniao_refund_account_' . $this->enterpriseId . '_' . date('Y', $refundParams['createTime']) . '_' . ceil(date('m', $refundParams['createTime']) / 3));
        $dbResult = $this->objDRefund->get($refundParams['id']);
        if ($dbResult === false) {
            return ResultWrapper::fail($this->objDRefund->error(), ErrorCode::$dberror);
        }
        //渲染前缀
//        $dbResult['no'] = StatusCode::$noPrefix[17] . '-' . $dbResult['no'];
        $accountData = $this->objDRefundAccount->select(['refundId' => $refundParams['id']]);
        if ($accountData === false) {
            return ResultWrapper::fail($this->objDRefundAccount->error(), ErrorCode::$dberror);
        }
        $accountData = array_shift($accountData);
        $dbResult['accountList'] = $accountData;
        //查出客户当前余额
        $dbResult['currentBalanceMoney'] = !empty($dbResult['unitId']) && $dbResult['type'] == 1 ? $this->objMCustomerBalance->getCustomerBalance($dbResult['unitId']) : 0;

        return ResultWrapper::success($dbResult);
    }

    /**
     * 后台所有收款单列表
     */
    public function getAllRefund($selectParams)
    {
        $limit = $selectParams['limit'];
        unset($selectParams['limit']);
        $offset = $selectParams['offset'];
        unset($selectParams['offset']);
        $type = $selectParams['type'];
        unset($selectParams['type']);
        //组装sql where条件
        $whereSql = '';
        if (isset($selectParams['no']) && !empty($selectParams['no'])) {
            //no编号切割
            $explodeNo = explode("-",$selectParams['no']);
            $where = empty($whereSql) ? ' WHERE ' : ' AND ';
            $whereSql .= $where . ' no = "' . $explodeNo[1] . '-' . $explodeNo[2] . '"';
        }
        if (isset($selectParams['financeTypeId']) && !empty($selectParams['financeTypeId'])) {
            $where = empty($whereSql) ? ' WHERE ' : ' AND ';
            $whereSql .= $where . ' financeTypeId = ' . $selectParams['financeTypeId'];
        }
        if (isset($selectParams['auditStatus']) && !empty($selectParams['auditStatus'])) {
            $where = empty($whereSql) ? ' WHERE ' : ' AND ';
            $whereSql .= $where . ' auditStatus = ' . $selectParams['auditStatus'];
        }
        if (isset($selectParams['unitId']) && !empty($selectParams['unitId'])) {
            $where = empty($whereSql) ? ' WHERE ' : ' AND ';
            $whereSql .= $where . ' unitId = ' . $selectParams['unitId'];
        }
        if (isset($selectParams['type']) && !empty($selectParams['type'])) {
            $where = empty($whereSql) ? ' WHERE ' : ' AND ';
            $whereSql .= $where . ' type = ' . $selectParams['type'];
        }

        if ( (isset($selectParams['start']) && !empty($selectParams['start']))&&(isset($selectParams['end']) && !empty($selectParams['end'])) ) {
            $where = empty($whereSql) ? ' WHERE ' : '  AND ';
            $whereSql .= $where . ' createTime BETWEEN ' . $selectParams['start'] . ' AND '. $selectParams['end'];
        }
        $sql = 'SELECT * FROM ' .$this->objDRefundIndex->get_Table(). $whereSql . ' ORDER BY createTime DESC LIMIT ' . $offset . ' , ' . $limit;
        $refundIndexResult = $this->objDRefundIndex->query($sql);
        $tableSuffix = [];
        foreach ($refundIndexResult as $refundIndex) {
            $k = date('Y', $refundIndex['createTime']) . '_' . ceil(date('m', $refundIndex['createTime']) / 3);
            $tableSuffix[$k][] = $refundIndex['refundId'];
        }

        $refundResult = [];
        foreach ($tableSuffix as $suffix => $refundIds) {
            $this->objDRefund->setTable('qianniao_refund_' . $this->enterpriseId . '_' . $suffix);
            $dbResult = $this->objDRefund->select($refundIds, '*', 'createTime desc');
            if ($dbResult === false) {
                return ResultWrapper::fail($this->objDRefund->error(), ErrorCode::$dberror);
            }
//            if (!empty($dbResult)){
//                //渲染前缀
//                foreach ($dbResult as $key => $value){
//                    $dbResult[$key]['no'] = StatusCode::$noPrefix[17] . '-' . $value['no'];
//                }
//            }
            $refundResult = array_merge($refundResult, $dbResult);
        }
        $totalSql = 'SELECT COUNT(1) as count FROM ' .$this->objDRefundIndex->get_Table() . $whereSql;
        $dbTotalResult = $this->objDRefundIndex->query($totalSql);
        if ($dbTotalResult === false) {
            return ResultWrapper::fail($this->objDRefundIndex->error(), ErrorCode::$dberror);
        }
        if(empty($dbTotalResult)){
            return ResultWrapper::success([]);
        }
        $return = [
            'data'  => self::format($refundResult),
            'total' => $dbTotalResult[0]['count']
        ];
        return ResultWrapper::success($return);

    }


    public function format($data)
    {
        foreach( $data as $k => $v ){
            $data[$k]['no'] = StatusCode::$noPrefix[20].'-'.$v['no'];

            switch ($v['financeType']){
                case '订单退货退款':
                    $data[$k]['originNo'] = StatusCode::$noPrefix[1].'-'.$v['originNo'];
                    $data[$k]['sourceNo'] = StatusCode::$noPrefix[15].'-'.$v['sourceNo'];
                    break;
                case '采购退货收款':
                    $data[$k]['originNo'] = StatusCode::$noPrefix[2].'-'.$v['originNo'];
                    $data[$k]['sourceNo'] = StatusCode::$noPrefix[4].'-'.$v['sourceNo'];
                    break;
                case '订单完结退款':
                    $data[$k]['originNo'] = StatusCode::$noPrefix[1].'-'.$v['originNo'];
                    $data[$k]['sourceNo'] = StatusCode::$noPrefix[1].'-'.$v['sourceNo'];
                    break;
                case '订单取消退款':
                    $data[$k]['originNo'] = StatusCode::$noPrefix[1].'-'.$v['originNo'];
                    $data[$k]['sourceNo'] = StatusCode::$noPrefix[1].'-'.$v['sourceNo'];
            }
        }
        return $data;
    }
}