Files
OMS/app/logisticsaccounts/lib/actual.php
2025-12-28 23:13:25 +08:00

234 lines
9.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/**
* Copyright © ShopeX http://www.shopex.cn. All rights reserved.
* See LICENSE file for license details.
*/
class logisticsaccounts_actual{
/**
* 自动对账
*/
function auto($data,$task_id){
$estimateObj = app::get('logisticsaccounts')->model('estimate');
$actualObj = app::get('logisticsaccounts')->model('actual');
if($data){
foreach( $data as $k=>$v ){
$actual = $actualObj->dump(array('aid'=>$v),'logi_weight,status,logi_no,delivery_cost_actual,task_id');
$estimate = $estimateObj->dump(array('logi_no'=>$actual['logi_no']),'eid,ship_name,status,delivery_cost_expect,delivery_time,delivery_bn,order_bn,weight');
if($estimate){
$actual_data = array();
$actual_data['aid'] = $v;
$actual_data['delivery_time'] = $estimate['delivery_time'];
$actual_data['weight'] = $estimate['weight'];
$actual_data['delivery_bn'] = $estimate['delivery_bn'];
$actual_data['order_bn'] = $estimate['order_bn'];
$actual_data['ship_name'] = $estimate['ship_name'];
if($actual['status']!='4'){
$actual_data['delivery_cost_expect'] = $estimate['delivery_cost_expect'];
if($estimate['delivery_cost_expect']==$actual['delivery_cost_actual']){
$actual_data['status'] = '1';
}else if($actual['delivery_cost_actual']<$estimate['delivery_cost_expect']){
$actual_data['status'] = '2';
}else if($actual['delivery_cost_actual']>$estimate['delivery_cost_expect']){
$actual_data['status'] = '3';
}
$estimate_data = array();
$estimate_data['eid'] = $estimate['eid'];
$estimate_data['status'] = '1';
$estimate_data['aid'] = $v;
$estimate_data['task_id'] = $actual['task_id'];
$estimate_data['delivery_cost_actual'] = $actual['delivery_cost_actual'];
$estimate_data['logi_weight'] = $actual['logi_weight'];
$estimateObj->save($estimate_data);
}
$result = $actualObj->save( $actual_data );
}
}
//更新所在任务预估预收总费用
$actual_taskObj = app::get('logisticsaccounts')->model('actual_task');
$actual_task_data = array();
$actual_task_data['task_id'] = $task_id;
$actual_task_data['update_money']=1;
$actual_taskObj->update_actual_task($actual_task_data);
}
return true;
}
/**
* @根据状态返回物流费用和包裹数
* @access public($task_id,'',$confirm,$aid)
* @param status 0 未匹配 1 已匹配 2 高预估 3 低预估 4 已记账
* @param confirm 0未记账 1已记账 2 已审核
* @return array
*/
public function get_status_list($task_id,$status,$confirm='',$aid=''){
$sqlstr = '';
if($aid){
$aid = implode(',',$aid);
$sqlstr.=' AND aid in ('.$aid.')';
}
if($status || $status=='0'){
if (is_array($status)) {
$status = '\''.implode('\',\'',$status).'\'';
$sqlstr.=' AND `status` in ('.$status.')';
} else {
$sqlstr.=' AND `status`=\''.$status.'\'';
}
}
if($confirm){
if(is_array($confirm)){
$confirm = '\''.implode('\',\'',$confirm).'\'';
}
$sqlstr.=' AND confirm in ('.$confirm.')';
}
$db = kernel::database();
$sql = 'SELECT count(task_id) as count,sum(delivery_cost_actual) as total_delivery_cost_actual,sum(actual_amount) as total_actual_amount,sum(delivery_cost_expect) as total_delivery_cost_expect FROM sdb_logisticsaccounts_actual WHERE task_id='.$task_id.$sqlstr;
$result = $db->selectrow($sql);
return $result;
}
/**
* @获取当前所有状态总结果
* @access public
* @param void
* @return void
*/
public function get_allstatus($task_id,$confirm='',$aid='',$status=''){
$actual = array();
//全部开始
//汇总及金额
$all = $this->get_status_list($task_id,$status,$confirm,$aid);
$actual['all'] = $all;
//-------全部
//未匹配数及金额
$no_match = $this->get_status_list($task_id,'0',$confirm,$aid);
$actual['no_match'] = $no_match;
//-------未匹配
//已匹配数及金额
$hasmatched = $this->get_status_list($task_id,'1',$confirm,$aid);
$actual['hasmatched'] = $hasmatched;
//-------已匹配
//比预估多数及金额
$overpayment = $this->get_status_list($task_id,'3',$confirm,$aid);
$actual['overpayment'] = $overpayment;
//-------比预估多
//比预估少及金额
$lesspayment = $this->get_status_list($task_id,'2',$confirm,$aid);
$actual['lesspayment'] = $lesspayment;
//-------比预估少
//已记账数及金额
$accounted = $this->get_status_list($task_id,'4',$confirm,$aid);
$actual['accounted'] = $accounted;
//有效账单金额
$actual['effective'] = $hasmatched['count']+$overpayment['count']+$lesspayment['count'];
$actual['effective_money_expect'] = $actual['hasmatched']['total_delivery_cost_expect']+$actual['overpayment']['total_delivery_cost_expect']+$actual['lesspayment']['total_delivery_cost_expect'];
$actual['effective_money_actual'] = $actual['hasmatched']['total_delivery_cost_actual']+$actual['overpayment']['total_delivery_cost_actual']+$actual['lesspayment']['total_delivery_cost_actual'];
$actual['effective_diff_money'] = $actual['effective_money_expect'] - $actual['effective_money_actual'];
return $actual;
}
/**
* @汇总物流账单
* @access public
* @param void
* @return void
*/
public function summary_actual_money($task_id,$aid='',$status='',$confirm=''){
$result = $this->get_status_list($task_id,'','',$aid);
return $result;
}
/**
* @批量记账
* @access public
* @param aid array
* @return void
*/
public function batch_accounted($task_id,$aid,$adjust_money,$accounted_type){
set_time_limit(0);
$acutalObj = app::get('logisticsaccounts')->model('actual');
$estimateObj = app::get('logisticsaccounts')->model('estimate');
//以仓库+物流公司+id作标识
$actual_task = app::get('logisticsaccounts')->model('actual_task')->dump($task_id,'logi_id,branch_id');
$db = kernel::database();
if($aid){
$aids = implode(',',$aid);
$sqlstr.=' AND aid in ('.$aids.')';
}
if ($accounted_type) {
$sqlstr.=' AND `confirm`=\'0\'';
}
$sql = 'SELECT sum(delivery_cost_actual) as total_delivery_cost_actual,count(aid) as count FROM sdb_logisticsaccounts_actual WHERE task_id='.$task_id.$sqlstr.' AND `status` in (\'1\',\'2\',\'3\')';
$actual_sum = $db->selectrow($sql);
if($adjust_money){
if ($actual_sum['count']>0) {
$total_package = $actual_sum['count'];
$total_delivery_cost_actual = $actual_sum['total_delivery_cost_actual'];
$difference = $total_delivery_cost_actual-$adjust_money;
$avg_money = floor($difference/$total_package*100)/100;
$has_money = $avg_money*$total_package;//已经均摊的金额
$sub_money = $difference-$has_money;//剩余金额
}else{
$avg_money = 0;
return false;
}
}else{
$avg_money = 0;
}
$actualsql = 'UPDATE sdb_logisticsaccounts_actual SET actual_amount=delivery_cost_actual-'.$avg_money.',confirm=\'1\',actual_name=\''.kernel::single('desktop_user')->get_name().'\',actual_time='.time().' WHERE task_id='.$task_id.$sqlstr.' AND status in (\'1\',\'2\',\'3\')';
$db->exec($actualsql);
if($avg_money){//随便找一个将余数加过去
$sub_actual = $db->select('SELECT aid FROM sdb_logisticsaccounts_actual WHERE task_id='.$task_id.$sqlstr.' AND status in (\'1\',\'2\',\'3\') LIMIT 1');
$sub_aid = $sub_actual[0]['aid'];
if($sub_money){
if($sub_aid){
$db = kernel::database();
$db->exec('UPDATE sdb_logisticsaccounts_actual SET actual_amount=actual_amount-'.$sub_money.' WHERE aid='.$sub_aid);
}
}
//
app::get('logisticsaccounts')->setConf('logisticsaccounts.accounted.money.'.$actual_task[0]['branch_id'].'_'.$actual_task[0]['logi_id'].'_'.$task_id,$adjust_money);
}
$actual_list = $db->select('SELECT aid,confirm,actual_amount,task_id FROM sdb_logisticsaccounts_actual WHERE task_id='.$task_id.$sqlstr.' AND status in (\'1\',\'2\',\'3\')');
foreach($actual_list as $k=>$v){
$estimateObj->update_estimate_status($v);
}
$actual_taskObj = app::get('logisticsaccounts')->model('actual_task');
$actual_task_data = array();
$actual_task_data['task_id'] = $task_id;
$actual_task_data['update_money']=1;
$actual_taskObj->update_actual_task($actual_task_data);
$acutalObj->check_confirm(1,$task_id);
return true;
}
}
?>