andWhere(['mini_id' => $this->mini_id, 'is_delete' => 0]); $this->publish_end_time && $query->andWhere(['<=', 'publish_start_time', $this->publish_end_time]); $this->publish_start_time && $query->andWhere(['>=', 'publish_end_time', $this->publish_start_time]); strlen($this->status) && $query->andWhere(['status' => $this->status]); $count = $query->count(); $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->pageSize, 'page' => $this->page - 1]); $list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('id DESC')->all(); $newList = []; foreach ($list as $item) { $alipayRes = $this->queryAlipayOV($item->alipay_activity_id); if($alipayRes['code'] == 0){ $status = 0; if($alipayRes['data']->activity_base_info->activity_status == 'ACTIVE'){ $status = 1; } if($alipayRes['data']->activity_base_info->activity_status == 'FINISHED'){ $status = 2; } if($status != intval($item->status)){ $item->status = $status; $item->save(); } } $newList[] = array_merge($item->attributes, (array)$alipayRes['data']); } return [ 'code' => 0, 'msg' => 'ok', 'count' => $count, 'data' => $newList, ]; } public function listCanSendByUser($userId = '') { $query = AlipayAcitvityVoucherCoupon::find(); $query->andWhere(['mini_id' => $this->mini_id, 'is_delete' => 0]); $query->andWhere(['<=', 'publish_start_time', date('Y-m-d H:i:s')]); $query->andWhere(['>=', 'publish_end_time', date('Y-m-d H:i:s')]); $query->andWhere(['status' => 1]); $count = $query->count(); $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->pageSize, 'page' => $this->page - 1]); $list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('id DESC')->all(); $aidList = []; $newList = []; foreach ($list as $item) { $alipayRes = $this->queryAlipayOV($item->alipay_activity_id); $aidList[] = $item->alipay_activity_id; $newList[] = array_merge($item->attributes, (array)$alipayRes['data']); } $resConsult = $this->activityConsult($userId, $aidList); if($resConsult['code'] == 0){ foreach ($newList as &$item) { foreach($resConsult['data']->consult_result_info_list as $ritem){ if($ritem->activity_id == $item['alipay_activity_id']){ $item['consult_result_code'] = $ritem->consult_result_code; } } } } return [ 'code' => 0, 'msg' => 'ok', 'count' => $count, 'data' => $newList, 'resConsult' => $resConsult, ]; } public function queryAlipayOV($activity_id = 0) { $form = new AlipayThirdForm(); $form->mini_id = $this->mini_id; $res = $form->AlipayMarketingActivityVoucherQuery($activity_id); return $res; } public function activityConsult($user_id = 0, $activity_ids = []) { $form = new AlipayThirdForm(); $form->mini_id = $this->mini_id; $res = $form->AlipayMarketingActivityConsult($user_id, $activity_ids); return $res; } //创建支付券活动 public function remove() { $condition = [ 'mini_id' => $this->mini_id, 'alipay_activity_id' => $this->alipay_activity_id, ]; $model = AlipayAcitvityVoucherCoupon::findOne($condition); if(!$model){ return [ 'code' => 1, 'msg' => '参数错误', ]; } $alipayRes = $this->queryAlipayOV($this->alipay_activity_id); if($alipayRes['code'] == 0){ if($alipayRes['data']->activity_base_info->activity_status != 'FINISHED'){ return [ 'code' => 1, 'msg' => '支付券活动未停止,禁止删除', ]; } }else{ \Yii::error([__METHOD__, $this->mini_id, $this->alipay_activity_id, $alipayRes]); return $alipayRes; } $model->is_delete = 1; if(!$model->save()){ return [ 'code' => 1, 'msg' => '操作失败', ]; } return [ 'code' => 0, 'msg' => 'ok', ]; } //修改支付券活动 public function modify($activity_id, $publish_end_time = null, $valid_end_time = null, $valid_days_after_receive = null) { $condition = [ 'mini_id' => $this->mini_id, 'alipay_activity_id' => $activity_id, ]; $t = \Yii::$app->db->beginTransaction(); $model = AlipayAcitvityVoucherCoupon::findOne($condition); $publish_end_time && $model->publish_end_time = $publish_end_time; $valid_end_time && $model->end_time = $valid_end_time; $valid_days_after_receive && $model->expire_day = $valid_days_after_receive; $res = $model->save(); if(!$res){ \Yii::error(['model->save()', $model, $model->errors[0]]); $t->rollBack(); return [ 'code' => 1, 'msg' => 'modelSave错误,' . $model->errors[0], ]; } $form = new AlipayThirdForm(); $form->mini_id = $this->mini_id; $biz_content = []; $biz_content['out_biz_no'] = microtime(true); $biz_content['activity_base_info']['activity_id'] = $activity_id; $publish_end_time && $biz_content['voucher_send_mode_info']['voucher_send_rule_info']['publish_end_time'] = $publish_end_time; $valid_end_time && $biz_content['voucher_use_rule_info']['voucher_use_time_info']['absolute_period_info']['valid_end_time'] = $valid_end_time; $valid_days_after_receive && $biz_content['voucher_use_rule_info']['voucher_use_time_info']['relative_period_info']['valid_days_after_receive'] = $valid_days_after_receive; $res = $form->AlipayMarketingActivityVoucherModify($biz_content); if($res['code'] !== 0){ $t->rollBack(); return $res; } $t->commit(); return $res; } //创建支付券活动 public function create($params = []) { if(!$params['name']){ $id = $params['券参数']; $coupon = Coupon::findOne($id)->toArray(); $params = array_merge($coupon, $params); } if (isset($params['begin_time']) && $params['begin_time']) { $params['begin_time'] = strtotime($params['begin_time']); } if (isset($params['end_time']) && $params['end_time']) { $params['end_time'] = strtotime($params['end_time']); } $t = \Yii::$app->db->beginTransaction(); $res = $this->modelSave($params); if($res['code'] != 0){ $t->rollBack(); return [ 'code' => 1, 'msg' => 'modelSave错误,' . $res['msg'], ]; } $model = $res['model']; $form = new AlipayThirdForm(); $form->mini_id = $this->mini_id; $biz_content = []; $biz_content = $this->modelToBiz($params, $biz_content); $res = $form->AlipayMarketingActivityVoucherCreate($biz_content); if($res['code'] !== 0){ $t->rollBack(); return $res; } $activity_id = $res['data']->activity_id; $model->alipay_activity_id = $activity_id; if(!$model->save()){ \Yii::error(['model->save(alipay_activity_id)', $model, $model->errors[0]]); } $t->commit(); return $res; } public function modelSave($params) { $model = new AlipayAcitvityVoucherCoupon(); $model->attributes = $params; $model->mini_id = $this->mini_id; $model->store_id = $this->store_id; $model->publish_start_time = $params['publish_start_time']; $model->publish_end_time = $params['publish_end_time']; if(!$model->save()){ return [ 'code' => 1, 'msg' => $model->errors[0], ]; } return [ 'code' => 0, 'msg' => 'ok', 'model' => $model, ]; } public function modelToBiz($coupon, $biz_content = []) { $biz_content['merchant_access_mode'] = 'AGENCY_MODE'; $biz_content['activity_base_info']['activity_name'] = $coupon['name']; $biz_content['voucher_send_mode_info']['voucher_send_mode'] = 'DIRECT_SEND_MODE'; $biz_content['voucher_send_mode_info']['voucher_send_rule_info'] = [ 'quantity' => $coupon['quantity'] ?? 0, 'quantity_limit_per_user' => $coupon['quantity_limit_per_user'], 'quantity_limit_per_user_period_type' => $coupon['quantity_limit_per_user_period_type'], 'publish_start_time' => $coupon['publish_start_time'], 'publish_end_time' => $coupon['publish_end_time'], ]; //满减 if($coupon['discount_type'] == 2){ $biz_content['voucher_deduct_info'] = [ 'voucher_type' => 'FIX_VOUCHER', 'fix_voucher_info' => [ 'amount' => $coupon['sub_price'], 'floor_amount' => $coupon['min_price'], ], ]; } //折扣 if($coupon['discount_type'] == 1){ $biz_content['voucher_deduct_info'] = [ 'voucher_type' => 'DISCOUNT_VOUCHER', 'discount_voucher_info' => [ 'discount' => $coupon['discount'], 'ceiling_amount' => $coupon['ceiling_amount'] ?? 5000.00, 'floor_amount' => $coupon['min_price'], ], ]; } //券可用范围 $biz_content['voucher_available_scope_info']['voucher_available_account_info'] = [ 'available_pids' => [], ]; $biz_content['voucher_available_scope_info']['voucher_available_app_info'] = [ 'available_app_ids' => [], ]; $biz_content['voucher_available_scope_info']['voucher_available_goods_info'] = [ 'goods_name' => $coupon['goods_name'], 'goods_description' => $coupon['goods_description'], 'available_goods_sku_ids' => $coupon['goods_ids'], ]; //券核销限制 if($coupon['expire_type'] == 1){ //相对时间 $biz_content['voucher_use_rule_info']['voucher_use_time_info'] = [ 'period_type' => 'RELATIVE', 'relative_period_info' => [ 'wait_days_after_receive' => $coupon['wait_days_after_receive'] ?? 0, 'valid_days_after_receive' => $coupon['expire_day'], ], ]; } if($coupon['expire_type'] == 2){ //绝对时间 $biz_content['voucher_use_rule_info']['voucher_use_time_info'] = [ 'period_type' => 'ABSOLUTE', 'absolute_period_info' => [ 'valid_begin_time' => date('Y-m-d H:i:s', $coupon['begin_time']), 'valid_end_time' => date('Y-m-d H:i:s', $coupon['end_time']), ], ]; } //券引导信息 $biz_content['voucher_customer_guide_info']['voucher_use_guide_info']['use_guide_mode'] = ['MINI_APP']; $biz_content['voucher_customer_guide_info']['voucher_use_guide_info']['mini_app_use_guide_info']['mini_app_url'] = 'alipays://platformapi/startapp?appId=[appId]&page=[page]&query=[query]'; //资金信息 $biz_content['voucher_budget_supply_info'] = [ 'budget_type' => 'NO_CASH', ]; //券展示信息 $biz_content['voucher_display_pattern_info'] = [ 'brand_name' => $coupon['voucher_display_pattern_info']['brand_name'], 'voucher_description' => $coupon['voucher_display_pattern_info']['voucher_description'], 'customer_service_mobile' => $coupon['voucher_display_pattern_info']['customer_service_mobile'], 'voucher_image' => $coupon['voucher_display_pattern_info']['voucher_image'], 'voucher_detail_images' => $coupon['voucher_display_pattern_info']['voucher_detail_images'], ]; $biz_content['out_biz_no'] = date('Y-m-dH:i:s') . rand(100000, 999999); return $biz_content; } }