IndexController.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <?php
  2. namespace addons\CloudStock\console\controllers;
  3. use addons\CloudStock\common\logic\order\WangDianTongLogic;
  4. use addons\CloudStock\common\logic\reward\PoolReward;
  5. use addons\CloudStock\common\logic\reward\TeamReward;
  6. use addons\CloudStock\common\models\CloudStockAgent;
  7. use addons\CloudStock\common\models\CloudStockFillOrder;
  8. use addons\CloudStock\common\models\CloudStockLevel;
  9. use addons\CloudStock\common\models\CloudStockStatistic;
  10. use addons\CloudStock\common\services\AgentService;
  11. use addons\Distribution\common\models\Distribution;
  12. use addons\Distribution\common\models\DistributionLevel;
  13. use addons\WangDianTong\common\models\AddonsWangDianTongLogisticsCompany;
  14. use common\enums\AddonsEnum;
  15. use common\enums\OrderStatusEnum;
  16. use common\enums\StatusEnum;
  17. use common\enums\UserWalletEnum;
  18. use common\helpers\DateHelper;
  19. use common\models\common\CapitalLog;
  20. use common\models\mall\Mall;
  21. use common\models\mall\MallAddons;
  22. use common\models\order\Order;
  23. use common\models\order\OrderDetail;
  24. use common\models\user\User;
  25. use common\models\user\UserLevel;
  26. use services\common\UserWalletService;
  27. use yii\console\Controller;
  28. use yii\console\ExitCode;
  29. class IndexController extends Controller
  30. {
  31. public function actionSettlement()
  32. {
  33. $mall_list = Mall::getEnableMallList(true);
  34. foreach ($mall_list as $mall) {
  35. if (MallAddons::isInstall($mall['id'], AddonsEnum::ADDONS_NAME_CLOUD_STOCK) == 0) continue;
  36. $params['where'] = [
  37. ['mall_id' => $mall['id']],
  38. ['source_table' => OrderDetail::tableName()],
  39. ['from_type' => AddonsEnum::ADDONS_NAME_CLOUD_STOCK],
  40. ['capital_type' => [UserWalletEnum::PAYMENT_FOR_GOODS_BUY]],
  41. ['status' => CapitalLog::STATUS_WAIT_SEND]
  42. ];
  43. //货款
  44. $wallet_type = 'commission';
  45. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  46. $commission_list = CapitalLog::lists($params);
  47. if (empty($commission_list)) continue;
  48. $source_table_id = array_column($commission_list, 'source_table_id');
  49. $order_detail_list = OrderDetail::lists(['where' => [['id' => $source_table_id]], 'select' => 'id,order_id', 'index' => 'id']);
  50. $order_ids = array_column($order_detail_list, 'order_id');
  51. $order_list = Order::lists(['where' => [['id' => $order_ids], ['order_status' => OrderStatusEnum::ACCOMPLISH]], 'select' => 'id', 'index' => 'id']);
  52. $user_ids = array_column($commission_list, 'user_id');
  53. $user_arr = User::lists(['where' => [['id' => $user_ids]], 'select' => 'id,mobile', 'index' => 'id']);
  54. $obj = new CloudStockAgent();
  55. foreach ($commission_list as $item) {
  56. if (empty($order_detail_list[$item['source_table_id']])) continue;
  57. $order_id = $order_detail_list[$item['source_table_id']]['order_id'];
  58. if (empty($order_list[$order_id])) continue;
  59. $res = UserWalletService::unfrozen($item['id'], $wallet_type);
  60. if ($res) {
  61. $cloud_stock_agent_model = CloudStockAgent::findOne(['user_id' => $item['user_id'], 'status' => StatusEnum::ENABLED]);
  62. $cloud_stock_agent_model->frozen_price -= $item['change_num'];
  63. if ($cloud_stock_agent_model->frozen_price < 0) $cloud_stock_agent_model->frozen_price = 0;
  64. $cloud_stock_agent_model->save();
  65. $obj->sendGoodsMoneyMessage($user_arr, $item);
  66. }
  67. }
  68. }
  69. }
  70. public function actionPoolReward($time = null, $start = null, $end = null)
  71. {
  72. $mall_list = Mall::getEnableMallList(true);
  73. if (!isset($time)) $time = time();
  74. foreach ($mall_list as $mall) {
  75. $mall_id = $mall['id'];
  76. PoolReward::index($mall_id, $time, $start, $end);
  77. }
  78. }
  79. public function actionTeamReward($time = null, $start = null, $end = null)
  80. {
  81. $mall_list = Mall::getEnableMallList(true);
  82. if (!isset($time)) $time = time();
  83. foreach ($mall_list as $mall) {
  84. $mall_id = $mall['id'];
  85. TeamReward::index($mall_id, $time, $start, $end);
  86. }
  87. }
  88. public function actionFixOrder()
  89. {
  90. (new CloudStockFillOrder())->fixOrder();
  91. }
  92. public function actionTest()
  93. {
  94. // (new WangDianTongSyncListener())->handleSync(['id' => 40]);
  95. /**
  96. * @var $logistics AddonsWangDianTongLogisticsCompany
  97. */
  98. $logistics = AddonsWangDianTongLogisticsCompany::getOne([
  99. ['erp_type' => 8]
  100. ]);
  101. // 发货信息
  102. $flag = WangDianTongLogic::syncLogistics([
  103. 'mall_id' => 1,
  104. 'express_code' => 'SF',
  105. 'express_no' => '963852',
  106. 'id' => 46, // 取出订单ID
  107. ], $logistics->toArray());
  108. var_dump($flag);
  109. }
  110. /**
  111. * 修正代理库存
  112. * @return void
  113. */
  114. public function actionFixStock()
  115. {
  116. $i = 1;
  117. $page_size = 1000;
  118. while ($list = CloudStockAgent::find()
  119. ->offset(($i - 1) * $page_size)->limit($page_size)->all()) {
  120. foreach ($list as $item) {
  121. CloudStockAgent::fixStock($item['mall_id'], $item['user_id']);//扣减库存
  122. }
  123. $i++;
  124. }
  125. }
  126. public function actionChangeData()
  127. {
  128. //云库存
  129. $level_list = CloudStockLevel::lists([
  130. 'where' => [
  131. ['level' => 2],
  132. ['status' => StatusEnum::ENABLED]
  133. ],
  134. 'order' => 'mall_id asc'
  135. ]);
  136. $time = time();
  137. foreach ($level_list as $item) {
  138. $res = CloudStockAgent::updateAll(['level' => 2, 'upgrade_status' => 3, 'upgrade_at' => $time, 'before_level' => 1], ['level' => 1, 'mall_id' => $item['mall_id']]);
  139. var_dump($item['mall_id'] . "更新云库存代理等级:" . $res);
  140. $res = CloudStockLevel::updateAll(['status' => -1], ['level' => 1, 'mall_id' => $item['mall_id']]);
  141. var_dump($item['mall_id'] . "更新云库存等级:" . $res);
  142. }
  143. //分销商
  144. $level_list = DistributionLevel::lists([
  145. 'where' => [
  146. ['level' => 2],
  147. ['status' => StatusEnum::ENABLED]
  148. ],
  149. 'order' => 'mall_id asc'
  150. ]);
  151. foreach ($level_list as $item) {
  152. $res = Distribution::updateAll(['level' => 2, 'upgrade_status' => 3, 'upgrade_level_at' => $time], ['level' => 1, 'mall_id' => $item['mall_id']]);
  153. var_dump($item['mall_id'] . "更新分销商代理等级:" . $res);
  154. $res = DistributionLevel::updateAll(['status' => -1], ['level' => 1, 'mall_id' => $item['mall_id']]);
  155. var_dump($item['mall_id'] . "更新分销商等级:" . $res);
  156. }
  157. //会员等级
  158. $level_list = UserLevel::lists([
  159. 'where' => [
  160. ['level' => 2],
  161. ['status' => StatusEnum::ENABLED]
  162. ],
  163. 'order' => 'mall_id asc']);
  164. foreach ($level_list as $item) {
  165. $res = User::updateAll(['level' => 2, 'upgrade_level_at' => $time], ['level' => 1, 'mall_id' => $item['mall_id']]);
  166. var_dump($item['mall_id'] . "更新会员用户等级:" . $res);
  167. $res = UserLevel::updateAll(['status' => -1], ['level' => 1, 'mall_id' => $item['mall_id']]);
  168. var_dump($item['mall_id'] . "更新会员等级:" . $res);
  169. }
  170. var_dump(1);
  171. }
  172. /**
  173. * 平级奖-结算定时任务
  174. * @return bool
  175. */
  176. public function actionSettlementEqualReward()
  177. {
  178. try {
  179. $mall_list = Mall::getEnableMallList(true);
  180. $time = time();
  181. foreach ($mall_list as $mall) {
  182. $setting = \Yii::$app->services->setting->addons->get($mall['id'], AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  183. $is_true = false;
  184. $start_time = $end_time = 0;
  185. switch ($setting['settlement_cycle_of_equal_prize']) {
  186. case 1://周一
  187. $w = date('w', $time);
  188. if ($w == 1) {
  189. $is_true = true;
  190. }
  191. $res = DateHelper::lastWeek();
  192. $start_time = $res['start'];
  193. $end_time = $res['end'];
  194. break;
  195. case 2://按月
  196. $day = date('d', $time);
  197. if ($day == '01') {
  198. $is_true = true;
  199. }
  200. $res = DateHelper::lastMonth();
  201. $start_time = $res['start'];
  202. $end_time = $res['end'];
  203. break;
  204. default:
  205. }
  206. if (!$is_true) {
  207. continue;
  208. }
  209. $this->settlementEqualReward($mall['id'], $start_time, $end_time);
  210. }
  211. return ExitCode::OK;
  212. } catch (\Exception $e) {
  213. var_dump($e->getMessage());
  214. return false;
  215. }
  216. }
  217. protected function settlementEqualReward($mall_id, $start_time, $end_time)
  218. {
  219. CapitalLog::$capitalType = 'commission_frozen';
  220. $statistics_data = [];
  221. $statistics_user_data = [];
  222. while (true) {
  223. $list = CapitalLog::find()
  224. ->where(['mall_id' => $mall_id, 'status' => StatusEnum::DISABLED])
  225. ->andWhere(['from_type' => 'CloudStock', 'capital_type' => ['equal', 'price_difference_equal']])
  226. ->andWhere(['>=', 'created_at', $start_time])
  227. ->andWhere(['<=', 'created_at', $end_time])
  228. ->all();
  229. if (empty($list)) {
  230. break;
  231. }
  232. foreach ($list as $item) {
  233. if (isset($statistics_data[$item['capital_type']])) {
  234. $statistics_data[$item['capital_type']]['change_num'] += $item['change_num'];
  235. } else {
  236. $statistics_data[$item['capital_type']]['change_num'] = $item['change_num'];
  237. }
  238. if (isset($statistics_user_data[$item['user_id']][$item['capital_type']])) {
  239. $statistics_user_data[$item['user_id']][$item['capital_type']]['change_num'] += $item['change_num'];
  240. } else {
  241. $statistics_user_data[$item['user_id']][$item['capital_type']]['change_num'] = $item['change_num'];
  242. }
  243. UserWalletService::unfrozen($item['id'], 'commission');
  244. }
  245. }
  246. foreach ($statistics_data as $capital_type => $item) {
  247. $add_data = ['mall_id' => $mall_id, 'capital_type' => $capital_type, 'settlement_status' => 0, 'money' => -$item['change_num']];
  248. CloudStockStatistic::setData($add_data);//扣除待结算统计
  249. $add_data = ['mall_id' => $mall_id, 'capital_type' => $capital_type, 'settlement_status' => 1, 'money' => $item['change_num']];
  250. CloudStockStatistic::setData($add_data);//增加已结算统计
  251. }
  252. foreach ($statistics_user_data as $user_id => $value) {
  253. foreach ($value as $val) {
  254. $add_data = ['settlement_status' => 0, 'money' => -$val['change_num']];
  255. (new AgentService(['mall_id' => $mall_id, 'user_id' => $user_id]))->setData($add_data);
  256. $add_data = ['settlement_status' => 1, 'money' => $val['change_num']];
  257. (new AgentService(['mall_id' => $mall_id, 'user_id' => $user_id]))->setData($add_data);
  258. }
  259. }
  260. }
  261. }