拼团成本计算: +拆分拼,混合拼,订单多产品单拼=整团pvt....

feature/pay
lyt 8 years ago
parent 02d03a9f8d
commit 63148e1f82

@ -24,6 +24,7 @@ class Order_finance extends CI_Controller {
$this->load->helper('array');
$this->load->model('OrderFinance_model');
mb_regex_encoding("UTF-8");
bcscale(4);
}
public function index()
@ -45,11 +46,16 @@ class Order_finance extends CI_Controller {
$group_type_arr = array_unique(array_map(function($ele){return $ele->GCI_groupType;}, $combineNo_arr));
// $this->output->set_content_type('application/json')->set_output(json_encode($combineNo_arr));
// $this->output->set_content_type('application/json')->set_output(json_encode($group_type_arr));
$processed_code = array();
foreach ($combineNo_arr as $kc => $vc) {
if ($vc->GCI_groupType == 1) {
$ret->pvt = $pvt_cost = $this->pvt_basic($vc->GCI_combineNo);
$ret->pvt = $pvt_cost = $this->pvt_basic($vc->GCI_combineNo, $coli_sn, $processed_code);
} else if ($vc->GCI_groupType == 2) {
$ret->combine_cost[] = $this->combine_basic($vc->GCI_combineNo, $coli_sn);
// 这里不排除产品编号是否已处理, 因为重复的情况比较多
$tmp_cost = $this->combine_basic($vc->GCI_combineNo, $coli_sn);
$processed_code = array_merge($processed_code, $tmp_cost->combine_pags);
$ret->combine_cost[] = $tmp_cost;
$tmp_cost = null;
}
}
$this->output->set_content_type('application/json')->set_output(json_encode($ret));
@ -70,54 +76,105 @@ class Order_finance extends CI_Controller {
if (empty($all_orders)) {
return null;
}
$ret->coli_sn = $coli_sn;
// $ret->s = $all_orders;
$all_pags = array_map(function($ele){ return $ele->PAG_Code;}, $all_orders);
$all_pag = array_unique($all_pags);
// $ret->c = $all_pag;
$combine_pag_arr = array();
$pvt_code = $this->forbidden_combine();
if (count($all_pag) > 1) {
// 多个产品, 找出拼团产品号
$rid_code = array();
$value_count = array_count_values($all_pags);
// 先处理拆分拼团的产品, 补全产品号
$allowed_spread = $this->spread_code();
$extra_code_cold = array();
$all_orders_arr = json_decode(json_encode($all_orders), true); // 避免foreach object 改变自身
foreach ($all_orders_arr as $ka => $va) {
$extra_arr = array();
if (isset($allowed_spread[$va['PAG_Code']])) {
foreach ($allowed_spread[$va['PAG_Code']] as $ks => $vs) {
$tmp_extra = new stdClass();
$tmp_extra = (object) $va;
$tmp_extra->real_code = $tmp_extra->PAG_Code;
$tmp_extra->real_pag_sn = $tmp_extra->COLD_ServiceSN;
$tmp_extra->PAG_Code = $vs;
$tmp_extra->COLD_ServiceSN = null;
$extra_arr[] = $tmp_extra;
}
}
$extra_code_cold = array_merge($extra_code_cold, $extra_arr);
}
// 避免覆盖key
foreach ($extra_code_cold as $ke => $ve) {
$all_orders[] = $ve;
}
// 重新计算重复次数
$all_pags = array_map(function($ele){ return $ele->PAG_Code;}, $all_orders);
// 重复的产品号; 可混拼的产品
$repeat_code = array();
$code_count = array_count_values($all_pags);
foreach ($all_pag as $kp => $vp) {
if (in_array($vp, $pvt_code)) {
continue;
}
$tmp = null;
$tmp = $this->get_allowed_combine($vp);
// $ret->b = array_diff($tmp, $all_pag);
if (empty(array_diff($tmp, $all_pag))) {
$combine_pag_arr[] = $tmp;
$this_allowed = ($tmp === null) ? null : array_diff($tmp, $all_pag); // diff((31,41), (31,41,47)) ==> ()
if (empty($this_allowed) && $tmp !== null) {
$combine_pag_arr[] = $tmp; // push (31,41)
}
// $ret->e = $value_count;
if($value_count[$vp] > 1) {
$rid_code[] = $vp;
// 重复的产品即为拼团
if($code_count[$vp] > 1) {
$repeat_code[] = $vp;
}
}
// $ret->d = $rid_code;
if ( ! empty($rid_code)) {
$combine_pag_arr[] = $rid_code;
if ( ! empty($repeat_code)) {
$combine_pag_arr[] = $repeat_code;
}
} else {
// 单个产品
$combine_pag_arr[] = ($all_pag);
}
bcscale(2);
// 预定多产品, 但是只有部分发了计划
// 预定多产品, 拼团只有一个订单, 相当于整团PVT
if (empty($combine_pag_arr)) {
// $combine_pag_arr[] = array_diff($all_pag, $pvt_code); // 此处排除PVT租车产品
$combine_pag_arr[] = $all_pag;
}
// $ret->s = $all_pags;
// $ret->q = $combine_pag_arr;
$ret->combine_pags = my_array_unique($combine_pag_arr);
$ret->combine_pags = $ret->combine_pags[0]; // 这里用0是因为一个拼团应该只有一组或一个产品
// $ret->q = my_array_unique($combine_pag_arr);
$ret->tour_count = $ret->person_num = 0;
$ret->person_num = 0;
$ret->PAG_Code = "";
$ret->order_cost = array();
$pag_sns = array();
$unique_coli = array();
foreach ($all_orders as $ko => $vo) {
if (in_array($vo->PAG_Code, $ret->combine_pags)) {
// $ret->tour_count++;
$ret->person_num += $vo->COLD_PersonNum + $vo->COLD_ChildNum;
$pag_sns[] = $vo->COLD_ServiceSN;
// 整团单拼时, 避免重复计算人数
// 订单人数不重复计
if ( ! in_array($vo->PAG_Code, $pvt_code) && ! in_array($vo->COLI_SN, $unique_coli)) {
$unique_coli[] = $vo->COLI_SN;
$ret->person_num += $vo->COLD_PersonNum + $vo->COLD_ChildNum;
}
$ret->startdate = $vo->COLD_StartDate;
$tour_s = new stdClass();
if ($vo->COLI_SN == $coli_sn) {
$tour_s->person_num = $vo->COLD_PersonNum + $vo->COLD_ChildNum;
$tour_s->PAG_code = $vo->PAG_Code;
$tour_s->real_code = isset($vo->real_code) ? $vo->real_code : $vo->PAG_Code;
$tour_s->real_pag_sn = isset($vo->real_pag_sn) ? $vo->real_pag_sn : $vo->COLD_ServiceSN;
$ret->order_cost[] = $tour_s;
$ret->coli_id = $vo->coli_ID;
}
}
}
$this_order_real_pag_sns = array_map(function($ele) {return $ele->real_pag_sn;}, $ret->order_cost);
$pags_info = $this->OrderFinance_model->get_pag_info(implode(',', array_unique(array_filter($this_order_real_pag_sns)))); // $pag_sns
$ret->vendor_name = implode(",", array_values(array_unique(array_map(function($ele) {return $ele->VEI2_CompanyBN;}, $pags_info)))) ; // 50
$ret->pag_name = implode(";\r\n", array_map(function($ele) {return $ele->PAG_Title;}, $pags_info)) ; // TODO 限制200 用mb_substr('UTF-8')
$ret->PAG_Code = implode(",", $ret->combine_pags);
$ret->comment = "拼团" . $combineNo . ", 按" . $ret->person_num . "人等";
$combine_cost = $this->OrderFinance_model->get_combine_sumMoney($combineNo);
@ -136,36 +193,34 @@ class Order_finance extends CI_Controller {
* @example 180515061M
* @date 2018-07-18
*/
public function pvt_basic($combineNo="", $coli_sn=0)
public function pvt_basic($combineNo="", $coli_sn=0, $processed_code=array())
{
$ret = new stdClass();
$ret->tour = array();
$all_orders = $this->OrderFinance_model->get_all_combine_order($combineNo);
// $ret->tour = array();
$all_orders = $this->OrderFinance_model->get_all_combine_order($combineNo, $processed_code);
if (empty($all_orders)) {
return null;
}
$ret->coli_sn = $coli_sn;
$ret->coli_id = $all_orders[0]->coli_ID;
// 预定的产品数
$ret->tour_count = count(array_unique(array_map(function($ele) {return $ele->PAG_Code;}, $all_orders)));
$ret->person_num = $this->OrderFinance_model->get_order_person_num($coli_sn);
bcscale(2);
$tour_s = new stdClass();
// $tour_s = new stdClass();
$combine_cost = $this->OrderFinance_model->get_combine_sumMoney($combineNo);
$tour_s->startdate = $all_orders[0]->COLD_StartDate;
// $tour_s->person_grade = ($all_orders[0]->COLD_PersonNum + $all_orders[0]->COLD_ChildNum );
$tour_s->cost_category = $combine_cost->cost_category;
$tour_s->cost_sum = $combine_cost->cost_sum;
$tour_s->person_cost = bcdiv($tour_s->cost_sum, $ret->person_num);
$tour_s->comment = "PVT,共" . $ret->person_num . "人";// 150
$ret->startdate = $all_orders[0]->COLD_StartDate;
$ret->person_grade = ($all_orders[0]->COLD_PersonNum + $all_orders[0]->COLD_ChildNum );
$ret->cost_category = $combine_cost->cost_category;
$ret->cost_sum = $combine_cost->cost_sum;
$ret->person_cost = bcdiv($ret->cost_sum, $ret->person_num);
$ret->comment = "PVT,共" . $ret->person_num . "人";// 150
$pag_sns = array_values(array_unique(array_map(function($ele) {return $ele->COLD_ServiceSN;}, $all_orders)));
$pags_info = $this->OrderFinance_model->get_pag_info(implode(',', $pag_sns));
$tour_s->PAG_Code = implode(",", array_values(array_unique(array_map(function($ele) {return $ele->PAG_Code;}, $pags_info)))); // TODO 限制50
$tour_s->vendor_name = implode(",", array_values(array_unique(array_map(function($ele) {return $ele->VEI2_CompanyBN;}, $pags_info)))) ; // 50
$tour_s->pag_name = implode(";\r\n", array_map(function($ele) {return $ele->PAG_Title;}, $pags_info)) ; // TODO 限制200 用mb_substr('UTF-8')
$ret->tour[0] = $tour_s;
// if ( $ret->tour_count > 1 ) {
// } else {
// }
$ret->order_cost = array_sum(array_map(function($ele) {return $ele->cost_sum;}, $ret->tour));
$ret->PAG_Code = implode(",", array_values(array_unique(array_map(function($ele) {return $ele->PAG_Code;}, $pags_info)))); // TODO 限制50
$ret->vendor_name = implode(",", array_values(array_unique(array_map(function($ele) {return $ele->VEI2_CompanyBN;}, $pags_info)))) ; // 50
$ret->pag_name = implode(";\r\n", array_map(function($ele) {return $ele->PAG_Title;}, $pags_info)) ; // TODO 限制200 用mb_substr('UTF-8')
// $ret->tour[0] = $tour_s;
// $ret->order_cost = array_sum(array_map(function($ele) {return $ele->cost_sum;}, $ret->tour));
return $ret;
// return $this->output->set_content_type('application/json')->set_output(json_encode($ret, JSON_UNESCAPED_UNICODE));
}
@ -188,7 +243,7 @@ class Order_finance extends CI_Controller {
}
return $allowed;
}
/** 允许拼团的不同编号产品 */
/** 允许混合拼团的不同编号产品 */
public function allowed_combine()
{
return array(
@ -203,6 +258,29 @@ class Order_finance extends CI_Controller {
);
}
/** 允许拆分再拼团的产品编号 */
public function spread_code()
{
return array(
"XASIC-42" => array("XASIC-41"),
"BJSIC-42" => array("BJSIC-41"),
"BJSIC-43" => array("BJSIC-41","BJSIC-42"),
"SHSIC-42" => array("SHSIC-41"),
"SHSIC-43" => array("SHSIC-41","SHSIC-42")
);
}
/** 肯定是PVT */
public function forbidden_combine()
{
return array(
"BJALC-209",
"BJSIC-16",
"SHSIC-45",
"XASIC-16"
);
}
}
/* End of file order_finance.php */

@ -4,6 +4,7 @@ defined('BASEPATH') OR exit('No direct script access allowed');
class OrderFinance_model extends CI_Model {
function __construct() {
parent::__construct();
$this->load->helper('array');
$this->HT = $this->load->database('HT', TRUE);
}
@ -14,13 +15,18 @@ class OrderFinance_model extends CI_Model {
from GroupCombineInfo gci
inner join BIZ_ConfirmLineInfo coli on gci.GCI_GRI_SN=COLI_GRI_SN
where coli.COLI_SN=$coli_sn
group by gci.GCI_combineNo,gci.GCI_groupType";
group by gci.GCI_combineNo,gci.GCI_groupType
order by gci.GCI_groupType desc";
return $this->HT->query($sql)->result();
}
/** 拼团号下的所有订单 */
public function get_all_combine_order($combineNo="")
/**
* 拼团号下的所有订单
* * 仅包价线路产品
*/
public function get_all_combine_order($combineNo="", $processed_code=array())
{
$processed_sql = empty($processed_code) ? "" : " and PAG_Code not in (" . my_implode("'",",",$processed_code) . ") ";
$sql = "SELECT gci.GCI_combineNo,gci.GCI_VendorOrderId
,COLI_SN,coli_ID--,COLI_ApplyDate,COLI_GroupCode
,COLD_SN,cold.COLD_ServiceSN--,COLD_EndDate
@ -30,9 +36,11 @@ class OrderFinance_model extends CI_Model {
from GroupCombineInfo gci
inner join BIZ_ConfirmLineInfo coli on gci.GCI_GRI_SN=COLI_GRI_SN
inner join BIZ_ConfirmLineDetail cold on cold.COLD_COLI_SN=coli.COLI_SN
and cold.COLD_ServiceType='D' and cold.DeleteFlag=0
left join BIZ_PackageInfo pag on PAG_SN=COLD_ServiceSN
left join BIZ_PackageInfoSub pag_sub on pag_sub.PAGS_SN=COLD_ServiceSN2
where gci.GCI_combineNo =?
$processed_sql
order by GCI_combineNo,cold.COLD_StartDate";
return $this->HT->query($sql, array($combineNo))->result();
}

Loading…
Cancel
Save