StoreFinanceService.php 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999
  1. <?php
  2. namespace addons\Store\common\services;
  3. use addons\Store\common\enums\StoreEnum;
  4. use addons\Store\common\models\Store;
  5. use addons\Store\common\models\StoreCashierOrder;
  6. use addons\Store\common\models\StoreCensus;
  7. use addons\Store\common\models\StoreCommission;
  8. use addons\Store\common\models\StoreCommissionCheck;
  9. use addons\Store\common\models\StoreOrder;
  10. use addons\Store\common\models\StoreOrderDetail;
  11. use common\components\export\CsvTool;
  12. use common\enums\DownloadEnum;
  13. use common\enums\OrderStatusEnum;
  14. use common\enums\StatusEnum;
  15. use common\models\common\Download;
  16. use common\models\mall\Mall;
  17. use common\models\order\OrderRefund;
  18. use common\models\user\User;
  19. use Exception;
  20. /**
  21. * 资产统计service
  22. */
  23. class StoreFinanceService extends BaseService
  24. {
  25. public function __construct($params = [])
  26. {
  27. parent::__construct();
  28. $this->store_id = $params['store_id'] ?? 0;
  29. $this->mall_id = $params['mall_id'] ?? 0;
  30. }
  31. //获取门店财务数据
  32. public function getStoreFinanceList($params)
  33. {
  34. try {
  35. $where = [
  36. ['mall_id' => $this->mall_id],
  37. ['check_status' => StoreEnum::CHECK_ADOPT],
  38. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  39. ];
  40. if (!empty($params['keyword'])) $where[] = ['or', ['like', 'id', $params['keyword']], ['like', 'store_name', $params['keyword']], ['like', 'shop_mobile', $params['keyword']]];
  41. $orderBy = 'id desc';
  42. $store_params = [
  43. 'select' => 'id,mall_id,user_id,shop_owner,shop_mobile,store_name,c_id,province_id,check_status,city_id,district_id,address,logo_img,total_money,balance,expire_time,user_nums,status,created_at,is_freeze,total_order_money,total_settled_amount,unsettled_amount,total_num,street_id,community_id,is_sync,sync_status',
  44. 'where' => $where,
  45. 'order' => $orderBy,
  46. 'page' => $params['page'] ?? 1,
  47. 'limit' => $params['limit'] ?? 10,
  48. ];
  49. $store_list = Store::listPage($store_params);
  50. $order_total_arr = [];
  51. $order_total_arr2 = [];
  52. if (!empty($store_list['list'])) {
  53. foreach ($store_list['list'] as &$item) {
  54. $store_total_data = $this->getStoreFinanceData(['mall_id' => $this->mall_id, 'store_id' => $item['id'], 'date' => $params['date']]);
  55. $item['total_data'] = $store_total_data;
  56. }
  57. }
  58. // $store_list['order_total_arr'] = $order_total_arr;
  59. // $store_list['order_total_arr2'] = $order_total_arr2;
  60. return $store_list;
  61. } catch (\Exception $e) {
  62. throw new Exception($e->getMessage());
  63. }
  64. }
  65. public function getStoreStatics($params)
  66. {
  67. try {
  68. $params['mall_id'] = $this->mall_id;
  69. $total_data = $this->getStoreFinanceData($params);
  70. $order_total_arr[] = ['type' => 'today_pay_money', 'name' => '今日成交金额', 'value' => $total_data['today_pay_money'] ?: 0, 'prompt' => ''];
  71. $order_total_arr[] = ['type' => 'today_refund_money', 'name' => '今日退款金额', 'value' => $total_data['today_refund_money'] ?: 0, 'prompt' => ''];
  72. $order_total_arr[] = ['type' => 'today_commission_money', 'name' => '今日预计到账金额', 'value' => $total_data['today_commission_money'] ?: 0, 'prompt' => ''];
  73. $order_total_arr[] = ['type' => 'today_order_num', 'name' => '今日订单数量', 'value' => $total_data['today_order_num'] ?: 0, 'prompt' => ''];
  74. $order_total_arr2[] = ['type' => 'total_pay_money', 'name' => '累计成交金额', 'value' => $total_data['total_pay_money'] ?: 0, 'prompt' => ''];
  75. $order_total_arr2[] = ['type' => 'total_refund_money', 'name' => '累计退款金额', 'value' => $total_data['total_refund_money'] ?: 0, 'prompt' => ''];
  76. $order_total_arr2[] = ['type' => 'total_commission_money', 'name' => '累计到账金额', 'value' => $total_data['total_commission_money'] ?: 0, 'prompt' => ''];
  77. $order_total_arr2[] = ['type' => 'total_order_num', 'name' => '累计已付款订单数量', 'value' => $total_data['total_order_num'] ?: 0, 'prompt' => ''];
  78. return ['order_total_arr' => $order_total_arr, 'order_total_arr2' => $order_total_arr2];
  79. } catch (\Exception $e) {
  80. throw new Exception($e->getMessage());
  81. }
  82. }
  83. //获取门店累计数据
  84. public function getStoreFinanceData($params = [])
  85. {
  86. try {
  87. $where = [
  88. ['mall_id' => $params['mall_id']],
  89. ['status' => StatusEnum::ENABLED],
  90. ];
  91. if (!empty($params['store_id'])) $where[] = ['store_id' => $params['store_id']];
  92. if (!empty($params['date'][0])) $where[] = ['>=', 'created_at', strtotime($params['date'][0])];
  93. if (!empty($params['date'][1])) $where[] = ['<=', 'created_at', strtotime($params['date'][1].' 23:59:59')];
  94. $today = date('Y-m-d', time());
  95. $today_pay_money = 0;
  96. $today_order_num = 0;
  97. $total_pay_money = 0;
  98. $total_order_num = 0;
  99. $today_refund_money = 0;
  100. $total_refund_money = 0;
  101. $today_commission_money = 0;
  102. $total_commission_money = 0;
  103. //获取门店总数据
  104. $store_census_list = StoreCensus::lists([
  105. 'where' => $where,
  106. // 'index' => 'date_time',
  107. 'order' => 'id desc',
  108. ]);
  109. if (!empty($store_census_list)) {
  110. $total_pay_money = bcadd(array_sum(array_column($store_census_list, 'sales_money')), array_sum(array_column($store_census_list, 'cashier_sales_money')), 2);
  111. $total_order_num = bcadd(array_sum(array_column($store_census_list, 'order_nums')), array_sum(array_column($store_census_list, 'cashier_order_nums')));
  112. // $total_commission_money = array_sum(array_column($store_census_list, 'settlement_commission'));
  113. $total_refund_money = array_sum(array_column($store_census_list, 'order_refund_money'));
  114. }
  115. //获取今日门店数据
  116. $where = [
  117. ['mall_id' => $params['mall_id']],
  118. ['status' => StatusEnum::ENABLED],
  119. ];
  120. if (!empty($params['store_id'])) $where[] = ['store_id' => $params['store_id']];
  121. $where[] = ['date_time' => $today];
  122. $store_census_today_list = StoreCensus::lists([
  123. 'where' => $where,
  124. // 'index' => 'date_time',
  125. 'order' => 'id desc',
  126. ]);
  127. if (!empty($store_census_today_list)) {
  128. $today_pay_money = bcadd(array_sum(array_column($store_census_today_list, 'sales_money')), array_sum(array_column($store_census_today_list, 'cashier_sales_money')), 2);
  129. $today_order_num = bcadd(array_sum(array_column($store_census_today_list, 'order_nums')), array_sum(array_column($store_census_today_list, 'cashier_order_nums')));
  130. // $today_commission_money = array_sum(array_column($store_census_today_list, 'settlement_commission'));
  131. $today_refund_money = array_sum(array_column($store_census_today_list, 'order_refund_money'));
  132. }
  133. $total_refund_money = bcmul($total_refund_money, 1, 2);
  134. $today_refund_money = bcmul($today_refund_money, 1, 2);
  135. //获取订单结算金额数据
  136. $where = [
  137. 'mall_id' => $params['mall_id'],
  138. 'status' => StatusEnum::ENABLED,
  139. ];
  140. if (!empty($params['store_id'])) $where['store_id'] = $params['store_id'];
  141. $today_commission_money = StoreCommission::find()->where($where)->andWhere(['>=', 'created_at', strtotime($today)])->andWhere(['is_settlement' => [StatusEnum::DISABLED, StatusEnum::ENABLED]])->sum('amount_received');
  142. $sql = StoreCommission::find()->where($where)->andWhere(['is_settlement' => StatusEnum::ENABLED]);
  143. if (!empty($params['date'][0])) $sql->andWhere(['>=', 'updated_at', strtotime($params['date'][0])]);
  144. if (!empty($params['date'][1])) $sql->andWhere(['<=', 'updated_at', strtotime($params['date'][1].' 23:59:59')]);
  145. $total_commission_money = $sql->sum('amount_received');
  146. $total_commission_money = bcmul($total_commission_money, 1, 2);
  147. $today_commission_money = bcmul($today_commission_money, 1, 2);
  148. $data = [
  149. 'today_pay_money' => $today_pay_money ?? 0,
  150. 'today_order_num' => $today_order_num ?? 0,
  151. 'total_pay_money' => $total_pay_money ?? 0,
  152. 'total_order_num' => $total_order_num ?? 0,
  153. 'today_refund_money' => $today_refund_money ?? 0,
  154. 'total_refund_money' => $total_refund_money ?? 0,
  155. 'today_commission_money' => $today_commission_money ?? 0,
  156. 'total_commission_money' => $total_commission_money ?? 0,
  157. ];
  158. return $data;
  159. } catch (\Exception $e) {
  160. throw new Exception($e->getMessage());
  161. }
  162. }
  163. //门店财务明细
  164. public function getStoreFinanceDetail($params)
  165. {
  166. try {
  167. $where = [
  168. ['mall_id' => $this->mall_id],
  169. ['>', 'order_status', 0],
  170. ['status' => 1],
  171. ];
  172. if (!empty($params['store_id'])) $where[] = ['store_id' => $params['store_id']];
  173. if (isset($params['order_status']) && $params['order_status'] != '') $where[] = ['order_status' => $params['order_status']];
  174. if (!empty($params['goods_keyword'])) $where[] = ['or', ['like', 'goods_id', $params['goods_keyword']], ['like', 'goods_name', $params['goods_keyword']]];
  175. //查找下单用户
  176. if (!empty($params['keyword'])) {
  177. $user = User::lists([
  178. 'where' => [
  179. ['mall_id' => $this->mall_id],
  180. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  181. ['or', ['like', 'id', $params['keyword']], ['like', 'nickname', $params['keyword']], ['like', 'mobile', $params['keyword']]]
  182. ],
  183. ]);
  184. if (!empty($user)) {
  185. $user_ids = array_column($user, 'id');
  186. $where[] = ['user_id' => $user_ids];
  187. } else {
  188. $where[] = ['user_id' => []];
  189. }
  190. }
  191. //查找订单
  192. if (!empty($params['order_no']) || !empty($params['date'])) {
  193. $order_where = [
  194. ['mall_id' => $this->mall_id],
  195. ['>', 'order_status', 0],
  196. ];
  197. if (!empty($params['order_no'])) $order_where[] = ['order_no' => $params['order_no']];
  198. if (!empty($params['date'][0])) $order_where[] = ['>=', 'pay_time', strtotime($params['date'][0])];
  199. if (!empty($params['date'][1])) $order_where[] = ['<=', 'pay_time', strtotime($params['date'][1]. ' 23:59:59')];
  200. $order_list = StoreOrder::lists([
  201. 'where' => $order_where,
  202. 'select' => 'id,mall_id,order_no,order_status,pay_time',
  203. ]);
  204. if (!empty($order_list)) {
  205. $order_ids = array_column($order_list, 'id');
  206. $where[] = ['order_id' => $order_ids];
  207. } else {
  208. $where[] = ['order_id' => []];
  209. }
  210. }
  211. //查找门店
  212. if (!empty($params['store_keyword'])) {
  213. $store_where = [
  214. ['mall_id' => $this->mall_id],
  215. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  216. ];
  217. if ($params['store_keyword']) $store_where[] = ['or', ['like', 'id', $params['store_keyword']], ['like', 'shop_mobile', $params['store_keyword']], ['like', 'store_name', $params['store_keyword']]];
  218. $store_list = Store::lists([
  219. 'where' => $store_where,
  220. 'select' => 'id,mall_id,status,shop_mobile,store_name',
  221. ]);
  222. if (!empty($store_list)) {
  223. $store_ids = array_column($store_list, 'id');
  224. $where[] = ['store_id' => $store_ids];
  225. } else {
  226. $where[] = ['store_id' => []];
  227. }
  228. }
  229. $detail_params = [
  230. 'where' => $where,
  231. 'with' => ['user', 'order', 'store'],
  232. 'page' => $params['page'] ?? 1,
  233. 'limit' => $params['limit'] ?? 20,
  234. 'order' => 'id desc',
  235. ];
  236. $list = StoreOrderDetail::listPage($detail_params);
  237. if (!empty($list['list'])) {
  238. $order_list = array_column($list['list'], 'order', 'id');
  239. $order_no_list = array_column($order_list, 'order_no', 'id');
  240. //获取订单结算数据
  241. $commission_list = StoreCommission::lists([
  242. 'where' => [
  243. ['mall_id' => $this->mall_id],
  244. ['order_no' => $order_no_list],
  245. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  246. ],
  247. 'index' => 'order_no',
  248. ]);
  249. foreach ($list['list'] as &$item) {
  250. $item['commission_data'] = $commission_list[$item['order']['order_no']];
  251. }
  252. }
  253. return $list;
  254. } catch (\Exception $e) {
  255. throw new Exception($e->getMessage());
  256. }
  257. }
  258. public function getCashierFinanceDetail($params)
  259. {
  260. try {
  261. $where = [
  262. ['mall_id' => $this->mall_id],
  263. ['status' => StatusEnum::ENABLED],
  264. ['pay_status' => 1],
  265. ];
  266. if (!empty($params['store_id'])) $where[] = ['store_id' => $params['store_id']];
  267. if (!empty($params['order_no'])) $where[] = ['order_no' => $params['order_no']];
  268. if (!empty($params['date'][0])) $where[] = ['>=', 'pay_time', strtotime($params['date'][0])];
  269. if (!empty($params['date'][1])) $where[] = ['<=', 'pay_time', strtotime($params['date'][1]. ' 23:59:59')];
  270. //查找下单用户
  271. if (!empty($params['keyword'])) {
  272. $user = User::lists([
  273. 'where' => [
  274. ['mall_id' => $this->mall_id],
  275. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  276. ['or', ['like', 'id', $params['keyword']], ['like', 'nickname', $params['keyword']], ['like', 'mobile', $params['keyword']]]
  277. ],
  278. ]);
  279. if (!empty($user)) {
  280. $user_ids = array_column($user, 'id');
  281. $where[] = ['user_id' => $user_ids];
  282. } else {
  283. $where[] = ['user_id' => []];
  284. }
  285. }
  286. //查找门店
  287. if (!empty($params['store_keyword'])) {
  288. $store_where = [
  289. ['mall_id' => $this->mall_id],
  290. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  291. ];
  292. if ($params['store_keyword']) $store_where[] = ['or', ['like', 'id', $params['store_keyword']], ['like', 'shop_mobile', $params['store_keyword']], ['like', 'store_name', $params['store_keyword']]];
  293. $store_list = Store::lists([
  294. 'where' => $store_where,
  295. 'select' => 'id,mall_id,status,shop_mobile,store_name',
  296. ]);
  297. if (!empty($store_list)) {
  298. $store_ids = array_column($store_list, 'id');
  299. $where[] = ['store_id' => $store_ids];
  300. } else {
  301. $where[] = ['store_id' => []];
  302. }
  303. }
  304. $detail_params = [
  305. 'where' => $where,
  306. 'with' => ['user', 'store'],
  307. 'page' => $params['page'] ?? 1,
  308. 'limit' => $params['limit'] ?? 20,
  309. 'order' => 'id desc',
  310. ];
  311. $list = StoreCashierOrder::listPage($detail_params);
  312. if (!empty($list['list'])) {
  313. $order_no_list = array_column($list['list'], 'order_no', 'id');
  314. //获取订单结算数据
  315. $commission_list = StoreCommission::lists([
  316. 'where' => [
  317. ['mall_id' => $this->mall_id],
  318. ['order_no' => $order_no_list],
  319. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  320. ],
  321. 'index' => 'order_no',
  322. ]);
  323. foreach ($list['list'] as &$item) {
  324. $item['commission_data'] = $commission_list[$item['order_no']];
  325. }
  326. }
  327. return $list;
  328. } catch (\Exception $e) {
  329. throw new Exception($e->getMessage());
  330. }
  331. }
  332. //独立门店获取门店财务数据
  333. public function getClientFinanceData($params)
  334. {
  335. try {
  336. if ($params['tabname'] == 'order-detail') {
  337. $list = $this->getStoreFinanceDetail($params);
  338. } else {
  339. $list = $this->getCashierFinanceDetail($params);
  340. }
  341. return $list;
  342. } catch (\Exception $e) {
  343. throw new Exception($e->getMessage());
  344. }
  345. }
  346. //门店财务数据
  347. public function storeFinanceFieldList($field = null)
  348. {
  349. try {
  350. $fields = [
  351. 'store_id' => '门店ID',
  352. 'store_name' => '门店名称',
  353. 'shop_mobile' => '手机号',
  354. 'today_pay_money' => '今日成交金额',
  355. 'today_refund_money' => '今日退款金额',
  356. 'today_commission_money' => '今日预计到账金额',
  357. 'today_order_num' => '今日订单数量',
  358. 'total_pay_money' => '累计成交金额',
  359. 'total_refund_money' => '累计退款金额',
  360. 'total_commission_money' => '累计到账金额',
  361. 'total_order_num' => '累计已付款订单数量',
  362. ];
  363. if ($field === null) return $fields;
  364. $temp = [];
  365. foreach ($field as $val) {
  366. if (isset($fields[$val])) $temp[$val] = $fields[$val];
  367. }
  368. return $temp;
  369. } catch (\Exception $e) {
  370. throw new Exception($e->getMessage());
  371. }
  372. }
  373. //门店财务明细
  374. public function storeFinanceDetailFieldList($field = null)
  375. {
  376. try {
  377. $fields = [
  378. 'nickname' => '消费者昵称',
  379. 'user_id' => '消费者ID',
  380. 'mobile' => '手机号',
  381. 'order_money' => '订单金额',
  382. 'discount_money' => '优惠金额',
  383. 'pay_money' => '支付金额',
  384. 'order_no' => '订单编号',
  385. 'goods_name' => '商品名称',
  386. 'goods_attr_name' => '商品规格',
  387. 'score_deduction_bear' => '积分抵扣承担',
  388. 'addons_bonus' => '插件(佣金)',
  389. 'settle_type' => '佣金来源',
  390. 'price' => '价格',
  391. 'num' => '数量',
  392. 'goods_price' => '成交金额(元)',
  393. 'store_send_commission' => '门店股东(佣金)',
  394. 'higo_reward' => '嗨呗不足抵扣',
  395. 'service_charge' => '服务费',
  396. 'pay_time' => '成交时间',
  397. 'order_status' => '订单状态',
  398. 'amount_received' => '到账金额(元)',
  399. 'store_contributing_money' => '会员折扣金额',
  400. 'amount_received_score' => '到账积分',
  401. 'store_id' => '门店ID',
  402. 'store_name' => '门店名称',
  403. ];
  404. if ($field === null) return $fields;
  405. $temp = [];
  406. foreach ($field as $val) {
  407. if (isset($fields[$val])) $temp[$val] = $fields[$val];
  408. }
  409. return $temp;
  410. } catch (\Exception $e) {
  411. throw new Exception($e->getMessage());
  412. }
  413. }
  414. //门店财务明细
  415. public function cashierFinanceDetailFieldList($field = null)
  416. {
  417. try {
  418. $fields = [
  419. 'nickname' => '消费者昵称',
  420. 'user_id' => '消费者ID',
  421. 'mobile' => '手机号',
  422. 'order_money' => '订单金额',
  423. 'discount_money' => '优惠金额',
  424. 'pay_money' => '支付金额',
  425. 'order_no' => '订单编号',
  426. 'score_deduction_bear' => '积分抵扣承担',
  427. 'addons_bonus' => '插件(佣金)',
  428. 'settle_type' => '佣金来源',
  429. 'store_send_commission' => '门店股东(佣金)',
  430. 'higo_reward' => '嗨呗不足抵扣',
  431. 'service_charge' => '服务费',
  432. 'pay_time' => '成交时间',
  433. 'amount_received' => '到账金额(元)',
  434. 'store_contributing_money' => '会员折扣金额',
  435. 'amount_received_score' => '到账积分',
  436. 'store_id' => '门店ID',
  437. 'store_name' => '门店名称',
  438. ];
  439. if ($field === null) return $fields;
  440. $temp = [];
  441. foreach ($field as $val) {
  442. if (isset($fields[$val])) $temp[$val] = $fields[$val];
  443. }
  444. return $temp;
  445. } catch (\Exception $e) {
  446. throw new Exception($e->getMessage());
  447. }
  448. }
  449. public function exportStoreFinance($data)
  450. {
  451. try {
  452. date_default_timezone_set('Asia/Shanghai');
  453. $download = Download::getOne([
  454. ['id' => $data['download_id']]
  455. ]);
  456. if (empty($download)) throw new Exception('查无此导出数据');
  457. $params = json_decode($download['params'], true);
  458. $filename = $download['name'];
  459. $type = $download['type'];
  460. $where = [
  461. ['mall_id' => $params['mall_id']],
  462. ['check_status' => StoreEnum::CHECK_ADOPT],
  463. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  464. ];
  465. if (!empty($params['keyword'])) $where[] = ['or', ['like', 'id', $params['keyword']], ['like', 'store_name', $params['keyword']], ['like', 'shop_mobile', $params['keyword']]];
  466. $orderBy = 'id desc';
  467. $store_params = [
  468. 'select' => 'id,mall_id,user_id,shop_owner,shop_mobile,store_name,c_id,province_id,check_status,city_id,district_id,address,logo_img,total_money,balance,expire_time,user_nums,status,created_at,is_freeze,total_order_money,total_settled_amount,unsettled_amount,total_num,street_id,community_id,is_sync,sync_status',
  469. 'where' => $where,
  470. 'order' => $orderBy,
  471. ];
  472. $list = Store::lists($store_params);
  473. $fields = $params['fields'];
  474. $fields_arr = $this->storeFinanceFieldList();
  475. $have_select_field_arr = [];
  476. foreach ($fields as $value) {
  477. if (isset($fields_arr[$value])) $have_select_field_arr[] = $fields_arr[$value];
  478. }
  479. $csv = new CsvTool();
  480. $csv->filename = $filename;
  481. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  482. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  483. $csv->header = $have_select_field_arr;
  484. $rows = [];
  485. if ($list) {
  486. foreach ($list as $item) {
  487. $store_total_data = $this->getStoreFinanceData(['mall_id' => $params['mall_id'], 'store_id' => $item['id']]);
  488. $row = [];
  489. foreach ($fields as $field) {
  490. switch (true) {
  491. case ($field == 'store_id'):
  492. $row[] = $item['id'] ?? '';
  493. break;
  494. case ($field == 'store_name'):
  495. $row[] = $item['store_name'] ?? '';
  496. break;
  497. case ($field == 'shop_mobile'):
  498. $row[] = $item['shop_mobile'] ?? '';
  499. break;
  500. case ($field == 'today_pay_money'):
  501. $row[] = $store_total_data['today_pay_money'] ?? '0.00';
  502. break;
  503. case ($field == 'today_refund_money'):
  504. $row[] = $store_total_data['today_refund_money'] ?? '0.00';
  505. break;
  506. case ($field == 'today_commission_money'):
  507. $row[] = $store_total_data['today_commission_money'] ?? '0.00';
  508. break;
  509. case ($field == 'today_order_num'):
  510. $row[] = $store_total_data['today_order_num'] ?? '0.00';
  511. break;
  512. case ($field == 'total_pay_money'):
  513. $row[] = $store_total_data['total_pay_money'] ?? '0.00';
  514. break;
  515. case ($field == 'total_refund_money'):
  516. $row[] = $store_total_data['total_refund_money'] ?? '0.00';
  517. break;
  518. case ($field == 'total_commission_money'):
  519. $row[] = $store_total_data['total_commission_money'] ?? '0.00';
  520. break;
  521. case ($field == 'total_order_num'):
  522. $row[] = $store_total_data['total_order_num'] ?? '0.00';
  523. break;
  524. default:
  525. $row[] = !empty($item[$field]) ? $item[$field] : '';
  526. }
  527. }
  528. $rows[] = $row;
  529. }
  530. }
  531. $csv->data = $rows;
  532. $csv->export();
  533. $csv->updateDown($download, $params['mall_id']);
  534. return true;
  535. } catch (\Exception $e) {
  536. throw new Exception($e->getMessage());
  537. }
  538. }
  539. public function exportStoreFinanceData($data)
  540. {
  541. try {
  542. date_default_timezone_set('Asia/Shanghai');
  543. $download = Download::getOne([
  544. ['id' => $data['download_id']]
  545. ]);
  546. if (empty($download)) throw new Exception('查无此导出数据');
  547. $params = json_decode($download['params'], true);
  548. $filename = $download['name'];
  549. $type = $download['type'];
  550. $where = [
  551. ['mall_id' => $params['mall_id']],
  552. ['>', 'order_status', 0],
  553. ['status' => 1],
  554. ];
  555. if (!empty($params['store_id'])) $where[] = ['store_id' => $params['store_id']];
  556. if (isset($parms['status']) && $params['status'] != '') $where[] = ['status' => $params['status']];
  557. if (!empty($params['goods_keyword'])) $where[] = ['or', ['like', 'goods_id', $params['goods_keyword']], ['like', 'goods_name', $params['goods_keyword']]];
  558. //查找下单用户
  559. if (!empty($params['keyword'])) {
  560. $user = User::lists([
  561. 'where' => [
  562. ['mall_id' => $params['mall_id']],
  563. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  564. ['or', ['like', 'id', $params['keyword']], ['like', 'nickname', $params['keyword']], ['like', 'mobile', $params['keyword']]]
  565. ],
  566. ]);
  567. if (!empty($user)) {
  568. $user_ids = array_column($user, 'id');
  569. $where[] = ['user_id' => $user_ids];
  570. } else {
  571. $where[] = ['user_id' => []];
  572. }
  573. }
  574. //查找订单
  575. if (!empty($params['order_no']) || !empty($params['date'])) {
  576. $order_where = [
  577. ['mall_id' => $params['mall_id']],
  578. ['>', 'order_status', 0],
  579. ];
  580. if (!empty($params['order_no'])) $order_where[] = ['order_no' => $params['order_no']];
  581. if (!empty($params['date'][0])) $order_where[] = ['>=', 'pay_time', strtotime($params['date'][0])];
  582. if (!empty($params['date'][1])) $order_where[] = ['<=', 'pay_time', strtotime($params['date'][1]. ' 23:59:59')];
  583. $order_list = StoreOrder::lists([
  584. 'where' => $order_where,
  585. 'select' => 'id,mall_id,order_no,order_status,pay_time',
  586. ]);
  587. if (!empty($order_list)) {
  588. $order_ids = array_column($order_list, 'id');
  589. $where[] = ['order_id' => $order_ids];
  590. } else {
  591. $where[] = ['order_id' => []];
  592. }
  593. }
  594. //查找门店
  595. if (!empty($params['store_keyword'])) {
  596. $store_where = [
  597. ['mall_id' => $params['mall_id']],
  598. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  599. ];
  600. if ($params['store_keyword']) $store_where[] = ['or', ['like', 'id', $params['store_keyword']], ['like', 'shop_mobile', $params['store_keyword']], ['like', 'store_name', $params['store_keyword']]];
  601. $store_list = Store::lists([
  602. 'where' => $store_where,
  603. 'select' => 'id,mall_id,status,shop_mobile,store_name',
  604. ]);
  605. if (!empty($store_list)) {
  606. $store_ids = array_column($store_list, 'id');
  607. $where[] = ['store_id' => $store_ids];
  608. } else {
  609. $where[] = ['store_id' => []];
  610. }
  611. }
  612. $detail_params = [
  613. 'where' => $where,
  614. 'with' => ['user', 'order', 'store'],
  615. // 'page' => $params['page'] ?? 1,
  616. // 'limit' => $params['limit'] ?? 20,
  617. 'order' => 'id desc',
  618. ];
  619. $list = StoreOrderDetail::lists($detail_params);
  620. $fields = $params['fields'];
  621. $fields_arr = $this->storeFinanceDetailFieldList();
  622. $have_select_field_arr = [];
  623. foreach ($fields as $value) {
  624. if (isset($fields_arr[$value])) $have_select_field_arr[] = $fields_arr[$value];
  625. }
  626. $csv = new CsvTool();
  627. $csv->filename = $filename;
  628. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  629. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  630. $csv->header = $have_select_field_arr;
  631. $rows = [];
  632. $order_status_list = OrderStatusEnum::getMap();
  633. if ($list) {
  634. // $order_list = array_column($list['list'], 'order', 'id');
  635. // $order_no_list = array_column($order_list, 'order_no', 'id');
  636. // //获取订单结算数据
  637. // $commission_list = StoreCommission::lists([
  638. // 'where' => [
  639. // ['mall_id' => $params['mall_id']],
  640. // ['order_no' => $order_no_list],
  641. // ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  642. // ],
  643. // 'index' => 'order_no',
  644. // ]);
  645. foreach ($list as $item) {
  646. $commission_data = StoreCommission::getOne([
  647. ['mall_id' => $params['mall_id']],
  648. ['order_no' => $item['order']['order_no']],
  649. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  650. ], true);
  651. $item['commission_data'] = $commission_data;
  652. $row = [];
  653. foreach ($fields as $field) {
  654. switch (true) {
  655. case ($field == 'nickname'):
  656. $row[] = $item['user']['nickname'] ?? '';
  657. break;
  658. case ($field == 'user_id'):
  659. $row[] = $item['user_id'] ?? '';
  660. break;
  661. case ($field == 'mobile'):
  662. $row[] = $item['user']['mobile'] ?? '';
  663. break;
  664. case ($field == 'order_money'):
  665. $row[] = $item['commission_data']['order_money'] ?? '0.00';
  666. break;
  667. case ($field == 'discount_money'):
  668. $row[] = $item['commission_data']['discount_money'] ?? '0.00';
  669. break;
  670. case ($field == 'pay_money'):
  671. $row[] = $item['commission_data']['pay_money'] ?? '0.00';
  672. break;
  673. case ($field == 'order_no'):
  674. $row[] = $item['order']['order_no'] ?? '';
  675. break;
  676. case ($field == 'goods_name'):
  677. $row[] = $item['goods_name'] ?? '';
  678. break;
  679. case ($field == 'goods_attr_name'):
  680. $row[] = $item['goods_attr_name'] ?? '默认规格';
  681. break;
  682. case ($field == 'score_deduction_bear'):
  683. if ($item['commission_data']['score_deduction_bear'] == 0) {
  684. $row[] = '平台';
  685. } else if ($item['commission_data']['score_deduction_bear'] == 1) {
  686. $row[] = '门店';
  687. } else {
  688. $row[] = '暂无';
  689. }
  690. break;
  691. case ($field == 'addons_bonus'):
  692. $row[] = $item['commission_data']['addons_bonus'] ?? '0.00';
  693. break;
  694. case ($field == 'settle_type'):
  695. if ($item['commission_data']['settle_type'] == 4) {
  696. $row[] = '门店承担';
  697. } else {
  698. $row[] = '平台承担';
  699. }
  700. break;
  701. case ($field == 'price'):
  702. $row[] = $item['price'] ?? '0.00';
  703. break;
  704. case ($field == 'num'):
  705. $row[] = $item['num'] ?? '0.00';
  706. break;
  707. case ($field == 'goods_price'):
  708. $row[] = $item['goods_price'] ?? '0.00';
  709. break;
  710. case ($field == 'store_send_commission'):
  711. $row[] = $item['commission_data']['store_send_commission'] ?? '0.00';
  712. break;
  713. case ($field == 'higo_reward'):
  714. $row[] = $item['commission_data']['higo_reward'] ?? '0.00';
  715. break;
  716. case ($field == 'service_charge'):
  717. $service_charge = $item['commission_data']['service_charge'] ?? '0.00';
  718. $row[] = $service_charge.'%';
  719. break;
  720. case ($field == 'pay_time'):
  721. $row[] = date('Y-m-d H:i:s', $item['order']['pay_time']);
  722. break;
  723. case ($field == 'order_status'):
  724. $row[] = $order_status_list[$item['order_status']] ?? '';
  725. break;
  726. case ($field == 'amount_received'):
  727. $row[] = $item['commission_data']['amount_received'] ?? '0.00';
  728. break;
  729. case ($field == 'store_contributing_money'):
  730. $row[] = $item['commission_data']['store_contributing_money'] ?? '0.00';
  731. break;
  732. case ($field == 'amount_received_score'):
  733. $row[] = $item['commission_data']['amount_received_score'] ?? '0.00';
  734. break;
  735. case ($field == 'store_id'):
  736. $row[] = $item['store']['id'] ?? '';
  737. break;
  738. case ($field == 'store_name'):
  739. $row[] = $item['store']['store_name'] ?? '';
  740. break;
  741. default:
  742. $row[] = !empty($item[$field]) ? $item[$field] : '';
  743. }
  744. }
  745. $rows[] = $row;
  746. }
  747. }
  748. $csv->data = $rows;
  749. $csv->export();
  750. $csv->updateDown($download, $params['mall_id']);
  751. return true;
  752. } catch (\Exception $e) {
  753. throw new Exception($e->getMessage());
  754. }
  755. }
  756. public function exportCashierFinanceData($data)
  757. {
  758. try {
  759. date_default_timezone_set('Asia/Shanghai');
  760. $download = Download::getOne([
  761. ['id' => $data['download_id']]
  762. ]);
  763. if (empty($download)) throw new Exception('查无此导出数据');
  764. $params = json_decode($download['params'], true);
  765. $filename = $download['name'];
  766. $type = $download['type'];
  767. $where = [
  768. ['mall_id' => $params['mall_id']],
  769. ['status' => StatusEnum::ENABLED],
  770. ['pay_status' => 1],
  771. ];
  772. if (!empty($params['order_no'])) $where[] = ['order_no' => $params['order_no']];
  773. if (!empty($params['store_id'])) $where[] = ['store_id' => $params['store_id']];
  774. if (!empty($params['date'][0])) $where[] = ['>=', 'pay_time', strtotime($params['date'][0])];
  775. if (!empty($params['date'][1])) $where[] = ['<=', 'pay_time', strtotime($params['date'][1]. ' 23:59:59')];
  776. //查找下单用户
  777. if (!empty($params['keyword'])) {
  778. $user = User::lists([
  779. 'where' => [
  780. ['mall_id' => $params['mall_id']],
  781. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  782. ['or', ['like', 'id', $params['keyword']], ['like', 'nickname', $params['keyword']], ['like', 'mobile', $params['keyword']]]
  783. ],
  784. ]);
  785. if (!empty($user)) {
  786. $user_ids = array_column($user, 'id');
  787. $where[] = ['user_id' => $user_ids];
  788. } else {
  789. $where[] = ['user_id' => []];
  790. }
  791. }
  792. //查找门店
  793. if (!empty($params['store_keyword'])) {
  794. $store_where = [
  795. ['mall_id' => $params['mall_id']],
  796. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]]
  797. ];
  798. if ($params['store_keyword']) $store_where[] = ['or', ['like', 'id', $params['store_keyword']], ['like', 'shop_mobile', $params['store_keyword']], ['like', 'store_name', $params['store_keyword']]];
  799. $store_list = Store::lists([
  800. 'where' => $store_where,
  801. 'select' => 'id,mall_id,status,shop_mobile,store_name',
  802. ]);
  803. if (!empty($store_list)) {
  804. $store_ids = array_column($store_list, 'id');
  805. $where[] = ['store_id' => $store_ids];
  806. } else {
  807. $where[] = ['store_id' => []];
  808. }
  809. }
  810. $detail_params = [
  811. 'where' => $where,
  812. 'with' => ['user', 'store'],
  813. // 'page' => $params['page'] ?? 1,
  814. // 'limit' => $params['limit'] ?? 20,
  815. 'order' => 'id desc',
  816. ];
  817. $list = StoreCashierOrder::lists($detail_params);
  818. $fields = $params['fields'];
  819. $fields_arr = $this->cashierFinanceDetailFieldList();
  820. $have_select_field_arr = [];
  821. foreach ($fields as $value) {
  822. if (isset($fields_arr[$value])) $have_select_field_arr[] = $fields_arr[$value];
  823. }
  824. $csv = new CsvTool();
  825. $csv->filename = $filename;
  826. $csv->file_dirname = DownloadEnum::getTypeStorageDirMap($type);
  827. $csv->export_mode = CsvTool::EXPORT_MODE_ASYNC;
  828. $csv->header = $have_select_field_arr;
  829. $rows = [];
  830. $order_status_list = OrderStatusEnum::getMap();
  831. if ($list) {
  832. // $order_list = array_column($list['list'], 'order', 'id');
  833. // $order_no_list = array_column($order_list, 'order_no', 'id');
  834. // //获取订单结算数据
  835. // $commission_list = StoreCommission::lists([
  836. // 'where' => [
  837. // ['mall_id' => $params['mall_id']],
  838. // ['order_no' => $order_no_list],
  839. // ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  840. // ],
  841. // 'index' => 'order_no',
  842. // ]);
  843. foreach ($list as $item) {
  844. $commission_data = StoreCommission::getOne([
  845. ['mall_id' => $params['mall_id']],
  846. ['order_no' => $item['order_no']],
  847. ['status' => [StatusEnum::ENABLED, StatusEnum::DISABLED]],
  848. ], true);
  849. $item['commission_data'] = $commission_data;
  850. $row = [];
  851. foreach ($fields as $field) {
  852. switch (true) {
  853. case ($field == 'nickname'):
  854. $row[] = $item['user']['nickname'] ?? '';
  855. break;
  856. case ($field == 'user_id'):
  857. $row[] = $item['user_id'] ?? '';
  858. break;
  859. case ($field == 'mobile'):
  860. $row[] = $item['user']['mobile'] ?? '';
  861. break;
  862. case ($field == 'order_money'):
  863. $row[] = $item['commission_data']['order_money'] ?? '0.00';
  864. break;
  865. case ($field == 'discount_money'):
  866. $row[] = $item['commission_data']['discount_money'] ?? '0.00';
  867. break;
  868. case ($field == 'pay_money'):
  869. $row[] = $item['commission_data']['pay_money'] ?? '0.00';
  870. break;
  871. case ($field == 'order_no'):
  872. $row[] = $item['order_no'] ?? '';
  873. break;
  874. case ($field == 'score_deduction_bear'):
  875. if ($item['commission_data']['score_deduction_bear'] == 0) {
  876. $row[] = '平台';
  877. } else if ($item['commission_data']['score_deduction_bear'] == 1) {
  878. $row[] = '门店';
  879. } else {
  880. $row[] = '暂无';
  881. }
  882. break;
  883. case ($field == 'addons_bonus'):
  884. $row[] = $item['commission_data']['addons_bonus'] ?? '0.00';
  885. break;
  886. case ($field == 'settle_type'):
  887. if ($item['commission_data']['settle_type'] == 4) {
  888. $row[] = '门店承担';
  889. } else {
  890. $row[] = '平台承担';
  891. }
  892. break;
  893. case ($field == 'store_send_commission'):
  894. $row[] = $item['commission_data']['store_send_commission'] ?? '0.00';
  895. break;
  896. case ($field == 'higo_reward'):
  897. $row[] = $item['commission_data']['higo_reward'] ?? '0.00';
  898. break;
  899. case ($field == 'service_charge'):
  900. $service_charge = $item['commission_data']['service_charge'] ?? '0.00';
  901. $row[] = $service_charge.'%';
  902. break;
  903. case ($field == 'pay_time'):
  904. $row[] = date('Y-m-d H:i:s', $item['pay_time']);
  905. break;
  906. case ($field == 'amount_received'):
  907. $row[] = $item['commission_data']['amount_received'] ?? '0.00';
  908. break;
  909. case ($field == 'store_contributing_money'):
  910. $row[] = $item['commission_data']['store_contributing_money'] ?? '0.00';
  911. break;
  912. case ($field == 'amount_received_score'):
  913. $row[] = $item['commission_data']['amount_received_score'] ?? '0.00';
  914. break;
  915. case ($field == 'store_id'):
  916. $row[] = $item['store']['id'] ?? '';
  917. break;
  918. case ($field == 'store_name'):
  919. $row[] = $item['store']['store_name'] ?? '';
  920. break;
  921. default:
  922. $row[] = !empty($item[$field]) ? $item[$field] : '';
  923. }
  924. }
  925. $rows[] = $row;
  926. }
  927. }
  928. $csv->data = $rows;
  929. $csv->export();
  930. $csv->updateDown($download, $params['mall_id']);
  931. return true;
  932. } catch (\Exception $e) {
  933. throw new Exception($e->getMessage());
  934. }
  935. }
  936. //数据迁移,累加历史收银台订单数量
  937. public function staticsCashierOrderNum()
  938. {
  939. try {
  940. $malls = Mall::getEnableMallList();
  941. foreach ($malls as $mall) {
  942. $mall_id = $mall['id'];
  943. //获取收银台订单
  944. $cashier_order_list = StoreCashierOrder::lists([
  945. 'where' => [
  946. ['mall_id' => $mall_id],
  947. ['pay_status' => 1],
  948. ['status' => StatusEnum::ENABLED]
  949. ],
  950. 'order' => 'id desc',
  951. ]);
  952. if (!empty($cashier_order_list)) {
  953. foreach ($cashier_order_list as $key => $value) {
  954. $date = date('Y-m-d', $value['pay_time']);
  955. $data = [
  956. 'mall_id' => $mall_id,
  957. 'store_id' => $value['store_id'],
  958. 'date_time' => $date,
  959. 'cashier_order_nums' => 1,
  960. ];
  961. StoreCensus::setData($data);
  962. }
  963. }
  964. }
  965. } catch (\Exception $e) {
  966. throw new Exception($e->getMessage());
  967. }
  968. }
  969. }