Order.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. <?php
  2. namespace app\admin\controller\shopro\commission;
  3. use think\Db;
  4. use think\exception\HttpResponseException;
  5. use app\admin\controller\shopro\Common;
  6. use app\admin\model\shopro\commission\Order as OrderModel;
  7. use app\admin\model\shopro\commission\Reward as RewardModel;
  8. use addons\shopro\service\commission\Reward as RewardService;
  9. class Order extends Common
  10. {
  11. protected $model = null;
  12. public function _initialize()
  13. {
  14. parent::_initialize();
  15. $this->model = new OrderModel();
  16. }
  17. /**
  18. * 查看
  19. */
  20. public function index()
  21. {
  22. if (!$this->request->isAjax()) {
  23. $exportConfig = (new \addons\shopro\library\Export())->getConfig();
  24. $this->assignconfig("save_type", $exportConfig['save_type'] ?? 'download');
  25. return $this->view->fetch();
  26. }
  27. $list = $this->model->sheepFilter()->with(['buyer', 'agent', 'order', 'rewards.agent', 'order_item'])->paginate($this->request->param('list_rows', 10));
  28. $list = $list->toArray();
  29. // 统计数据
  30. $count = [
  31. 'total' => $list['total'],
  32. 'total_amount' => 0,
  33. 'total_commission' => 0,
  34. 'total_commission_cancel' => 0,
  35. 'total_commission_accounted' => 0,
  36. 'total_commission_back' => 0,
  37. 'total_commission_pending' => 0
  38. ];
  39. $orders = $this->model->sheepFilter()->with(['rewards'])->select();
  40. collection($orders)->each(function ($order) use (&$count) {
  41. $count['total_amount'] += $order['amount'];
  42. foreach ($order['rewards'] as $reward) {
  43. $count['total_commission'] += $reward['commission'];
  44. switch ($reward['status']) {
  45. case RewardModel::COMMISSION_REWARD_STATUS_ACCOUNTED:
  46. $count['total_commission_accounted'] += $reward['commission'];
  47. break;
  48. case RewardModel::COMMISSION_REWARD_STATUS_BACK:
  49. $count['total_commission_back'] += $reward['commission'];
  50. break;
  51. case RewardModel::COMMISSION_REWARD_STATUS_PENDING:
  52. $count['total_commission_pending'] += $reward['commission'];
  53. break;
  54. case RewardModel::COMMISSION_REWARD_STATUS_CANCEL:
  55. $count['total_commission_cancel'] += $reward['commission'];
  56. break;
  57. }
  58. }
  59. });
  60. $this->success('', null, [
  61. 'list' => $list,
  62. 'count' => $count
  63. ]);
  64. }
  65. /**
  66. * 结算佣金
  67. *
  68. * @return Response
  69. */
  70. public function confirm()
  71. {
  72. $params = $this->request->only(['commission_reward_id', 'commission_order_id']);
  73. try {
  74. Db::transaction(function () use ($params) {
  75. $rewardService = new RewardService('admin');
  76. if (isset($params['commission_reward_id'])) {
  77. return $rewardService->runCommissionReward($params['commission_reward_id']);
  78. } elseif (isset($params['commission_order_id'])) {
  79. return $rewardService->runCommissionRewardByOrder($params['commission_order_id']);
  80. }
  81. });
  82. } catch (HttpResponseException $e) {
  83. $data = $e->getResponse()->getData();
  84. $message = $data ? ($data['msg'] ?? '') : $e->getMessage();
  85. $this->error($message);
  86. } catch (\Exception $e) {
  87. $this->error($e->getMessage());
  88. }
  89. $this->success('操作成功');
  90. }
  91. /**
  92. * 取消结算
  93. *
  94. * @return Response
  95. */
  96. public function cancel()
  97. {
  98. $params = $this->request->only(['commission_reward_id', 'commission_order_id']);
  99. try {
  100. Db::transaction(function () use ($params) {
  101. $rewardService = new RewardService('admin');
  102. if (isset($params['commission_reward_id'])) {
  103. return $rewardService->cancelCommissionReward($params['commission_reward_id']);
  104. } elseif (isset($params['commission_order_id'])) {
  105. return $rewardService->backCommissionRewardByOrder($params['commission_order_id']);
  106. }
  107. });
  108. } catch (HttpResponseException $e) {
  109. $data = $e->getResponse()->getData();
  110. $message = $data ? ($data['msg'] ?? '') : $e->getMessage();
  111. $this->error($message);
  112. } catch (\Exception $e) {
  113. $this->error($e->getMessage());
  114. }
  115. $this->success('操作成功');
  116. }
  117. /**
  118. * 退回已结算佣金
  119. */
  120. public function back()
  121. {
  122. $params = $this->request->only(['commission_reward_id', 'commission_order_id', 'deduct_order_money']);
  123. try {
  124. Db::transaction(function () use ($params) {
  125. $rewardService = new RewardService('admin');
  126. if (isset($params['commission_reward_id'])) {
  127. return $rewardService->backCommissionReward($params['commission_reward_id']);
  128. } elseif (isset($params['commission_order_id'])) {
  129. return $rewardService->backCommissionRewardByOrder($params['commission_order_id'], $params['deduct_order_money']);
  130. }
  131. });
  132. } catch (HttpResponseException $e) {
  133. $data = $e->getResponse()->getData();
  134. $message = $data ? ($data['msg'] ?? '') : $e->getMessage();
  135. $this->error($message);
  136. } catch (\Exception $e) {
  137. $this->error($e->getMessage());
  138. }
  139. $this->success('操作成功');
  140. }
  141. /**
  142. * 修改待结算佣金
  143. */
  144. public function edit($id = null)
  145. {
  146. $params = $this->request->only(['commission_reward_id', 'commission']);
  147. $reward = RewardModel::get($params['commission_reward_id']);
  148. if (!$reward) {
  149. $this->error(__('No Results were found'));
  150. }
  151. $reward->commission = $params['commission'];
  152. $result = $reward->save();
  153. if ($result) {
  154. $this->success('操作成功');
  155. }
  156. $this->error('操作失败');
  157. }
  158. public function export()
  159. {
  160. $cellTitles = [
  161. // 主要字段
  162. 'commission_order_id' => 'Id',
  163. 'order_sn' => '订单号',
  164. 'goods_title' => '商品名称',
  165. 'goods_sku_text' => '商品规格',
  166. 'goods_price' => '商品价格',
  167. 'goods_num' => '购买数量',
  168. 'refund_status_text' => '退款状态',
  169. 'buyer_nickname' => '下单用户',
  170. 'buyer_mobile' => '手机号',
  171. 'share_nickname' => '推广分销商',
  172. 'share_mobile' => '手机号',
  173. 'commission_reward_status_text' => '佣金状态',
  174. 'reward_event_text' => '结算方式',
  175. 'commission_time' => '结算时间',
  176. 'reward_type_text' => '商品结算方式',
  177. 'amount' => '商品结算金额',
  178. 'commission_order_status_text' => '分销商业绩',
  179. 'total_commission' => '分销总金额',
  180. 'total_commissioned' => '到账金额',
  181. // 佣金明细
  182. 'reward_agent_nickname' => '分佣用户',
  183. 'reward_agent_mobile' => '分佣手机号',
  184. 'reward_commission' => '分佣金额',
  185. 'reward_status_text' => '分佣状态',
  186. 'reward_type_text' => '入账方式',
  187. 'reward_commission_time' => '结算时间',
  188. ];
  189. // 数据总条数
  190. $total = $this->model->sheepFilter()->count();
  191. if ($total <= 0) {
  192. $this->error('导出数据为空');
  193. }
  194. $export = new \addons\shopro\library\Export();
  195. $params = [
  196. 'file_name' => '分销订单列表',
  197. 'cell_titles' => $cellTitles,
  198. 'total' => $total,
  199. 'is_sub_cell' => true,
  200. 'sub_start_cell' => 'reward_agent_nickname',
  201. 'sub_field' => 'rewards'
  202. ];
  203. $total_amount = 0;
  204. $total_commission = 0;
  205. $total_commission_cancel = 0;
  206. $total_commission_accounted = 0;
  207. $total_commission_back = 0;
  208. $total_commission_pending = 0;
  209. $result = $export->export($params, function ($pages) use (&$total_amount, &$total_commission, &$total_commission_cancel, &$total_commission_accounted, &$total_commission_back, &$total_commission_pending, $total) {
  210. $datas = $this->model->sheepFilter()->with(['buyer', 'agent', 'order', 'rewards.agent', 'order_item'])
  211. ->limit((($pages['page'] - 1) * $pages['list_rows']), $pages['list_rows'])
  212. ->select();
  213. $datas = collection($datas);
  214. $datas->each(function ($commissionOrder) use (&$total_amount, &$total_commission, &$total_commission_cancel, &$total_commission_accounted, &$total_commission_back, &$total_commission_pending, $total) {
  215. $total_amount += $commissionOrder['amount'];
  216. foreach ($commissionOrder['rewards'] as $reward) {
  217. $total_commission += $reward['commission'];
  218. switch ($reward['status']) {
  219. case RewardModel::COMMISSION_REWARD_STATUS_ACCOUNTED:
  220. $total_commission_accounted += $reward['commission'];
  221. break;
  222. case RewardModel::COMMISSION_REWARD_STATUS_BACK:
  223. $total_commission_back += $reward['commission'];
  224. break;
  225. case RewardModel::COMMISSION_REWARD_STATUS_PENDING:
  226. $total_commission_pending += $reward['commission'];
  227. break;
  228. case RewardModel::COMMISSION_REWARD_STATUS_CANCEL:
  229. $total_commission_cancel += $reward['commission'];
  230. break;
  231. }
  232. }
  233. })->toArray();
  234. $newDatas = [];
  235. foreach ($datas as $commissionOrder) {
  236. $commission = 0;
  237. $commissioned = 0;
  238. foreach ($commissionOrder['rewards'] as $reward) {
  239. if ($reward['status'] == 1) {
  240. $commissioned += $reward['commission'];
  241. }
  242. $commission += $reward['commission'];
  243. }
  244. $data = [
  245. 'commission_order_id' => $commissionOrder['id'],
  246. 'order_sn' => $commissionOrder['order'] ? $commissionOrder['order']['order_sn'] : '',
  247. 'goods_title' => $commissionOrder['order_item'] ? '#' . $commissionOrder['order_item']['goods_id'] . ' ' . $commissionOrder['order_item']['goods_title'] : '',
  248. 'goods_sku_text' => $commissionOrder['order_item'] ? $commissionOrder['order_item']['goods_sku_text'] : '',
  249. 'goods_price' => $commissionOrder['order_item'] ? $commissionOrder['order_item']['goods_price'] : '',
  250. 'goods_num' => $commissionOrder['order_item'] ? $commissionOrder['order_item']['goods_num'] : '',
  251. 'refund_status_text' => $commissionOrder['order_item'] ? $commissionOrder['order_item']['refund_status_text'] : '',
  252. 'buyer_nickname' => $commissionOrder['buyer'] ? $commissionOrder['buyer']['nickname'] : '-',
  253. 'buyer_mobile' => $commissionOrder['buyer'] ? $commissionOrder['buyer']['mobile'] . ' ' : '-',
  254. 'share_nickname' => $commissionOrder['agent'] ? $commissionOrder['agent']['nickname'] : '-',
  255. 'share_mobile' => $commissionOrder['agent'] ? $commissionOrder['agent']['mobile'] . ' ' : '-',
  256. // 这里循环 rewards 佣金详情
  257. 'commission_reward_status_text' => $commissionOrder['commission_reward_status_text'],
  258. 'reward_event_text' => $commissionOrder['reward_event_text'],
  259. 'commission_time' => $commissionOrder['commission_time'],
  260. 'reward_type_text' => $commissionOrder['reward_type_text'],
  261. 'amount' => $commissionOrder['amount'],
  262. 'commission_order_status_text' => $commissionOrder['commission_order_status_text'],
  263. 'total_commission' => $commission,
  264. 'total_commissioned' => $commissioned,
  265. ];
  266. $rewardsItems = [];
  267. foreach ($commissionOrder['rewards'] as $reward) {
  268. $rewardsItems[] = [
  269. 'reward_agent_nickname' => $reward['agent'] ? $reward['agent']['nickname'] : '',
  270. 'reward_agent_mobile' => $reward['agent'] ? $reward['agent']['mobile'] : '',
  271. 'reward_commission' => $reward['commission'],
  272. 'reward_status_text' => $reward['status_text'],
  273. 'reward_type_text' => $reward['type_text'],
  274. 'reward_commission_time' => $reward['commission_time']
  275. ];
  276. }
  277. $data['rewards'] = $rewardsItems;
  278. $newDatas[] = $data;
  279. }
  280. if ($pages['is_last_page']) {
  281. $newDatas[] = ['order_id' => "商品总订单数:" . $total . ";商品结算总金额:¥" . $total_amount . ";分佣总金额:¥" . $total_commission . ";已取消佣金:¥" . $total_commission_cancel . ";已退回佣金:¥" . $total_commission_back . ";未结算佣金:" . $total_commission_pending . ";已结算佣金:" . $total_commission_accounted];
  282. }
  283. return $newDatas;
  284. });
  285. $this->success('导出成功' . (isset($result['file_path']) && $result['file_path'] ? ',请在服务器: “' . $result['file_path'] . '” 查看' : ''), null, $result);
  286. }
  287. }