DefaultController.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889
  1. <?php
  2. namespace addons\CloudStock\backend\controllers;
  3. use addons\Agent\common\models\Agent;
  4. use addons\CloudStock\common\enums\CloudStockEnum;
  5. use addons\CloudStock\common\logic\payment_log\PaymentLogLogic;
  6. use addons\CloudStock\common\models\CloudStockAgent;
  7. use addons\CloudStock\common\models\CloudStockAgentGoods;
  8. use addons\CloudStock\common\models\CloudStockBuyingOrder;
  9. use addons\CloudStock\common\models\CloudStockDeductionDetail;
  10. use addons\CloudStock\common\models\CloudStockFillOrder;
  11. use addons\CloudStock\common\models\CloudStockDispenseOrder;
  12. use addons\CloudStock\common\models\CloudStockGoods;
  13. use addons\CloudStock\common\models\CloudStockGoodsStockLog;
  14. use addons\CloudStock\common\models\CloudStockIncreaseDetail;
  15. use addons\CloudStock\common\models\CloudStockLevel;
  16. use addons\CloudStock\common\models\CloudStockImportLevelFailLog;
  17. use addons\CloudStock\common\models\CloudStockImportLevelLog;
  18. use addons\CloudStock\common\services\PaymentLogService;
  19. use addons\CloudStock\common\models\CloudStockPriceDifferenceOrder;
  20. use addons\CloudStock\common\models\CloudStockSms;
  21. use common\enums\AddonsEnum;
  22. use common\enums\DownloadEnum;
  23. use common\enums\StatusEnum;
  24. use common\enums\UserWalletEnum;
  25. use common\helpers\csv\CsvExportHelper;
  26. use common\models\common\CapitalLog;
  27. use common\models\common\CommissionLog;
  28. use common\models\common\GlobalVarMap;
  29. use common\models\goods\Goods;
  30. use common\models\user\User;
  31. use services\common\UserWalletService;
  32. use common\models\order\Order;
  33. use common\models\order\OrderDetail;
  34. use common\components\CsvExport;
  35. use Yii;
  36. /**
  37. * 默认控制器
  38. *
  39. * Class DefaultController
  40. * @package addons\CloudStock\backend\controllers
  41. */
  42. class DefaultController extends BaseController
  43. {
  44. public $enableCsrfValidation = false;
  45. public function actionIndex()
  46. {
  47. if (\Yii::$app->request->isAjax) {
  48. if (\Yii::$app->request->isGet) {
  49. $params = Yii::$app->request->get();
  50. $where[] = ['=', 'mall_id', $this->mall_id];
  51. $where[] = ['in', 'status', [StatusEnum::DISABLED, StatusEnum::ENABLED]];
  52. if (!empty($params['keyword'])) {
  53. $user_list = User::find()->where(['or',
  54. ['id' => $params['keyword']],
  55. ['like', 'mobile', $params['keyword']],
  56. ['nickname' => $params['keyword']]])->select('id')->asArray()->all();
  57. $user_id_arr = array_column($user_list, 'id');
  58. $where[] = ['user_id' => $user_id_arr];
  59. }
  60. if (!empty($params['level'])) $where[] = ['level' => $params['level']];
  61. if (!empty($params['start'])) $where[] = ['>=', 'created_at', strtotime($params['start'] . ' 00:00:00')];
  62. if (!empty($params['end'])) $where[] = ['<=', 'created_at', strtotime($params['end'] . ' 00:00:00')];
  63. $params['where'] = $where;
  64. $params['order'] = 'id desc';
  65. $params['with'] = ['user'];
  66. $page_data = CloudStockAgent::listPage($params, false);
  67. if (!empty($page_data['list'])) {
  68. $level_arr = array_column($page_data['list'], 'level');
  69. $parent_id_arr = [];
  70. $supplier_id_arr = [];
  71. foreach ($page_data['list'] as $val) {
  72. if(!in_array($val['user']['parent_id'],$parent_id_arr))$parent_id_arr[]= $val['user']['parent_id'];
  73. $parent_agent = CloudStockAgent::getUserParentAgent($val['user_id'], $val['level']);
  74. if (!empty($parent_agent)) {
  75. $supplier_id_arr[$val['user_id']] = $parent_agent['user_id'];
  76. if(!in_array($parent_agent['user_id'],$parent_id_arr))$parent_id_arr[]=$parent_agent['user_id'];
  77. }
  78. }
  79. $parent_arr = User::lists(['where' => [['id' => array_unique($parent_id_arr)]], 'index' => 'id', 'select' => 'id,nickname,avatar_url,mobile,parent_id']);
  80. $before_level_arr = array_column($page_data['list'], 'before_level');
  81. $level_list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['level' => $level_arr],['status'=>[StatusEnum::DISABLED,StatusEnum::ENABLED]]], 'index' => 'level']);
  82. $before_level_arr_list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['level' => $before_level_arr],['status'=>[StatusEnum::DISABLED,StatusEnum::ENABLED]]], 'index' => 'level']);
  83. $user_ids = array_column($page_data['list'], 'user_id');
  84. $cloudStockGoodsList = CloudStockGoods::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED]]]);
  85. $goods_ids = array_column($cloudStockGoodsList,'goods_id');
  86. $agent_goods_arr = CloudStockAgentGoods::lists(['where' => [['user_id' => $user_ids],['status'=>StatusEnum::ENABLED],['goods_id'=>$goods_ids]], 'select' => 'sum(num) num,user_id', 'group' => 'user_id', 'index' => 'user_id']);
  87. foreach ($page_data['list'] as &$item) {
  88. $item['level_name'] = $level_list[$item['level']]['name'] ?? '';
  89. $item['before_level_name'] = $before_level_arr_list[$item['before_level']]['name'] ?? '';
  90. $item['goods_stock'] = $agent_goods_arr[$item['user_id']]['num'] ?? 0;
  91. $item['parent_name'] = '平台';
  92. $item['parent'] = ['user_id'=>'', 'avatar_url'=>'', 'nickname'=>'平台', 'mobile'=>'',];
  93. $item['supplier'] = ['user_id'=>'', 'avatar_url'=>'', 'nickname'=>'平台', 'mobile'=>'',];
  94. if (isset($parent_arr[$item['user']['parent_id']])) {
  95. $item['parent']=[
  96. 'user_id'=>$item['user']['parent_id'],
  97. 'avatar_url'=>$parent_arr[$item['user']['parent_id']]['avatar_url'],
  98. 'nickname'=>$parent_arr[$item['user']['parent_id']]['nickname'],
  99. 'mobile'=>$parent_arr[$item['user']['parent_id']]['mobile'],
  100. ];
  101. $item['parent_name'] = $parent_arr[$item['user']['parent_id']]['nickname'] ? $parent_arr[$item['user']['parent_id']]['nickname'] : $item['user']['parent_id'];
  102. }
  103. $item['supplier_name'] = '平台';
  104. if (isset($supplier_id_arr[$item['user_id']])) {
  105. $supplier_id = $supplier_id_arr[$item['user_id']];
  106. $item['supplier_name'] = !empty($parent_arr[$supplier_id]['nickname']) ? $parent_arr[$supplier_id]['nickname'] : '供货商:' . $supplier_id;
  107. if(isset($parent_arr[$supplier_id])){
  108. $item['supplier']=[
  109. 'user_id'=>$supplier_id,
  110. 'avatar_url'=>$parent_arr[$supplier_id]['avatar_url'],
  111. 'nickname'=>$parent_arr[$supplier_id]['nickname'],
  112. 'mobile'=>$parent_arr[$supplier_id]['mobile'],
  113. ];
  114. }
  115. }
  116. }
  117. }
  118. $setting = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  119. $page_data['payment_is_not_in_commission'] = $setting['payment_is_not_in_commission'] ?? 0;
  120. $page_data['export_list'] = CloudStockAgent::exportFieldsList();
  121. $page_data['export_url'] = 'mall/finance/commission-log';
  122. return $this->success('操作成功', $page_data);
  123. }}
  124. if (\Yii::$app->request->post('flag') == 'EXPORT') {
  125. $post = \Yii::$app->request->post();
  126. $post['mall_id'] = $this->mall_id;
  127. $filename = '代理商列表-' . date('YmdHis') . '_' . rand(10000, 99999);
  128. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id, $filename, DownloadEnum::TYPE_CLOUD_STOCK, CloudStockAgent::class, 'exportHandle', $post);
  129. if ($res === false) return $this->error('加入导出任务失败' . CsvExportHelper::getStaticError());
  130. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  131. }
  132. return $this->render('index', []);
  133. }
  134. public function actionEdit()
  135. {
  136. try {
  137. $request = Yii::$app->request;
  138. if ($request->isAjax) {
  139. if ($request->isGet) {
  140. $id = Yii::$app->request->get('id', '');
  141. $setting = \Yii::$app->services->setting->addons->get($this->mall_id, AddonsEnum::ADDONS_NAME_CLOUD_STOCK, 'basic');
  142. $data = CloudStockLevel::getOne([['id' => $id], ['mall_id' => $this->mall_id], ['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]], true);
  143. $configs['setting'] = $setting;
  144. if (!empty($data)) {
  145. $data['checked_condition_values'] = json_decode($data['checked_condition_values'], true);
  146. $data['checked_condition_keys'] = json_decode($data['checked_condition_keys'], true);
  147. $data['give_quota'] = json_decode($data['give_quota'], true);
  148. }
  149. return $this->success('操作成功', $data);
  150. }
  151. if ($request->isPost) {
  152. $params = Yii::$app->request->post();
  153. $res = Yii::$app->services->validate->validate($params, [
  154. [['level', 'user_id'], 'required'],
  155. ]);
  156. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  157. $params['mall_id'] = $this->mall_id;
  158. $params['upgrade_status'] = CloudStockEnum::UPGRADE_STATUS_MANUAL;
  159. $params['upgrade_at'] = time();
  160. $res = CloudStockAgent::getOne([['mall_id' => $this->mall_id], ['user_id' => $params['user_id']], ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]]);
  161. if ($res) return $this->error('该用户已是代理商');
  162. $res = CloudStockAgent::setData($params);
  163. if ($res === false) return $this->error(CloudStockAgent::getStaticError());
  164. // 触发云库存代理商修改权重事件
  165. $event = new \addons\CloudStock\common\events\user\ChangeCloudStockAgentLevelEvent($this->mall_id);
  166. $data = ['mall_id' => $this->mall_id,'user_id'=>$res['user_id']];
  167. \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  168. return $this->success('操作成功');
  169. }
  170. }
  171. } catch (\Exception $e) {
  172. return $this->error($e->getMessage(), []);
  173. }
  174. return $this->render('edit');
  175. }
  176. public function actionRemarksEdit()
  177. {
  178. if (\Yii::$app->request->isAjax) {
  179. if (\Yii::$app->request->isPost) {
  180. $params = \Yii::$app->request->post();
  181. $res = Yii::$app->services->validate->validate($params, [
  182. [['id'], 'required'],
  183. [['remarks'], 'safe']
  184. ]);
  185. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  186. $params['mall_id'] = $this->mall_id;
  187. $res = CloudStockAgent::setData($params);
  188. if ($res === false) return $this->error(CloudStockAgent::getStaticError());
  189. return $this->success('操作成功');
  190. }
  191. }
  192. return $this->error();
  193. }
  194. public function actionDelete()
  195. {
  196. if (\Yii::$app->request->isAjax) {
  197. if (\Yii::$app->request->isPost) {
  198. $params = \Yii::$app->request->post();
  199. $res = Yii::$app->services->validate->validate($params, [
  200. [['id'], 'required'],
  201. [['id'], 'integer']
  202. ]);
  203. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  204. $params['mall_id'] = $this->mall_id;
  205. $params['status'] = StatusEnum::DELETE;
  206. $res = CloudStockAgent::setData($params);
  207. if ($res === false) return $this->error(CloudStockAgent::getStaticError());
  208. return $this->success('操作成功');
  209. }
  210. }
  211. return $this->error();
  212. }
  213. public function actionLevelChange()
  214. {
  215. if (\Yii::$app->request->isAjax) {
  216. if (\Yii::$app->request->isPost) {
  217. $params = \Yii::$app->request->post();
  218. $res = Yii::$app->services->validate->validate($params, [
  219. [['id', 'level'], 'required'],
  220. [['level'], 'integer']
  221. ]);
  222. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  223. $params['mall_id'] = $this->mall_id;
  224. $params['upgrade_status'] = CloudStockEnum::UPGRADE_STATUS_MANUAL;
  225. $res = CloudStockAgent::setData($params);
  226. if ($res === false) return $this->error(CloudStockAgent::getStaticError());
  227. // 触发云库存代理商修改权重事件
  228. $event = new \addons\CloudStock\common\events\user\ChangeCloudStockAgentLevelEvent($this->mall_id);
  229. $data = ['mall_id' => $this->mall_id,'user_id'=>$res['user_id']];
  230. \Yii::$app->services->events->dispatch($event, $data, $event->listeners);
  231. return $this->success('操作成功');
  232. }
  233. }
  234. return $this->error();
  235. }
  236. //不用验证权限
  237. public function actionGetLevelList()
  238. {
  239. $list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]],'order'=>'level asc']);
  240. return $this->success('操作成功', $list);
  241. }
  242. //不用验证权限
  243. public function actionSearchUser()
  244. {
  245. if (\Yii::$app->request->isAjax) {
  246. $keyword = \Yii::$app->request->get('keyword', '');
  247. $list['list'] = User::searchUser(['keyword' => $keyword, 'mall_id' => $this->mall_id]);
  248. return $this->success('操作成功', $list);
  249. }
  250. return $this->error();
  251. }
  252. public function actionStock()
  253. {
  254. if (\Yii::$app->request->isAjax) {
  255. if (\Yii::$app->request->isPost) {
  256. $data = \Yii::$app->request->post();
  257. $title = '代理库存';
  258. $filename = $title. '-' . date('YmdHis').'_'.rand(10000,99999);
  259. $data['mall_id'] = $this->mall_id;
  260. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id,$filename,DownloadEnum::TYPE_CLOUD_STOCK,CloudStockAgent::class,'exportOrder',$data);
  261. if ($res === false) return $this->error('加入导出任务失败'.CsvExportHelper::getStaticError());
  262. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  263. }else{
  264. $params = Yii::$app->request->get();
  265. $where[] = ['=', 'mall_id', $this->mall_id];
  266. $where[] = ['in', 'status', [StatusEnum::DISABLED, StatusEnum::ENABLED]];
  267. if (!empty($params['keyword'])) {
  268. $user_list = User::find()->where(['or',
  269. ['id' => $params['keyword']],
  270. ['like', 'mobile', $params['keyword']],
  271. ['like', 'nickname', $params['keyword']]])->select('id')->asArray()->all();
  272. $user_id_arr = array_column($user_list, 'id');
  273. $where[] = ['user_id' => $user_id_arr];
  274. }
  275. if (!empty($params['level'])) $where[] = ['level' => $params['level']];
  276. if (!empty($params['start'])) $where[] = ['>=', 'created_at', strtotime($params['start'] . ' 00:00:00')];
  277. if (!empty($params['end'])) $where[] = ['<=', 'created_at', strtotime($params['end'] . ' 00:00:00')];
  278. $params['order'] = 'stock desc';
  279. if(!empty($params['sort_column'])&&!empty($params['sort_order'])){
  280. $sort_order = $params['sort_order']=='ascending'?'asc':'desc';
  281. $params['order'] = $params['sort_column'].' '.$sort_order;
  282. }
  283. $params['where'] = $where;
  284. $params['with'] = 'user';
  285. $page_data = CloudStockAgent::listPage($params, false);
  286. if (!empty($page_data['list'])) {
  287. $level_arr = array_column($page_data['list'], 'level');
  288. $user_ids = array_column($page_data['list'], 'user_id');
  289. $level_list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['level' => $level_arr], ['status' => StatusEnum::ENABLED]], 'index' => 'level']);
  290. $cloudStockGoodsList = CloudStockGoods::lists(['where'=>[['mall_id'=>$this->mall_id],['status'=>StatusEnum::ENABLED]]]);
  291. $goods_ids = array_column($cloudStockGoodsList,'goods_id');
  292. $agent_goods_list = CloudStockAgentGoods::lists(['where' => [['user_id' => $user_ids],['goods_id'=>$goods_ids],['status'=>StatusEnum::ENABLED]], 'select' => 'sum(num) num ,user_id', 'group' => 'user_id', 'index' => 'user_id']);
  293. foreach ($page_data['list'] as &$item) {
  294. $item['level_name'] = $level_list[$item['level']]['name'] ?? '';
  295. $item['total_stock_num'] = 0;
  296. if (isset($agent_goods_list[$item['user_id']])) $item['total_stock_num'] = $agent_goods_list[$item['user_id']]['num'];
  297. }
  298. }
  299. $page_data['export_list'] = CloudStockAgent::fieldsLists();
  300. return $this->success('操作成功', $page_data);
  301. }
  302. }
  303. return $this->render('stock');
  304. }
  305. /**
  306. * 导入日志记录
  307. * @return mixed|void
  308. */
  309. public function actionGetImportLevelLog()
  310. {
  311. $params = \Yii::$app->request->get();
  312. $params['where'] = [
  313. ['mall_id'=>$this->mall_id]
  314. ];
  315. $params['order'] = 'id desc';
  316. $data = CloudStockImportLevelLog::listPage($params, false, true);
  317. if (!empty($data['list'])) {
  318. foreach ($data['list'] as &$v) {
  319. $v['url'] = '';
  320. if ($v['fail_counts']) $v['url'] = \Yii::$app->urlManager->createUrl(['cloud-stock/default/export-level-fail', 'log_id' => $v['id']]);
  321. }
  322. }
  323. return $this->success('操作成功', $data);
  324. }
  325. /**
  326. * 导出失败日志
  327. */
  328. public function actionExportLevelFail()
  329. {
  330. CloudStockImportLevelFailLog::exportFailLog(\Yii::$app->request->get());
  331. }
  332. /**
  333. * 会员批量导入模板下载
  334. */
  335. public function actionImportLevelModel()
  336. {
  337. $csv = new CsvExport();
  338. $file_name = '批量导入代理等级模板-' . date('YmdHis', time());
  339. $head_list = array_column(CloudStockAgent::$head_list, 'field_name');
  340. return $csv->export([], $head_list, $file_name);
  341. }
  342. /**
  343. * 批量导入等级
  344. * @return mixed|string|void
  345. */
  346. public function actionImportLevel()
  347. {
  348. set_time_limit(0);
  349. if (\Yii::$app->request->isAjax) {
  350. $params = \Yii::$app->request->post();
  351. $res = Yii::$app->services->validate->validate($params, [
  352. [['current_num'], 'required'],
  353. [['file'], 'file', 'extensions' => ['csv']],
  354. [['file_path'], 'string'],
  355. [['sync'], 'safe'],
  356. ]);
  357. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  358. $params['mall_id'] = $this->mall_id;
  359. if(!empty($params['sync'])){
  360. $res = CloudStockAgent::importLevelSync($params);
  361. }else{
  362. $res = CloudStockAgent::importLevel($params);
  363. }
  364. if (empty($res['fail_counts'])) return $this->success('操作成功', $res);
  365. if (!empty($res['fail_counts'])) return $this->error('导入失败'.$res['fail_counts'].'条');
  366. return $this->error(CloudStockAgent::getStaticError());
  367. } else {
  368. return $this->render($this->action->id);
  369. }
  370. }
  371. public function actionStockLog()
  372. {
  373. if (\Yii::$app->request->isAjax) {
  374. if (\Yii::$app->request->isPost) {
  375. $data = \Yii::$app->request->post();
  376. if ($data['log_type'] == 'add') {
  377. $class = CloudStockIncreaseDetail::class;
  378. $title = '增加库存明细列表';
  379. } else {
  380. $class = CloudStockDeductionDetail::class;
  381. $title = '扣减库存明细列表';
  382. }
  383. $filename = $title. '-' . date('YmdHis').'_'.rand(10000,99999);
  384. $data['mall_id'] = $this->mall_id;
  385. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id,$filename,DownloadEnum::TYPE_CLOUD_STOCK,$class,'exportOrder',$data);
  386. if ($res === false) return $this->error('加入导出任务失败'.CsvExportHelper::getStaticError());
  387. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  388. }else{
  389. $params = Yii::$app->request->get();
  390. $where[] = ['=', 'mall_id', $this->mall_id];
  391. $where[] = ['=', 'status', StatusEnum::ENABLED];
  392. if (!empty($params['keyword'])) {
  393. $user_list = User::find()->where(['id' => $params['keyword']])->select('id')->asArray()->all();
  394. $user_id_arr = array_column($user_list, 'id');
  395. $where[] = ['user_id' => $user_id_arr];
  396. } else {
  397. if ($params['keyword'] != '') {
  398. $where[] = ['user_id' => 0];
  399. }
  400. }
  401. if (isset($params['mobile']) && $params['mobile'] !== '') {
  402. $user_id_arr = User::find()
  403. ->where([
  404. 'mall_id' => $this->mall_id,
  405. 'status' => StatusEnum::ENABLED
  406. ])
  407. ->andWhere(['like', 'mobile', $params['mobile']])
  408. ->select('id')
  409. ->column();
  410. $where[] = ['user_id' => $user_id_arr];
  411. }
  412. if (!empty($params['goods_name'])) {
  413. $goods_list = Goods::find()->where([
  414. 'like', 'goods_name', $params['goods_name']])->select('id')->asArray()->all();
  415. $goods_list_arr = array_column($goods_list, 'id');
  416. $where[] = ['goods_id' => $goods_list_arr];
  417. }
  418. if (!empty($params['order_id'])) $where[] = ['order_id' => $params['order_id']];
  419. if(!empty($params['order_no'])){
  420. $buying_order_list = CloudStockBuyingOrder::find()
  421. ->alias('c')
  422. ->leftJoin(['order'=>Order::tableName()],'order.id = c.order_id')
  423. ->where(['order.order_no'=>$params['order_no']])
  424. ->select('c.id,c.order_id')->all();
  425. $buying_order_ids = array_column($buying_order_list,'id');
  426. $order_ids = array_column($buying_order_list,'order_id');
  427. $fill_order_ids = CloudStockFillOrder::find()->where(['order_no'=>$params['order_no']])->select('id')->column();
  428. $order_ids = array_merge($buying_order_ids,$order_ids,$fill_order_ids);
  429. $where[] = ['order_id' => $order_ids];
  430. }
  431. if (!empty($params['changes_type'])) $where[] = ['changes_type' => $params['changes_type']];
  432. if (!empty($params['start'])) $where[] = ['>=', 'created_at', strtotime($params['start'] . ' 00:00:00')];
  433. if (!empty($params['end'])) $where[] = ['<=', 'created_at', strtotime($params['end'] . ' 00:00:00')];
  434. $params['order'] = 'id desc';
  435. $params['with'] = ['goods', 'user'];
  436. $params['where'] = $where;
  437. if ($params['log_type'] == 'add') {
  438. $page_data = CloudStockIncreaseDetail::listPage($params, false);
  439. $page_data['export_list'] = CloudStockIncreaseDetail::fieldsLists();
  440. } else {
  441. $page_data = CloudStockDeductionDetail::listPage($params, false);
  442. $page_data['export_list'] = CloudStockDeductionDetail::fieldsLists();
  443. }
  444. if (!empty($page_data['list'])) {
  445. foreach ($page_data['list'] as &$item) {
  446. if (isset($item['user']['id'])) {
  447. $item['agent_user_id'] = $item['user']['id'];
  448. $item['agent_user_avatar_url'] = $item['user']['avatar_url'];
  449. $item['agent_user_nickname'] = $item['user']['nickname'];
  450. $item['agent_user_mobile'] = $item['user']['mobile'];
  451. } else {
  452. $item['agent_user_id'] = $item['user_id'];
  453. $item['agent_user_avatar_url'] = '';
  454. $item['agent_user_nickname'] = '平台';
  455. $item['agent_user_mobile'] = '';
  456. }
  457. $item['order_no'] = '';
  458. $item['from_user'] = [];
  459. $order = null;
  460. $changes_type = '';
  461. if ($params['log_type'] == 'add') {
  462. if(in_array($item['changes_type'],[CloudStockEnum::CHANGE_TYPE_INCREASE_FILL])){
  463. $changes_type = CloudStockEnum::CHANGE_TYPE_DEDUTION_FILL;
  464. $order = CloudStockFillOrder::findOne(['id'=>$item['order_id']]);
  465. }
  466. if(in_array($item['changes_type'],[CloudStockEnum::CHANGE_TYPE_INCREASE_UPGRADE_BAG_GIVE,CloudStockEnum::CHANGE_TYPE_INCREASE_GIFT_PLAN_GIVE])){
  467. $changes_type = $item['changes_type'];
  468. $order = Order::findOne(['id'=>$item['order_id']]);
  469. }
  470. $deduction_user_ids = CloudStockDeductionDetail::find()->where(['changes_type'=>$changes_type,'order_id'=>$item['order_id']])->select('user_id')->asArray()->column();
  471. $platform = [
  472. 'id' => 0,
  473. 'nickname' => '平台',
  474. 'mobile' => '',
  475. 'avatar_url' => '',
  476. ];
  477. if(!empty($deduction_user_ids)){
  478. $item['from_user'] = [];
  479. $item['from_user'] = User::find()->where(['id'=>$deduction_user_ids])->select('id,nickname,mobile,avatar_url')->asArray()->all();
  480. if(in_array(0,$deduction_user_ids)){
  481. $item['from_user'][] = $platform;
  482. }
  483. } else {
  484. $item['from_user'][] = $platform;
  485. }
  486. if(!empty($order)){
  487. $item['order_no'] = $order['order_no'];
  488. }
  489. } else {
  490. if(in_array($item['changes_type'],[CloudStockEnum::CHANGE_TYPE_DEDUTION_GOODS_BUYING])){
  491. $buying_order = CloudStockBuyingOrder::findOne(['id'=>$item['order_id']]);
  492. $order = Order::findOne(['id'=>$buying_order['order_id']]);
  493. }
  494. if(in_array($item['changes_type'],[CloudStockEnum::CHANGE_TYPE_INCREASE_UPGRADE_BAG_GIVE])){
  495. $order = Order::findOne(['id'=>$item['order_id']]);
  496. }
  497. if(in_array($item['changes_type'],[CloudStockEnum::CHANGE_TYPE_DEDUTION_FILL])){
  498. $order = CloudStockFillOrder::findOne(['id'=>$item['order_id']]);
  499. }
  500. if(!empty($order)){
  501. $item['order_no'] = $order['order_no'];
  502. $item['from_user'] = [];
  503. $item['from_user'][] = User::find()->where(['id'=>$order['user_id']])->select('id,nickname,mobile,avatar_url')->asArray()->one();
  504. }
  505. }
  506. }
  507. }
  508. $page_data['changeTypeMap'] = CloudStockEnum::getStockChangeTypeMap();
  509. return $this->success('操作成功', $page_data);
  510. }
  511. }
  512. return $this->render('stock-log');
  513. }
  514. //不用验证权限
  515. public function actionGetChangesTypeList()
  516. {
  517. $changeTypeMap = CloudStockEnum::getStockChangeTypeMap();
  518. $row = [];
  519. foreach ($changeTypeMap as $k=>$v){
  520. if(100<=$k&&$k<200){
  521. $row['increase'][] =[
  522. 'value'=>$k,'desc'=>$v
  523. ];
  524. }
  525. if((200<=$k&&$k<300)||$k==105||$k==106){
  526. $row['deduction'][] =[
  527. 'value'=>$k,'desc'=>$v
  528. ];
  529. }
  530. }
  531. $data[0]=$row;
  532. return $this->success('success', $data);
  533. }
  534. public function actionPriceLog()
  535. {
  536. CapitalLog::$capitalType = 'commission';
  537. if (\Yii::$app->request->isAjax) {
  538. if (\Yii::$app->request->isPost) {
  539. $filename = '佣金列表-' . date('YmdHis') . '_' . rand(10000, 99999);
  540. $data = \Yii::$app->request->post();
  541. if (is_numeric($data['status']) && $data['status'] == 0)
  542. {
  543. $data['table'] = 'commission_frozen';
  544. } else {
  545. $data['table'] = 'commission';
  546. }
  547. $data['mall_id'] = $this->mall_id;
  548. $data['from_type'] = CloudStockEnum::ADDONS_NAME;
  549. if (!empty($data['date'])) {
  550. $stat_date = $data['date'] . '-01 00:00:00';
  551. $end_date = date('Y-m-t 23:59:59', time());
  552. $data['date'] = [
  553. $stat_date,
  554. $end_date
  555. ];
  556. }
  557. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id, $filename, DownloadEnum::TYPE_ASSETS, CapitalLog::class, 'exportAssets', $data);
  558. if ($res === false) return $this->error('加入导出任务失败' . CsvExportHelper::getStaticError());
  559. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  560. }
  561. $page = \Yii::$app->request->get('page') ?? 1;
  562. $limit = \Yii::$app->request->get('page_size') ?? $this->pageSize;
  563. $get = \Yii::$app->request->get();
  564. $params[] = ['log.mall_id' => $this->mall_id];
  565. if ($get['status'] == 0) {
  566. //查询冻结表,未结算数据
  567. $params[] = ['in', 'log.status', [StatusEnum::DISABLED]];
  568. CapitalLog::$capitalType = 'commission_frozen';
  569. }
  570. if (!empty($get['capital_type'])) $params[] = ['log.capital_type' => $get['capital_type']];
  571. if (!empty($get['remark'])) $params[] = ['like', 'log.desc', $get['remark']];
  572. // 搜索来源
  573. $isSearchContributor = isset($get['contributor']) && is_numeric($get['contributor']);
  574. if (!empty($get['order_no']) || $isSearchContributor){
  575. $where_or_params = [];
  576. // 来源搜索
  577. if ($isSearchContributor) {
  578. $userIdsByMobile = User::find()
  579. ->where(['mall_id' => $this->mall_id])
  580. ->andWhere(['like', 'mobile', $get['contributor']])
  581. ->andWhere(['!=', 'status', StatusEnum::DELETE])
  582. ->column();
  583. $userIdsByMobile[] = $get['contributor'];
  584. $where_or_params[] = ['contributor_id' => $userIdsByMobile];
  585. }
  586. $orderSearchWhere = ['or'];
  587. if (!empty($get['order_no'])) {
  588. $orderSearchWhere[] = ['order_no' => $get['order_no']];
  589. }
  590. if ($isSearchContributor) {
  591. $orderSearchWhere[] = ['user_id' => $userIdsByMobile];
  592. }
  593. $order_ids = Order::find()->where(['mall_id' => $this->mall_id])->andWhere($orderSearchWhere)->select('id')->column();
  594. if(!empty($order_ids)){
  595. $where_or_params[] = [
  596. 'and',
  597. ['log.source_table' => Order::tableName()],
  598. ['log.source_table_id' => $order_ids]
  599. ];
  600. }
  601. $order_detail_ids = OrderDetail::find()->where(['order_id'=>$order_ids])->select('id')->column();
  602. if(!empty($order_detail_ids)){
  603. $where_or_params[] = [
  604. 'and',
  605. ['log.source_table' => OrderDetail::tableName()],
  606. ['log.source_table_id' => $order_detail_ids]
  607. ];
  608. }
  609. $fill_order_ids = CloudStockFillOrder::find()->where(['mall_id' => $this->mall_id])->andWhere($orderSearchWhere)->select('id')->column();
  610. if(!empty($fill_order_ids)){
  611. $where_or_params[] = [
  612. 'and',
  613. ['log.source_table' => CloudStockFillOrder::tableName()],
  614. ['log.source_table_id' => $fill_order_ids]
  615. ];
  616. }
  617. if (!empty($get['order_no'])) {
  618. $where_or_params[] = [
  619. 'and',
  620. ['log.order_no' => trim($get['order_no'])],
  621. ];
  622. }
  623. if(!empty($where_or_params)){
  624. array_unshift($where_or_params,'or');
  625. $params[] = $where_or_params;
  626. }
  627. }
  628. if (!empty($get['keyword'])){
  629. $user_list = User::lists([
  630. 'where'=>[
  631. ['or',
  632. ['like', 'nickname', $get['keyword']],
  633. ['like', 'mobile', $get['keyword']]
  634. ]
  635. ],
  636. 'select'=>'id',
  637. ]);
  638. $user_ids = array_column($user_list,'id');
  639. }
  640. if(isset($user_ids)) $params[] = ['log.user_id' => $user_ids];
  641. if (!empty($get['user_id'])) $params[] = ['log.user_id' => $get['user_id']];
  642. $date = 0;
  643. if (!empty($get['date'])) {
  644. $start = strtotime(date($get['date'] . '-01'));
  645. $end = strtotime(date($get['date'] . '-t'));
  646. $params[] = ['>=', 'log.created_at', $start];
  647. $params[] = ['<=', 'log.created_at', $end];
  648. if (isset($params['end']) && $params['end'] != '') {
  649. $where[] = ['<', 'pl.created_at', strtotime($params['end'])];
  650. }
  651. }
  652. $params[] = ['log.from_type' => CloudStockEnum::ADDONS_NAME];
  653. $params = [
  654. 'alias' => 'log',
  655. 'select' => 'log.id,log.created_at,log.mall_id,log.user_id,log.change_type,log.change_num,log.current_num,log.desc,log.from_type,
  656. log.capital_type,log.created_at,log.source_table_id,log.source_table,log.order_no,log.contributor_id',
  657. 'where' => $params,
  658. 'order' => 'id desc',
  659. 'page' => $page,
  660. 'limit' => $limit,
  661. ];
  662. $list = CapitalLog::listPage($params, false, true);
  663. $commission_map = UserWalletEnum::getCommissionMap();
  664. $list['date'] = '';
  665. $capital_type_map = GlobalVarMap::getEnumMapByType('CapitalTypeMap');
  666. if (!empty($list['list'])) {
  667. $user_id_arr = array_column($list['list'],'user_id');
  668. $contributor_id_arr = array_column($list['list'], 'contributor_id');
  669. $user_arr = User::lists([
  670. 'where'=>[
  671. ['id' => array_merge($contributor_id_arr, $user_id_arr)]
  672. ],
  673. 'index'=>'id',
  674. ]);
  675. foreach ($list['list'] as &$lv) {
  676. $lv['source_text'] = ($commission_map[$lv['from_type']] ?? '') . ($capital_type_map[$lv['capital_type']] ? '-' . $capital_type_map[$lv['capital_type']] : '');
  677. $lv['created_at'] = date('Y-m-d H:i:s', $lv['created_at']);
  678. $lv['nickname'] = '';
  679. $lv['avatar_url'] = '';
  680. $lv['mobile'] = '';
  681. $lv['username'] = '';
  682. if(isset($user_arr[$lv['user_id']])){
  683. $lv['nickname'] = $user_arr[$lv['user_id']]['nickname'];
  684. $lv['avatar_url'] = $user_arr[$lv['user_id']]['avatar_url'];
  685. $lv['mobile'] = $user_arr[$lv['user_id']]['mobile'];
  686. $lv['username'] = $user_arr[$lv['user_id']]['username'];
  687. }
  688. $lv['from_user'] = [];
  689. $order = null;
  690. if($lv['source_table'] == Order::tableName()){
  691. $order = Order::findOne(['id'=>$lv['source_table_id']]);
  692. }elseif($lv['source_table'] == OrderDetail::tableName()){
  693. $order_detail = OrderDetail::findOne(['id'=>$lv['source_table_id']]);
  694. if($order_detail){
  695. $order = Order::findOne(['id'=>$order_detail['order_id']]);
  696. }
  697. }elseif($lv['source_table'] == CloudStockFillOrder::tableName()){
  698. $order = CloudStockFillOrder::findOne(['id'=>$lv['source_table_id']]);
  699. }
  700. if (empty($lv['order_no']) && !empty($order)) {
  701. $lv['order_no'] = $order['order_no'];
  702. }
  703. if (isset($user_arr[$lv['contributor_id']])) {
  704. $lv['from_user'] = [
  705. 'id' => $user_arr[$lv['contributor_id']]['id'],
  706. 'nickname' => $user_arr[$lv['contributor_id']]['nickname'],
  707. 'mobile' => $user_arr[$lv['contributor_id']]['mobile'],
  708. 'avatar_url' => $user_arr[$lv['contributor_id']]['avatar_url'],
  709. ];
  710. } else {
  711. if (!empty($order)) {
  712. $lv['from_user'] = User::find()->where(['id' => $order['user_id']])->select('id,nickname,mobile,avatar_url')->asArray()->one();
  713. }
  714. }
  715. }
  716. }
  717. // 业务类型
  718. $list['commissionFromTypeList'] = $commission_map;//来源类型
  719. $list['incomeCapitalTypeList'] = $capital_type_map;//佣金类型
  720. // 导出字段列表
  721. $list['export_list'] = CommissionLog::EXPORT_FIELD_LIST;
  722. CapitalLog::$capitalType = 'commission_frozen';
  723. $frozen_capital_total = CapitalLog::find()->where(['mall_id' => $this->mall_id, 'from_type' => CloudStockEnum::ADDONS_NAME, 'status' => 0])->sum('change_num');
  724. $statistics_data['frozen_capital_total'] = 0;
  725. $statistics_data['commission_total'] = 0;
  726. if (!empty($frozen_capital_total)) $statistics_data['frozen_capital_total'] = bcsub($frozen_capital_total,1,2);
  727. CapitalLog::$capitalType = 'commission';
  728. $commission_total = CapitalLog::find()->where(['mall_id' => $this->mall_id, 'from_type' => CloudStockEnum::ADDONS_NAME,'change_type'=>'add'])->sum('change_num');
  729. if(!empty($commission_total)) $statistics_data['commission_total'] = $commission_total;
  730. $statistics_data['commission_total']+=$statistics_data['frozen_capital_total'];
  731. $list['statistics_data'] = $statistics_data;
  732. $list['export_list'] = CapitalLog::exportFieldsList();
  733. return $this->success('操作成功', $list);
  734. } else {
  735. $flag = \Yii::$app->request->post('flag');
  736. if (empty($flag)) {
  737. return $this->render('price-log');
  738. } else {
  739. // 导出数据
  740. }
  741. }
  742. return $this->render('price-log');
  743. }
  744. public function actionPaymentLog()
  745. {
  746. if (\Yii::$app->request->isAjax) {
  747. if (\Yii::$app->request->isPost) {
  748. $filename = '货款明细-' . date('YmdHis') . '_' . rand(10000, 99999);
  749. $data = \Yii::$app->request->post();
  750. $data['mall_id'] = $this->mall_id;
  751. $res = CsvExportHelper::exportDownLoadCenter($this->mall_id, $filename, DownloadEnum::TYPE_ASSETS, PaymentLogLogic::class, 'export', $data);
  752. if ($res === false) return $this->error('加入导出任务失败' . CsvExportHelper::getStaticError());
  753. return $this->success('添加导出任务成功,任务完成后请在下载中心进行下载!');
  754. }
  755. try {
  756. $params = Yii::$app->request->get();
  757. $data = (new PaymentLogService(['mall_id' => $this->mall_id]))->paymentLog($params);
  758. return $this->success('操作成功', $data);
  759. } catch (\Exception $e) {
  760. return $this->error($e->getMessage(), []);
  761. }
  762. }
  763. }
  764. public function actionSettlement()
  765. {
  766. $wallet_type = 'commission';
  767. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  768. $res = false;
  769. if (\Yii::$app->request->isAjax) {
  770. if (\Yii::$app->request->isPost) {
  771. $params = \Yii::$app->request->post();
  772. $res = UserWalletService::unfrozen($params['id'], $wallet_type);
  773. }
  774. }
  775. return $this->success('成功', $res);
  776. }
  777. public function actionChangeGoodsStock()
  778. {
  779. if (\Yii::$app->request->isAjax) {
  780. if (\Yii::$app->request->isPost) {
  781. $params = \Yii::$app->request->post();
  782. $res = Yii::$app->services->validate->validate($params, [
  783. [['user_id', 'changes_dir', 'goods_id', 'num'], 'required'],
  784. ]);
  785. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  786. if ($params['changes_dir'] == CloudStockEnum::STOCK_CHANGE_ADD) {
  787. try {
  788. $post['goods_id'] = $params['goods_id'];
  789. $post['user_id'] = 0;
  790. $post['mall_id'] = $this->mall_id;
  791. $post['number'] = $params['num'];
  792. $post['target_user_id'] = $params['user_id'];
  793. $post['type'] = 2;
  794. CloudStockDispenseOrder::addData($post);
  795. } catch (\Exception $e) {
  796. return $this->error($e->getMessage());
  797. }
  798. $changes_dir = CloudStockEnum::CHANGE_TYPE_INCREASE_PLATFORM;
  799. } elseif ($params['changes_dir'] == CloudStockEnum::STOCK_CHANGE_SUB) {
  800. $changes_dir = CloudStockEnum::CHANGE_TYPE_DEDUTION_PLATFORM;
  801. } else {
  802. return $this->error("changes_dir错误");
  803. }
  804. if ($params['num'] < 1) {
  805. return $this->error('操作数量最小值为0');
  806. }
  807. $stock_params = [
  808. 'goods_id' => $params['goods_id'],
  809. 'number' => $params['num'],
  810. 'user_id' => $params['user_id'],
  811. 'order_id' => 0,
  812. ];
  813. $res_handle_stock = CloudStockGoodsStockLog::stockHandle($this->mall_id, $stock_params, $changes_dir);
  814. if (false === $res_handle_stock) return $this->error(CloudStockGoodsStockLog::getStaticError());
  815. CloudStockAgent::fixStock($this->mall_id,$params['user_id']);
  816. return $this->success('操作成功', $res_handle_stock);
  817. }
  818. }
  819. return $this->error();
  820. }
  821. public function actionSwitchRestriction()
  822. {
  823. if (\Yii::$app->request->isAjax) {
  824. if (\Yii::$app->request->isPost) {
  825. $params = \Yii::$app->request->post();
  826. $res = Yii::$app->services->validate->validate($params, [
  827. [['id'], 'required'],
  828. [['is_equal_award_restriction'], 'integer']
  829. ]);
  830. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  831. $params['mall_id'] = $this->mall_id;
  832. $res = CloudStockAgent::updateAll(['is_equal_award_restriction' => $params['is_equal_award_restriction']], ['id' => $params['id'], 'mall_id' => $this->mall_id]);
  833. if ($res == false) return $this->error(CloudStockAgent::getStaticError());
  834. return $this->success('操作成功');
  835. }
  836. }
  837. return $this->error();
  838. }
  839. }