Taskorderguquan.php 54 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120
  1. <?php
  2. /**
  3. * @package merchant
  4. * @Author: Qinii
  5. * @Date: 2020/5/28
  6. */
  7. namespace app\controller\api\store\merchant;
  8. use app\common\model\user\User;
  9. use think\facade\Db;
  10. use think\Request;
  11. class Taskorderguquan
  12. {
  13. public function assignment()
  14. {
  15. /**
  16. 13231658486周行体500
  17. 13333069689魏惠新500
  18. 13959100621周金花300
  19. 13701061395李素红300
  20. 17501006833邢艳丽300
  21. 13521438652徐立苹300
  22. 15832971815孟晓玮300
  23. 18600200909陈冠霖300
  24. 15810064711 王 玲 300
  25. 18001316701闫旭300
  26. 13932925303会强300
  27. 13601071082隋彩云200
  28. 13161909228刘银霞50
  29. 18603401312黄金花 50
  30. 18760167163刘春梅 50
  31. 18911752386魏利琴50
  32. 13215917919李小秋50
  33. 15332507711张传莲50
  34. 15960349661吕丽娣50
  35. 13381085923王建军50
  36. 13683609309李长生50
  37. 13601179856陈瑞元50
  38. 13901074090陈玉刚200
  39. 18715313601大饼400
  40. */
  41. $data = [
  42. '13231658486' => 500,
  43. '13333069689' => 500,
  44. '13959100621' => 300,
  45. '13701061395' => 300,
  46. '17501006833' => 300,
  47. '13521438652' => 300,
  48. '15832971815' => 300,
  49. '18600200909' => 300,
  50. '15810064711' => 300,
  51. '18001316701' => 300,
  52. '13932925303' => 300,
  53. '13601071082' => 200,
  54. '13161909228' => 50,
  55. '18603401312' => 50,
  56. '18760167163' => 50,
  57. '18911752386' => 50,
  58. '13215917919' => 50,
  59. '15332507711' => 50,
  60. '15960349661' => 50,
  61. '13381085923' => 50,
  62. '13683609309' => 50,
  63. '13601179856' => 50,
  64. '13901074090' => 200,
  65. '18715313601' => 400
  66. ];
  67. $result = Db::name("user")
  68. ->whereIn("account", array_keys($data))
  69. ->where('is_del', 0)
  70. ->field('uid, brokerage_price, account, nickname')
  71. ->select();
  72. $res = [];
  73. foreach ($result as $v) {
  74. $yj_90 = $data[$v['account']] * 0.9;
  75. $fg_10 = $data[$v['account']] * 0.1;
  76. Db::name("user")->where("uid", $v['uid'])->inc("brokerage_price", $yj_90)->save();
  77. Db::name("user")->where("uid", $v['uid'])->inc("total_amount_old", $yj_90)->save();
  78. Db::name("user")->where("uid", $v['uid'])->inc("amount_old", $yj_90)->save();
  79. Db::name("user")->where("uid", $v['uid'])->inc("fugou", $fg_10)->save();
  80. $this->bill_user_log111111($v['uid'], "佣金补贴", $yj_90, "佣金补贴", 8);//股权分佣明细2.0系统
  81. $this->fugou_user_log($v['uid'], $fg_10, 16, 1, 1);//复购金明细入账
  82. $res[] = [
  83. 'uid' => $v['uid'],
  84. 'account' => $v['account'],
  85. 'brokerage_price_pre' => $v['brokerage_price'],
  86. 'brokerage_price' => $data[$v['account']],
  87. 'nickname' => $v['nickname']
  88. ];
  89. }
  90. return json($res);
  91. try {
  92. // 1. 获取所有用户数据(按level_id正序排序保证父级在前)
  93. $users = Db::name('user')
  94. ->where('is_del', '=', 0)
  95. ->where('status', '=', 1)
  96. ->where('user_group', '>=', 2)
  97. ->order('level_id', 'asc')
  98. ->field('uid,account,nickname,level_id,is_del,status,user_group')
  99. ->select()
  100. ->toArray();
  101. // 2. 构建以UID为键的映射表
  102. $userMap = [];
  103. foreach ($users as $user) {
  104. $user['children'] = []; // 初始化子节点
  105. $userMap[$user['uid']] = [
  106. '用户ID' => $user['uid'],
  107. '用户账号' => $user['account'],
  108. '用户昵称' => $user['nickname'],
  109. '用户身份' => $user['user_group'],
  110. '上级用户ID' => $user['level_id'],
  111. '直属下级用户人数' => 0,
  112. '直属下级用户列表' => $user['children'],
  113. ];
  114. }
  115. // 3. 递归构建树形结构
  116. $tree = [];
  117. foreach ($userMap as $uid => &$user) {
  118. $parentId = $user['上级用户ID'];
  119. if ($parentId == 0) {
  120. // 顶级节点直接加入树
  121. $tree[] = &$user;
  122. } elseif (isset($userMap[$parentId])) {
  123. // 非顶级节点加入父节点的children
  124. $userMap[$parentId]['直属下级用户列表'][] = &$user;
  125. $userMap[$parentId]['直属下级用户人数']++;
  126. }
  127. }
  128. unset($user); // 销毁引用
  129. return json($tree);
  130. } catch (\Exception $e) {
  131. // 记录错误日志
  132. return json(['code' => 0, 'msg' => '树结构生成失败']);
  133. }
  134. $result = [
  135. 'oldOrderExistGongXian' => [],
  136. 'orderExistGongXian' => [],
  137. 'oldOrderExistPv' => [],
  138. 'orderExistPv' => [],
  139. 'gongXianDataOldList' => [],
  140. 'gongXianDataList' => [],
  141. 'pvDataOldList' => [],
  142. 'pvDataList' => [],
  143. 'contributeNot' => [],
  144. 'pvNot' => [],
  145. 'userUpdateSummary' => ['success' => 0, 'failed' => 0, 'skipped' => 0], // 优化: 汇总用户更新结果
  146. 'insertGongXianSummary' => ['success' => 0, 'failed' => 0], // 优化: 汇总贡献插入结果
  147. 'insertPvSummary' => ['success' => 0, 'failed' => 0], // 优化: 汇总PV插入结果
  148. 'errors' => [], // 优化: 统一记录错误信息
  149. ];
  150. // --- 数据库查询部分 (保持不变,已优化) ---
  151. // 1. 查询用户
  152. $userList = Db::name("user")
  153. ->where('is_del', 0)
  154. // ->whereIn('uid', [277, 1593])
  155. ->column('uid, spread_uid, contribute, per_contribute, pv', 'uid');
  156. // $userIds = array_keys($userList);
  157. $oldUserList = Db::name("old_user_jbp")
  158. ->column('id, amount');
  159. // 2. 查询老订单
  160. $userOfGoodsListRaw = Db::name("old_user_of_goods")
  161. ->where('status', 1)
  162. // 优化: 如果用户量大,可以考虑只查相关用户的订单
  163. // ->whereIn('user_id', $userIds)
  164. ->field('user_id, money, order_id, create_time')
  165. ->select()
  166. ->toArray();
  167. // 3. 查询新订单
  168. $storeOrderListRaw = Db::name("store_order")
  169. ->whereIn('status', [0, 1, 2, 3])
  170. // 优化: 如果用户量大,可以考虑只查相关用户的订单
  171. // ->whereIn('uid', $userIds)
  172. ->field('uid, pay_price, mer_id, status, order_id, create_time')
  173. ->select()
  174. ->toArray();
  175. // 4. 查询已存在的贡献值记录
  176. $gongXianListRaw = Db::name("user_sign_gongxian")
  177. ->where('status', '<>', -1)
  178. // 优化: 如果记录非常多,可以分批查询或只查相关用户的
  179. // ->whereIn('uid', array_merge($userIds, array_column($userList, 'spread_uid'))) // 查询购买者和潜在推广者
  180. ->field('uid, order_id, number, status, type')
  181. ->select()
  182. ->toArray();
  183. // 5. 查询已存在的PV记录
  184. $pvListRaw = Db::name("user_pv_log")
  185. ->where('status', '<>', -1)
  186. // 优化: 同上
  187. // ->whereIn('uid', $userIds)
  188. ->field('uid, order_id, pv, status')
  189. ->select()
  190. ->toArray();
  191. // --- 数据预处理部分
  192. $existingGongXian = [];
  193. $existingGongXianByUid = [];
  194. foreach ($gongXianListRaw as $gx) {
  195. $existingGongXian[$gx['uid'] . '_' . $gx['order_id']] = ['number' => $gx['number'], 'status' => $gx['status'], 'type' => $gx['type']];
  196. // TODO 目前老订单id 1-900 新订单ID 4868 - 6255 线下扫码订单 6870 - 8733
  197. if ((1 <= $gx['order_id'] && $gx['order_id'] <= 900) || (4868 <= $gx['order_id'] && $gx['order_id'] <= 6869)) {
  198. $existingGongXianByUid[$gx['uid']][] = $gx['order_id'];
  199. }
  200. }
  201. unset($gongXianListRaw);
  202. $existingPv = [];
  203. $existingPvByUid = [];
  204. foreach ($pvListRaw as $pv) {
  205. $existingPv[$pv['uid'] . '_' . $pv['order_id']] = ['pv' => $pv['pv'], 'status' => $pv['status']];
  206. // TODO 目前老订单id 1-900 新订单ID 4868 - 6255 线下扫码订单 6870 - 8733
  207. if ((1 <= $pv['order_id'] && $pv['order_id'] <= 900) || (4868 <= $pv['order_id'] && $pv['order_id'] <= 6869)) {
  208. $existingPvByUid[$pv['uid']][] = $pv['order_id'];
  209. }
  210. }
  211. unset($pvListRaw);
  212. $userOfGoodsByUid = [];
  213. foreach ($userOfGoodsListRaw as $oldOrder) $userOfGoodsByUid[$oldOrder['user_id']][] = $oldOrder;
  214. unset($userOfGoodsListRaw);
  215. $storeOrdersByUid = [];
  216. foreach ($storeOrderListRaw as $order) $storeOrdersByUid[$order['uid']][] = $order;
  217. unset($storeOrderListRaw);
  218. // *** 主逻辑处理与数据收集 ***
  219. $gongXianDataToInsert = []; // 优化: 合并新旧贡献插入列表
  220. $pvDataToInsert = []; // 优化: 合并新旧PV插入列表
  221. $userUpdateData = []; // 优化: 收集所有需要更新的用户数据 [uid => ['contribute'=>float, 'pv'=>float, 'per_contribute'=>float]]
  222. // 初始化所有用户的待更新数据
  223. foreach ($userList as $uid => $user) {
  224. // 预先设置初始值,确保即使没有订单的用户也能被包含在后续可能的更新逻辑中(如果需要)
  225. // 如果用户没有任何订单,他们的 contribute 和 pv 应该保持数据库原始值或根据业务逻辑设为0
  226. // 这里我们先假设如果没有订单,他们的计算值就是0
  227. $userUpdateData[$uid] = [
  228. 'uid' => $uid,
  229. 'contribute' => 0.0,
  230. 'pv' => 0.0,
  231. 'per_contribute' => 0.0,
  232. ];
  233. // 初始化推广者的 per_contribute 累加器
  234. if (!empty($user['spread_uid'])) {
  235. $spreadUid = $user['spread_uid'];
  236. if (!isset($userUpdateData[$spreadUid])) {
  237. if (isset($userList[$spreadUid])) {
  238. if (!isset($userUpdateData[$spreadUid]['per_contribute'])) {
  239. $userUpdateData[$spreadUid]['per_contribute'] = 0.0; // 初始化推广者的累加
  240. }
  241. } else {
  242. // 记录或处理推广者不在当前用户列表的情况
  243. $result['errors'][] = "执行{$uid}时,没找到 推荐人 {$spreadUid}";
  244. // 可以选择跳过给这个推广者增加 per_contribute
  245. }
  246. } else if (!isset($userUpdateData[$spreadUid]['per_contribute'])) {
  247. $userUpdateData[$spreadUid]['per_contribute'] = 0.0; // 初始化推广者的累加
  248. }
  249. }
  250. }
  251. // 遍历用户列表进行计算和数据收集
  252. foreach ($userList as $uid => $user) {
  253. $spreadUid = $user['spread_uid'];
  254. $existingGongXianByUid[$uid] = $existingGongXianByUid[$uid] ?? [];
  255. $existingPvByUid[$uid] = $existingPvByUid[$uid] ?? [];
  256. if (isset($userOfGoodsByUid[$uid])) {
  257. foreach ($userOfGoodsByUid[$uid] as $oldOrder) {
  258. switch ($oldOrder['money']) {
  259. case 1180:
  260. $totalPv = 700.0;
  261. break;
  262. case 11800:
  263. $totalPv = 7000.0;
  264. break;
  265. case 10620:
  266. $totalPv = 6300.0;
  267. break;
  268. case 2360:
  269. $totalPv = 1400.0;
  270. break;
  271. case 9440:
  272. $totalPv = 5600.0;
  273. break;
  274. default:
  275. $totalPv = round($oldOrder['money'] * 0.7, 2);
  276. break;
  277. }
  278. $settlementTimeOld = $oldOrder['create_time'] ? date('Y-m-d H:i:s', $oldOrder['create_time']) : strtotime($user['create_time']);
  279. // --- 收集贡献值插入数据 ---
  280. $orderKey = $uid . '_' . $oldOrder['order_id'];
  281. // 一个人 同一个订单 可能有多条记录 有问题
  282. if (isset($existingGongXian[$orderKey])) {
  283. $result['oldOrderExistGongXian'][] = ['uid' => $uid, 'order_id' => $oldOrder['order_id']];
  284. $existingGongXianByUid[$uid] = array_diff($existingGongXianByUid[$uid], [$oldOrder['order_id']]);
  285. if ($existingGongXian[$orderKey]['status'] == 1) {
  286. if ($existingGongXian[$orderKey]['type'] == 1) {
  287. $userUpdateData[$uid]['contribute'] += $existingGongXian[$orderKey]['number'];
  288. } else if ($existingGongXian[$orderKey]['type'] == 2) {
  289. $userUpdateData[$uid]['contribute'] -= $existingGongXian[$orderKey]['number'];
  290. }
  291. }
  292. if (!empty($spreadUid) && isset($userUpdateData[$spreadUid])) {
  293. $existingGongXianByUid[$spreadUid] = array_diff($existingGongXianByUid[$spreadUid], [$oldOrder['order_id']]);
  294. if (isset($existingGongXian[$spreadUid . '_' . $oldOrder['order_id']])) {
  295. if ($existingGongXian[$spreadUid . '_' . $oldOrder['order_id']]['status'] == 1) {
  296. if ($existingGongXian[$spreadUid . '_' . $oldOrder['order_id']]['type'] == 1) {
  297. $userUpdateData[$spreadUid]['per_contribute'] += $existingGongXian[$spreadUid . '_' . $oldOrder['order_id']]['number'];
  298. } else if ($existingGongXian[$spreadUid . '_' . $oldOrder['order_id']]['type'] == 2) {
  299. $userUpdateData[$spreadUid]['per_contribute'] -= $existingGongXian[$spreadUid . '_' . $oldOrder['order_id']]['number'];
  300. }
  301. }
  302. }
  303. }
  304. } else {
  305. if ($totalPv > 0) {
  306. $userUpdateData[$uid]['contribute'] += $totalPv;
  307. // --- 收集贡献值插入数据 ---
  308. $gongXianBase = [
  309. "number" => $totalPv, "addtime" => strtotime($settlementTimeOld), "status" => 1,
  310. "order_type" => 21, "order_id" => $oldOrder['order_id'],
  311. "desc" => '', "surplus" => 0, "type" => 1, 'settlement_time' => $settlementTimeOld
  312. ];
  313. // 本人
  314. $gongXianDataToInsert[] = array_merge(["uid" => $uid, "mark" => "购买会员专区商品赠送贡献值(1.0)"], $gongXianBase);
  315. $existingGongXianByUid[$uid] = array_diff($existingGongXianByUid[$uid], [$oldOrder['order_id']]);
  316. // 推广人
  317. if (!empty($user['spread_uid'])) {
  318. if (isset($userUpdateData[$spreadUid])) {
  319. $userUpdateData[$spreadUid]['per_contribute'] += $totalPv;
  320. $gongXianDataToInsert[] = array_merge(["uid" => $spreadUid, "mark" => "推广会员专区商品赠送贡献值(1.0)"], $gongXianBase);
  321. $existingGongXianByUid[$spreadUid] = array_diff($existingGongXianByUid[$spreadUid], [$oldOrder['order_id']]);
  322. }
  323. }
  324. }
  325. }
  326. // --- 收集 PV 插入数据 ---
  327. if (isset($existingPv[$orderKey])) {
  328. $result['oldOrderExistPv'][] = ['uid' => $uid, 'order_id' => $oldOrder['order_id']];
  329. if ($existingPv[$orderKey]['status'] == 1) {
  330. $userUpdateData[$uid]['pv'] += $existingPv[$orderKey]['pv'];
  331. }
  332. } else {
  333. $userUpdateData[$uid]['pv'] += $totalPv;
  334. $pvDataToInsert[] = [
  335. "uid" => $uid, "pv" => $totalPv, "addtime" => strtotime($settlementTimeOld), "status" => 1,
  336. "order_type" => 21, "order_id" => $oldOrder['order_id'],
  337. "mark" => "购买会员专区商品赠送PV(1.0)", 'settlement_time' => $settlementTimeOld
  338. ];
  339. }
  340. if (!empty($existingPvByUid[$uid])) {
  341. $existingPvByUid[$uid] = array_diff($existingPvByUid[$uid], [$oldOrder['order_id']]);
  342. }
  343. }
  344. } // end if isset($userOfGoodsByUid[$uid])
  345. // --- 处理新订单 ---
  346. if (isset($storeOrdersByUid[$uid])) {
  347. foreach ($storeOrdersByUid[$uid] as $order) {
  348. $totalPv = 0.0;
  349. // ... (if/else logic and switch case for $totalPv calculation - same as before)
  350. if ($order['mer_id'] == 496) {
  351. switch ($order['pay_price']) {
  352. case 1180:
  353. $totalPv = 700.0;
  354. break;
  355. case 11800:
  356. $totalPv = 7000.0;
  357. break;
  358. case 10620:
  359. $totalPv = 6300.0;
  360. break;
  361. case 2360:
  362. $totalPv = 1400.0;
  363. break;
  364. case 9440:
  365. $totalPv = 5600.0;
  366. break;
  367. default:
  368. $totalPv = round($order['pay_price'] * 0.7, 2);
  369. break;
  370. }
  371. } else if ($order['status'] == 3) {
  372. $totalPv = round($order['pay_price'] * 0.7, 2);
  373. }
  374. // --- 收集贡献值插入数据 ---
  375. $orderKey = $uid . '_' . $order['order_id'];
  376. $settlementTimeNew = $order['create_time'] ?: date('Y-m-d H:i:s', $user['create_time']);
  377. // --- 收集贡献值插入数据 ---
  378. if (isset($existingGongXian[$orderKey])) {
  379. $result['orderExistGongXian'][] = ['uid' => $uid, 'order_id' => $order['order_id']];
  380. $existingGongXianByUid[$uid] = array_diff($existingGongXianByUid[$uid], [$order['order_id']]);
  381. // 累加计算值
  382. if ($existingGongXian[$orderKey]['status'] == 1) {
  383. if ($existingGongXian[$orderKey]['type'] == 1) {
  384. $userUpdateData[$uid]['contribute'] += $existingGongXian[$orderKey]['number'];
  385. } else if ($existingGongXian[$orderKey]['type'] == 2) {
  386. $userUpdateData[$uid]['contribute'] -= $existingGongXian[$orderKey]['number'];
  387. }
  388. }
  389. if (!empty($spreadUid) && isset($userUpdateData[$spreadUid])) {
  390. $existingGongXianByUid[$spreadUid] = array_diff($existingGongXianByUid[$spreadUid], [$order['order_id']]);
  391. if (isset($existingGongXian[$spreadUid . '_' . $order['order_id']])) {
  392. if ($existingGongXian[$spreadUid . '_' . $order['order_id']]['status'] == 1) {
  393. if ($existingGongXian[$spreadUid . '_' . $order['order_id']]['type'] == 1) {
  394. $userUpdateData[$spreadUid]['per_contribute'] += $existingGongXian[$spreadUid . '_' . $order['order_id']]['number'];
  395. } else if ($existingGongXian[$spreadUid . '_' . $order['order_id']]['type'] == 2) {
  396. $userUpdateData[$spreadUid]['per_contribute'] += $existingGongXian[$spreadUid . '_' . $order['order_id']]['number'];
  397. }
  398. }
  399. }
  400. }
  401. } else {
  402. if ($totalPv > 0) {
  403. $userUpdateData[$uid]['contribute'] += $totalPv;
  404. $gongXianBase = [ // 优化: 提取公共字段
  405. "number" => $totalPv, "addtime" => strtotime($settlementTimeNew), "status" => 1,
  406. "order_type" => 22, "order_id" => $order['order_id'],
  407. "desc" => '', "surplus" => 0, "type" => 1, 'settlement_time' => $settlementTimeNew
  408. ];
  409. // 本人
  410. $gongXianDataToInsert[] = array_merge(["uid" => $uid, "mark" => "购买商品赠送贡献值(2.0)"], $gongXianBase);
  411. $existingGongXianByUid[$uid] = array_diff($existingGongXianByUid[$uid], [$order['order_id']]);
  412. // 推广人
  413. if (!empty($user['spread_uid'])) {
  414. $spreadUid = $user['spread_uid'];
  415. if (isset($userUpdateData[$spreadUid])) { // 确保推广者存在
  416. $gongXianDataToInsert[] = array_merge(["uid" => $spreadUid, "mark" => "推广商品赠送贡献值(2.0)"], $gongXianBase);
  417. $userUpdateData[$spreadUid]['per_contribute'] += $totalPv; // 累加推广者业绩
  418. $existingGongXianByUid[$spreadUid] = array_diff($existingGongXianByUid[$spreadUid], [$order['order_id']]);
  419. }
  420. }
  421. }
  422. }
  423. // --- 收集 PV 插入数据 ---
  424. if (isset($existingPv[$orderKey])) {
  425. $result['orderExistPv'][] = ['uid' => $uid, 'order_id' => $order['order_id']];
  426. if ($existingPv[$orderKey]['status'] == 1) {
  427. $userUpdateData[$uid]['pv'] += $existingPv[$orderKey]['pv'];
  428. }
  429. } else {
  430. $userUpdateData[$uid]['pv'] += $totalPv;
  431. $pvDataToInsert[] = [
  432. "uid" => $uid, "pv" => $totalPv, "addtime" => strtotime($settlementTimeNew), "status" => 1,
  433. "order_type" => 22, // 确认 PV log 的 order_type 是否与贡献一致或有区分
  434. "order_id" => $order['order_id'],
  435. "mark" => "购买商品赠送PV(2.0)", // 标记调整为更通用
  436. 'settlement_time' => $settlementTimeNew
  437. ];
  438. }
  439. if (!empty($existingPvByUid[$uid])) {
  440. $existingPvByUid[$uid] = array_diff($existingPvByUid[$uid], [$order['order_id']]);
  441. }
  442. }
  443. }
  444. // end if isset($storeOrdersByUid[$uid])
  445. // --- 比较计算值与原值 (移到循环外处理) ---
  446. // (在此处比较并记录到 $result['contributeNot'] / $result['pvNot'])
  447. // 注意:浮点数比较可能需要容差
  448. $tolerance = 0.001; // 定义一个小的容差值
  449. if (abs($userUpdateData[$uid]['contribute'] - (float)$user['contribute']) > $tolerance) {
  450. $result['contributeNot'][] = [
  451. 'uid' => $uid,
  452. 'contribute_old' => (float)$user['contribute'], // 显式转换
  453. 'contribute_new' => $userUpdateData[$uid]['contribute']
  454. ];
  455. }
  456. if (abs($userUpdateData[$uid]['pv'] - (float)$user['pv']) > $tolerance) {
  457. $result['pvNot'][] = [
  458. 'uid' => $uid,
  459. 'pv_old' => (float)$user['pv'], // 显式转换
  460. 'pv_new' => $userUpdateData[$uid]['pv']
  461. ];
  462. }
  463. // per_contribute 是累加的,不需要与旧值比较,直接更新
  464. } // end foreach ($userList as $uid => $user)
  465. // *** 数据库批量操作 ***
  466. // 使用事务确保数据一致性
  467. Db::startTrans();
  468. try {
  469. $bill = [];
  470. foreach ($oldUserList as $item) {
  471. $bill[] = [
  472. 'uid' => $item['id'],
  473. 'link_id' => 0,//关联订单id
  474. 'pm' => 1,//0:支出,1:获得
  475. 'title' => '佣金',//账单标题
  476. 'category' => 'now_money',//明细种类
  477. 'type' => 'commission',//明细类型
  478. 'number' => $item['amount'],//明细数字
  479. 'balance' => 0,//剩余
  480. 'mark' => '1.0佣金记录',//备注
  481. 'create_time' => '2025-02-04 00:00:00',//添加时间
  482. 'status' => 1,//0待确定,1有效,-1无效
  483. 'commission_type' => 21,//佣金类型 1代理费 2 消费佣金 3直推奖√ 4辖区佣金\r\n5 养老金√ 6 广告费
  484. //7 跨店奖励√ 8平台奖励 9渠道商\r\n10 推荐创客收益√ 11分红奖金√ 12代理区域收益√ 13消费循环佣金
  485. //14-推荐代理收益√ 15邀请小区团长升级√ 16大v分享奖√ 17创客合伙人√ 18积分奖励√ 19创客补贴√’
  486. 'order_sn' => 0,//订单号
  487. 'tripartite' => 0,//
  488. 'type_shop' => 0,//0平台1多多进宝2唯品会3苏宁易购4网易考拉5淘宝客6京东联盟7饿了么8线上
  489. 'mer_id' => 0,//商户id
  490. 'source' => 0,//1线下 0线上
  491. 'order_type' => 1,//1自营 2 第三方 订单类型
  492. 'is_red_brokerage' => 0,//1红积分对冲佣金 0正常佣金
  493. 'gzc' => 3,//养老金是否已进入公证处log表0:未进入。1:已进入
  494. 'take_time' => '',//结算时间
  495. 'district_id' => '',//
  496. 'street_id' => '',//
  497. 'month' => '',//月份
  498. ];
  499. }
  500. $chunkedBill = array_chunk($bill, 500);
  501. foreach ($chunkedBill as $chunk) {
  502. Db::name('user_bill')->insertAll($chunk);
  503. }
  504. if (!empty($existingGongXianByUid)) {
  505. foreach ($existingGongXianByUid as $uid => $orderList) {
  506. if (!empty($orderList)) {
  507. Db::name("user_sign_gongxian")
  508. ->where('uid', $uid)
  509. ->whereIn('order_id', $orderList)
  510. ->update(['status' => 0]);
  511. }
  512. }
  513. }
  514. if (!empty($existingPvByUid)) {
  515. foreach ($existingPvByUid as $uid => $orderList) {
  516. if (!empty($orderList)) {
  517. Db::name("user_pv_log")
  518. ->where('uid', $uid)
  519. ->whereIn('order_id', $orderList)
  520. ->update(['status' => 0]);
  521. }
  522. }
  523. }
  524. // --- 批量插入贡献值 ---
  525. if (!empty($gongXianDataToInsert)) {
  526. // 分块插入,避免单次插入过多数据 (例如一次500条)
  527. $chunkedGongXian = array_chunk($gongXianDataToInsert, 500);
  528. foreach ($chunkedGongXian as $chunk) {
  529. $insertedGongXianCount = Db::name('user_sign_gongxian')->insertAll($chunk);
  530. $result['insertGongXianSummary']['success'] += $insertedGongXianCount;
  531. }
  532. if ($result['insertGongXianSummary']['success'] < count($gongXianDataToInsert)) {
  533. $result['insertGongXianSummary']['failed'] = count($gongXianDataToInsert) - $result['insertGongXianSummary']['success'];
  534. // 可以考虑记录更详细的失败信息,但这比较复杂,需要知道哪些失败了
  535. $result['errors'][] = "GongXian insertion partially failed or failed completely.";
  536. // 根据业务决定是否回滚
  537. // throw new Exception("GongXian insertion failed");
  538. }
  539. } else {
  540. $result['insertGongXianSummary']['skipped'] = true; // 标记为跳过(无数据)
  541. }
  542. // --- 批量插入PV ---
  543. if (!empty($pvDataToInsert)) {
  544. $chunkedPv = array_chunk($pvDataToInsert, 500);
  545. foreach ($chunkedPv as $chunk) {
  546. $insertedPvCount = Db::name('user_pv_log')->insertAll($chunk);
  547. $result['insertPvSummary']['success'] += $insertedPvCount;
  548. }
  549. if ($result['insertPvSummary']['success'] < count($pvDataToInsert)) {
  550. $result['insertPvSummary']['failed'] = count($pvDataToInsert) - $result['insertPvSummary']['success'];
  551. $result['errors'][] = "PV Log insertion partially failed or failed completely.";
  552. // throw new Exception("PV Log insertion failed");
  553. }
  554. } else {
  555. $result['insertPvSummary']['skipped'] = true; // 标记为跳过(无数据)
  556. }
  557. // --- 批量更新用户信息 ---
  558. $usersToUpdate = [];
  559. // 筛选出实际需要更新的用户数据 (值有变化或 per_contribute > 0)
  560. foreach ($userUpdateData as $uid => $updateInfo) {
  561. $originalUser = $userList[$uid]; // 获取原始用户信息
  562. // 检查 contribute 或 pv 是否变化(使用容差),或者 per_contribute 是否需要更新
  563. $needsUpdate = false;
  564. if (abs($updateInfo['contribute'] - (float)$originalUser['contribute']) > $tolerance) $needsUpdate = true;
  565. if (abs($updateInfo['pv'] - (float)$originalUser['pv']) > $tolerance) $needsUpdate = true;
  566. // per_contribute 始终更新,因为它是在现有基础上累加的(除非业务定义不同)
  567. // 如果 per_contribute 数据库设计是直接覆盖,那只有 > 0 时才需要更新
  568. // 假设是覆盖更新,且只有大于0时才需要更新变动(如果一直是0则不用更新)
  569. if ($updateInfo['per_contribute'] > 0.0) { // 只有当推广业绩>0时才触发更新
  570. // 这里需要确认 per_contribute 是覆盖还是累加?
  571. // 如果是数据库累加: Db::name("user")->where('uid', $uid)->inc('per_contribute', $amount)->update(); 需要单独处理
  572. // 如果是覆盖: 直接放入 saveAll
  573. // 假设是覆盖,我们只更新有变化的或per_contribute > 0 的
  574. $needsUpdate = true;
  575. } else {
  576. // 如果 per_contribute 计算结果为0,且 contribute 和 pv 也未变,则不需要更新 per_contribute 字段
  577. unset($updateInfo['per_contribute']); // 移除无需更新的 per_contribute
  578. if (empty($updateInfo)) $needsUpdate = false; // 如果移除后为空,则不更新
  579. }
  580. if ($needsUpdate) {
  581. // 确保只包含需要更新的字段,并且包含主键 'uid'
  582. $finalUpdateData = ['uid' => $uid];
  583. if (isset($updateInfo['contribute'])) $finalUpdateData['contribute'] = $updateInfo['contribute'];
  584. if (isset($updateInfo['pv'])) $finalUpdateData['pv'] = $updateInfo['pv'];
  585. if (isset($updateInfo['per_contribute']) && $updateInfo['per_contribute'] > 0.0) { // 再次确认只更新大于0的推广业绩
  586. $finalUpdateData['per_contribute'] = $updateInfo['per_contribute'];
  587. }
  588. if (count($finalUpdateData) > 1) { // 确保除了uid还有其他字段要更新
  589. $usersToUpdate[] = $finalUpdateData;
  590. } else {
  591. $result['userUpdateSummary']['skipped']++; // 记录跳过的更新(无变化)
  592. }
  593. } else {
  594. $result['userUpdateSummary']['skipped']++; // 记录跳过的更新(无变化)
  595. }
  596. }
  597. if (!empty($usersToUpdate)) {
  598. // 使用 saveAll 进行批量更新 (要求 PHP >= 7.1.8 for MySQL)
  599. // saveAll 会根据主键 'uid' 更新对应记录
  600. $userModel = new User();
  601. $updatedCount = $userModel->saveAll($usersToUpdate); // TP6 支持 saveAll
  602. // 注意: saveAll 返回的是成功保存或更新的 *对象集合* 或 *布尔值*,不是影响的行数。
  603. // 需要检查返回类型并判断成功数量。通常返回集合时 count(集合) 是成功数。
  604. // 如果是 TP5,可能需要循环 update 或构造复杂 SQL。
  605. // 假设 TP6 saveAll 成功会返回包含更新后数据的集合或true,失败是false
  606. if ($updatedCount !== false) {
  607. // 这里需要一种方法来确定实际更新了多少条记录。
  608. // saveAll 的返回值可能需要进一步处理。
  609. // 简单假设:如果返回不是 false,就认为请求中的都成功了(可能不准确)
  610. // 更精确的方法是 saveAll 后再查询一次确认。
  611. // 这里我们暂时认为 saveAll 返回非 false 即为大部分成功
  612. $result['userUpdateSummary']['success'] = count($usersToUpdate); // 乐观估计
  613. } else {
  614. $result['userUpdateSummary']['failed'] = count($usersToUpdate); // 全部失败
  615. $result['errors'][] = "User batch update failed using saveAll.";
  616. // throw new Exception("User batch update failed");
  617. }
  618. }
  619. // 更新统计:失败数等于总数减去成功和跳过的
  620. //$result['userUpdateSummary']['failed'] = count($userList) - $result['userUpdateSummary']['success'] - $result['userUpdateSummary']['skipped'];
  621. // 如果所有操作都成功,提交事务
  622. Db::commit();
  623. } catch
  624. (\Exception $e) {
  625. // 如果任何数据库操作失败,回滚事务
  626. Db::rollback();
  627. // 记录错误信息
  628. $result['errors'][] = "Transaction failed: " . $e->getMessage();
  629. // 可以根据需要将 insert/update 摘要设置为失败
  630. $result['userUpdateSummary']['failed'] = count($usersToUpdate); // 假设更新失败
  631. $result['insertGongXianSummary']['failed'] = count($gongXianDataToInsert); // 假设插入失败
  632. $result['insertPvSummary']['failed'] = count($pvDataToInsert); // 假设插入失败
  633. }
  634. // --- 清理/最终结果赋值 (可选) ---
  635. // $result['gongXianDataOldList'] = $gongXianDataOldList; // 这些已合并到 ToInsert
  636. // $result['gongXianDataList'] = $gongXianDataList;
  637. // $result['pvDataOldList'] = $pvDataOldList;
  638. // $result['pvDataList'] = $pvDataList;
  639. return json($result);
  640. // // 计算总业绩
  641. // $totalPv = [];
  642. // foreach ($user_team_amount as $order) {
  643. // if (!isset($totalPv[$order['user_id']])) {
  644. // $totalPv[$order['user_id']] = 0;
  645. // }
  646. // switch ($order['money']) {
  647. // case 1180:
  648. // $totalPv[$order['user_id']] += 700;
  649. // break;
  650. // case 11800:
  651. // $totalPv[$order['user_id']] += 7000;
  652. // break;
  653. // case 10620:
  654. // $totalPv[$order['user_id']] += 6300;
  655. // break;
  656. // case 2360:
  657. // $totalPv[$order['user_id']] += 1400;
  658. // break;
  659. // case 9440:
  660. // $totalPv[$order['user_id']] += 5600;
  661. // break;
  662. // default:
  663. // if ($order['money'] == 2344.99) {
  664. // break;
  665. // }
  666. // $totalPv[$order['user_id']] += round($order['money'] * 0.7, 2);
  667. // break;
  668. // }
  669. // }
  670. // foreach ($totalPv as $uid => $pv) {
  671. // Db::name("user")->where('is_old', 1)->where("uid", $uid)->update(['pv' => $pv]);
  672. // }
  673. //
  674. // return;
  675. // /**
  676. // * 周金花200(13959100621)
  677. // * 黄金花200(18603401312)
  678. // * 徐立苹100(13521438652)
  679. // * 李素红200(13701061395)
  680. // * 周行体200(13231658486)
  681. // * 刘银霞100(13161909228)
  682. // * 李卫东100(13911601230)
  683. // * 金 波100(13801358713)
  684. // * 王 玲 150(15810064711)
  685. // * 侯玉兰150(15232797965)
  686. // * 吕丽娣100(15960349667)
  687. // * 张传莲100(15332507711)
  688. // * 刘春梅100(18760167163)
  689. // * 付天如100(18863873000)
  690. // * 付绍先100(15324059286)
  691. // * 黄桂林100(15960196876)
  692. // * 温 煌100(18350134089)
  693. // * 谭英先100(13978627072)
  694. // * 陈玉珍100(19858353660)
  695. // * 黄雪云100(18650055445)
  696. // * 黄 玲100(13877193411)
  697. // * 邱佳珍100(13960379098)
  698. // * 隋彩云100(13601071082)
  699. // */
  700. // $data = [
  701. // '13959100621' => 200,
  702. // '18603401312' => 200,
  703. // '13521438652' => 100,
  704. // '13701061395' => 200,
  705. // '13231658486' => 200,
  706. // '13161909228' => 100,
  707. // '13911601230' => 100,
  708. // '13801358713' => 100,
  709. // '15810064711' => 150,
  710. // '15232797965' => 150,
  711. // '15960349667' => 100,
  712. // '15332507711' => 100,
  713. // '18760167163' => 100,
  714. // '18863873000' => 100,
  715. // '15324059286' => 100,
  716. // '15960196876' => 100,
  717. // '18350134089' => 100,
  718. // '13978627072' => 100,
  719. // '19858353660' => 100,
  720. // '18650055445' => 100,
  721. // '13877193411' => 100,
  722. // '13960379098' => 100,
  723. // '13601071082' => 100,
  724. // ];
  725. // $result = Db::name("user")
  726. // ->whereIn("account", array_keys($data))
  727. // ->where('is_del', 0)
  728. // ->field('uid, brokerage_price, account, nickname')
  729. // ->select();
  730. // $res = [];
  731. // foreach ($result as $v) {
  732. // Db::name("user")->where("uid", $v['uid'])->inc("brokerage_price", $data[$v['account']])->save();
  733. // $this->bill_user_log111111($v['uid'], "佣金补贴", $data[$v['account']], "佣金补贴", 8);//股权分佣明细2.0系统
  734. // $res[] = [
  735. // 'uid' => $v['uid'],
  736. // 'account' => $v['account'],
  737. // 'brokerage_price_pre' => $v['brokerage_price'],
  738. // 'brokerage_price' => $data[$v['account']],
  739. // 'nickname' => $v['nickname']
  740. // ];
  741. // }
  742. // return json($res);
  743. }
  744. public function lst6(Request $request)
  745. {
  746. $startTime = $request->param('startTime', null);
  747. $endTime = $request->param('endTime', null);
  748. $isTest = $request->param('isTest', 1);
  749. $maxAllocationAmount = $request->param('maxAllocationAmount', null);
  750. // 查询测试人员账号信息
  751. //18973958920
  752. //15186694339
  753. //18833633835
  754. //19525470098
  755. //17756507016
  756. //18226705337
  757. $testAccount = ['18973958920', '15186694339', '18833633835', '19525470098', '17756507016', '18226705337', '17855366921'];
  758. $removeUserList = Db::name("user")
  759. ->whereIn('account', $testAccount)
  760. ->where("status", "<>", 0)
  761. ->where('is_del', '<>', 1)
  762. ->select()
  763. ->toArray();
  764. $removeUserIdList = array_column($removeUserList, 'uid');
  765. $zeroLineUidList = [1420, 2328];
  766. foreach ($zeroLineUidList as $uid) {
  767. //查询当前团队的用户列表
  768. $sql = "select getUserLevelId($uid) as uids";
  769. //\think\facade\Log::info("lplpDB".$sql);
  770. try {
  771. $spread_user_list = Db::query($sql);
  772. } catch (\Exception $exception) {
  773. return json($exception->getMessage());
  774. }
  775. $removeUserIdList = array_merge(explode(",", trim($spread_user_list[0]['uids'], '$,')), $removeUserIdList);
  776. }
  777. if (empty($startTime) || empty($endTime)) {
  778. $timeMap = $this->getTime('last_week');
  779. $startTime = $timeMap['startTime'] . ' 00:00:00';
  780. $endTime = $timeMap['endTime'] . ' 23:59:59';
  781. }
  782. // 定义分红金额
  783. $weekRecord = $this->getTeamPvByTime($startTime, $endTime, $removeUserIdList);
  784. // 分红金额 - 红包金额
  785. $redEnvelope = $this->getRedEnvelopeByTime($startTime, $endTime, $removeUserIdList);
  786. $weekRecord -= $redEnvelope;
  787. if (!is_null($maxAllocationAmount)) {
  788. $weekRecord = $maxAllocationAmount;
  789. }
  790. if ($weekRecord <= 0) {
  791. return json('无效分红金额');
  792. }
  793. // $stock_comm = round($weekRecord * 0.05 ,2);
  794. $stock_comm = floor(($weekRecord * 0.05) * 100) / 100;
  795. //获取股权分红的人
  796. $GetAllUserPackNum = db::name("old_user_stock")->sum("pack");//计算所有用户的份数总和
  797. $stockuserdatas = db::name("old_user_stock")->select();//获取所有用户
  798. $salesArr = [];
  799. if (count($stockuserdatas) > 0) {
  800. // $one_pack_comm_data = round($stock_comm / $GetAllUserPackNum,2);//获取每份的单佣金
  801. $one_pack_comm_data = floor(($stock_comm / $GetAllUserPackNum) * 100) / 100;
  802. foreach ($stockuserdatas as &$v) {
  803. $salesArr[] = [
  804. 'stock_comm' => $stock_comm,
  805. 'GetAllUserPackNum' => $GetAllUserPackNum,
  806. 'uid' => $v['user_id'],
  807. 'pack' => $v['pack'],
  808. 'one_pack_comm_data' => $one_pack_comm_data,
  809. 'getcomm' => floor(($v['pack'] * $one_pack_comm_data) * 100) / 100
  810. ];
  811. $v['getcomm'] = floor(($v['pack'] * $one_pack_comm_data) * 100) / 100;
  812. $v['allgetcomm'] = $v['allgetcomm'] + $v['getcomm'];
  813. $v['update_time'] = time();
  814. $yj_90 = $v['getcomm'] * 0.9;
  815. $fg_10 = $v['getcomm'] * 0.1;
  816. if ($isTest == 0) {
  817. // // 更新 user_stock 表中的记录
  818. $res = db::name("old_user_stock")->where("id", $v['id'])->update([
  819. 'getcomm' => $v['getcomm'],
  820. 'allgetcomm' => $v['allgetcomm'],
  821. 'update_time' => $v['update_time']
  822. ]);
  823. Db::name("user")->where("uid", $v['user_id'])->inc("brokerage_price", $yj_90)->save();
  824. $res1 = Db::name("user")->where("uid", $v['user_id'])->inc("total_amount_old", $yj_90)->save();
  825. $res2 = Db::name("user")->where("uid", $v['user_id'])->inc("amount_old", $yj_90)->save();
  826. $res3 = Db::name("user")->where("uid", $v['user_id'])->inc("fugou", $fg_10)->save();
  827. $res = true;
  828. if ($res) {
  829. $das = $this->change_user_log($v['user_id'], 'amount_old', 1, $yj_90, "member_award_stock", "股权分红入账" . "-" . $v['pack']);//释放佣金
  830. //入账星级分红记录表
  831. $week_data = [];
  832. $week_data['user_id'] = $v['user_id'];
  833. $week_data['user_star_id'] = 0;
  834. $week_data['award_num'] = 0;
  835. $week_data['award_num_sm'] = 0;
  836. $week_data['remark'] = "股权分红主动执行" . $yj_90;
  837. $week_data['week_record'] = $weekRecord;
  838. $week_data['all_amount'] = $stock_comm;
  839. $week_data['radio'] = 2;
  840. $week_data['owner_bill'] = 0; //总流水金额
  841. $week_data['my_bill'] = 0; //我的流水
  842. $week_data['create_time'] = time();
  843. Db::name("old_user_weekaward")->insert($week_data);
  844. $userdatassss = db::name("old_user_jbp")->where("id", $v['user_id'])->find();
  845. $datas_log = [
  846. 'note' => "名称:" . $userdatassss['nick_name'] . " 用户:" . $v['user_id'] . " 新增股权佣金:" . $yj_90,
  847. 'create_time' => date('Y-m-d H:i:s')
  848. ];
  849. $con_data = Db::name('test_log')->insert($datas_log); //数据存到2.0数据表中
  850. $this->bill_user_log111111($v['user_id'], "股权分佣", $yj_90, "股权明细入账", 13);//股权分佣明细2.0系统
  851. $this->fugou_user_log($v['user_id'], $fg_10, 16, 1, 1);//复购金明细入账
  852. }
  853. }
  854. }
  855. }
  856. return json($salesArr);
  857. //股权分红 end
  858. }
  859. //添加复购金
  860. public function fugou_user_log($uid, $num, $order_id, $type_inc_des, $status = -1)
  861. {
  862. $fugou_data = Db::name('user')->where("uid", $uid)->find();
  863. $bill = [
  864. 'uid' => $uid,
  865. 'number' => $num,//数量
  866. 'status' => $status,//复购金状态1-有效 0-失效 -1待确认
  867. 'mark' => "复购金",//备注
  868. 'desc' => "10%作为复购金",//描述
  869. 'order_id' => $order_id,//订单id
  870. 'surplus' => 0,//剩余
  871. 'order_type' => 11,//关联订单ID
  872. 'type' => $type_inc_des,//复购金类型 :1赠送,2消耗
  873. 'settlement_time' => date('Y-m-d H:i:s'),//添加时间,
  874. 'addtime' => time(),
  875. ];
  876. Db::name('user_sign_fugou')->insert($bill);
  877. }
  878. //添加平台分佣2.0系统收益明细日志(养老金金额)
  879. public function bill_user_log111111($uid, $name, $num, $mark, $comm)
  880. {
  881. $con_data = Db::name('user')->where("uid", $uid)->find();
  882. //如果是会员专区就即刻到账
  883. // Db::name('user')->where("uid",$con_data['uid'])->update(['brokerage_price'=> $con_data['brokerage_price'] + $num]);
  884. $bill = [
  885. 'uid' => $uid,
  886. 'link_id' => 0,//关联订单id
  887. 'pm' => 1,//0:支出,1:获得
  888. 'title' => $name,//账单标题
  889. 'category' => 'now_money',//明细种类
  890. 'type' => 'commission',//明细类型
  891. 'number' => $num,//明细数字
  892. 'balance' => 0,//剩余
  893. 'mark' => $mark,//备注
  894. 'create_time' => date('Y-m-d H:i:s'),//添加时间
  895. 'status' => 1,//0待确定,1有效,-1无效
  896. 'commission_type' => $comm,//佣金类型 1代理费 2 消费佣金 3直推奖√ 4辖区佣金\r\n5 养老金√ 6 广告费
  897. //7 跨店奖励√ 8平台奖励 9渠道商\r\n10 推荐创客收益√ 11分红奖金√ 12代理区域收益√ 13消费循环佣金
  898. //14-推荐代理收益√ 15邀请小区团长升级√ 16大v分享奖√ 17创客合伙人√ 18积分奖励√ 19创客补贴√’
  899. 'order_sn' => 0,//订单号
  900. 'tripartite' => 0,//
  901. 'type_shop' => 0,//0平台1多多进宝2唯品会3苏宁易购4网易考拉5淘宝客6京东联盟7饿了么8线上
  902. 'mer_id' => 0,//商户id
  903. 'source' => 0,//1线下 0线上
  904. 'order_type' => 1,//1自营 2 第三方 订单类型
  905. 'is_red_brokerage' => 0,//1红积分对冲佣金 0正常佣金
  906. 'gzc' => 3,//养老金是否已进入公证处log表0:未进入。1:已进入
  907. 'take_time' => '',//结算时间
  908. 'district_id' => '',//
  909. 'street_id' => '',//
  910. 'month' => '',//月份
  911. ];
  912. Db::name('user_bill')->insert($bill);
  913. }
  914. //发放佣金 示例: $this->change_user_log($v,'amount',1,$all_award,"member_award","星级分红入账"."-".$value['title']);//释放佣金
  915. function change_user_log($user_id, $type, $change_status, $money, $routine, $remark = "", $is_admin = 1, $appoint_money = 0)
  916. {
  917. $transition = [
  918. 'pv' => 1,
  919. "gb" => 2,
  920. "df" => 3,
  921. "vr" => 4,
  922. "bt" => 5,
  923. "withdraw_quota_old" => 6,//提现
  924. "unsettled_pension" => 7,
  925. "amount_old" => 8//发放佣金
  926. ];
  927. $routineInfo = Db::name("old_routine_log_of_key")->where("key", $routine)->find();
  928. if (empty($routineInfo)) {
  929. return false;
  930. }
  931. $key_id = isset($routineInfo['id']) ? $routineInfo['id'] : 0;
  932. if ($appoint_money > 0) {
  933. $alter_money = $appoint_money;
  934. } else {
  935. //再去查询变更前的 金额
  936. $alter_money = Db::name("user")->where('uid', $user_id)->value($type);
  937. }
  938. if ($change_status == 1) {
  939. //新增前
  940. $alter_money = $alter_money - $money;
  941. } else if ($change_status == 2) {
  942. //减少前
  943. $alter_money = $alter_money + $money;
  944. }
  945. if ($alter_money < 0) {
  946. $alter_money = 0;
  947. }
  948. $inser_data = [];
  949. $inser_data['user_id'] = $user_id;
  950. $inser_data['type'] = $transition[$type];
  951. $inser_data['change_status'] = $change_status;
  952. $inser_data['money'] = $money;
  953. $inser_data['routine_log_of_key_id'] = $key_id;
  954. $inser_data['remark'] = $remark;
  955. $inser_data['is_admin'] = $is_admin;
  956. $inser_data['create_time'] = time();
  957. $inser_data['alter_money'] = isset($alter_money) ? $alter_money : 0;
  958. Db::name("old_user_log")->insert($inser_data);
  959. }
  960. public function getTime($timePeriod)
  961. {
  962. // 定义时间区间
  963. $now = time();
  964. $startTime = '';
  965. $endTime = '';
  966. if ($timePeriod == 'last_week') {
  967. // 上周的时间区间
  968. $startTime = date('Y-m-d', strtotime('monday last week', $now)); // 上周星期一的开始时间
  969. $endTime = date('Y-m-d', strtotime('sunday last week', $now)); // 上周星期日的结束时间
  970. } elseif ($timePeriod == 'this_week') {
  971. // 这周的时间区间
  972. $startTime = date('Y-m-d', strtotime('monday this week', $now)); // 这周星期一的开始时间
  973. $endTime = date('Y-m-d', strtotime('sunday this week', $now)); // 这周星期日的结束时间
  974. }
  975. // return ['startTime' => '2025-03-10', 'endTime' => '2025-03-23'];
  976. return ['startTime' => $startTime, 'endTime' => $endTime];
  977. }
  978. public function getTeamPvByTime($startTime, $endTime, $removeUserIdList = [])
  979. {
  980. // 查询指定时间区间内的所有订单,并排除 pay_time 为 NULL 的订单
  981. $orders = Db::name("store_order")
  982. ->where('mer_id', 496)
  983. ->whereNotIn('uid', $removeUserIdList)
  984. ->whereIn('status', [0, 1, 2, 3])
  985. ->whereIn("total_price", [1180, 11800, 10620, 2360, 9440])
  986. ->whereBetween("pay_time", [$startTime, $endTime])
  987. ->whereNotNull("pay_time") // 排除 pay_time 为 NULL 的订单
  988. ->select();
  989. // 计算总业绩
  990. $totalPv = 0;
  991. foreach ($orders as $order) {
  992. switch ($order['total_price']) {
  993. case 1180:
  994. $totalPv += 700;
  995. break;
  996. case 11800:
  997. $totalPv += 7000;
  998. break;
  999. case 10620:
  1000. $totalPv += 6300;
  1001. break;
  1002. case 2360:
  1003. $totalPv += 1400;
  1004. break;
  1005. case 9440:
  1006. $totalPv += 5600;
  1007. break;
  1008. }
  1009. }
  1010. return $totalPv;
  1011. }
  1012. public function getRedEnvelopeByTime($startTime, $endTime, $removeUserIdList = [])
  1013. {
  1014. // 查询指定时间区间内的所有订单,并排除 pay_time 为 NULL 的订单
  1015. $redEnvelopeList = Db::name("user_sign_hongbao")
  1016. ->whereNotIn('uid', $removeUserIdList)
  1017. ->where('status', 1)
  1018. ->whereBetween("settlement_time", [$startTime, $endTime])
  1019. ->select()
  1020. ->toArray();
  1021. return floor(array_sum(array_column($redEnvelopeList, 'number')) * 100) / 100;
  1022. }
  1023. }