32], [['title', 'jp_order_no'], 'string', 'max' => 64], // [['order_no'], 'unique'], // mycat 环境不能使用此规则 ]; } /** * {@inheritdoc} */ public function attributeLabels() { return [ 'id' => 'ID', 'mall_id' => '商城 ID', 'user_id' => '会员 ID', 'order_no' => '订单编号', 'pay_fee' => '订单金额', 'bank_card_id' => '开通快捷支付银行卡id', 'title' => '订单title', 'jp_order_no' => '汇聚平台流水号', 'is_sign' => '是否签约,1-是,0-否', 'status' => '状态[-1:删除;0:禁用;1启用]', 'created_at' => 'Created At', 'updated_at' => 'Updated At', ]; } public static function setData(int $mall_id, array $data) { if (empty($data['id'])) { $model = new self(); $model->loadDefaultValues(); $model->mall_id = $mall_id; } else { $model = self::findOne(['mall_id' => $mall_id, 'id' => $data['id'], 'status' => StatusEnum::ENABLED]); if (empty($model)) throw new \Exception('数据记录异常'); } foreach ($data as $key => $val) { $model->$key = $val; } if (!$model->save()) { self::$static_error = '保存数据失败:' . $model->getErrorMessage(); return false; } return $model; } /** * 生成开通快捷支付订单 * @param $mall_id * @param $user_id * @param $card_id * @param float $pay_fee * @return bool * @throws */ public static function createOrder($mall_id,$user_id,$card_id,$pay_fee = 0.01,$is_sign=1) { $params = [ 'mall_id' => $mall_id, 'user_id' => $user_id, 'order_no' => self::createMerchantOrderNo(), 'pay_fee' => $pay_fee, 'bank_card_id' => $card_id, 'title' => $is_sign == 1 ? '签约快捷支付' : '解约快捷支付', 'is_sign' => $is_sign ]; $model = self::setData($mall_id, $params); if (false === $model) { return false; } return $model->id; } /** * 生成订单号 * @return null|string */ public static function createMerchantOrderNo() { $order_no = null; while (true) { $order_no = 'FP' . date('YmdHis') . rand(10000, 99999); $exist = self::find()->where(['order_no' => $order_no])->one(); if (!$exist) { break; } } return $order_no; } //支付记录导出 public static function fieldsList($field = null){ $fields = [ 'pay_id' => '支付ID', 'user_id' => '用户ID', 'nickname' => '用户昵称', 'user_mobile' => '用户手机号', 'order_no' => '订单编号', 'pay_trade_no' => '支付订单号', 'type' => '支付类型', 'pay_money' => '支付金额', 'status' => '状态', 'created_at' => '创建时间', ]; if ($field === null) return $fields; $temp = []; foreach ($field as $val) { if (isset($fields[$val])) $temp[$val] = $fields[$val]; } return $temp; } //支付记录导出 public static function exportHandle(array $data) { $download_id = $data['download_id'] ?? 0; $download = Download::findOne(['id' => $download_id]); if ($download) { try { $params = json_decode($download->params,true); $filename = $download->name; $type = $download->type; //查询开始 $order_no = $params['order_no']; $start_time = $params['start_time']; $end_time = $params['end_time']; $user_id = $params['user_id']; $user_keyword = $params['user_keyword']; $out_trade_no = $params['out_trade_no']; $pay_type = $params['pay_type']; $pay_records = PaymentTrade::find(); $pay_records->where(['mall_id'=>$params['mall_id']]); if (empty($pay_type)) { $pay_records->andwhere(['in','pay_type',[7,8]]); } else { if (!in_array($pay_type, [7, 8])) { //return $this->error('参数错误'); } $pay_records->andwhere(['=','pay_type',$pay_type]); } if (!empty($start_time)) $pay_records->andwhere(['>=', 'created_at', strtotime($start_time . '00:00:00')]); if (!empty($end_time)) $pay_records->andwhere(['<=', 'created_at', strtotime($end_time . ' 23:59:59')]); if (!empty($out_trade_no)) $pay_records->andwhere(['like', 'out_trade_no', $out_trade_no]); if (!empty($user_id)) $pay_records->andwhere(['user_id' => $user_id]); if (!empty($user_keyword)) { $users = User::find() ->select('id,nickname,mobile,avatar_url') ->where(['or', ['like', 'nickname', $user_keyword], ['like', 'mobile', $user_keyword]]) ->asArray() ->indexBy('id') ->all(); $user_ids = array_column($users, 'id'); $pay_records->andwhere(['in','user_id',$user_ids]); } $trade_ids = []; if (!empty($order_no)) { $payment_order_logs = PaymentTradeOrder::find() ->select('trade_id,order_no') ->where(['order_no' => $order_no]) ->asArray() ->indexBy('trade_id') ->all(); $trade_ids = array_column($payment_order_logs, 'trade_id'); $pay_records->andwhere(['in','id',$trade_ids]); } //查询结束 $fields = $params['fields']; $fields_arr = self::fieldsList(); $have_select_field_arr = []; foreach ($fields as $value){ $have_select_field_arr[]=$fields_arr[$value]; } $csv = new CsvTool(); $csv->filename = $filename; $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type); $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC; $csv->header = $have_select_field_arr; // $order_status_list = OrderStatusEnum::getMap(); // $payment_type_list = PayTypeEnum::getMap(); // $shipping_status_list = ShippingStatusEnum::getMap(); foreach ($pay_records->batch(200) as $order_details) { if (empty($users)) { $user_ids = []; foreach($order_details as $key=>$value){ $user_ids[] = $value->user_id; } $users = User::find() ->select('id,nickname,mobile') ->where(['id' => $user_ids, 'status' => StatusEnum::ENABLED]) ->asArray() ->indexBy('id') ->all(); } if (empty($payment_order_logs)) { $trade_ids = []; foreach($order_details as $key=>$value){ $trade_ids[] = $value->id; } $payment_order_logs = PaymentTradeOrder::find() ->select('trade_id,order_no') ->where(['trade_id' => $trade_ids]) ->asArray() ->indexBy('trade_id') ->all(); } $csv->data = array_map(function($order_detail)use($fields,$users,$payment_order_logs){ $row = []; foreach ($fields as $field){ // 收货人地址切割 $user = $users[$order_detail['user_id']] ?? []; $payment_order_log = $payment_order_logs[$order_detail['id']] ?? []; //var_dump($order_detail); switch (true){ case (in_array($field,['created_at'])): $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):''; break; case ($field == 'pay_id'): $row[] = $order_detail['id'] ?:''; break; case ($field == 'user_id'): $row[] = $user['id'] ?:''; break; case ($field == 'nickname'): $row[] = $user['nickname'] ?:''; break; case ($field=='user_mobile'): $row[] = $user['mobile'] ?:''; break; case ($field=='order_no'): $row[] = $payment_order_log['order_no']; break; case ($field=='pay_trade_no'): $row[] = $order_detail['out_trade_no'] ?:''; break; case ($field=='type'): $row[] = $order_detail['pay_type']==8?'聚合支付':'快捷支付'; break; case ($field == 'pay_money'): $row[] = $order_detail['pay_fee'] ?:''; break; case ($field=='status'): $row[] = $order_detail['is_pay']==1?'已付款':'未付款'; break; default: $row[] = !empty($order_detail[$field])?$order_detail[$field]:''; } //var_dump($row); } return $row; },$order_details); $csv->export(); } $csv->updateDown($download,$params['mall_id']); return true; } catch (\Exception $e) { $download->status = 3; $res = $download->save(); // var_dump($e->getMessage()); self::setStaticError($e->getMessage()); return $e->getMessage(); } } } //代付记录导出 public static function fieldsListPay($field = null){ $fields = [ 'pay_id' => '代支付ID', 'user_id' => '用户ID', 'nickname' => '用户昵称', 'user_mobile' => '用户手机号', 'receive_account' => '收款账号', 'receive_name' => '收款姓名', 'account_type_text' => '收款账号类型', 'merchant_order_no' => '订单号', 'pay_money' => '金额', 'status' => '状态', 'created_at' => '创建时间', 'updated_at' => '到账时间', ]; if ($field === null) return $fields; $temp = []; foreach ($field as $val) { if (isset($fields[$val])) $temp[$val] = $fields[$val]; } return $temp; } //代付记录导出 public static function exportHandlePay(array $data) { $download_id = $data['download_id'] ?? 0; $download = Download::findOne(['id' => $download_id]); if ($download) { try { $params = json_decode($download->params,true); $filename = $download->name; $type = $download->type; //查询开始 $order_no = $params['order_no']; $start_time = $params['start_time']; $end_time = $params['end_time']; $receive_keyword = $params['receive_keyword']; $account_type = $params['account_type']; $pay_records = PaidSinglePayLog::find(); $pay_records->where(['mall_id'=>$params['mall_id']]); if (!empty($start_time)) $pay_records->andWhere(['>=', 'created_at', strtotime($start_time . '00:00:00')]); if (!empty($end_time)) $pay_records->andWhere(['<=', 'created_at', strtotime($end_time . ' 23:59:59')]); if (!empty($order_no)) $pay_records->andWhere(['like', 'merchant_order_no', $order_no]); if (!empty($receive_keyword)) { $pay_records->andWhere(['or', ['like', 'receive_name', $receive_keyword], ['like', 'receive_account', $receive_keyword]]); } if (!empty($account_type)) $pay_records->andWhere(['account_type' => $account_type]); $handle_status_map = AddonsJoinPayEnum::getHandleStatusMap(); $account_type_map = AddonsJoinPayEnum::getAccountTypeMap(); //查询结束 $fields = $params['fields']; $fields_arr = self::fieldsList(); $have_select_field_arr = []; foreach ($fields as $value){ $have_select_field_arr[]=$fields_arr[$value]; } $csv = new CsvTool(); $csv->filename = $filename; $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type); $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC; $csv->header = $have_select_field_arr; // $order_status_list = OrderStatusEnum::getMap(); // $payment_type_list = PayTypeEnum::getMap(); // $shipping_status_list = ShippingStatusEnum::getMap(); foreach ($pay_records->batch(200) as $order_details) { $order_nos = []; $store_withdraw_order_no_arr = []; $mch_withdraw_order_no_arr = []; foreach ($order_details['list'] as $item){ switch ($item['source']){ case '2': $store_withdraw_order_no_arr[]=$item['order_no']; break; case '3': $mch_withdraw_order_no_arr[]=$item['order_no']; break; default: $order_nos[]=$item['order_no']; } } $user_ids = []; $withdraw_logs = []; $store_withdraw_logs = []; if(!empty($order_nos)){ $withdraw_logs = UserWithdrawLog::find() ->select('order_no,user_id') ->where(['mall_id' => $params['mall_id'], 'order_no' => $order_nos, 'type' => WithdrawWayEnum::JOINPAY]) ->indexBy('order_no') ->asArray() ->all(); $user_ids = array_merge($user_ids,array_column($withdraw_logs, 'user_id')); } if(!empty($store_withdraw_order_no_arr)){ if(MallAddons::isInstall($download->mall_id,'Store')){ $store_withdraw_logs = StoreWithdrawLog::lists(['where'=>[['order_no'=>$store_withdraw_order_no_arr]],'index'=>'order_no']); $user_ids = array_merge($user_ids,array_column($store_withdraw_logs, 'user_id')); } } if(!empty($mch_withdraw_order_no_arr)){ if(MallAddons::isInstall($download->mall_id,'Mch')){ $mch_withdraw_logs = MchWithdrawLog::lists(['where'=>[['order_no'=>$store_withdraw_order_no_arr]],'index'=>'order_no']); $user_ids = array_merge($user_ids,array_column($mch_withdraw_logs, 'user_id')); } } $users = User::find() ->select('id,nickname,mobile') ->where(['mall_id' => $params['mall_id'], 'status' => StatusEnum::ENABLED, 'id' =>$user_ids]) ->indexBy('id') ->asArray() ->all(); $handle_status_map = AddonsJoinPayEnum::getHandleStatusMap(); $account_type_map = AddonsJoinPayEnum::getAccountTypeMap(); $csv->data = array_map(function($order_detail)use($fields,$users,$withdraw_logs,$store_withdraw_logs,$mch_withdraw_logs,$handle_status_map,$account_type_map){ $row = []; //var_dump($order_detail); foreach ($fields as $field){ // 收货人地址切割 switch ($order_detail['source']){ case '2': $withdraw_log = $store_withdraw_logs[$order_detail['order_no']] ?? []; break; case '3': $withdraw_log = $mch_withdraw_logs[$order_detail['order_no']] ?? []; break; default: $withdraw_log = $withdraw_logs[$order_detail['order_no']] ?? []; } $user_id = $withdraw_log['user_id'] ?? 0; $user = $users[$user_id] ?? []; // var_dump($user); switch (true){ case (in_array($field,['created_at'])): $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):''; break; case ($field == 'pay_id'): $row[] = $order_detail['id'] ?:''; break; case ($field == 'user_id'): $row[] = $user['id'] ?:''; break; case ($field == 'nickname'): $row[] = $user['nickname'] ?:''; break; case ($field=='user_mobile'): $row[] = $user['mobile'] ?:''; break; case ($field=='receive_account'): $row[] = $order_detail['receive_account']; break; case ($field=='receive_name'): $row[] = $order_detail['receive_name'] ?:''; break; case ($field=='account_type_text'): $row[] = $account_type_map[$order_detail['account_type']] ?:''; break; case ($field == 'merchant_order_no'): $row[] = $order_detail['merchant_order_no'] ?:''; break; case ($field == 'pay_money'): $row[] = floatval($order_detail['amount']) ?:''; break; case ($field == 'updated_at'): $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):''; break; case ($field=='status'): $row[] = $handle_status_map[$order_detail['status']]; break; default: $row[] = !empty($order_detail[$field])?$order_detail[$field]:''; } //var_dump($row); } return $row; },$order_details); $csv->export(); } $csv->updateDown($download,$params['mall_id']); return true; } catch (\Exception $e) { $download->status = 3; $res = $download->save(); //var_dump($e->getMessage()); self::setStaticError($e->getMessage()); return $e->getMessage(); } } } public static function uploadShippingInfo($order_express_id){ try { $order_express_model = OrderExpress::findOne(['id'=>$order_express_id]); if(empty($order_express_model)) throw new \Exception("order_express_id:{$order_express_id},商品订单物流信息不存在"); $order_model = Order::findOne(['id'=>$order_express_model['order_id']]); if(empty($order_model)) throw new Exception("order_id:".$order_express_model['order_id'].",order_model不存在"); $mall_id = $order_model['mall_id']; $order_detail_ids = $order_express_model['order_detail_ids']; $order_detail_list = OrderDetail::lists(['where'=>[['id'=>$order_detail_ids]]]); if(empty($order_detail_list)) throw new Exception("order_detail_ids:".$order_express_model['order_detail_ids'].",订单详情不存在"); $payment_trade_order_model = PaymentTradeOrder::findOne(['order_no'=>$order_model['order_no'],'is_pay'=>1]); if(empty($payment_trade_order_model)) throw new Exception("order_no:".$order_model['order_no'].",payment_trade_order_model不存在"); $pay_type = [PayTypeEnum::JOINPAY]; $trade_type = ['WEIXIN_XCX']; $payment_trade_model = PaymentTrade::findOne(['id'=>$payment_trade_order_model['trade_id']]); if($payment_trade_model['is_pay_group']){ //组合支付,查询对应的子流水 $payment_trade_model = PaymentTrade::findOne(['parent_trade_id'=>$payment_trade_order_model['trade_id'],'pay_type'=>$pay_type,'trade_type'=>$trade_type]); }else{ $payment_trade_model = PaymentTrade::findOne(['id'=>$payment_trade_order_model['trade_id'],'pay_type'=>$pay_type,'trade_type'=>$trade_type]); } if(empty($payment_trade_model)) throw new Exception("trade_id:".$payment_trade_order_model['trade_id'].",payment_trade_model不存在"); switch ($payment_trade_model['pay_type']){ case PayTypeEnum::JOINPAY: $pay_type = \addons\JoinPay\common\enums\JoinPayTypeEnum::action(\addons\JoinPay\common\enums\JoinPayTypeEnum::JOINPAY); $config =\addons\JoinPay\common\global_func\payment\Payment::getConfig($mall_id, $pay_type); $pay = \Yii::$app->payment->joinpay($config); $result = $pay->query($order_model['out_trade_no']); if(empty($result['r6_BankTrxNo'])){ return true; } $payment_trade_model['third_trade_no'] = $result['r6_BankTrxNo']; //微信支付 $delivery_mode = 1; $order_detail_rows = OrderDetail::lists(['where'=>[['order_id'=>$order_model['id']]]]); if(count($order_detail_rows)!=count($order_detail_ids)){ $delivery_mode = 2; } $user_info_model = UserInfo::findOne(['mall_id'=>$mall_id,'user_id'=>$payment_trade_model['user_id'],'platform'=>'mp-wx','status' => StatusEnum::ENABLED]); if(empty($user_info_model))throw new Exception("user_id,mp-wx:".$payment_trade_model['user_id'].",user_info_model不存在"); $openid = $user_info_model['openid']; $item_desc = ''; foreach ($order_detail_list as $item){ $item_desc.=$item['goods_name'].','; } $is_all_delivered = false; if($delivery_mode==2){ $order_detail_id_arr = []; $order_express_list = OrderExpress::lists(['where'=>[['order_id'=>$order_express_model['order_id']]]]); foreach ($order_express_list as $val){ $temp = json_decode($val['order_detail_ids'],true); $order_detail_id_arr = array_merge($order_detail_id_arr,$temp); } if(count($order_detail_rows)==count($order_detail_id_arr)){ $is_all_delivered = true; } } $item_desc =trim($item_desc,','); $params['mall_id'] = $mall_id; $params['openid'] = $openid; $params['third_trade_no'] = $payment_trade_model['third_trade_no']; $params['delivery_mode'] = $delivery_mode; $params['is_all_delivered'] = $is_all_delivered; if(!empty($order_express_model['express_no'])){ $logistics_type =1; $params['tracking_no'] = $order_express_model['express_no']; $params['express_company'] = $order_express_model['express_name']; }else{ $logistics_type = 4; } $params['logistics_type'] = $logistics_type; $params['receiver_contact'] = substr_replace($order_model['mobile'], '****', 3, 4); $params['item_desc'] = mb_substr($item_desc,0,120); WechatMiniProgramLogic::uploadShippingInfoWechat($params); break; } }catch (\Exception $e){ var_dump('uploadShippingInfo:'.$e->getMessage()); } } }