AgentSupplierOrder.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498
  1. <?php
  2. namespace addons\Agent\common\models;
  3. use addons\Course\common\models\AddonsCourseOrders;
  4. use addons\Store\common\models\StoreCashierOrder;
  5. use addons\Store\common\models\StoreOrder;
  6. use addons\Store\common\models\StoreOrderDetail;
  7. use common\components\export\CsvTool;
  8. use common\enums\DownloadEnum;
  9. use common\enums\RedisKeyEnum;
  10. use common\enums\StatusEnum;
  11. use common\models\base\BaseActiveRecord;
  12. use common\models\common\CapitalLog;
  13. use common\models\common\Download;
  14. use common\models\order\Order;
  15. use common\models\order\OrderDetail;
  16. use common\models\user\User;
  17. /**
  18. * This is the model class for table "qimall_addons_agent_supplier_order".
  19. *
  20. * @property int $id
  21. * @property int $mall_id
  22. * @property int $buy_user_id 买家id
  23. * @property int $buy_level 买家身份
  24. * @property int $seller_user_id 卖家id
  25. * @property int $seller_level 卖家身份
  26. * @property string $order_no 会员订单号
  27. * @property string $supplier_order_no 供应商订单号
  28. * @property int $goods_nums 商品数量
  29. * @property int $stock_nums 库存加减
  30. * @property float $payment_amount 货款金额
  31. * @property float $profit 利润
  32. * @property int $pay_time 订单支付时间
  33. * @property int $created_at 添加时间戳
  34. * @property int $updated_at 更新时间戳
  35. */
  36. class AgentSupplierOrder extends BaseActiveRecord
  37. {
  38. /**
  39. * 生成旧数据的缓存key
  40. */
  41. const OLD_DATA_GENERATE_ = 'agent_supplier_order_old_data_generate';
  42. /**
  43. * {@inheritdoc}
  44. */
  45. public static function tableName()
  46. {
  47. return '{{%addons_agent_supplier_order}}';
  48. }
  49. /**
  50. * {@inheritdoc}
  51. */
  52. public function rules()
  53. {
  54. return [
  55. [['mall_id', 'buy_user_id', 'buy_level', 'seller_user_id', 'seller_level', 'goods_nums', 'stock_nums', 'pay_time', 'created_at', 'updated_at', 'status'], 'integer'],
  56. [['payment_amount', 'profit'], 'number'],
  57. [['order_no', 'supplier_order_no'], 'string', 'max' => 100],
  58. ];
  59. }
  60. /**
  61. * {@inheritdoc}
  62. */
  63. public function attributeLabels()
  64. {
  65. return [
  66. 'id' => 'ID',
  67. 'mall_id' => 'Mall ID',
  68. 'buy_user_id' => '买家id',
  69. 'buy_level' => '买家身份',
  70. 'seller_user_id' => '卖家id',
  71. 'seller_level' => '卖家身份',
  72. 'order_no' => '会员订单号',
  73. 'supplier_order_no' => '供应商订单号',
  74. 'goods_nums' => '商品数量',
  75. 'stock_nums' => '库存加减',
  76. 'payment_amount' => '货款金额',
  77. 'profit' => '利润',
  78. 'pay_time' => '订单支付时间',
  79. 'created_at' => '添加时间戳',
  80. 'updated_at' => '更新时间戳',
  81. ];
  82. }
  83. /**
  84. * 可供导出供应商订单的字段
  85. * @Author:hua
  86. * @Date:2024-02-22 18:02
  87. * @Copyright:copyright(c)2024 广东七件事集团
  88. * @return string[]
  89. */
  90. public static function exportFieldsList()
  91. {
  92. return [
  93. 'buy_user_id' => '买家id',
  94. 'buy_nickname' => '买家昵称',
  95. 'buy_level' => '买家身份',
  96. 'seller_user_id' => '卖家id',
  97. 'seller_nickname' => '卖家昵称',
  98. 'seller_level' => '卖家身份',
  99. 'order_no' => '会员订单号',
  100. 'supplier_order_no' => '供应商订单号',
  101. 'goods_nums' => '商品数量',
  102. 'stock_nums' => '库存加减',
  103. 'order_status' => '发货状态',
  104. 'payment_amount' => '货款金额',
  105. 'profit' => '利润',
  106. 'pay_time' => '订单时间',
  107. ];
  108. }
  109. public function getBuyUser()
  110. {
  111. return $this->hasOne(User::class, ['id' => 'buy_user_id']);
  112. }
  113. public function getSellerUser()
  114. {
  115. return $this->hasOne(User::class, ['id' => 'seller_user_id']);
  116. }
  117. /**
  118. * 设置单条数据
  119. * @Author:hua
  120. * @Date:2024-02-23 15:09
  121. * @Copyright:copyright(c)2024 广东七件事集团
  122. * @param $params
  123. * @return self|bool
  124. */
  125. public static function setData($params, bool $returnBool = true)
  126. {
  127. $model = AgentSupplierOrder::find()->where(['seller_user_id' => $params['seller_user_id'], 'order_no' => $params['order_no'], 'status' => StatusEnum::ENABLED])->one();
  128. if (empty($model)) {
  129. $model = new AgentSupplierOrder();
  130. $model->mall_id = $params['mall_id'];
  131. $model->buy_user_id = $params['buy_user_id'];
  132. $model->buy_level = $params['buy_level'];
  133. $model->seller_user_id = $params['seller_user_id'];
  134. $model->seller_level = $params['seller_level'];
  135. $model->order_no = $params['order_no'];
  136. $model->supplier_order_no = Order::generateOrderNo('G');
  137. $model->pay_time = $params['pay_time'];
  138. }
  139. $model->payment_amount += $params['payment_amount'];
  140. $model->profit += $params['money'];
  141. $model->goods_nums += $params['goods_nums'];
  142. $model->stock_nums += $params['stock_nums'];
  143. $res = $model->save();
  144. if ($returnBool) {
  145. return $res;
  146. }
  147. return $model;
  148. }
  149. /**
  150. * 添加分佣记录数据
  151. * @Author:hua
  152. * @Date:2024-02-23 09:54
  153. * @Copyright:copyright(c)2024 广东七件事集团
  154. * @param $params
  155. * @return void
  156. */
  157. public static function insertData($params)
  158. {
  159. $insert_wallet = $params['insert_wallet'];
  160. $order_no = $params['order_no'];
  161. $agent_list = $params['agent_list'];
  162. $order = Order::findOne(['order_no' => $order_no]);
  163. $supplierCommissionInsertData = [];
  164. foreach ($insert_wallet as $key => $item) {
  165. $params['money'] = $item['money'];
  166. $params['mall_id'] = $item['mall_id'];
  167. $params['seller_user_id'] = $item['user_id'];
  168. $params['seller_level'] = $agent_list[$item['user_id']]['level'] ?? 0;
  169. $params['supplier_order_no'] = Order::generateOrderNo('G');
  170. $params['pay_time'] = $order['pay_time'];
  171. $params['stock_nums'] = $params['goods_nums'];
  172. $saveModel = self::setData($params, false);
  173. // 写入供应商佣金
  174. foreach ($saveModel as $field => $value) {
  175. $supplierCommissionInsertData[$key][$field] = $value;
  176. }
  177. $supplierCommissionInsertData[$key]['seller_level'] = $agent_list[$item['user_id']]['level'] ?? $params['seller_level'];
  178. $supplierCommissionInsertData[$key]['payment_amount'] = $params['payment_amount'];
  179. $supplierCommissionInsertData[$key]['profit'] = $item['money'];
  180. $supplierCommissionInsertData[$key]['goods_nums'] = $params['goods_nums'];
  181. $supplierCommissionInsertData[$key]['stock_nums'] = $params['stock_nums'];
  182. $supplierCommissionInsertData[$key]['capital_type'] = $item['capital_type'];
  183. $supplierCommissionInsertData[$key]['source_table'] = $item['source_table'];
  184. $supplierCommissionInsertData[$key]['source_table_id'] = $item['source_table_id'];
  185. }
  186. AgentSupplierCommission::insertData($supplierCommissionInsertData);
  187. }
  188. /**
  189. * 旧数据生成
  190. * @Author:hua
  191. * @Date:2024-02-23 15:44
  192. * @Copyright:copyright(c)2024 广东七件事集团
  193. * @param $params
  194. * @return bool|void
  195. */
  196. public static function oldDataGenerate($params)
  197. {
  198. $mall_id = $params['mall_id'];
  199. $cache_key = RedisKeyEnum::suffix(self::OLD_DATA_GENERATE_, $mall_id);
  200. $cache = \Yii::$app->cache;
  201. $cache_data = $cache->get($cache_key);
  202. if (!empty($cache_data)) return true;
  203. $wallet_type = 'commission';
  204. $i = 1;
  205. $page_size = 1000;
  206. while (true) {
  207. CapitalLog::$capitalType = $wallet_type;
  208. $list = CapitalLog::find()->where(['mall_id' => $mall_id, 'from_type' => 'Agent'])
  209. ->offset(($i - 1) * $page_size)->limit($page_size)->all();
  210. if (empty($list)) break;
  211. self::saveData($list);
  212. $i++;
  213. }
  214. $i = 1;
  215. $page_size = 1000;
  216. $wallet_type = 'commission_frozen';
  217. while (true) {
  218. CapitalLog::$capitalType = $wallet_type;
  219. $list = CapitalLog::find()->where(['mall_id' => $mall_id, 'from_type' => 'Agent', 'status' => StatusEnum::DISABLED])
  220. ->offset(($i - 1) * $page_size)->limit($page_size)->all();
  221. if (empty($list)) break;
  222. self::saveData($list);
  223. $i++;
  224. }
  225. $cache->set($cache_key, 1);
  226. }
  227. /**
  228. * 保存列表数据
  229. * @Author:hua
  230. * @Date:2024-02-23 15:08
  231. * @Copyright:copyright(c)2024 广东七件事集团
  232. * @param $list
  233. * @return void
  234. */
  235. public static function saveData($list)
  236. {
  237. foreach ($list as $item) {
  238. list($payment_amount, $goods_nums, $buy_user_id, $buy_user_level, $seller_level, $order_no, $pay_time) = self::formatData($item);
  239. if (empty($order_no)) continue;
  240. $params['mall_id'] = $item['mall_id'];
  241. $params['buy_user_id'] = $buy_user_id;
  242. $params['buy_level'] = $buy_user_level;
  243. $params['seller_user_id'] = $item['user_id'];
  244. $params['seller_level'] = $seller_level;
  245. $params['order_no'] = $order_no;
  246. $params['supplier_order_no'] = Order::generateOrderNo('G');
  247. $params['pay_time'] = $pay_time;
  248. $params['payment_amount'] = $payment_amount;
  249. $params['money'] = $item['change_num'];
  250. $params['goods_nums'] = $goods_nums;
  251. $params['stock_nums'] = $goods_nums;
  252. self::setData($params);
  253. }
  254. }
  255. /**
  256. * 格式化数据
  257. * @Author:hua
  258. * @Date:2024-02-23 15:07
  259. * @Copyright:copyright(c)2024 广东七件事集团
  260. * @param $item
  261. * @return array
  262. */
  263. public static function formatData($item)
  264. {
  265. $payment_amount = 0;
  266. $goods_nums = 0;
  267. $buy_user_id = 0;
  268. $buy_user_level = 0;
  269. $seller_level = 0;
  270. $order_no = '';
  271. $pay_time = '';
  272. switch ($item['source_table']) {
  273. case 'order_detail':
  274. $order_detail = OrderDetail::findOne(['id' => $item['source_table_id']]);
  275. if ($order_detail) {
  276. $order = Order::findOne(['id' => $order_detail['order_id']]);
  277. if ($order) {
  278. $order_no = $order['order_no'];
  279. $pay_time = $order['pay_time'];
  280. $buy_user_id = $order['user_id'];
  281. }
  282. $goods_nums = $order_detail['num'];
  283. $payment_amount = $order_detail['goods_price'];
  284. }
  285. break;
  286. case 'store_cashier_order':
  287. $store_cashier_order = StoreCashierOrder::findOne(['id' => $item['source_table_id']]);
  288. if ($store_cashier_order) {
  289. $order_no = $store_cashier_order['order_no'];
  290. $pay_time = $store_cashier_order['pay_time'];
  291. $buy_user_id = $store_cashier_order['user_id'];
  292. $payment_amount = $store_cashier_order['pay_money'];
  293. }
  294. $goods_nums = 1;
  295. break;
  296. case 'store_order_detail':
  297. $store_order_detail = StoreOrderDetail::findOne(['id' => $item['source_table_id']]);
  298. if ($store_order_detail) {
  299. $store_order = StoreOrder::findOne(['id' => $store_order_detail['order_id']]);
  300. if ($store_order) {
  301. $order_no = $store_order['order_no'];
  302. $pay_time = $store_order['pay_time'];
  303. $buy_user_id = $store_order['user_id'];
  304. }
  305. $payment_amount = $store_order_detail['goods_price'];
  306. }
  307. $goods_nums = $store_order_detail['num'];
  308. break;
  309. case '{{%addons_agent_team_achievement}}':
  310. break;
  311. case '{{%addons_course_orders}}':
  312. $course_order = AddonsCourseOrders::findOne(['id' => $item['source_table_id']]);
  313. if ($course_order) {
  314. $order_no = $course_order['order_no'];
  315. $pay_time = $course_order['pay_time'];
  316. $buy_user_id = $course_order['user_id'];
  317. $goods_nums = 1;
  318. $payment_amount = $course_order['pay_money'];
  319. }
  320. break;
  321. case '{{%order}}':
  322. $order = Order::findOne(['id' => $item['source_table_id']]);
  323. if ($order) {
  324. $num = OrderDetail::find()->where(['order_id' => $order['id']])->sum('num');
  325. $goods_price = OrderDetail::find()->where(['order_id' => $order['id']])->sum('goods_price');
  326. if (!empty($num)) $goods_nums = $num;
  327. if (!empty($goods_price)) $payment_amount = $goods_price;
  328. $order_no = $order['order_no'];
  329. $pay_time = $order['pay_time'];
  330. $buy_user_id = $order['user_id'];
  331. }
  332. break;
  333. }
  334. $agent_arr = Agent::find()->where(['mall_id' => $item['mall_id'], 'user_id' => [$buy_user_id, $item['user_id']], 'status' => StatusEnum::ENABLED])
  335. ->indexBy('user_id')->all();
  336. if (isset($agent_arr[$buy_user_id])) $buy_user_level = $agent_arr[$buy_user_id]['level'];
  337. if (isset($agent_arr[$item['user_id']])) $seller_level = $agent_arr[$item['user_id']]['level'];
  338. return [$payment_amount, $goods_nums, $buy_user_id, $buy_user_level, $seller_level, $order_no, $pay_time];
  339. }
  340. /**
  341. * 导出供应商订单
  342. * @Author:hua
  343. * @Date:2024-02-22 18:27
  344. * @Copyright:copyright(c)2024 广东七件事集团
  345. * @param $data
  346. * @return bool|void
  347. */
  348. public static function exportHandle($data)
  349. {
  350. $download_id = $data['download_id'] ?? 0;
  351. $download = Download::findOne(['id' => $download_id]);
  352. if ($download) {
  353. try {
  354. $params = json_decode($download->params, true);
  355. $filename = $download->name;
  356. $type = $download->type;
  357. $fields = $params['fields'];
  358. $fields_arr = self::exportFieldsList();
  359. $have_select_field_arr = [];
  360. foreach ($fields as $value) {
  361. $have_select_field_arr[] = $fields_arr[$value];
  362. }
  363. $csv = new CsvTool();
  364. $csv->filename = $filename;
  365. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  366. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  367. $csv->header = $have_select_field_arr;
  368. $model = self::find();
  369. $model->where(['mall_id' => $params['mall_id']]);
  370. //拼接查询条件
  371. if (!empty($params['order_no'])) $model->andWhere(['=', 'order_no', $params['order_no']]);
  372. if (!empty($params['keyword'])) {
  373. $condition['where'] = [[
  374. 'or',
  375. ['=', 'id', $params['keyword']],
  376. ['like', 'username', $params['keyword']],
  377. ['like', 'nickname', $params['keyword']],
  378. ['like', 'mobile', $params['keyword']]
  379. ]];
  380. $user_list = User::lists($condition);
  381. $user_id_arr = array_column($user_list, 'id');
  382. $model->andWhere(['in', 'buy_user_id', $user_id_arr]);
  383. }
  384. if (!empty($params['seller_keyword'])) {
  385. $condition['where'] = [[
  386. 'or',
  387. ['=', 'id', $params['seller_keyword']],
  388. ['like', 'username', $params['seller_keyword']],
  389. ['like', 'nickname', $params['seller_keyword']],
  390. ['like', 'mobile', $params['seller_keyword']]
  391. ]];
  392. $user_list = User::lists($condition);
  393. $user_id_arr = array_column($user_list, 'id');
  394. $model->andWhere(['in', 'seller_user_id', $user_id_arr]);
  395. }
  396. $model->with(['buyUser', 'sellerUser']);
  397. //遍历组装数据
  398. $args = [];
  399. $args['where'] = [['mall_id' => $params['mall_id']], ['<>', 'status', StatusEnum::DELETE]];
  400. $args['select'] = 'id,level,name';
  401. $args['index'] = 'level';
  402. $level_list = AgentLevel::lists($args, true);
  403. $order_status_arr = [
  404. '0' => "待付款",
  405. '1' => "待发货",
  406. '2' => "已发货",
  407. '3' => "已收货",
  408. '4' => "已完成",
  409. '-4' => "已关闭",
  410. '-2' => "退款中",
  411. '-1' => "售后申请"
  412. ];
  413. foreach ($model->batch() as $list) {
  414. $order_no_arr = array_column($list, 'order_no');
  415. $order_arr = Order::lists(['where' => [['order_no' => $order_no_arr]], 'index' => 'order_no', 'select' => 'order_no,order_status']);
  416. $csv->data = array_map(function ($agent) use ($fields, $level_list, $order_arr, $order_status_arr) {
  417. $row = [];
  418. //遍历所选字段
  419. foreach ($fields as $field) {
  420. if (in_array($field, ['pay_time'])) {
  421. $row[] = !empty($agent[$field]) ? date('Y-m-d H:i:s', $agent[$field]) : '';
  422. } elseif (in_array($field, ['buy_nickname'])) {
  423. $row[] = !empty($agent['buyUser']['nickname']) ? $agent['buyUser']['nickname'] : '';
  424. } elseif (in_array($field, ['seller_nickname'])) {
  425. $row[] = !empty($agent['sellerUser']['nickname']) ? $agent['sellerUser']['nickname'] : '';
  426. } elseif (in_array($field, ['buy_level'])) {
  427. if (isset($level_list[$agent['buy_level']])) {
  428. $row[] = $level_list[$agent['buy_level']]['name'];
  429. } else {
  430. $row[] = '普通会员';
  431. }
  432. } elseif (in_array($field, ['seller_level'])) {
  433. if (isset($level_list[$agent['seller_level']])) {
  434. $row[] = $level_list[$agent['seller_level']]['name'];
  435. } else {
  436. $row[] = '普通会员';
  437. }
  438. } elseif (in_array($field, ['order_status'])) {
  439. if (isset($order_arr[$agent['order_no']]) && isset($order_status_arr[$order_arr[$agent['order_no']]['order_status']])) {
  440. $row[] = $order_status_arr[$order_arr[$agent['order_no']]['order_status']];
  441. } else {
  442. $row[] = '';
  443. }
  444. } elseif (in_array($field, ['stock_nums'])) {
  445. if ($agent['buy_level'] == 0) {
  446. $row[] = '/';
  447. } else {
  448. $row[] = !empty($agent[$field]) ? $agent[$field] : '';
  449. }
  450. } else {
  451. $row[] = !empty($agent[$field]) ? $agent[$field] : '';
  452. }
  453. }
  454. return $row;
  455. }, $list);
  456. $csv->export();
  457. }
  458. $csv->updateDown($download, $params['mall_id']);
  459. return true;
  460. } catch (\Exception $e) {
  461. $download->status = 3;
  462. $res = $download->save();
  463. self::setStaticError($e->getMessage());
  464. return false;
  465. }
  466. }
  467. }
  468. }