ShareHolderController.php 128 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851285228532854285528562857285828592860286128622863286428652866286728682869287028712872287328742875287628772878287928802881288228832884288528862887288828892890289128922893289428952896289728982899290029012902290329042905290629072908290929102911291229132914291529162917291829192920292129222923292429252926292729282929293029312932293329342935293629372938293929402941294229432944294529462947294829492950295129522953295429552956295729582959296029612962296329642965296629672968296929702971297229732974297529762977297829792980298129822983298429852986298729882989299029912992299329942995299629972998299930003001300230033004300530063007300830093010301130123013301430153016
  1. <?php
  2. /**
  3. * 重庆赤晓店信息科技有限公司
  4. * https://www.chixiaodian.com
  5. * Copyright (c) 2023 赤店商城 All rights reserved.
  6. */
  7. namespace app\modules\admin\controllers;
  8. use app\jobs\LgCashJob;
  9. use app\librarys\shareTree\exceptions\LogicException;
  10. use app\models\AccountLog;
  11. use app\models\BonusPool;
  12. use app\models\BonusPoolDetail;
  13. use app\models\BonusPoolLevel;
  14. use app\models\Cash;
  15. use app\models\CashExt;
  16. use app\models\Cat;
  17. use app\models\District;
  18. use app\models\Goods;
  19. use app\models\Level;
  20. use app\models\Lg;
  21. use app\models\OldUserTreePath;
  22. use app\models\ShareHolderAreaAgentApply;
  23. use app\models\ShareHolderFrostLog;
  24. use app\models\ShareHolderLevelLog;
  25. use app\models\ShareHolderParentOutLog;
  26. use app\models\ShareHolderProfitGoodsLog;
  27. use app\models\UserShareMoney;
  28. use app\models\UserTreePath;
  29. use app\models\Option;
  30. use app\models\Order;
  31. use app\models\OrderDetail;
  32. use app\models\SaasUser;
  33. use app\models\ShareDetail;
  34. use app\models\ShareHolder;
  35. use app\models\ShareHolderLevel;
  36. use app\models\ShareHolderOutLog;
  37. use app\models\Store;
  38. use app\models\StoreMoneyLog;
  39. use app\models\User;
  40. use app\modules\admin\models\BonusPoolSetting;
  41. use app\utils\Alipay\Alipay;
  42. use app\utils\Alipay\AlipayProfit;
  43. use app\utils\LgApi;
  44. use yii\base\BaseObject;
  45. use yii\helpers\Json;
  46. class ShareHolderController extends BaseController
  47. {
  48. public $export;
  49. public function actionAuditList()
  50. {
  51. $name = get_params('name');
  52. $status = get_params('status');
  53. $mobile = get_params('mobile');
  54. $query = ShareHolder::find()->alias('sh')->leftJoin(['u' => User::tableName()], 'u.id=sh.user_id')
  55. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  56. ->where(['sh.store_id' => get_store_id(), 'sh.is_delete' => 0]);
  57. if ($name) {
  58. $query->andWhere(['or', ['like', 'su.name', $name], ['like', 'sh.name', $name], ['like', 'u.nickname', $name]]);
  59. }
  60. if ($mobile) {
  61. $query->andWhere(['sh.mobile' => $mobile]);
  62. }
  63. if (in_array($status, [0, 1, 2]) && !is_null($status)) {
  64. if ($status == 1) {
  65. $query->andWhere(['in', 'sh.status', [1, 2]]);
  66. } else {
  67. $query->andWhere(['sh.status' => $status]);
  68. }
  69. }
  70. $query->select('sh.*, u.nickname, u.avatar_url as avatar')->orderBy('sh.created_at desc, sh.audit_time asc');
  71. $list = pagination_make($query);
  72. return $this->asJson([
  73. 'code' => 0,
  74. 'msg' => 'success',
  75. 'data' => [
  76. 'data' => $list['list'],
  77. 'pageNo' => $list['pageNo'],
  78. 'totalCount' => $list['totalCount']
  79. ]
  80. ]);
  81. }
  82. /**
  83. * 审核股东
  84. * @return \yii\web\Response
  85. */
  86. public function actionBatchAudit()
  87. {
  88. $id = post_params('id');
  89. $status = post_params('status');
  90. if (!in_array($status, [1, 2])) {
  91. return $this->asJson([
  92. 'code' => 1,
  93. 'msg' => '参数错误'
  94. ]);
  95. }
  96. if (empty($id) || !is_array($id)) {
  97. return $this->asJson([
  98. 'code' => 1,
  99. 'msg' => '参数错误'
  100. ]);
  101. }
  102. // 判断符合条件不 TODO: 申请股东的条件
  103. $t = \Yii::$app->db->beginTransaction();
  104. ShareHolder::updateAll(['status' => $status, 'audit_time' => time()], ['in', 'id', $id]);
  105. if ($status == 1) {
  106. foreach ($id as $value) {
  107. $share_holder = ShareHolder::findOne($value);
  108. $user = User::findOne($share_holder->user_id);
  109. if (!$user) {
  110. $t->rollBack();
  111. return $this->asJson([
  112. 'code' => 1,
  113. 'msg' => '用户不存在'
  114. ]);
  115. }
  116. $share_holder_level = ShareHolderLevel::findOne(['id' => $share_holder->level_id]);
  117. // 检查股东升级
  118. // \app\utils\Share\BonusPool::checkLevel(get_store_id());
  119. \app\utils\Share\BonusPool::ShareHolderLevelJob(get_store_id(), 0, $share_holder->user_id);
  120. // \app\utils\Share\BonusPool::checkChildHolderUpdateLevel($value, $share_holder->level_id);
  121. if ($share_holder_level->member_level > $user->level){
  122. $user->level = $value->member_level;
  123. \Yii::warning(['------------ 等级更新成功自动更新等级对应会员等级 ------------', [
  124. '之前等级' . $user->level,
  125. '之后等级' . $share_holder_level->member_level,
  126. ]]);
  127. }
  128. $user->is_holder = 1;
  129. if (!$user->save()) {
  130. $t->rollBack();
  131. return $this->asJson([
  132. 'code' => 1,
  133. 'msg' => '处理失败'
  134. ]);
  135. }
  136. }
  137. }
  138. $t->commit();
  139. return $this->asJson([
  140. 'code' => 0,
  141. 'msg' => '审核成功'
  142. ]);
  143. }
  144. /**
  145. * 等级
  146. * @return \yii\web\Response
  147. */
  148. public function actionLevelList()
  149. {
  150. $store_id = get_store_id();
  151. $name = get_params('name');
  152. $query = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0]);
  153. if ($name) {
  154. $query->andWhere(['like', 'name', $name]);
  155. }
  156. $query->orderBy(['level' => SORT_ASC]);
  157. $pagination = pagination_make($query);
  158. $list = $pagination['list'];
  159. foreach ($list as &$value) {
  160. $value['condition'] = Json::decode($value['condition']);
  161. }
  162. return $this->asJson([
  163. 'code' => 0,
  164. 'msg' => 'success',
  165. 'data' => [
  166. 'data' => $list,
  167. 'pageNo' => $pagination['pageNo'],
  168. 'totalCount' => $pagination['totalCount']
  169. ],
  170. ]);
  171. }
  172. /**
  173. * 会员等级启用/禁用
  174. */
  175. public function actionLevelStatus()
  176. {
  177. $data = post_params();
  178. $store_id = get_store_id();
  179. $level = ShareHolderLevel::find()->where(['id' => $data['id'], 'store_id' => $store_id])->one();
  180. if (!$level) {
  181. return $this->asJson([
  182. 'code' => 1,
  183. 'msg' => '等级不存在',
  184. ]);
  185. }
  186. $level->status = $data['status'];
  187. if ($data['status'] == 0) {
  188. $exit = ShareHolder::find()->where(['store_id' => $store_id, 'level_id' => $level->id])->exists();
  189. if ($exit) {
  190. return $this->asJson([
  191. 'code' => 1,
  192. 'msg' => '该等级下有会员,不可禁用',
  193. ]);
  194. }
  195. }
  196. if ($level->save()) {
  197. return $this->asJson([
  198. 'code' => 0,
  199. 'msg' => '成功',
  200. ]);
  201. } else {
  202. return $this->asJson([
  203. 'code' => 1,
  204. 'msg' => '网络异常',
  205. ]);
  206. }
  207. }
  208. public function actionUpdateLevel()
  209. {
  210. $store_id = get_store_id();
  211. $level = post_params('level');
  212. $timeout_days = post_params('timeout_days', 0);
  213. $id = post_params('id', 0);
  214. $name = post_params('name');
  215. $member_level = post_params('member_level');
  216. $team_reward_rate = post_params('team_reward_rate', 0);
  217. $range_rate = post_params('range_rate', 0);
  218. $holder_rate = post_params('holder_rate', 0);
  219. $equal_rate = post_params('equal_rate', 0);
  220. $detail = post_params('detail');
  221. $condition = post_params('condition');
  222. $share_rate_one = post_params('share_rate_one', 0);
  223. $share_rate_two = post_params('share_rate_two', 0);
  224. $share_rate_three = post_params('share_rate_three', 0);
  225. $old_team_reward_rate = post_params('old_team_reward_rate', 0);
  226. $old_range_rate = post_params('old_range_rate', 0);
  227. $old_repeat_range_rate = post_params('old_repeat_range_rate', 0);
  228. $old_holder_rate = post_params('old_holder_rate', 0);
  229. $old_equal_rate = post_params('old_equal_rate', 0);
  230. $old_share_rate_one = post_params('old_share_rate_one', 0);
  231. $old_share_rate_two = post_params('old_share_rate_two', 0);
  232. $old_share_rate_three = post_params('old_share_rate_three', 0);
  233. $range_rate_type = post_params('range_rate_type', 0);
  234. $is_user_level_range_rate = post_params('is_user_level_range_rate', 0);
  235. $pic_url = post_params('pic_url', 0);
  236. $status = post_params('status');
  237. $is_default = post_params('is_default');
  238. if (empty($level) || empty($name) || ($range_rate === '' || $range_rate === null) || ($holder_rate === '' || $holder_rate === null) || !in_array($is_default, [0, 1])) {
  239. return $this->asJson([
  240. 'code' => 1,
  241. 'msg' => '参数有误'
  242. ]);
  243. }
  244. $t = \Yii::$app->db->beginTransaction();
  245. if ($id) {
  246. $share_holder_level = ShareHolderLevel::findOne($id);
  247. \Yii::warning([$share_holder_level->level, $level]);
  248. if ($share_holder_level->level != $level) {
  249. $count = ShareHolder::find()->where(['is_delete' => 0, 'store_id' => $store_id, 'level_id' => $share_holder_level->id])->count();
  250. if ($count > 0) {
  251. return $this->asJson([
  252. 'code' => 1,
  253. 'msg' => '当前等级下有会员,禁止修改等级'
  254. ]);
  255. }
  256. $exist = ShareHolderLevel::find()->where(['level' => $level, 'store_id' => $store_id,
  257. 'is_delete' => 0])->exists();
  258. if ($exist) {
  259. return $this->asJson([
  260. 'code' => 1,
  261. 'msg' => '会员等级已存在'
  262. ]);
  263. }
  264. }
  265. if ($share_holder_level->name != $name) {
  266. $exist_0 = ShareHolderLevel::find()->where(['name' => $name, 'store_id' => $store_id,
  267. 'is_delete' => 0])->exists();
  268. if ($exist_0) {
  269. return $this->asJson([
  270. 'code' => 1,
  271. 'msg' => '等级名称重复'
  272. ]);
  273. }
  274. }
  275. } else {
  276. $share_holder_level = new ShareHolderLevel();
  277. $exist = ShareHolderLevel::find()->where(['level' => $level, 'store_id' => $store_id,
  278. 'is_delete' => 0])->exists();
  279. if ($exist) {
  280. return $this->asJson([
  281. 'code' => 1,
  282. 'msg' => '会员等级已存在'
  283. ]);
  284. }
  285. $exist_0 = ShareHolderLevel::find()->where(['name' => $name, 'store_id' => $store_id,
  286. 'is_delete' => 0])->exists();
  287. if ($exist_0) {
  288. return $this->asJson([
  289. 'code' => 1,
  290. 'msg' => '等级名称重复'
  291. ]);
  292. }
  293. }
  294. if ($is_default == 1) {
  295. ShareHolderLevel::updateAll(['is_default' => 0], ['is_default' => 1, 'store_id' => get_store_id(), 'is_delete' => 0]);
  296. } else {
  297. $share_level = ShareHolderLevel::findOne(['is_default' => 1, 'store_id' => get_store_id(), 'is_delete' => 0]);
  298. if (!$share_level) {
  299. $t->rollBack();
  300. return $this->asJson([
  301. 'code' => 1,
  302. 'msg' => '请设置默认等级'
  303. ]);
  304. }
  305. }
  306. $share_level_list = ShareHolderLevel::find()->where([ 'store_id' => $store_id, 'is_delete' => 0])->all();
  307. $is_exist_independent_team = 0;
  308. $is_exist_independent_team_id = 0;
  309. foreach ($share_level_list as $k => $v) {
  310. $share_level_list_condition = Json::decode($v->condition);
  311. if (!isset($share_level_list_condition['shareholder'])) {
  312. continue;
  313. }
  314. $shareholder = $share_level_list_condition['shareholder'];
  315. if ($shareholder['independent_team']) {
  316. $is_exist_independent_team = 1;
  317. $is_exist_independent_team_id = $v->id;
  318. break;
  319. }
  320. }
  321. $current_independent_team = $condition['shareholder']['independent_team'];
  322. if ($is_exist_independent_team == 1 && $current_independent_team == 1 && $is_exist_independent_team_id !== $id) {
  323. return $this->asJson([
  324. 'code' => 1,
  325. 'msg' => '只能一个等级开启独立团队'
  326. ]);
  327. }
  328. if ($condition['self']['is_open'] == '1' && $condition['self']['value']['price'] == '0') {
  329. foreach ($share_level_list as $k => $v) {
  330. $share_level_list_condition = Json::decode($v->condition);
  331. if (!isset($share_level_list_condition['self'])) {
  332. continue;
  333. }
  334. $shareholder = $share_level_list_condition['self'];
  335. if ($shareholder['is_open'] && $shareholder['value']['price'] === '0' && $v->id != $id) {
  336. return $this->asJson([
  337. 'code' => 1,
  338. 'msg' => '只能一个等级开启消费金额为0'
  339. ]);
  340. }
  341. }
  342. }
  343. if (intval($condition['amount_total']['is_open']) && $condition['amount_total']['value'] <= 0) {
  344. return $this->asJson([
  345. 'code' => 1,
  346. 'msg' => '请填写佣金总额达标条件'
  347. ]);
  348. }
  349. $share_holder_level->is_default = $is_default;
  350. $share_holder_level->store_id = $store_id;
  351. $share_holder_level->level = $level;
  352. $share_holder_level->timeout_days = (int)$timeout_days;
  353. $share_holder_level->name = $name;
  354. $share_holder_level->member_level = $member_level;
  355. $share_holder_level->share_rate_one = $share_rate_one;
  356. $share_holder_level->share_rate_two = $share_rate_two;
  357. $share_holder_level->share_rate_three = $share_rate_three;
  358. $share_holder_level->team_reward_rate = $team_reward_rate;
  359. $share_holder_level->range_rate = $range_rate;
  360. $share_holder_level->holder_rate = $holder_rate;
  361. $share_holder_level->equal_rate = $equal_rate;
  362. $share_holder_level->detail = $detail;
  363. $share_holder_level->condition = Json::encode($condition);
  364. $share_holder_level->pic_url = $pic_url;
  365. $share_holder_level->old_team_reward_rate = $old_team_reward_rate;
  366. $share_holder_level->old_range_rate = $old_range_rate;
  367. $share_holder_level->old_repeat_range_rate = $old_repeat_range_rate;
  368. $share_holder_level->old_holder_rate = $old_holder_rate;
  369. $share_holder_level->old_equal_rate = $old_equal_rate;
  370. $share_holder_level->old_share_rate_one = $old_share_rate_one;
  371. $share_holder_level->old_share_rate_two = $old_share_rate_two;
  372. $share_holder_level->old_share_rate_three = $old_share_rate_three;
  373. $share_holder_level->is_user_level_range_rate = $is_user_level_range_rate;
  374. if (!is_null($range_rate_type)) {
  375. $share_holder_level->range_rate_type = $range_rate_type;
  376. }
  377. if (in_array($status, [0, 1]) && !is_null($status)) {
  378. $share_holder_level->status = $status;
  379. }
  380. if ($share_holder_level->save()) {
  381. $t->commit();
  382. return $this->asJson([
  383. 'code' => 0,
  384. 'msg' => '成功'
  385. ]);
  386. } else {
  387. $t->rollBack();
  388. return $this->asJson([
  389. 'code' => 1,
  390. 'msg' => '创建失败'
  391. ]);
  392. }
  393. }
  394. /**
  395. * 会员等级删除
  396. */
  397. public function actionDeleteLevel()
  398. {
  399. $data = post_params();
  400. $store_id = get_store_id();
  401. $level = ShareHolderLevel::findOne(['id' => $data['id'], 'store_id' => $store_id, 'is_delete' => 0]);
  402. if (!$level) {
  403. return $this->asJson([
  404. 'code' => 1,
  405. 'msg' => '等级不存在',
  406. ]);
  407. }
  408. $exist = ShareHolder::find()->where(['store_id' => $store_id, 'level_id' => $level->id, 'is_delete' => 0])->exists();
  409. if ($exist) {
  410. return $this->asJson([
  411. 'code' => 1,
  412. 'msg' => '该等级下有会员,不可删除'
  413. ]);
  414. }
  415. $level->is_delete = 1;
  416. if ($level->save()) {
  417. return $this->asJson([
  418. 'code' => 0,
  419. 'msg' => '成功',
  420. ]);
  421. }
  422. return $this->asJson([
  423. 'code' => 1,
  424. 'msg' => '网络异常',
  425. ]);
  426. }
  427. public function actionLevel()
  428. {
  429. $list = ShareHolderLevel::find()->where(['store_id' => get_store_id(), 'is_delete' => 0])->orderBy('created_at desc')->asArray()->all();
  430. $out_level = 0;
  431. $out_num = 0;
  432. foreach ($list as $item) {
  433. $condition = json_decode($item['condition'], true);
  434. if ($condition['shareholder']['is_open'] == 1 && $condition['shareholder']['independent_team'] == 1 && $condition['shareholder']['num'] > 0) {
  435. $out_level = $item['id'];
  436. $out_num = $condition['shareholder']['num'];
  437. break;
  438. }
  439. }
  440. return $this->asJson([
  441. 'code' => 0,
  442. 'data' => [
  443. 'list' => $list,
  444. 'out_level' => (int)$out_level,
  445. 'out_num' => (int)$out_num,
  446. ],
  447. ]);
  448. }
  449. /**
  450. * 股东列表
  451. * @return \yii\web\Response
  452. */
  453. public function actionList()
  454. {
  455. $nickname = get_params('nickname');
  456. $name = get_params('name');
  457. $mobile = get_params('mobile');
  458. $level_id = get_params('level_id');
  459. $parent = get_params('parent');
  460. $query = ShareHolder::find()->alias('sh')->where(['sh.store_id' => get_store_id(), 'sh.is_delete' => 0, 'sh.status' => 1, 'u.is_delete' => 0])
  461. ->andWhere(['IS NOT', 'u.id', NULL])
  462. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id and shl.is_delete = 0')
  463. ->leftJoin(['u' => User::tableName()], 'u.id=sh.user_id')
  464. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding');
  465. if ($nickname) {
  466. $query->andWhere(['like', 'u.nickname', $nickname]);
  467. }
  468. if ($name) {
  469. $query->andWhere(['like', 'sh.name', $name]);
  470. }
  471. if ($mobile) {
  472. $query->andWhere(['sh.mobile' => $mobile]);
  473. }
  474. if ($level_id) {
  475. $query->andWhere(['sh.level_id' => $level_id]);
  476. }
  477. $query->select('sh.id, sh.name, sh.mobile, u.nickname, u.avatar_url as avatar, shl.name level_name, sh.audit_time, u.parent_id, u.old_parent_id, sh.user_id, sh.level_id, sh.province_id, sh.city_id, sh.district_id, sh.agent_type, sh.agent_rate, sh.is_out')->orderBy('sh.created_at desc, sh.audit_time desc');
  478. if (!$parent) {
  479. $list = pagination_make($query);
  480. $data = $list['list'];
  481. $pageNo = $list['pageNo'];
  482. $count = $list['totalCount'];
  483. } else {
  484. $pageNo = get_params('pageNo', 1);
  485. $pageSize = get_params('pageSize', 20);
  486. $list = $query->asArray()->all();
  487. $new_list = [];
  488. foreach ($list as $value) {
  489. $user = User::find()->alias('u')->where(['u.store_id' => get_store_id(), 'u.id' => $value['parent_id']])
  490. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')->select('su.name')->asArray()->one();
  491. if (false !== strpos($user['name'], $parent)) {
  492. $new_list[] = $value;
  493. }
  494. }
  495. $count = count($new_list);
  496. $data = [];
  497. if (!empty($new_list)) {
  498. $data = array_slice($new_list, ($pageNo - 1) * $pageSize, $pageSize);
  499. }
  500. }
  501. $team_num = Option::get('team_num', get_store_id(), 'bonus_pool', 0)['value'];
  502. // 处理数据
  503. foreach ($data as &$v) {
  504. $team_list = User::findOld()->alias('u')->childs($v['user_id'], true, $team_num)->andWhere(['u.store_id' => get_store_id()])->select('u.id')->column();
  505. $team_order_price = Order::find()
  506. ->where(['store_id' => get_store_id(), 'user_id' => $team_list, 'is_delete' => 0, 'is_pay' => 1, 'trade_status' => [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]])
  507. ->select('pay_price')
  508. ->sum('pay_price');
  509. $v['team_order_price'] = $team_order_price ?? 0;
  510. // parent_id
  511. $user = User::findOne($v['parent_id']);
  512. if ($user) {
  513. $v['parent_id'] = $user->id;
  514. } else {
  515. $v['parent_id'] = 0;
  516. }
  517. $v['level_id'] = $v['level_id'] == 0 ? null : $v['level_id'];
  518. $v['level_name'] = !isset($v['level_name']) || empty($v['level_name']) ? '普通会员' : $v['level_name'];
  519. $v['parent_name'] = '/';
  520. if ($v['parent_id'] > 0) {
  521. $user = User::findOne($v['parent_id']);
  522. $parent_name = $user ? SaasUser::findOne(['mobile' => $user->binding]) : null;
  523. $v['parent_name'] = $parent_name ? $parent_name->name : '/';
  524. }
  525. $oldUser = User::findOne($v['old_parent_id']);
  526. $v['old_parent_name'] = '/';
  527. if ($oldUser) {
  528. $saas_user = SaasUser::findOne(['mobile' => $oldUser->binding]);
  529. if ($saas_user) {
  530. $v['old_parent_id'] = $oldUser->id;
  531. $v['old_parent_name'] = $saas_user->name;
  532. }
  533. }
  534. // $old_parent_name = SaasUser::findOne($v['old_parent_id']);
  535. // $v['old_parent_name'] = $old_parent_name ? $old_parent_name->name : '/';
  536. // // 下级所有的人数
  537. // $v['level_count'] = count(User::find()->childs($v['user_id'])->andWhere(['store_id' => get_store_id()])->asArray()->all()) ?: 0;
  538. // // 一级人数
  539. // $level_one = User::find()->childs($v['user_id'], false, 1)->andWhere(['store_id' => get_store_id()])->select('binding, nickname, avatar_url')->asArray()->all();
  540. // $v['level_one_count'] = count($level_one) ?: 0;
  541. // 极差佣金
  542. $v['range_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $v['user_id'], 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD], 'is_send' => 1])->sum('money');
  543. // 股东分红
  544. $v['holder_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $v['user_id'], 'type' => ShareDetail::TYPE_HOLDER_PROFIT, 'is_send' => 1])->sum('money');
  545. }
  546. foreach ($data as &$v) {
  547. $user = User::findOne($v['user_id']);
  548. $v['nickname'] = $user->nickname;
  549. $v['avatar'] = $user->avatar_url;
  550. if($user->binding){
  551. $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  552. }else{
  553. if($user->alipay_open_id){
  554. $saas_user = SaasUser::findOne(['ali_user_id' => $user->alipay_open_id]);
  555. }
  556. }
  557. $profitGoods = null;
  558. //获取当前购买最大升级产品的记录
  559. $profitGoodsLog = ShareHolderProfitGoodsLog::find()->alias('l')->where(['l.user_id' => $v['user_id'], 'l.is_switch' => 1])
  560. ->leftJoin(['o' => Order::tableName()], 'l.order_id = o.id')->andWhere(['o.is_sale' => 1])
  561. ->orderBy('l.goods_price desc')->select('l.goods_id')->asArray()->one();
  562. if (!empty($profitGoodsLog['goods_id'])) {
  563. $profitGoods_ = Goods::findOne($profitGoodsLog['goods_id']);
  564. $profitGoods = [
  565. 'name' => $profitGoods_->name,
  566. 'cover_pic' => $profitGoods_->cover_pic
  567. ];
  568. }
  569. $v['profit_goods'] = $profitGoods;
  570. // if($saas_user){
  571. // $v['nickname'] = $saas_user->name;
  572. // $v['avatar'] = $saas_user->avatar;
  573. // }
  574. //展示助力出局下级
  575. $v['child_user'] = [];
  576. if ((int)$v['is_out'] === 1) {
  577. $v['child_user'] = ShareHolderOutLog::find()->alias('sh')->where(['sh.parent_user_id' => $v['user_id']])
  578. ->leftJoin(['u' => User::tableName()], 'sh.child_user_id = u.id')
  579. ->leftJoin(['su' => SaasUser::tableName()], 'u.binding = su.mobile')
  580. ->select('su.name, su.avatar')->asArray()->all();
  581. }
  582. }
  583. return $this->asJson([
  584. 'code' => 0,
  585. 'msg' => 'success',
  586. 'data' => [
  587. 'data' => $data,
  588. 'pageNo' => intval($pageNo),
  589. 'totalCount' => $count
  590. ]
  591. ]);
  592. }
  593. /**
  594. * 获取团队订单列表
  595. */
  596. public function actionTeamOrderList()
  597. {
  598. try {
  599. $user_id = get_params('user_id');
  600. $order_no = get_params('order_no');
  601. $name = get_params('name');
  602. $team_num = Option::get('team_num', get_store_id(), 'bonus_pool', 0)['value'];
  603. $team_list = User::findOld()->alias('u')->childs($user_id, true, $team_num)->andWhere(['u.store_id' => get_store_id()])->select('u.id')->column();
  604. $query = Order::find()->alias('o')
  605. ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id')
  606. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  607. ->where(['o.store_id' => get_store_id(), 'o.user_id' => $team_list, 'o.is_delete' => 0, 'is_pay' => 1, 'o.trade_status' => [Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM]]);
  608. if ($order_no) {
  609. $query->andWhere(['LIKE', 'o.order_no', $order_no]);
  610. }
  611. if ($name) {
  612. $query->andWhere(['LIKE', 'su.name', $name]);
  613. }
  614. $query->select('su.name nickname, o.id, o.pay_time, o.order_no, o.pay_price, o.express_price, o.total_price, o.is_pay, o.trade_status, o.created_at')->orderBy('o.created_at desc')->groupBy('o.id');
  615. $data = pagination_make($query);
  616. foreach ($data['list'] as &$value) {
  617. $value['pay_time'] = $value['pay_time'] > 0 ? date("Y-m-d H:i:s", $value['pay_time']) : '-';
  618. $value['created_at'] = $value['created_at'] > 0 ? date("Y-m-d H:i:s", $value['created_at']) : '-';
  619. $value['is_pay'] = (int)$value['is_pay'];
  620. $value['trade_status'] = (int)$value['trade_status'];
  621. $value['goods_list'] = OrderDetail::find()->where(['order_id' => $value['id']])->select('goods_name, num, attr, pic, total_price')->asArray()->all();
  622. }
  623. return $this->asJson([
  624. 'code' => 0,
  625. 'msg' => '获取成功',
  626. 'data' => [
  627. 'list' => $data['list'],
  628. 'pageNo' => $data['pageNo'],
  629. 'totalCount' => $data['totalCount']
  630. ]
  631. ]);
  632. } catch (\Exception $e) {
  633. return [
  634. 'code' => 0,
  635. 'msg' => $e->getMessage(),
  636. 'data' => [
  637. 'data' => [],
  638. 'pageNo' => 0,
  639. 'totalCount' => 0
  640. ]
  641. ];
  642. }
  643. }
  644. /**
  645. * 原推荐关系列表
  646. * @return void
  647. * @author Syan mzsongyan@gmail.com
  648. * @date 2022-07-12
  649. */
  650. public function actionOldShareList()
  651. {
  652. $store_id = get_store_id();
  653. $id = get_params('id');
  654. $name = get_params('nickname');
  655. $mobile = get_params('mobile');
  656. $query = ShareHolder::find()->alias('sh')
  657. ->leftJoin(['u' => User::tableName()], 'u.id = sh.user_id')
  658. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id = sh.level_id and shl.is_delete = 0')
  659. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  660. ->where([
  661. 'u.is_delete' => 0,
  662. 'sh.is_delete' => 0,
  663. 'u.store_id' => $store_id,
  664. 'sh.store_id' => $store_id,
  665. 'sh.status' => 1,
  666. ]);
  667. if ($id) {
  668. $query->andWhere(['u.old_parent_id' => $id]);
  669. }
  670. if ($name) {
  671. $query->andWhere(['like', 'u.nickname', $name]);
  672. }
  673. if ($mobile) {
  674. $query->andWhere(['like', 'u.binding', $mobile]);
  675. }
  676. $query->select('u.nickname as user_name, u.avatar_url as user_avatar, sh.id, sh.name, u.binding as user_mobile, u.old_parent_id, u.id as user_id, shl.name as level_name');
  677. $list = pagination_make($query);
  678. foreach ($list['list'] as &$item) {
  679. $old_parent = User::findOne($item['old_parent_id']);
  680. if ($old_parent) {
  681. $item['old_parent_name'] = $old_parent->nickname;
  682. // $old_parent_user = SaasUser::find()->where(['mobile' => $old_parent->binding])->select('name, avatar')->asArray()->one();
  683. // if ($old_parent_user) {
  684. // $item['old_parent_name'] = $old_parent_user['name'];
  685. // } else {
  686. // $item['old_parent_name'] = '';
  687. // }
  688. } else {
  689. $item['old_parent_name'] = '';
  690. }
  691. $item['count'] = User::find()->alias('u')
  692. ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id = u.id')
  693. ->where(['sh.is_delete' => 0, 'sh.status' => 1])
  694. ->andWhere([
  695. 'u.old_parent_id' => $item['user_id']
  696. ])
  697. ->count();
  698. }
  699. return $this->asJson([
  700. 'code' => 0,
  701. 'msg' => 'success',
  702. 'data' => [
  703. 'data' => $list['list'],
  704. 'pageNo' => $list['pageNo'],
  705. 'totalCount' => $list['totalCount'],
  706. ]
  707. ]);
  708. }
  709. /**
  710. * 链动推荐关系列表
  711. * @return void
  712. * @author Syan mzsongyan@gmail.com
  713. * @date 2022-07-12
  714. */
  715. public function actionChainShareList()
  716. {
  717. $store_id = get_store_id();
  718. $id = get_params('id');
  719. $name = get_params('nickname');
  720. $mobile = get_params('mobile');
  721. $query = ShareHolder::find()->alias('sh')
  722. ->leftJoin(['u' => User::tableName()], 'u.id = sh.user_id')
  723. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id = sh.level_id')
  724. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  725. ->where([
  726. 'u.is_delete' => 0,
  727. 'sh.is_delete' => 0,
  728. 'u.store_id' => $store_id,
  729. 'sh.store_id' => $store_id,
  730. 'sh.status' => 1,
  731. ]);
  732. if ($id) {
  733. $query->andWhere(['u.parent_id' => $id]);
  734. }
  735. if ($name) {
  736. $query->andWhere(['like', 'su.name', $name]);
  737. }
  738. if ($mobile) {
  739. $query->andWhere(['like', 'u.binding', $mobile]);
  740. }
  741. $query->select('u.nickname as user_name, u.avatar_url as user_avatar, sh.id, sh.name, u.binding as user_mobile, u.parent_id, u.id as user_id, shl.name as level_name');
  742. $list = pagination_make($query);
  743. foreach ($list['list'] as &$item) {
  744. $parent = User::findOne($item['parent_id']);
  745. if ($parent) {
  746. $parent_user = SaasUser::find()->where(['mobile' => $parent->binding])->select('name, avatar')->asArray()->one();
  747. if ($parent_user) {
  748. $item['parent_name'] = $parent_user['name'];
  749. } else {
  750. $item['parent_name'] = '';
  751. }
  752. } else {
  753. $item['parent_name'] = '';
  754. }
  755. $item['count'] = User::find()->alias('u')
  756. ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id = u.id')
  757. ->where(['sh.is_delete' => 0, 'sh.status' => 1])
  758. ->andWhere([
  759. 'u.parent_id' => $item['user_id']
  760. ])
  761. ->count();
  762. }
  763. return $this->asJson([
  764. 'code' => 0,
  765. 'msg' => 'success',
  766. 'data' => [
  767. 'data' => $list['list'],
  768. 'pageNo' => $list['pageNo'],
  769. 'totalCount' => $list['totalCount'],
  770. ]
  771. ]);
  772. }
  773. /**
  774. * 下一级列表
  775. * @return \yii\web\Response
  776. */
  777. public function actionLevelOneUser()
  778. {
  779. $name = get_params('name');
  780. $user_id = get_params('user_id');
  781. $level_id = get_params('level_id');
  782. $pageNo = get_params('pageNo', 1);
  783. $pageSize = get_params('pageSize', 20);
  784. $list = User::find()->alias('u')->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')->where(['u.store_id' => get_store_id(), 'u.parent_id' => $user_id])
  785. ->select('u.binding, u.nickname, u.avatar_url, u.id, su.name, su.avatar, u.is_holder')->orderBy('u.is_holder desc')->asArray()->all();
  786. $new_list = [];
  787. foreach ($list as &$value) {
  788. $value['level_name'] = '';
  789. $value['level_one_count'] = 0;
  790. $value['level_count'] = 0;
  791. $value['range_profit'] = 0;
  792. $value['holder_profit'] = 0;
  793. $share_holder = ShareHolder::findOne(['user_id' => $value['id'], 'is_delete' => 0, 'status' => 1]);
  794. $level = -1;
  795. if ($share_holder) {
  796. $level = $share_holder->level_id;
  797. $value['level_name'] = ShareHolderLevel::findOne($level)->name;
  798. // 下级所有的人数
  799. $v['level_count'] = count(User::find()->childs($value['id'])->andWhere(['store_id' => get_store_id()])->asArray()->all()) ?: 0;
  800. // 一级人数
  801. $level_one = User::find()->childs($value['id'], false, 1)->andWhere(['store_id' => get_store_id()])->select('binding, nickname, avatar_url')->asArray()->all();
  802. $v['level_one_count'] = count($level_one) ?: 0;
  803. // 极差佣金
  804. $v['range_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $value['id'], 'type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD], 'is_send' => 1])->sum('money');
  805. // 股东分红
  806. $v['holder_profit'] = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $value['id'], 'type' => ShareDetail::TYPE_HOLDER_PROFIT, 'is_send' => 1])->sum('money');
  807. }
  808. if ($name || $level_id) {
  809. if ($name && !$level_id) {
  810. if (false !== strpos($value['name'], $name) || false !== strpos($value['nickname'], $name)) {
  811. $new_list[] = $value;
  812. }
  813. } else if ($level_id && !$name) {
  814. if ($level == $level_id) {
  815. $new_list[] = $value;
  816. }
  817. } else {
  818. if ((false !== strpos($value['name'], $name) || false !== strpos($value['nickname'], $name)) && $level == $level_id) {
  819. $new_list[] = $value;
  820. }
  821. }
  822. } else {
  823. $new_list[] = $value;
  824. }
  825. }
  826. $count = count($new_list);
  827. $data = [];
  828. if (!empty($new_list)) {
  829. $data = array_slice($new_list, ($pageNo - 1) * $pageSize, $pageSize);
  830. }
  831. return $this->asJson([
  832. 'code' => 0,
  833. 'msg' => 'success',
  834. 'data' => [
  835. 'data' => $data,
  836. 'pageNo' => intval($pageNo),
  837. 'totalCount' => $count
  838. ]
  839. ]);
  840. }
  841. /**
  842. * 编辑
  843. * @return \yii\web\Response
  844. */
  845. public function actionEdit()
  846. {
  847. $id = post_params('id');
  848. $type = post_params('type');
  849. $value = post_params('value');
  850. $saas_user_id = post_params('saas_user_id');
  851. $old_saas_user_id = post_params('old_saas_user_id');
  852. $province_id = post_params('province_id');
  853. $city_id = post_params('city_id');
  854. $district_id = post_params('district_id');
  855. $agent_type = post_params('agent_type', 0);
  856. $agent_rate = post_params('agent_rate', 0);
  857. $is_out = post_params('is_out', 0);
  858. $out_users = post_params('out_users', []);
  859. // TODO: 申请股东的条件
  860. $t = \Yii::$app->db->beginTransaction();
  861. $share_holder = ShareHolder::findOne($id);
  862. if (!$share_holder) {
  863. return $this->asJson([
  864. 'code' => 1,
  865. 'msg' => '数据不存在'
  866. ]);
  867. }
  868. // 删除
  869. if ($type == 1) {
  870. $share_holder->is_delete = 1;
  871. if (!$share_holder->save()) {
  872. $t->rollBack();
  873. return $this->asJson([
  874. 'code' => 1,
  875. 'msg' => '删除异常'
  876. ]);
  877. }
  878. $user = User::findOne($share_holder->user_id);
  879. $user->is_holder = 0;
  880. if (!$user->save()) {
  881. $t->rollBack();
  882. return $this->asJson([
  883. 'code' => 1,
  884. 'msg' => '处理异常'
  885. ]);
  886. }
  887. $t->commit();
  888. return $this->asJson([
  889. 'code' => 0,
  890. 'msg' => '删除成功'
  891. ]);
  892. }
  893. // 编辑等级
  894. $old_parent_id = 0;
  895. if ($type == 2) {
  896. $share_user = User::findOne($share_holder->user_id);
  897. $parent_user_old_parent_id = $share_user->parent_id;
  898. $oldParentChange = 0;
  899. $parentChange = 0;
  900. $beforeOldParentId = $share_user->old_parent_id;
  901. $beforeParentId = $share_user->parent_id;
  902. if ($old_saas_user_id) {
  903. $old_parent_id = $share_user->old_parent_id;
  904. try {
  905. // $old_saas_user = SaasUser::findOne($old_saas_user_id);
  906. // $old_user = User::findOne(['store_id' => get_store_id(), 'binding' => $old_saas_user->mobile]);
  907. $old_user = User::findOne(['store_id' => get_store_id(), 'id' => $old_saas_user_id]);
  908. if (!$old_user) {
  909. $t->rollBack();
  910. return $this->asJson([
  911. 'code' => 1,
  912. 'msg' => '未找到该用户'
  913. ]);
  914. }
  915. $share_user->old_parent_id != $old_user->id && $oldParentChange = 1;
  916. $share_user->old_parent_id = $old_user->id;
  917. } catch (LogicException $e) {
  918. $t->rollBack();
  919. return $this->asJson([
  920. 'code' => 1,
  921. 'msg' => $e->getMessage()
  922. ]);
  923. }
  924. }
  925. if ($saas_user_id) {
  926. try {
  927. $user = User::findOne(['store_id' => get_store_id(), 'id' => $saas_user_id]);
  928. if (!$user) {
  929. $t->rollBack();
  930. return $this->asJson([
  931. 'code' => 1,
  932. 'msg' => '未找到该用户'
  933. ]);
  934. }
  935. $share_user->parent_id != $user->id && $parentChange = 1;
  936. $share_user->parent_id = $user->id;
  937. } catch (LogicException $e) {
  938. $t->rollBack();
  939. return $this->asJson([
  940. 'code' => 1,
  941. 'msg' => $e->getMessage()
  942. ]);
  943. }
  944. }
  945. // 代理
  946. if (in_array($agent_type, [1, 2, 3])) {
  947. if ($agent_type == 1 && empty($province_id)) {
  948. $t->rollBack();
  949. return $this->asJson([
  950. 'code' => 1,
  951. 'msg' => '请选择区域代理地区'
  952. ]);
  953. }
  954. if ($agent_type == 2 && (empty($province_id) || empty($city_id))) {
  955. $t->rollBack();
  956. return $this->asJson([
  957. 'code' => 1,
  958. 'msg' => '请选择区域代理地区'
  959. ]);
  960. }
  961. if ($agent_type == 3 && (empty($province_id) && empty($city_id) && empty($district_id))) {
  962. $t->rollBack();
  963. return $this->asJson([
  964. 'code' => 1,
  965. 'msg' => '请选择区域代理地区'
  966. ]);
  967. }
  968. $is_multi_agent = Option::get('is_multi_agent', $share_holder->store_id, 'bonus_pool_area_agent', 0)['value'];
  969. if ($agent_type == 1) {
  970. $province_share = ShareHolder::find()->where(['province_id' => $province_id, 'agent_type' => 1, 'is_delete' => 0, 'store_id' => get_store_id()])
  971. ->andWhere(['!=', 'id', $share_holder->id])->one();
  972. if ($province_share && !$is_multi_agent) {
  973. $t->rollBack();
  974. return $this->asJson([
  975. 'code' => 1,
  976. 'msg' => '已存在省代理'
  977. ]);
  978. }
  979. }
  980. if ($agent_type == 2) {
  981. $city_share = ShareHolder::find()->where(['city_id' => $city_id, 'agent_type' => 2, 'is_delete' => 0, 'store_id' => get_store_id()])->andWhere(['!=', 'id', $share_holder->id])->one();
  982. if ($city_share && !$is_multi_agent) {
  983. $t->rollBack();
  984. return $this->asJson([
  985. 'code' => 1,
  986. 'msg' => '已存在市代理'
  987. ]);
  988. }
  989. }
  990. if ($agent_type == 3) {
  991. $district_share = ShareHolder::find()->where(['district_id' => $district_id, 'agent_type' => 3, 'is_delete' => 0, 'store_id' => get_store_id()])->andWhere(['!=', 'id', $share_holder->id])->one();
  992. if ($district_share && !$is_multi_agent) {
  993. $t->rollBack();
  994. return $this->asJson([
  995. 'code' => 1,
  996. 'msg' => '已存在区域代理'
  997. ]);
  998. }
  999. }
  1000. $share_holder->province_id = $province_id;
  1001. $share_holder->city_id = $city_id;
  1002. $share_holder->district_id = $district_id;
  1003. $share_holder->agent_rate = $agent_rate;
  1004. $share_holder->agent_type = $agent_type;
  1005. }
  1006. if ($agent_type == 0) {
  1007. $share_holder->agent_type = 0;
  1008. }
  1009. $old_share_holder_level_id = $share_holder->level_id;
  1010. $old_share_holder_level = ShareHolderLevel::findOne(['id' => $old_share_holder_level_id]);
  1011. $share_holder->level_id = $value;
  1012. if (!$share_holder->save()) {
  1013. $t->rollBack();
  1014. return $this->asJson([
  1015. 'code' => 1,
  1016. 'msg' => '处理异常'
  1017. ]);
  1018. }
  1019. $share_holder_level = ShareHolderLevel::findOne(['id' => $value]);
  1020. $open = true;
  1021. $condition = Json::decode($share_holder_level->condition);
  1022. if (isset($condition['shareholder'])) {
  1023. $shareholder = $condition['shareholder'];
  1024. if ($shareholder['independent_team']) {
  1025. $open = false;
  1026. $share_user->parent_id = 0;
  1027. }
  1028. }
  1029. //todo 提交bug说是后台修改没有记录 增加修改记录
  1030. if (intval($old_share_holder_level_id) !== intval($value)) {
  1031. $level_log = new ShareHolderLevelLog();
  1032. $level_log->before_level = $old_share_holder_level->level;
  1033. $level_log->after_level = $share_holder_level->level;
  1034. $level_log->user_id = $share_holder->user_id;
  1035. $level_log->store_id = $share_holder->store_id;
  1036. if ($is_out == 1 && count($out_users) == 0) {
  1037. $level_log->desc = "后台修改等级, 没有助推下级";
  1038. } else {
  1039. $level_log->desc = "后台修改等级";
  1040. }
  1041. if (!$level_log->save()) {
  1042. return $this->asJson([
  1043. 'code' => 1,
  1044. 'msg' => '股东等级更新失败'
  1045. ]);
  1046. }
  1047. }
  1048. if ($share_holder_level->member_level > $share_user->level){
  1049. $share_user->level = $share_holder_level->member_level;
  1050. \Yii::warning(['------------ 编辑等级对应会员等级 ------------', [
  1051. '之前等级' . $share_user->level,
  1052. '之后等级' . $share_holder_level->member_level,
  1053. ]]);
  1054. }
  1055. if (!$share_user->save()) {
  1056. $t->rollBack();
  1057. \Yii::warning(['------------ 编辑等级对应会员等级更新失败 ------------', $share_user->errors]);
  1058. return $this->asJson([
  1059. 'code' => 1,
  1060. 'msg' => '处理异常'
  1061. ]);
  1062. }
  1063. $oldParentChange && \app\utils\Share\BonusPool::addShareHolderParentOutLog($share_user, $beforeOldParentId, ShareHolderParentOutLog::getConditionName(11), 1);
  1064. $parentChange && \app\utils\Share\BonusPool::addShareHolderParentOutLog($share_user, $beforeParentId, ShareHolderParentOutLog::getConditionName(11), 0);
  1065. // if ($old_parent_id > 0 && $old_parent_id !== $share_user->old_parent_id) {
  1066. // $addShareHolderParentOutLog = \app\utils\Share\BonusPool::addShareHolderParentOutLog($share_user, $old_parent_id, "后台修改数据更改上级", 1);
  1067. // if ($addShareHolderParentOutLog['code'] != 0) {
  1068. // $t->rollBack();
  1069. // \Yii::warning(['------------ 编辑股东旧上级记录更新失败 ------------', $addShareHolderParentOutLog['msg']]);
  1070. // return $this->asJson([
  1071. // 'code' => 1,
  1072. // 'msg' => '处理异常'
  1073. // ]);
  1074. // };
  1075. // }
  1076. try {
  1077. // 检查下级升级
  1078. // \app\utils\Share\BonusPool::checkLevel(get_store_id(), 1);
  1079. \app\utils\Share\BonusPool::ShareHolderLevelJob(get_store_id(), 1, $share_holder->user_id);
  1080. // \app\utils\Share\BonusPool::checkChildHolderUpdateLevel($share_holder->user_id, $share_holder->level_id);
  1081. } catch (\Exception $e) {
  1082. $t->rollBack();
  1083. return $this->asJson([
  1084. 'code' => 1,
  1085. 'msg' => '处理异常'
  1086. ]);
  1087. }
  1088. if ($is_out == 1) {
  1089. $share_holder->is_out = 1;
  1090. $share_holder->save();
  1091. if (count($out_users) > 0) {
  1092. foreach ($out_users as $user_id) {
  1093. $user_item = User::findOne($user_id);
  1094. $child = ShareHolder::findOne(['user_id' => $user_id, 'is_delete' => 0]);
  1095. if ($user_item) {
  1096. $out_log = ShareHolderOutLog::findOne([
  1097. 'parent_user_id' => $share_holder->user_id,
  1098. 'child_user_id' => $user_id
  1099. ]);
  1100. if (!$out_log) {
  1101. $out_log = new ShareHolderOutLog();
  1102. $out_log->parent_user_id = $share_holder->user_id;
  1103. $out_log->child_user_id = $user_id;
  1104. }
  1105. $out_log->status = $child->is_out;
  1106. $out_log->save();
  1107. if ($child && intval($child->is_out)) {
  1108. continue;
  1109. }
  1110. $beforeParentId = $user_item->parent_id;
  1111. $user_item->parent_id = $parent_user_old_parent_id;
  1112. if (!$user_item->save()) {
  1113. $t->rollBack();
  1114. return $this->asJson([
  1115. 'code' => 1,
  1116. 'msg' => '助力出局的股东改变关系失败'
  1117. ]);
  1118. }
  1119. \app\utils\Share\BonusPool::addShareHolderParentOutLog($user_item, $beforeParentId, "后台修改数据使股东上级出局");
  1120. //记录出局关系
  1121. //判断滑落
  1122. $share_detail_arr = [
  1123. ShareDetail::TYPE_HOLDER_PROFIT,
  1124. ShareDetail::TYPE_RANGE_PROFIT,
  1125. ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_PROFIT,
  1126. ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT,
  1127. ShareDetail::TYPE_RANGE_PROFIT_OLD,
  1128. ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD,
  1129. ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL
  1130. ];
  1131. $share_detail = ShareDetail::find()->alias('sd')
  1132. ->leftJoin(['o' => Order::tableName()], 'o.id = sd.type_id')
  1133. ->where(['o.user_id' => $user_item->id, 'sd.type' => $share_detail_arr, 'sd.user_id' => $share_user->id])
  1134. ->asArray()->one();
  1135. if ($share_detail) {
  1136. ShareDetail::handleChildData($share_detail['id']);
  1137. }
  1138. }
  1139. // TODO 后台修改股东等级 下级不变动上级问题
  1140. }
  1141. }
  1142. }
  1143. $t->commit();
  1144. return $this->asJson([
  1145. 'code' => 0,
  1146. 'msg' => '修改成功'
  1147. ]);
  1148. }
  1149. }
  1150. public function actionAdd()
  1151. {
  1152. $store_id = get_store_id();
  1153. $name = post_params('name');
  1154. $user_id = post_params('user_id');
  1155. $mobile = post_params('mobile');
  1156. $province = post_params('province', 0);
  1157. $city = post_params('city', 0);
  1158. $district = post_params('district', 0);
  1159. $town = post_params('town', 0);
  1160. $address = post_params('address', '');
  1161. $is_area = post_params('is_area');
  1162. $agent_type = post_params('agent_type');
  1163. $agent_rate = (float)post_params('agent_rate');
  1164. $agent_rate_status = post_params('agent_rate_status');
  1165. //获取省市区
  1166. $province_name = District::findOne($province)->name ?: '';
  1167. $city_name = District::findOne($city)->name ?: '';
  1168. $district_name = District::findOne($district)->name ?: '';
  1169. $town_name = District::findOne($town)->name ?: '';
  1170. if (!$is_area) {
  1171. if (empty($name) || empty($mobile) || empty($province) || empty($city) || empty($district) || empty($address)
  1172. || empty($province_name) || empty($city_name) || empty($district_name)) {
  1173. // return $this->asJson([
  1174. // 'code' => 1,
  1175. // 'msg' => '参数错误'
  1176. // ]);
  1177. }
  1178. }
  1179. $t = \Yii::$app->db->beginTransaction();
  1180. $where = ['store_id' => $store_id, 'user_id' => $user_id, 'is_delete' => 0, 'status' => [1, 0]];
  1181. if ($is_area) {
  1182. $where = array_merge($where, ['agent_type' => [1, 2, 3]]);
  1183. }
  1184. $admin = ShareHolder::find()->where($where)->one();
  1185. if ($admin) {
  1186. return $this->asJson([
  1187. 'code' => 1,
  1188. 'msg' => '当前已成为股东或存在待审核记录'
  1189. ]);
  1190. }
  1191. $is_multi_agent = Option::get('is_multi_agent', $store_id, 'bonus_pool_area_agent', 0)['value'];
  1192. if ($is_area) {
  1193. $user_area_agent = ShareHolderAreaAgentApply::findOne(
  1194. [
  1195. 'store_id' => $store_id,
  1196. 'user_id' => $user_id,
  1197. 'is_delete' => 0,
  1198. 'status' => [0, 1]
  1199. ]
  1200. );
  1201. if ($user_area_agent) {
  1202. return $this->asJson([
  1203. 'code' => 1,
  1204. 'msg' => '当前已成为区域代理或存在待审核记录'
  1205. ]);
  1206. }
  1207. $where = [
  1208. 'store_id' => $store_id,
  1209. 'is_delete' => 0,
  1210. 'status' => [0, 1],
  1211. 'agent_type' => $agent_type,
  1212. 'province_id' => $province
  1213. ];
  1214. switch ($agent_type) {
  1215. case 2:
  1216. $where = array_merge($where, ['city_id' => $city]);
  1217. break;
  1218. case 3:
  1219. $where = array_merge($where, ['city_id' => $city, 'district_id' => $district]);
  1220. break;
  1221. case 4:
  1222. $where = array_merge($where, ['city_id' => $city, 'district_id' => $district, 'town_id' => $town]);
  1223. break;
  1224. }
  1225. $other_area_agent = ShareHolderAreaAgentApply::findOne($where);
  1226. if ($other_area_agent && !$is_multi_agent) {
  1227. return $this->asJson([
  1228. 'code' => 1,
  1229. 'msg' => '当前存在同区域待审核记录'
  1230. ]);
  1231. }
  1232. $other_share_holder = ShareHolder::findOne($where);
  1233. if ($other_share_holder && !$is_multi_agent) {
  1234. return $this->asJson([
  1235. 'code' => 1,
  1236. 'msg' => '当前存在同区域代理'
  1237. ]);
  1238. }
  1239. }
  1240. //获取手机号
  1241. $user = User::findOne($user_id);
  1242. $binding = $user->binding;
  1243. //保存信息
  1244. $share_level = ShareHolderLevel::findOne(['is_default' => 1, 'store_id' => get_store_id(), 'is_delete' => 0]);
  1245. if (!$share_level) {
  1246. return $this->asJson([
  1247. 'code' => 1,
  1248. 'msg' => '需要添加等级'
  1249. ]);
  1250. }
  1251. $share_holder = new ShareHolder();
  1252. if ($is_area) {
  1253. $share_holder_ = ShareHolder::findOne(['store_id' => get_store_id(), 'user_id' => $user_id, 'is_delete' => 0]);
  1254. if ($share_holder_) {
  1255. $share_holder = $share_holder_;
  1256. } else {
  1257. $share_holder->audit_time = time();
  1258. $share_holder->level_id = $share_level->id;
  1259. }
  1260. if($share_holder->agent_type == 0){
  1261. $share_holder->agent_time = time();
  1262. }
  1263. $share_holder->agent_type = $agent_type;
  1264. $share_holder->agent_rate = $agent_rate;
  1265. $share_holder->agent_rate_status = $agent_rate_status;
  1266. }
  1267. $share_holder->store_id = get_store_id();
  1268. $share_holder->user_id = $user_id;
  1269. $share_holder->name = $name;
  1270. $share_holder->address = $address;
  1271. $share_holder->mobile = $binding;
  1272. $share_holder->province_id = $share_holder->province = $province;
  1273. $share_holder->city_id = $share_holder->city = $city;
  1274. $share_holder->district_id = $share_holder->district = $district;
  1275. $share_holder->town_id = $town;
  1276. $share_holder->province_name = $province_name;
  1277. $share_holder->city_name = $city_name;
  1278. $share_holder->district_name = $district_name;
  1279. $share_holder->town_name = $town_name;
  1280. $share_holder->status = 1;
  1281. if (!$share_holder->save()) {
  1282. $t->rollBack();
  1283. return $this->asJson([
  1284. 'code' => 1,
  1285. 'msg' => '股东处理失败'
  1286. ]);
  1287. }
  1288. if ($share_level->member_level > $user->level){
  1289. $user->level = $share_level->member_level;
  1290. \Yii::warning(['------------ 添加等级对应会员等级 ------------', [
  1291. '之前等级' . $user->level,
  1292. '之后等级' . $share_level->member_level,
  1293. ]]);
  1294. }
  1295. $user->is_holder = 1;
  1296. if (!$user->save()) {
  1297. $t->rollBack();
  1298. return $this->asJson([
  1299. 'code' => 1,
  1300. 'msg' => '处理失败'
  1301. ]);
  1302. }
  1303. $t->commit();
  1304. return $this->asJson([
  1305. 'code' => 0,
  1306. 'msg' => '添加成功'
  1307. ]);
  1308. }
  1309. /**
  1310. * 极差分润订单
  1311. * @return \yii\web\Response
  1312. */
  1313. public function actionShareOrder()
  1314. {
  1315. $order_no = get_params('order_no');
  1316. $name = get_params('name');
  1317. $type = get_params('type');// 区分链动
  1318. $is_area = get_params('is_area'); //只显示区域分红
  1319. $query = Order::find()->alias('o')->leftJoin(['sd' => ShareDetail::tableName()], 'sd.type_id = o.id')
  1320. ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id')
  1321. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  1322. ->where(['o.store_id' => get_store_id()])
  1323. ->andWhere(['<>', 'o.trade_status', 1]);
  1324. if ($name) {
  1325. $query->andWhere(['like', 'su.name', $name]);
  1326. }
  1327. $type_where = ['in', 'sd.type', [2, 5, 6, 7, 8, 9]];
  1328. if ($type) {
  1329. $type_where = ['in', 'sd.type', [2, 5, 6, 9]];
  1330. }
  1331. if ($is_area) {
  1332. $type_where = ['AND', ['sd.type' => 3], ['>', 'sd.money', '0']];
  1333. }
  1334. $type_where = ['OR', $type_where, ['OR', ['>', 'holder_first_price', 0], ['>', 'holder_second_price', 0], ['>', 'holder_third_price', 0],
  1335. ['>', 'old_holder_first_price', 0], ['>', 'old_holder_second_price', 0], ['>', 'old_holder_third_price', 0]]];
  1336. $query->andWhere($type_where);
  1337. if ($order_no) {
  1338. $query->andWhere(['o.order_no' => $order_no]);
  1339. }
  1340. $query->select('o.id, o.pay_time created_at, sd.money, o.id type_id, su.name nickname, o.pay_time, o.order_no, o.id order_id, o.holder_first_price,
  1341. o.holder_second_price, o.holder_third_price, o.old_holder_first_price, o.old_holder_second_price, o.old_holder_third_price,o.express_price')
  1342. ->orderBy('o.id desc')->groupBy('o.id');
  1343. $list = pagination_make($query);
  1344. foreach ($list['list'] as &$value) {
  1345. $value['order_pay_price'] = 0;
  1346. $order = Order::find()->select('pay_price')->where(['order_no' => $value['order_no']])->one();
  1347. if ($order) {
  1348. $value['order_pay_price'] = $order->pay_price;
  1349. }
  1350. $value['goods_list'] = OrderDetail::find()->where(['order_id' => $value['type_id']])->select('goods_name, num, attr, pic, total_price')->asArray()->all();
  1351. if ($type) {
  1352. $value['range_profit'] = ShareDetail::find()->where(['type' => ShareDetail::TYPE_RANGE_PROFIT, 'type_id' => $value['type_id']])->sum('money');
  1353. } else {
  1354. $value['range_profit'] = ShareDetail::find()->where(['type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL], 'type_id' => $value['type_id']])->sum('money');
  1355. }
  1356. $value['agent_profit'] = ShareDetail::find()->where(['type' => ShareDetail::TYPE_AREA_PROFIT, 'type_id' => $value['type_id']])->sum('money');
  1357. $share_holder_price = bcadd($value['old_holder_first_price'],
  1358. bcadd($value['old_holder_second_price'],
  1359. bcadd($value['old_holder_third_price'],
  1360. bcadd($value['holder_first_price'],
  1361. bcadd($value['holder_second_price'], $value['holder_third_price'], 2)
  1362. , 2)
  1363. , 2)
  1364. , 2)
  1365. , 2);
  1366. $value['share_holder_price'] = '¥' . $share_holder_price;
  1367. }
  1368. return $this->asJson([
  1369. 'code' => 0,
  1370. 'msg' => 'success',
  1371. 'data' => [
  1372. 'data' => $list['list'],
  1373. 'pageNo' => $list['pageNo'],
  1374. 'totalCount' => $list['totalCount']
  1375. ]
  1376. ]);
  1377. }
  1378. /**
  1379. * 佣金列表
  1380. * @return \yii\web\Response
  1381. */
  1382. public function actionProfitList()
  1383. {
  1384. $order_no = get_params('order_no');
  1385. $order_id = get_params('order_id', 0);
  1386. $name = get_params('name');
  1387. $buyer = get_params('buyer');
  1388. $level_id = get_params('level_id');
  1389. $pay_start_time = get_params('pay_start_time');
  1390. $pay_end_time = get_params('pay_end_time');
  1391. $send_start_time = get_params('send_start_time');
  1392. $send_end_time = get_params('send_end_time');
  1393. $profit_type = get_params('profit_type');
  1394. $type = get_params('type', 0);
  1395. $store_id = get_store_id();
  1396. $query = ShareDetail::find()->alias('sd')->leftJoin(['o' => Order::tableName()], 'o.id=sd.type_id AND sd.type <> 1')
  1397. ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id')
  1398. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  1399. ->leftJoin(['u1' => User::tableName()], 'u1.id=sd.user_id')
  1400. ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding')
  1401. ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id')
  1402. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id and shl.is_delete = 0')
  1403. ->where([
  1404. 'sd.store_id' => $store_id,
  1405. 'u.store_id' => $store_id,
  1406. 'u1.store_id' => $store_id,
  1407. 'sh.store_id' => $store_id,
  1408. 'sd.is_delete' => 0,
  1409. 'sh.is_delete' => 0
  1410. ]);
  1411. $query->andWhere(['in', 'sd.type', [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]]);
  1412. if ($type) {
  1413. $query->andWhere(['in', 'sd.type', [2, 5, 6, 9]]);
  1414. } else {
  1415. if ($profit_type == ShareDetail::TYPE_AREA_PROFIT) {
  1416. $query->andWhere(['sd.type' => ShareDetail::TYPE_AREA_PROFIT])->andWhere(['>', 'sd.money', 0]);
  1417. }
  1418. if ($profit_type == ShareDetail::TYPE_RANGE_PROFIT) {
  1419. $query->andWhere(['sd.type' => [ShareDetail::TYPE_RANGE_PROFIT, ShareDetail::TYPE_RANGE_PROFIT_OLD, ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL]]);
  1420. }
  1421. if (!$profit_type) {
  1422. $query->andWhere(['<>', 'sd.type', ShareDetail::TYPE_AREA_PROFIT]);
  1423. }
  1424. }
  1425. if ($name) {
  1426. $query->andWhere([
  1427. 'or',
  1428. ['like', 'su1.name', $name],
  1429. ['like', 'u1.nickname', $name],
  1430. ]);
  1431. }
  1432. if ($level_id) {
  1433. $query->andWhere(['sh.level_id' => $level_id]);
  1434. }
  1435. if ($order_id) {
  1436. $query->andWhere(['sd.type_id' => $order_id]);
  1437. }
  1438. if ($order_no) {
  1439. $query->andWhere(['o.order_no' => $order_no]);
  1440. }
  1441. if ($buyer) {
  1442. $query->andWhere([
  1443. 'or',
  1444. ['like', 'su.name', $buyer],
  1445. ['like', 'u.nickname', $buyer],
  1446. ]);
  1447. }
  1448. if ($pay_start_time) {
  1449. $query->andWhere(['>=', 'o.pay_time', strtotime($pay_start_time)]);
  1450. }
  1451. if ($pay_end_time) {
  1452. $query->andWhere(['<=', 'o.pay_time', strtotime($pay_end_time)]);
  1453. }
  1454. if ($send_start_time) {
  1455. $query->andWhere(['>=', 'sd.send_time', strtotime($send_start_time)]);
  1456. }
  1457. if ($send_end_time) {
  1458. $query->andWhere(['<=', 'sd.send_time', strtotime($send_end_time)]);
  1459. }
  1460. $query->select('sd.*, su.name buyer_name, u.nickname buyer_nickname, o.pay_time, o.order_no, u1.nickname holder_nickname, u1.avatar_url holder_avatar_url, shl.name level_name, o.order_no, o.pay_price, sh.agent_type')->orderBy('sd.created_at desc');
  1461. $query->groupBy('sd.id');
  1462. $range_name = Option::get('range_name', get_store_id(), 'bonus_pool', '')['value'];
  1463. $holder_name = Option::get('holder_name', get_store_id(), 'bonus_pool', '')['value'];
  1464. $area_name = Option::get('area_name', get_store_id(), 'bonus_pool', '')['value'];
  1465. $old_range_name = Option::get('old_range_name', get_store_id(), 'bonus_pool', '')['value'];
  1466. $direct_range_name = Option::get('direct_range_name', get_store_id(), 'bonus_pool', '')['value'];
  1467. $old_add_holder_name = Option::get('old_add_holder_name', get_store_id(), 'bonus_pool', '')['value'];
  1468. $list = pagination_make($query);
  1469. foreach ($list['list'] as &$value) {
  1470. $value['agent_type'] = (int)$value['agent_type'];
  1471. $value['profit_name'] = '分红';
  1472. if ($value['type'] == ShareDetail::TYPE_HOLDER_PROFIT) {
  1473. // $value['profit_name'] = $holder_name ?: '股东分红';
  1474. $value['profit_name'] = $holder_name ?: '股东分红';
  1475. $value['order_no'] = '奖金池ID:' . $value['type_id'];
  1476. $value['buyer_name'] = '';
  1477. $value['buyer_nickname'] = '';
  1478. $value['pay_price'] = '';
  1479. }
  1480. if ($value['type'] == ShareDetail::TYPE_RANGE_PROFIT) {
  1481. // $value['profit_name'] = $range_name ?: '级差分红';
  1482. $value['profit_name'] = $range_name ?: '级差分红';
  1483. }
  1484. if ($value['type'] == ShareDetail::TYPE_RANGE_PROFIT_OLD) {
  1485. // $value['profit_name'] = $range_name ?: '级差分红(原关系)';
  1486. $value['profit_name'] = $old_range_name ?: '级差分红(原关系)';
  1487. }
  1488. if ($value['type'] == ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT_OLD) {
  1489. // $value['profit_name'] = $range_name ?: '直属团队收益分成(原关系)';
  1490. $value['profit_name'] = $old_add_holder_name ?: '直属团队收益分成(原关系)';
  1491. }
  1492. if ($value['type'] == ShareDetail::TYPE_TWO_PLUS_ONE_SHARE_TEAM_PROFIT) {
  1493. // $value['profit_name'] = $range_name ?: '直属团队收益分成';
  1494. $value['profit_name'] = $direct_range_name ?: '直属团队收益分成';
  1495. }
  1496. if ($value['type'] == ShareDetail::TYPE_AREA_PROFIT) {
  1497. // $value['profit_name'] = $area_name ?: '区域分红';
  1498. $value['profit_name'] = $area_name ?: '区域分红';
  1499. }
  1500. if ($value['type'] == ShareDetail::TYPE_FROST_PROFIT) {
  1501. // $value['profit_name'] = $range_name ?: '冻结金额释放';
  1502. $value['profit_name'] = '冻结金额释放';
  1503. }
  1504. if ($value['type'] == ShareDetail::TYPE_RANGE_PROFIT_OLD_USER_LEVEL) {
  1505. // $value['profit_name'] = $range_name ?: '冻结金额释放';
  1506. $value['profit_name'] = '商城会员等级分红';
  1507. }
  1508. }
  1509. return $this->asJson([
  1510. 'code' => 0,
  1511. 'msg' => 'success',
  1512. 'data' => [
  1513. 'data' => $list['list'],
  1514. 'pageNo' => $list['pageNo'],
  1515. 'totalCount' => $list['totalCount']
  1516. ]
  1517. ]);
  1518. }
  1519. /**
  1520. * 分销佣金列表
  1521. * @return \yii\web\Response
  1522. */
  1523. public function actionShareProfitList()
  1524. {
  1525. try {
  1526. $order_no = get_params('order_no');
  1527. $name = get_params('name');
  1528. $buyer = get_params('buyer');
  1529. $pay_start_time = get_params('pay_start_time');
  1530. $pay_end_time = get_params('pay_end_time');
  1531. $query = UserShareMoney::find()->alias('usm')->leftJoin(['o' => Order::tableName()], 'o.id=usm.order_id')
  1532. ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id')
  1533. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  1534. ->leftJoin(['u1' => User::tableName()], 'u1.id=usm.user_id')
  1535. ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding')
  1536. ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id')
  1537. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id and shl.is_delete=0')
  1538. ->where(['usm.store_id' => get_store_id(), 'usm.is_delete' => 0, 'usm.type' => 2, 'usm.source' => [1, 2, 3, 4], 'o.trade_status' => [
  1539. Order::ORDER_FLOW_NO_SEND, Order::ORDER_FLOW_SEND, Order::ORDER_FLOW_CONFIRM
  1540. ]])
  1541. ->groupBy("usm.id");
  1542. if ($name) {
  1543. $query->andWhere([
  1544. 'or',
  1545. ['like', 'su1.name', $name],
  1546. ['like', 'u1.nickname', $name],
  1547. ]);
  1548. }
  1549. if ($order_no) {
  1550. $query->andWhere(['o.order_no' => $order_no]);
  1551. }
  1552. if ($buyer) {
  1553. $query->andWhere([
  1554. 'or',
  1555. ['like', 'su.name', $buyer],
  1556. ['like', 'u.nickname', $buyer],
  1557. ]);
  1558. }
  1559. if ($pay_start_time) {
  1560. $query->andWhere(['>=', 'o.pay_time', strtotime($pay_start_time)]);
  1561. }
  1562. if ($pay_end_time) {
  1563. $query->andWhere(['<=', 'o.pay_time', strtotime($pay_end_time)]);
  1564. }
  1565. $query->select('usm.*, su.name buyer_name, u.nickname buyer_nickname, o.pay_time, o.order_no, u1.nickname holder_nickname, u1.avatar_url holder_avatar_url, shl.name level_name, o.order_no, o.pay_price')->orderBy('usm.created_at desc');
  1566. // $query->groupBy('usm.order_id');
  1567. $list = pagination_make($query);
  1568. return $this->asJson([
  1569. 'code' => 0,
  1570. 'msg' => 'success',
  1571. 'data' => [
  1572. 'data' => $list['list'],
  1573. 'pageNo' => $list['pageNo'],
  1574. 'totalCount' => $list['totalCount']
  1575. ]
  1576. ]);
  1577. } catch (\Exception $e) {
  1578. return $this->asJson([
  1579. 'code' => 1,
  1580. 'msg' => $e->getMessage()
  1581. ]);
  1582. }
  1583. }
  1584. //奖金池新增
  1585. public function actionPoolSave()
  1586. {
  1587. try {
  1588. $store_id = get_store_id();
  1589. $start_time = input_params('start_time');
  1590. $end_time = input_params('end_time');
  1591. $money = input_params('money');
  1592. $level_id = input_params('level_id');
  1593. $pool = new BonusPool();
  1594. $pool->store_id = $store_id;
  1595. $pool->start_time = strtotime($start_time);
  1596. $pool->end_time = strtotime($end_time);
  1597. if(!$pool->save()){
  1598. throw new \Exception(array_shift($pool->getFirstErrors()));
  1599. }
  1600. $poolLevel = new BonusPoolLevel();
  1601. $poolLevel->store_id = $store_id;
  1602. $poolLevel->pool_id = $pool->id;
  1603. $poolLevel->money = $money;
  1604. $poolLevel->level_id = $level_id;
  1605. $poolLevel->user_id = '[]';
  1606. $poolLevel->is_send = 0;
  1607. $poolLevel->send_time = 0;
  1608. if(!$poolLevel->save()){
  1609. throw new \Exception(array_shift($poolLevel->getFirstErrors()));
  1610. }
  1611. return $this->asJson([
  1612. 'code' => 0,
  1613. 'msg' => '操作成功',
  1614. ]);
  1615. } catch (\Exception $e) {
  1616. return $this->asJson([
  1617. 'code' => 1,
  1618. 'msg' => $e->getMessage()
  1619. ]);
  1620. }
  1621. }
  1622. /**
  1623. * 奖金池列表
  1624. * @return \yii\web\Response
  1625. */
  1626. public function actionPool()
  1627. {
  1628. $send_start_time = get_params('send_start_time');
  1629. $send_end_time = get_params('send_end_time');
  1630. $pool_time = get_params('pool_time');
  1631. $level_id = get_params('level_id');
  1632. $store_id = get_store_id();
  1633. $query = BonusPoolLevel::find()->alias('bpl')->leftJoin(['bp' => BonusPool::tableName()], 'bp.id=bpl.pool_id')
  1634. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=bpl.level_id')
  1635. ->where(['bpl.store_id' => $store_id]);
  1636. if ($send_start_time) {
  1637. $query->andWhere(['>=', 'bp.send_time', strtotime($send_start_time)]);
  1638. }
  1639. if ($send_end_time) {
  1640. $query->andWhere(['<=', 'bp.send_time', strtotime($send_end_time)]);
  1641. }
  1642. if ($pool_time) {
  1643. $query->andWhere(['and', ['>=', 'bp.start_time', strtotime($pool_time)], ['<=', 'bp.end_time', strtotime($pool_time)]]);
  1644. }
  1645. if ($level_id) {
  1646. $query->andWhere(['bpl.level_id' => $level_id]);
  1647. }
  1648. $query->select('bp.start_time, bp.end_time, bpl.*, shl.name level_name')->orderBy('bpl.created_at desc');
  1649. $list = pagination_make($query);
  1650. $high_level_join_average = intval(Option::get('high_level_join_average', $store_id, 'bonus_pool', 0)['value']);
  1651. $dividends_method = intval(Option::get('dividends_method', $store_id, 'bonus_pool', 0)['value']);
  1652. foreach ($list['list'] as &$value) {
  1653. $value['time'] = date('Y年m月d日', $value['start_time']) . '-' . date('Y年m月d日', $value['end_time']);
  1654. $value['user_list'] = [];
  1655. if ($value['is_send']) {
  1656. $user_ids = Json::decode($value['user_id']);
  1657. } else {
  1658. $share_holder_level = $value['level_id'];
  1659. if ($high_level_join_average && !$dividends_method) {
  1660. $shareHolderLevelOnce = ShareHolderLevel::findOne(['is_delete' => 0, 'id' => $value['level_id']]);
  1661. $share_holder_level = ShareHolderLevel::find()->where(['store_id' => $shareHolderLevelOnce->store_id, 'is_delete' => 0])
  1662. ->andWhere(['>=', 'level', $shareHolderLevelOnce->level])->select('id')->column();
  1663. }
  1664. $share_holder_arr = ShareHolder::find()->where([
  1665. 'store_id' => get_store_id(),
  1666. 'is_delete' => 0,
  1667. 'status' => 1,
  1668. 'level_id' => $share_holder_level
  1669. ])->select('user_id')->asArray()->all();
  1670. if (empty($share_holder_arr)) {
  1671. $user_ids = [];
  1672. } else {
  1673. $user_ids = array_column($share_holder_arr, 'user_id');
  1674. if ($dividends_method) {
  1675. $pool_level = BonusPoolLevel::findOne($value['id']);
  1676. $poolUserMoney = \app\utils\Share\BonusPool::poolUserMoney($pool_level, $user_ids);
  1677. if ($poolUserMoney) {
  1678. $user_ids_ = [];
  1679. foreach ($poolUserMoney as $poolUserIndex => $poolUserItem) {
  1680. if ($poolUserItem > 0) {
  1681. $user_ids_[] = $poolUserIndex;
  1682. }
  1683. }
  1684. $user_ids = $user_ids_;
  1685. } else {
  1686. $user_ids = [];
  1687. }
  1688. }
  1689. }
  1690. }
  1691. $value['user_list'] = $user_ids;
  1692. // if (!empty($user_ids)) {
  1693. // foreach ($user_ids as $v) {
  1694. // $user = User::findOne($v);
  1695. // $saas_user = SaasUser::findOne(['mobile' => $user->binding]);
  1696. // $share_holder = ShareHolder::findOne(['user_id' => $v]);
  1697. // $share_holder_level = ShareHolderLevel::findOne($share_holder->level_id);
  1698. // $money = ShareDetail::find()->where(['type' => ShareDetail::TYPE_HOLDER_PROFIT, 'type_id' => $value['pool_id'], 'user_id' => $v])->sum('money');
  1699. // $value['user_list'][] = [
  1700. // 'name' => $saas_user->name ?: $user->nickname,
  1701. // 'avatar' => $saas_user->avatar ?: $user->avatar_url,
  1702. // 'level_name' => $share_holder_level->name,
  1703. // 'money' => $money,
  1704. // 'send_time' => $value['send_time']
  1705. // ];
  1706. // }
  1707. // }
  1708. }
  1709. return $this->asJson([
  1710. 'code' => 0,
  1711. 'msg' => 'success',
  1712. 'data' => [
  1713. 'data' => $list['list'],
  1714. 'pageNo' => $list['pageNo'],
  1715. 'totalCount' => $list['totalCount']
  1716. ]
  1717. ]);
  1718. }
  1719. /**
  1720. * 帮扶基金
  1721. * @return \yii\web\Response
  1722. */
  1723. public function actionShareFrostLogList()
  1724. {
  1725. try {
  1726. $order_no = get_params('order_no');
  1727. $is_send = get_params('is_send', -1);
  1728. $send_start_time = get_params('send_start_time');
  1729. $send_end_time = get_params('send_end_time');
  1730. $query = ShareHolderFrostLog::find()->alias('shf')
  1731. ->leftJoin(['o' => Order::tableName()], 'shf.order_id = o.id')
  1732. ->leftJoin(['u' => User::tableName()], 'u.id=shf.child_user_id')
  1733. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  1734. ->leftJoin(['u1' => User::tableName()], 'u1.id=shf.parent_user_id')
  1735. ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding')
  1736. ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id')
  1737. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id')
  1738. ->where(['u.store_id' => get_store_id()])
  1739. ->andWhere(['<>', 'o.trade_status', 1]);
  1740. // $query = ShareDetail::find()->alias('sd')->leftJoin(['o' => Order::tableName()], 'o.id=sd.type_id')
  1741. // ->leftJoin(['u' => User::tableName()], 'u.id=o.user_id')
  1742. // ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  1743. // ->leftJoin(['u1' => User::tableName()], 'u1.id=sd.user_id')
  1744. // ->leftJoin(['su1' => SaasUser::tableName()], 'su1.mobile=u1.binding')
  1745. // ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=u1.id')
  1746. // ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id')
  1747. // ->where(['sd.store_id' => get_store_id(), 'sd.is_delete' => 0, 'sd.type' => [6, 8]]);
  1748. if ($order_no) {
  1749. $query->andWhere(['o.order_no' => $order_no]);
  1750. }
  1751. if ($is_send >= 0 && in_array($is_send, [0, 1])) {
  1752. $query->andWhere(['shf.status' => $is_send]);
  1753. }
  1754. if ($send_start_time) {
  1755. $query->andWhere(['>=', 'shf.created_at', strtotime($send_start_time)]);
  1756. }
  1757. if ($send_end_time) {
  1758. $query->andWhere(['<=', 'shf.created_at', strtotime($send_end_time)]);
  1759. }
  1760. $query->select('shf.*, su.avatar buyer_avatar, su.name buyer_name, u.nickname buyer_nickname, u1.nickname holder_name, u1.avatar_url holder_avatar, u1.nickname holder_nickname, u1.avatar_url holder_avatar_url, shl.name level_name, o.order_no')->orderBy('shf.created_at desc')->groupBy('shf.id');
  1761. $list = pagination_make($query);
  1762. foreach ($list['list'] as &$item) {
  1763. $item['created_at'] = date("Y-m-d H:i:s", $item['created_at']);
  1764. $item['send_time'] = $item['updated_at'] ? date("Y-m-d H:i:s", $item['updated_at']) : '-';
  1765. $item['order_no'] = $item['order_no'] ?: '-';
  1766. $item['money'] = $item['amount'];
  1767. }
  1768. return $this->asJson([
  1769. 'code' => 0,
  1770. 'msg' => 'success',
  1771. 'data' => [
  1772. 'data' => $list['list'],
  1773. 'pageNo' => $list['pageNo'],
  1774. 'totalCount' => $list['totalCount']
  1775. ]
  1776. ]);
  1777. } catch (\Exception $e) {
  1778. return $this->asJson([
  1779. 'code' => 1,
  1780. 'msg' => $e->getMessage()
  1781. ]);
  1782. }
  1783. }
  1784. /**
  1785. * 复购冻结佣金列表
  1786. * @return \yii\web\Response
  1787. */
  1788. public function actionFugouFrostLogList()
  1789. {
  1790. try {
  1791. $order_no = get_params('order_no');
  1792. $is_send = get_params('is_send', -1);
  1793. $send_start_time = get_params('send_start_time');
  1794. $send_end_time = get_params('send_end_time');
  1795. $query = \app\models\ShareHolderFugouFrostLog::find()->alias('shf')
  1796. ->leftJoin(['o' => Order::tableName()], 'shf.order_id = o.id')
  1797. ->leftJoin(['u' => User::tableName()], 'u.id=shf.user_id')
  1798. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  1799. ->where(['u.store_id' => get_store_id()]);
  1800. if ($order_no) {
  1801. $query->andWhere(['o.order_no' => $order_no]);
  1802. }
  1803. if ($is_send >= 0 && in_array($is_send, [0, 1])) {
  1804. $query->andWhere(['shf.status' => $is_send]);
  1805. }
  1806. if ($send_start_time) {
  1807. $query->andWhere(['>=', 'shf.created_at', strtotime($send_start_time)]);
  1808. }
  1809. if ($send_end_time) {
  1810. $query->andWhere(['<=', 'shf.created_at', strtotime($send_end_time)]);
  1811. }
  1812. $query->select('shf.*, u.avatar_url avatar, u.nickname name, o.order_no')->orderBy('shf.created_at desc')->groupBy('shf.id');
  1813. $list = pagination_make($query);
  1814. foreach ($list['list'] as &$item) {
  1815. $item['created_at'] = date("Y-m-d H:i:s", $item['created_at']);
  1816. $item['send_time'] = $item['updated_at'] ? date("Y-m-d H:i:s", $item['updated_at']) : '-';
  1817. $item['order_no'] = $item['order_no'] ?: '-';
  1818. $item['money'] = $item['amount'];
  1819. }
  1820. return $this->asJson([
  1821. 'code' => 0,
  1822. 'msg' => 'success',
  1823. 'data' => [
  1824. 'data' => $list['list'],
  1825. 'pageNo' => $list['pageNo'],
  1826. 'totalCount' => $list['totalCount']
  1827. ]
  1828. ]);
  1829. } catch (\Exception $e) {
  1830. return $this->asJson([
  1831. 'code' => 1,
  1832. 'msg' => $e->getMessage()
  1833. ]);
  1834. }
  1835. }
  1836. /**
  1837. * 下一级列表
  1838. * @return \yii\web\Response
  1839. */
  1840. public function actionPoolMan()
  1841. {
  1842. $name = get_params('name');
  1843. $id = get_params('id');
  1844. $level_id = get_params('level_id');
  1845. $store_id = get_store_id();
  1846. $bonus_pool_level = BonusPoolLevel::findOne($id);
  1847. if (!$bonus_pool_level) {
  1848. return $this->asJson([
  1849. 'code' => 1,
  1850. 'msg' => '未找到该等级奖金池'
  1851. ]);
  1852. }
  1853. $user_ids = [];
  1854. if ($bonus_pool_level->is_send) {
  1855. $user_ids = Json::decode($bonus_pool_level->user_id);
  1856. } else {
  1857. $share_holder_level = $bonus_pool_level->level_id;
  1858. $high_level_join_average = intval(Option::get('high_level_join_average', $store_id, 'bonus_pool', 0)['value']);
  1859. $dividends_method = intval(Option::get('dividends_method', $store_id, 'bonus_pool', 0)['value']);
  1860. if ($high_level_join_average && !$dividends_method) {
  1861. $shareHolderLevelOnce = ShareHolderLevel::findOne(['is_delete' => 0, 'id' => $bonus_pool_level->level_id]);
  1862. $share_holder_level = ShareHolderLevel::find()->where(['store_id' => $shareHolderLevelOnce->store_id, 'is_delete' => 0])
  1863. ->andWhere(['>=', 'level', $shareHolderLevelOnce->level])->select('id')->column();
  1864. }
  1865. $share_holder_arr = ShareHolder::find()->where([
  1866. 'store_id' => $store_id,
  1867. 'is_delete' => 0,
  1868. 'status' => 1,
  1869. 'level_id' => $share_holder_level
  1870. ])->select('user_id')->asArray()->all();
  1871. if (!empty($share_holder_arr)) {
  1872. $user_ids = array_column($share_holder_arr, 'user_id');
  1873. if ($dividends_method) {
  1874. $pool_level = BonusPoolLevel::findOne($bonus_pool_level->id);
  1875. $poolUserMoney = \app\utils\Share\BonusPool::poolUserMoney($pool_level, $user_ids);
  1876. if ($poolUserMoney) {
  1877. $user_ids_ = [];
  1878. foreach ($poolUserMoney as $poolUserIndex => $poolUserItem) {
  1879. if ($poolUserItem > 0) {
  1880. $user_ids_[] = $poolUserIndex;
  1881. }
  1882. }
  1883. $user_ids = $user_ids_;
  1884. } else {
  1885. $user_ids = [];
  1886. }
  1887. }
  1888. }
  1889. }
  1890. //获取期数时间内显示用户下单金额以及金额是否达标
  1891. //获取当前期数时间
  1892. $bonus_pool = BonusPool::findOne($bonus_pool_level->pool_id);
  1893. $query = ShareHolder::find()->alias('sh')
  1894. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id')
  1895. ->leftJoin(['u' => User::tableName()], 'u.id=sh.user_id')
  1896. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  1897. ->where(['sh.store_id' => get_store_id()])->andWhere(['in', 'sh.user_id', $user_ids]);
  1898. if ($name) {
  1899. $query->andWhere([
  1900. 'or',
  1901. ['like', 'u.nickname', $name],
  1902. ['like', 'su.name', $name]
  1903. ]);
  1904. }
  1905. if ($level_id) {
  1906. $query->andWhere(['sh.level_id' => $level_id]);
  1907. }
  1908. $query->select('u.nickname, u.avatar_url, su.name, su.avatar, shl.name level_name, sh.id, sh.user_id')->orderBy('sh.audit_time desc')->groupBy('sh.user_id');
  1909. $list = pagination_make($query);
  1910. foreach ($list['list'] as &$value) {
  1911. //根据当前期数时间,获取用户商城下单金额
  1912. $value['pay_price'] = BonusPoolDetail::find()->alias('b')->leftJoin(['o' => Order::tableName()], 'b.order_id = o.id')
  1913. ->where(['o.user_id' => $value['user_id']])
  1914. ->andWhere(['and', ['>=', 'b.created_at', $bonus_pool->start_time], ['<', 'b.created_at', $bonus_pool->end_time]])
  1915. ->groupBy('o.id')
  1916. ->select('o.pay_price')->column();
  1917. $value['pay_price'] = sprintf("%.2f", array_sum($value['pay_price']));
  1918. // $value['pay_price'] = Order::find()->where(['user_id' => $value['user_id'], 'is_sale' => 1])
  1919. // ->andWhere(['and', ['>=', 'updated_at', $bonus_pool->start_time], ['<', 'updated_at', $bonus_pool->end_time]])
  1920. // ->select('pay_price')->groupBy('user_id')->sum('pay_price') ?? 0;
  1921. //判断是否达标
  1922. $dividends_condition = Option::get('dividends_condition', get_store_id(), 'bonus_pool', 0)['value'];
  1923. $value['is_standard'] = 0;
  1924. if ($dividends_condition <= $value['pay_price']) {
  1925. $value['is_standard'] = 1;
  1926. }
  1927. $share_detail = ShareDetail::find()->where(['is_delete' => 0, 'store_id' => get_store_id(), 'user_id' => $value['user_id'], 'type' => ShareDetail::TYPE_HOLDER_PROFIT, 'type_id' => $bonus_pool_level->id])->one();
  1928. $value['profit'] = $share_detail->money && $value['is_standard'] === 1 ? $share_detail->money : '0.00';
  1929. $value['is_send'] = $share_detail->is_send ?? 0;
  1930. $value['send_time'] = $share_detail->send_time;
  1931. }
  1932. return $this->asJson([
  1933. 'code' => 0,
  1934. 'msg' => 'success',
  1935. 'data' => [
  1936. 'data' => $list['list'],
  1937. 'pageNo' => $list['pageNo'],
  1938. 'totalCount' => $list['totalCount']
  1939. ]
  1940. ]);
  1941. }
  1942. /**
  1943. * 奖金池发放
  1944. * @return \yii\web\Response
  1945. */
  1946. public function actionSendPool()
  1947. {
  1948. $pool_level_id = post_params('id');
  1949. $bonus_pool_level = BonusPoolLevel::findOne($pool_level_id);
  1950. if (!$bonus_pool_level || $bonus_pool_level->is_send == 1) {
  1951. return $this->asJson([
  1952. 'code' => 1,
  1953. 'msg' => '未找到数据或已发放'
  1954. ]);
  1955. }
  1956. $bonus_pool = BonusPool::findOne($bonus_pool_level->pool_id);
  1957. // 判断是否到发放时间
  1958. if ($bonus_pool->end_time > time()) {
  1959. return $this->asJson([
  1960. 'code' => 1,
  1961. 'msg' => '未到奖金池结束时间,暂时不能发放'
  1962. ]);
  1963. }
  1964. $res = \app\utils\Share\BonusPool::poolShare($pool_level_id);
  1965. return $this->asJson($res);
  1966. }
  1967. public function actionPoolDetail()
  1968. {
  1969. $order_no = get_params('order_no');
  1970. $pay_start_time = get_params('pay_start_time');
  1971. $pay_end_time = get_params('pay_end_time');
  1972. $create_start_time = get_params('create_start_time');
  1973. $create_end_time = get_params('create_end_time');
  1974. $pool_level_id = get_params('pool_level_id');
  1975. $store_id = get_store_id();
  1976. $query = BonusPoolDetail::find()->alias('bpd')->leftJoin(['o' => Order::find()->select('id, order_no, pay_price, pay_time')->andWhere(['store_id' => $store_id])->union(\app\plugins\scanCodePay\models\Order::find()->select('id, order_no, (total_price+take_price) pay_price, created_at pay_time')->andWhere(['store_id' => $store_id]))], 'o.id=bpd.order_id');
  1977. $query->andWhere(['bpd.store_id' => $store_id]);
  1978. if ($pay_start_time) {
  1979. $query->andWhere(['>=', 'o.pay_time', strtotime($pay_start_time)]);
  1980. }
  1981. if ($pay_end_time) {
  1982. $query->andWhere(['<=', 'o.pay_time', strtotime($pay_end_time)]);
  1983. }
  1984. if ($create_start_time) {
  1985. $query->andWhere(['>=', 'bpd.created_at', strtotime($create_start_time)]);
  1986. }
  1987. if ($create_end_time) {
  1988. $query->andWhere(['<=', 'bpd.created_at', strtotime($create_end_time)]);
  1989. }
  1990. if ($order_no) {
  1991. $query->andWhere(['like', 'o.order_no', $order_no]);
  1992. }
  1993. if ($pool_level_id) {
  1994. $query->andWhere(['bpd.pool_level_id' => $pool_level_id]);
  1995. }
  1996. $query->select('bpd.*, o.order_no, o.pay_price, o.pay_time')->orderBy('bpd.created_at desc, o.pay_time desc');
  1997. $list = pagination_make($query);
  1998. return $this->asJson([
  1999. 'code' => 0,
  2000. 'msg' => 'success',
  2001. 'data' => [
  2002. 'data' => $list['list'],
  2003. 'pageNo' => $list['pageNo'],
  2004. 'totalCount' => $list['totalCount']
  2005. ]
  2006. ]);
  2007. }
  2008. /**
  2009. * 提现列表
  2010. * @return \yii\web\Response
  2011. */
  2012. public function actionCashList()
  2013. {
  2014. $store_id = get_store_id();
  2015. $start_time = get_params('start_time');
  2016. $end_time = get_params('end_time');
  2017. $status = get_params('status');
  2018. $name = get_params('name');
  2019. $is_area = get_params('is_area');
  2020. $audit_start_time = get_params('audit_start_time');
  2021. $audit_end_time = get_params('audit_end_time');
  2022. $query = Cash::find()->alias('c')
  2023. ->leftJoin(['u' => User::tableName()], 'u.id=c.user_id')
  2024. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile=u.binding')
  2025. ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id=c.user_id')
  2026. ->leftJoin(['shl' => ShareHolderLevel::tableName()], 'shl.id=sh.level_id')
  2027. ->where(['c.is_delete' => Cash::IS_DELETE_NO, 'c.store_id' => $store_id]);
  2028. if ($start_time) {
  2029. $query->andWhere(['>=', 'c.created_at', strtotime($start_time)]);
  2030. }
  2031. if ($end_time) {
  2032. $query->andWhere(['<=', 'c.created_at', strtotime($end_time)]);
  2033. }
  2034. if ($name) {
  2035. $query->andWhere([
  2036. 'or',
  2037. ['like', 'su.name', $name],
  2038. ['like', 'u.nickname', $name],
  2039. ]);
  2040. }
  2041. if ($audit_start_time) {
  2042. $query->andWhere(['>=', 'c.updated_at', strtotime($audit_start_time)]);
  2043. }
  2044. if ($audit_end_time) {
  2045. $query->andWhere(['<=', 'c.updated_at', strtotime($audit_end_time)]);
  2046. }
  2047. if ($status == Cash::STATUS_APPLY) { //待审核
  2048. $query->andWhere(['c.status' => Cash::STATUS_APPLY]);
  2049. }
  2050. if ($status == Cash::STATUS_CONFIRM) { // 待打款
  2051. $query->andWhere(['c.status' => Cash::STATUS_CONFIRM]);
  2052. }
  2053. if ($status == Cash::STATUS_GIVEN) { // 已打款
  2054. $query->andWhere(['in', 'c.status', [Cash::STATUS_GIVEN, Cash::STATUS_RECHARGE]]);
  2055. }
  2056. if ($status == Cash::STATUS_REFUSE) { // 已拒绝
  2057. $query->andWhere(['c.status' => Cash::STATUS_REFUSE]);
  2058. }
  2059. if ($is_area) {
  2060. $query->andWhere(['cash_type' => Cash::IS_CASH_TYPE_AREA_AGENT]);
  2061. } else {
  2062. $query->andWhere(['c.cash_type' => 3]);
  2063. }
  2064. $query->distinct()->orderBy('c.status ASC,c.created_at DESC')->select([
  2065. 'c.*', 'su.id saas_user_id', 'u.nickname', 'u.avatar_url', 'u.binding', 'shl.name level_name'
  2066. ]);
  2067. $pagination = pagination_make($query);
  2068. $list = $pagination['list'];
  2069. foreach($list as &$value){
  2070. $value['service_money'] = bcdiv(bcmul($value['service_charge'], $value['price'], 2), 100, 2);
  2071. $value['money'] = Cash::getServiceMoney($value);
  2072. $value['status_name'] = Cash::getCashStatusName($value);
  2073. $saas_user = SaasUser::findOne($value['saas_user_id']);
  2074. $value['card_no'] = '';
  2075. // if (intval($value['type']) === Cash::TYPE_BANK) {
  2076. if ($saas_user->withdraw_method) {
  2077. $withdraw_method = json_decode($saas_user->withdraw_method, true);
  2078. if (!empty($withdraw_method)) {
  2079. foreach ($withdraw_method as $method_item) {
  2080. if ($method_item['type'] === 'bank_card') {
  2081. $value['card_no'] = $method_item['card_no'];
  2082. }
  2083. }
  2084. }
  2085. }
  2086. // }
  2087. $cashExtArr = CashExt::find()->where(['cash_id' => $value['id']])->select('cash_price_type, real_price')->asArray()->all();
  2088. $value['cash_ext_text'] = null;
  2089. if ($cashExtArr) {
  2090. $value['cash_ext_text'] = '提现明细:';
  2091. foreach ($cashExtArr as $cashExtItem) {
  2092. $value['cash_ext_text'] .= CashExt::$cashPriceTypeMap[$cashExtItem['cash_price_type']] . ':' . $cashExtItem['real_price'] . ';';
  2093. }
  2094. }
  2095. }
  2096. if($this->export = input_params('export', 0)){
  2097. return $this->export($list);
  2098. }
  2099. return $this->asJson([
  2100. 'code' => 0,
  2101. 'msg' => 'success',
  2102. 'data' => [
  2103. 'data' => $list,
  2104. 'pageNo' => $pagination['pageNo'],
  2105. 'totalCount' => $pagination['totalCount']
  2106. ],
  2107. ]);
  2108. }
  2109. private function export($list)
  2110. {
  2111. $rows = [[
  2112. 'ID',
  2113. '会员信息',
  2114. '会员等级',
  2115. '手机号',
  2116. '申请提现金额(元)',
  2117. '手续费(元)',
  2118. '实际打款(元)',
  2119. '姓名',
  2120. '提现到',
  2121. '账户',
  2122. '身份证号',
  2123. '开户行',
  2124. '支行',
  2125. '状态',
  2126. '申请时间',
  2127. '审核时间',
  2128. ]];
  2129. foreach($list as $item){
  2130. $r = [
  2131. $item['id'],
  2132. $item['nickname'],
  2133. $item['level_name'],
  2134. $item['binding'],
  2135. $item['price'],
  2136. $item['service_money'],
  2137. $item['money'],
  2138. $item['name'],
  2139. Cash::$type[$item['type']] ?? '--',
  2140. $item['mobile'],
  2141. $item['card_no'],
  2142. $item['bank_name'],
  2143. $item['bank_branch'],
  2144. Cash::$status[$item['status']] ?? '',
  2145. date('Y-m-d H:i:s', $item['created_at']),
  2146. $item['updated_at'] <= 0 ? '' : date('Y-m-d H:i:s', $item['updated_at']),
  2147. ];
  2148. $rows[] = $r;
  2149. }
  2150. $writer = \Spatie\SimpleExcel\SimpleExcelWriter::streamDownload(time() . '.xlsx')->noHeaderRow()
  2151. ->addRows($rows)->toBrowser();
  2152. }
  2153. /**
  2154. * 提现申请审核
  2155. * @return \yii\web\Response
  2156. */
  2157. public function actionCashApply()
  2158. {
  2159. $id = post_params('id');
  2160. $status = post_params('status');
  2161. $store_id = get_store_id();
  2162. if (empty($id) || !is_array($id)) {
  2163. return $this->asJson([
  2164. 'code' => 1,
  2165. 'msg' => '数据格式错误'
  2166. ]);
  2167. }
  2168. $t = \Yii::$app->db->beginTransaction();
  2169. foreach ($id as $value) {
  2170. $cash = Cash::findOne(['id' => $value, 'is_delete' => Cash::IS_DELETE_NO,
  2171. 'store_id' => $store_id]);
  2172. if (!$cash) {
  2173. $t->rollBack();
  2174. return $this->asJson([
  2175. 'code' => 1,
  2176. 'msg' => '提现记录不存在,请刷新重试'
  2177. ]);
  2178. }
  2179. if (!$cash->order_no) {
  2180. $order_no = null;
  2181. while (true) {
  2182. $order_no = date('YmdHis') . mt_rand(100000, 999999);
  2183. $exist_order_no = Cash::find()->where(['order_no' => $order_no])->exists();
  2184. if (!$exist_order_no) {
  2185. break;
  2186. }
  2187. }
  2188. $cash->order_no = $order_no;
  2189. $cash->save();
  2190. }
  2191. \Yii::$app->cache->set('holder_cash_cache_' . $value, $cash->order_no);
  2192. if (!in_array($status, [1, 3])) {
  2193. \Yii::$app->cache->set('holder_cash_cache_' . $value, false);
  2194. $t->rollBack();
  2195. return $this->asJson([
  2196. 'code' => 1,
  2197. 'msg' => '提现记录ID: ' . $value . '已审核,请刷新重试'
  2198. ]);
  2199. }
  2200. $cash->status = $status;
  2201. if ($status == Cash::STATUS_REFUSE) {
  2202. $user = User::findOne($cash->user_id);
  2203. $user->price += $cash->price;
  2204. if (!$user->save()) {
  2205. return $this->asJson([
  2206. 'code' => 1,
  2207. 'msg' => '网络异常'
  2208. ]);
  2209. }
  2210. // NoticeSend::CashFail($cash->user_id, $user->binding, $cash->price, '提现被驳回', '提现被驳回');
  2211. }
  2212. if (!$cash->save()) {
  2213. $t->rollBack();
  2214. return $this->asJson([
  2215. 'code' => 1,
  2216. 'msg' => '网络异常,请刷新重试'
  2217. ]);
  2218. }
  2219. }
  2220. $t->commit();
  2221. return $this->asJson([
  2222. 'code' => 0,
  2223. 'msg' => '审核成功'
  2224. ]);
  2225. }
  2226. /**
  2227. * 打款
  2228. * @return \yii\web\Response
  2229. */
  2230. public function actionCashConfirm()
  2231. {
  2232. $id = post_params('id');
  2233. $status = post_params('status');
  2234. $store_id = get_store_id();
  2235. $store = Store::findOne($store_id);
  2236. $cash = Cash::findOne([
  2237. 'id' => $id,
  2238. 'is_delete' => Cash::IS_DELETE_NO,
  2239. 'store_id' => $store_id
  2240. ]);
  2241. if (!$cash) {
  2242. return $this->asJson([
  2243. 'code' => 1,
  2244. 'msg' => '提现记录不存在,请刷新重试'
  2245. ]);
  2246. }
  2247. if ($status == Cash::STATUS_GIVEN) {
  2248. if($store->is_platform_transfers == 1){
  2249. $store_wechat_cash = json_decode(Option::get('store_wechat_cash', $store_id, 'store')['value'], true);
  2250. $val = 0;
  2251. foreach ((array)$store_wechat_cash as $value) {
  2252. if (!empty($value)) {
  2253. $val = 1;
  2254. break;
  2255. }
  2256. }
  2257. if(!$val){
  2258. return $this->asJson([
  2259. 'code' => 1,
  2260. 'msg' => '未配置平台微信提现设置'
  2261. ]);
  2262. }
  2263. }
  2264. }
  2265. if (!$cash->order_no) {
  2266. $order_no = null;
  2267. while (true) {
  2268. $order_no = date('YmdHis') . mt_rand(100000, 999999);
  2269. $exist_order_no = Cash::find()->where(['order_no' => $order_no])->exists();
  2270. if (!$exist_order_no) {
  2271. break;
  2272. }
  2273. }
  2274. $cash->order_no = $order_no;
  2275. $cash->save();
  2276. }
  2277. if ($cash->status != 1) {
  2278. return $this->asJson([
  2279. 'code' => 1,
  2280. 'msg' => '操作错误,请刷新重试'
  2281. ]);
  2282. }
  2283. $res = [];
  2284. $cashExt = CashExt::findOne(['cash_id' => $cash['id'], 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]);
  2285. if ($cashExt) {
  2286. $price = $cashExt->real_price;
  2287. } else {
  2288. $price = ($cash->price - ($cash->price * ($cash->service_charge / 100)));
  2289. }
  2290. $servePrice = ($cash->price * ($cash->service_charge / 100));
  2291. if ($store->store_balance < $price && $store->is_platform_transfers == 1) {
  2292. return $this->asJson([
  2293. 'code' => 1,
  2294. 'msg' => '店铺剩余提现余额不足'
  2295. ]);
  2296. }
  2297. $wechat_type = 1;
  2298. $wechat_cash = Option::get('wechat_cash', $store_id, 'store')['value'];
  2299. if($store->is_platform_transfers == 1){
  2300. $wechat_cash = Option::get('store_wechat_cash', $store_id, 'store')['value'];
  2301. $wechat_type = 0;
  2302. }
  2303. if ($status == Cash::STATUS_GIVEN) { //微信自动打款
  2304. if($price <= 0){
  2305. $cash->status = Cash::STATUS_GIVEN;
  2306. if($cash->save()){
  2307. return $this->asJson([
  2308. 'code' => 0,
  2309. 'msg' => '成功'
  2310. ]);
  2311. }
  2312. }
  2313. if ((int)$cash->type === 0) {
  2314. $cash->status = Cash::STATUS_GIVEN;
  2315. $cash->pay_time = time();
  2316. $cash->pay_type = Cash::PAY_TYPE_WX;
  2317. $user = User::findOne($cash->user_id);
  2318. $wechat_open_id = $user->wechat_open_id;
  2319. $data = [
  2320. 'partner_trade_no' => $cash->order_no,
  2321. 'openid' => $wechat_open_id,
  2322. 'check_name' => 'NO_CHECK',
  2323. 'amount' => $price * 100,
  2324. 'desc' => '转账',
  2325. 'user_name' => $cash->name
  2326. ];
  2327. // TODO 扣除店铺提现金额
  2328. if ($wechat_type == 0) {
  2329. $cashExt = CashExt::findOne(['cash_id' => $cash->id, 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]);
  2330. $before = $store->store_balance;
  2331. $store->store_balance -= $cashExt ? $cashExt->real_price : $price;
  2332. $store->price -= $cashExt ? $cashExt->real_price : $price;
  2333. $store->store_withdrawn_cash += $cashExt ? $cashExt->real_price : $price;
  2334. $after = $store->store_balance;
  2335. $cashExtServePrice = $cashExt ? bcsub($cashExt->price, $cashExt->real_price, 2) : $servePrice;
  2336. $cashExtPrice = $cashExt ? $cashExt->price : $cash->price;
  2337. $cashExtRealPrice = $cashExt ? $cashExt->real_price : $price;
  2338. if ($store->save()) {
  2339. StoreMoneyLog::saveLog(get_store_id(), StoreMoneyLog::LOG_TYPE_EXPEND, StoreMoneyLog::TYPE_SHAREHOLDER, $cashExtRealPrice, " ID{$id}:用户提现{$cashExtPrice}元,扣除手续费{$cashExtServePrice}元,提现实际扣除{$cashExtRealPrice}元", $before, $after, $wechat_type);
  2340. }
  2341. }
  2342. $wechat = \Yii::$app->controller->wechatPay;
  2343. // $res = $wechat->transfer->toBalance($data);
  2344. $res = (new \app\utils\WechatMerchant\WxV3($wechat))->transferBatches(get_store_id(), $data);
  2345. //判断是否使用新版本转账 增加转账标识
  2346. $wechat_cash = json_decode($wechat_cash, true);
  2347. if (intval($wechat_cash['is_open']) === 2) {
  2348. if (!$res['code']) {
  2349. $cash->is_platform_transfers = intval($store->is_platform_transfers);
  2350. $cash->wx_cash_type = Cash::WX_CASH_TYPE_NEW;
  2351. $cash->wx_cash_state = $res['data']['state'];
  2352. $cash->wx_cash_result_info = json_encode($res['data'], JSON_UNESCAPED_UNICODE);
  2353. $cash->save();
  2354. }
  2355. }
  2356. // NoticeSend::CashSuccess($cash->user_id, $user->binding, $price, '微信自动打款', ($cash->price - $price));
  2357. } elseif ((int)$cash->type === 1) {
  2358. $order = (object)[
  2359. 'store_id' => $cash->store_id,
  2360. 'order_no' => $cash->order_no,
  2361. 'pay_price' => $price,
  2362. 'name' => $cash->name
  2363. ];
  2364. $result = Alipay::transfer($order, $cash->mobile);
  2365. if (isset($result['code']) && $result['code'] == 1) {
  2366. if (strpos($result['msg'], 'aop.invalid-app-auth-token-no-api')) {
  2367. $result['msg'] = '接口未授权,请前往支付宝开放平台查询是否开通产品或授权支付宝转账产品';
  2368. }
  2369. if (strpos($result['msg'], 'PAYEE_NOT_EXIST')) {
  2370. $result['msg'] = '收款账号不存在或姓名有误,建议核实账号和姓名是否准确';
  2371. }
  2372. if (strpos($result['msg'], 'BALANCE_IS_NOT_ENOUGH')) {
  2373. $result['msg'] = '商户余额不足';
  2374. }
  2375. return $this->asJson($result);
  2376. } else {
  2377. // TODO 扣除店铺提现金额
  2378. if ($wechat_type == 0) {
  2379. $cashExt = CashExt::findOne(['cash_id' => $cash->id, 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]);
  2380. $before = $store->store_balance;
  2381. $store->store_balance -= $cashExt ? $cashExt->real_price : $price;
  2382. $store->price -= $cashExt ? $cashExt->real_price : $price;
  2383. $store->store_withdrawn_cash += $cashExt ? $cashExt->real_price : $price;
  2384. $after = $store->store_balance;
  2385. $cashExtServePrice = $cashExt ? bcsub($cashExt->price, $cashExt->real_price, 2) : $servePrice;
  2386. $cashExtPrice = $cashExt ? $cashExt->price : $cash->price;
  2387. $cashExtRealPrice = $cashExt ? $cashExt->real_price : $price;
  2388. if ($store->save()) {
  2389. StoreMoneyLog::saveLog(get_store_id(), StoreMoneyLog::LOG_TYPE_EXPEND, StoreMoneyLog::TYPE_SHAREHOLDER, $cashExtRealPrice, " ID{$id}:用户提现{$cashExtPrice}元,扣除手续费{$cashExtServePrice}元,提现实际扣除{$cashExtRealPrice}元", $before, $after, $wechat_type);
  2390. }
  2391. }
  2392. }
  2393. $cash->status = Cash::STATUS_GIVEN;
  2394. $cash->pay_time = time();
  2395. $cash->pay_type = Cash::TYPE_ALIPAY;
  2396. $cash->save();
  2397. return $this->asJson([
  2398. 'code' => 0,
  2399. 'msg' => '成功'
  2400. ]);
  2401. }elseif ((int)$cash->type === 4) {
  2402. $user = User::findOne($cash->user_id);
  2403. $saas = SaasUser::findOne(['mobile' => $user->binding]);
  2404. $lg_info = Lg::find()->where(['user_id'=>$saas->id,'status'=>1,'is_delete'=>0])->one();
  2405. $lgApi = new LgApi($cash->store_id);
  2406. //灵工提现
  2407. $post_data = [
  2408. 'store_id' => $cash->store_id,
  2409. 'outTradeNo' => $cash->order_no,//唯一批次号
  2410. 'accNo' => bcmul($price,100),
  2411. 'amt' => bcmul($price,100),
  2412. 'name' => $cash->name,
  2413. 'certCard' => $lg_info->cert_card//身份证号
  2414. ];
  2415. $result = $lgApi->FlexiblePay($post_data);
  2416. if (isset($result['status']) && $result['status'] == 999) {
  2417. return $this->asJson($result);
  2418. }
  2419. $cash->status = 6;//灵工待打款
  2420. $cash->save();
  2421. //灵工提现接口调用后消息队列查询状态
  2422. \queue_push(new LgCashJob(['id'=>$cash->id,'store_id'=>$store_id,'type'=>3,'retry' => 5]), 60);
  2423. return $this->asJson([
  2424. 'code' => 0,
  2425. 'msg' => '成功'
  2426. ]);
  2427. }
  2428. } elseif ($status == Cash::STATUS_HAND) { //手动打款
  2429. // TODO 扣除店铺提现金额
  2430. if ($wechat_type == 0) {
  2431. $cashExt = CashExt::findOne(['cash_id' => $cash->id, 'cash_price_type' => CashExt::CASH_PRICE_TYPE_AMOUNT]);
  2432. $before = $store->store_balance;
  2433. $store->store_balance -= $cashExt ? $cashExt->real_price : $price;
  2434. $store->price -= $cashExt ? $cashExt->real_price : $price;
  2435. $store->store_withdrawn_cash += $cashExt ? $cashExt->real_price : $price;
  2436. $after = $store->store_balance;
  2437. $cashExtServePrice = $cashExt ? bcsub($cashExt->price, $cashExt->real_price, 2) : $servePrice;
  2438. $cashExtPrice = $cashExt ? $cashExt->price : $cash->price;
  2439. $cashExtRealPrice = $cashExt ? $cashExt->real_price : $price;
  2440. if ($store->save()) {
  2441. StoreMoneyLog::saveLog(get_store_id(), StoreMoneyLog::LOG_TYPE_EXPEND, StoreMoneyLog::TYPE_SHAREHOLDER, $cashExtRealPrice, " ID{$id}:用户提现{$cashExtPrice}元,扣除手续费{$cashExtServePrice}元,提现实际扣除{$cashExtRealPrice}元", $before, $after, $wechat_type);
  2442. }
  2443. }
  2444. // if ((int)$cash->type === 3) {
  2445. // AccountLog::saveLog($cash->user_id, $price, 2, 1, 0, 0, '股东提现打款');
  2446. // }
  2447. $cash->status = Cash::STATUS_GIVEN;
  2448. $cash->pay_time = time();
  2449. $cash->pay_type = Cash::PAY_TYPE_HAND;
  2450. $res['result_code'] = "SUCCESS";
  2451. // NoticeSend::CashSuccess($cash->user_id, $user->binding, $price, '手动打款', ($cash->price - $price));
  2452. }
  2453. if (isset($res['result_code']) && $res['result_code'] == 'SUCCESS') {
  2454. $cash->save();
  2455. return $this->asJson([
  2456. 'code' => 0,
  2457. 'msg' => '成功'
  2458. ]);
  2459. } else {
  2460. return $this->asJson([
  2461. 'code' => 1,
  2462. 'msg' => !empty($res['err_code_des']) ? $res['err_code_des'] : '请稍后重试',
  2463. 'data' => $res
  2464. ]);
  2465. }
  2466. }
  2467. /**
  2468. * 基础设置
  2469. * @return \yii\web\Response
  2470. */
  2471. public function actionSettingInfo()
  2472. {
  2473. $bonus_setting = new BonusPoolSetting();
  2474. $bonus_setting->store_id = get_store_id();
  2475. return $this->asJson($bonus_setting->search());
  2476. }
  2477. /**
  2478. * 基础设置
  2479. * @return \yii\web\Response
  2480. */
  2481. public function actionSetting()
  2482. {
  2483. $params = post_params();
  2484. $bonus_setting = new BonusPoolSetting();
  2485. $bonus_setting->attributes = $params;
  2486. $bonus_setting->store_id = get_store_id();
  2487. return $this->asJson($bonus_setting->save());
  2488. }
  2489. public function actionFugouInfo()
  2490. {
  2491. $bonus_setting = new BonusPoolSetting();
  2492. $bonus_setting->store_id = get_store_id();
  2493. return $this->asJson($bonus_setting->fugouInfo());
  2494. }
  2495. public function actionFugouSave()
  2496. {
  2497. $params = post_params();
  2498. $bonus_setting = new BonusPoolSetting();
  2499. $bonus_setting->attributes = $params;
  2500. $bonus_setting->store_id = get_store_id();
  2501. return $this->asJson($bonus_setting->fugouSave());
  2502. }
  2503. public function actionLevelDetail()
  2504. {
  2505. $level_id = get_params('level_id');
  2506. $share_holder_level = ShareHolderLevel::findOne($level_id);
  2507. if (!$share_holder_level) {
  2508. return $this->asJson([
  2509. 'code' => 1,
  2510. 'msg' => '数据不存在'
  2511. ]);
  2512. }
  2513. $condition = Json::decode($share_holder_level->condition);
  2514. if (!isset($condition['self']['value']['order_number'])) {
  2515. $self_price = $condition['self']['value'];
  2516. $condition['self']['value'] = [];
  2517. $condition['self']['value']['order_number'] = '0';
  2518. $condition['self']['value']['price'] = $self_price;
  2519. }
  2520. if (!isset($condition['amount_total'])) {
  2521. $condition['amount_total']['is_open'] = 0;
  2522. $condition['amount_total']['value'] = '0.00';
  2523. }
  2524. $goods_id = $condition['goods']['value']['id'];
  2525. $condition['goods']['value']['id'] = Goods::find()->where(['id' => $goods_id, 'is_delete' => 0])->select('id')->column();
  2526. // 会员列表
  2527. $level = Level::find()->select('level, name')->where([
  2528. 'store_id' => get_store_id(),
  2529. 'is_delete' => Level::NOT_DELETE,
  2530. 'status' => Level::STATUS_TRUE
  2531. ])->asArray()->all();
  2532. $level[] = ['level' => '-1', 'name' => '普通用户'];
  2533. $data = [
  2534. 'id' => $share_holder_level->id,
  2535. 'level' => $share_holder_level->level,
  2536. 'timeout_days' => $share_holder_level->timeout_days,
  2537. 'name' => $share_holder_level->name,
  2538. 'member_level' => $share_holder_level->member_level,
  2539. 'condition' => $condition,
  2540. 'detail' => $share_holder_level->detail,
  2541. 'range_rate' => $share_holder_level->range_rate,
  2542. 'team_reward_rate' => $share_holder_level->team_reward_rate,
  2543. 'holder_rate' => $share_holder_level->holder_rate,
  2544. 'equal_rate' => $share_holder_level->equal_rate,
  2545. 'status' => $share_holder_level->status,
  2546. 'is_default' => $share_holder_level->is_default,
  2547. 'share_rate_one' => $share_holder_level->share_rate_one,
  2548. 'share_rate_two' => $share_holder_level->share_rate_two,
  2549. 'share_rate_three' => $share_holder_level->share_rate_three,
  2550. 'pic_url' => $share_holder_level->pic_url,
  2551. 'old_team_reward_rate' => $share_holder_level->old_team_reward_rate,
  2552. 'old_range_rate' => $share_holder_level->old_range_rate,
  2553. 'old_holder_rate' => $share_holder_level->old_holder_rate,
  2554. 'old_equal_rate' => $share_holder_level->old_equal_rate,
  2555. 'old_share_rate_one' => $share_holder_level->old_share_rate_one,
  2556. 'old_share_rate_two' => $share_holder_level->old_share_rate_two,
  2557. 'old_share_rate_three' => $share_holder_level->old_share_rate_three,
  2558. 'old_repeat_range_rate' => $share_holder_level->old_repeat_range_rate ?: '0.00',
  2559. 'range_rate_type' => $share_holder_level->range_rate_type ?? 0,
  2560. 'is_user_level_range_rate' => $share_holder_level->is_user_level_range_rate ?? 0,
  2561. ];
  2562. return $this->asJson([
  2563. 'code' => 0,
  2564. 'data' => $data,
  2565. 'member_level_list' => $level,
  2566. ]);
  2567. }
  2568. public function actionOtherInfo()
  2569. {
  2570. return $this->asJson([
  2571. 'code' => 0,
  2572. 'data' => [
  2573. 'agreement' => Option::get('holder_agreement', get_store_id(), 'store', '')['value'] ?: '',
  2574. 'banner' => Option::get('holder_banner', get_store_id(), 'store', '')['value'] ?: [],
  2575. 'holder_audit' => (int)Option::get('holder_audit', get_store_id(), 'store', 0)['value'] ?: 0
  2576. ]
  2577. ]);
  2578. }
  2579. public function actionSubmitOtherInfo()
  2580. {
  2581. $holder_agreement = post_params('holder_agreement', '');
  2582. $holder_banner = post_params('holder_banner', []);
  2583. $holder_audit = post_params('holder_audit', 0);
  2584. Option::set(['holder_agreement', 'holder_banner', 'holder_audit'], [$holder_agreement, $holder_banner, $holder_audit], get_store_id(), 'store');
  2585. return $this->asJson([
  2586. 'code' => 0,
  2587. 'msg' => '更新成功'
  2588. ]);
  2589. }
  2590. public function actionGetFilter()
  2591. {
  2592. $store_id = get_store_id();
  2593. $filterLevel = ShareHolderLevel::find()->where(['store_id' => $store_id, 'is_delete' => 0])->select('level')->column();
  2594. return $this->asJson([
  2595. 'code' => 0,
  2596. 'msg' => '更新成功',
  2597. 'data' => $filterLevel
  2598. ]);
  2599. }
  2600. //获取等级变动记录
  2601. public function actionGetHolderLevelLog()
  2602. {
  2603. try {
  2604. $nickname = get_params('nickname');
  2605. $start_time = get_params('start_time');
  2606. $end_time = get_params('end_time');
  2607. $query = ShareHolderLevelLog::find()->alias('s')->where(['s.store_id' => get_store_id()])
  2608. ->leftJoin(['sh' => ShareHolder::tableName()], 'sh.user_id = s.user_id')
  2609. ->leftJoin(['u' => User::tableName()], 's.user_id = u.id')
  2610. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  2611. ->andWhere(['AND', ['IS NOT', 'sh.id', NULL], ['IS NOT', 'u.id', NULL], ['IS NOT', 'su.id', NULL]]);
  2612. if ($nickname) {
  2613. $query->andWhere(['LIKE', 'su.name', $nickname]);
  2614. }
  2615. if ($start_time) {
  2616. $query->andWhere(['>=', 's.created_at', strtotime($start_time)]);
  2617. }
  2618. if ($end_time) {
  2619. $query->andWhere(['<=', 's.created_at', strtotime($end_time)]);
  2620. }
  2621. $query->select('s.id, u.nickname name, s.after_level, s.before_level, s.created_at, s.desc, u.avatar_url avatar, s.order_id');
  2622. $query->orderBy('s.created_at desc')->groupBy('s.id');
  2623. $pagination = pagination_make($query);
  2624. $list = $pagination['list'];
  2625. foreach ($list as &$item) {
  2626. $item['order'] = Order::find()->where(['id' => $item['order_id']])->select('order_no, pay_price')
  2627. ->asArray()->one();
  2628. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  2629. $item['after_level'] = ShareHolderLevel::find()->where([
  2630. 'store_id' => get_store_id(),
  2631. 'is_delete' => 0,
  2632. 'level' => $item['after_level']
  2633. ])->select('name')->asArray()->one()['name'];
  2634. $item['before_level'] = ShareHolderLevel::find()->where([
  2635. 'store_id' => get_store_id(),
  2636. 'is_delete' => 0,
  2637. 'level' => $item['before_level']
  2638. ])->select('name')->asArray()->one()['name'];
  2639. }
  2640. return $this->asJson([
  2641. 'code' => 0,
  2642. 'msg' => 'success',
  2643. 'data' => [
  2644. 'list' => $list,
  2645. 'pageNo' => $pagination['pageNo'],
  2646. 'totalCount' => $pagination['totalCount']
  2647. ]
  2648. ]);
  2649. } catch (\Exception $e) {
  2650. return $this->asJson([
  2651. 'code' => 1,
  2652. 'msg' => $e->getMessage()
  2653. ]);
  2654. }
  2655. }
  2656. //股东上级变动记录
  2657. public function actionGetHolderOutLog()
  2658. {
  2659. try {
  2660. $type = get_params('type', null);
  2661. $nickname = get_params('nickname');
  2662. $start_time = get_params('start_time');
  2663. $end_time = get_params('end_time');
  2664. $query = ShareHolderParentOutLog::find()->alias('s')->where(['s.store_id' => get_store_id()])
  2665. ->leftJoin(['u' => User::tableName()], 's.user_id = u.id')
  2666. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding');
  2667. if ($type === null) {
  2668. $query->leftJoin(['sh' => ShareHolder::tableName()], 'u.id = sh.user_id')
  2669. ->andWhere(['>', 'sh.id', 0])
  2670. ->andWhere(['sh.is_delete' => 0]);
  2671. } else {
  2672. $query->andWhere(['s.type' => $type]);
  2673. }
  2674. if ($nickname) {
  2675. $query->andWhere(['LIKE', 'su.name', $nickname]);
  2676. }
  2677. if ($start_time) {
  2678. $query->andWhere(['>=', 's.created_at', strtotime($start_time)]);
  2679. }
  2680. if ($end_time) {
  2681. $query->andWhere(['<=', 's.created_at', strtotime($end_time)]);
  2682. }
  2683. $query->select('s.id, u.nickname name, u.avatar_url avatar, s.parent_user_id, s.old_parent_user_id, s.created_at, s.desc, s.type');
  2684. $query->orderBy('s.id desc');
  2685. $pagination = pagination_make($query);
  2686. $list = $pagination['list'];
  2687. foreach ($list as &$item) {
  2688. $item['type'] = (int)$item['type'];
  2689. $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']);
  2690. $store = Store::findOne(get_store_id());
  2691. $item['old_parent_user'] = User::find()->alias('u')
  2692. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  2693. ->where(['u.id' => $item['old_parent_user_id']])->select('u.nickname name, u.avatar_url avatar')->asArray()->one() ?: [
  2694. 'name' => '总店',
  2695. 'avatar' => $store->logo
  2696. ];
  2697. $item['parent_user'] = User::find()->alias('u')
  2698. ->leftJoin(['su' => SaasUser::tableName()], 'su.mobile = u.binding')
  2699. ->where(['u.id' => $item['parent_user_id']])->select('u.nickname name, u.avatar_url avatar')->asArray()->one() ?: [
  2700. 'name' => '总店',
  2701. 'avatar' => $store->logo
  2702. ];
  2703. }
  2704. return $this->asJson([
  2705. 'code' => 0,
  2706. 'msg' => 'success',
  2707. 'data' => [
  2708. 'q' => $query->createCommand()->getRawSql(),
  2709. 'list' => $list,
  2710. 'pageNo' => $pagination['pageNo'],
  2711. 'totalCount' => $pagination['totalCount']
  2712. ]
  2713. ]);
  2714. } catch (\Exception $e) {
  2715. return $this->asJson([
  2716. 'code' => 1,
  2717. 'msg' => $e->getMessage()
  2718. ]);
  2719. }
  2720. }
  2721. public function actionAddPrice()
  2722. {
  2723. $is_order = \post_params('is_order', true);
  2724. $order = \post_params('order', []);
  2725. $type = \post_params('type', 2);
  2726. $user = \post_params('user', []);
  2727. $price = \post_params('price', 0);
  2728. $remark = \post_params('remark', '');
  2729. $actionType = \post_params('actionType', 1);
  2730. $t = \Yii::$app->db->beginTransaction();
  2731. try {
  2732. $send_user = User::findOne($user['id']);
  2733. if (!$send_user) {
  2734. return $this->asJson([
  2735. 'code' => 1,
  2736. 'msg' => '佣金获取人不存在'
  2737. ]);
  2738. }
  2739. if ($actionType == 2 && $send_user->price < $price) {
  2740. return $this->asJson([
  2741. 'code' => 1,
  2742. 'msg' => '佣金获取人可提现佣金不足'
  2743. ]);
  2744. }
  2745. $share_detail = new ShareDetail();
  2746. $share_detail->store_id = get_store_id();
  2747. $share_detail->user_id = $user['id'];
  2748. if ($actionType == 1) {
  2749. $share_detail->money = $price;
  2750. } else {
  2751. $share_detail->money = -$price;
  2752. }
  2753. $share_detail->is_send = 1;
  2754. $share_detail->desc = $remark;
  2755. $share_detail->type = $type;
  2756. $share_detail->send_time = time();
  2757. if ($is_order) {
  2758. $share_detail->type_id = $order['id'];
  2759. }
  2760. $share_detail->save();
  2761. if ($actionType == 1) {
  2762. $send_user->total_price += $price;
  2763. $send_user->price += $price;
  2764. } else {
  2765. $send_user->price -= $price;
  2766. }
  2767. $send_user->save();
  2768. $t->commit();
  2769. return $this->asJson([
  2770. 'code' => 0,
  2771. 'msg' => 'success'
  2772. ]);
  2773. } catch (\Throwable $e) {
  2774. $t->rollBack();
  2775. return $this->asJson([
  2776. 'code' => 1,
  2777. 'msg' => '操作失败!',
  2778. ]);
  2779. }
  2780. }
  2781. }