load->library('trippest'); $this->load->helper('array'); $this->load->model('Vendor_money_model', 'money_model'); mb_regex_encoding("UTF-8"); bcscale(2); } public function settlement() { $data['default_date1'] = date('Y-m-01', strtotime("last month")); $data['default_date2'] = date('Y-m-d H:i:s', mktime(0,0,0,date('m'),1,date('Y'))-1); $vendor_sourcetype = $this->trippest->vendor_sourcetype(); $data['default_vendor'] = array_keys($vendor_sourcetype); $this->load->view('vendor_money_sum', $data); } public function index($download_vendor=null) { $this->permission->is_admin(true); $date_range = $this->input->post("date_range"); preg_match_all('/\d{4}\-\d{2}\-\d{2}/', $date_range, $date_range_arr); if (empty($date_range_arr[0])) { return $this->settlement(); } $start_date = $date_range_arr[0][0]; $end_date =$date_range_arr[0][1] . " 23:59"; if ($end_date == null) { $end_date = date("Y-m-d H:i:s", strtotime("+1 month", strtotime($start_date))-1); } $vendors = $this->input->post("vendors"); $vendor_sourcetype = $this->trippest->vendor_sourcetype(); $final_table = $this->money_model->checked_group_list(0, 0, $start_date, $end_date, implode(',', $vendors)); if ($download_vendor !== null) { $vendors = array($download_vendor); $sourcetype = $vendor_sourcetype[strval($download_vendor)]["sourcetype"]; $vendor_name = $vendor_sourcetype[strval($download_vendor)]["vendor_name"]; $vendor_data = array_filter($final_table, function ($row) use ($download_vendor) { return $row['vendor']==$download_vendor; }); $file_name = str_replace(" ", "_", $date_range) . "_" . $vendor_name; return $this->download_output($vendor_data, $file_name); } $result = array( "default_date1" => $start_date ,"default_date2" => $end_date ,"default_vendor" => $vendors ,"trippest_order_vendor_money" => array() ,"trippest_order_multi_city" => array() ,"trippest_order_cost_debug" => array() ,"transfer_sum" => 0 /** 列总计 */ ,"col_sum" => array( "trippest" => array( "sum_trippest_cost" => 0 ,"sum_vendor_cost" => 0 ,"sum_trippest_sum" => 0 ,"sum_vendor_sum" => 0 ,"sum_profit" => 0 ,"sum_trippest_profit" => 0 ,"sum_vendor_profit" => 0 ,"sum_payout" => 0 ,"sum_other" => 0 ), "sync" => array( "sum_trippest_cost" => 0 ,"sum_vendor_cost" => 0 ,"sum_cost_sum" => 0 ,"sum_price_sum" => 0 ,"sum_trippest_sum" => 0 ,"sum_vendor_sum" => 0 ,"sum_profit" => 0 ,"sum_trippest_profit" => 0 ,"sum_vendor_profit" => 0 ,"sum_payout" => 0 ,"sum_other" => 0 ) ) ); $result['trippest_order_multi_city'] = array_merge($result['trippest_order_multi_city'], $this->money_model->trippest_order_multi_city($start_date, $end_date, implode(',', $vendors))); $result['trippest_order_cost_debug'] = $this->money_model->cost_debug_detail($start_date, $end_date, implode(',', $vendors)); /** * 计算同步回来的数据 */ $all_price_cost = $this->money_model->get_sync_price_cost($start_date, $end_date, implode(',', $vendors)); $unique_sync_groupno = array(); $dumplicate_groupno = array(); /** 汇总计算 */ foreach ($vendors as $key => $vendor) { $ret = array( "trippest_cost" => 0, "vendor_cost" => 0, "trippest" => array( "trippest_sum" => 0, "vendor_sum" => 0, "other_sum_cost" => 0, "other_sum" => 0, "other_vendor_sum" => 0, "trippest_cost" => 0, "vendor_cost" => 0 ), "sync" => array( "price_sum" => 0, "cost_sum" => 0, "trippest_sum" => 0, "vendor_sum" => 0, "transfer_sum" => 0, "other_sum_cost" => 0, "other_sum" => 0, "other_vendor_sum" => 0, "trippest_cost" => 0, "vendor_cost" => 0 ) ); foreach ($final_table as $line => $row) { if ($row['vendor'] == $vendor) { $ret['trippest']['trippest_sum'] = bcadd($ret['trippest']['trippest_sum'], $row['sync_haina_receipt']); $ret['trippest']['vendor_sum'] = bcadd($ret['trippest']['vendor_sum'], $row['vendor_receipt']); $ret['trippest']['vendor_cost'] = bcadd($ret['trippest']['vendor_cost'], $row['group_vendor_cost']); $ret['trippest']['other_sum'] = bcadd($ret['trippest']['other_sum'], $row['other_price_RMB']); $ret['trippest']['other_sum_cost'] = bcadd($ret['trippest']['other_sum_cost'], $row['other_cost_RMB']); $ret['trippest']['other_vendor_sum'] = bcadd($ret['trippest']['other_vendor_sum'], $row['other_vendorprice_RMB']); $ret['vendor_cost'] = bcadd($ret['vendor_cost'], $row['group_vendor_cost']); } } /** 计算同步的数据 */ foreach ($all_price_cost as $ks => $sync) { if ($sync['vendor_code'] != $vendor ) { continue; } $ret['sync']['trippest_sum'] = bcadd($ret['sync']['trippest_sum'], $sync['SyncHainaReceipt']); $ret['sync']['vendor_sum'] = bcadd($ret['sync']['vendor_sum'], $sync['SyncAgencyReceipt']); $ret['sync']['vendor_cost'] = bcadd($ret['sync']['vendor_cost'], $sync['SyncCombineCost']); /** 利润 */ $ret['sync']['total_profit'] = bcsub( bcadd($ret['sync']['trippest_sum'], $ret['sync']['vendor_sum']), $ret['sync']['vendor_cost']); /** 利润分成 */ $ret['sync']['vendor_profit'] = bcmul($ret['sync']['total_profit'], $vendor_sourcetype[strval($sync['vendor_code'])]["profit_rate"]); $ret['sync']['trippest_profit'] = bcmul($ret['sync']['total_profit'], bcsub(1, $vendor_sourcetype[strval($sync['vendor_code'])]["profit_rate"]) ); /** Trippest应付地接 */ $ret['sync']['payout'] = bcsub(bcadd($ret['sync']['vendor_cost'], $ret['sync']['vendor_profit'] ), $ret['sync']['vendor_sum']); // if (in_array($sync['GCI_combineNo'],$unique_sync_groupno)) { // $dumplicate_groupno[] = $sync; // continue; // } // $unique_sync_groupno[] = $sync['GCI_combineNo']; // $ret['sync']['price_sum'] = bcadd($ret['sync']['price_sum'], $sync['receive_price']); // $ret['sync']['cost_sum'] = bcadd($ret['sync']['cost_sum'], $sync['cost']); } $result["money"][strval($vendor)] = $ret; $result["money"][strval($vendor)]["vendor_code"] = $vendor; $result["money"][strval($vendor)]["vendor_name"] = $vendor_sourcetype[strval($vendor)]["vendor_name"]; /** 团款合计 */ $result['col_sum']['trippest']['sum_trippest_sum'] = bcadd( bcadd($result['col_sum']['trippest']['sum_trippest_sum'], $ret["trippest"]['trippest_sum']) ,$ret['trippest']['other_sum']); $result['col_sum']['trippest']['sum_vendor_sum'] = bcadd($result['col_sum']['trippest']['sum_vendor_sum'], $ret["trippest"]['vendor_sum']); $result['col_sum']['trippest']['sum_other'] = bcadd($result['col_sum']['trippest']['sum_other'], $ret['trippest']['other_sum']); $result['col_sum']['sync']['sum_trippest_sum'] = bcadd($result['col_sum']['sync']['sum_trippest_sum'], $ret['sync']['trippest_sum']); $result['col_sum']['sync']['sum_vendor_sum'] = bcadd($result['col_sum']['sync']['sum_vendor_sum'], $ret["sync"]['vendor_sum']); $result['col_sum']['sync']['sum_price_sum'] = bcadd($result['col_sum']['sync']['sum_price_sum'], bcadd($ret['sync']['trippest_sum'], $ret["sync"]['vendor_sum'])); $result['col_sum']['sync']['sum_cost_sum'] = bcadd($result['col_sum']['sync']['sum_cost_sum'], $ret["sync"]['vendor_cost']); // 成本总计 $result['col_sum']['trippest']['sum_trippest_cost'] = $result['col_sum']['vendor']['sum_trippest_cost'] = bcadd($result['col_sum']['trippest']['sum_trippest_cost'], $ret['trippest_cost']); $result['col_sum']['trippest']['sum_vendor_cost'] = $result['col_sum']['vendor']['sum_vendor_cost'] = bcadd( bcadd($result['col_sum']['trippest']['sum_vendor_cost'], $ret['vendor_cost']) ,$ret['trippest']['other_sum_cost']); } foreach ($result['money'] as $kmi => &$vmi) { /** 利润 */ $vmi['trippest']['total_profit'] = bcsub( bcadd(bcadd($vmi['trippest']['trippest_sum'], $vmi['trippest']['vendor_sum']),$vmi['trippest']['other_sum']), bcadd(bcadd($vmi['trippest_cost'], $vmi['vendor_cost']),$vmi['trippest']['other_sum_cost'])); /** 利润分成 */ $vmi['trippest']['vendor_profit'] = bcmul($vmi['trippest']['total_profit'], $vendor_sourcetype[strval($vmi['vendor_code'])]["profit_rate"]); $vmi['trippest']['trippest_profit'] = bcmul($vmi['trippest']['total_profit'], bcsub(1, $vendor_sourcetype[strval($vmi['vendor_code'])]["profit_rate"]) ); /** Trippest应付地接 */ $vmi['trippest']['payout'] = bcsub(bcadd($vmi['vendor_cost'], $vmi['trippest']['vendor_profit'] ), $vmi['trippest']['vendor_sum']); /** 利润总计 */ $result['col_sum']['trippest']['sum_profit'] = bcadd($result['col_sum']['trippest']['sum_profit'], $vmi['trippest']['total_profit']); $result['col_sum']['trippest']['sum_trippest_profit'] = bcadd($result['col_sum']['trippest']['sum_trippest_profit'], $vmi['trippest']['trippest_profit']); $result['col_sum']['trippest']['sum_vendor_profit'] = bcadd($result['col_sum']['trippest']['sum_vendor_profit'], $vmi['trippest']['vendor_profit']); $result['col_sum']['sync']['sum_profit'] = bcadd($result['col_sum']['sync']['sum_profit'], $vmi['sync']['total_profit']); $result['col_sum']['sync']['sum_trippest_profit'] = bcadd($result['col_sum']['sync']['sum_trippest_profit'], $vmi['sync']['trippest_profit']); $result['col_sum']['sync']['sum_vendor_profit'] = bcadd($result['col_sum']['sync']['sum_vendor_profit'], $vmi['sync']['vendor_profit']); /** 应付总计 */ $result['col_sum']['trippest']['sum_payout'] = bcadd($result['col_sum']['trippest']['sum_payout'], $vmi['trippest']['payout']); $result['col_sum']['sync']['sum_payout'] = bcadd($result['col_sum']['sync']['sum_payout'], $vmi['sync']['payout']); } // 财务表成本和实际成本不相等 $result['diff_cost'] = $this->money_model->report_tour_diff($start_date, $end_date, implode(',', $vendors)); $this->async_fresh_report($result['diff_cost'], 'gci_no'); $result['diff_cost'] = $this->money_model->report_tour_diff($start_date, $end_date, implode(',', $vendors)); return $this->load->view('vendor_money_sum', $result); // return $this->output->set_content_type('application/json')->set_output(json_encode($result)); ; } public function download_output($export_list, $file_name) { if (empty($export_list)) { return false; } $this->load->library('PHPExcel'); $objPHPExcel = new PHPExcel(); $objPHPExcel->setActiveSheetIndex(0); //set width $objPHPExcel->getActiveSheet()->getColumnDimension('A')->setWidth(5); $objPHPExcel->getActiveSheet()->getColumnDimension('B')->setWidth(30); $objPHPExcel->getActiveSheet()->getColumnDimension('C')->setWidth(15); $objPHPExcel->getActiveSheet()->getColumnDimension('D')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('E')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('F')->setWidth(20); $objPHPExcel->getActiveSheet()->getColumnDimension('G')->setWidth(20); // 对齐 $objPHPExcel->getActiveSheet()->getStyle('B')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_LEFT); $objPHPExcel->getActiveSheet()->getStyle('C')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); $objPHPExcel->getActiveSheet()->getStyle('D')->getAlignment()->setHorizontal(PHPExcel_Style_Alignment::HORIZONTAL_RIGHT); // 表标题行 $objPHPExcel->getActiveSheet() ->SetCellValue('A1', '#') ->SetCellValue('B1', '团号') ->SetCellValue('C1', '①海纳代收') ->SetCellValue('D1', '②地接代收') ->SetCellValue('E1', '③海纳成本') ->SetCellValue('F1', '④地接成本') ->SetCellValue('G1', '⑤利润'); bcscale(2); $rowCount = 2; foreach ($export_list as $key => $row) { $objPHPExcel->getActiveSheet() ->SetCellValue('A'.$rowCount, ($rowCount-1)) // ->SetCellValue('A'.$rowCount, $row->pn_sn) ->setCellValueExplicit('B'.$rowCount, $row['GRI_No'],PHPExcel_Cell_DataType::TYPE_STRING) ->setCellValue('C'.$rowCount, number_format($row['sync_haina_receipt'], 2, ".", "")) ->setCellValue('D'.$rowCount, number_format($row['vendor_receipt'], 2, ".", "")) ->SetCellValue('E'.$rowCount, 0) ->SetCellValue('F'.$rowCount, $row['group_vendor_cost']) ->setCellValue('G'.$rowCount, bcsub(bcadd($row['vendor_receipt'],$row['sync_haina_receipt']),$row['group_vendor_cost'])) ; $rowCount++; } $rowCount++; // 隔一行 $filename = $file_name . "_" . date('Y-m-d'); header('Content-Type: application/vnd.ms-excel'); header('Content-Disposition: attachment;filename="' . $filename . '.xls"'); header('Cache-Control: max-age=0'); $objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel5'); $objWriter->save('php://output'); } public function report_precheck() { $data = array(); $data['default_date1'] = date('Y-m-01', strtotime("last month")); $data['default_date2'] = date('Y-m-d H:i:s', mktime(0,0,0,date('m'),1,date('Y'))-1); $vendor_sourcetype = $this->trippest->vendor_sourcetype(); $data['default_vendor'] = array_keys($vendor_sourcetype); $this->load->view('order_report_precheck', $data); } public function precheck() { $this->permission->is_admin(true); $ret = array(); $date_range = $this->input->post("date_range"); preg_match_all('/\d{4}\-\d{2}\-\d{2}/', $date_range, $date_range_arr); if (empty($date_range_arr[0])) { return $this->settlement(); } $start_date = $date_range_arr[0][0]; $end_date =$date_range_arr[0][1] . " 23:59"; if ($end_date == null) { $end_date = date("Y-m-d H:i", strtotime("+1 month", strtotime($start_date))-1); } $ret['default_date1'] = $start_date; $ret['default_date2'] = $end_date; $vendors = $this->input->post("vendors"); $ret['default_vendor'] = $vendors; $vendor_sourcetype = $this->trippest->vendor_sourcetype(); $ret['no_check_cancel'] = $this->money_model->get_cancel_not_check($start_date, $end_date, implode(',' ,$vendors)); // 综费协议 但是却同步到成本 $ret['agreement_diff'] = $this->money_model->agreement_diff($start_date, $end_date, implode(',' ,$vendors)); // price [Trippest receipts & agency receipts] $ret['price_error'] = $this->money_model->get_precheck_price_error($start_date, $end_date, implode(',' ,$vendors)); // 仅更新成本数据, 后重新获取 $to_update = array_values(array_unique(array_filter(array_column($ret['price_error'], 'vendor_order')))); if ( ! empty($to_update)) { $this->async_fresh_operation($to_update); $ret['price_error'] = $this->money_model->get_precheck_price_error($start_date, $end_date, implode(',' ,$vendors)); } // not found in GroupCombineInfo $ret['not_found'] = $this->money_model->get_order_not_found_gci($start_date, $end_date, implode(',' ,$vendors)); // cost $HT_combine_cost = $this->money_model->get_combine_cost($start_date, $end_date, implode(',' ,$vendors)); $xls_ht_diff = array(); $xls_data = array(); // $config['upload_path'] = FCPATH.'download_statement\temp_files'; $config['upload_path'] = 'download_statement/temp_files'; // $config['file_name'] = "1.xls"; $config['encrypt_name'] = true; if ( ! is_dir($config['upload_path'])) { mkdir($config['upload_path'], 0777, true); } $config['allowed_types'] = '*'; $config['max_size'] = 0; $this->load->library('upload', $config); if ( ! $this->upload->do_upload('upload_cost')) { $ret['error_msg'] = $this->upload->display_errors(); } else { $upload_data = array('upload_data' => $this->upload->data()); $read_path = $upload_data['upload_data']['full_path']; $xls_data = $this->read_excel($read_path); unlink($upload_data['upload_data']['full_path']); $xls_ht_diff = $this->diff_xls_ht_cost($xls_data, $HT_combine_cost); $this->async_fresh_report($xls_ht_diff['cost_error']); } if ( ! empty($xls_data)) { // 批量`重新生成账单`之后, 在对比一次 $HT_combine_cost = $this->money_model->get_combine_cost($start_date, $end_date, implode(',' ,$vendors)); $xls_ht_diff = $this->diff_xls_ht_cost($xls_data, $HT_combine_cost); } $ret = array_merge($ret, $xls_ht_diff); return $this->load->view('order_report_precheck', $ret); } /*! * @Author: LYT: lyt@hainatravel.com * @Date: 2019-12-06 11:25:16 * @Desc: 批量重新生成账单, 跳过含有其他供应商的和已审核保存的 */ private function async_fresh_report($gci_nos, $key_name='GCI_combineNo') { foreach ($gci_nos as $kc => $gci) { $colis = $this->get_gci_coli($gci[$key_name], false); if (array_sum(array_column($colis['data'], 'no_fresh')) > 0 || array_sum(array_column($colis['data'], 'cgi_check')) > 0 ) { continue; } foreach ($colis['data'] as $kco => $coli) { async_curl("https://www.mycht.cn/webht.php/apps/trippestOrderSync/order_finance/single_order_report_refresh/" . $coli['COLI_SN'] . "/0/1", 2); } } return false; } private function async_fresh_operation($gci_ids) { foreach ($gci_ids as $key => $vendor_orderid) { if ($key > 10) { break; } async_curl("http://www.mycht.cn/webht.php/apps/trippestOrderSync/TulanduoApi/insert_HT_order_operation/0/" . $vendor_orderid, 2); } return false; } private function diff_xls_ht_cost($xls_data, $HT_combine_cost) { $cost_error = array(); $ht_no_match = array(); $xls_no_match = array(); $all_xls_group_name = array_column($xls_data, 'group_name'); $all_ht_group_no = array_column($HT_combine_cost, 'GCI_combineNo'); $not_in_ht = array_diff($all_xls_group_name, $all_ht_group_no); $not_in_xls = array_diff($all_ht_group_no, $all_xls_group_name); foreach ($HT_combine_cost as $kht => $ht_cost) { if (in_array($ht_cost['GCI_combineNo'], $not_in_xls) && !in_array(strtolower($ht_cost['GCI_combineNo']),array('cancel', 'forbidden')) ) { $ht_no_match[] = $ht_cost; } foreach ($xls_data as $kxls => $xls_cost) { if ($xls_cost['group_name'] == $ht_cost['GCI_combineNo'] && strval($ht_cost['cost']) != strval($xls_cost['group_cost']) ) { $cost_error[] = array_merge($ht_cost, $xls_cost); } } } foreach ($xls_data as $kxls => $xls_cost) { if (in_array($xls_cost['group_name'], $not_in_ht)) { $xls_no_match[] = $xls_cost; } } $ret['cost_error'] = $cost_error; $ret['ht_no_match'] = $ht_no_match; $ret['xls_no_match'] = $xls_no_match; return $ret; } private function read_excel($read_path) { $xls_data=array(); $this->load->library('PHPExcel'); $PHPExcel = new PHPExcel(); /**默认用excel2007读取excel,若格式不对,则用之前的版本进行读取*/ $PHPReader = new PHPExcel_Reader_Excel2007(); if(!$PHPReader->canRead($read_path)){ $PHPReader = new PHPExcel_Reader_Excel5(); if(!$PHPReader->canRead($read_path)){ echo 'no Excel'; return ; } } $PHPExcel = $PHPReader->load($read_path); /**读取excel文件中的第一个工作表*/ $currentSheet = $PHPExcel->getSheet(0); /**取得最大的列号*/ // $allColumn = $currentSheet->getHighestColumn(); $allColumn = 'B'; /**取得一共有多少行*/ $allRow = $currentSheet->getHighestRow(); $col_titles = array('A' => 'group_name', 'B' => 'group_cost'); /**从第3行开始输出,因为excel表中第一行为列名*/ for($currentRow = 3;$currentRow <= $allRow;$currentRow++){ $row_tmp = array(); /**从第A列开始输出*/ for($currentColumn= 'A';$currentColumn<= $allColumn; $currentColumn++){ /**ord()将字符转为十进制数*/ $val = $currentSheet->getCellByColumnAndRow(ord($currentColumn) - 65,$currentRow)->getValue(); $col_mean = $col_titles[$currentColumn]; $row_tmp[$col_mean] = $val; } if (isset($row_tmp['group_name']) && !empty($row_tmp['group_name'])) { $row_tmp['group_name'] = trim_str(trim($row_tmp['group_name'])); $xls_data[] = $row_tmp; } } return $xls_data; } public function get_gci_coli($gci=null, $output=true) { $gci = $gci===null ? $this->input->get_post('gci') : $gci; if ( ! $gci ) { return $output===true ? $this->output->set_content_type('application/json')->set_output(json_encode([])) : []; } $result['data'] = $this->money_model->get_gci_coli($gci); if (array_sum(array_column($result['data'], 'no_fresh')) == 0) { $result['msg'] = '拼团中的订单含有其他地接社预订, 请到HT中查看和操作, 以免覆盖数据.'; } return $output===true ? $this->output->set_content_type('application/json')->set_output(json_encode($result)) : $result; } } /* End of file vendor_money.php */ /* Location: ./third_party/trippestOrderSync/controllers/vendor_money.php */