CashController.php 15 KB

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