TaskPartnerProfits.php 46 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016
  1. <?php
  2. namespace app\controller\api\store\merchant;
  3. use app\common\enum\CommonEnum;
  4. use app\common\enum\dividend\DividendLogEnum;
  5. use app\common\repositories\dividend\DividendLogRepository;
  6. use app\entity\data\dividend\DividendLogEntity;
  7. use think\db\exception\DataNotFoundException;
  8. use think\db\exception\DbException;
  9. use think\db\exception\ModelNotFoundException;
  10. use think\facade\Db;
  11. use think\facade\Log;
  12. use think\Request;
  13. class TaskPartnerProfits
  14. {
  15. public function getTime($timePeriod)
  16. {
  17. // 定义时间区间
  18. $now = time();
  19. $startTime = '';
  20. $endTime = '';
  21. if ($timePeriod == 'last_week') {
  22. // 上周的时间区间
  23. $startTime = date('Y-m-d', strtotime('monday last week', $now)); // 上周星期一的开始时间
  24. $endTime = date('Y-m-d', strtotime('sunday last week', $now)); // 上周星期日的结束时间
  25. } elseif ($timePeriod == 'this_week') {
  26. // 这周的时间区间
  27. $startTime = date('Y-m-d', strtotime('monday this week', $now)); // 这周星期一的开始时间
  28. $endTime = date('Y-m-d', strtotime('sunday this week', $now)); // 这周星期日的结束时间
  29. }
  30. // return ['startTime' => '2025-03-10', 'endTime' => '2025-03-23'];
  31. return ['startTime' => $startTime, 'endTime' => $endTime];
  32. }
  33. public function getTeamPvByTime($startTime, $endTime, $removeUserIdList = [])
  34. {
  35. // 查询指定时间区间内的所有订单,并排除 pay_time 为 NULL 的订单
  36. $orders = Db::name("store_order")
  37. ->alias('a')
  38. ->where('a.mer_id', 496)
  39. ->whereNotIn('a.uid', $removeUserIdList)
  40. ->whereIn('a.status', [0, 1, 2, 3])
  41. // ->whereIn("a.total_price", [1180, 11800, 10620, 2360, 9440])
  42. ->whereBetween("a.pay_time", [$startTime, $endTime])
  43. ->whereNotNull("a.pay_time") // 排除 pay_time 为 NULL 的订单
  44. ->leftJoin('rrx_store_cart b', 'a.cart_id = b.cart_id')
  45. ->field('a.mer_id, a.cart_id, a.status, a.pay_time, a.total_price, b.product_id')
  46. ->select();
  47. // 计算总业绩
  48. $totalPv = 0;
  49. foreach ($orders as $order) {
  50. switch ($order['product_id']) {
  51. case in_array($order['product_id'], [15762, 15763]):
  52. $totalPv += 700;
  53. break;
  54. case in_array($order['product_id'], [15813, 15820]):
  55. $totalPv += 7000;
  56. break;
  57. case in_array($order['product_id'], [15814, 15819]):
  58. $totalPv += 6300;
  59. break;
  60. case in_array($order['product_id'], [15815, 15817]):
  61. $totalPv += 1400;
  62. break;
  63. case in_array($order['product_id'], [15816, 15818]):
  64. $totalPv += 5600;
  65. break;
  66. case in_array($order['product_id'], [17610]):
  67. $totalPv += 35;
  68. break;
  69. case in_array($order['product_id'], [17611]):
  70. $totalPv += 175;
  71. break;
  72. case in_array($order['product_id'], [17612]):
  73. $totalPv += 350;
  74. break;
  75. }
  76. }
  77. return $totalPv;
  78. }
  79. /**
  80. * 获取周期内 所有 有效的下单人ID列表
  81. * @param $startTime
  82. * @param $endTime
  83. * @param array $removeUserIdList
  84. * @return array
  85. */
  86. public function getOrderUidListByTime($startTime, $endTime, array $removeUserIdList = []): array
  87. {
  88. $orderUidMap = [];
  89. try {
  90. // 本地订单
  91. $storeOrder = Db::name("store_order")
  92. ->where('mer_id', '<>', CommonEnum::DESIGN_MERCHANT_ID['Repurchase']['code'])
  93. ->whereNotIn('uid', $removeUserIdList)
  94. ->whereIn('status', [0, 1, 2, 3])
  95. ->whereBetween("pay_time", [$startTime, $endTime])
  96. ->whereNotNull("pay_time") // 排除 pay_time 为 NULL 的订单
  97. ->field('mer_id, status, pay_time, total_price, uid, order_id, order_sn')
  98. ->select()
  99. ->toArray();
  100. foreach ($storeOrder as $order) {
  101. $orderUidMap[$order['uid']][] = ['orderTable' => 'store_order', 'orderId' => $order['order_id'], 'orderSn' => $order['order_sn']];
  102. }
  103. // $storeOrderUidList = array_column($storeOrder, 'uid');
  104. // $uidList = array_merge($uidList, $storeOrderUidList);
  105. // 话费订单 order_huafei
  106. $orderHuafei = Db::name("order_huafei")
  107. ->whereNotIn('uid', $removeUserIdList)
  108. ->where('status', '<>', 0) // 只要不是待支付的 即算是有效活跃度
  109. ->whereBetween("finish_time", [$startTime, $endTime])
  110. ->field('order_huafei_id, uid, status, finish_time, amount_price, order_sn')
  111. ->select()
  112. ->toArray();
  113. foreach ($orderHuafei as $order) {
  114. $orderUidMap[$order['uid']][] = ['orderTable' => 'order_huafei', 'orderId' => $order['order_huafei_id'], 'orderSn' => $order['order_sn']];
  115. }
  116. // $orderHuafeiUidList = array_column($orderHuafei, 'uid');
  117. // $uidList = array_merge($uidList, $orderHuafeiUidList);
  118. // 三方订单
  119. // 京东
  120. $orderJd = Db::name("order_jd")
  121. ->whereNotIn('uid', $removeUserIdList)
  122. ->where('status', '<>', 15) // 只要不是待支付的 即算是有效活跃度
  123. ->whereBetween("create_time", [$startTime, $endTime])
  124. ->field('order_jd_id, uid, status, create_time, price, order_sn')
  125. ->select()
  126. ->toArray();
  127. foreach ($orderJd as $order) {
  128. $orderUidMap[$order['uid']][] = ['orderTable' => 'order_jd', 'orderId' => $order['order_jd_id'], 'orderSn' => $order['order_sn']];
  129. }
  130. // $orderJdUidList = array_column($orderJd, 'uid');
  131. // $uidList = array_merge($uidList, $orderJdUidList);
  132. // 淘宝
  133. $orderTb = Db::name("order_tb")
  134. ->whereNotIn('uid', $removeUserIdList)
  135. // ->where('status', '<>', 15) // 只要不是待支付的 即算是有效活跃度 不能明确状态信息
  136. ->whereBetween("create_time", [$startTime, $endTime])
  137. ->field('order_tb_id, uid, tk_status, create_time, pay_price, order_sn')
  138. ->select()
  139. ->toArray();
  140. foreach ($orderTb as $order) {
  141. $orderUidMap[$order['uid']][] = ['orderTable' => 'order_tb', 'orderId' => $order['order_tb_id'], 'orderSn' => $order['order_sn']];
  142. }
  143. // $orderTbUidList = array_column($orderTb, 'uid');
  144. // $uidList = array_merge($uidList, $orderTbUidList);
  145. // 拼多多
  146. $orderPdd = Db::name("order_pdd")
  147. ->whereNotIn('uid', $removeUserIdList)
  148. ->where('pin_order_status', '<>', -1) // 只要不是待支付的 即算是有效活跃度 不能明确状态信息
  149. ->whereBetween("group_time", [strtotime($startTime), strtotime($endTime)])
  150. ->field('order_pdd_id, uid, pin_order_status, create_time, pay_money, order_sn')
  151. ->select()
  152. ->toArray();
  153. foreach ($orderPdd as $order) {
  154. $orderUidMap[$order['uid']][] = ['orderTable' => 'order_pdd', 'orderId' => $order['order_pdd_id'], 'orderSn' => $order['order_sn']];
  155. }
  156. // $orderPddUidList = array_column($orderPdd, 'uid');
  157. // $uidList = array_merge($uidList, $orderPddUidList);
  158. // 唯品会
  159. $orderVip = Db::name("order_vip")
  160. ->whereNotIn('uid', $removeUserIdList)
  161. ->where('status', '<>', 0) // 只要不是待支付的 即算是有效活跃度 不能明确状态信息
  162. ->whereBetween("order_time", [strtotime($startTime), strtotime($endTime)])
  163. ->field('order_vip_id, uid, status, order_time, pay_money, order_sn')
  164. ->select()
  165. ->toArray();
  166. foreach ($orderVip as $order) {
  167. $orderUidMap[$order['uid']][] = ['orderTable' => 'order_vip', 'orderId' => $order['order_vip_id'], 'orderSn' => $order['order_sn']];
  168. }
  169. // $orderVipUidList = array_column($orderVip, 'uid');
  170. // $uidList = array_merge($uidList, $orderVipUidList);
  171. } catch (DataNotFoundException|ModelNotFoundException|DbException $e) {
  172. Log::error('分红-获取下单用户列表失败:' . json_encode([
  173. 'error_message' => $e->getMessage(),
  174. 'error_file' => $e->getFile(),
  175. 'error_line' => $e->getLine(),
  176. 'error_code' => $e->getCode(),
  177. 'exception_class' => get_class($e),
  178. 'trace' => $e->getTraceAsString()
  179. ], JSON_UNESCAPED_UNICODE));
  180. }
  181. return $orderUidMap;
  182. }
  183. public function getRedEnvelopeByTime($startTime, $endTime, $removeUserIdList = [])
  184. {
  185. // 查询指定时间区间内的所有订单,并排除 pay_time 为 NULL 的订单
  186. $redEnvelopeList = Db::name("user_sign_hongbao")
  187. ->whereNotIn('uid', $removeUserIdList)
  188. ->where('status', 1)
  189. ->whereBetween("settlement_time", [$startTime, $endTime])
  190. ->select()
  191. ->toArray();
  192. return floor(array_sum(array_column($redEnvelopeList, 'number')) * 100) / 100;
  193. }
  194. public function partnerProfits(Request $request)
  195. {
  196. // 由于分红错误 需要对数据进行撤回
  197. // $user_bill_list = Db::name("user_bill")
  198. // ->where("title", '合伙人分佣')
  199. // ->where("status", 1)
  200. // ->whereBetween('create_time', ['2025-04-07 16:46:56', '2025-04-07 16:47:02'])
  201. // ->select()
  202. // ->toArray();
  203. // $user_bill_uid_list = array_column($user_bill_list, null, 'uid');
  204. //
  205. // $user_sign_fugou_list = Db::name("user_sign_fugou")
  206. // ->where("mark", '复购金')
  207. // ->where("status", 1)
  208. // ->whereBetween('settlement_time', ['2025-04-07 16:46:56', '2025-04-07 16:47:02'])
  209. // ->select()
  210. // ->toArray();
  211. // $user_sign_fugou_uid_list = array_column($user_sign_fugou_list, null, 'uid');
  212. //
  213. // $old_user_weekaward_list = Db::name("old_user_weekaward")
  214. //// ->where("mark", '复购金')
  215. //// ->where("status", 1)
  216. // ->whereBetween('create_time', [1744015616, 1744015622])
  217. // ->select()
  218. // ->toArray();
  219. // $old_user_weekaward_list = array_column($old_user_weekaward_list, null, 'uid');
  220. // return json($user_bill_list);
  221. $startTime = $request->param('startTime', null);
  222. $endTime = $request->param('endTime', null);
  223. $remark = $request->param('remark', '');
  224. $isTest = $request->param('isTest', 1);
  225. $maxAllocationAmount = $request->param('maxAllocationAmount', null);
  226. // 查询测试人员账号信息
  227. //18973958920
  228. //15186694339
  229. //18833633835
  230. //19525470098
  231. //17756507016
  232. //18226705337
  233. $testAccount = ['18973958920', '15186694339', '18833633835', '19525470098', '17756507016', '18226705337', '17855366921'];
  234. $removeUserList = Db::name("user")
  235. ->whereIn('account', $testAccount)
  236. ->where("status", "<>", 0)
  237. ->where('is_del', '<>', 1)
  238. ->select()
  239. ->toArray();
  240. $removeUserIdList = array_column($removeUserList, 'uid');
  241. $zeroLineUidList = [1420, 2328, 1720, 3];
  242. foreach ($zeroLineUidList as $uid) {
  243. //查询当前团队的用户列表
  244. $sql = "select getUserLevelId($uid) as uids";
  245. //\think\facade\Log::info("lplpDB".$sql);
  246. try {
  247. $spread_user_list = Db::query($sql);
  248. } catch (\Exception $exception) {
  249. return app('json')->fail($exception->getMessage());
  250. }
  251. $removeUserIdList = array_merge(explode(",", trim($spread_user_list[0]['uids'], '$,')), $removeUserIdList);
  252. }
  253. if (empty($startTime) || empty($endTime)) {
  254. $timeMap = $this->getTime('last_week');
  255. $startTime = $timeMap['startTime'] . ' 00:00:00';
  256. $endTime = $timeMap['endTime'] . ' 23:59:59';
  257. }
  258. // 定义分红金额
  259. $performance = $this->getTeamPvByTime($startTime, $endTime, $removeUserIdList);
  260. // 分红金额 - 红包金额
  261. $redEnvelope = $this->getRedEnvelopeByTime($startTime, $endTime, $removeUserIdList);
  262. $weekRecord = bcsub($performance, $redEnvelope, 2);
  263. if (!is_null($maxAllocationAmount)) {
  264. $weekRecord = $maxAllocationAmount;
  265. }
  266. if ($weekRecord <= 0) {
  267. return app('json')->fail('无效分红金额');
  268. }
  269. // 1、获取用户星级信息
  270. //$star_list = Db::name("user_star")->order("statement_all_num desc")->select()->toArray();//旧星级等级
  271. $starList = Db::name("old_user_starlevel")
  272. ->whereIn('title', ['初级', '中级', '高级'])
  273. ->order("statement_all_num desc")
  274. ->select()
  275. ->toArray();//星级等级
  276. // 组装日志信息
  277. /** @var DividendLogEntity $dividendLogEntity */
  278. $dividendLogEntity = DividendLogEntity::newInstance();
  279. $dividendLogEntity->setType(DividendLogEnum::TYPE['PartnerProfit']['code'])
  280. ->setStartTime($startTime)
  281. ->setEndTime($endTime)
  282. ->setPerformance($performance)
  283. ->setAbatement(json_encode([['code' => 'redEnvelope', 'name' => '红包', 'reason' => '发放的红包金额,需要从赚取的业绩中扣除', 'number' => $redEnvelope]]))
  284. ->setAllocated($weekRecord)
  285. ->setRule(json_encode($starList))
  286. ->setIsTest($isTest)
  287. ->setRemark($remark);
  288. // 2、循环星级信息 并分组归类
  289. $salesArr = array_column($starList, null, 'title');
  290. // 3、获取 分红用户 信息 (`user_group` tinyint(1) DEFAULT '1' COMMENT '1消费者 2,推广业务员 3,业务经理 4初级合伙人5中级合伙人 6高级合伙人 7.懂事',)
  291. $list = Db::name("user")
  292. ->whereNotIn('uid', $removeUserIdList)
  293. ->where("user_group", "IN", [4, 5, 6])
  294. ->where("status", "<>", 0)
  295. ->where('is_del', '<>', 1)
  296. ->select()
  297. ->toArray();
  298. // 4、将用户装载到 星级等级 分红数据中
  299. foreach ($list as $key => $value) {
  300. if ($value['user_group'] == 4) {
  301. $salesArr['初级']['user_group'] = $value['user_group'];
  302. $salesArr['初级']['divider_people'][] = $value['uid'];
  303. } else if ($value['user_group'] == 5) {
  304. $salesArr['中级']['user_group'] = $value['user_group'];
  305. $salesArr['中级']['divider_people'][] = $value['uid'];
  306. } else if ($value['user_group'] == 6) {
  307. $salesArr['高级']['user_group'] = $value['user_group'];
  308. $salesArr['高级']['divider_people'][] = $value['uid'];
  309. }
  310. }
  311. $salesArr['初级']['divider_people_count'] = count($salesArr['初级']['divider_people']);
  312. $salesArr['中级']['divider_people_count'] = count($salesArr['中级']['divider_people']);
  313. $salesArr['高级']['divider_people_count'] = count($salesArr['高级']['divider_people']);
  314. // 5、移除特定人员
  315. // 要移动的ID数组
  316. // $ids_to_remove_from_junior = array(12, 69, 144); // 从初级中移除的ID
  317. // $ids_to_remove_from_intermediate = array(49); // 从中级中移除的ID
  318. // // 查找初级并获取其divider_people
  319. // $junior = &$salesArr['初级']['divider_people']; // 使用引用,以便直接修改数组
  320. // // 查找中级并获取其divider_people
  321. // $intermediate = &$salesArr['中级']['divider_people']; // 使用引用,以便直接修改数组
  322. // // 从初级的divider_people中移除特定的ID
  323. // foreach ($ids_to_remove_from_junior as $id) {
  324. // $key = array_search($id, $junior);
  325. // if ($key !== false) {
  326. // unset($junior[$key]); // 移除初级中的特定ID
  327. // }
  328. // }
  329. // // 从中级的divider_people中移除特定的ID
  330. // foreach ($ids_to_remove_from_intermediate as $id) {
  331. // $key = array_search($id, $intermediate);
  332. // if ($key !== false) {
  333. // unset($intermediate[$key]); // 移除中级中的特定ID
  334. // }
  335. // }
  336. // // 重置数组的索引,因为unset会留下空位
  337. // $salesArr['初级']['divider_people'] = array_values($junior);
  338. // $salesArr['中级']['divider_people'] = array_values($intermediate);
  339. // 获取查询合伙人 团队贡献值 最深的到哪一层
  340. $depth = Db::name("system_config_value")->where(["config_key" => "team_commission_recursion_depth"])->value("value");
  341. // 6、执行分开发放
  342. $partnerProfitsPvListByUid = [];
  343. foreach ($salesArr as $key => $value) {
  344. // 6.1 计算可分红金额
  345. //比如这个周的总业绩是 8400
  346. //周总业绩(8400) * 合伙人级别的分佣比例(15%) = 可分红的佣金(1260)
  347. // $salesArr[$key]['fs_money_nums'] = round($weekRecord * $value['profit_rate'], 2);
  348. $salesArr[$key]['fs_money_nums'] = floor(($weekRecord * ($value['profit_rate'] / 100)) * 100) / 100;
  349. // 日志表 记录应分配金额
  350. $dividendLogEntity->setExpected(bcadd($dividendLogEntity->getExpected() ?: '0.00', $salesArr[$key]['fs_money_nums'], 2));
  351. //可分红的业绩(分为两半,各50%,一部分是分给双联盟比例,一部分是小业绩比例)
  352. //把本周的业绩(8400) * 合伙人级别的分佣比例(15%) * 0.5 = 630(可分红佣金的 50%)
  353. // $salesArr[$key]['fs_money'] = round($salesArr[$key]['fs_money_nums'] / 2, 2);
  354. $salesArr[$key]['fs_money'] = floor(($salesArr[$key]['fs_money_nums'] / 2) * 100) / 100;
  355. // 6.2 计算所有人的 PV值
  356. $salesArr[$key]['weekRecord'] = $weekRecord;
  357. $salesArr[$key]['redEnvelope'] = $redEnvelope;
  358. $salesArr[$key]['maxValueAll'] = 0;
  359. $salesArr[$key]['sumOfOthersAll'] = 0;
  360. $salesArr[$key]['dividerPeoplePv'] = [];
  361. foreach ($value['divider_people'] as $k => $v) {
  362. // 6.2.1 查出分红人的所有部门 即 下级用户
  363. $spreadUserUidList = $this->getSpreadUserUidListByUidList([$v]);
  364. if (empty($spreadUserUidList[$v])) {
  365. continue;
  366. }
  367. // 6.2.2 获取当前分红人的所有部门 内的下级成员,递归获取至最低一级
  368. $subordinatesBatch = $this->getSubordinatesBatch($spreadUserUidList[$v]);
  369. // 6.2.3 获取所有部门(下线)的PV值
  370. foreach ($subordinatesBatch as $k1 => $v1) {
  371. $partnerProfitsPvListByUid[$v][$k1] = 0;
  372. // 获取当前下线的PV值, 忽略测试人员的账号
  373. $pv = $this->getPv(array_merge($v1, [$k1]), $removeUserIdList);
  374. $partnerProfitsPvListByUid[$v][$k1] += $pv;
  375. $pvNew = $this->getPvNew(array_merge($v1, [$k1]), $removeUserIdList);
  376. $partnerProfitsPvListByUid[$v][$k1] += $pvNew;
  377. }
  378. // 6.2.4 将PV值进行记录 以便后续计算
  379. if (!empty($partnerProfitsPvListByUid[$v])) {
  380. // 获取数组中的最大值
  381. $maxValue = max($partnerProfitsPvListByUid[$v]);
  382. // 计算总和
  383. $totalSum = array_sum($partnerProfitsPvListByUid[$v]);
  384. // 计算除最大值外其余值的和
  385. $sumOfOthers = $totalSum - $maxValue;
  386. $salesArr[$key]['dividerPeoplePv'][$v]['maxValue'] = $maxValue;
  387. $salesArr[$key]['dividerPeoplePv'][$v]['sumOfOthers'] = $sumOfOthers;
  388. $salesArr[$key]['maxValueAll'] += $maxValue;
  389. $salesArr[$key]['sumOfOthersAll'] += $sumOfOthers;
  390. }
  391. }
  392. }
  393. // 6、记录日志
  394. // 获取周期内所有符合条件的订单
  395. $orderUidMap = $this->getOrderUidListByTime($startTime, $endTime, $removeUserIdList);
  396. $feeUids = array_keys($orderUidMap);
  397. // 7、执行分红
  398. $testRecord = [];
  399. foreach ($salesArr as $key => $value) {
  400. $amount = $value['fs_money'];//可分红的总佣金,分红佣金的一半,中级合伙61.95
  401. $fsMoneyNums = $value['fs_money_nums'];//中级合伙人级别,可分红的总佣金
  402. $maxValueAll = $value['maxValueAll'];//当前级别合伙人下面所有的双联盟业绩
  403. $sumOfOthersAll = $value['sumOfOthersAll'];//当前级别合伙人下面所有的小区(业绩小的部分)总业绩
  404. if (count($value['divider_people']) <= 0) {
  405. continue;
  406. }
  407. //每人分红金额
  408. foreach ($value['divider_people'] as $v) {
  409. //个人小区(佣金少的一部分) 权重 计算权重
  410. //返回是数组,下标0是最小的值(业绩小的),下标1是最大的值(业绩大的)
  411. $userPvSmallNum = $value['dividerPeoplePv'][$v]['sumOfOthers'] ?? 0;
  412. // $myMixMoney = round($amount * ($userPvSmallNum / $sumOfOthersAll), 2);
  413. $myMixMoney = floor(($amount * (floor(($userPvSmallNum / $sumOfOthersAll) * 100000) / 100000)) * 100) / 100;
  414. //个人双区总佣金 权重 计算
  415. $myBill = $value['dividerPeoplePv'][$v]['maxValue'] ?? 0;
  416. //中级合伙人。userid=17可以分到双区可分红的金额
  417. //可分红的佣金 * (中级合伙人个人的双区总业绩 / 当前等级所有合伙人的双联盟业绩) = 当前用户可以获取到的分红佣金(双区联盟总业绩加权佣金),287742 * (61.95/431032)=41.36
  418. // $myWeightMoney = round($amount * ($myBill / $maxValueAll), 2);
  419. $myWeightMoney = floor(($amount * (floor((($myBill + $userPvSmallNum) / ($maxValueAll + $sumOfOthersAll)) * 100000) / 100000)) * 100) / 100;
  420. $salesArr[$key]['dividerPeoplePv'][$v]['myWeightMoney'] = $myWeightMoney;
  421. $salesArr[$key]['dividerPeoplePv'][$v]['myMixMoney'] = $myMixMoney;
  422. $salesArr[$key]['dividerPeoplePv'][$v]['maxValueAll'] = $maxValueAll;
  423. $salesArr[$key]['dividerPeoplePv'][$v]['sumOfOthersAll'] = $sumOfOthersAll;
  424. # code...
  425. $allAward = $myWeightMoney + $myMixMoney;
  426. //90%给佣金,10给复购金
  427. $yj_90 = floor($allAward * 0.9 * 100) / 100;
  428. $fg_10 = floor($allAward * 0.1 * 100) / 100;
  429. // $yj_90 = bcsub($yj_90, $user_bill_uid_list[$v]['number'] ?? 0.00, 2);
  430. //
  431. // $fg_10 = bcsub($fg_10, $user_sign_fugou_uid_list[$v]['number'] ?? 0.00, 2);
  432. //
  433. // if ($yj_90 < 0) {
  434. // $testRecord['yj_fushu'][] = ['uid' => $v, 'num' => floor($allAward * 0.9 * 100) / 100, 'exist' => $user_bill_uid_list[$v]['number'] ?? 0.00, 'yj' => $yj_90];
  435. // }
  436. // if ($fg_10 < 0) {
  437. // $testRecord['fg_fushu'][] = ['uid' => $v, 'num' => floor($allAward * 0.1 * 100) / 100, 'exist' => $user_sign_fugou_uid_list[$v]['number'] ?? 0.00, 'fg' => $fg_10];
  438. // }
  439. if (!in_array($v, $feeUids)) {
  440. $feeWaiverUids = $dividendLogEntity->getFeeWaiverUids() ?: [];
  441. $feeWaiverUids[] = [
  442. 'uid' => $v,
  443. 'remark' => '周期内未完成订单任务'
  444. ];
  445. $dividendLogEntity->setFeeWaiverUids($feeWaiverUids);
  446. continue;
  447. }
  448. $dividendLogEntity->setArrivalPoint(bcadd($dividendLogEntity->getArrivalPoint() ?: '0.00', $allAward, 2));
  449. $arrivalInfo = $dividendLogEntity->getArrivalInfo() ?: [];
  450. $arrivalInfo[$v]['allAward'] = $allAward;
  451. $arrivalInfo[$v]['orderInfo'] = $orderUidMap[$v];
  452. $dividendLogEntity->setArrivalInfo($arrivalInfo);
  453. if ($isTest == 0) {
  454. $userdatassss = db::name("old_user_jbp")->where("id", $v)->find();
  455. $datas_log = [
  456. 'note' => "名称:" . $userdatassss['nick_name'] . " 用户:" . $v . " 双联盟总业绩:" . $maxValueAll . " 我的双区业绩:" . $myBill . " 小区总业绩:" . $userPvSmallNum . " 我的业绩小的:" . $myMixMoney . " 可分红佣金:" . $amount . " 可分红总佣金:" . $fsMoneyNums . " 小区业绩可分红:" . $myMixMoney . " 双区业绩可分红:" . $myWeightMoney . " 实际分得:" . $yj_90,
  457. 'create_time' => date('Y-m-d H:i:s')
  458. ];
  459. Db::name('test_log')->insert($datas_log); //数据存到2.0数据表中
  460. # code...
  461. Db::name("user")->where("uid", $v)->inc("total_amount_old", $yj_90)->save();
  462. Db::name("user")->where("uid", $v)->inc("amount_old", $yj_90)->save();//不用冻结金额和提现额度来限制佣金发放
  463. Db::name("user")->where("uid", $v)->inc("brokerage_price", $yj_90)->save();
  464. Db::name("user")->where("uid", $v)->inc("fugou", $fg_10)->save();
  465. //if($res) {
  466. $this->change_user_log($v, 'amount_old', 1, $yj_90, "member_award", "星级分红入账" . "-" . $value['title']);//释放佣金
  467. // //入账星级分红记录表
  468. // $week_data = [];
  469. // $week_data['user_id'] = $v;
  470. // $week_data['user_star_id'] = $value['id'];
  471. // $week_data['award_num'] = $myWeightMoney;
  472. // $week_data['award_num_sm'] = $myMixMoney;
  473. // $week_data['remark'] = "星级分红主动执行:" . $yj_90;
  474. // $week_data['week_record'] = $weekRecord;
  475. // $week_data['all_amount'] = $fsMoneyNums;
  476. // $week_data['radio'] = 2;
  477. // $week_data['owner_bill'] = $maxValueAll; //总流水金额
  478. // $week_data['my_bill'] = $myBill; //我的流水
  479. // $week_data['create_time'] = time();
  480. // Db::name("old_user_weekaward")->insert($week_data);
  481. // 入账记录
  482. $week_data = [];
  483. $week_data['user_id'] = $v;
  484. $week_data['user_group'] = $value['user_group'];
  485. $week_data['start_time'] = $startTime;
  486. $week_data['end_time'] = $endTime;
  487. $week_data['performance'] = $performance;
  488. $week_data['red_envelope'] = $redEnvelope;
  489. $week_data['reality_performance'] = $weekRecord;
  490. $week_data['dividend_ratio'] = $value['profit_rate'];
  491. $week_data['dividend'] = $fsMoneyNums;
  492. $week_data['performance_part'] = $userPvSmallNum;
  493. $week_data['performance_part_all'] = $sumOfOthersAll;
  494. $week_data['part_money'] = $myMixMoney;
  495. $week_data['performance_total'] = ($myBill + $userPvSmallNum);
  496. $week_data['performance_total_all'] = ($maxValueAll + $sumOfOthersAll);
  497. $week_data['total_money'] = $myWeightMoney;
  498. $week_data['brokerage'] = $yj_90;
  499. $week_data['fugou'] = $fg_10;
  500. $week_data['radio'] = 2;
  501. $week_data['create_time'] = date('Y-m-d H:i:s');
  502. Db::name("partner_profit_records")->insert($week_data);
  503. $this->bill_user_log111111($v, "合伙人分佣", $yj_90, "合伙人分佣明细入账", 11);//联创分佣明细2.0系统
  504. $this->fugou_user_log($v, $fg_10, 16, 1, 1);//复购金明细入账
  505. }
  506. }
  507. $salesArr['cs'] = $testRecord;
  508. }
  509. $dividendLogEntity->setResult(json_encode($salesArr, JSON_UNESCAPED_UNICODE));
  510. /** @var DividendLogRepository $dividendLogRepository */
  511. $dividendLogRepository = app()->make(DividendLogRepository::class);
  512. $dividendLogRepository->createByEntity($dividendLogEntity);
  513. return app('json')->success($salesArr);
  514. }
  515. /**
  516. * 获取该会员的所有下级会员
  517. */
  518. public function getSpreadUserUidListByUidList(array $uidList)
  519. {
  520. $son_ids = Db::name("user")
  521. ->whereIn("level_id", $uidList)
  522. ->field("uid,level_id")
  523. ->select()
  524. ->toArray();
  525. $new_array_ids = [];
  526. foreach ($son_ids as $key => $value) {
  527. $new_array_ids[$value['level_id']][] = $value['uid'];
  528. }
  529. return $new_array_ids;
  530. }
  531. /**
  532. * 递归查询下级用户并分组
  533. *
  534. * @param array $uids 初始用户ID数组
  535. * @return array 分组后的下级用户ID数组
  536. */
  537. public function getSubordinates(array $uids): array
  538. {
  539. $result = [];
  540. foreach ($uids as $uid) {
  541. $result[$uid] = $this->getSubordinatesRecursively($uid);
  542. }
  543. return $result;
  544. }
  545. /**
  546. * 获取该会员的所有下级会员
  547. */
  548. public function getSpreadUserUidAccountListByUidList($uid, $account = '')
  549. {
  550. $son_ids = Db::name("user")
  551. ->where("level_id", $uid)
  552. ->field("uid,level_id,account")
  553. ->select()
  554. ->toArray();
  555. $new_array_ids = [];
  556. foreach ($son_ids as $key => $value) {
  557. $childList = $this->getSpreadUserUidAccountListByUidList($value['uid'], $value['account']);
  558. $new_array_ids[] = [
  559. '当前用户ID' => $value['uid'],
  560. '当前用户的上级用户ID' => $value['level_id'],
  561. '用户账号(手机号)' => $value['account'],
  562. '当前用户的下级用户列表' => $childList
  563. ];
  564. }
  565. return $new_array_ids;
  566. }
  567. /**
  568. * 递归查询单个用户的下级用户
  569. *
  570. * @param int $uid 用户ID
  571. * @param array $subordinates 用于存储下级用户ID的数组(内部使用, 递归传递)
  572. * @return array 下级用户ID数组
  573. */
  574. private function getSubordinatesRecursively(int $uid, array &$subordinates = []): array
  575. {
  576. $subUidList = Db::name("user")
  577. ->where("level_id", $uid) // 直接使用 $uid, 不需要 whereIn
  578. ->field("uid") //只需要查询uid
  579. ->select()
  580. ->toArray();
  581. if (!empty($subUidList)) {
  582. foreach ($subUidList as $subUser) {
  583. $subUid = $subUser['uid'];
  584. $subordinates[] = $subUid; // 添加到下级用户数组
  585. $this->getSubordinatesRecursively($subUid, $subordinates); // 递归查询下级的下级
  586. }
  587. }
  588. return $subordinates;
  589. }
  590. /**
  591. * 递归获取所有下级ID(不分组)
  592. * @param int $uid
  593. * @param array $allSubordinates
  594. * @return array
  595. */
  596. public function getAllSubordinates(int $uid, array &$allSubordinates = []): array
  597. {
  598. $subUidList = Db::name("user")
  599. ->where("level_id", $uid)
  600. ->column("uid"); // 使用 column 方法直接获取 uid 数组
  601. if (!empty($subUidList)) {
  602. foreach ($subUidList as $subUid) {
  603. $allSubordinates[] = $subUid;
  604. $this->getAllSubordinates($subUid, $allSubordinates);
  605. }
  606. }
  607. return $allSubordinates;
  608. }
  609. /**
  610. * 更高效的获取所有下级 (使用循环代替递归, 避免栈溢出)
  611. * @param array $uids
  612. * @return array
  613. */
  614. public function getAllSubordinatesIterative(array $uids): array
  615. {
  616. $result = [];
  617. foreach ($uids as $uid) {
  618. $result[$uid] = [];
  619. $queue = [$uid]; // 使用队列来存储待处理的 UID
  620. $processed = []; // 记录已经处理过的
  621. while (!empty($queue)) {
  622. $currentUid = array_shift($queue); // 从队列头部取出 UID
  623. if (in_array($currentUid, $processed)) {
  624. continue; // 已经处理过
  625. }
  626. $processed[] = $currentUid;
  627. $subUidList = Db::name("user")
  628. ->where("level_id", $currentUid)
  629. ->column("uid");
  630. if (!empty($subUidList)) {
  631. $result[$uid] = array_merge($result[$uid], $subUidList); //合并
  632. $queue = array_merge($queue, $subUidList); // 将新找到的下级 UID 加入队列尾部
  633. }
  634. }
  635. $result[$uid] = array_unique($result[$uid]);//去重
  636. }
  637. return $result;
  638. }
  639. /**
  640. * 获取多个用户的所有下级, 返回分组后的数组. (更高效, 使用循环, 减少数据库查询次数)
  641. * @param array $uids
  642. * @return array 形如 ['A1' => [A11, A12, ...], 'A2' => [...]]
  643. */
  644. public function getSubordinatesBatch(array $uids): array
  645. {
  646. $result = [];
  647. $allSubordinates = [];
  648. $queue = $uids;
  649. $processed = [];
  650. //1. 找出所有的下级ID (不去重)
  651. while (!empty($queue)) {
  652. $currentUids = array_splice($queue, 0, 500); // 一次最多处理500个,防止in太多. 可以根据实际情况调整.
  653. $currentUids = array_diff($currentUids, $processed); //去除已经查询过的
  654. if (empty($currentUids)) continue; //没有新的需要处理的
  655. $processed = array_merge($processed, $currentUids);//记录
  656. $subUidList = Db::name("user")
  657. ->whereIn("level_id", $currentUids)
  658. ->field("uid,level_id") // 需要查询 level_id 用于后续分组
  659. ->select()
  660. ->toArray();
  661. if (!empty($subUidList)) {
  662. $allSubordinates = array_merge($allSubordinates, $subUidList); //所有下级
  663. $nextLevelUids = array_column($subUidList, 'uid');
  664. $queue = array_merge($queue, $nextLevelUids); //放到队列中
  665. }
  666. }
  667. //2. 分组
  668. foreach ($uids as $uid) {
  669. $result[$uid] = []; // 初始化每个用户的下级数组
  670. }
  671. $allSubordinatesMap = [];
  672. foreach ($allSubordinates as $item) {
  673. $allSubordinatesMap[$item['level_id']][] = $item['uid'];
  674. }
  675. //3. 递归的将查到的下级进行分组
  676. $group = function ($spreadUid) use (&$group, &$allSubordinatesMap, &$result) {
  677. if (isset($allSubordinatesMap[$spreadUid])) {
  678. foreach ($allSubordinatesMap[$spreadUid] as $subUid) {
  679. if (isset($result[$spreadUid])) {
  680. $result[$spreadUid][] = $subUid; //直接添加到结果中
  681. } else { //不属于直接上级, 查找上级的上级
  682. foreach ($result as $rootUid => &$subordinates) {
  683. if (in_array($spreadUid, $subordinates) || $rootUid == $spreadUid) {
  684. $subordinates[] = $subUid;
  685. break;
  686. }
  687. }
  688. }
  689. $group($subUid); //递归下一层
  690. }
  691. }
  692. };
  693. foreach ($uids as $uid) {
  694. $group($uid);
  695. }
  696. // 4. 去重 (如果需要)
  697. foreach ($result as $key => $value) {
  698. $result[$key] = array_values(array_unique($value));
  699. }
  700. return $result;
  701. }
  702. // 获取用户PV值
  703. public function getPv($userIdList, $removeUserIdList = [])
  704. {
  705. if (!empty($removeUserIdList)) {
  706. $userIdList = array_values(array_diff($userIdList, $removeUserIdList));
  707. }
  708. // 基础查询构建器
  709. $user_team_amount = Db::name("old_user_of_goods")
  710. ->whereIn("user_id", $userIdList)
  711. ->where('status', 1)
  712. ->where('money', 1180)
  713. ->select();
  714. //$money1180Records = $this->old_user_of_goods->where('status', 1)->where('money', 1180)->select();
  715. // 计算 status 为 1 且 money 为 1180 的记录总和(减去相应值后)
  716. $money1180Sum = 0;
  717. foreach ($user_team_amount as $record) {
  718. $money1180Sum += $record['money'] - 300 - 180;
  719. }
  720. // 获取 status 为 1 且 money 为 11800 的记录集合
  721. $money11800Records = Db::name("old_user_of_goods")
  722. ->whereIn("user_id", $userIdList)
  723. ->where('status', 1)
  724. ->where('money', 11800)
  725. ->select();
  726. // 计算 status 为 1 且 money 为 11800 的记录总和(减去相应值后)
  727. $money11800Sum = 0;
  728. foreach ($money11800Records as $record) {
  729. $money11800Sum += $record['money'] - 3000 - 1800;
  730. }
  731. $money10620Records = Db::name("old_user_of_goods")
  732. ->whereIn("user_id", $userIdList)
  733. ->where('status', 1)
  734. ->where('money', 10620)
  735. ->select();
  736. // 计算 status 为 1 且 money 为 10620 的记录总和(减去相应值后)
  737. $money10620Sum = 0;
  738. foreach ($money10620Records as $record) {
  739. $money10620Sum += $record['money'] - 2700 - 1620;
  740. }
  741. $money9440Records = Db::name("old_user_of_goods")
  742. ->whereIn("user_id", $userIdList)
  743. ->where('status', 1)
  744. ->where('money', 9440)
  745. ->select();
  746. // 计算 status 为 1 且 money 为 9440 的记录总和(减去相应值后)
  747. $money9440Sum = 0;
  748. foreach ($money9440Records as $record) {
  749. $money9440Sum += $record['money'] - 2400 - 1440;
  750. }
  751. $money2360Records = Db::name("old_user_of_goods")
  752. ->whereIn("user_id", $userIdList)
  753. ->where('status', 1)
  754. ->where('money', 2360)
  755. ->select();
  756. // 计算 status 为 1 且 money 为 2360 的记录总和(减去相应值后)
  757. $money2360Sum = 0;
  758. foreach ($money2360Records as $record) {
  759. $money2360Sum += $record['money'] - 600 - 360;
  760. }
  761. // 计算除去特定值后的总和
  762. $otherMoneyRecords = [];
  763. // $otherMoneyRecords = Db::name("old_user_of_goods")
  764. // ->whereIn("user_id", $userIdList)
  765. // ->whereNotIn('money', [1180, 11800, 10620, 9440, 2360])
  766. // ->select();
  767. $otherMoneySum = 0;
  768. foreach ($otherMoneyRecords as $record) {
  769. $otherMoneySum += $record['money'];
  770. }
  771. return $money1180Sum + $money11800Sum + $money10620Sum + $money9440Sum + $money2360Sum + (floor($otherMoneySum * 70) / 100);
  772. }
  773. // 获取用户PV值
  774. public function getPvNew($userIdList, $removeUserIdList = [])
  775. {
  776. if (!empty($removeUserIdList)) {
  777. $userIdList = array_values(array_diff($userIdList, $removeUserIdList));
  778. }
  779. // 查询指定时间区间内的所有订单,并排除 pay_time 为 NULL 的订单
  780. $orders = Db::name("store_order")
  781. ->where('mer_id', 496)
  782. ->whereIn('uid', $userIdList)
  783. ->whereIn('status', [0, 1, 2, 3]) // TODO 之前橙汁先生 这么定义的,感觉有问题,也就是现在 会员专区 下单 不允许退款,不然肯定有问题 注意调整
  784. ->whereIn("total_price", [1180, 11800, 10620, 2360, 9440, 5900])
  785. ->whereNotNull("pay_time") // 排除 pay_time 为 NULL 的订单
  786. ->select();
  787. // 计算总业绩
  788. $totalPv = 0;
  789. foreach ($orders as $order) {
  790. switch ($order['total_price']) {
  791. case 1180:
  792. $totalPv += 700;
  793. break;
  794. case 11800:
  795. $totalPv += 7000;
  796. break;
  797. case 10620:
  798. $totalPv += 6300;
  799. break;
  800. case 2360:
  801. $totalPv += 1400;
  802. break;
  803. case 9440:
  804. $totalPv += 5600;
  805. break;
  806. case 5900:
  807. $totalPv += 3500;
  808. break;
  809. }
  810. }
  811. return $totalPv;
  812. }
  813. //发放佣金 示例: $this->change_user_log($v,'amount',1,$all_award,"member_award","星级分红入账"."-".$value['title']);//释放佣金
  814. function change_user_log($user_id, $type, $change_status, $money, $routine, $remark = "", $is_admin = 1, $appoint_money = 0)
  815. {
  816. $transition = [
  817. 'pv' => 1,
  818. "gb" => 2,
  819. "df" => 3,
  820. "vr" => 4,
  821. "bt" => 5,
  822. "withdraw_quota_old" => 6,//提现
  823. "unsettled_pension" => 7,
  824. "amount_old" => 8//发放佣金
  825. ];
  826. $routineInfo = Db::name("old_routine_log_of_key")->where("key", $routine)->find();
  827. if (empty($routineInfo)) {
  828. return false;
  829. }
  830. $key_id = isset($routineInfo['id']) ? $routineInfo['id'] : 0;
  831. if ($appoint_money > 0) {
  832. $alter_money = $appoint_money;
  833. } else {
  834. //再去查询变更前的 金额
  835. $alter_money = Db::name("user")->where('uid', $user_id)->value($type);
  836. }
  837. if ($change_status == 1) {
  838. //新增前
  839. $alter_money = $alter_money - $money;
  840. } else if ($change_status == 2) {
  841. //减少前
  842. $alter_money = $alter_money + $money;
  843. }
  844. if ($alter_money < 0) {
  845. $alter_money = 0;
  846. }
  847. $inser_data = [];
  848. $inser_data['user_id'] = $user_id;
  849. $inser_data['type'] = $transition[$type];
  850. $inser_data['change_status'] = $change_status;
  851. $inser_data['money'] = $money;
  852. $inser_data['routine_log_of_key_id'] = $key_id;
  853. $inser_data['remark'] = $remark;
  854. $inser_data['is_admin'] = $is_admin;
  855. $inser_data['create_time'] = time();
  856. $inser_data['alter_money'] = isset($alter_money) ? $alter_money : 0;
  857. Db::name("old_user_log")->insert($inser_data);
  858. }
  859. //添加平台分佣2.0系统收益明细日志(养老金金额)
  860. public function bill_user_log111111($uid, $name, $num, $mark, $comm)
  861. {
  862. $con_data = Db::name('user')->where("uid", $uid)->find();
  863. //如果是会员专区就即刻到账
  864. // Db::name('user')->where("uid",$con_data['uid'])->update(['brokerage_price'=> $con_data['brokerage_price'] + $num]);
  865. $bill = [
  866. 'uid' => $uid,
  867. 'link_id' => 0,//关联订单id
  868. 'pm' => 1,//0:支出,1:获得
  869. 'title' => $name,//账单标题
  870. 'category' => 'now_money',//明细种类
  871. 'type' => 'commission',//明细类型
  872. 'number' => $num,//明细数字
  873. 'balance' => 0,//剩余
  874. 'mark' => $mark,//备注
  875. 'create_time' => date('Y-m-d H:i:s'),//添加时间
  876. 'status' => 1,//0待确定,1有效,-1无效
  877. 'commission_type' => $comm,//佣金类型 1代理费 2 消费佣金 3直推奖√ 4辖区佣金\r\n5 养老金√ 6 广告费
  878. //7 跨店奖励√ 8平台奖励 9渠道商\r\n10 推荐创客收益√ 11分红奖金√ 12代理区域收益√ 13消费循环佣金
  879. //14-推荐代理收益√ 15邀请小区团长升级√ 16大v分享奖√ 17创客合伙人√ 18积分奖励√ 19创客补贴√’
  880. 'order_sn' => 0,//订单号
  881. 'tripartite' => 0,//
  882. 'type_shop' => 0,//0平台1多多进宝2唯品会3苏宁易购4网易考拉5淘宝客6京东联盟7饿了么8线上
  883. 'mer_id' => 0,//商户id
  884. 'source' => 0,//1线下 0线上
  885. 'order_type' => 1,//1自营 2 第三方 订单类型
  886. 'is_red_brokerage' => 0,//1红积分对冲佣金 0正常佣金
  887. 'gzc' => 3,//养老金是否已进入公证处log表0:未进入。1:已进入
  888. 'take_time' => time(),//结算时间
  889. 'district_id' => '',//
  890. 'street_id' => '',//
  891. 'month' => '',//月份
  892. ];
  893. Db::name('user_bill')->insert($bill);
  894. }
  895. //添加复购金
  896. public function fugou_user_log($uid, $num, $order_id, $type_inc_des, $status = -1)
  897. {
  898. $fugou_data = Db::name('user')->where("uid", $uid)->find();
  899. $bill = [
  900. 'uid' => $uid,
  901. 'number' => $num,//数量
  902. 'status' => $status,//复购金状态1-有效 0-失效 -1待确认
  903. 'mark' => "复购金",//备注
  904. 'desc' => "10%复购金",//描述
  905. 'order_id' => $order_id,//订单id
  906. 'surplus' => 0,//剩余
  907. 'order_type' => 11,//关联订单ID
  908. 'type' => $type_inc_des,//复购金类型 :1赠送,2消耗
  909. 'settlement_time' => date('Y-m-d H:i:s'),//添加时间,
  910. 'addtime' => time(),
  911. ];
  912. Db::name('user_sign_fugou')->insert($bill);
  913. }
  914. }