Salesman.php 41 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745
  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 app\plugins\scanCodePay\models\Order as ScanOrder;
  10. use Yii;
  11. use yii\base\Exception;
  12. use yii\behaviors\TimestampBehavior;
  13. use yii\db\ActiveRecord;
  14. use yii\helpers\Json;
  15. /**
  16. * This is the model class for table "{{%salesman}}".
  17. *
  18. * @property integer $id
  19. * @property integer $saas_user_id
  20. * @property integer $admin_id
  21. * @property integer $type
  22. * @property integer $is_delete
  23. * @property integer $created_at
  24. * @property integer $updated_at
  25. * @property integer $status
  26. */
  27. class Salesman extends \yii\db\ActiveRecord
  28. {
  29. const TYPE_DEFAULT = 0; //默认类型
  30. const TYPE_BD = 1; //推广代理下业务员
  31. /**
  32. * @inheritdoc
  33. */
  34. public static function tableName()
  35. {
  36. return '{{%salesman}}';
  37. }
  38. public function behaviors()
  39. {
  40. return [
  41. [
  42. 'class' => TimestampBehavior::class,
  43. 'attributes' => [
  44. ActiveRecord::EVENT_BEFORE_INSERT => ['created_at'],
  45. ActiveRecord::EVENT_BEFORE_UPDATE => ['updated_at']
  46. ]
  47. ]
  48. ];
  49. }
  50. /**
  51. * @inheritdoc
  52. */
  53. public function rules()
  54. {
  55. return [
  56. [['id', 'saas_user_id', 'admin_id', 'type', 'is_delete', 'created_at', 'updated_at', 'status'], 'integer'],
  57. ];
  58. }
  59. public function beforeSave($insert)
  60. {
  61. if (parent::beforeSave($insert)) {
  62. if ($insert) {
  63. //业务员类型,默认新业务员类型(2023-02-06版本以后为新类型)
  64. $this->type = self::TYPE_BD;
  65. }
  66. return true;
  67. }
  68. return false;
  69. }
  70. public static function getBdId($store_id)
  71. {
  72. $salesman_id = Store::find()->where(['id' => $store_id])->select(['salesman_id'])->asArray()->scalar() ?: null;
  73. $salesman = Salesman::findOne(['id' => $salesman_id, 'is_delete' => 0, 'status' => 1]);
  74. if (empty($salesman) || !$salesman->admin_id) return false;
  75. $admin = Admin::findOne(['id' => $salesman->admin_id, 'is_delete' => 0]);
  76. if (empty($admin) || $admin->type != 'bd_agent') return false;
  77. return $admin->id;
  78. }
  79. public static function transfer($order)
  80. {
  81. if (!$order->is_pay) return false;
  82. $store_id = $order->store_id;
  83. $setting = Option::getDecode(OptionSetting::SHARE_STRING_CODE_DEFAULT_SETTING, $store_id, OptionSetting::SHARE_GROUP_NAME);
  84. $is_scan = $order instanceof ScanOrder ? 1 : 0;
  85. if (!$is_scan) return false;
  86. $t = \Yii::$app->db->beginTransaction();
  87. try {
  88. $bd_id = self::getBdId($store_id);
  89. $config = Option::getDecode(OptionSetting::SHARE_STRING_CODE_SALE_SETTING_BD, $bd_id, OptionSetting::SHARE_GROUP_NAME);
  90. if (empty($config)) throw new \Exception('无配置');
  91. self::transferByModel($order, $setting, $is_scan);
  92. $UserStringCodeOrderlist = UserStringCodeOrder::findAll([
  93. 'order_id' => $order->id,
  94. 'is_scan' => $is_scan,
  95. 'type' => [
  96. UserStringCodeOrder::TYPE_STORE_USER_REFERRER,
  97. UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED,
  98. UserStringCodeOrder::TYPE_STORE_REFERRER,
  99. UserStringCodeOrder::TYPE_BRAND_USER_REFERRER,
  100. UserStringCodeOrder::TYPE_BRAND_USER_AFFILIATED,
  101. UserStringCodeOrder::TYPE_BRAND_REFERRER,
  102. UserStringCodeOrder::TYPE_AREA_AWARD,
  103. UserStringCodeOrder::TYPE_BRAND_USER_STORE_REFERRER,
  104. UserStringCodeOrder::TYPE_SUPRISE_RED,
  105. ] // 用数组指定多个类型
  106. ]);
  107. $league_arr = UserStringCodeOrder::TYPE_LEAGUE_PRICE;
  108. $Leaguelist = SaaSLeaguePriceLog::findAll([
  109. 'order_id' => $order->id,
  110. 'is_scan' => $is_scan,
  111. 'type' => [
  112. $league_arr[UserStringCodeOrder::TYPE_STORE_USER_REFERRER],
  113. $league_arr[UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED],
  114. $league_arr[UserStringCodeOrder::TYPE_STORE_REFERRER],
  115. $league_arr[UserStringCodeOrder::TYPE_BRAND_USER_REFERRER],
  116. $league_arr[UserStringCodeOrder::TYPE_BRAND_USER_AFFILIATED],
  117. $league_arr[UserStringCodeOrder::TYPE_BRAND_REFERRER],
  118. $league_arr[UserStringCodeOrder::TYPE_AREA_AWARD],
  119. $league_arr[UserStringCodeOrder::TYPE_BRAND_USER_STORE_REFERRER],
  120. $league_arr[UserStringCodeOrder::TYPE_SUPRISE_RED],
  121. ]
  122. ]);
  123. if (count($UserStringCodeOrderlist) > 0 || count($Leaguelist) > 0) {
  124. $order->team_reward_status = 1;
  125. $order->save();
  126. }
  127. //self::sendDistrictStreetAgentDivvy($order);
  128. $t->commit();
  129. } catch (\Exception $e) {
  130. $t->rollBack();
  131. ActionLog::addLog(1, '/PluginPoolConfig/transfer', $e->getMessage());
  132. } catch (\Throwable $e) {
  133. $t->rollBack();
  134. ActionLog::addLog(1, '/PluginPoolConfig/transfer', $e->getMessage());
  135. }
  136. }
  137. public static function transferByModel($order, $string_code_setting, $is_scan)
  138. {
  139. $store_id = $order->store_id;
  140. //$setting = Option::getShareSaleSetting(self::ALLIANCE_STORE_ID);
  141. $admin_id = Salesman::getBdId($order->store_id);
  142. $setting = Option::getDecode(OptionSetting::SHARE_STRING_CODE_SALE_SETTING_BD, $admin_id, OptionSetting::SHARE_GROUP_NAME);
  143. ActionLog::addLog(1, '/configPoolPush/salesman', 'admin_id : ' . $admin_id .'setting : ' . Json::encode($setting));
  144. $order_pv = $order->pay_price + $order->take_price;
  145. if (isset($setting['string_code_store_partner']) && $setting['string_code_store_partner'] > 0) {
  146. //debug_log([__METHOD__, __LINE__, "门店合伙人分红比例 : " . ($string_code_setting['scan_qr_code_percent'])], "app_debug.log");
  147. self::stringCodeStorPartner($order, $order_pv, $string_code_setting['scan_qr_code_percent'], $setting['string_code_store_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 0);
  148. }
  149. self::unionUintFounder($order, $order_pv, $string_code_setting['scan_qr_code_percent'], $setting, $string_code_setting['string_code_model'], $store_id, $is_scan, 0);
  150. if (isset($setting['string_code_brand_partner']) && $setting['string_code_brand_partner'] > 0) {
  151. //debug_log([__METHOD__, __LINE__, "品牌合伙人分红比例 : " . ($string_code_setting['alliance_scan_qr_code_percent'])], "app_debug.log");
  152. self::stringCodeStorPartner($order, $order_pv, $string_code_setting['alliance_scan_qr_code_percent'], $setting['string_code_brand_partner'], $setting, $is_scan, $string_code_setting['string_code_model'], $store_id, 1);
  153. }
  154. self::unionUintFounder($order, $order_pv, $string_code_setting['alliance_scan_qr_code_percent'], $setting, $string_code_setting['string_code_model'], $store_id, $is_scan, 1);
  155. self::configPoolPush($setting, $order, $string_code_setting, $order_pv, 0);//插入池子
  156. self::appointAward($setting,$order,$order_pv,0);
  157. //debug_log([__METHOD__, __LINE__, "串码让利 订单金额:{$order_pv} pv:{$string_code_setting['string_code_make_concessions_scan']}"], "app_debug.log");
  158. //debug_log([__METHOD__, __LINE__, "串码让利 店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_make_concessions_scan']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log");
  159. }
  160. public static function configPoolPush($config, $order, $setting, $pv0, $pv1)
  161. {
  162. try {
  163. if (!isset($config['pools']) || empty($config['pools'])) throw new \Exception('无配置分红池');
  164. foreach ($config['pools'] as $p) {
  165. $pool = PluginPoolConfig::find()->where(['status' => 1, 'is_delete' => 0, 'id' => $p['config_id']])->one();
  166. if (empty($pool)) continue;
  167. if (!isset($p['rate']) || $p['rate'] <= 0) continue;
  168. ActionLog::addLog(1, '/configPoolPush/salesman', 'config_id : ' . $p['config_id'] .'$pv0 : ' . $pv0);
  169. self::pushCP($p['config_id'], $order, $pv0, $setting['string_code_pv_scale_0'], $p['rate'], $setting['string_code_model'], 0);
  170. //self::pushCP($p['config_id'], $order, $pv1, $setting['string_code_pv_scale_1'], $p['rate'], $setting['string_code_model'], 1);
  171. }
  172. } catch (\Exception $e) {
  173. ActionLog::addLog(1, '/configPoolPush/salesman', $e->getMessage());
  174. }
  175. }
  176. public static function pushCP($config_id, $order, $order_pv, $code_percent, $rate, $string_code_model, $model_val)
  177. {
  178. try {
  179. if ($order_pv <= 0) throw new \Exception('PV:'.$order_pv);
  180. if (in_array($model_val, $string_code_model)) {
  181. //debug_log([__METHOD__, __LINE__, "大模型比例 : " . ($code_percent / 100)], "app_debug.log");
  182. $add_money = bcmul($order_pv, $code_percent / 100, 4);
  183. $money = bcmul($add_money, $rate / 100, 4);
  184. if (bccomp($money, 0, 4) > 0) {
  185. $desc = PluginPoolConfig::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】分红增加";
  186. PluginPool::poolPush($config_id, $order, $money, $desc, $order_pv, $rate, $code_percent, $model_val, $add_money);
  187. }
  188. }
  189. } catch (\Exception $e) {
  190. ActionLog::addLog(1, 'pushCP/salesman', $e->getMessage());
  191. }
  192. }
  193. public static function stringCodeStorPartner($order, $order_pv, $scan_qr_code_percent, $rate, $setting, $is_scan, $string_code_model, $store_id, $model_val)
  194. {
  195. if ($order_pv <= 0) throw new \Exception('PV:'.$order_pv);
  196. if (in_array($model_val, $string_code_model)) {
  197. ////debug_log([__METHOD__, __LINE__, "大模型比例 : " . ($scan_qr_code_percent / 100)], "app_debug.log");
  198. $add_money = bcmul($order_pv, $scan_qr_code_percent / 100, 4);
  199. $money = bcmul($add_money, $rate / 100, 4);
  200. ////debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log");
  201. if (bccomp($money, 0, 4) > 0) {
  202. $desc = UserStringCodePlus::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】合伙人分红增加";
  203. PartnerPool::poolPush($order, $money, $desc, $order_pv, $rate, $scan_qr_code_percent, $model_val, $add_money);
  204. }
  205. }
  206. }
  207. public static function unionUintFounder($order, $order_pv, $scan_qr_code_percent, $setting, $string_code_model, $store_id, $is_scan, $model_val)
  208. {
  209. if (!in_array($model_val, $string_code_model)) return false;
  210. //debug_log([__METHOD__, __LINE__, "大模型比例 : " . ($scan_qr_code_percent / 100) . ',Store_id:' . $order->store_id, ',order_id:' . $order->id], "app_debug.log");
  211. $add_money = bcmul($order_pv, $scan_qr_code_percent / 100, 4);
  212. $money = bcmul($add_money, $setting['string_code_alliance_merchant'] / 100, 4);
  213. //debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log");
  214. $desc = UserStringCodePlus::MODEL_NAME_LIST[$model_val] . " " . "订单号:【{$order->order_no}】分红增加";
  215. if (bccomp($money, 0, 4) > 0) {
  216. StoreUnionPool::poolPush($order, $money, $desc, $order_pv, $setting['string_code_alliance_merchant'], $scan_qr_code_percent, $model_val, $add_money);
  217. }
  218. $money = bcmul($add_money, $setting['string_code_brand_cofounder'] / 100, 4);
  219. //debug_log([__METHOD__, __LINE__, "大模型:order_pv : " . $order_pv . ',$add_money:' . $add_money . ',$money:' . $money], "app_debug.log");
  220. if (bccomp($money, 0, 4) > 0) {
  221. UnitFounderPool::poolPush($order, $money, $desc, $order_pv, $setting['string_code_brand_cofounder'], $scan_qr_code_percent, $model_val, $add_money);
  222. }
  223. if (bccomp($add_money, 0, 4) > 0) {
  224. self::supriseRed($order, $setting, $order_pv, $model_val);
  225. self::hotAwardSend($setting['string_code_hot_district_agent'], $setting['string_code_ad_hot'], $setting['string_code_store_district_agent_divvy'], $add_money, $model_val, $order);
  226. self::adAwardSend($order->store_id, $add_money, $setting['string_code_ad_brand'], $setting['string_code_expansion_manager'], $model_val, $order, $setting['string_code_store_push_id']);
  227. self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 1);//品牌区县代理
  228. self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 2);//品牌市代理
  229. self::areaAwardSend($order->store_id, $order, $add_money, $model_val, 3);//品牌省代理
  230. self::stringCodeStoreReferrer($order, $setting, $store_id, $add_money, $model_val);
  231. self::stringCodeStoreUserAffiliated($order, $setting, $add_money, $model_val);
  232. self::stringCodeStoreUserReferrer($order, $setting, $add_money, $model_val);
  233. $store = Store::findOne($store_id);
  234. self::sendMakeConcessionsScan($order, $setting, $is_scan, $store, $model_val);
  235. }
  236. }
  237. private static function adAwardSend($store_id, $order_pv, $rate, $manager, $model, $order, $string_code_store_push_id)
  238. {
  239. $store = Store::find()->where(['id' => $store_id])->select(['salesman_id', 'district_id'])->asArray()->one();
  240. $salesman_id = $store['salesman_id'];
  241. //debug_log([__METHOD__, __LINE__, "============拓展经理:($salesman_id),广告推流店铺id:" . $store_id], "app_debug.log");
  242. if ($order_pv <= 0) return false;
  243. $salesman = Salesman::findOne(['id' => $salesman_id, 'is_delete' => 0, 'status' => 1]);
  244. $admin = Admin::findOne(['id' => $salesman->admin_id, 'is_delete' => 0]);
  245. $manager_money = $order_pv * $manager / 100;
  246. if ($manager && $salesman->saas_user_id) {
  247. //debug_log([__METHOD__, __LINE__, "============拓展经理金额 : " . ($manager_money)], "app_debug.log");
  248. UserStringCodeOrder::transferAddUserWallet($order, $salesman->saas_user_id, $manager_money, UserStringCodeOrder::TYPE_EXPAND_MANAGER, $model);
  249. } else {
  250. if ($string_code_store_push_id) {
  251. UserStringCodeOrder::transferAddUserWallet($order, $string_code_store_push_id, $manager_money, UserStringCodeOrder::TYPE_EXPAND_MANAGER, $model);
  252. }
  253. }
  254. if ($rate <= 0) return false;
  255. $money = $order_pv * $rate / 100;
  256. if ($admin->advert_push_user_id) {
  257. //debug_log([__METHOD__, __LINE__, "============广告推流金额 : " . ($money)], "app_debug.log");
  258. UserStringCodeOrder::transferAddUserWallet($order, $admin->advert_push_user_id, $money, UserStringCodeOrder::TYPE_BD_AGENT, $model);
  259. } else {
  260. if ($string_code_store_push_id) {
  261. UserStringCodeOrder::transferAddUserWallet($order, $string_code_store_push_id, $money, UserStringCodeOrder::TYPE_BD_AGENT, $model);
  262. }
  263. }
  264. return true;
  265. }
  266. private static function hotAwardSend($saas_id, $rate, $founder, $order_pv, $model, $order)
  267. {
  268. $money = $order_pv * $rate / 100;
  269. //debug_log([__METHOD__, __LINE__, "============热动代理人金额 : " . ($money)], "app_debug.log");
  270. if ($saas_id && $money > 0) {
  271. UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, UserStringCodeOrder::TYPE_AD_HOT, $model);
  272. }
  273. $money = $order_pv * $founder / 100;
  274. //debug_log([__METHOD__, __LINE__, "============热动广告推流金额 : " . ($money)], "app_debug.log");
  275. if ($saas_id && $money > 0) {
  276. UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY, $model);
  277. }
  278. }
  279. private static function areaAwardSend($store_id, $order, $order_pv, $model, $area_level)
  280. {
  281. if ($order_pv <= 0) return false;
  282. $setting = Option::getShareSaleSetting(OptionSetting::ALLIANCE_STORE_ID);
  283. $store = Store::find()->where(['id' => $store_id])->select(['salesman_id', 'district_id', 'city_id', 'province_id'])->asArray()->one();
  284. $salesman_id = $store['salesman_id'];
  285. //debug_log([__METHOD__, __LINE__, "============拓展经理:($salesman_id),,广告推流店铺id:" . $store_id], "app_debug.log");
  286. $salesman = Salesman::findOne(['id' => $salesman_id, 'is_delete' => 0, 'status' => 1]);
  287. $admin = Admin::findOne(['id' => $salesman->admin_id, 'is_delete' => 0]);
  288. $query = Admin::find()->select('saas_user_id')->where(['agent_id' => $salesman->admin_id, 'is_enable' => 1, 'is_delete' => 0]);
  289. switch ($area_level) {
  290. case 1:
  291. $area = $setting['string_code_brand_district_agent'];
  292. $type = UserStringCodeOrder::TYPE_BRAND_DISTRICT_AGENT;
  293. $d_query = clone $query;
  294. $agent_id = $d_query->andWhere(['district_id' => $store['district_id'], 'area_level' => 1])->scalar() ?: null;
  295. if ($agent_id) break;
  296. //debug_log([__METHOD__, __LINE__, "============没找到区县代理"], "app_debug.log");
  297. case 2:
  298. if ($area_level == 2) {
  299. $type = UserStringCodeOrder::TYPE_BRAND_CITY_AGENT;
  300. $area = $setting['string_code_brand_city_agent'];
  301. }
  302. $c_query = clone $query;
  303. $agent_id = $c_query->andWhere(['city_id' => $store['city_id'], 'area_level' => 2])->scalar() ?: null;
  304. if ($agent_id) break;
  305. //debug_log([__METHOD__, __LINE__, "============没找到市代理"], "app_debug.log");
  306. case 3:
  307. if ($area_level == 3) {
  308. $type = UserStringCodeOrder::TYPE_BRAND_PROVINCE_AGENT;
  309. $area = $setting['string_code_brand_province_agent'];
  310. }
  311. $p_query = clone $query;
  312. $agent_id = $p_query->andWhere(['province_id' => $store['province_id'], 'area_level' => 3])->scalar() ?: null;
  313. break;
  314. default:
  315. $area = 0;
  316. break;
  317. }
  318. if ($area && $salesman->admin_id) {
  319. $area_money = $order_pv * $area / 100;
  320. $agent_id = $agent_id ?: ($admin->advert_push_user_id ?: $setting['string_code_store_push_id']);
  321. //debug_log([__METHOD__, __LINE__, "============区县代理商:" . $agent_id . "金额 : " . ($area_money)], "app_debug.log");
  322. if ($agent_id) {
  323. UserStringCodeOrder::transferAddUserWallet($order, $agent_id, $area_money, $type, $model);
  324. }
  325. }
  326. return true;
  327. }
  328. public static function stringCodeStoreReferrer($order, $setting, $store_id, $transfer_money, $model_val)
  329. {
  330. $referrer = 0;
  331. if ($order instanceof ScanOrder) {
  332. if (isset($setting['string_code_store_referrer']) && $setting['string_code_store_referrer'] > 0) {
  333. $referrer = $setting['string_code_store_referrer'];
  334. }
  335. } else {
  336. if (isset($setting['string_code_brand_referrer']) && $setting['string_code_brand_referrer'] > 0) {
  337. $referrer = $setting['string_code_brand_referrer'];
  338. }
  339. }
  340. if ($referrer > 0) {
  341. $store_referral = SaasStoreReferral::findOne(['store_id' => $store_id]);
  342. $saas_id = $store_referral['referral_id'];
  343. $money = bcmul($transfer_money, $referrer / 100, 4);
  344. $type = UserStringCodeOrder::TYPE_STORE_REFERRER;
  345. UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
  346. }
  347. }
  348. public static function stringCodeStoreUserAffiliated($order, $setting, $transfer_money, $model_val)
  349. {
  350. $affiliated = 0;
  351. if ($order instanceof ScanOrder) {
  352. if (isset($setting['string_code_store_user_affiliated']) && $setting['string_code_store_user_affiliated'] > 0) {
  353. $affiliated = $setting['string_code_store_user_affiliated'];
  354. }
  355. } else {
  356. if (isset($setting['string_code_brand_user_affiliated']) && $setting['string_code_brand_user_affiliated'] > 0) {
  357. $affiliated = $setting['string_code_brand_user_affiliated'];
  358. }
  359. }
  360. if ($affiliated > 0) {
  361. $first_store_id = SaasUser::findFirstStoreIdByUserId($order->user_id);
  362. $store_admin = Admin::findOne(['type' => 'store', 'type_id' => $first_store_id, 'is_delete' => 0]);
  363. $saas_id = $store_admin['saas_user_id'];
  364. $money = bcmul($transfer_money, $affiliated / 100, 4);
  365. $type = UserStringCodeOrder::TYPE_STORE_USER_AFFILIATED;
  366. UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
  367. }
  368. }
  369. public static function stringCodeStoreUserReferrer($order, $setting, $transfer_money, $model_val)
  370. {
  371. $referrer = 0;
  372. if ($order instanceof ScanOrder) {
  373. if (isset($setting['string_code_store_user_referrer']) && $setting['string_code_store_user_referrer'] > 0) {
  374. $referrer = $setting['string_code_store_user_referrer'];
  375. }
  376. } else {
  377. if (isset($setting['string_code_brand_user_referrer']) && $setting['string_code_brand_user_referrer'] > 0) {
  378. $referrer = $setting['string_code_brand_user_referrer'];
  379. }
  380. }
  381. if ($referrer > 0) {
  382. $user = User::findOne($order->user_id);
  383. if ($user->id > 0) {
  384. $saas_id = SaasUser::findSaasParentIdByUserId($order->user_id);
  385. $money = bcmul($transfer_money, $referrer / 100, 4);
  386. $type = UserStringCodeOrder::TYPE_STORE_USER_REFERRER;
  387. UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
  388. }
  389. }
  390. }
  391. public static function sendDistrictStreetAgentDivvy($order, $model_val = 1, $modelType = '街道代理商')
  392. {
  393. $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, UserStringCodePlus::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
  394. $setting = $setting ? Json::decode($setting['value']) : [];
  395. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】店铺推荐人:{$setting['string_code_store_referrer']} 合伙人分红:{$setting['string_code_store_partner']} 会员所属门店:{$setting['string_code_store_user_affiliated']} 用户推荐人:{$setting['string_code_store_user_referrer']}"], "app_debug.log");
  396. $transfer_money = 0;
  397. if ($order instanceof ScanOrder) {
  398. $transfer_money = UserStringCodePlus::countOrderPvBonus($order);
  399. }
  400. if ($transfer_money <= 0.01) {
  401. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 小于0.01不分账"], "app_debug.log");
  402. return;
  403. }
  404. /*if (isset($setting['string_code_store_district_agent_divvy']) && $setting['string_code_store_district_agent_divvy'] > 0) {
  405. $money = bcmul($transfer_money, $setting['string_code_store_district_agent_divvy'] / 100, 4);
  406. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 门店区县代理商待分账金额:{$money}"], "app_debug.log");
  407. if ($money > 0) {
  408. self::getAgentSaasIdByOrder($order, UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY, $money, $model_val, $modelType);
  409. }
  410. }*/
  411. if (isset($setting['string_code_store_street_agent_divvy']) && $setting['string_code_store_street_agent_divvy'] > 0) {
  412. $money = bcmul($transfer_money, $setting['string_code_store_street_agent_divvy'] / 100, 4);
  413. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType}总待分账金额:{$transfer_money} 门店街道代理商待分账金额:{$money}"], "app_debug.log");
  414. if ($money > 0) {
  415. self::getAgentSaasIdByOrder($order, UserStringCodeOrder::TYPE_STRING_CODE_STORE_STREET_AGENT_DIVVY, $money, $model_val, $modelType);
  416. }
  417. }
  418. }
  419. public static function getAgentSaasIdByOrder($order, $agentType, $money, $model_val, $modelType)
  420. {
  421. $commission = 0.00;
  422. $agent = UserStringCodeOrder::TYPE_LIST[UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY];
  423. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}待分账金额:{$money} 门店:{$order->store_id} ------start-----"], "app_debug.log");
  424. //获取店铺
  425. $store = Store::findOne($order->store_id);
  426. if (empty($store)) {
  427. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}待分账金额:{$money} 门店:{$order->store_id} 不存在"], "app_debug.log");
  428. return $commission;
  429. }
  430. switch ($agentType) {
  431. case UserStringCodeOrder::TYPE_STRING_CODE_STORE_DISTRICT_AGENT_DIVVY:
  432. //区县代理商 $store['district_id']
  433. $where['district_id'] = $store['district_id'];
  434. $where['area_level'] = 1;
  435. $order->district_agent_status = 1;
  436. break;
  437. case UserStringCodeOrder::TYPE_STRING_CODE_STORE_STREET_AGENT_DIVVY:
  438. //街道代理商 $store['street_id']
  439. $where['street_id'] = $store['street_id'];
  440. $where['area_level'] = 4;
  441. $order->street_agent_status = 1;
  442. break;
  443. default: //所有区县代理商分红 $store['district_id']
  444. $where['area_level'] = 1;
  445. $order->all_district_agent_status = 1;
  446. break;
  447. }
  448. $where['is_delete'] = 0;
  449. $where['is_enable'] = 1;
  450. $admin = Admin::find()->where($where)->asArray()->all();
  451. $agentNum = count($admin);
  452. if ($agentNum > 0) {
  453. $order->save();
  454. $commissionMoney = bcdiv($money, $agentNum, 4);
  455. if ($commissionMoney <= 0) {
  456. //debug_log([__METHOD__, __LINE__, "代理商平均分红 【{$commissionMoney}】小于0.01不分红"], "app_debug.log");
  457. }
  458. foreach ($admin as $item) {
  459. if ($item['saas_user_id']) {
  460. $res = UserStringCodeOrder::transferAddUserWallet($order, $item['saas_user_id'], $commissionMoney, $agentType, $model_val);
  461. if ($res) {
  462. $commission += $commissionMoney;
  463. }
  464. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账金额:{$commissionMoney} 门店:{$order->store_id} {{$agent}}ID:{$item['saas_user_id']}"], "app_debug.log");
  465. } else {
  466. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账金额:{$commissionMoney} 门店:{$order->store_id} {{$agent}}未绑定 SaasId不分红"], "app_debug.log");
  467. }
  468. }
  469. } else {
  470. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}不存在"], "app_debug.log");
  471. }
  472. //分红金额小于待分红金额,则分给指定用户
  473. if ($money > $commission) {
  474. $commissionMoney = $money - $commission;
  475. $setting = Option::get(OptionSetting::SHARE_STRING_CODE_SALE_SETTING, UserStringCodePlus::ALLIANCE_STORE_ID, OptionSetting::SHARE_GROUP_NAME, '{}');
  476. $setting = $setting ? Json::decode($setting['value']) : [];
  477. if ($setting['string_code_store_push_id']) {
  478. UserStringCodeOrder::transferAddUserWallet($order, $setting['string_code_store_push_id'], $commissionMoney, $agentType, $model_val, true);
  479. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账剩余金额:{$commissionMoney} 代理商剩余让利用户ID:{$setting['string_code_store_push_id']}"], "app_debug.log");
  480. } else {
  481. //debug_log([__METHOD__, __LINE__, "串码让利 【{$model_val}】{$modelType} {$agent}分账剩余金额:{$commissionMoney} 代理商剩余让利用户不存在不继续分红"], "app_debug.log");
  482. return $commission;
  483. }
  484. }
  485. return $money;
  486. }
  487. public static function sendMakeConcessionsScan($order, $setting, $is_scan, $store, $model_val)
  488. {
  489. $temp_store = json_encode($setting['string_make_doncessions_userlist']);
  490. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利是否开启:{$setting['string_make_doncessions_switch']} 商城订单是否开启:{$setting['string_make_doncessions_order']} 扫码订单是否开启:{$setting['string_make_doncessions_scan']} 商城让利人员:{$temp_store}"], "app_debug.log");
  491. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城串码模型:{$setting['string_code_model']}"], "app_debug.log");
  492. if (empty($setting['string_code_make_concessions'])) {
  493. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 未设置"], "app_debug.log");
  494. return;
  495. }
  496. if ($setting['string_code_make_concessions'] <= 0) {
  497. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 【商城让利人比例:{$setting['string_code_make_concessions']} 设置不正确"], "app_debug.log");
  498. return;
  499. }
  500. //执行小模型前验证
  501. if (is_array($setting['string_make_doncessions_userlist']) && !empty($setting['string_make_doncessions_userlist'])) {
  502. self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val);
  503. } else {
  504. if (empty($setting['string_code_make_concessions_saas_id'])) {
  505. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 小模型 【商城剩余让利人{$setting['string_code_make_concessions']} 未设置 以及 店铺商城让利合伙人 未设置"], "app_debug.log");
  506. } else {
  507. self::sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val);
  508. }
  509. }
  510. //检测是否有发放 有直接更新订单状态
  511. $UserStringCodeOrderlist = UserStringCodeOrder::findAll([
  512. 'order_id' => $order->id,
  513. 'is_scan' => $is_scan,
  514. 'type' => [UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS]
  515. ]);
  516. $temp_count = count($UserStringCodeOrderlist);
  517. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行记录有:{$temp_count}"], "app_debug.log");
  518. if (count($UserStringCodeOrderlist) > 0) {
  519. $temp_order = json_encode($order);
  520. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 订单信息:{$temp_order}"], "app_debug.log");
  521. $order->make_concessions_status = 1;
  522. if ($order->save()) {
  523. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 状态修改失败"], "app_debug.log");
  524. }
  525. // 计算合并结果的总金额
  526. $ModelMoney = 0;
  527. foreach ($UserStringCodeOrderlist as $ordertempr) {
  528. if ($ordertempr['status'] == 1) {
  529. $ModelMoney += $ordertempr['money']; // 累加金额
  530. }
  531. }
  532. try {
  533. if ($order->is_use_platform_mch == 1 && ($order->pay_type == 1 || in_array($order->pay_type, array_keys(Order::HUIFU_PAYMENT_PAY_TYPE)))) {
  534. //扣除店铺金额
  535. $subMoney = Store::subStoreMoney($store, $ModelMoney, '扣商城让利合伙人分红', $order->id, $order->user_id);
  536. if (!$subMoney) {
  537. //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 失败"], "app_debug.log");
  538. }
  539. //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 扣商城让利合伙人分红:" . $ModelMoney . " 成功"], "app_debug.log");
  540. } else {
  541. //debug_log([__METHOD__, __LINE__, $order->order_no . "店铺:" . $store->name . " 已分账,不用扣商城让利合伙人分红 成功"], "app_debug.log");
  542. }
  543. } catch (\Exception $e) {
  544. //debug_log([__METHOD__, __LINE__, "扣商城让利合伙人分红:{$e->getMessage()}"], "app_debug.log");
  545. }
  546. }
  547. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 执行完成"], "app_debug.log");
  548. }
  549. public static function sendMakeConcessionsByOrderStore($order, $setting, $is_scan, $model_val)
  550. {
  551. if (empty($setting['string_make_doncessions_switch'])) {
  552. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城让利合伙人模式未设置"], "app_debug.log");
  553. return;
  554. }
  555. if ($setting['string_make_doncessions_switch'] == 0) {
  556. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城让利合伙人模式未开启"], "app_debug.log");
  557. return;
  558. }
  559. if ($is_scan == 0) {
  560. //商城订单
  561. if (empty($setting['string_make_doncessions_order']) || $setting['string_make_doncessions_order'] == 0) {
  562. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城订单商城让利合伙人状态未设置"], "app_debug.log");
  563. } else {
  564. //debug_log([__METHOD__, __LINE__, "执行 商城让利人分红"], "app_debug.log");
  565. /*$order_pv = OrderDetail::find()
  566. ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
  567. ->select([
  568. 'sum(pv_0)',
  569. ])->scalar();
  570. self::sendMakeConcessionsByOrderGrant($order, $order_pv, $setting['string_code_make_concessions'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], 0);
  571. $order_pv = OrderDetail::find()
  572. ->andWhere(['order_id' => $order['id'], 'is_delete' => 0])
  573. ->select([
  574. 'sum(pv_1)',
  575. ])->scalar();*/
  576. self::sendMakeConcessionsByOrderGrant($order, $order->pay_price, $setting['string_code_make_concessions'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], $model_val);
  577. //debug_log([__METHOD__, __LINE__, "执行 商城让利人分红:" . $setting['string_code_make_concessions'] . '======'], "app_debug.log");
  578. }
  579. } else {
  580. //扫码订单
  581. if (empty($setting['string_make_doncessions_scan']) || $setting['string_make_doncessions_scan'] == 0) {
  582. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 商城订单商城让利合伙人状态未设置"], "app_debug.log");
  583. } else {
  584. //debug_log([__METHOD__, __LINE__, "执行 扫码分红"], "app_debug.log");
  585. self::sendMakeConcessionsByOrderGrant($order, $order->pay_price, $setting['string_code_make_concessions_scan'], $setting['string_code_make_concessions_saas_id'], $setting['string_make_doncessions_userlist'], $model_val);
  586. }
  587. }
  588. }
  589. public static function sendMakeConcessionsByOrderGrant($order, $transfer_money, $string_code_make_concessions, $push_saas_id, $string_make_doncessions_userlist, $model_val)
  590. {
  591. $money = bcmul($transfer_money, $string_code_make_concessions / 100, 4);
  592. if ($string_make_doncessions_userlist) {
  593. $moneytran_temp = 0;
  594. if (is_array($string_make_doncessions_userlist)) {
  595. $string_make_doncessions_userlist = self::NewUserList($string_make_doncessions_userlist);
  596. foreach ($string_make_doncessions_userlist as $item) {
  597. $moneytran = 0;
  598. //debug_log([__METHOD__, __LINE__, "div1===" . bcmul(bcmul($money, $item['percent'], 8), $item['weight'], 8)], "app_debug.log");
  599. if ($item['total_weight'] > 0 && bcmul(bcmul($money, $item['percent'], 8), $item['weight'], 8) > 0) {
  600. $moneytran = bcmul(
  601. bcdiv(
  602. bcmul($money, $item['percent'], 8),
  603. $item['total_weight'],
  604. 8
  605. ),
  606. $item['weight'],
  607. 8
  608. );
  609. }
  610. //debug_log([__METHOD__, __LINE__, "div2====" . $moneytran] . '====' . $item['total_weight'] . '===' . $item['weight'] . '===' . $item['percent'], "app_debug.log");
  611. $moneytran = sprintf("%.4f", $moneytran);
  612. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 总的{$money} 当前商城没设置参与人员:{$item['saas_id']} 获得:{$moneytran}"], "app_debug.log");
  613. UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $item['saas_id'], $moneytran, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, false);
  614. $moneytran_temp = bcadd($moneytran_temp, $moneytran, 4);
  615. }
  616. }
  617. $moneytran_sy = $money - $moneytran_temp;
  618. if ($moneytran_sy > 0) {
  619. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人 总的{$money} 平分后还有剩余:{$moneytran_sy} 直接给剩余让利人{$push_saas_id} "], "app_debug.log");
  620. UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $push_saas_id, $moneytran_sy, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, true);
  621. }
  622. } else {
  623. //debug_log([__METHOD__, __LINE__, "串码让利 商城让利合伙人总的{$money} 当前商城没设置参与人员 全部给剩余让利人:{$push_saas_id}"], "app_debug.log");
  624. UserStringCodeOrder::transferAddUserWalletAndStoreid($order, $push_saas_id, $money, UserStringCodeOrder::TYPE_STRING_CODE_BRAND_MAKE_DONCESSIONS, $model_val, $order->store_id, true);
  625. }
  626. }
  627. public static function NewUserList($data)
  628. {
  629. foreach ($data as &$value) {
  630. $level_info = \Yii::$app->db->createCommand('select * from cyy_store_partner_level where id=:id')->bindValue(':id', $value['level_id'])->queryOne();
  631. $value['percent'] = $level_info['profit_rate'] / 100;
  632. //debug_log([__METHOD__, __LINE__, "div2====" . $level_info['name'] . '=user_id:' . $value['saas_id']], "app_debug.log");
  633. }
  634. $total_weights = [];
  635. foreach ($data as $item) {
  636. $level_id = $item['level_id'];
  637. $weight = (int)$item['weight']; // 确保 weight 是整数
  638. if (!isset($total_weights[$level_id])) {
  639. $total_weights[$level_id] = 0;
  640. }
  641. $total_weights[$level_id] += $weight;
  642. }
  643. // Step 2: 将 total_weight 添加到每个数组元素中
  644. foreach ($data as &$item) {
  645. $level_id = $item['level_id'];
  646. $item['total_weight'] = $total_weights[$level_id];
  647. }
  648. // 释放引用
  649. unset($item);
  650. return $data;
  651. }
  652. public static function supriseRed($order, $setting, $transfer_money, $model_val)
  653. {
  654. $referrer = $setting['suprise_red'];
  655. $saas_id = SaasUser::findSaasIdByUserId($order->user_id);
  656. if ($saas_id > 0 && $referrer > 0) {
  657. $money = bcmul($transfer_money, $referrer / 100, 4);
  658. $type = UserStringCodeOrder::TYPE_SUPRISE_RED;
  659. UserStringCodeOrder::transferAddUserWallet($order, $saas_id, $money, $type, $model_val);
  660. }
  661. }
  662. public static function appointAward($config, $order, $pv0, $pv1)
  663. {
  664. try {
  665. if (!isset($config['users']) || empty($config['users'])) throw new \Exception('无配置分红池');
  666. foreach ($config['users'] as $p) {
  667. if (!isset($p['rate']) || $p['rate'] <= 0 || !isset($p['saas_id']) || !$p['saas_id'] || !isset($p['remark']) || !$p['remark']) continue;
  668. $money = bcmul($pv0, $p['rate'] / 100, 6);
  669. if ($money > 0){
  670. UserStringCodeOrder::configAddUserWallet($order, $p['saas_id'], $money, UserStringCodeOrder::TYPE_APPOINT_AWARD, 0, $p['remark']);
  671. }
  672. $money = bcmul($pv1, $p['rate'] / 100, 6);
  673. if ($money > 0){
  674. UserStringCodeOrder::configAddUserWallet($order, $p['saas_id'], $money, UserStringCodeOrder::TYPE_APPOINT_AWARD, 1, $p['remark']);
  675. }
  676. }
  677. } catch (\Exception $e) {
  678. //ActionLog::addLog(1, 'appointAward', $e->getMessage());
  679. }
  680. }
  681. }