CashController.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. <?php
  2. namespace addons\Happiness\client\controllers;
  3. use addons\Happiness\common\enums\HappinessEnum;
  4. use addons\Happiness\common\models\HappinessStore;
  5. use addons\Happiness\common\models\HappinessCashierOrder;
  6. use addons\Happiness\common\models\HappinessStoreMiniCode;
  7. use addons\Happiness\common\service\CashierService;
  8. use addons\Happiness\common\service\GoodsService;
  9. use common\components\export\CsvTool;
  10. use common\enums\StatusEnum;
  11. use common\helpers\MiniQrCode;
  12. use common\models\mall\MallHost;
  13. use common\models\user\User;
  14. use Yii;
  15. class CashController extends BaseController
  16. {
  17. /**
  18. * 收银台首页
  19. * @Author bing
  20. * @DateTime 2022-04-26 18:03:16
  21. * @return void
  22. * @copyright: Copyright (c) 2022 广东七件事集团
  23. */
  24. public function actionIndex()
  25. {
  26. if (\Yii::$app->request->isAjax) {
  27. if (\Yii::$app->request->isGet) {
  28. $store = HappinessStore::findOne(['id' => $this->store_id]);
  29. $data['store_id'] = $store['id'];
  30. $data['export_url'] = \Yii::$app->request->hostInfo . '?r=store/client/cash/cashier-log';
  31. $H5Url = MallHost::getHost($this->mall_id,'h5_url');
  32. $sign = $this->mall['mall_sign']??'';
  33. $data['cashier_url'] = $H5Url.'/#/customDesigns/Happiness/pay/cashRegister?store_id='.$store['id'].'&sign='
  34. .$sign;
  35. return $this->success('ok', $data);
  36. } else {
  37. $params = \Yii::$app->request->post('form');
  38. $params['mall_id'] = $this->mall_id;
  39. $params['id'] = $this->store_id;
  40. $res = HappinessStore::setData($params);
  41. if ($res == false) return $this->error(HappinessStore::getStaticError());
  42. return $this->success('操作成功');
  43. }
  44. }
  45. return $this->render($this->action->id);
  46. }
  47. public function actionCashierLog()
  48. {
  49. if (\Yii::$app->request->isAjax) {
  50. if (\Yii::$app->request->isGet) {
  51. $params = \Yii::$app->request->get();
  52. $where[] = ['mall_id' => $this->mall_id];
  53. $where[] = ['store_id' => $this->store_id];
  54. $where[] = ['pay_status' => 1];
  55. $where[] = ['status' => StatusEnum::ENABLED];
  56. if (!empty($params['keyword'])) {
  57. $user_list = User::lists(['where' => [['mall_id' => $this->mall_id], [
  58. 'or',
  59. ['like', 'username', $params['keyword']],
  60. ['like', 'nickname', $params['keyword']],
  61. ]], 'select' => 'id']);
  62. $user_ids = array_column($user_list, 'id');
  63. $where[] = ['in', 'user_id', $user_ids];
  64. }
  65. if (!empty($params['start'])) $where[] = ['>=', 'pay_time', strtotime($params['start'])];
  66. if (!empty($params['end'])) $where[] = ['<=', 'pay_time', strtotime($params['end'])];
  67. if (!empty($params['min'])) $where[] = ['>=', 'pay_money', $params['min']];
  68. if (!empty($params['max'])) $where[] = ['<=', 'pay_money', $params['max']];
  69. $params['where'] = $where;
  70. $params['order'] = 'id desc';
  71. $params['with'] = ['user','detail'];
  72. $params['limit'] = $params['limit'] ?? $this->pageSize;
  73. $page_data = HappinessCashierOrder::listPage($params);
  74. if ($page_data === false) return $this->error(HappinessCashierOrder::getStaticError());
  75. if (!empty($page_data['list'])) {
  76. foreach ($page_data['list'] as &$item) {
  77. $extra = json_decode($item['extra'], true);
  78. $item['extra'] = '';
  79. $item['commission'] = 0;
  80. if ($extra) {
  81. $is_score_deduct = 0;
  82. $discount_money = 0;
  83. foreach ($extra as $k => $v) {
  84. if ($v) {
  85. switch ($k) {
  86. case "member_deduct_money":
  87. $item['extra'] .= '会员价优惠:' . $v;
  88. break;
  89. case "deduct_num_score":
  90. $is_score_deduct = 1;
  91. break;
  92. case "discount_money":
  93. $discount_money = $v;
  94. // $item['extra'] .= ' 优惠:' . $v;
  95. break;
  96. case "agent_commission":
  97. $item['commission']+=$v;
  98. // $item['extra'] .= ' 渠道分红:' . $v;
  99. break;
  100. case "distribution_commission":
  101. //case "boss_commission":
  102. case "store_boss_commission":
  103. $item['commission']+=$v;
  104. // $item['extra'] .= ' 分销分红:' . $v;
  105. break;
  106. case "area_commission":
  107. $item['commission'] += $v;
  108. // $item['extra'] .= ' 区域分红:' . $v;
  109. break;
  110. case "double_copy_commission":
  111. $item['commission'] += $v;
  112. break;
  113. }
  114. }
  115. }
  116. if($is_score_deduct){
  117. $item['extra'] .= ',积分抵扣优惠:' . $discount_money;
  118. }else{
  119. $item['extra'] .= ',优惠券优惠:' . $discount_money;
  120. }
  121. $item['extra'] = trim($item['extra'] ,',');
  122. $item['commission'] = bcadd($item['commission'],0,2);
  123. }
  124. }
  125. }
  126. $page_data['export_list'] = HappinessCashierOrder::fieldsList();
  127. return $this->success('ok', $page_data);
  128. }
  129. }
  130. if (\Yii::$app->request->post('flag') == 'EXPORT') {
  131. $params = \Yii::$app->request->post();
  132. $params['mall_id'] = $this->mall_id;
  133. $params['store_id'] = $this->store_id;
  134. $filename = '幸福小店收银台订单列表-' . date('YmdHis') . '_' . rand(10000, 99999);
  135. $model = HappinessCashierOrder::find();
  136. $model->where(['mall_id' => $params['mall_id']]);
  137. $model->andWhere(['store_id' => $params['store_id']]);
  138. $model->andWhere(['pay_status' => 1]);
  139. if (!empty($params['start'])) $model->andWhere(['>=', 'pay_time', strtotime($params['start'])]);
  140. if (!empty($params['end'])) $model->andWhere(['<=', 'pay_time', strtotime($params['end'])]);
  141. if (!empty($params['min'])) $model->andWhere(['>=', 'pay_money', $params['min']]);
  142. if (!empty($params['max'])) $model->andWhere(['<=', 'pay_money', $params['max']]);
  143. if (!empty($params['keyword'])) {
  144. $user_list = User::lists(['where' => [['mall_id' => $params['mall_id']], [
  145. 'or',
  146. ['like', 'username', $params['keyword']],
  147. ['like', 'nickname', $params['keyword']],
  148. ]], 'select' => 'id']);
  149. $user_ids = array_column($user_list, 'id');
  150. $model->andWhere(['in', 'user_id', $user_ids]);
  151. }
  152. $model->with(['user']);
  153. $fields = $params['fields'];
  154. $fields = explode(',',$fields);
  155. $fields_arr = HappinessCashierOrder::fieldsList();
  156. $have_select_field_arr = [];
  157. foreach ($fields as $value) {
  158. $have_select_field_arr[] = $fields_arr[$value];
  159. }
  160. $csv = new CsvTool();
  161. $csv->filename = $filename;
  162. $csv->export_mode = CsvTool::EXPORT_MODE_SYNC;
  163. $csv->header = $have_select_field_arr;
  164. $orders = $model->all();
  165. empty($csv->header) && $csv->header = array_keys($orders[0]);
  166. $data = [];
  167. foreach ($orders as $order){
  168. $row = [];
  169. foreach ($fields as $field) {
  170. if ($field == 'nickname') {
  171. $row[] = $order['user']['nickname'];
  172. } else if ($field == 'extra') {
  173. $extra = json_decode($order['extra'], true);
  174. $extra_content = '';
  175. $is_score_deduct = 0;
  176. $discount_money = 0;
  177. if ($extra) {
  178. foreach ($extra as $k => $v) {
  179. if ($v) {
  180. switch ($k) {
  181. case "member_deduct_money":
  182. $extra_content .= ',会员价优惠:' . $v;
  183. break;
  184. case "deduct_num_score":
  185. $is_score_deduct = 1;
  186. break;
  187. case "discount_money":
  188. $discount_money = $v;
  189. // $extra_content .= ' 优惠:' . $v;
  190. break;
  191. case "agent_commission":
  192. $extra_content .= ',渠道分红:' . $v;
  193. break;
  194. case "distribution_commission":
  195. $extra_content .= ',分销分红:' . $v;
  196. break;
  197. case "boss_commission":
  198. $extra_content .= ',股东分红:' . $v;
  199. break;
  200. case "store_boss_commission":
  201. $extra_content .= ',门店股东分红:' . $v;
  202. break;
  203. }
  204. }
  205. }
  206. if($is_score_deduct){
  207. $extra_content .= ',积分抵扣优惠:' . $discount_money;
  208. }else{
  209. $extra_content .= ',优惠券优惠:' . $discount_money;
  210. }
  211. }
  212. $row[] = trim($extra_content,',');
  213. } else if ($field == 'pay_time') {
  214. $row[] = !empty($order['pay_time']) ? date('Y-m-d H:i:s', $order['pay_time']) : '';
  215. } else {
  216. if ((isset($order[$field]))) $row[] = $order[$field];
  217. }
  218. }
  219. $data[]=$row;
  220. }
  221. $csv->data = $data;
  222. $csv->export();
  223. }
  224. }
  225. public function actionShowMiniPromotionCode(){
  226. $request = \Yii::$app->request;
  227. if ($request->isAjax) {
  228. if ($request->isPost) {
  229. $params = \Yii::$app->request->post();
  230. // 检查提交的参数
  231. $res = \Yii::$app->services->validate->validate($params,[
  232. [['type'], 'required'],
  233. ]);
  234. if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  235. $store = HappinessStore::findOne(['mall_id'=>$this->mall_id,'id'=>$this->store_id]);
  236. if(empty($store)) return $this->error('店铺不存在');
  237. $model = HappinessStoreMiniCode::findOne(['store_id'=>$store['id'],'mall_id'=>$this->mall_id,'type'=>$params['type']]);
  238. if(empty($model)){
  239. $mall = $this->mall;
  240. $content = [
  241. 'mall_id'=>$this->mall_id,
  242. 'store_id'=>$store['id'],
  243. 'mall_sign'=>$mall['mall_sign'],
  244. 'type'=>$params['type'],
  245. ];
  246. $content = json_encode($content);
  247. if($params['type']==1){
  248. $page = 'customDesigns/Happiness/shopPagesUI';
  249. }else{
  250. $page = '/customDesigns/Happiness/pay/cashRegister';
  251. }
  252. $code = md5($content);
  253. $obj = new MiniQrCode();
  254. $applet_code = $obj->getAppletQrCode($this->mall_id,$page,$code);
  255. $params['mall_id'] = $this->mall_id;
  256. $params['code'] = $code;
  257. $params['store_id'] = $store['id'];
  258. $params['content'] = $content;
  259. $params['applet_code'] = $applet_code;
  260. $model = HappinessStoreMiniCode::setData($params);
  261. }
  262. $applet_url = $model['applet_code'];
  263. $this->success('获取成功',['applet_url'=>$applet_url]);
  264. }
  265. }
  266. }
  267. public function actionSearchGoodsData()
  268. {
  269. $request = Yii::$app->request;
  270. try {
  271. if ($request->isAjax && $request->isGet) {
  272. $get = $request->get();
  273. $res = Yii::$app->services->validate->validate($get, [
  274. [['keyword','label_id'], 'string'],
  275. ]);
  276. if (!$res) throw new \Exception(Yii::$app->services->validate->getErrorMessage());
  277. $info = (new GoodsService(['mall_id' => $this->mall_id, 'store_id' => $this->store_id]))->searchStoreGoodsData($get);
  278. //获取标签
  279. $goods_label= \Yii::$app->services->setting->addons->get($this->mall_id, HappinessEnum::ADDONS_NAME, 'basic.goods_label');
  280. $goods_label = empty($goods_label) ? [] : json_decode($goods_label,true);
  281. $goods_label_name=array_column($goods_label,null,'level');
  282. if(!empty($info['list']))
  283. {
  284. $newList=[];
  285. foreach ($info['list'] as $item) {
  286. $oData=$item;
  287. unset($oData['yunAttr']);
  288. $oData['cats']=$oData['yunGoods']['cats'];
  289. unset($oData['yunGoods']);
  290. foreach ($item['yunAttr'] as $attr)
  291. {
  292. $newItem['cats']=$oData['cats'];
  293. $newItem['goods_id']=$attr['goods_id'];
  294. $newItem['id']=$attr['attr_id'];
  295. $newItem['goods_name']=$oData['goods_name'].'-'.$attr['attr']['name'];
  296. $newItem['price']=$attr['attr']['price'];
  297. $newItem['stock']=$attr['stock'];
  298. $newItem['cover_pic']=!empty($attr['attr']['pic_url'])
  299. ?$attr['attr']['pic_url']:$item['cover_pic'];
  300. $newItem['buy_num']=1;
  301. $newItem['max_income']=bcmul($attr['price'],bcdiv($item['store_scale'],100,4),2);
  302. $newItem['label_name']=isset($goods_label_name[$item['label_id']])?$goods_label_name[$item['label_id']]['name']:'';
  303. $newList[]=$newItem;
  304. }
  305. }
  306. $info['list']=$newList;
  307. }
  308. if(!empty($goods_label))
  309. {
  310. foreach ($goods_label as &$item)
  311. {
  312. $item['name']=$item['name'].'('.$item['income_start'].'%-'.$item['income_end'].'%)';
  313. }
  314. }
  315. $info['goods_label']=$goods_label;
  316. return $this->success('获取成功', $info);
  317. }
  318. } catch (\Exception $e) {
  319. return $this->error($e->getMessage());
  320. }
  321. }
  322. public function actionConfirmGoods()
  323. {
  324. $request = Yii::$app->request;
  325. try {
  326. if ($request->isAjax && $request->isPost) {
  327. $post = $request->post();
  328. //获得商品
  329. $id=$post['order_id'];
  330. $goods_list=$post['goods_list'];
  331. if(empty($id))
  332. {
  333. return $this->error('请选择订单');
  334. }
  335. if(empty($goods_list))
  336. {
  337. return $this->error('请选择商品');
  338. }
  339. $order=HappinessCashierOrder::findOne(['id'=>$id,'mall_id'=>$this->mall_id,'store_id'=>$this->store_id]);
  340. if(empty($order))
  341. {
  342. return $this->error('订单不存在');
  343. }
  344. if($order['pay_status']!=StatusEnum::ENABLED)
  345. {
  346. return $this->error('订单未支付');
  347. }
  348. //扣除商品库存和返还提货券
  349. $casherService=new CashierService();
  350. $res=$casherService->createDetail($id,$goods_list);
  351. if(!$res)
  352. {
  353. return $this->error($casherService->getError());
  354. }
  355. $res=$casherService->settle($id);
  356. if(!$res)
  357. {
  358. return $this->error($casherService->getError());
  359. }
  360. return $this->success('操作成功');
  361. }
  362. } catch (\Exception $e) {
  363. return $this->error($e->getMessage());
  364. }
  365. }
  366. }