UserStringCodeOrderHistory.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308
  1. <?php
  2. /**
  3. * 厦门云联储网络科技有限公司
  4. * https://www.baokuaiyun.com
  5. * Copyright (c) 2023 爆块云 All rights reserved.
  6. */
  7. namespace app\models;
  8. use app\constants\OptionSetting;
  9. use Yii;
  10. use yii\behaviors\TimestampBehavior;
  11. use yii\db\ActiveRecord;
  12. use yii\db\Expression;
  13. use yii\helpers\ArrayHelper;
  14. use yii\helpers\Json;
  15. /**
  16. * This is the model class for table "{{%user_string_code_order_history}}".
  17. *
  18. * @property integer $id
  19. * @property integer $store_id
  20. * @property integer $user_id
  21. * @property integer $saas_id
  22. * @property integer $is_scan
  23. * @property integer $order_id
  24. * @property integer $order_pv
  25. * @property string $order_no
  26. * @property integer $is_send
  27. * @property integer $model_val
  28. * @property integer $created_at
  29. * @property integer $updated_at
  30. */
  31. class UserStringCodeOrderHistory extends \yii\db\ActiveRecord
  32. {
  33. const SEND_STATUS_WAIT = 0;
  34. const SEND_STATUS_SUCCESS = 1;
  35. const STATUS_LIST = [
  36. self::SEND_STATUS_WAIT => '未发放',
  37. self::SEND_STATUS_SUCCESS => '已发放',
  38. ];
  39. /**
  40. * @inheritdoc
  41. */
  42. public static function tableName()
  43. {
  44. return '{{%user_string_code_order_history}}';
  45. }
  46. public function behaviors()
  47. {
  48. return [
  49. [
  50. 'class' => TimestampBehavior::class,
  51. 'attributes' => [
  52. ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'],
  53. ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
  54. ]
  55. ]
  56. ];
  57. }
  58. /**
  59. * @inheritdoc
  60. */
  61. public function rules()
  62. {
  63. return [
  64. [
  65. [
  66. 'store_id',
  67. 'user_id',
  68. 'saas_id',
  69. 'order_id',
  70. 'created_at',
  71. 'is_scan',
  72. 'updated_at',
  73. 'is_send',
  74. 'model_val'
  75. ],
  76. 'integer'
  77. ],
  78. [['order_pv'], 'number'],
  79. ];
  80. }
  81. /**
  82. * @inheritdoc
  83. */
  84. public function attributeLabels()
  85. {
  86. return [
  87. 'id' => 'ID',
  88. 'store_id' => '店铺id',
  89. 'user_id' => '用户id',
  90. 'saas_id' => '联盟用户id',
  91. 'is_scan' => '是否当面付',
  92. 'order_id' => '订单id',
  93. 'order_no' => '订单号',
  94. 'order_pv' => '订单PV',
  95. 'is_send' => '状态',
  96. 'created_at' => '创建时间',
  97. 'updated_at' => '更新时间',
  98. ];
  99. }
  100. public static function set($store_id, $user_id, $saas_id, $is_scan, $order_id, $order_no, $order_pv, $model_val, $is_send = 0)
  101. {
  102. $model = new self();
  103. $model->store_id = $store_id;
  104. $model->user_id = $user_id;
  105. $model->saas_id = $saas_id;
  106. $model->is_scan = $is_scan;
  107. $model->order_id = $order_id;
  108. $model->order_pv = $order_pv;
  109. $model->model_val = $model_val;
  110. $model->is_send = $is_send;
  111. $model->order_no = $order_no;
  112. return $model->save();
  113. }
  114. public static function sendRedPacket($store_id, $user_id, $model_val, $order_id = 0, $order_no = '', $is_scan = 0)
  115. {
  116. $store = Store::findOne($store_id);
  117. $saas_id = SaasUser::findSaasIdByUserId($user_id);
  118. $saas_user = SaasUser::findOne($saas_id);
  119. $oldSaasId = $saas_id;
  120. $model_name = UserStringCodePlus::MODEL_NAME_LIST[$model_val];
  121. if ($model_val == UserStringCodePlus::MODEL_SHOP) {
  122. $to_store_id = $store_id;
  123. $to_user_id = $user_id;
  124. } else {
  125. $to_store_id = UserStringCodePlus::ALLIANCE_STORE_ID;
  126. $to_user_id = SaasUser::findSaasIdByUserId($user_id);
  127. }
  128. $order_pv = UserStringCodeOrderHistory::find()
  129. ->where(['store_id' => $store_id, 'model_val' => $model_val, 'saas_id' => $saas_id, 'order_id' => $order_id, 'is_send' => self::SEND_STATUS_WAIT])
  130. ->select(['sum(order_pv) as total'])->scalar();
  131. // if (bccomp($order_pv, 0, 2) <= 0) {
  132. if (bccomp($order_pv, 0, 6) <= 0) {
  133. //debug_log([__METHOD__, __LINE__, "用户第一次加入节点红包发放 【{$model_name}】,店铺:【{$store_id}】,订单总PV值【{$order_pv}】:有误"], "app_debug.log");
  134. return false;
  135. }
  136. // 获取所有上层节点
  137. $parent_list = UserStringCodePlus::getAllParentNodeIds($to_store_id, $to_user_id);
  138. if (!$parent_list) {
  139. return false;
  140. }
  141. $parent_list_desc = array_reverse($parent_list);
  142. //debug_log([__METHOD__, __LINE__, "用户第一次加入节点红包发放 【{$model_name}】节点列表:" . json_encode($parent_list_desc)], "app_debug.log");
  143. $sys_setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, UserStringCodePlus::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
  144. $sys_setting = $sys_setting ? Json::decode($sys_setting['value']) : [];
  145. $setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME, '{}');
  146. $setting = $setting ? Json::decode($setting['value']) : [];
  147. $sale_setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, UserStringCodePlus::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
  148. $sale_setting = $sale_setting ? Json::decode($sale_setting['value']) : [];
  149. $string_code_pv_scale = $model_val == UserStringCodePlus::MODEL_SHOP ? $setting['string_code_pv_scale_0'] : $setting['string_code_pv_scale_1'];
  150. //debug_log([__METHOD__, __LINE__, "用户第一次加入节点红包发放 【{$model_name}】PV比例:{$string_code_pv_scale}"], "app_debug.log");
  151. // 总待分账金额
  152. $transfer_money = bcmul($order_pv, $string_code_pv_scale / 100, 2);
  153. //debug_log([__METHOD__, __LINE__, "用户第一次加入节点红包发放 【{$model_name}】总待分账金额:{$transfer_money}"], "app_debug.log");
  154. //debug_log([__METHOD__, __LINE__, "串码红包JOB 【{$model_name}】门店:{$sale_setting['string_code_store_red_packet']} 品牌:{$sale_setting['string_code_brand_red_packet']}"], "app_debug.log");
  155. if ($store->store_type == Store::TYPE_STORE) {
  156. $transfer_money = bcmul($transfer_money, $sale_setting['string_code_store_red_packet'] / 100, 2);
  157. } else {
  158. $transfer_money = bcmul($transfer_money, $sale_setting['string_code_brand_red_packet'] / 100, 2);
  159. }
  160. //debug_log([__METHOD__, __LINE__, "用户第一次加入节点红包发放 【{$model_name}】红包分账金额:{$transfer_money}"], "app_debug.log");
  161. $alliance_setting = Option::get(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, UserStringCodePlus::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
  162. $alliance_setting = $alliance_setting ? Json::decode($alliance_setting['value']) : [];
  163. if ($model_val == UserStringCodePlus::MODEL_SHOP) {
  164. $max_layer = $setting['string_code_max_layer'];
  165. } else {
  166. $max_layer = $alliance_setting['string_code_max_layer'];
  167. }
  168. $bonus_money = bcdiv($transfer_money, $max_layer, 2);
  169. //debug_log([__METHOD__, __LINE__, "用户第一次加入节点红包发放 【{$model_name}】节点红包金额:{$bonus_money},最大层级:{$max_layer}"], "app_debug.log");
  170. if (bccomp($bonus_money, 0, 6) <= 0) {
  171. //debug_log([__METHOD__, __LINE__, "用户第一次加入节点红包发放 【{$model_name}】节点红包金额:{$bonus_money} 错误"], "app_debug.log");
  172. return false;
  173. }
  174. for ($i = 0; $i < $max_layer; $i++) {
  175. $parent_id = $parent_list_desc[$i];
  176. if ($parent_id) {
  177. if ($store->store_type == Store::TYPE_STORE) {
  178. $s_order_log_type = UserStringCodeOrder::TYPE_STORE_RED_PACKET;
  179. } else {
  180. $s_order_log_type = UserStringCodeOrder::TYPE_BRAND_RED_PACKET;
  181. }
  182. if ($model_val == UserStringCodePlus::MODEL_ALLIANCE) {
  183. $user_id = SaasUser::findUserIdByStoreIdAndSaasId(-1, $parent_id);
  184. $saas_id = $parent_id;
  185. } else {
  186. $parent_saas_id = SaasUser::findSaasIdByUserId($parent_id);
  187. $user_id = $parent_id;
  188. $saas_id = $parent_saas_id;
  189. }
  190. $s_order_log = "串码红包 【{$saas_user['name']}】加入节点奖励";
  191. UserStringCodeOrder::set(
  192. $to_store_id,
  193. $user_id,
  194. $saas_id,
  195. $is_scan,
  196. $order_id,
  197. $bonus_money,
  198. UserStringCodeOrder::STATUS_SUCCESS,
  199. $s_order_log,
  200. $order_no,
  201. $s_order_log_type,
  202. $model_val,
  203. $store_id
  204. );
  205. $wallet_store_id = $model_val == UserStringCodePlus::MODEL_ALLIANCE ? UserStringCodePlus::ALLIANCE_STORE_ID : $store_id;
  206. $wallet_user_id = $model_val == UserStringCodePlus::MODEL_ALLIANCE ? $saas_id : $user_id;
  207. $log_desc = "串码用户:【{$saas_user['name']}】 第一次加入节点发放红包";
  208. $currency = Currency::findOne(['code' => Currency::CURRENCY_STRING_CODE]);
  209. UserWallet::addLog($currency, $wallet_store_id, $wallet_user_id, $bonus_money, $log_desc, UserWallet::TYPE_RED_PACKET,$store_id,UserWallet::TYPE_RED_PACKET);
  210. } else {
  211. // 多余的都发根结点用户
  212. if ($model_val == UserStringCodePlus::MODEL_ALLIANCE) {
  213. // $string_code_transfer_user_id=isset($sys_setting['string_code_transfer_user_id']) && $sys_setting['string_code_transfer_user_id'] > 0 ? $sys_setting['string_code_transfer_user_id'] : 0;
  214. // $string_code_transfer_saas_id=$string_code_transfer_user_id;
  215. // $store=SaasUser::findOne($string_code_transfer_saas_id);
  216. // $string_code_transfer_user_id=SaasUser::findUserIdByStoreIdAndSaasId($store->id,$string_code_transfer_user_id);
  217. $string_code_transfer_user_id = isset($sys_setting['string_code_transfer_user_id']) && $sys_setting['string_code_transfer_user_id'] > 0 ? $sys_setting['string_code_transfer_user_id'] : 0;
  218. $string_code_transfer_saas_id = isset($sys_setting['string_code_transfer_saas_id']) && $sys_setting['string_code_transfer_saas_id'] > 0 ? $sys_setting['string_code_transfer_saas_id'] : 0;
  219. } else {
  220. // $string_code_transfer_user_id=isset($setting['string_code_transfer_user_id']) && $setting['string_code_transfer_user_id'] > 0 ? $setting['string_code_transfer_user_id'] : 0;
  221. // $string_code_transfer_saas_id=$string_code_transfer_user_id;
  222. // $store=SaasUser::findOne($string_code_transfer_saas_id);
  223. // $string_code_transfer_user_id=SaasUser::findUserIdByStoreIdAndSaasId($store->id,$string_code_transfer_user_id);
  224. $string_code_transfer_user_id = isset($setting['string_code_transfer_user_id']) && $setting['string_code_transfer_user_id'] > 0 ? $setting['string_code_transfer_user_id'] : 0;
  225. $string_code_transfer_saas_id = isset($setting['string_code_transfer_saas_id']) && $setting['string_code_transfer_saas_id'] > 0 ? $setting['string_code_transfer_saas_id'] : 0;
  226. }
  227. //debug_log([__METHOD__, __LINE__, "串码红包JOB 【{$model_name}】店铺id{$store_id} 默认让利人user:{$string_code_transfer_user_id},默认让利人saas:{$string_code_transfer_saas_id}"], "app_debug.log");
  228. if ($string_code_transfer_user_id > 0) {
  229. if ($store->store_type == Store::TYPE_STORE) {
  230. $s_order_log_type = UserStringCodeOrder::TYPE_STORE_RED_PACKET;
  231. } else {
  232. $s_order_log_type = UserStringCodeOrder::TYPE_BRAND_RED_PACKET;
  233. }
  234. $s_order_log = "串码红包 【{$saas_user['name']}】加入节点奖励";
  235. UserStringCodeOrder::set(
  236. UserStringCodePlus::ALLIANCE_STORE_ID,
  237. $string_code_transfer_user_id,
  238. $string_code_transfer_saas_id,
  239. $is_scan,
  240. $order_id,
  241. $bonus_money,
  242. UserStringCodeOrder::STATUS_SUCCESS,
  243. $s_order_log,
  244. $order_no,
  245. $s_order_log_type,
  246. $model_val,
  247. $store_id
  248. );
  249. $wallet_store_id = UserStringCodePlus::ALLIANCE_STORE_ID;
  250. $wallet_user_id = $string_code_transfer_user_id;
  251. $log_desc = "串码用户:【{$saas_user['name']}】 第一次加入节点发放红包";
  252. $currency = Currency::findOne(['code' => Currency::CURRENCY_STRING_CODE]);
  253. UserWallet::addLog($currency, $wallet_store_id, $wallet_user_id, $bonus_money, $log_desc, UserWallet::TYPE_RED_PACKET,$store_id,UserWallet::TYPE_RED_PACKET);
  254. }
  255. }
  256. }
  257. //store_user_referrer store_user_affiliated store_referrer
  258. $UserStringCodeOrderlist = UserStringCodeOrder::findAll([
  259. 'order_id' => $order_id,
  260. 'is_scan' => $is_scan,
  261. 'type' => [UserStringCodeOrder::TYPE_STORE_RED_PACKET,UserStringCodeOrder::TYPE_BRAND_RED_PACKET]
  262. ]);
  263. if (count($UserStringCodeOrderlist) > 0) {
  264. UserStringCodeOrderHistory::updateAll(
  265. ['is_send' => self::SEND_STATUS_SUCCESS],
  266. ['store_id' => $store_id, 'model_val' => $model_val, 'saas_id' => $oldSaasId, 'order_id' => $order_id, 'is_send' => self::SEND_STATUS_WAIT]
  267. );
  268. }
  269. }
  270. }