GoodsController.php 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455
  1. <?php
  2. namespace addons\CloudStock\backend\controllers;
  3. use addons\CloudStock\common\models\CloudStockAgent;
  4. use addons\CloudStock\common\models\CloudStockAgentGuota;
  5. use addons\CloudStock\common\models\CloudStockGoods;
  6. use addons\CloudStock\common\models\CloudStockLevel;
  7. use addons\CloudStock\common\models\CouponSetting;
  8. use addons\Coupon\common\enums\AddonsCouponEnum;
  9. use addons\Coupon\common\models\AddonsCoupon;
  10. use common\enums\RabbitMqEnum;
  11. use common\enums\StatusEnum;
  12. use common\models\goods\Goods;
  13. use Yii;
  14. /**
  15. * 默认控制器
  16. *
  17. * Class DefaultController
  18. * @package addons\CloudStock\backend\controllers
  19. */
  20. class GoodsController extends BaseController
  21. {
  22. public $enableCsrfValidation = false;
  23. public function actionIndex()
  24. {
  25. if (\Yii::$app->request->isAjax) {
  26. $where[] = ['=', 'mall_id', $this->mall_id];
  27. $where[] = ['in', 'status', [StatusEnum::DISABLED, StatusEnum::ENABLED]];
  28. $params = [
  29. 'where' => $where, 'order' => 'sort asc,id desc'
  30. ];
  31. $page_data = CloudStockGoods::listPage($params,false);
  32. $level_list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]], 'order' => 'level asc', 'index' => 'level', 'select' => 'level,name']);
  33. if (!empty($page_data['list'])) {
  34. $goods_id_arr = array_column($page_data['list'], 'goods_id');
  35. $goods_arr = Goods::lists(['where' => [['id' => $goods_id_arr]], 'index' => 'id']);
  36. foreach ($page_data['list'] as &$item) {
  37. $item['goods_name'] = $item['price'] = $item['cover_pic'] = '';
  38. if ($goods_arr[$item['goods_id']]) {
  39. $item['goods_name'] = $goods_arr[$item['goods_id']]['goods_name'];
  40. $item['price'] = $goods_arr[$item['goods_id']]['price'];
  41. $item['cover_pic'] = $goods_arr[$item['goods_id']]['cover_pic'];
  42. }
  43. $equal_level_list_arr = json_decode($item['equal_level_list'], true);
  44. $fill_level_list_arr = json_decode($item['fill_level_list'], true);
  45. $agent_price_arr = json_decode($item['agent_price'], true);
  46. $over_level_list_arr = json_decode($item['over_level_list'], true);
  47. if (!empty($over_level_list_arr)) $over_level_list_arr = array_column($over_level_list_arr, null, 'level');
  48. $over_level_list_arr_2 = [];
  49. if(!empty($item['over_level_list_2'])){
  50. $over_level_list_arr_2 = json_decode($item['over_level_list_2'], true);
  51. if (!empty($over_level_list_arr_2)) $over_level_list_arr_2 = array_column($over_level_list_arr_2, null, 'level');
  52. }
  53. if (!empty($fill_level_list_arr)) $fill_level_list_arr = array_column($fill_level_list_arr, null, 'level');
  54. $equal_level_list_rows = [];
  55. if (!empty($equal_level_list_arr)) {
  56. foreach ($equal_level_list_arr as $val) {
  57. $equal_level_list_rows[$val['level'] . $val['config_key']] = $val;
  58. }
  59. }
  60. if (!empty($agent_price_arr)) $agent_price_arr = array_column($agent_price_arr, null, 'level');
  61. list($agent_price,$over_level_list,$over_level_list_2,$fill_level_list,$equal_level_list) = $this->formatDataIndex($level_list,$agent_price_arr,$over_level_list_arr,$over_level_list_arr_2,$fill_level_list_arr,$equal_level_list_rows);
  62. if(!empty($over_level_list_2)){
  63. $over_level_list_2_arr = array_column($over_level_list_2, null, 'level');
  64. }
  65. foreach ($over_level_list as &$value){
  66. $value['price2'] = $over_level_list_2_arr[$value['level']]['price']??0;
  67. }
  68. $item['agent_price'] = $agent_price;
  69. $item['over_level_list'] = $over_level_list;
  70. $item['over_level_list_2'] = $over_level_list_2;
  71. $item['fill_level_list'] = $fill_level_list;
  72. $item['equal_level_list'] = $equal_level_list;
  73. }
  74. }
  75. return $this->success('操作成功', $page_data);
  76. }
  77. return $this->render($this->action->id, []);
  78. }
  79. public function actionEdit()
  80. {
  81. try {
  82. $request = Yii::$app->request;
  83. if ($request->isAjax) {
  84. if ($request->isGet) {
  85. $id = Yii::$app->request->get('id', '');
  86. $data = CloudStockGoods::getOne([['id' => $id], ['mall_id' => $this->mall_id], ['status' => [StatusEnum::DISABLED, StatusEnum::ENABLED]]], true);
  87. if (!empty($data)) {
  88. $level_list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]], 'order' => 'level asc']);
  89. $data['agent_price'] = json_decode($data['agent_price'], true);
  90. $data['price_difference'] = json_decode($data['price_difference'], true);
  91. if (empty($data['price_difference'])) {
  92. $data['price_difference'] = [];
  93. }
  94. $agent_price_arr = array_column($data['agent_price'], null, 'level');
  95. $price_difference_arr = array_column($data['price_difference'], null, 'level');
  96. $data['equal_level_list'] = json_decode($data['equal_level_list'], true);
  97. $equal_level_list_rows = [];
  98. foreach ($data['equal_level_list'] as $val) {
  99. $equal_level_list_rows[$val['level'] . $val['config_key']] = $val;
  100. }
  101. $data['fill_level_list'] = json_decode($data['fill_level_list'], true);
  102. $fill_level_list_arr = array_column($data['fill_level_list'], null, 'level');
  103. $data['over_level_list'] = json_decode($data['over_level_list'], true);
  104. $over_level_list_arr = array_column($data['over_level_list'], null, 'level');
  105. $over_level_list_arr_2 = [];
  106. if(!empty($data['over_level_list_2'])){
  107. $data['over_level_list_2'] = json_decode($data['over_level_list_2'], true);
  108. $over_level_list_arr_2 = array_column($data['over_level_list_2'], null, 'level');
  109. }
  110. $monthly_purchase_arr= [];
  111. if(!empty($data['monthly_purchase'])){
  112. $data['monthly_purchase'] = json_decode($data['monthly_purchase'], true);
  113. $monthly_purchase_arr = array_column($data['monthly_purchase'], null, 'level');
  114. }
  115. $additional_purchase_restrictions_arr= [];
  116. if(!empty($data['additional_purchase_restrictions'])){
  117. $data['additional_purchase_restrictions'] = json_decode($data['additional_purchase_restrictions'], true);
  118. $additional_purchase_restrictions_arr = array_column($data['additional_purchase_restrictions'], null, 'level');
  119. }
  120. list($agent_price,$over_level_list,$over_level_list_2,$fill_level_list,$equal_level_list,$monthly_purchase,
  121. $additional_purchase_restrictions, $price_difference) = $this->formatData($level_list, $agent_price_arr, $over_level_list_arr, $over_level_list_arr_2, $fill_level_list_arr,
  122. $equal_level_list_rows, $monthly_purchase_arr, $additional_purchase_restrictions_arr, $price_difference_arr);
  123. $data['agent_price'] = $agent_price;
  124. $data['price_difference'] = $price_difference;
  125. $data['fill_level_list'] = $fill_level_list;
  126. $data['over_level_list'] = $over_level_list;
  127. $data['over_level_list_2'] = $over_level_list_2;
  128. $data['equal_level_list'] = $equal_level_list;
  129. $data['monthly_purchase'] = $monthly_purchase;
  130. $data['additional_purchase_restrictions'] = $additional_purchase_restrictions;
  131. $restrict_permissions = json_decode($data['restrict_permissions'],true);
  132. $data['restrict_permissions'] = !empty($restrict_permissions)?$restrict_permissions:[];
  133. }
  134. $goods = Goods::findOne(['id' => $data['goods_id']]);
  135. $data['goods_name'] = $goods['goods_name'];
  136. $data['cover_pic'] = $goods['cover_pic'];
  137. $data['price'] = $goods['price'];
  138. return $this->success('操作成功', $data);
  139. }
  140. if ($request->isPost) {
  141. $params = Yii::$app->request->post();
  142. $params['mall_id'] = $this->mall_id;
  143. $res = CloudStockGoods::setData($params);
  144. if ($res === false) return $this->error(CloudStockAgent::getStaticError());
  145. return $this->success('操作成功');
  146. }
  147. }
  148. } catch (\Exception $e) {
  149. return $this->error($e->getMessage(), []);
  150. }
  151. return $this->render('edit');
  152. }
  153. protected function formatDataIndex($level_list,$agent_price_arr,$over_level_list_arr,$over_level_list_arr_2,$fill_level_list_arr,$equal_level_list_rows){
  154. $agent_price = $over_level_list = $over_level_list_2 = $fill_level_list = $equal_level_list = [];
  155. foreach ($level_list as $val) {
  156. $row = [
  157. 'name' => $val['name'],
  158. 'level' => $val['level'],
  159. 'is_use' => 1,
  160. ];
  161. $row['price'] = $agent_price_arr[$val['level']]['price'] ?? 0;
  162. $row['price_list'] = $agent_price_arr[$val['level']]['price_list'] ?? [];
  163. $agent_price[] = $row;
  164. unset($row['price_list']);
  165. $row['price'] = $over_level_list_arr[$val['level']]['price'] ?? 0;
  166. $over_level_list[] = $row;
  167. $row['price'] = $over_level_list_arr_2[$val['level']]['price'] ?? 0;
  168. $over_level_list_2[] = $row;
  169. $row['price'] = $fill_level_list_arr[$val['level']]['price'] ?? 0;
  170. $fill_level_list[] = $row;
  171. $equal_key = 'a_equal_level_one';
  172. $row = [
  173. 'level_name' => $val['name'] . '平一级',
  174. 'level' => $val['level'],
  175. 'config_key' => $equal_key,
  176. 'config_value' => $equal_level_list_rows[$val['level'] . $equal_key]['config_value'] ?? 0,
  177. 'mall_id' => $val['mall_id'],
  178. 'is_use' => 1,
  179. ];
  180. $equal_level_list[] = $row;
  181. $equal_key = 'a_equal_level_two';
  182. $row = [
  183. 'level_name' => $val['name'] . '平二级',
  184. 'level' => $val['level'],
  185. 'config_key' => $equal_key,
  186. 'config_value' => $equal_level_list_rows[$val['level'] . $equal_key]['config_value'] ?? 0,
  187. 'mall_id' => $val['mall_id'],
  188. 'is_use' => 1,
  189. ];
  190. $equal_level_list[] = $row;
  191. }
  192. return [$agent_price,$over_level_list,$over_level_list_2,$fill_level_list,$equal_level_list];
  193. }
  194. protected function formatData($level_list, $agent_price_arr, $over_level_list_arr, $over_level_list_arr_2, $fill_level_list_arr
  195. , $equal_level_list_rows, $monthly_purchase_arr, $additional_purchase_restrictions_arr, $price_difference_arr)
  196. {
  197. $agent_price = $over_level_list = $over_level_list_2 = $fill_level_list = $equal_level_list = $monthly_purchase = $additional_purchase_restrictions= [];
  198. $price_difference = [];
  199. foreach ($level_list as $val) {
  200. $row = [
  201. 'name' => $val['name'],
  202. 'level' => $val['level'],
  203. 'is_use' => 1,
  204. ];
  205. $row['price'] = $agent_price_arr[$val['level']]['price'] ?? 0;
  206. $row['price_list'] = $agent_price_arr[$val['level']]['price_list'] ?? [];
  207. $agent_price[] = $row;
  208. unset($row['price_list']);
  209. $row['price'] = $over_level_list_arr[$val['level']]['price'] ?? 0;
  210. $over_level_list[] = $row;
  211. $row['price'] = $over_level_list_arr_2[$val['level']]['price'] ?? 0;
  212. $over_level_list_2[] = $row;
  213. $row['price'] = $fill_level_list_arr[$val['level']]['price'] ?? 0;
  214. $fill_level_list[] = $row;
  215. $equal_key = 'a_equal_level_one';
  216. $row = [
  217. 'level_name' => $val['name'] . '平一级',
  218. 'level' => $val['level'],
  219. 'config_key' => $equal_key,
  220. 'config_value' => $equal_level_list_rows[$val['level'] . $equal_key]['config_value'] ?? 0,
  221. 'mall_id' => $val['mall_id'],
  222. 'is_use' => 1,
  223. ];
  224. $equal_level_list[] = $row;
  225. $equal_key = 'a_equal_level_two';
  226. $row = [
  227. 'level_name' => $val['name'] . '平二级',
  228. 'level' => $val['level'],
  229. 'config_key' => $equal_key,
  230. 'config_value' => $equal_level_list_rows[$val['level'] . $equal_key]['config_value'] ?? 0,
  231. 'mall_id' => $val['mall_id'],
  232. 'is_use' => 1,
  233. ];
  234. $equal_level_list[] = $row;
  235. $row = [
  236. 'name' => $val['name'],
  237. 'level' => $val['level'],
  238. 'is_use' => 1,
  239. ];
  240. $row['nums'] = $monthly_purchase_arr[$val['level']]['nums'] ?? 0;
  241. $monthly_purchase[] = $row;
  242. $row = [
  243. 'name' => $val['name'],
  244. 'level' => $val['level'],
  245. 'is_use' => 1,
  246. ];
  247. $row['nums'] = $additional_purchase_restrictions_arr[$val['level']]['nums'] ?? 0;
  248. $additional_purchase_restrictions[] = $row;
  249. $price_difference[] = [
  250. 'name' => $val['name'],
  251. 'level' => $val['level'],
  252. 'is_use' => 1,
  253. 'price' => $price_difference_arr[$val['level']]['price'] ?? 0
  254. ];
  255. }
  256. return [$agent_price, $over_level_list, $over_level_list_2, $fill_level_list, $equal_level_list, $monthly_purchase, $additional_purchase_restrictions, $price_difference];
  257. }
  258. //不用验证权限
  259. public function actionGetSingleGoodsList()
  260. {
  261. $params = Yii::$app->request->get();
  262. $where[] = ['=', 'mall_id', $this->mall_id];
  263. $where[] = ['=', 'is_attr', 0];
  264. $where[] = ['=', 'is_on_sale', 1];
  265. $where[] = ['>', 'stock', 0];
  266. $where[] = ['in', 'status', [StatusEnum::DISABLED, StatusEnum::ENABLED]];
  267. if(isset($params['keyword']) && $params['keyword'] !== '') {
  268. $keyword = trim($params['keyword']);
  269. $goodsNameWhere = ['like','goods_name',$keyword,false];
  270. if (is_numeric($keyword)) {
  271. $where[] = ['or', $goodsNameWhere, ['=', 'id', $keyword]];
  272. } else {
  273. $where[] = $goodsNameWhere;
  274. }
  275. }
  276. $params['where'] = $where;
  277. $params['order'] = 'id desc';
  278. $params['select'] = 'id,goods_name,cover_pic,price';
  279. $page_data = Goods::listPage($params, false);
  280. return $this->success('操作成功', $page_data);
  281. }
  282. public function actionPatch()
  283. {
  284. $request = Yii::$app->request;
  285. if ($request->isAjax) {
  286. if ($request->isPost) {
  287. $params = $request->post();
  288. CloudStockGoods::patch($params);
  289. return $this->success('操作成功');
  290. }
  291. }
  292. }
  293. public function actionDelete(){
  294. $post = Yii::$app->request->post();
  295. CloudStockGoods::updateAll(['status'=>StatusEnum::DELETE],['id'=>$post['id'],'mall_id'=>$this->mall_id]);
  296. $goods = CloudStockGoods::findOne(['id'=>$post['id']]);
  297. if(!empty($goods)){
  298. $data = ['goods_id'=>$goods['goods_id'],'mall_id'=>$this->mall_id];
  299. \Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, $data, CloudStockAgentGuota::class, 'computeByGoodsDel');
  300. }
  301. return $this->success('操作成功');
  302. }
  303. public function actionGetCloudStockGoodsList(){
  304. $where[] = ['=', 'mall_id', $this->mall_id];
  305. $where[] = ['in', 'status', [StatusEnum::DISABLED, StatusEnum::ENABLED]];
  306. $params = [
  307. 'where' => $where, 'order' => 'id desc','select'=>'id,goods_id'
  308. ];
  309. $page_data = CloudStockGoods::listPage($params, false,true);
  310. if(!empty($page_data['list'])){
  311. $goods_id_arr = array_column($page_data['list'],'goods_id');
  312. $goods_arr = Goods::lists(['where'=>[['id'=>$goods_id_arr]],'index'=>'id']);
  313. foreach ($page_data['list'] as &$item){
  314. $item['goods_name'] = $item['cover_pic'] = '';
  315. if(!empty($goods_arr[$item['goods_id']])){
  316. $item['goods_name'] = $goods_arr[$item['goods_id']]['goods_name'];
  317. $item['cover_pic'] = $goods_arr[$item['goods_id']]['cover_pic'];
  318. $item['cost_price'] = $goods_arr[$item['goods_id']]['cost_price'];
  319. $item['stock'] = $goods_arr[$item['goods_id']]['stock'];
  320. $item['id'] = $item['goods_id'];
  321. }
  322. }
  323. }
  324. return $this->success('操作成功', $page_data);
  325. }
  326. /**
  327. * 获取优惠券的设置
  328. * @return mixed|void
  329. */
  330. public function actionGetCouponSetting()
  331. {
  332. $params = Yii::$app->request->post();
  333. $data = [];
  334. $goods = CloudStockGoods::findOne(['goods_id'=>$params['goods_id'],'status' => StatusEnum::ENABLED]);
  335. // 获取配置
  336. $result = CouponSetting::find()->where([ 'mall_id' => $this->mall_id,'goods_id' => $params['goods_id']])->indexBy('level')->asArray()->all();
  337. $coupon_id_arr = [-1];
  338. if(empty($result) == false){
  339. foreach ($result as $key=>$item) {
  340. $coupon_setting = $item['coupon_setting']?json_decode($item['coupon_setting'],true):[];
  341. if(empty($coupon_setting) == false){
  342. $coupon_ids = array_column($coupon_setting,'coupon_id');
  343. $coupon_id_arr = array_merge($coupon_id_arr,$coupon_ids);
  344. }
  345. $result[$key]['coupon_setting'] = $coupon_setting;
  346. }
  347. }
  348. $params = [];
  349. $params['where'][] = ['mall_id' => $this->mall_id];
  350. $params['where'][] = ['status' => [StatusEnum::ENABLED]];
  351. $params['where'][] = ['in','id' ,$coupon_id_arr];
  352. $params['order'] = 'sort asc,id desc';
  353. $params['select'] = 'id,name,type,discount,min_price,sub_price,expire_type,expire_day,begin_at,end_at,status,total_count';
  354. $list = AddonsCoupon::lists($params);
  355. $list = empty($list)?[]:array_column($list,null,'id');
  356. $level_list = CloudStockLevel::lists(['where' => [['mall_id' => $this->mall_id], ['status' => StatusEnum::ENABLED]],'order'=>'level asc']);
  357. // 重新组合数组
  358. $data['is_buhuo'] = $goods['is_buhuo'];
  359. $data['is_peihuo'] = $goods['is_peihuo'];
  360. $data['coupon_data'] = [];
  361. foreach ($level_list as $level){
  362. $item = [];
  363. $item['level'] = $level['level'];
  364. $item['level_name'] = $level['name'];
  365. if(isset($result[$level['level']])){
  366. $item['num'] = $result[$level['level']]['num'];
  367. $coupon_setting = $result[$level['level']]['coupon_setting'];
  368. if(empty($coupon_setting) == false && empty($list) == false){
  369. foreach ($coupon_setting as $key=>$coupon){
  370. if(isset($list[$coupon['coupon_id']])){
  371. $list_item = $list[$coupon['coupon_id']];
  372. $coupon_setting[$key] = [
  373. 'discount_method' => $list_item['type'] == 1 ? $list_item['discount'] . '折' : $list_item['sub_price'] . '元',
  374. 'name' => $list_item['name'],
  375. 'num' => $coupon['num'],
  376. 'relevant_id' => $coupon['coupon_id'],
  377. ];
  378. }else{
  379. unset($coupon_setting[$key]);
  380. }
  381. }
  382. }
  383. $item['multiple_selection'] = $coupon_setting;
  384. }else{
  385. $item['num'] = 0;
  386. $item['multiple_selection'] = [];
  387. }
  388. $data['coupon_data'][] = $item;
  389. }
  390. return $this->success('操作成功', $data);
  391. }
  392. /**
  393. * 设置优惠券设配置
  394. * @return mixed|void
  395. */
  396. public function actionSetSetting()
  397. {
  398. $params = Yii::$app->request->post();
  399. if($params['goods_id'] <= 0){
  400. return $this->error('缺少商品参数.');
  401. }
  402. $data = [];
  403. $goods = CloudStockGoods::findOne(['goods_id'=>$params['goods_id'],'status' => StatusEnum::ENABLED]);
  404. $t = Yii::$app->db->beginTransaction();
  405. $time = time();
  406. $goods->is_buhuo = $params['is_buhuo'];
  407. $goods->is_peihuo = $params['is_peihuo'];
  408. $goods->updated_at = $time;
  409. $res = $goods->save();
  410. if(!$res) {
  411. $t->rollBack();
  412. return $this->error('数据保存失败,请稍后再试.');
  413. }
  414. $res = CouponSetting::setData(['goods_id'=>$params['goods_id'],'mall_id'=>$this->mall_id],$params['coupon_data']);
  415. if(!$res){
  416. $t->rollBack();
  417. return $this->error(CouponSetting::getStaticError());
  418. }
  419. $t->commit();
  420. return $this->success('操作成功', $data);
  421. }
  422. }