Voucher.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\models\alipay;
  8. use app\modules\admin\models\AlipayThirdForm;
  9. use app\models\Coupon;
  10. use app\models\User;
  11. use app\models\Store;
  12. use app\models\SaasUser;
  13. use yii\base\Model;
  14. use yii\data\Pagination;
  15. use \app\models\AlipayAcitvityVoucherCoupon;
  16. class Voucher extends Model
  17. {
  18. public $activity_ordervoucher_id;
  19. public $mini_id;
  20. public $alipay_activity_id;
  21. public $store_id;
  22. public $pageSize = 5;
  23. public $page = 1;
  24. public $publish_start_time;
  25. public $publish_end_time;
  26. public $status;
  27. /**
  28. * {@inheritdoc}
  29. */
  30. public function rules()
  31. {
  32. return [
  33. [['store_id', 'mini_id', 'page', 'pageSize'], 'integer'],
  34. [['publish_start_time', 'publish_end_time', 'status'], 'safe'],
  35. ];
  36. }
  37. public function search() {
  38. $query = AlipayAcitvityVoucherCoupon::find();
  39. $query->andWhere(['mini_id' => $this->mini_id, 'is_delete' => 0]);
  40. $this->publish_end_time && $query->andWhere(['<=', 'publish_start_time', $this->publish_end_time]);
  41. $this->publish_start_time && $query->andWhere(['>=', 'publish_end_time', $this->publish_start_time]);
  42. strlen($this->status) && $query->andWhere(['status' => $this->status]);
  43. $count = $query->count();
  44. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->pageSize, 'page' => $this->page - 1]);
  45. $list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('id DESC')->all();
  46. $newList = [];
  47. foreach ($list as $item) {
  48. $alipayRes = $this->queryAlipayOV($item->alipay_activity_id);
  49. if($alipayRes['code'] == 0){
  50. $status = 0;
  51. if($alipayRes['data']->activity_base_info->activity_status == 'ACTIVE'){
  52. $status = 1;
  53. }
  54. if($alipayRes['data']->activity_base_info->activity_status == 'FINISHED'){
  55. $status = 2;
  56. }
  57. if($status != intval($item->status)){
  58. $item->status = $status;
  59. $item->save();
  60. }
  61. }
  62. $newList[] = array_merge($item->attributes, (array)$alipayRes['data']);
  63. }
  64. return [
  65. 'code' => 0,
  66. 'msg' => 'ok',
  67. 'count' => $count,
  68. 'data' => $newList,
  69. ];
  70. }
  71. public function listCanSendByUser($userId = '') {
  72. $query = AlipayAcitvityVoucherCoupon::find();
  73. $query->andWhere(['mini_id' => $this->mini_id, 'is_delete' => 0]);
  74. $query->andWhere(['<=', 'publish_start_time', date('Y-m-d H:i:s')]);
  75. $query->andWhere(['>=', 'publish_end_time', date('Y-m-d H:i:s')]);
  76. $query->andWhere(['status' => 1]);
  77. $count = $query->count();
  78. $pagination = new Pagination(['totalCount' => $count, 'pageSize' => $this->pageSize, 'page' => $this->page - 1]);
  79. $list = $query->limit($pagination->limit)->offset($pagination->offset)->orderBy('id DESC')->all();
  80. $aidList = [];
  81. $newList = [];
  82. foreach ($list as $item) {
  83. $alipayRes = $this->queryAlipayOV($item->alipay_activity_id);
  84. $aidList[] = $item->alipay_activity_id;
  85. $newList[] = array_merge($item->attributes, (array)$alipayRes['data']);
  86. }
  87. $resConsult = $this->activityConsult($userId, $aidList);
  88. if($resConsult['code'] == 0){
  89. foreach ($newList as &$item) {
  90. foreach($resConsult['data']->consult_result_info_list as $ritem){
  91. if($ritem->activity_id == $item['alipay_activity_id']){
  92. $item['consult_result_code'] = $ritem->consult_result_code;
  93. }
  94. }
  95. }
  96. }
  97. return [
  98. 'code' => 0,
  99. 'msg' => 'ok',
  100. 'count' => $count,
  101. 'data' => $newList,
  102. 'resConsult' => $resConsult,
  103. ];
  104. }
  105. public function queryAlipayOV($activity_id = 0) {
  106. $form = new AlipayThirdForm();
  107. $form->mini_id = $this->mini_id;
  108. $res = $form->AlipayMarketingActivityVoucherQuery($activity_id);
  109. return $res;
  110. }
  111. public function activityConsult($user_id = 0, $activity_ids = []) {
  112. $form = new AlipayThirdForm();
  113. $form->mini_id = $this->mini_id;
  114. $res = $form->AlipayMarketingActivityConsult($user_id, $activity_ids);
  115. return $res;
  116. }
  117. //创建支付券活动
  118. public function remove() {
  119. $condition = [
  120. 'mini_id' => $this->mini_id,
  121. 'alipay_activity_id' => $this->alipay_activity_id,
  122. ];
  123. $model = AlipayAcitvityVoucherCoupon::findOne($condition);
  124. if(!$model){
  125. return [
  126. 'code' => 1,
  127. 'msg' => '参数错误',
  128. ];
  129. }
  130. $alipayRes = $this->queryAlipayOV($this->alipay_activity_id);
  131. if($alipayRes['code'] == 0){
  132. if($alipayRes['data']->activity_base_info->activity_status != 'FINISHED'){
  133. return [
  134. 'code' => 1,
  135. 'msg' => '支付券活动未停止,禁止删除',
  136. ];
  137. }
  138. }else{
  139. \Yii::error([__METHOD__, $this->mini_id, $this->alipay_activity_id, $alipayRes]);
  140. return $alipayRes;
  141. }
  142. $model->is_delete = 1;
  143. if(!$model->save()){
  144. return [
  145. 'code' => 1,
  146. 'msg' => '操作失败',
  147. ];
  148. }
  149. return [
  150. 'code' => 0,
  151. 'msg' => 'ok',
  152. ];
  153. }
  154. //修改支付券活动
  155. public function modify($activity_id, $publish_end_time = null, $valid_end_time = null, $valid_days_after_receive = null) {
  156. $condition = [
  157. 'mini_id' => $this->mini_id,
  158. 'alipay_activity_id' => $activity_id,
  159. ];
  160. $t = \Yii::$app->db->beginTransaction();
  161. $model = AlipayAcitvityVoucherCoupon::findOne($condition);
  162. $publish_end_time && $model->publish_end_time = $publish_end_time;
  163. $valid_end_time && $model->end_time = $valid_end_time;
  164. $valid_days_after_receive && $model->expire_day = $valid_days_after_receive;
  165. $res = $model->save();
  166. if(!$res){
  167. \Yii::error(['model->save()', $model, $model->errors[0]]);
  168. $t->rollBack();
  169. return [
  170. 'code' => 1,
  171. 'msg' => 'modelSave错误,' . $model->errors[0],
  172. ];
  173. }
  174. $form = new AlipayThirdForm();
  175. $form->mini_id = $this->mini_id;
  176. $biz_content = [];
  177. $biz_content['out_biz_no'] = microtime(true);
  178. $biz_content['activity_base_info']['activity_id'] = $activity_id;
  179. $publish_end_time && $biz_content['voucher_send_mode_info']['voucher_send_rule_info']['publish_end_time'] = $publish_end_time;
  180. $valid_end_time && $biz_content['voucher_use_rule_info']['voucher_use_time_info']['absolute_period_info']['valid_end_time'] = $valid_end_time;
  181. $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;
  182. $res = $form->AlipayMarketingActivityVoucherModify($biz_content);
  183. if($res['code'] !== 0){
  184. $t->rollBack();
  185. return $res;
  186. }
  187. $t->commit();
  188. return $res;
  189. }
  190. //创建支付券活动
  191. public function create($params = []) {
  192. if(!$params['name']){
  193. $id = $params['券参数'];
  194. $coupon = Coupon::findOne($id)->toArray();
  195. $params = array_merge($coupon, $params);
  196. }
  197. if (isset($params['begin_time']) && $params['begin_time']) {
  198. $params['begin_time'] = strtotime($params['begin_time']);
  199. }
  200. if (isset($params['end_time']) && $params['end_time']) {
  201. $params['end_time'] = strtotime($params['end_time']);
  202. }
  203. $t = \Yii::$app->db->beginTransaction();
  204. $res = $this->modelSave($params);
  205. if($res['code'] != 0){
  206. $t->rollBack();
  207. return [
  208. 'code' => 1,
  209. 'msg' => 'modelSave错误,' . $res['msg'],
  210. ];
  211. }
  212. $model = $res['model'];
  213. $form = new AlipayThirdForm();
  214. $form->mini_id = $this->mini_id;
  215. $biz_content = [];
  216. $biz_content = $this->modelToBiz($params, $biz_content);
  217. $res = $form->AlipayMarketingActivityVoucherCreate($biz_content);
  218. if($res['code'] !== 0){
  219. $t->rollBack();
  220. return $res;
  221. }
  222. $activity_id = $res['data']->activity_id;
  223. $model->alipay_activity_id = $activity_id;
  224. if(!$model->save()){
  225. \Yii::error(['model->save(alipay_activity_id)', $model, $model->errors[0]]);
  226. }
  227. $t->commit();
  228. return $res;
  229. }
  230. public function modelSave($params) {
  231. $model = new AlipayAcitvityVoucherCoupon();
  232. $model->attributes = $params;
  233. $model->mini_id = $this->mini_id;
  234. $model->store_id = $this->store_id;
  235. $model->publish_start_time = $params['publish_start_time'];
  236. $model->publish_end_time = $params['publish_end_time'];
  237. if(!$model->save()){
  238. return [
  239. 'code' => 1,
  240. 'msg' => $model->errors[0],
  241. ];
  242. }
  243. return [
  244. 'code' => 0,
  245. 'msg' => 'ok',
  246. 'model' => $model,
  247. ];
  248. }
  249. public function modelToBiz($coupon, $biz_content = []) {
  250. $biz_content['merchant_access_mode'] = 'AGENCY_MODE';
  251. $biz_content['activity_base_info']['activity_name'] = $coupon['name'];
  252. $biz_content['voucher_send_mode_info']['voucher_send_mode'] = 'DIRECT_SEND_MODE';
  253. $biz_content['voucher_send_mode_info']['voucher_send_rule_info'] = [
  254. 'quantity' => $coupon['quantity'] ?? 0,
  255. 'quantity_limit_per_user' => $coupon['quantity_limit_per_user'],
  256. 'quantity_limit_per_user_period_type' => $coupon['quantity_limit_per_user_period_type'],
  257. 'publish_start_time' => $coupon['publish_start_time'],
  258. 'publish_end_time' => $coupon['publish_end_time'],
  259. ];
  260. //满减
  261. if($coupon['discount_type'] == 2){
  262. $biz_content['voucher_deduct_info'] = [
  263. 'voucher_type' => 'FIX_VOUCHER',
  264. 'fix_voucher_info' => [
  265. 'amount' => $coupon['sub_price'],
  266. 'floor_amount' => $coupon['min_price'],
  267. ],
  268. ];
  269. }
  270. //折扣
  271. if($coupon['discount_type'] == 1){
  272. $biz_content['voucher_deduct_info'] = [
  273. 'voucher_type' => 'DISCOUNT_VOUCHER',
  274. 'discount_voucher_info' => [
  275. 'discount' => $coupon['discount'],
  276. 'ceiling_amount' => $coupon['ceiling_amount'] ?? 5000.00,
  277. 'floor_amount' => $coupon['min_price'],
  278. ],
  279. ];
  280. }
  281. //券可用范围
  282. $biz_content['voucher_available_scope_info']['voucher_available_account_info'] = [
  283. 'available_pids' => [],
  284. ];
  285. $biz_content['voucher_available_scope_info']['voucher_available_app_info'] = [
  286. 'available_app_ids' => [],
  287. ];
  288. $biz_content['voucher_available_scope_info']['voucher_available_goods_info'] = [
  289. 'goods_name' => $coupon['goods_name'],
  290. 'goods_description' => $coupon['goods_description'],
  291. 'available_goods_sku_ids' => $coupon['goods_ids'],
  292. ];
  293. //券核销限制
  294. if($coupon['expire_type'] == 1){
  295. //相对时间
  296. $biz_content['voucher_use_rule_info']['voucher_use_time_info'] = [
  297. 'period_type' => 'RELATIVE',
  298. 'relative_period_info' => [
  299. 'wait_days_after_receive' => $coupon['wait_days_after_receive'] ?? 0,
  300. 'valid_days_after_receive' => $coupon['expire_day'],
  301. ],
  302. ];
  303. }
  304. if($coupon['expire_type'] == 2){
  305. //绝对时间
  306. $biz_content['voucher_use_rule_info']['voucher_use_time_info'] = [
  307. 'period_type' => 'ABSOLUTE',
  308. 'absolute_period_info' => [
  309. 'valid_begin_time' => date('Y-m-d H:i:s', $coupon['begin_time']),
  310. 'valid_end_time' => date('Y-m-d H:i:s', $coupon['end_time']),
  311. ],
  312. ];
  313. }
  314. //券引导信息
  315. $biz_content['voucher_customer_guide_info']['voucher_use_guide_info']['use_guide_mode'] = ['MINI_APP'];
  316. $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]';
  317. //资金信息
  318. $biz_content['voucher_budget_supply_info'] = [
  319. 'budget_type' => 'NO_CASH',
  320. ];
  321. //券展示信息
  322. $biz_content['voucher_display_pattern_info'] = [
  323. 'brand_name' => $coupon['voucher_display_pattern_info']['brand_name'],
  324. 'voucher_description' => $coupon['voucher_display_pattern_info']['voucher_description'],
  325. 'customer_service_mobile' => $coupon['voucher_display_pattern_info']['customer_service_mobile'],
  326. 'voucher_image' => $coupon['voucher_display_pattern_info']['voucher_image'],
  327. 'voucher_detail_images' => $coupon['voucher_display_pattern_info']['voucher_detail_images'],
  328. ];
  329. $biz_content['out_biz_no'] = date('Y-m-dH:i:s') . rand(100000, 999999);
  330. return $biz_content;
  331. }
  332. }