HuifuPayFastpayOrder.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329
  1. <?php
  2. namespace addons\HuifuPay\common\models;
  3. use addons\Mch\common\models\MchWithdrawLog;
  4. use addons\Store\common\models\StoreWithdrawLog;
  5. use common\components\export\CsvTool;
  6. use common\enums\DownloadEnum;
  7. use common\enums\StatusEnum;
  8. use common\enums\WithdrawWayEnum;
  9. use common\models\common\Download;
  10. use common\models\common\PaidSinglePayLog;
  11. use common\models\common\PaymentTrade;
  12. use common\models\common\PaymentTradeOrder;
  13. use common\models\mall\MallAddons;
  14. use common\models\user\User;
  15. use common\models\user\UserWithdrawLog;
  16. use Yii;
  17. /**
  18. * This is the model class for table "{{%addons_joinpay_fastpay_order}}".
  19. *
  20. * @property int $id
  21. * @property int $mall_id 平台id
  22. * @property int $user_id 用户id
  23. * @property string $order_no 订单号,系统生成
  24. * @property float $amount 订单金额
  25. * @property float $pay_fee 订单金额
  26. * @property int $bank_card_id 开通快捷支付银行卡id
  27. * @property string $title 订单title
  28. * @property string $hf_order_no 汇聚平台流水号
  29. * @property int $is_sign 是否签约,1-是,0-否
  30. * @property int $status 状态[-1:删除;0:禁用;1启用]
  31. * @property int $created_at 添加时间戳
  32. * @property int $updated_at 更新时间戳
  33. */
  34. class HuifuPayFastpayOrder extends \common\models\base\BaseActiveRecord
  35. {
  36. /**
  37. * {@inheritdoc}
  38. */
  39. public static function tableName()
  40. {
  41. return '{{%addons_huifupay_fastpay_order}}';
  42. }
  43. /**
  44. * {@inheritdoc}
  45. */
  46. public function rules()
  47. {
  48. return [
  49. [['mall_id', 'user_id', 'bank_card_id', 'is_sign', 'status', 'created_at', 'updated_at'], 'integer'],
  50. [['pay_fee'], 'number'],
  51. [['order_no'], 'string', 'max' => 32],
  52. [['title', 'hf_order_no'], 'string', 'max' => 64],
  53. // [['order_no'], 'unique'], // mycat 环境不能使用此规则
  54. ];
  55. }
  56. /**
  57. * {@inheritdoc}
  58. */
  59. public function attributeLabels()
  60. {
  61. return [
  62. 'id' => 'ID',
  63. 'mall_id' => '商城 ID',
  64. 'user_id' => '会员 ID',
  65. 'order_no' => '订单编号',
  66. 'pay_fee' => '订单金额',
  67. 'bank_card_id' => '开通快捷支付银行卡id',
  68. 'title' => '订单title',
  69. 'hf_order_no' => '汇付平台流水号',
  70. 'is_sign' => '是否签约,1-是,0-否',
  71. 'status' => '状态[-1:删除;0:禁用;1启用]',
  72. 'created_at' => 'Created At',
  73. 'updated_at' => 'Updated At',
  74. ];
  75. }
  76. public static function setData(int $mall_id, array $data)
  77. {
  78. if (empty($data['id'])) {
  79. $model = new self();
  80. $model->loadDefaultValues();
  81. $model->mall_id = $mall_id;
  82. } else {
  83. $model = self::findOne(['mall_id' => $mall_id, 'id' => $data['id'], 'status' => StatusEnum::ENABLED]);
  84. if (empty($model)) throw new \Exception('数据记录异常');
  85. }
  86. foreach ($data as $key => $val) {
  87. $model->$key = $val;
  88. }
  89. if (!$model->save()) {
  90. self::$static_error = '保存数据失败:' . $model->getErrorMessage();
  91. return false;
  92. }
  93. return $model;
  94. }
  95. /**
  96. * 生成开通快捷支付订单
  97. * @param $mall_id
  98. * @param $user_id
  99. * @param $card_id
  100. * @param float $pay_fee
  101. * @return bool
  102. * @throws
  103. */
  104. public static function createOrder($mall_id,$user_id,$card_id,$pay_fee = 0.01,$is_sign=1)
  105. {
  106. $params = [
  107. 'mall_id' => $mall_id,
  108. 'user_id' => $user_id,
  109. 'order_no' => self::createMerchantOrderNo(),
  110. 'pay_fee' => $pay_fee,
  111. 'bank_card_id' => $card_id,
  112. 'title' => $is_sign == 1 ? '签约快捷支付' : '解约快捷支付',
  113. 'is_sign' => $is_sign
  114. ];
  115. $model = self::setData($mall_id, $params);
  116. if (false === $model) {
  117. return false;
  118. }
  119. return $model->id;
  120. }
  121. /**
  122. * 生成订单号
  123. * @return null|string
  124. */
  125. public static function createMerchantOrderNo()
  126. {
  127. $order_no = null;
  128. while (true) {
  129. $order_no = 'HF' . date('YmdHis') . rand(10000, 99999);
  130. $exist = self::find()->where(['order_no' => $order_no])->one();
  131. if (!$exist) {
  132. break;
  133. }
  134. }
  135. return $order_no;
  136. }
  137. //支付记录导出
  138. public static function fieldsList($field = null){
  139. $fields = [
  140. 'pay_id' => '支付ID',
  141. 'user_id' => '用户ID',
  142. 'nickname' => '用户昵称',
  143. 'user_mobile' => '用户手机号',
  144. 'order_no' => '订单编号',
  145. 'pay_trade_no' => '支付订单号',
  146. 'hf_order_no' => '汇付流水号',
  147. 'type' => '支付类型',
  148. 'pay_money' => '支付金额',
  149. 'status' => '状态',
  150. 'created_at' => '创建时间',
  151. ];
  152. if ($field === null) return $fields;
  153. $temp = [];
  154. foreach ($field as $val) {
  155. if (isset($fields[$val])) $temp[$val] = $fields[$val];
  156. }
  157. return $temp;
  158. }
  159. //支付记录导出
  160. public static function exportHandle(array $data) {
  161. $download_id = $data['download_id'] ?? 0;
  162. $download = Download::findOne(['id' => $download_id]);
  163. if ($download) {
  164. try {
  165. $params = json_decode($download->params,true);
  166. $filename = $download->name;
  167. $type = $download->type;
  168. //查询开始
  169. $order_no = $params['order_no'];
  170. $start_time = $params['start_time'];
  171. $end_time = $params['end_time'];
  172. $user_id = $params['user_id'];
  173. $user_keyword = $params['user_keyword'];
  174. $out_trade_no = $params['out_trade_no'];
  175. $pay_type = $params['pay_type'];
  176. $pay_records = PaymentTrade::find();
  177. $pay_records->where(['mall_id'=>$params['mall_id']]);
  178. if (empty($pay_type)) {
  179. $pay_records->andwhere(['in','pay_type',[18]]);
  180. } else {
  181. if (!in_array($pay_type, [18])) {
  182. //return $this->error('参数错误');
  183. }
  184. $pay_records->andwhere(['=','pay_type',$pay_type]);
  185. }
  186. if (!empty($start_time)) $pay_records->andwhere(['>=', 'created_at', strtotime($start_time . '00:00:00')]);
  187. if (!empty($end_time)) $pay_records->andwhere(['<=', 'created_at', strtotime($end_time . ' 23:59:59')]);
  188. if (!empty($out_trade_no)) $pay_records->andwhere(['like', 'out_trade_no', $out_trade_no]);
  189. if (!empty($user_id)) $pay_records->andwhere(['user_id' => $user_id]);
  190. if (!empty($user_keyword)) {
  191. $users = User::find()
  192. ->select('id,nickname,mobile,avatar_url')
  193. ->where(['or', ['like', 'nickname', $user_keyword], ['like', 'mobile', $user_keyword]])
  194. ->asArray()
  195. ->indexBy('id')
  196. ->all();
  197. $user_ids = array_column($users, 'id');
  198. $pay_records->andwhere(['in','user_id',$user_ids]);
  199. }
  200. $trade_ids = [];
  201. if (!empty($order_no)) {
  202. $payment_order_logs = PaymentTradeOrder::find()
  203. ->select('trade_id,order_no')
  204. ->where(['order_no' => $order_no])
  205. ->asArray()
  206. ->indexBy('trade_id')
  207. ->all();
  208. $trade_ids = array_column($payment_order_logs, 'trade_id');
  209. $pay_records->andwhere(['in','id',$trade_ids]);
  210. }
  211. //查询结束
  212. $fields = $params['fields'];
  213. $fields_arr = self::fieldsList();
  214. $have_select_field_arr = [];
  215. foreach ($fields as $value){
  216. $have_select_field_arr[]=$fields_arr[$value];
  217. }
  218. $csv = new CsvTool();
  219. $csv->filename = $filename;
  220. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  221. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  222. $csv->header = $have_select_field_arr;
  223. // $order_status_list = OrderStatusEnum::getMap();
  224. // $payment_type_list = PayTypeEnum::getMap();
  225. // $shipping_status_list = ShippingStatusEnum::getMap();
  226. foreach ($pay_records->batch(200) as $order_details) {
  227. if (empty($users)) {
  228. $user_ids = [];
  229. foreach($order_details as $key=>$value){
  230. $user_ids[] = $value->user_id;
  231. }
  232. $users = User::find()
  233. ->select('id,nickname,mobile')
  234. ->where(['id' => $user_ids, 'status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]])
  235. ->asArray()
  236. ->indexBy('id')
  237. ->all();
  238. }
  239. if (empty($payment_order_logs)) {
  240. $trade_ids = [];
  241. foreach($order_details as $key=>$value){
  242. $trade_ids[] = $value->id;
  243. }
  244. $payment_order_logs = PaymentTradeOrder::find()
  245. ->select('trade_id,order_no')
  246. ->where(['trade_id' => $trade_ids])
  247. ->asArray()
  248. ->indexBy('trade_id')
  249. ->all();
  250. }
  251. $csv->data = array_map(function($order_detail)use($fields,$users,$payment_order_logs){
  252. $row = [];
  253. foreach ($fields as $field){
  254. // 收货人地址切割
  255. $user = $users[$order_detail['user_id']] ?? [];
  256. $payment_order_log = $payment_order_logs[$order_detail['id']] ?? [];
  257. //var_dump($order_detail);
  258. switch (true){
  259. case (in_array($field,['created_at'])):
  260. $row[] = !empty($order_detail[$field])?date('Y-m-d H:i:s',$order_detail[$field]):'';
  261. break;
  262. case ($field == 'pay_id'):
  263. $row[] = $order_detail['id'] ?:'';
  264. break;
  265. case ($field == 'user_id'):
  266. $row[] = $user['id'] ?:'';
  267. break;
  268. case ($field == 'nickname'):
  269. $row[] = $user['nickname'] ?: '默认用户';
  270. break;
  271. case ($field=='user_mobile'):
  272. $row[] = $user['mobile'] ?:'';
  273. break;
  274. case ($field=='order_no'):
  275. $row[] = $payment_order_log['order_no'];
  276. break;
  277. case ($field=='pay_trade_no'):
  278. $row[] = $order_detail['out_trade_no'] ?:'';
  279. break;
  280. case ($field=='hf_order_no'):
  281. $row[] = $order_detail['third_trade_no'] ?: '';
  282. break;
  283. case ($field=='type'):
  284. $row[] = $order_detail['pay_type'] == 18 ? '汇付支付':'快捷支付';
  285. break;
  286. case ($field == 'pay_money'):
  287. $row[] = $order_detail['pay_fee'] ?:'';
  288. break;
  289. case ($field=='status'):
  290. $row[] = $order_detail['is_pay']==1?'已付款':'未付款';
  291. break;
  292. default:
  293. $row[] = !empty($order_detail[$field])?$order_detail[$field]:'';
  294. }
  295. //var_dump($row);
  296. }
  297. return $row;
  298. },$order_details);
  299. $csv->export();
  300. }
  301. $csv->updateDown($download,$params['mall_id']);
  302. return true;
  303. } catch (\Exception $e) {
  304. $download->status = 3;
  305. $res = $download->save();
  306. // var_dump($e->getMessage());
  307. self::setStaticError($e->getMessage());
  308. return $e->getMessage();
  309. }
  310. }
  311. }
  312. }