| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604 |
- <?php
- namespace addons\JoinPay\common\models;
- use addons\JoinPay\common\enums\AddonsJoinPayEnum;
- use addons\Mch\common\models\MchWithdrawLog;
- use addons\Store\common\models\StoreWithdrawLog;
- use common\components\export\CsvTool;
- use common\enums\DownloadEnum;
- use common\enums\StatusEnum;
- use common\enums\WithdrawWayEnum;
- use common\models\common\Download;
- use common\models\common\PaidSinglePayLog;
- use common\models\common\PaymentTrade;
- use common\models\common\PaymentTradeOrder;
- use common\models\mall\MallAddons;
- use common\models\user\User;
- use common\models\user\UserWithdrawLog;
- use Yii;
- use common\enums\PayTypeEnum;
- use common\logic\wechat\WechatMiniProgramLogic;
- use common\models\order\Order;
- use common\models\order\OrderDetail;
- use common\models\order\OrderExpress;
- use common\models\user\UserInfo;
- use Exception;
- /**
- * This is the model class for table "{{%addons_joinpay_fastpay_order}}".
- *
- * @property int $id
- * @property int $mall_id 平台id
- * @property int $user_id 用户id
- * @property string $order_no 订单号,系统生成
- * @property float $amount 订单金额
- * @property float $pay_fee 订单金额
- * @property int $bank_card_id 开通快捷支付银行卡id
- * @property string $title 订单title
- * @property string $jp_order_no 汇聚平台流水号
- * @property int $is_sign 是否签约,1-是,0-否
- * @property int $status 状态[-1:删除;0:禁用;1启用]
- * @property int $created_at 添加时间戳
- * @property int $updated_at 更新时间戳
- */
- class JoinpayFastpayOrder extends \common\models\base\BaseActiveRecord
- {
- /**
- * {@inheritdoc}
- */
- public static function tableName()
- {
- return '{{%addons_joinpay_fastpay_order}}';
- }
- /**
- * {@inheritdoc}
- */
- public function rules()
- {
- return [
- [['mall_id', 'user_id', 'bank_card_id', 'is_sign', 'status', 'created_at', 'updated_at'], 'integer'],
- [['pay_fee'], 'number'],
- [['order_no'], 'string', 'max' => 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());
- }
- }
- }
|