mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-22 18:35:35 +08:00
496 lines
18 KiB
PHP
496 lines
18 KiB
PHP
<?php
|
|
/**
|
|
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
class finance_ctl_settlement extends desktop_controller{
|
|
var $flag = 'index';
|
|
var $name = "实收实退单";
|
|
|
|
public function index(){
|
|
$this->title = '实收实退单';
|
|
$this->flag = 'index';
|
|
|
|
$is_export = kernel::single('desktop_user')->has_permission('finance_export');#增加销售应收单导出权限
|
|
|
|
$base_filter = array();
|
|
$this->base_filter = $base_filter;
|
|
|
|
$actions = array();
|
|
switch ($_GET['view']) {
|
|
case 1:
|
|
$actions['zq'] = array (
|
|
'label' => '匹配账期',
|
|
'submit' => $this->url.'&act=matchReport&view='.$_GET['view'],
|
|
'target' => 'dialog::{width:600,height:300,title:\'匹配账期\'}'
|
|
);
|
|
/**$actions['hx'] = array(
|
|
'label' => '再次核销',
|
|
'submit' => $this->url . '&act=verifyAgain',
|
|
'target' => "dialog::{width:500,height:200,title:'再次核销'}",
|
|
);**/
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
$params = array(
|
|
'title'=>$this->title ,
|
|
'use_buildin_export'=>$is_export,
|
|
'use_buildin_recycle'=>false,
|
|
'use_view_tab'=>true,
|
|
'actions' => $actions,
|
|
'use_buildin_selectrow'=>true,
|
|
'use_buildin_filter'=>true,
|
|
'finder_aliasname'=>'ar_unsale',
|
|
'finder_cols'=>'bill_bn,status,channel_name,fee_obj,member,trade_time,order_bn,fee_type,fee_item,money,bill_type',
|
|
'base_filter' => $base_filter,
|
|
'orderBy'=> 'bill_id desc',
|
|
);
|
|
$this->finder('finance_mdl_bill',$params);
|
|
}
|
|
|
|
public function _views(){
|
|
|
|
$method_name = '_views_'.$this->flag;
|
|
if(method_exists($this, $method_name))
|
|
{
|
|
return $this->$method_name();
|
|
}else{
|
|
return array();
|
|
}
|
|
|
|
}
|
|
|
|
public function _views_index(){
|
|
$arObj = $this->app->model('bill');
|
|
$sub_menu = array(
|
|
0 => array('label'=>app::get('base')->_('全部'),'filter'=>array(),'addon'=>'showtab','optional'=>false),
|
|
1 => array('label'=>app::get('base')->_('未匹配账期'),'filter'=>array('monthly_item_id'=>0),'addon'=>'showtab','optional'=>false),
|
|
);
|
|
return $sub_menu;
|
|
}
|
|
|
|
|
|
// 导出设置页
|
|
// public function export($view){
|
|
// $oFunc = kernel::single('financebase_func');
|
|
// $this->pagedata['platform_list'] = $oFunc->getShopPlatform();
|
|
|
|
// $this->pagedata['view'] = $view;
|
|
|
|
// $this->pagedata['time_from'] = date('Y-m-01', strtotime(date("Y-m-d")));
|
|
// $this->pagedata['time_to'] = date('Y-m-d', strtotime("$_POST[time_from] +1 month -1 day"));
|
|
|
|
// $this->pagedata['finder_id'] = $_GET['finder_id'];
|
|
// $this->display('settlement/export.html');
|
|
// }
|
|
|
|
public function doBillExport($platform_type,$time_from,$time_to,$view=0){
|
|
$oFunc = kernel::single('financebase_func');
|
|
$platform_list = $oFunc->getShopPlatform();
|
|
|
|
$filter = array('trade_time|between'=>array(strtotime($time_from),strtotime($time_to)),'fee_obj'=>$platform_list[$platform_type]);
|
|
|
|
$sub_menu = $this->_views_index();
|
|
|
|
$filter = array_merge($filter,$sub_menu[$view]['filter']);
|
|
|
|
$file_name = sprintf("%s平台%s实收实退单[%s]",$platform_list[$platform_type],$sub_menu[$view]['label'],date('Y-m-d'));
|
|
|
|
$this->doExport($filter,$file_name,$platform_type);
|
|
|
|
}
|
|
|
|
// 导出未匹配订单号
|
|
public function exportUnMatch(){
|
|
|
|
$oFunc = kernel::single('financebase_func');
|
|
|
|
$this->pagedata['platform_list'] = $oFunc->getShopPlatform();
|
|
|
|
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
|
$this->display('settlement/export_unmatch.html');
|
|
}
|
|
|
|
public function doUnMatchExport($platform_type = 'alipay'){
|
|
|
|
$oFunc = kernel::single('financebase_func');
|
|
$platform_list = $oFunc->getShopPlatform();
|
|
|
|
$filter = array('order_bn'=>'','fee_obj'=>$platform_list[$platform_type]);
|
|
|
|
$file_name = sprintf("%s平台未匹配订单号[%s]",$platform_list[$platform_type],date('Y-m-d'));
|
|
|
|
$this->doExport($filter,$file_name,$platform_type);
|
|
|
|
}
|
|
|
|
/*public function doExport($filter,$file_name,$platform_type = 'alipay'){
|
|
|
|
set_time_limit(0);
|
|
|
|
$oFunc = kernel::single('financebase_func');
|
|
$mdlBill = app::get('finance')->model('bill');
|
|
|
|
$page_size = $oFunc->getConfig('page_size');
|
|
|
|
$class_name = sprintf("financebase_data_bill_%s",$platform_type);
|
|
|
|
|
|
$shop_list = financebase_func::getShopList();
|
|
|
|
$shop_list = array_column($shop_list,null,'shop_id');
|
|
|
|
|
|
|
|
if (ome_func::class_exists($class_name) && $instance = kernel::single($class_name)){
|
|
|
|
$csv_title = $instance->getTitle();
|
|
$csv_title['shop_id'] = '所属店铺';
|
|
$csv_title['bill_bn'] = '单据编号';
|
|
$csv_title['order_bn'] = '订单号';
|
|
|
|
header('Content-Type: application/vnd.ms-excel;charset=utf-8');
|
|
header("Content-Disposition:filename=" . $file_name . ".csv");
|
|
|
|
$fp = fopen('php://output', 'a');
|
|
$csv_title_value = array_values($csv_title);
|
|
foreach ($csv_title_value as &$v) $v = $oFunc->strIconv($v,'utf-8','gbk');
|
|
fputcsv($fp, $csv_title_value);
|
|
|
|
$id = 0;
|
|
while (true) {
|
|
|
|
$data = $mdlBill->getExportData($filter,$page_size,$id);
|
|
|
|
if($data){
|
|
foreach ($data as &$v) {
|
|
$tmp = array();
|
|
$v['shop_id'] = isset($shop_list[$v['shop_id']]) ? $shop_list[$v['shop_id']]['name'] : '';
|
|
foreach ($csv_title as $title_key => $title_val) {
|
|
$tmp[] = isset($v[$title_key]) ? $oFunc->strIconv($v[$title_key],'utf-8','gbk')."\t" : '';
|
|
}
|
|
fputcsv($fp, $tmp);
|
|
}
|
|
}else{
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
}*/
|
|
|
|
|
|
|
|
// 导入未匹配订单号
|
|
public function importUnMatch(){
|
|
|
|
$oFunc = kernel::single('financebase_func');
|
|
|
|
$this->pagedata['platform_list'] = $oFunc->getShopPlatform();
|
|
|
|
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
|
$this->display('settlement/import_unmatch.html');
|
|
}
|
|
|
|
public function doUnMatchImport()
|
|
{
|
|
@ini_set('memory_limit', '512M');
|
|
$this->begin('index.php?app=finance&ctl=settlement&act=index&view=3');
|
|
|
|
$platform_type = $_POST['platform_type'] ? $_POST['platform_type'] : 'alipay';
|
|
|
|
if( $_FILES['import_file']['name'] && $_FILES['import_file']['error'] == 0 ){
|
|
$file_type = substr($_FILES['import_file']['name'],strrpos($_FILES['import_file']['name'],'.')+1);
|
|
if(in_array($file_type, array('csv','xls','xlsx'))){
|
|
|
|
$ioType = kernel::single('financebase_io_'.$file_type);
|
|
$oProcess = kernel::single('financebase_data_bill_'.$platform_type);
|
|
$oFunc = kernel::single('financebase_func');
|
|
/*if(!$oProcess->checkFile($_FILES['import_file']['tmp_name'],$file_type)){
|
|
$this->end(false, app::get('base')->_('上传文件数据不对'));
|
|
}
|
|
|
|
//临时文件生成后往ftp服务器迁移
|
|
$storageLib = kernel::single('taskmgr_interface_storage');
|
|
$move_res = $storageLib->save($_FILES['import_file']['tmp_name'], md5($_FILES['import_file']['name'].time()).'.'.$file_type, $remote_url);
|
|
|
|
if(!$move_res)
|
|
{
|
|
$this->end(false, app::get('base')->_('文件上传失败'));
|
|
}else{
|
|
$worker = "financebase_data_task.doAssign";
|
|
$params = array();
|
|
$params['shop_id'] = $_POST['shop_id'];
|
|
$params['shop_type'] = $type;
|
|
$params['task_name'] = $_FILES['import_file']['name'];
|
|
$params['file_type'] = $file_type;
|
|
$params['file_name'] = $remote_url;
|
|
$oFunc->addTask('分派对账单导入',$worker,$params);
|
|
|
|
$this->end(true, app::get('base')->_('上传成功 已加入队列 系统会自动跑完队列'));
|
|
}*/
|
|
|
|
|
|
$page_size = $oFunc->getConfig('page_size');
|
|
|
|
$file_name = $_FILES['import_file']['tmp_name'];
|
|
$file_info = $ioType->getInfo($file_name);
|
|
$total_nums = $file_info['row'];
|
|
$page_nums = ceil($total_nums / $page_size);
|
|
|
|
for ($i=1; $i <= $page_nums ; $i++) {
|
|
$offset = ($i - 1) * $page_size;
|
|
$data = $ioType->getData($file_name,0,$page_size,$offset,true);
|
|
$oProcess->updateOrderBn($data);
|
|
}
|
|
|
|
$this->end(true, app::get('base')->_('更新成功'));
|
|
}else{
|
|
$this->end(false, app::get('base')->_('不支持此文件'));
|
|
}
|
|
|
|
}else{
|
|
$this->end(false, app::get('base')->_('没有导入成功'));
|
|
}
|
|
}
|
|
|
|
|
|
//核销
|
|
public function detailVerification(){
|
|
$billObj = &app::get('finance')->model('bill');
|
|
$bill_id = $_GET['bill_id'];
|
|
$bill_data = kernel::single('finance_bill')->get_bill_by_bill_id($bill_id,'bill_id');
|
|
$ar_data = kernel::single('finance_bill')->get_ar_by_bill_id($bill_id,'order_bn');
|
|
|
|
// financebase_func::dd($ar_data);
|
|
|
|
$this->pagedata['bill_data'] = $bill_data;
|
|
$this->pagedata['ar_data'] = $ar_data;
|
|
$this->pagedata['bill_id'] = $bill_id;
|
|
|
|
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
|
if(isset($_GET['flag']) && $_GET['flag'] == 'replace'){
|
|
$this->pagedata['replace'] = true;
|
|
}else{
|
|
$this->pagedata['replace'] = false;
|
|
}
|
|
// $html = $this->fetch('settlement/verificate_detail.html');
|
|
// echo $html;
|
|
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
|
$this->singlepage('settlement/verificate_detail.html');
|
|
}
|
|
|
|
public function confirmVerification(){
|
|
$data = json_decode($_COOKIE['VERIFICATION_MSG'],1);
|
|
$this->pagedata['info'] = $data;
|
|
$this->page('settlement/verificate_confirm.html');
|
|
}
|
|
|
|
public function checkVerificate(){
|
|
$res = kernel::single('finance_bill')->checkVerificate($_POST);
|
|
$res = json_encode($res);
|
|
setcookie('VERIFICATION_MSG', $res );
|
|
echo $res;
|
|
}
|
|
|
|
|
|
//确认核销
|
|
public function doVerificate(){
|
|
$this->begin('');
|
|
$res = kernel::single('finance_bill')->doManVerificate($_POST);
|
|
// echo json_encode($res);
|
|
$this->end(true, app::get('base')->_('核销成功'));
|
|
}
|
|
|
|
|
|
// 重新设置订单号
|
|
public function resetOrderBn($bill_id)
|
|
{
|
|
$bill_info = app::get('finance')->model("bill")->getList('order_bn,bill_id,credential_number,bill_bn,money',array('bill_id'=>$bill_id,'status'=>0),0,1);
|
|
$this->pagedata['bill_info'] = $bill_info[0];
|
|
$this->singlepage("settlement/reset_orderbn.html");
|
|
}
|
|
|
|
// 保存设置订单号
|
|
public function saveOrderBn()
|
|
{
|
|
$this->begin('index.php?app=finance&ctl=settlement&act=index');
|
|
$oBill = app::get('finance')->model("bill");
|
|
$oBaseBill = app::get('financebase')->model("bill");
|
|
|
|
$bill_id = intval($_POST['bill_id']);
|
|
$order_bn = trim($_POST['order_bn']);
|
|
if(!$bill_id)
|
|
{
|
|
$this->end(false, "ID不存在");
|
|
}
|
|
|
|
$bill_info = app::get('finance')->model("bill")->getList('order_bn,bill_bn,unique_id,channel_id',array('bill_id'=>$bill_id,'status|lthan'=>2),0,1);
|
|
|
|
if(!$bill_info)
|
|
{
|
|
$this->end(false, "流水单不存在");
|
|
}
|
|
|
|
if(!$order_bn)
|
|
{
|
|
$this->end(false, "订单号不存在");
|
|
}
|
|
|
|
$bill_info = $bill_info[0];
|
|
$bill_bn = $bill_info['bill_bn'];
|
|
|
|
if($order_bn == $bill_info['order_bn'])
|
|
{
|
|
$this->end(false, "订单号没有改变");
|
|
}
|
|
|
|
|
|
if($oBill->update(array('order_bn'=>$order_bn),array('bill_id'=>$bill_id,'status'=>0)))
|
|
{
|
|
$oBaseBill->update(array('order_bn'=>$order_bn),array('unique_id'=>$bill_info['unique_id'],'shop_id'=>$bill_info['channel_id']));
|
|
$this->end(true, app::get('base')->_('保存成功'));
|
|
}
|
|
else
|
|
{
|
|
$this->end(false, app::get('base')->_('保存失败'));
|
|
}
|
|
}
|
|
|
|
// 导入强制核销流水单
|
|
public function importVerification()
|
|
{
|
|
|
|
$this->pagedata['finder_id'] = $_GET['finder_id'];
|
|
$this->display('settlement/import_verification.html');
|
|
}
|
|
|
|
public function doVerificationImport()
|
|
{
|
|
$this->begin('index.php?app=finance&ctl=settlement&act=index&view=1');
|
|
|
|
if( $_FILES['import_file']['name'] && $_FILES['import_file']['error'] == 0 ){
|
|
$file_type = substr($_FILES['import_file']['name'],strrpos($_FILES['import_file']['name'],'.')+1);
|
|
if(in_array($file_type, array('csv','xls','xlsx'))){
|
|
|
|
//临时文件生成后往ftp服务器迁移
|
|
$storageLib = kernel::single('taskmgr_interface_storage');
|
|
$move_res = $storageLib->save($_FILES['import_file']['tmp_name'], md5($_FILES['import_file']['name'].time()).'.'.$file_type, $remote_url);
|
|
|
|
if(!$move_res)
|
|
{
|
|
$this->end(false, app::get('base')->_('文件上传失败'));
|
|
}else{
|
|
|
|
$mdlQueue = app::get('financebase')->model('queue');
|
|
$queueData = array();
|
|
$queueData['queue_mode'] = 'forceVerification';
|
|
$queueData['create_time'] = time();
|
|
$queueData['queue_name'] = sprintf("强制核销流水单");
|
|
$queueData['queue_data']['shop_type'] = $type;
|
|
$queueData['queue_data']['task_name'] = basename($_FILES['import_file']['name']);
|
|
$queueData['queue_data']['file_type'] = $file_type;
|
|
$queueData['queue_data']['op_name'] = kernel::single('desktop_user')->get_name();
|
|
$queueData['queue_data']['remote_url']= $remote_url;
|
|
|
|
$queue_id = $mdlQueue->insert($queueData);
|
|
financebase_func::addTaskQueue(array('queue_id'=>$queue_id),'forceverification');
|
|
|
|
$this->end(true, app::get('base')->_('上传成功 已加入队列 系统会自动跑完队列'));
|
|
}
|
|
|
|
}else{
|
|
$this->end(false, app::get('base')->_('不支持此文件'));
|
|
}
|
|
|
|
}else{
|
|
$this->end(false, app::get('base')->_('没有导入成功'));
|
|
}
|
|
}
|
|
|
|
public function matchReport() {
|
|
$filter = array(
|
|
'monthly_item_id' => '0',
|
|
);
|
|
$filter = array_merge($filter, $_POST);
|
|
$list = app::get('finance')->model('bill')->getList('bill_id', $filter);
|
|
$GroupList = array_column($list, 'bill_id');
|
|
$this->pagedata['request_url'] = $this->url.'&act=doMatchReport';
|
|
$this->pagedata['itemCount'] = count($GroupList);
|
|
$this->pagedata['GroupList'] = json_encode($GroupList);
|
|
$this->pagedata['maxNum'] = 100;
|
|
parent::dialog_batch();
|
|
}
|
|
|
|
public function doMatchReport() {
|
|
$itemIds = explode(',',$_POST['primary_id']);
|
|
|
|
if (!$itemIds) { echo 'Error: 缺少单据';exit;}
|
|
|
|
$retArr = array(
|
|
'itotal' => count($itemIds),
|
|
'isucc' => 0,
|
|
'ifail' => 0,
|
|
'err_msg' => array(),
|
|
);
|
|
$monthlyId = [];
|
|
foreach($itemIds as $itemId) {
|
|
list($rs, $rsData) = kernel::single('finance_monthly_report_items')->dealBillMatchReport($itemId);
|
|
|
|
if($rs) {
|
|
$monthlyId[$rsData['monthly_id']] = $rsData['monthly_id'];
|
|
$retArr['isucc'] += 1;
|
|
} else {
|
|
$retArr['ifail'] += 1;
|
|
$retArr['err_msg'][] = $rsData['msg'];
|
|
}
|
|
}
|
|
if($monthlyId) {
|
|
finance_monthly_report::updateMonthlyAmount(['monthly_id'=>$monthlyId]);
|
|
}
|
|
echo json_encode($retArr),'ok.';exit;
|
|
}
|
|
|
|
public function verifyAgain() {
|
|
$model = app::get('finance')->model('bill');
|
|
$pageData = array(
|
|
'billName' => '实收实退单',
|
|
'request_url' => $this->url.'&act=dealVerifyAgain',
|
|
'maxProcessNum' => 100,
|
|
'close' => true
|
|
);
|
|
$this->pagedata['notice'] = '重置状态后,半个小时内系统重新跑!';
|
|
$this->selectToPageRequest($model, $pageData);
|
|
}
|
|
|
|
public function dealVerifyAgain() {
|
|
$bill_id = explode(';', $_POST['ajaxParams']);
|
|
$retArr = array(
|
|
'total' => count($bill_id),
|
|
'succ' => 0,
|
|
'fail' => 0,
|
|
'fail_msg' => array()
|
|
);
|
|
app::get('finance')->model('bill')->update(['is_check'=>0], array('bill_id'=>$bill_id,'status|noequal'=>2,'is_check'=>2));
|
|
$retArr['succ'] = $retArr['total'];
|
|
echo json_encode($retArr);
|
|
}
|
|
} |