'false');
$params = array(
'title'=>'订单发票列表',
'use_buildin_set_tag' =>false,
'use_buildin_filter' =>true,
'use_buildin_tagedit' =>true,
'use_buildin_export' =>true,
'use_buildin_import' =>false,
// 'allow_detail_popup' =>true,
'use_buildin_recycle' =>false,
'use_view_tab' =>true,
'finder_cols' =>'tax_rate,invoice_no,ship_tax,ship_bank,ship_bank_no,print_num,remarks,ship_area,ship_addr,ship_tel',
'base_filter' => $base_filter,
);
$organization_permissions = kernel::single('desktop_user')->get_organization_permission();
if ($organization_permissions) {
$params['base_filter']['org_id'] = $organization_permissions;
}
if (in_array($_GET['view'], [1, 2, 10])) {
$actions = array(
array(
'label' => '批量操作',
'group' => array(
array('label' => '批量作废', 'submit'=>'index.php?app=invoice&ctl=admin_order&act=batchCancel','target'=>'dialog::{width:690,height:200,title:\'批量作废\'}')
)
)
);
if (kernel::single('desktop_user')->has_permission('make_invoice')) {
$actions[0]['group'][] = array(
'label' => '批量开票',
'submit' => 'index.php?app=invoice&ctl=admin_order&act=batchBill',
'target' => 'dialog::{width:690,height:200,title:\'批量开票\'}'
);
}
}
// if ($_GET['view'] == 1) {
// $actions[] = array(
// 'label' => '发票运单号导入',
// 'href' => 'index.php?app=invoice&ctl=admin_order&act=waybillImport',
// 'target' => "dialog::{width:500,height:500,title:'发票运单号导入'}",
// );
// }
//
// if($_GET['view'] == 4){
// $actions[] = array(
// 'label' => '购方信息导入',
// 'href' => 'index.php?app=invoice&ctl=admin_order&act=invoiceImport',
// 'target' => "dialog::{width:500,height:500,title:'发票导入'}",
// );
// }
//增加同步状态结果
if ($_GET['view'] == 5){
$actions[0]['label'] = '批量操作';
$actions[0]['group'] = array(
array(
'label'=>'批量同步开票结果',
'submit'=>"index.php?app=invoice&ctl=admin_order&act=batchSyncEResult",
'target'=>'dialog::{width:690,height:200,title:\'批量同步开票结果\'}"'
),
);
}
//只有“专票信息 tab”,才显示当前指定模板导出按钮
if (in_array($_GET['view'], [3, 4, 7])){
$params['use_buildin_export'] = false; //不显示系统导出按钮
$btnPrefix = $_GET['view'] == 8 ? '金3冲红' : '专票开票';
$actions[] = [
'label' => $btnPrefix . '导出',
'submit' => 'index.php?app=invoice&ctl=admin_order&act=exportVatInvoice&action=export&finder_aliasname=default&view='.$_GET['view'],
'target' => 'dialog::{width:450,height:210,title:\'' . app::get('desktop')->_($btnPrefix . '导出') . '\'}',
];
$actions[] = [
'label' => $btnPrefix . '导入模板',
'href' => 'index.php?app=invoice&ctl=admin_order&act=exportVatTemplate&view='.$_GET['view'],
'target' => '_blank',
];
$actions[] = [
'label' => $btnPrefix . '导入',
'href' => 'index.php?app=omecsv&ctl=admin_import&act=main&ctler=invoice_mdl_order_vatInvoiceExport&add='.$this->app->app_id,
'target' => 'dialog::{width:500,height:250,title:\'' . app::get('desktop')->_($btnPrefix. '导入') . '\'}',
];
}
if(in_array($_GET['view'],array('2','4')) ){
$actions[] = array(
'label' => 'POS操作',
'group' => array(
array(
'label' => '同步开票结果',
'submit' => 'index.php?app=invoice&ctl=admin_order&oper=batch&act=batchUpload
',
'confirm' => '你确定要对勾选的发票结果同步pos吗?',
'target'=>'dialog::{width:700,height:500,title:\'同步开票结果\'}"'
),
),
);
}
// 金税三期 显示冲红导入导出
if (in_array($_GET['view'], [8])) {
$params['use_buildin_export'] = false; //不显示系统导出按钮
$btnPrefix = '金3冲红';
$actions[] = [
'label' => $btnPrefix . '导出',
'submit' => 'index.php?app=invoice&ctl=admin_order&act=exportGolden3Cancel&action=export&finder_aliasname=default&view=' . $_GET['view'],
'target' => 'dialog::{width:450,height:210,title:\'' . app::get('desktop')->_($btnPrefix . '导出') . '\'}',
];
$actions[] = [
'label' => $btnPrefix . '导入',
'href' => 'index.php?app=omecsv&ctl=admin_import&act=main&ctler=invoice_mdl_order_golden3CancelExport&add=' . $this->app->app_id,
'target' => 'dialog::{width:500,height:250,title:\'' . app::get('desktop')->_($btnPrefix . '导入') . '\'}',
];
}
//增加同步状态结果
if ($_GET['view'] == 9) {
$actions[0]['label'] = '批量操作';
$actions[0]['group'] = array(
array(
'label' => '批量同步冲红申请单结果',
'submit' => "index.php?app=invoice&ctl=admin_order&act=batchSyncRedApplyResult",
'target' => 'dialog::{width:690,height:200,title:\'批量同步冲红申请单结果\'}"'
),
);
}
$actions[] = [
'label' => '发票备注导入',
'href' => $this->url . '&act=execlImportDailog&p[]=memo',
'target' => 'dialog::{width:760,height:400,title:\'发票备注导入\'}',
];
$actions[] = [
'label' => '合并开票',
'submit' => $this->url . '&act=merge_invoice&finder_vid='.$_GET['finder_vid'],
// 'target' => 'dialog::{width:1200,height:400,title:\'合并开票\'}',
];
$params['actions'] = $actions;
$this->finder('invoice_mdl_order', $params);
}
function invoiceImport(){
echo $this->page('admin/invoice_import.html');
}
//执行发票导入操作
function doInvoiceImport()
{
// 读取文件
try {
$importLIb = kernel::single("invoice_import_buyer");
$msg = $importLIb->process();
$msg = implode('
', $msg);
$finder_id = $_GET['finder_id'];
header("content-type:text/html; charset=utf-8");
echo <<
alert("上传成功");
parent.\$E('#import-form .error').set('html',"部分导入失败:
$msg");
if ("$msg") {
parent.\$E('#import-form .error').show();
} else {
parent.\$E('#import-form').getParent('.dialog').retrieve('instance').close();
if (window.finderGroup && window.finderGroup["$finder_id"]) {
window.finderGroup["$finder_id"].refresh();
}else{
parent.location.reload();
}
}
JS;
} catch (Exception $e) {
$this->splash('error', null, '导入失败:' . $e->getMessage());
}
}
//导出发票模板
function exportInvoiceTemplate(){
$row = app::get('invoice')->model('order')->getInvoiceTemplateColumn();
$lib = kernel::single('omecsv_phpexcel');
$lib->newExportExcel(null, "发票导入模板-" . date('Ymd'), 'xlsx', array_keys($row));
}
function waybillImport(){
echo $this->page('admin/waybill_import.html');
}
//执行发票运单号导入操作
function doWaybillImport()
{
try {
$importLIb = kernel::single("invoice_import_waybill");
$msg = $importLIb->process();
$msg = implode('
', $msg);
$finder_id = $_GET['finder_id'];
header("content-type:text/html; charset=utf-8");
echo <<
alert("上传成功");
parent.\$E('#import-form .error').set('html',"部分导入失败:
$msg");
if ("$msg") {
parent.\$E('#import-form .error').show();
} else {
parent.\$E('#import-form').getParent('.dialog').retrieve('instance').close();
if (window.finderGroup && window.finderGroup["$finder_id"]) {
window.finderGroup["$finder_id"].refresh();
}else{
parent.location.reload();
}
}
JS;
} catch (Exception $e) {
$this->splash('error', null, '导入失败:' . $e->getMessage());
}
}
//导出发票运单号模板
function exportWaybillTemplate()
{
$row = app::get('invoice')->model('order')->getWaybillTemplateColumn();
$lib = kernel::single('omecsv_phpexcel');
$lib->newExportExcel(null, "发票运单号导入模板-" . date('Ymd'), 'xlsx', array_keys($row));
}
function batchBill()
{
if (!$_POST['id']) {
die('暂不支持全选');
}
$this->pagedata['GroupList'] = json_encode($_POST['id']);
$this->pagedata['request_url'] = 'index.php?app=invoice&ctl=admin_order&act=doBatchBill';
parent::dialog_batch();
}
function doBatchBill()
{
$primary_id = explode(',', $_POST['primary_id']);
if (!$primary_id) { echo 'Error: 请先选择发票';exit;}
$retArr = array(
'itotal' => count($primary_id),
'isucc' => 0,
'ifail' => 0,
'err_msg' => array(),
);
$order_id_map = array();
$list = $this->app->model('order')->getList('id,order_id', array('id'=>$primary_id));
foreach($list as $v){
$order_id_map[$v['id']] = $v['order_id'];
}
//一单一单处理
foreach ($primary_id as $id)
{
$param = array('id'=>$id, 'order_id'=>$order_id_map[$id]);
$rs = kernel::single('invoice_process')->billing($param,'man',$error_msg);
if($rs){
$retArr['isucc']++;
}else{
$retArr['ifail']++;
$retArr['err_msg'][] = $error_msg;
}
}
echo json_encode($retArr),'ok.';
exit;
}
function batchCancel($id = '')
{
if ($id) $_POST['id'][] = $id;
if (!$_POST['id']) {
die('暂不支持全选');
}
$this->pagedata['GroupList'] = json_encode($_POST['id']);
$this->pagedata['request_url'] = 'index.php?app=invoice&ctl=admin_order&act=doBatchCancel';
$this->pagedata['custom_html'] = $this->fetch('admin/red_reason.html');
parent::dialog_batch();
}
function doBatchCancel()
{
$primary_id = explode(',', $_POST['primary_id']);
if (!$primary_id) { echo 'Error: 请先选择发票';exit;}
$retArr = array(
'itotal' => count($primary_id),
'isucc' => 0,
'ifail' => 0,
'err_msg' => array(),
);
//一单一单处理
foreach ($primary_id as $id) {
$param = array('id'=>$id,'invoice_action_type'=>$_POST['invoice_action_type']);
$rs = kernel::single('invoice_process')->cancel($param,"invoice_list");
if($rs){
$retArr['isucc']++;
}else{
$retArr['ifail']++;
$retArr['err_msg'][] = '作废发票失败';
}
}
echo json_encode($retArr),'ok.';exit;
}
/**
* 分类导航
*/
function _views()
{
$mdl_order = $this->app->model('order');
$base_filter = array();
$sub_menu = array(
0=>array('label'=>__('全部'),'filter'=>$base_filter),
1=>array('label'=>__('待开电票'),'filter'=>array('mode'=>'1','is_make_invoice'=>'1','is_status'=>'0'),'optional'=>false),
2=>array('label'=>__('已开电票'),'filter'=>array('mode'=>'1','is_status'=>'1'),'optional'=>false),
3=>array('label'=>__('待开专票'),'filter'=>array('type_id'=>'1','is_make_invoice'=>'1','mode'=>'0','is_status|noequal'=>'2'),'optional'=>false),
4=>array('label'=>__('已开专票'),'filter'=>array('type_id'=>'1','is_status'=>'1','mode'=>'0'),'optional'=>false),
5=>array('label'=>__('同步中'),'filter'=>array('sync'=>array('1','4','7','9')),'optional'=>false),
7=>array('label'=>__('待冲专票'),'filter'=>array('is_make_invoice'=>array('2')),'optional'=>false),
8=>array('label'=>__('金3冲红'),'filter'=>array('sync'=>'10'),'optional'=>false),
9=>array('label'=>__('冲红申请单确认中'),'filter'=> array('sync' => '7'),'optional'=>false),
10 => array ('label' => __('开蓝冲红失败'), 'filter' => array('sync' => ['5','2','8'],'is_status' => ['0','1']), 'optional' => false),
);
foreach($sub_menu as $k => $v)
{
$sub_menu[$k]['filter'] = $v['filter']?$v['filter']:null;
$sub_menu[$k]['addon'] = $mdl_order->viewcount($v['filter']);
$sub_menu[$k]['href'] = 'index.php?app=invoice&ctl='.$_GET['ctl'].'&act=index&view='.$k;
}
// 金3冲红固定显示
$sub_menu[8]['addon'] = 'showtab';
return $sub_menu;
}
//作废
function doCancel()
{
$url = 'javascript:finderGroup["'.$_GET['finder_id'].'"].refresh();';
$id = $_GET["id"];
if(!$id){
$this->splash('error',$url,'操作出错,不存在此条发票记录,请重新操作。');
}
$arr_cancel = array("id" => $id);
$result = kernel::single('invoice_process')->cancel($arr_cancel,"invoice_list");
if($result){
if(intval($result["mode"]) == 1){
//这里提示打开电子发票接口是否缺少必要参数
if(!empty($result["arr_hint"])){
$this->splash('error',$url,"电子发票冲红失败:".implode(",", $result["arr_hint"])."。");
}else{
$hint = "电子发票冲红操作已执行。";
}
}else{
$hint = "作废纸质发票成功。";//纸质发票
}
$this->splash('success',$url,$hint);
}else{
$this->splash('error',$url,'作废发票失败。');
}
}
//执行开票
function doBilling()
{
$url = 'javascript:finderGroup["'.$_GET['finder_id'].'"].refresh();';
$id = $_GET["id"];
if(!$id){
$this->splash('error',$url,'操作出错,不存在此条发票记录,请重新操作。');
}
//execute
$error_msg = '';
$arr_billing = array(
"id" => $id,
);
$result = kernel::single('invoice_process')->billing($arr_billing, 'man', $error_msg);
if(!$result){
$this->splash('error', $url, '开票失败:'. $error_msg);
}
if($result['rsp'] != 'succ'){
$this->splash('error', $url, "电子发票开蓝票失败:". $result['error_msg']);
}
//电子发票
if($result['mode'] == 1){
$hint = "电子发票开蓝票操作已执行。";
}else{
$hint = "纸质发票开票成功。";
}
$this->splash('success',$url,$hint);
}
//编辑页面展示
function edit()
{
$id = intval($_GET["id"]);
if(!$id){
return false;
}
//获取发票信息
$mdlInOrder = app::get('invoice')->model('order');
$rs_invoice_order = $mdlInOrder->dump(array("id"=>$id),"*");
$memo = @unserialize($rs_invoice_order['memo']);
$rs_invoice_order['memo'] = is_array($memo) ? end($memo) : ['op_content'=>''];
$this->pagedata["invoice_order"] = $rs_invoice_order;
//获取明细信息
$invoiceItemMdl = app::get('invoice')->model('order_items');
$invoice_order_items = $invoiceItemMdl->getList('*',array('id'=>$id,'is_delete'=>'false'));
//合并发票的明细处理
if ($rs_invoice_order['invoice_type'] == 'merge') {
$invoice_order_items = kernel::single('invoice_order')->showMergeInvoiceItems($invoice_order_items);
}
$this->pagedata['invoice_order_items'] = $invoice_order_items;
//获取发票内容
$mdlInContent = app::get('invoice')->model('content');
$this->pagedata["invoice_content"] = $mdlInContent->getList();
$this->pagedata["act"] = "doEdit";
$this->pagedata['title'] = "编辑发票";
$this->display('admin/order_editor.html');
}
//编辑提交操作
function doEdit()
{
$this->begin('index.php?app=invoice&ctl=admin_order&act=index');
$id = $_POST["item"]["id"];
if(!$id){
return false;
}
$check_result = kernel::single('invoice_check')->checkEdit($id);
if(!$check_result){
$this->end(false, '编辑失败,此发票记录必须是未开票状态。');
}
list($result,$msg) = kernel::single('invoice_process')->edit($_POST["item"]);
if($result){
$this->end(true, '编辑发票信息成功。');
}else{
$this->end(false, $msg);
}
}
//新建发票信息发票页面展示
function addNewSame()
{
$id = intval($_GET["id"]);
if(!$id){
return false;
}
//获取发票信息
$mdlInOrder = app::get('invoice')->model('order');
$rs_invoice_order = $mdlInOrder->dump(array("id"=>$id),"*");
$memo = @unserialize($rs_invoice_order['memo']);
$memo = $memo ?: [];
$rs_invoice_order['memo'] = end($memo);
$this->pagedata["invoice_order"] = $rs_invoice_order;
//获取明细信息
$invoiceItemMdl = app::get('invoice')->model('order_items');
$invoice_order_items = $invoiceItemMdl->getList('*',array('id'=>$id,'is_delete'=>'false'));
//合并发票的明细处理
if ($rs_invoice_order['invoice_type'] == 'merge') {
$invoice_order_items = kernel::single('invoice_order')->showMergeInvoiceItems($invoice_order_items);
}
$this->pagedata['invoice_order_items'] = $invoice_order_items;
//获取发票内容
$mdlInContent = app::get('invoice')->model('content');
$this->pagedata["invoice_content"] = $mdlInContent->getList();
$this->pagedata["act"] = "doAddNewSame";
$this->pagedata['title'] = "新建相似发票";
$this->display('admin/order_editor.html');
}
//新建发票信息提交操作
function doAddNewSame()
{
$this->begin('index.php?app=invoice&ctl=admin_order&act=index');
$id = $_POST["item"]["id"];
if(!$id){
return false;
}
$data = kernel::single('invoice_order')->formatAddData($_POST["item"]);
list($result,$msg) = kernel::single('invoice_process')->newCreate($data,'add_new_same');
if($result){
$this->end(true, '新建类似发票信息成功。');
}else{
$this->end(false, $msg);
}
}
/**
* 新建改票信息页面展示
* @Author: xueding
* @Vsersion: 2022/10/24 下午6:04
* @return bool
*/
function addChangeTicket()
{
$invoiceOrderLib = kernel::single('invoice_order');
$id = intval($_GET["id"]);
if(!$id){
return false;
}
//获取发票信息
$mdlInOrder = app::get('invoice')->model('order');
$rs_invoice_order = $mdlInOrder->dump(array("id"=>$id),"*");
if ($rs_invoice_order['changesdf']) {
$rs_invoice_order = json_decode($rs_invoice_order['changesdf'],1);
}
$memo = @unserialize($rs_invoice_order['memo']);
$memo = $memo ?: [];
$rs_invoice_order['memo'] = end($memo);
$this->pagedata["invoice_order"] = $rs_invoice_order;
$action = 'doAddChangeTicket';
if ($_GET['type'] && $_GET['type'] == 'checkChangeTicket') {
$action = 'doCheckChangeTicket';
}
$this->pagedata["act"] = $action;
//获取明细信息
$invoiceItemMdl = app::get('invoice')->model('order_items');
$invoice_order_items = $invoiceItemMdl->getList('*',array('id'=>$id,'is_delete'=>'false'));
//合并发票的明细处理
if ($rs_invoice_order['invoice_type'] == 'merge') {
$invoice_order_items = kernel::single('invoice_order')->showMergeInvoiceItems($invoice_order_items);
$invoiceOrderLib->updateMergeInvoiceItems($rs_invoice_order,$invoice_order_items);
}
foreach ($invoice_order_items as $key => $val) {
$item_id = $val['item_id'];
$invoice_order_items[$key]['specification'] = isset($rs_invoice_order['specification'][$item_id]) ? $rs_invoice_order['specification'][$item_id] : $val['specification'];
$invoice_order_items[$key]['unit'] = isset($rs_invoice_order['unit'][$item_id]) ? $rs_invoice_order['unit'][$item_id] : $val['unit'];
}
$this->pagedata['invoice_order_items'] = $invoice_order_items;
//获取发票内容
$mdlInContent = app::get('invoice')->model('content');
$this->pagedata["invoice_content"] = $mdlInContent->getList();
$this->pagedata["title"] = '改票信息';
$this->display('admin/order_editor.html');
}
/**
* 保存改票信息
* @Author: xueding
* @Vsersion: 2022/10/24 下午6:06
* @return bool
*/
function doAddChangeTicket()
{
$this->begin('index.php?app=invoice&ctl=admin_order&act=index');
$id = $_POST["item"]["id"];
if(!$id){
return false;
}
list($result,$msg) = kernel::single('invoice_process')->addChangeTicketData($_POST["item"]);
if($result){
$this->end(true, '新建改票信息成功。');
}else{
$this->end(false, $msg);
}
}
/**
* 暂时不用手动冲红自动执行app/erpapi/lib/invoice/request/invoice.php::415行
* 根据改票信息创建新发票
* @Author: xueding
* @Vsersion: 2022/10/25 下午4:57
* @return bool
*/
function doCheckChangeTicket()
{
$this->begin();
$id = $_POST["item"]["id"];
$order_id = $_POST["item"]["order_id"];
if(!$id || !$order_id){
return false;
}
$invoiceOrderMdl = app::get('invoice')->model('order');
$oldInvoiceOrder = $invoiceOrderMdl->dump(array("id"=>$id));
if (!$oldInvoiceOrder) {
return false;
}
$params = array_merge($oldInvoiceOrder,$_POST['item']);
$params['action_type'] = 'doCheckChangeTicket';
$result = kernel::single('invoice_process')->create($params,"invoice_list_add_same");
if($result){
$this->end(true, '改票确认成功。');
}else{
$this->end(false, '改票确认失败。');
}
}
//预览电子发票
function preview()
{
if(!$_GET["id"] || !$_GET["type"]){
echo '';
return;
}
$mdlInOrder = app::get('invoice')->model('order');
$rs_invoice = $mdlInOrder->dump(array("id"=>$_GET["id"]));
$get_channel_info = app::get('invoice')->model('channel')->get_channel_info($rs_invoice['shop_id']);
#店铺没有电子发票渠道配置,直接false;
if(empty($get_channel_info))return false;
$rs_invoice['channel_id'] = $get_channel_info['channel_id'];
$rs_invoice['channel_extend_data'] = isset($get_channel_info['channel_extend_data'])?$get_channel_info['channel_extend_data']:'';
$einvoice_url = kernel::single('invoice_electronic')->getApiEinvoiceUrl($rs_invoice,$_GET["type"]);
if($einvoice_url){
echo '';
exit;
}else{
echo '';
exit;
}
}
//淘宝系 上传天猫
function doUploadTmall()
{
$step = intval($_GET['step']) ? intval($_GET['step']) : 1; //当前到第几步
$total_step = intval($_GET["total_step"]); //全部步数
$id = $_POST['invoice_id']; //发票记录主键id
//获取invoice order信息
$mdlInOrder = app::get('invoice')->model('order');
$rs_invoice = $mdlInOrder->dump(array("id"=>$id));
$rs_invoice['amount'] = kernel::single('invoice_func')->get_invoice_amount($rs_invoice);
$rs_invoice["einvoice_type"] = "blue"; //prepare接口和回流天猫upload接口都用到
$log_mes_type = "蓝票";
$billing_type = "1";
if(intval($rs_invoice["is_status"]) == 2 && intval($rs_invoice["sync"]) == 6){
$rs_invoice["einvoice_type"] = "red";
$log_mes_type ="红票";
$billing_type = "2";
}
$order_setting = kernel::single('invoice_func')->get_order_setting($rs_invoice['shop_id'],1);
//电子发票没有渠道配置,直接false;
if(empty($order_setting)){
return false;
}
$channel_shop_id = $order_setting[0]['shop_id'];
//获取invoice item明细
$mdlInvoiceElIt = app::get('invoice')->model('order_electronic_items');
$rs_invoice_item = $mdlInvoiceElIt->dump(array("id"=>$rs_invoice["id"],"billing_type"=>$billing_type));
$opObj = app::get('ome')->model('operation_log');
$result = array('status'=>'running');
//更新对应记录明细表字段条件
$mdlInOrderElIt = app::get('invoice')->model('order_electronic_items');
$filter_arr = array("id"=>$id,"billing_type"=>1);
if($rs_invoice["einvoice_type"] == "red"){
$filter_arr["billing_type"] = 2;
}
//第一步 先打prepare接口
if($step == 1){
//判断是否更新天猫状态成功过
if(intval($rs_invoice_item["update_tmall_status"]) == 1){
//未成功更新
$rs_invoice["invoice_action_type"] = intval($_POST["invoice_action_type"]); //prepare接口用到 注意当发票prepare接口已经成功调用后 此值为0 也不会再次调用prepare接口了
$rs_invoice = kernel::single('invoice_electronic')->getEinvoiceSerialNo($rs_invoice,$billing_type);
$einvoice_prepare_rs = kernel::single('invoice_event_trigger_einvoice')->einvoicePrepare($channel_shop_id,$rs_invoice);
if($einvoice_prepare_rs["rsp"] == "succ"){
//更新上传天猫状态字段 状态
$update_arr = array("update_tmall_status"=>2);
$mdlInOrderElIt->update($update_arr,$filter_arr);
$msg_prepare = $log_mes_type.'的天猫状态更新成功。';
}else{
$msg_prepare = $log_mes_type.'的天猫状态更新失败。';
//获取返回的失败msg
if($einvoice_prepare_rs["rsp"] == "fail"){
$err_msg = @json_decode($einvoice_prepare_rs['err_msg'],true);
if($err_msg["error_response"]["sub_msg"]){
$msg_prepare .= "(".$err_msg["error_response"]["sub_msg"].")";
}
}
$prepare_fail = true;
}
//记录电子发票的天猫状态更新操作日志
$opObj->write_log('einvoice_prepare_tmall@invoice', $id, $msg_prepare);
//prepare失败
if($prepare_fail){
$this->splash('error','',$msg_prepare.'请查看日志原因或重试。');
}
}else{
//update_tmall_status字段为2 是已成功更新过了 直接走下一步
}
}
//第二步 获取serial_no 打上传天猫接口
if($step >= $total_step){
//上传天猫必须通过打get接口来获取开票流水号serial_no
$info_return_rs = kernel::single('invoice_event_trigger_einvoice')->getEinvoiceInfo($channel_shop_id,$rs_invoice);
$einvoice_data_arr = json_decode($info_return_rs["data"],true);
$rs_invoice["serial_no"] = $einvoice_data_arr["serial_no"];
//获取开票流水号serial_no成功
if($rs_invoice["serial_no"]){
//上传天猫接口
$einvoice_upload_rs = kernel::single('invoice_event_trigger_einvoice')->uploadTmall($channel_shop_id,$rs_invoice);
if($einvoice_upload_rs["rsp"] == "succ"){
//上传天猫成功 更新发票明细表upload_tmall_status为2
$update_arr = array("upload_tmall_status"=>2);
$mdlInOrderElIt->update($update_arr,$filter_arr);
$msg_upload = $log_mes_type.'上传天猫成功。';
}else{
$msg_upload = $log_mes_type.'上传天猫失败。';
//获取返回的失败msg
if($einvoice_upload_rs["rsp"] == "fail" && $einvoice_upload_rs["err_msg"]){
$msg_upload .= "(".$einvoice_upload_rs["err_msg"].")";
}
$upload_fail = true;
}
}else{
$get_return_serial_no_fail = true;
$msg_upload = $log_mes_type.'上传天猫失败。(获取开票流水号失败)';
}
//记录上传回流天猫操作日志
$opObj->write_log('einvoice_upload_tmall@invoice', $id, $msg_upload);
//上传失败 因为成功通过get接口获取开票流水号
if($get_return_serial_no_fail){
$this->splash('error','','获取开票流水号失败。请查看日志原因或重试。');
}
//上传失败
if($upload_fail){
$this->splash('error','','上传天猫失败。请查看日志原因或重试。');
}
//成功完成
$result['status'] = 'complete';
$result['data']['rate'] = '100';
}else{
//步骤中
$result['data']['rate'] = $step / $total_step * 100;
}
echo json_encode($result);exit;
}
//上传天猫进度弹窗
public function uploadTmallExpire()
{
if($_GET["invoice_action_type"]){
$this->pagedata["invoice_action_type"] = 1; //只有第一次开蓝票此值是1
}
//获取是否是否成功更新过天猫上的发票状态
$mdlInvoiceElIt = app::get('invoice')->model('order_electronic_items');
$rs_invoice_item = $mdlInvoiceElIt->dump(array("id"=>$_GET["id"],"billing_type"=>$_GET["billing_type"]));
$this->pagedata['update_tmall_status'] = $rs_invoice_item["update_tmall_status"]; //非第一次开蓝票 判断如果update_tmall_status为1显示作废原因等选项
$this->pagedata['invoice_id'] = $_GET["id"];
$this->pagedata['total_step'] = 2; //二步 1.prepare接口 2.get接口获取开票流水号serial_no并上传天猫接口
$this->display('admin/upload_tmall_expire.html');
}
/**
* 批量同步开票结果
*/
public function batchSyncEResult()
{
$this->pagedata['request_url'] = 'index.php?app=invoice&ctl=admin_order&act=ajaxSyncEResult';
$_POST['mode'] = '1';
$id = array();
$invOrderMdl = app::get('invoice')->model('order');
if($_POST['isSelectedAll'] == '_ALL_') {
$invOrderMdl->filter_use_like = true;
}
foreach ($invOrderMdl->getList('id',$_POST) as $value) {
$id[] = $value['id'];
}
$this->pagedata['GroupList'] = json_encode($id);
$this->pagedata['maxNum'] = 5;
parent::dialog_batch();
}
public function ajaxSyncEResult()
{
$primaryIds = explode(',', $_POST['primary_id']);
$retArr = array(
'itotal' => count($primaryIds),
'isucc' => 0,
'ifail' => 0,
'err_msg' => array(),
);
$invEleItemMdl = app::get('invoice')->model('order_electronic_items');
foreach($invEleItemMdl->getList('item_id,invoice_status',array('id'=>$primaryIds)) as $value) {
if ($value['invoice_status'] == '0') {
continue;
}
list($result,$errmsg) = kernel::single('invoice_event_trigger_einvoice')->getEinvoiceCreateResult($value['item_id']);
if($result == 'succ') {
$retArr['isucc']++;
if ($errmsg) {
$retArr['err_msg'][] = $errmsg;
}
} else {
$retArr['ifail']++;
$retArr['err_msg'][] = $value['order_bn'].'同步失败:'.$errmsg;
}
}
echo json_encode($retArr),'ok.';exit;
}
/**
* 重新生成
*/
public function regenResult($item_id)
{
$this->begin('javascript:finderGroup["'.$_GET['finder_id'].'"].refresh();');
$itemMdl = app::get('invoice')->model('order_electronic_items');
$item = $itemMdl->db_dump($item_id);
if ($item['url']) {
$affect_row = $itemMdl->update(array('url'=>''),array('item_id'=>$item_id));
if ($affect_row !== 1) $this->end(false,'更新URL异常');
}
$invMdl = app::get('invoice')->model('order');
$invoice = $invMdl->db_dump($item['id']);
if (!in_array($invoice['sync'], array('6','3'))) {
$this->end(false,'开票未完成,不能操作');
}
$sync = $invoice['sync'] == '6' ? '4' : '1';
$affect_row = $invMdl->update(array('sync'=>$sync),array('id'=>$invoice['id']));
if ($affect_row !== 1) $this->end(false,'更新数据异常');
list($result,$errmsg) = kernel::single('invoice_event_trigger_einvoice')->getEinvoiceCreateResult($item_id,false);
$this->end($result == 'succ'?true:false,$errmsg);
}
/**
* 批量上传电子发票
**/
public function batchUpload()
{
$this->pagedata['request_url'] = 'index.php?app=invoice&ctl=admin_order&act=ajaxUpload';
$eOrderMdl = app::get('invoice')->model('order');
$eOrderMdl->filter_use_like = true;
$filter = $_POST;
$filter['sync'] = array(3,6);
//$filter['mode'] = 1;
if($_GET['oper']!='batch'){
//$filter['mode'] = 1;
}
if ($_GET['id']) $filter['id'] = $_GET['id'];
$id = array();
foreach($eOrderMdl->getList('id',$filter) as $val){
$id[] = $val['id'];
}
$this->pagedata['GroupList'] = json_encode($id);
parent::dialog_batch();
}
/**
* 开票上传
**/
public function ajaxUpload()
{
$primary_id = explode(',', $_POST['primary_id']);
if (!$primary_id) { echo 'Error: 请先选择开票订单';exit;}
$retArr = array(
'itotal' => 0,
'isucc' => 0,
'ifail' => 0,
'err_msg' => array(),
);
$eItemMdl = app::get('invoice')->model('order_electronic_items');
foreach ($eItemMdl->getList('item_id,invoice_no,billing_type',array('id' => $primary_id),0,-1,'create_time asc') as $value) {
$result = kernel::single('invoice_event_trigger_einvoice')->upload($value['item_id'],true);
if ($result['rsp'] == 'succ') {
$retArr['isucc']++;
} else {
$retArr['ifail']++;
$msg = $result['err_msg'] ? $result['err_msg'] : $result['msg'];
$retArr['err_msg'][] = sprintf('发票号[%s]上传%s失败:%s',$value['invoice_no'],$value['billing_type']==1?'蓝票':'红票',$msg);
}
$retArr['itotal']++;
}
echo json_encode($retArr),'ok.';
exit;
}
public function showSensitiveData($id,$type='order')
{
$invoice = array();
if ($id) {
$invoice = app::get('invoice')->model('order')->db_dump($id, 'shop_id,shop_type,order_bn,ship_addr,ship_tel,ship_bank_no,ship_bank,ship_tax');
// 处理加密
$invoice['encrypt_body'] = kernel::single('ome_security_router',$invoice['shop_type'])->get_encrypt_body($invoice, $type);
}
$this->splash('success',null,null,'redirect',$invoice);
}
/**
* 专票信息导出
* @authors 胡渊
* @date 2022-10-25 16:25:58
*/
public function exportVatInvoice()
{
$params = [
'use_buildin_new_dialog' => false,
'use_buildin_set_tag' => false,
'use_buildin_recycle' => false,
'use_buildin_import' => false,
'use_buildin_filter' => true,
];
$_POST['_io_type'] = 'xls';
$params['use_buildin_export'] = true;
$this->finder('invoice_mdl_order_vatInvoiceExport', $params);
}
public function exportVatTemplate()
{
$btnPrefix = $_GET['view'] == 8 ? '金3冲红' : '专票开票';
$invoiceVatMdl = app::get('invoice')->model('order_vatInvoiceExport');
$row = $invoiceVatMdl->exportTemplate();
$lib = kernel::single('omecsv_phpexcel');
$lib->newExportExcel(null, $btnPrefix.'导入模板', 'xls', $row);
}
/**
* 保存回寄物流
*
* @return void
* @author
**/
public function saveReturnLogi()
{
$this->begin();
if (!$_POST['id']) {
$this->end(false, '请选择开票订单');
}
if (!$_POST['return_logi_no'] && !$_POST['return_logi_name']) {
$this->end(false, '回寄物流不能为空');
}
$rs = app::get('invoice')->model('order')->update([
'return_logi_name' => $_POST['return_logi_name'],
'return_logi_no' => $_POST['return_logi_no'],
], ['id' => $_POST['id']]);
$this->end($rs);
}
/**
* 查看快照
*/
public function show_history($log_id)
{
$logObj = app::get('ome')->model('operation_log');
//日志
$goodslog = $logObj->dump($log_id, 'memo');
$content = unserialize($goodslog['memo']);
$invoice = $content['invoice'];
$memo = @unserialize($invoice['memo']);
$invoice['memo'] = $memo;
$this->pagedata['invoice_order'] = $invoice;
$this->pagedata['invoice_order_items'] = $content['invoice_order_items'];
$this->pagedata['ome_orders'] = $content['order'];
$this->pagedata['act'] = 'history';
$this->singlepage('admin/order_editor.html');
}
/**
* 预览发票pdf文件
* @Author: xueding
* @Vsersion: 2023/5/15 下午6:00
* @param $id
*/
public function show_preview_pdf($id)
{
$fileLib = kernel::single('base_storager', 'invoice');
$file_path = $fileLib->getFile($id, null);
header('Content-type: application/pdf');
header('filename=' . $file_path);
$file_path ? readfile($file_path) : '';
}
//合并发票页面展示
function merge_invoice()
{
$id = $_POST["id"];
if(!$id){
die('缺少合并数据');
}
if (count($id) <= 1) {
die('合并发票数据不能少于一条');
}
//获取发票信息
$mdlInOrder = app::get('invoice')->model('order');
$rs_invoice_order = $mdlInOrder->getList('*',array("id"=>$id));
$invoiceAmount = $freightAmount = $taxAmount = 0;
$orderBns = [];
if (count(array_unique(array_column($rs_invoice_order,'mode'))) > 1) {
die('发票类型不一致暂不支持合并');
}
foreach ($rs_invoice_order as $key => $val) {
if ($val['is_status'] == '2') {
die('已作废发票不能进行合并开票操作');
}
$invoiceAmount += $val['amount'];
$freightAmount += $val['cost_freight'];
$taxAmount += $val['cost_tax'];
if (strpos($val['order_bn'], ',')) {
$orderBns = array_merge($orderBns, explode(',',$val['order_bn']));
} else {
$orderBns[] = $val['order_bn'];
}
}
$showInvoiceInfo = current($rs_invoice_order);
$showInvoiceInfo['amount'] = $invoiceAmount;
$showInvoiceInfo['cost_freight'] = $freightAmount;
$showInvoiceInfo['cost_tax'] = $taxAmount;
$showInvoiceInfo['order_bn'] = implode(',',array_unique($orderBns));
$showInvoiceInfo['is_make_invoice'] = '0';
$showInvoiceInfo['invoice_type'] = 'merge';
$memo = @unserialize($showInvoiceInfo['memo']);
$memo = $memo ?: [];
$showInvoiceInfo['memo'] = end($memo);
//获取明细信息
$invoiceItemMdl = app::get('invoice')->model('order_items');
$invoice_order_items = $invoiceItemMdl->getList('*',array('id'=>$id,'is_delete'=>'false'));
$itemData = [];
foreach ($invoice_order_items as $key => $val) {
if (!$itemData[$val['bn']]) {
$itemData[$val['bn']] = $val;
}else{
$itemData[$val['bn']]['amount'] += $val['amount'];
$itemData[$val['bn']]['quantity'] += $val['quantity'];
}
}
$showInvoiceInfo['id'] = implode(',',$id);
$this->pagedata["invoice_order_list"] = $rs_invoice_order;
$this->pagedata["invoice_order"] = $showInvoiceInfo;
$this->pagedata['invoice_order_items'] = $itemData;
//获取发票内容
$mdlInContent = app::get('invoice')->model('content');
$this->pagedata["invoice_content"] = $mdlInContent->getList();
$this->pagedata["act"] = 'doMergeInvoice';
$this->display('admin/order_merge_invoice.html');
}
/**
* 合并发票处理
* @Author: xueding
* @Vsersion: 2023/6/2 下午5:04
* @return bool
*/
function doMergeInvoice()
{
$this->begin('index.php?app=invoice&ctl=admin_order&act=index');
$id = $_POST["item"]["id"];
if(!$id){
return false;
}
list($check_result,$msg) = kernel::single('invoice_check')->checkMergeInvoice($id);
if(!$check_result){
$this->end(false, $msg);
}
list($result,$msg) = kernel::single('invoice_process')->addMergeInvoice($_POST);
if($result){
$this->end(true, '创建合并发票信息成功。');
}else{
$this->end(false, $msg);
}
}
/**
* 批量同步开票结果
*/
public function batchSyncRedApplyResult()
{
$this->pagedata['request_url'] = 'index.php?app=invoice&ctl=admin_order&act=ajaxSyncRedApplyResult';
$_POST['mode'] = '1';
$_POST['sync'] = '7';
$id = array();
$invOrderMdl = app::get('invoice')->model('order');
if ($_POST['isSelectedAll'] == '_ALL_') {
$invOrderMdl->filter_use_like = true;
}
foreach ($invOrderMdl->getList('id', $_POST) as $value) {
$id[] = $value['id'];
}
$this->pagedata['GroupList'] = json_encode($id);
$this->pagedata['maxNum'] = 5;
parent::dialog_batch();
}
public function ajaxSyncRedApplyResult()
{
$primaryIds = explode(',', $_POST['primary_id']);
$retArr = array(
'itotal' => count($primaryIds),
'isucc' => 0,
'ifail' => 0,
'err_msg' => array(),
);
foreach ($primaryIds as $primaryId){
$result = kernel::single('invoice_event_trigger_redapply')->sync($primaryId);
if($result['rsp'] == 'succ'){
$retArr['isucc']++;
}else{
$retArr['ifail']++;
$retArr['err_msg'][] = "id:" . $primaryId . '同步失败:' . $result['msg'];
}
}
echo json_encode($retArr), 'ok.';
exit;
}
/**
* 金三红冲导出
*/
public function exportGolden3Cancel()
{
$params = [
'use_buildin_new_dialog' => false,
'use_buildin_set_tag' => false,
'use_buildin_recycle' => false,
'use_buildin_import' => false,
'use_buildin_filter' => true,
];
$_POST['_io_type'] = 'xls';
$params['use_buildin_export'] = true;
$this->finder('invoice_mdl_order_golden3CancelExport', $params);
}
}