model('delivery'); $refundsObj = app::get('ome')->model('refunds'); $ordersObj = app::get('ome')->model('orders'); $refund_applyObj = app::get('ome')->model('refund_apply'); $deliveryorderObj = app::get('ome')->model('delivery_order'); if (is_array($delivery_id)){ foreach ($delivery_id as $delivery_id){ self::get_refund_orders($delivery_id); } }else{ $delivery_detail = $deliveryObj->dump($delivery_id, 'is_bind,delivery_id,parent_id,logi_no'); if ($delivery_detail['parent_id'] > 0){ $parent_delivery_detail = $deliveryObj->dump(array('delivery_id'=>$delivery_detail['parent_id']), 'logi_no'); $delivery_detail['logi_no'] = $parent_delivery_detail['logi_no']; } if ($delivery_detail['is_bind'] == 'true'){ $delivery_ids = $deliveryObj->getList('delivery_id', array('parent_id'=>$delivery_detail['delivery_id']), 0, -1); if ($delivery_ids){ foreach ($delivery_ids as $delivery){ self::get_refund_orders($delivery['delivery_id']); } } }else{ $delivery_orders = $deliveryorderObj->dump(array('delivery_id'=>$delivery_id), 'order_id'); $order_id = $delivery_orders['order_id']; $refund_applys = $refund_applyObj->dump(array('order_id'=>$order_id,'status|noequal'=>'3','disabled'=>'false'), 'apply_id'); if (!empty($refund_applys)){ $order_detail = $ordersObj->dump(array('order_id'=>$order_id), 'order_bn,pay_status'); $refund_orders[] = array('order_bn'=>$order_detail['order_bn'],'logi_no'=>$delivery_detail['logi_no'],'status'=>'申请退款或已退款','pay_status'=>$order_detail['pay_status']); } } } if (!empty($refund_orders)){ if ($return_type == true){ return $refund_orders; }else{ return count($refund_orders); } }else{ return null; } } /** * 更新订单优惠方案 * @param Number $order_id 订单ID * @param String $shop_id 店铺ID * @param Array $pmt_detail 待更新的优惠方案 * @param Array $addon 附加参数 * @param Array $old_pmt 返回更新前的优惠方案 * @return bool true or false */ public function update_pmt($order_id,$shop_id,$pmt_detail=array(),$addon=array(),&$old_pmt){ if (empty($pmt_detail) || !is_array($pmt_detail) || empty($order_id)) return false; $pmtObj = app::get('ome')->model('order_pmt'); $old_pmt_detail = $pmtObj->getList('*',array('order_id'=>$order_id)); $old_pmt = $old_pmt_detail; foreach ($pmt_detail as $k=>$v){ if ((trim($v['pmt_amount']) == '' || trim($v['pmt_amount']) == 0) && trim($v['pmt_describe']) == ''){ unset($pmt_detail[$k]);#将pmt_amount是0并且pmt_describe为空的去掉 } } #比对 $update_flag = false; if ($old_pmt_detail){ if (count($old_pmt_detail) != count($pmt_detail)){ $update_flag = true; } }else{ if(count($pmt_detail) == 0){ $update_flag = false; }else{ $update_flag = true; } } if ($update_flag !== true){ return false; } #删除以前的优惠金额 $pmtObj->delete(array('order_id'=>$order_id)); foreach ($pmt_detail as $k=>$v){ //TODO:兼容拍拍优惠描述 $pmt_describe = ''; if (strstr($v['pmt_describe'],'@')){ $pmt_describe = explode('@',$v['pmt_describe']); $pmt_describe = $pmt_describe[1]; }else{ $pmt_describe = $v['pmt_describe']; } $pmt_sdf = array( 'order_id' => $order_id, 'pmt_amount' => abs($v['pmt_amount']), 'pmt_describe' => $pmt_describe, //'createtime' => $addon['createtime'],//增加优惠规则的创建时间(订单的创建时间) //'shop_id' => $shop_id,//增加店铺id ); if($pmtObj->save($pmt_sdf)){ $update_flag = true; } } return $update_flag; } /** * 订单结构数据扩展与修改 * @access public * @param array $order_sdf 订单sdf数据结构 * @return 扩展或修改后的订单sdf数据结构 */ static function order_sdf_extend(&$order_sdf){ if ($order_sdf){ foreach ($order_sdf as $obj_type=>$objects){ if (is_array($objects)){ foreach ($objects as $obj_id=>$items){ if ($items['order_items']){ foreach ($items['order_items'] as $item_id=>$item_val){ //显示items下的addon属性值 $addon = array(); $product_attr = unserialize($item_val['addon']); if (!empty($product_attr['product_attr'])){ foreach ($product_attr['product_attr'] as $attr){ if($attr['original_str']) { $addon[] = $attr['original_str']; break; }else{ $addon[] = $attr['label'].":".$attr['value']; } } } if ($addon){ $addon = implode(';',$addon); } $order_sdf[$obj_type][$obj_id]['order_items'][$item_id]['addon'] = $addon ? $addon : '-'; } } } } } } } /** * 更新订单收货人信息 *$new_consignee = $old_consignee = array( * 'ship_name' => '收货人姓名', * 'ship_area' => '收货人所在地区,ecos标准地区格式', * 'ship_province' => '收货人所在省', * 'ship_city' => '收货人所在市', * 'ship_district' => '收货人所在县(区)', * 'ship_addr' => '收货人所在详细地址', * 'ship_zip' => '收货人所在地区邮编', * 'ship_tel' => '收货人固定电话', * 'ship_mobile' => '收货人手机号码', * 'ship_email' => '收货人邮箱地址', * 'ship_time' => '收货人要求到货时间' *); * @access public * @param Number $order_id 订单ID * @param Array $new_consignee 新的收货人信息 * @param Array $old_consignee 原始的收货人信息(订单表的收货人结构) * @param bool $is_update 默认true更新,false不更新 * @return bool 不更新的时候,返回需要更新的收货人信息数组 */ public function update_consignee($order_id,$new_consignee,&$old_consignee=array(),$is_update=true){ if (empty($new_consignee)) return false; $oFunc = kernel::single('ome_func'); #收货人信息结构兼容 if (!isset($new_consignee['ship_name'])){ $new_consignee = array( 'ship_name' => $new_consignee['name'], 'ship_province' => $new_consignee['area_state'], 'ship_city' => $new_consignee['area_city'], 'ship_district' => $new_consignee['area_district'], 'ship_addr' => $new_consignee['addr'], 'ship_zip' => $new_consignee['zip'], 'ship_tel' => $new_consignee['telephone'], 'ship_mobile' => $new_consignee['mobile'], 'ship_email' => $new_consignee['email'], 'ship_time' => $new_consignee['r_time'] ); $area = $new_consignee['ship_province'].'/'.$new_consignee['ship_city'].'/'.$new_consignee['ship_district']; $oFunc->region_validate($area); $new_consignee['ship_area'] = $area; } #比较的字段 $compre_field = array('ship_name','ship_area','ship_addr','ship_zip','ship_tel','ship_email','ship_time','ship_mobile'); if (empty($old_consignee)){ $oOrder = app::get('ome')->model('orders'); $filter = array('order_id'=>$order_id); $orders = $oOrder->getRow($filter, implode(',',$compre_field)); if ($orders){ foreach ($orders as $field=>$val){ $old_consignee[$field] = $val; } } } #判断原始收货人地区是否为本地标准的地区格式 if (isset($old_consignee['ship_area']) && !$oFunc->is_correct_region($old_consignee['ship_area'])){ $area = $old_consignee['ship_area']; $oFunc->region_validate($area); $old_consignee['ship_area'] = $area; } $update_sdf = array(); foreach($compre_field as $field){ $compre_value = trim($new_consignee[$field]); if (empty($compre_value)) continue; if ($new_consignee[$field] != $old_consignee[$field]){ $update_sdf[$field] = $new_consignee[$field]; } } if ($update_sdf){ if ($is_update == true){ $oOrder = app::get('ome')->model('orders'); return $oOrder->update($update_sdf,array('order_id'=>$order_id)); }else{ return $update_sdf; } } return false; } /** * 更新订单发货人信息 *$new_consigner = $old_consigner = array( * 'consigner_name' => '发货人姓名', * 'consigner_area' => '发货人所在地区,ecos标准地区格式', * 'consigner_province' => '发货人所在省', * 'consigner_city' => '发货人所在市', * 'consigner_district' => '发货人所在县(区)', * 'consigner_addr' => '发货人所在详细地址', * 'consigner_zip' => '发货人所在地区邮编', * 'consigner_tel' => '发货人固定电话', * 'consigner_mobile' => '发货人手机号码', * 'consigner_email' => '发货人邮箱地址', *); * @access public * @param Number $order_id 订单ID * @param Array $new_consigner 新的发货人信息 * @param Array $old_consigner 原始的发货人信息(订单表的发货人结构) * @param bool $is_update 默认true更新,false不更新 * @return bool 不更新的时候,返回需要更新的发货人信息数组 */ public function update_consigner($order_id,$new_consigner,&$old_consigner=array(),$is_update=true){ if (empty($new_consigner)) return false; $oFunc = kernel::single('ome_func'); #发货人信息结构兼容 if (!isset($new_consigner['consigner_name'])){ $new_consigner = array( 'consigner_name' => $new_consigner['name'], 'consigner_province' => $new_consigner['area_state'], 'consigner_city' => $new_consigner['area_city'], 'consigner_district' => $new_consigner['area_district'], 'consigner_addr' => $new_consigner['addr'], 'consigner_zip' => $new_consigner['zip'], 'consigner_tel' => $new_consigner['telephone'], 'consigner_mobile' => $new_consigner['mobile'], 'consigner_email' => $new_consigner['email'], ); $area = $new_consigner['consigner_province'].'/'.$new_consigner['consigner_city'].'/'.$new_consigner['consigner_district']; $oFunc->region_validate($area); $new_consigner['consigner_area'] = $area; } #判断原始收货人地区是否为本地标准的地区格式 if (isset($old_consigner['consigner_area']) && !$oFunc->is_correct_region($old_consigner['consigner_area'])){ $area = $old_consigner['consigner_area']; $oFunc->region_validate($area); $old_consigner['consigner_area'] = $area; } #比较的字段 $compre_field = array('consigner_name','consigner_area','consigner_addr','consigner_zip','consigner_tel','consigner_email','consigner_mobile'); if (empty($old_consigner)){ $oOrder = app::get('ome')->model('orders'); $filter = array('order_id'=>$order_id); $orders = $oOrder->getRow($filter, implode(',',$compre_field)); if ($orders){ foreach ($orders as $field=>$val){ $old_consigner[$field] = $val; } } } $update_sdf = array(); foreach($compre_field as $field){ $compre_value = trim($new_consigner[$field]); if (empty($compre_value)) continue; if ($new_consigner[$field] != $old_consigner[$field]){ $update_sdf[$field] = $new_consigner[$field]; } } if ($update_sdf){ if ($is_update == true){ $oOrder = app::get('ome')->model('orders'); return $oOrder->update($update_sdf,array('order_id'=>$order_id)); }else{ return $update_sdf; } } return false; } /** * 更新订单代销人信息 * @access public * @param Number $order_id 订单ID;$type,新增或编辑模式 * @param Array $new_sellagent 新的代销人信息 * @return bool true有变化,false无变化 */ public function update_sellagent($order_id,$new_sellagent=array(),$type=false){ if (empty($new_sellagent) || empty($order_id)) return false; $oSellAgent = app::get('ome')->model('order_selling_agent'); $oFunc = kernel::single('ome_func'); $new_sellagent['member_info']['tel'] = $new_sellagent['member_info']['telephone']; $area = $new_sellagent['member_info']['area_state'].'/'.$new_sellagent['member_info']['area_city'].'/'.$new_sellagent['member_info']['area_district']; $oFunc->region_validate($area); $new_sellagent['member_info']['area'] = $area; $compre_field = array( 'member_info' => array('uname','level','name','birthday','sex','area','addr','zip','tel','mobile','email'), 'website' => array('name','domain','logo') ); $old_sellagent = $oSellAgent->dump(array('order_id'=>$order_id)); #只处理新增的数据。原来已存在的老订单不管 if($type == 'create'){ #新增分销王订单前端发货人地区 if($new_sellagent['seller']){ $seller_area = $new_sellagent['seller']['seller_state'].'-'.$new_sellagent['seller']['seller_city'].'-'.$new_sellagent['seller']['seller_district']; $new_sellagent['seller']['seller_area'] = $seller_area; $compre_field['seller'] = array('seller_name','seller_mobile','seller_phone','seller_zip','seller_area','seller_address'); } } $update_sdf = array(); foreach($compre_field as $path=>$field){ if (is_array($field)){ foreach($field as $fname){ $compre_value = trim($new_sellagent[$path][$fname]); if (empty($compre_value)) continue; if ($new_sellagent[$path][$fname] != $old_sellagent[$path][$fname]){ $update_sdf[$path][$fname] = $new_sellagent[$path][$fname]; } } }else{ $compre_value = trim($new_sellagent[$field]); if (empty($compre_value)) continue; if ($new_sellagent[$field] != $old_sellagent[$field]){ $update_sdf[$field] = $new_sellagent[$field]; } } } if ($update_sdf){ $update_sdf['selling_agent_id'] = $old_sellagent['selling_agent_id']; $update_sdf['order_id'] = $order_id; #只处理新增的订单,原来已存在的老订单不管 if($type == 'create'){ #分销王订单前端发货人与发货地址存在 if($update_sdf['seller']['seller_address'] && $update_sdf['seller']['seller_name']){ $update_sdf['print_status'] = '1';#打印前端代销人发货信息 } } return $oSellAgent->save($update_sdf); } return false; } /** * 订单旗标 * @param string $mark_value 获取相应旗标的图标,为空时获取所有旗标 * @return 返回旗标 */ static function order_mark_type($mark_value=''){ $arr = array('b0' => '灰色', 'b1' => '红色', 'b2' => '橙色', 'b3' => '黄色', 'b4' => '蓝色', 'b5' => '紫色', 'b6' => '浅粉', 'b7' => '绿色', 'b8' => '浅蓝', 'b9' => '深绿', 'b10' => '桃红'); $mark_type = array(); $url = app::get('ome')->res_url; foreach ($arr as $k=>$v){ $mark_type[$k] = $url.'/remark_icons/'.$k.'.png'; } if ($mark_value){ return $mark_type[$mark_value]; }else{ return $mark_type; } } /** * 获取商品类型 * @return 返回现有商品类型 */ public function get_obj_type(){ $obj_type = array(); if ($service = kernel::servicelist('ome.service.order.confirm')) foreach ($service as $object => $instance){ if (method_exists($instance, 'view_list')){ $list = $instance->view_list(); if (is_array($list) && count($list) > 0){ foreach ($list as $type =>$config){ $obj_type[$type] = $type; } } } } return $obj_type; } /** * 增加order_items的unit字段 * @param array $data 获得要处理的数组 * @return array */ static function add_getItemList_colum($data){ $basicMaterialLib = kernel::single('material_basic_material'); if($data){ foreach($data as $obj_type=>$obj){ foreach($obj as $obj_id=>$oObj){ foreach($oObj['order_items'] as $item_id=>$iObj) { $product = $basicMaterialLib->getBasicMaterialExt($iObj['product_id']); $data[$obj_type][$obj_id]['order_items'][$item_id]['unit'] = $product['unit']; $data[$obj_type][$obj_id]['order_items'][$item_id]['specifications'] = $product['specifications']; } } } return $data; } } /** * 增加order_items的unit字段 * @param array $data 获得要处理的数组 * @return array */ static function add_items_colum($data){ $basicMaterialLib = kernel::single('material_basic_material'); if($data){ foreach($data as $obj_id=>$obj) { $product = $basicMaterialLib->getBasicMaterialExt($obj['product_id']); $data[$obj_id]['unit'] = $product['unit']; $data[$obj_id]['specifications'] = $product['specifications']; } return $data; } } /** * 计算订单未发货商品的总金额 * @param string $order_id 订单号 * @return 未发货商品总金额 */ public function order_items_diff_money($order_id){ $order = app::get('ome')->model('orders')->dump($order_id,"order_id",array("order_objects"=>array("*",array("order_items"=>array("*"))))); $amount = 0; if ($order['order_objects']){ foreach ($order['order_objects'] as $obj){ if ($service = kernel::service("ome.service.order.remain.".trim($obj['obj_type']))){ if (method_exists($service, 'diff_money')){ $tmp_amount = $service->diff_money($obj); $amount += $tmp_amount; } }else { if ($service = kernel::service("ome.service.order.remain.goods")){ if (method_exists($service, 'diff_money')){ $tmp_amount = $service->diff_money($obj); $amount += $tmp_amount; } } } } } return $amount; } /** * 更新订单支付状态 * @access public * @param string $order_id 订单主键ID * @return void */ public function update_order_pay_status($order_id=NULL){ $log = app::get('ome')->model('api_log'); $logTitle = '更新订单状态操作[订单ID:'. $order_id .']'; $logInfo = '更新订单 '. $order_id . ' 操作
'; if (empty($order_id)) { $log->write_log($log->gen_id(), $logTitle, __CLASS__, __METHOD__, '', '', 'response', 'fail', $logInfo,'','api.store.trade'); return false; } $orderObj = app::get('archive')->model('orders'); $refundObj = app::get('ome')->model('refunds'); $refund_applyObj = app::get('ome')->model('refund_apply'); $dObj = app::get('ome')->model('delivery'); $order_filter = array("order_id"=>$order_id); //订单详情 $order_detail = $orderObj->dump($order_filter, 'order_bn,payed,total_amount,shop_type'); $payed = strval($order_detail['payed']); $total_amount = strval($order_detail['total_amount']); $logInfo .= '订单信息:
' . var_export($order_detail, true) . '
'; $logInfo .= '当前支付状态:'. $payed . '
'; $logInfo .= '当前总计金额:'. $total_amount . '
'; //获取退款单及退款申请记录 $refund_filter = array_merge($order_filter,array('status'=>'succ')); $refund_detail = $refundObj->dump($refund_filter, 'refund_id'); $refund_apply_filter = array_merge($order_filter,array('status'=>array('0','1','2','6'))); $refund_apply_detail = $refund_applyObj->dump($refund_apply_filter, 'apply_id'); $logInfo .= '退款单信息:
' . var_export($refund_detail, true) . '
'; $logInfo .= '退款申请信息:
' . var_export($refund_apply_detail, true) . '
'; $pay_status = ''; //支付状态 if ($payed == '0' && $total_amount > '0' && !$refund_detail){ $pay_status = '0';//未支付 }elseif($payed < $total_amount && !$refund_detail){ $pay_status = '3';//部分支付 }elseif($payed >= $total_amount){ $pay_status = '1';//已支付 } //退款状态 if($refund_apply_detail){ $pay_status = '6';//退款申请中 }elseif($payed == '0' && $refund_detail){ //danny_freeze_stock_log define('FRST_TRIGGER_OBJECT_TYPE','订单:未发货订单全额退款导致订单取消'); define('FRST_TRIGGER_ACTION_TYPE','ome_order_func:update_order_pay_status'); $pay_status = '5';//全额退款 //全额退款并且未发货的订单取消 }elseif($payed < $total_amount && $refund_detail){ $pay_status = '4';//部分退款 } if ($pay_status !== ''){ //退款申请中 将订单置为暂停 其余的不暂停 if($pay_status == 6){ $data['pause'] = 'true'; $logInfo .= '退款申请中 将订单置为暂停 其余的不暂停 信息:
' . var_export($order_filter, true) . var_export($data, true) . '
'; }else{ $data['pause'] = 'false'; $logInfo .= '将订单暂停状态恢复 信息:
' . var_export($order_filter, true) . var_export($data, true) . '
'; } $data['pay_status'] = $pay_status; if (!$orderObj->update($data, $order_filter)){ $log->write_log($log->gen_id(), $logTitle, __CLASS__, __METHOD__, '', '', 'response', 'fail', $logInfo,'','api.store.trade',$order_detail['order_bn']); return false; } } $log->write_log($log->gen_id(), $logTitle, __CLASS__, __METHOD__, '', '', 'response', 'success', $logInfo,'','api.store.trade',$order_detail['order_bn']); return true; } /** * 判断是否大订单的界限 * @access static public * @return int */ static public function get_max_orderitems(){ return 1000; } /** * 更新订单备注 * @access public * @param Number $order_id 订单ID * @param String $add_mark 待更新的订单备注内容 * @param String $op_name 操作人 * @param String $old_mark_memo 订单现有的订单备注内容 * @param bool $is_update 是否更新,默认更新true,false不更新 * @return $is_update=true,返回成功或失败;$is_update=false返回待更新的订单备注内容 */ public function update_mark($order_id,$add_mark='',$op_name='',$old_mark='',$is_update=true){ $add_mark = trim($add_mark); if (empty($add_mark)) return false; return $this->_update_mark_message($order_id,$add_mark,$op_name,$old_mark,'mark_text',$is_update); } private function _update_mark_message($order_id,$add_content,$op_name,$old_content,$field_name,$is_update){ $oOrder = app::get('ome')->model('orders'); if (empty($old_content)){ $filter = array('order_id'=>$order_id); $orders = $oOrder->getRow($filter, 'mark_text,custom_mark'); $old_content = $orders[$field_name]; } $update_flag = true;#更新标识 $oFunc = kernel::single('ome_func'); $old_content = $oFunc->format_memo($old_content); $add_content = trim($add_content); if ($old_content){ foreach ($old_content as $val){ if ($val['op_content'] == $add_content){ $update_flag = false; break; } } } if ($update_flag){ #原始内容 $new_content = is_array($old_content) ? $old_content : array(); #追加内容 $add_content = array('op_name'=>$op_name,'op_content'=>$add_content,'op_time'=>time()); $new_content[] = $add_content; if ($is_update == true){ return $oOrder->update(array($field_name=>serialize($new_content)), $filter); }else{ return $new_content; } } return false; } /** * 更新买家留言 * @access public * @param Number $order_id 订单ID * @param String $add_message 待更新的买家留言内容 * @param String $op_name 操作人 * @param String $old_mark_memo 订单现有的买家留言内容 * @param bool $is_update 是否更新,默认更新true,false不更新 * @return $is_update=true,返回成功或失败;$is_update=false返回待更新的买家留言内容 */ public function update_message($order_id,$add_message='',$op_name='',$old_msg='',$is_update=true){ $add_message = trim($add_message); if (empty($add_message)) return false; return $this->_update_mark_message($order_id,$add_message,$op_name,$old_msg,'custom_mark',$is_update); } /** * 定义基本的订单类型 * * @return array * @author yangminsheng **/ public function get_order_source($type = null) { $source = array( 'local' => '分销王本地订单', 'fxjl' => '抓抓', 'taofenxiao' => '淘分销', 'tbjx' => '淘宝经销', 'tbdx' => '淘宝代销', 'secondbuy' => '分销王秒批订单', 'direct' => '直销订单', ); if($type){ return $source[$type]; } return $source; } }