CashController.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358
  1. <?php
  2. namespace addons\Store\client\controllers;
  3. use addons\Coupon\common\enums\AddonsCouponEnum;
  4. use addons\Coupon\common\models\AddonsCoupon;
  5. use addons\Store\common\models\Store;
  6. use addons\Store\common\models\StoreCashierExtra;
  7. use addons\Store\common\models\StoreCashierOrder;
  8. use addons\Store\common\models\StoreMiniCode;
  9. use addons\Store\common\models\StoreSettings;
  10. use addons\Store\common\models\StoreStatistics;
  11. use addons\Store\common\models\StoreWithdrawLog;
  12. use common\components\export\CsvTool;
  13. use common\enums\AddonsEnum;
  14. use common\enums\DownloadEnum;
  15. use common\enums\StatusEnum;
  16. use common\helpers\csv\CsvExportHelper;
  17. use common\helpers\MiniQrCode;
  18. use common\models\common\CapitalLog;
  19. use common\models\mall\MallAddons;
  20. use common\models\mall\MallHost;
  21. use common\models\order\OrderDetail;
  22. use common\models\user\User;
  23. use common\models\user\UserLevel;
  24. use yii\db\Expression;
  25. class CashController extends BaseController
  26. {
  27. /**
  28. * 收银台首页
  29. * @Author bing
  30. * @DateTime 2022-04-26 18:03:16
  31. * @return void
  32. * @copyright: Copyright (c) 2022 广东七件事集团
  33. */
  34. public function actionIndex()
  35. {
  36. if (\Yii::$app->request->isAjax) {
  37. if (\Yii::$app->request->isGet) {
  38. $store = Store::findOne(['id' => $this->store_id]);
  39. $data['store_id'] = $store['id'];
  40. $data['scan_code_bind'] = $store['scan_code_bind'];
  41. $data['export_url'] = \Yii::$app->request->hostInfo . '?r=store/client/cash/cashier-log';
  42. $H5Url = MallHost::getHost($this->mall_id,'h5_url');
  43. $sign = $this->mall['mall_sign']??'';
  44. $data['cashier_url'] = $H5Url.'/#/plugins2/Store/pay/cashRegister?store_id='.$store['id'].'&sign='.$sign;
  45. $data['scan_code_bind'] = $store['scan_code_bind'];
  46. $extra = StoreCashierExtra::findOne([
  47. 'store_id' => $this->store_id,
  48. 'status' => 1,
  49. ]);
  50. $store_setting = StoreSettings::findOne([
  51. 'store_id' => $this->store_id,
  52. 'status' => 1,
  53. ]);
  54. if($extra){
  55. $score_give_setting = json_decode($extra['score_give_setting'],true);
  56. $score_deduct_setting = json_decode($extra['score_deduct_setting'],true);
  57. $data['score_give_setting'] = $score_give_setting?$score_give_setting:'';
  58. $data['score_deduct_setting'] = $score_deduct_setting?$score_deduct_setting:'';
  59. $data['preferential_deduction'] = $extra['preferential_deduction'];
  60. $data['preferential_gift'] = $extra['preferential_gift'];
  61. }
  62. $data['is_preferential_gift'] = $store_setting['is_preferential_gift']??0;
  63. return $this->success('ok', $data);
  64. } else {
  65. $params = \Yii::$app->request->post('form');
  66. $params['mall_id'] = $this->mall_id;
  67. $params['id'] = $this->store_id;
  68. $res = Store::setData($params);
  69. if ($res == false) return $this->error(Store::getStaticError());
  70. $params['score_give_setting'] = json_encode($params['score_give_setting']);
  71. $params['score_deduct_setting'] = json_encode($params['score_deduct_setting']);
  72. $params['currency_deduct_setting'] = json_encode([]);
  73. $params['member_price_setting'] = json_encode([]);
  74. $params['member_buy_limit_setting'] = json_encode([]);
  75. $res = StoreCashierExtra::setData($this->store_id,$params);
  76. if ($res == false) return $this->error(StoreCashierExtra::getStaticError());
  77. return $this->success('操作成功');
  78. }
  79. }
  80. return $this->render($this->action->id);
  81. }
  82. public function actionCashierLog()
  83. {
  84. if (\Yii::$app->request->isAjax) {
  85. if (\Yii::$app->request->isGet) {
  86. $params = \Yii::$app->request->get();
  87. $where[] = ['mall_id' => $this->mall_id];
  88. $where[] = ['store_id' => $this->store_id];
  89. $where[] = ['pay_status' => 1];
  90. $where[] = ['status' => StatusEnum::ENABLED];
  91. if (!empty($params['keyword'])) {
  92. $user_list = User::lists(['where' => [['mall_id' => $this->mall_id], [
  93. 'or',
  94. ['like', 'username', $params['keyword']],
  95. ['like', 'nickname', $params['keyword']],
  96. ]], 'select' => 'id']);
  97. $user_ids = array_column($user_list, 'id');
  98. $where[] = ['in', 'user_id', $user_ids];
  99. }
  100. if (!empty($params['start'])) $where[] = ['>=', 'pay_time', strtotime($params['start'])];
  101. if (!empty($params['end'])) $where[] = ['<=', 'pay_time', strtotime($params['end'])];
  102. if (!empty($params['min'])) $where[] = ['>=', 'pay_money', $params['min']];
  103. if (!empty($params['max'])) $where[] = ['<=', 'pay_money', $params['max']];
  104. $params['where'] = $where;
  105. $params['order'] = 'id desc';
  106. $params['with'] = ['user'];
  107. $params['limit'] = $params['limit'] ?? $this->pageSize;
  108. $page_data = StoreCashierOrder::listPage($params);
  109. if ($page_data === false) return $this->error(StoreWithdrawLog::getStaticError());
  110. if (!empty($page_data['list'])) {
  111. foreach ($page_data['list'] as &$item) {
  112. $extra = json_decode($item['extra'], true);
  113. $item['extra'] = '';
  114. $item['commission'] = 0;
  115. if ($extra) {
  116. $is_score_deduct = 0;
  117. $discount_money = 0;
  118. foreach ($extra as $k => $v) {
  119. if ($v) {
  120. switch ($k) {
  121. case "member_deduct_money":
  122. $item['extra'] .= '会员价优惠:' . $v;
  123. break;
  124. case "deduct_num_score":
  125. $is_score_deduct = 1;
  126. break;
  127. case "discount_money":
  128. $discount_money = $v;
  129. // $item['extra'] .= ' 优惠:' . $v;
  130. break;
  131. case "agent_commission":
  132. $item['commission']+=$v;
  133. // $item['extra'] .= ' 渠道分红:' . $v;
  134. break;
  135. case "distribution_commission":
  136. //case "boss_commission":
  137. case "store_boss_commission":
  138. $item['commission']+=$v;
  139. // $item['extra'] .= ' 分销分红:' . $v;
  140. break;
  141. case "area_commission":
  142. $item['commission'] += $v;
  143. // $item['extra'] .= ' 区域分红:' . $v;
  144. break;
  145. case "double_copy_commission":
  146. $item['commission'] += $v;
  147. break;
  148. }
  149. }
  150. }
  151. if($is_score_deduct){
  152. $item['extra'] .= ',积分抵扣优惠:' . $discount_money;
  153. }else{
  154. $item['extra'] .= ',优惠券优惠:' . $discount_money;
  155. }
  156. $item['extra'] = trim($item['extra'] ,',');
  157. $item['commission'] = bcadd($item['commission'],0,2);
  158. }
  159. }
  160. }
  161. $page_data['export_list'] = StoreCashierOrder::fieldsList();
  162. return $this->success('ok', $page_data);
  163. }
  164. }
  165. if (\Yii::$app->request->post('flag') == 'EXPORT') {
  166. $params = \Yii::$app->request->post();
  167. $params['mall_id'] = $this->mall_id;
  168. $params['store_id'] = $this->store_id;
  169. $filename = 'o2o门店收银台订单列表-' . date('YmdHis') . '_' . rand(10000, 99999);
  170. $model = StoreCashierOrder::find();
  171. $model->where(['mall_id' => $params['mall_id']]);
  172. $model->andWhere(['store_id' => $params['store_id']]);
  173. $model->andWhere(['pay_status' => 1]);
  174. if (!empty($params['start'])) $model->andWhere(['>=', 'pay_time', strtotime($params['start'])]);
  175. if (!empty($params['end'])) $model->andWhere(['<=', 'pay_time', strtotime($params['end'])]);
  176. if (!empty($params['min'])) $model->andWhere(['>=', 'pay_money', $params['min']]);
  177. if (!empty($params['max'])) $model->andWhere(['<=', 'pay_money', $params['max']]);
  178. if (!empty($params['keyword'])) {
  179. $user_list = User::lists(['where' => [['mall_id' => $params['mall_id']], [
  180. 'or',
  181. ['like', 'username', $params['keyword']],
  182. ['like', 'nickname', $params['keyword']],
  183. ]], 'select' => 'id']);
  184. $user_ids = array_column($user_list, 'id');
  185. $model->andWhere(['in', 'user_id', $user_ids]);
  186. }
  187. $model->with(['user']);
  188. $fields = $params['fields'];
  189. $fields = explode(',',$fields);
  190. $fields_arr = StoreCashierOrder::fieldsList();
  191. $have_select_field_arr = [];
  192. foreach ($fields as $value) {
  193. $have_select_field_arr[] = $fields_arr[$value];
  194. }
  195. $csv = new CsvTool();
  196. $csv->filename = $filename;
  197. $csv->export_mode = CsvTool::EXPORT_MODE_SYNC;
  198. $csv->header = $have_select_field_arr;
  199. $orders = $model->all();
  200. empty($csv->header) && $csv->header = array_keys($orders[0]);
  201. $data = [];
  202. foreach ($orders as $order){
  203. $row = [];
  204. foreach ($fields as $field) {
  205. if ($field == 'nickname') {
  206. $row[] = $order['user']['nickname'];
  207. } else if ($field == 'extra') {
  208. $extra = json_decode($order['extra'], true);
  209. $extra_content = '';
  210. $is_score_deduct = 0;
  211. $discount_money = 0;
  212. if ($extra) {
  213. foreach ($extra as $k => $v) {
  214. if ($v) {
  215. switch ($k) {
  216. case "member_deduct_money":
  217. $extra_content .= ',会员价优惠:' . $v;
  218. break;
  219. case "deduct_num_score":
  220. $is_score_deduct = 1;
  221. break;
  222. case "discount_money":
  223. $discount_money = $v;
  224. // $extra_content .= ' 优惠:' . $v;
  225. break;
  226. case "agent_commission":
  227. $extra_content .= ',渠道分红:' . $v;
  228. break;
  229. case "distribution_commission":
  230. $extra_content .= ',分销分红:' . $v;
  231. break;
  232. case "boss_commission":
  233. $extra_content .= ',股东分红:' . $v;
  234. break;
  235. case "store_boss_commission":
  236. $extra_content .= ',门店股东分红:' . $v;
  237. break;
  238. }
  239. }
  240. }
  241. if($is_score_deduct){
  242. $extra_content .= ',积分抵扣优惠:' . $discount_money;
  243. }else{
  244. $extra_content .= ',优惠券优惠:' . $discount_money;
  245. }
  246. }
  247. $row[] = trim($extra_content,',');
  248. } else if ($field == 'pay_time') {
  249. $row[] = !empty($order['pay_time']) ? date('Y-m-d H:i:s', $order['pay_time']) : '';
  250. } else {
  251. if ((isset($order[$field]))) $row[] = $order[$field];
  252. }
  253. }
  254. $data[]=$row;
  255. }
  256. $csv->data = $data;
  257. $csv->export();
  258. }
  259. }
  260. public function actionCommissionAndScoreList(){
  261. $params = \Yii::$app->request->get();
  262. $wallet_type = 'commission';
  263. if(!empty($params['wallet_type'])) $wallet_type = $params['wallet_type'];
  264. $condition = [
  265. 'where'=>[
  266. ['source_table' => ['store_cashier_order',StoreCashierOrder::tableName(),'store_cashier_order_detail']],
  267. ['source_table_id'=>$params['order_id']]
  268. ],
  269. ];
  270. CapitalLog::$capitalType = "{$wallet_type}";
  271. $list = CapitalLog::getList($condition,0);
  272. $level = UserLevel::find()->select("name,level")->where(['mall_id' => $this->mall_id,'status' => StatusEnum::ENABLED])->asArray()->all();
  273. $level_data = array_column($level,'name','level');
  274. CapitalLog::$capitalType = "{$wallet_type}_frozen";
  275. $condition['where'][] = ['status'=>0];
  276. $frozen_list = CapitalLog::getList($condition,1);
  277. $list = array_merge($list,$frozen_list);
  278. return $this->success('操作成功',['list'=>$list,'user_level'=>$level_data]);
  279. }
  280. public function actionGetCouponList(){
  281. $params = \Yii::$app->request->get();
  282. $type = $params['type']??2;
  283. $store_id = $this->store_id;
  284. $is_install = MallAddons::isInstall($this->mall_id, AddonsEnum::ADDONS_NAME_COUPON);
  285. $coupon_list = [];
  286. if($is_install){
  287. $coupon_list = AddonsCoupon::lists([
  288. 'where'=>[
  289. new Expression("FIND_IN_SET({$store_id},store_id)"),
  290. ['mall_id'=>$this->mall_id],
  291. ['type'=>$type],
  292. ['status'=>StatusEnum::ENABLED],
  293. ['coupon_status'=>AddonsCouponEnum::STATUS_RECEIVING],
  294. ],
  295. 'select'=>'id,name'
  296. ]);
  297. }
  298. return $this->success('ok', ['coupon_list'=>$coupon_list]);
  299. }
  300. public function actionShowMiniPromotionCode(){
  301. $request = \Yii::$app->request;
  302. if ($request->isAjax) {
  303. if ($request->isPost) {
  304. $params = \Yii::$app->request->post();
  305. // 检查提交的参数
  306. $res = \Yii::$app->services->validate->validate($params,[
  307. [['type'], 'required'],
  308. ]);
  309. if($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  310. $store = Store::findOne(['mall_id'=>$this->mall_id,'id'=>$this->store_id]);
  311. if(empty($store)) return $this->error('店铺不存在');
  312. $model = StoreMiniCode::findOne(['store_id'=>$store['id'],'mall_id'=>$this->mall_id,'type'=>$params['type']]);
  313. if(empty($model)){
  314. $mall = $this->mall;
  315. $content = [
  316. 'mall_id'=>$this->mall_id,
  317. 'store_id'=>$store['id'],
  318. 'mall_sign'=>$mall['mall_sign'],
  319. 'type'=>$params['type'],
  320. ];
  321. $content = json_encode($content);
  322. if($params['type']==1){
  323. $page = 'plugins2/Store/store/index';
  324. }else{
  325. $page = '/plugins2/Store/pay/cashRegister';
  326. }
  327. $code = md5($content);
  328. $obj = new MiniQrCode();
  329. $applet_code = $obj->getAppletQrCode($this->mall_id,$page,$code);
  330. $params['mall_id'] = $this->mall_id;
  331. $params['code'] = $code;
  332. $params['store_id'] = $store['id'];
  333. $params['content'] = $content;
  334. $params['applet_code'] = $applet_code;
  335. $model = StoreMiniCode::setData($params);
  336. }
  337. $applet_url = $model['applet_code'];
  338. $this->success('获取成功',['applet_url'=>$applet_url]);
  339. }
  340. }
  341. }
  342. }