Order.php 15 KB

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