model('operation_log'); $opinfo = kernel::single('ome_func')->getDesktopUser(); $pay_time = floatval($sdf['pay_time']); $createtime = floatval($sdf['createtime']); $shop_name = $sdf['shop_name']; $shop_id = $sdf['shop_id']; $buyer_nick = $sdf['buyer_nick']; $order_id = $sdf['order_id']; $order_bn = $sdf['order_bn']; $payed = floatval($sdf['payed']); $province = $sdf['province']; $shopObj = app::get('ome')->model('shop'); #查询是否存在有效规则 $sql = "select * from sdb_ome_gift_rule where status = '1' and disable='false' and ((time_type = 'createtime' AND ({$createtime} BETWEEN start_time AND end_time)) OR (time_type = 'pay_time' AND ({$pay_time} BETWEEN start_time AND end_time))) order by priority DESC,id DESC"; $data = $shopObj->db->select($sql); if(empty($data)){ return array('msg'=>"没有有效的赠品规则"); } #获取基础赠品规则 $ruleBaseId = array(); foreach($data as $mykey=>$rule) { #赠品判断条件 $rule['filter_arr'] = json_decode($rule['filter_arr'], true); $data[$mykey] = $rule; if($rule['filter_arr']['add_or_divide']) { foreach ($rule['filter_arr']['id'] as $val) { $ruleBaseId[$val] = $val; } } } $ruleBase = array(); if($ruleBaseId) { $ruleBaseRows = app::get('crm')->model('gift_rule_base')->getList('*', array('id'=>$ruleBaseId, 'disabled' => array('true', 'false'))); foreach ($ruleBaseRows as $val) { $val['gift_list'] = unserialize($val['gift_list']); $val['filter_arr'] = json_decode($val['filter_arr'], true); $ruleBase[$val['id']] = $val; } } $reason = array(); $giftList = array(); $gift_send_log = array();//记录赠品发送日志 $last_exclude_flag = 0; $bufaRules = array(); //补发应用规则 $return = array(); #检测是否符合赠送条件 foreach($data as $mykey=>$rule){ $apply_id = $rule['id']; //check if($rule['trigger_type'] != 'order_complete'){ if($giftList){ if($last_exclude_flag == 1) { //上个满足的规则是排他的 忽略后续任何规则 break; } if($rule['is_exclude']==1) { //上个满足的规则不排他 当前规则排他的话直接跳过 continue; } } $last_exclude_flag = $rule['is_exclude']; } //非全选,需要检测下店铺 if($rule['shop_ids'] != '_ALL_'){ if($rule['shop_ids']){ $rule['shop_ids'] = explode(',', $rule['shop_ids']); } if($rule['shop_ids'] && !in_array($shop_id, $rule['shop_ids'])){ $reason[] = 'ERP赠品:' . $rule['title'] . '(' . $apply_id . ')-不符合指定店铺'; continue; } } #非全选,需要检测送货地区 if($rule['filter_arr']['province'][0] != '_ALL_'){ if( ! $province or ! in_array($province, $rule['filter_arr']['province'])){ $reason[] = 'ERP赠品:' . $rule['title'] . '(' . $apply_id . ')-不符合指定收货区域'; continue; } } //[补发方式]订单完成后,再触发 if($rule['trigger_type'] == 'order_complete' && empty($rule['defer_day'])){ $reason[] = '应用规则:'. $rule['title'] .'('. $apply_id .')-延迟天数填写错误'; continue; } //check if(empty($rule['filter_arr']['add_or_divide'])) { $reason[] = 'ERP赠品:' . $rule['title'] . '(' . $apply_id . ')-请使用新的规则'; continue; } //赠品规则 $reason[] = 'ERP赠品:' . $rule['title'] . '(' . $apply_id . ')'; foreach ($rule['filter_arr']['id'] as $baseId) { if($giftList && $rule['filter_arr']['add_or_divide'] != 'add') { break; } //check已被删除 if($ruleBase[$baseId] && $ruleBase[$baseId]['disabled'] != 'false') { $reason[] = '    ' . $ruleBase[$baseId]['rule_bn'] . '(' . $baseId . ')-该规则不存在'; continue; } //check赠品规则里没有赠品列表 $msg = '    ' . $ruleBase[$baseId]['rule_bn'] . '(' . $baseId . ')-'; if(empty($ruleBase[$baseId]['gift_list']) || !is_array($ruleBase[$baseId]['gift_list'])) { $reason[] = $msg . '没有设定赠品'; continue; } $ruleBase[$baseId]['rule_id'] = $apply_id; $suite = 1; # 仅buygoods中引用 //验证插件列表 foreach ($this->crmGiftPlugin as $plugin) { //补发赠品规则,跳过验证库存 if($rule['trigger_type'] == 'order_complete' && $plugin == 'sendgoods'){ continue; } //exec $rs = kernel::single('crm_gift_'.$plugin)->process($ruleBase[$baseId], $sdf, $suite); if(!$rs[0]) { if(strpos($rs[1], '库存不足') !== false) { $return = array('err'=>1, 'msg'=>$msg . $rs[1]); } $reason[] = $msg . $rs[1]; continue 2; } else { if($rs[1]) { $msg .= $rs[1] . '-'; } } } //赠送方式 if($rule['trigger_type'] == 'order_complete'){ $reason[] = $msg . '通过(延迟补发)'; }else{ $reason[] = $msg . '通过'; } //符合条件的赠品规则 $suite = $suite > 1 ? $suite : 1; foreach ($ruleBase[$baseId]['gift_list'] as $gift_id => $num) { //赠送数量 $gift_nums = $num * $suite; //赠送方式 if($rule['trigger_type'] == 'order_complete'){ //[延迟补发]订单完成之后,再创建补发订单赠送赠品 $bufaRules[$apply_id][$baseId][$gift_id] = $gift_id; }else{ //订单审核时 $gift_send_log[$gift_id][$apply_id .'-'. $baseId] = $gift_nums; $giftList[$gift_id] += $gift_nums; } } } } #如果符合条件,添加赠送日志 $return || $return = array('msg'=>'不符合赠品规则'); $succReturn = array(); if($giftList){ $rule_gift_ids = array(); #库存这里先观察下,是否需要设置 $gifts = array(); $create_time = time(); $m_gift_logs = app::get('ome')->model('gift_logs'); $rs = app::get('crm')->model('gift')->getList('gift_id as id,gift_bn,gift_name,gift_num,giftset,product_id',array('gift_id'=>array_keys($giftList))); foreach($rs as $v){ $gift_num = (int) $giftList[$v['id']]; $sqlstr = ''; if ($v['giftset'] == '0') { $sqlstr = ',gift_num=gift_num-' . $gift_num; } $sql = "update sdb_crm_gift set send_num=send_num+" . $gift_num . "{$sqlstr} where gift_id=" . $v['id']; $shopObj->db->exec($sql); $gifts[$v['gift_bn']] += $gift_num; #记录赠品发送日志 foreach ($gift_send_log[$v['id']] as $rbid => $num) { list($ruleId, $baseId) = explode('-', $rbid); $md5_key = md5($order_bn.$ruleId.$v['gift_bn'].$create_time.$baseId); $log_arr = array( 'order_source'=>$shop_name, 'order_bn'=>$order_bn, 'buyer_account'=>$buyer_nick, 'shop_id'=>$shop_id, 'paid_amount'=>$payed, 'gift_num'=>$num, 'gift_rule_id'=>$ruleId, 'rule_base_id'=>$baseId, 'gift_bn'=>$v['gift_bn'], 'gift_name'=>$v['gift_name'], 'create_time'=>$create_time, 'md5_key'=>$md5_key, 'status'=>0, ); $m_gift_logs->save($log_arr); //赠送记录关系 $rule_gift_ids[$baseId][$v['id']] = $gift_num; } } #返回erp的发货数据 $succReturn = array( 'order_bn'=>$order_bn, 'gifts'=>$gifts, ); //更新[赠品规则记录 ]已赠送数量 foreach ($rule_gift_ids as $rule_base_id => $item) { foreach ($item as $gift_id => $gift_num){ $update_sql = "UPDATE sdb_crm_gift_rule_logs SET send_num=send_num+". $gift_num .",send_time=". time(); $update_sql .= " WHERE rule_id=". $rule_base_id ." AND gift_id=". $gift_id; $shopObj->db->exec($update_sql); } } } //[延迟补发]订单完成之后,再创建补发订单赠送赠品 if($bufaRules){ $succReturn['order_bn'] = $order_bn; $succReturn['bufaRules'] = $bufaRules; } //log if($reason){ $logInfo = implode('
', $reason); $log_mdl->write_log('order_preprocess@ome',$order_id, $logInfo,time(),$opinfo); } //返回结果 if($succReturn){ //succ return $succReturn; }else{ //fail return $return; } } /** * 保存赠品规则记录 * * @param array $params 赠品规则数据 * @param string $error_msg * @return bool */ public function save_gift_rule_logs($params, &$error_msg=null) { $ruleObj = app::get('crm')->model('gift_rule_base'); $ruleLogObj = app::get('crm')->model('gift_rule_logs'); $giftObj = app::get('crm')->model('gift'); $rule_id = $params['id']; $gift_list = unserialize($params['gift_list']); //check if(empty($params) || empty($params['id'])){ $error_msg = '无效的数据'; return false; } if(empty($gift_list)){ $error_msg = '没有赠送商品'; return false; } $data = array( 'rule_id' => $rule_id, 'rule_bn' => $params['rule_bn'], ); //赠品规则 $ruleInfo = $ruleObj->dump(array('id'=>$rule_id), 'rule_bn'); if($ruleInfo){ $data['rule_bn'] = $ruleInfo['rule_bn']; } //赠品信息 $tempList = $giftObj->getList('gift_id,product_id,gift_bn,gift_name,spec_info', array('gift_id'=>array_keys($gift_list))); if(empty($tempList)){ $error_msg = '没有找到赠品数据'; return false; } $giftList = array(); foreach ($tempList as $key => $val){ $gift_id = $val['gift_id']; $giftList[$gift_id] = $val; } foreach ($giftList as $gift_id => $val) { $saveData = array( 'rule_id' => $data['rule_id'], 'rule_bn' => $data['rule_bn'], 'gift_id' => $gift_id, 'product_id' => $val['product_id'], 'gift_bn' => $val['gift_bn'], 'gift_name' => $val['gift_name'], 'spec_info' => $val['spec_info'], ); //是否已经存在 $ruleLogInfo = $ruleLogObj->dump(array('rule_id'=>$rule_id, 'gift_id'=>$gift_id), 'sid'); if($ruleLogInfo){ $saveData['sid'] = $ruleLogInfo['sid']; }else{ $saveData['create_time'] = time(); $saveData['update_time'] = time(); } $result = $ruleLogObj->save($saveData); } return true; } /** * 获取补发赠品规则 * * @param $orderInfo 订单信息(包含objects、items商品明细) * @param $applyGiftInfo 订单审核时符合条件的赠品应用规则 * @return array */ public function getBufaGiftRules($orderInfo, $applyGiftInfo=null) { $giftLogMdl = app::get('ome')->model('gift_logs'); $crmGiftMdl = app::get('crm')->model('gift'); $ruleBaseMdl = app::get('crm')->model('gift_rule_base'); $logMdl = app::get('ome')->model('operation_log'); //opinfo $opinfo = kernel::single('ome_func')->getDesktopUser(); //指定的赠品应用规则 $applyIds = $applyGiftInfo['applyIds']; //setting $order_id = $orderInfo['order_id']; $order_bn = $orderInfo['order_bn']; $shop_id = $orderInfo['shop_id']; $shop_name = $orderInfo['shop_name']; $buyer_nick = $orderInfo['buyer_nick']; $payed = floatval($orderInfo['payed']); $pay_time = floatval($orderInfo['paytime']); $createtime = floatval($orderInfo['createtime']); $result = array('rsp'=>'fail', 'error_msg'=>''); $reason = array(); //收货地区 list($mainland, $areaInfo, $areaId) = explode(':', $orderInfo['ship_area']); list($province, $city, $district) = explode('/', $areaInfo); //[补发赠品规则]获取赠品应用规则 if($applyIds){ //指定赠品应用规则 $sql = "SELECT * FROM sdb_ome_gift_rule WHERE id IN(". implode(',', $applyIds) .") ORDER BY priority DESC, id DESC"; }else{ $sql = "SELECT * FROM sdb_ome_gift_rule WHERE status='1' AND disable='false' AND trigger_type='order_complete' AND ((time_type='createtime' AND ({$createtime} BETWEEN start_time AND end_time)) OR (time_type='pay_time' AND ({$pay_time} BETWEEN start_time AND end_time))) ORDER BY priority DESC, id DESC"; } $tempList = $ruleBaseMdl->db->select($sql); if(empty($tempList)){ return array('rsp'=>'fail', 'error_msg'=>'没有有效的补发赠品规则'); } //格式化赠品规则 $ruleList = array(); $ruleBaseIds = array(); foreach($tempList as $ruleKey => $ruleInfo) { $apply_id = $ruleInfo['id']; //赠品判断条件 $ruleInfo['filter_arr'] = json_decode($ruleInfo['filter_arr'], true); //check if(empty($ruleInfo['filter_arr'])) { $reason[] = '应用规则:'. $ruleInfo['title'] .'(' . $apply_id . ')-不符合赠送条件'; continue; } if(empty($ruleInfo['filter_arr']['add_or_divide'])) { $reason[] = '应用规则:' . $ruleInfo['title'] . '(' . $apply_id . ')-请使用新的规则'; continue; } if(empty($ruleInfo['filter_arr']['id'])) { $reason[] = '应用规则:'. $ruleInfo['title'] .'(' . $apply_id . ')-没有指定赠品规则'; continue; } //[非全选]检测选择的店铺 if($ruleInfo['shop_ids'] != '_ALL_'){ if($ruleInfo['shop_ids']){ $ruleInfo['shop_ids'] = explode(',', $ruleInfo['shop_ids']); } if($ruleInfo['shop_ids'] && !in_array($shop_id, $ruleInfo['shop_ids'])){ $reason[] = '应用规则:' . $ruleInfo['title'] . '(' . $apply_id . ')-不符合指定店铺'; continue; } } //[非全选]检测择的收货地区 if($ruleInfo['filter_arr']['province'][0] != '_ALL_'){ if(!$province or ! in_array($province, $ruleInfo['filter_arr']['province'])){ $reason[] = '应用规则:' . $ruleInfo['title'] . '(' . $apply_id . ')-不符合指定收货区域'; continue; } } //[补发方式]订单完成后,再触发 if($ruleInfo['trigger_type'] != 'order_complete'){ $reason[] = '应用规则:'. $ruleInfo['title'] .'('. $apply_id .')-不是补发规则'; continue; } if(empty($ruleInfo['defer_day']) || $ruleInfo['defer_day'] < 1){ $reason[] = '应用规则:'. $ruleInfo['title'] .'('. $apply_id .')-延迟天数填写错误'; continue; } //赠品规则ID foreach ($ruleInfo['filter_arr']['id'] as $rule_base_id) { $ruleBaseIds[$rule_base_id] = $rule_base_id; } $ruleList[$apply_id] = $ruleInfo; } //log if(empty($ruleList) || empty($ruleBaseIds)){ //log if($reason){ $logInfo = implode('
', $reason); $logMdl->write_log('order_preprocess@ome', $order_id, $logInfo, time(), $opinfo); } $result['error_msg'] .= '没有符合条件的应用规则;'; return $result; } //赠品发放规则 $tempList = $ruleBaseMdl->getList('*', array('id'=>$ruleBaseIds)); if(empty($tempList)){ //log $logInfo = '没有获取到赠品发放规则'; $logMdl->write_log('order_preprocess@ome', $order_id, $logInfo, time(), $opinfo); $result['error_msg'] = $logInfo; return $result; } //format $ruleBaseList = array(); foreach ($tempList as $val) { $rule_base_id = $val['id']; $val['gift_list'] = unserialize($val['gift_list']); $val['filter_arr'] = json_decode($val['filter_arr'], true); //check已被删除 if($val['disabled'] != 'false') { $reason[] = '  赠品规则:'. $val['rule_bn'] .'(' . $rule_base_id . ')-该规则已被删除'; continue; } //check赠送商品 if(empty($val['gift_list']) || !is_array($val['gift_list'])) { $reason[] = '  赠品规则:'. $val['rule_bn'] .'(' . $rule_base_id . ')-没有配置赠送商品'; continue; } $ruleBaseList[$rule_base_id] = $val; } //log if(empty($ruleBaseList)){ //log if($reason){ $logInfo = implode('
', $reason); $logMdl->write_log('order_preprocess@ome', $order_id, $logInfo, time(), $opinfo); } $result['error_msg'] = '没有符合条件的赠品规则'; return $result; } //exec $giftList = array(); $gift_send_log = array();//赠品发送日志 $last_exclude_flag = 1; //固定只使用一条赠品规则 $applyInfo = array(); foreach($ruleList as $ruleKey => $rule) { $apply_id = $rule['id']; //check if($giftList){ //上个满足的规则是排他的 忽略后续任何规则 if($last_exclude_flag == 1) { break; } //上个满足的规则不排他 当前规则排他的话直接跳过 if($rule['is_exclude'] == 1) { continue; } } //是否排他 //$last_exclude_flag = $rule['is_exclude']; $last_exclude_flag = 1; //固定只使用一条赠品规则 //赠品规则 $reason[] = '执行赠品规则:'. $rule['title'] .'(' . $apply_id .')'; foreach ($rule['filter_arr']['id'] as $rule_base_id) { //check赠品规则(只要有一个赠品规则是无效的,就跳过) if(empty($ruleBaseList[$rule_base_id])) { break; } $ruleBaseList[$rule_base_id]['rule_id'] = $apply_id; //仅buygoods中引用 $suite = 1; $msg = '    '. $ruleBaseList[$rule_base_id]['rule_bn'] .'('. $rule_base_id .')-'; //验证插件列表 foreach ($this->crmGiftPlugin as $plugin) { //订单审核时赠送了赠品,订单完成后进行延迟补发,每ID是第二次赠送 // if($plugin == 'buyernick'){ // continue; //不进行验证 // } //每天前多少名限量赠送 // if($plugin == 'buygoods'){ // continue; //不进行验证 // } //verify $rs = kernel::single('crm_gift_'. $plugin)->process($ruleBaseList[$rule_base_id], $orderInfo, $suite); if(!$rs[0]) { if(strpos($rs[1], '库存不足') !== false) { $return = array('err'=>1, 'msg'=>$msg . $rs[1]); } $reason[] = $msg . $rs[1]; continue 2; } else { if($rs[1]) { $msg .= $rs[1] . '-'; } } } //赠送方式 $reason[] = $msg . '补发赠品通过'; //符合条件的赠品规则 foreach ($ruleBaseList[$rule_base_id]['gift_list'] as $gift_id => $num) { //赠送数量 $gift_nums = $num * $suite; //赠送应用 $applyInfo = array( 'apply_id' => $apply_id, 'defer_day' => $rule['defer_day'], ); //赠品商品 $giftList[$gift_id] += $gift_nums; //赠品发送日志 $gift_send_log[$gift_id][$apply_id .'-'. $rule_base_id] = $gift_nums; } } } //check if(empty($giftList)){ //log if($reason){ $logInfo = implode('
', $reason); $logMdl->write_log('order_preprocess@ome', $order_id, $logInfo, time(), $opinfo); } $result['error_msg'] = '没有可执行的赠品规则'; return $result; } //获取CRM赠品列表 $giftSdf = array(); $rule_gift_ids = array(); $giftGoods = $crmGiftMdl->getList('*', array('gift_id'=>array_keys($giftList))); foreach((array)$giftGoods as $giftInfo) { $gift_id = $giftInfo['gift_id']; $gift_bn = $giftInfo['gift_bn']; //赠送数量 $gift_num = intval($giftList[$gift_id]); //记录赠品商品列表 $giftSdf[$gift_bn] += $gift_num; //更新已赠送数量 $sqlstr = ''; if ($giftInfo['giftset'] == '0') { $sqlstr = ', gift_num=gift_num-' . $gift_num; } $sql = "UPDATE sdb_crm_gift SET send_num=send_num+" . $gift_num . "{$sqlstr} WHERE gift_id=". $gift_id; $crmGiftMdl->db->exec($sql); //记录赠品发送日志 $log_time = time(); foreach ($gift_send_log[$gift_id] as $rbid => $num) { list($apply_id, $rule_base_id) = explode('-', $rbid); $md5_key = md5($order_bn . $apply_id . $gift_bn . $log_time . $rule_base_id); $logSdf = array( 'order_source' => $shop_name, 'order_bn' => $order_bn, 'buyer_account' => $buyer_nick, 'shop_id' => $shop_id, 'paid_amount' => $payed, 'gift_num' => $num, 'gift_rule_id' => $apply_id, 'rule_base_id' => $rule_base_id, 'gift_bn' => $gift_bn, 'gift_name' => $giftInfo['gift_name'], 'create_time' => $log_time, 'md5_key' => $md5_key, 'status' => 0, ); $giftLogMdl->save($logSdf); //赠送记录关系 $rule_gift_ids[$rule_base_id][$gift_id] = $gift_num; } } //check if(empty($giftSdf)){ //log if($reason){ $logInfo = implode('
', $reason); $logMdl->write_log('order_preprocess@ome', $order_id, $logInfo, time(), $opinfo); } $result['error_msg'] = '没有可以赠送的商品'; return $result; } //更新[赠品规则记录 ]已赠送数量 foreach ($rule_gift_ids as $rule_base_id => $giftItems) { foreach ($giftItems as $gift_id => $gift_num) { $update_sql = "UPDATE sdb_crm_gift_rule_logs SET send_num=send_num+". $gift_num .",send_time=". time(); $update_sql .= " WHERE rule_id=". $rule_base_id ." AND gift_id=". $gift_id; $crmGiftMdl->db->exec($update_sql); } } //log if($reason){ $logInfo = implode('
', $reason); $logMdl->write_log('order_preprocess@ome', $order_id, $logInfo, time(), $opinfo); } //返回结果 $result['rsp'] = 'succ'; $result['order_bn'] = $order_bn; $result['applyInfo'] = $applyInfo; $result['gifts'] = $giftSdf; return $result; } }