CapitalFlowServices.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. <?php
  2. namespace app\services\system;
  3. use app\dao\system\CapitalFlowDao;
  4. use app\services\BaseServices;
  5. use crmeb\exceptions\AdminException;
  6. /**
  7. * 资金流水
  8. * Class SystemFileServices
  9. * @package app\services\system
  10. * @mixin CapitalFlowDao
  11. */
  12. class CapitalFlowServices extends BaseServices
  13. {
  14. protected $typeName = [
  15. 1 => '商城购物',
  16. 2 => '商城购物退款',
  17. 3 => '用户充值',
  18. 4 => '用户充值退款',
  19. 5 => '抽奖中奖',
  20. 6 => '佣金提现',
  21. 7 => '购买会员',
  22. 8 => '线下支付',
  23. ];
  24. /**
  25. * @param CapitalFlowDao $dao
  26. */
  27. public function __construct(CapitalFlowDao $dao)
  28. {
  29. $this->dao = $dao;
  30. }
  31. /**
  32. * 添加资金流水
  33. * @param $orderInfo
  34. * @param string $type
  35. */
  36. public function setFlow($data, $type = '')
  37. {
  38. $data['flow_id'] = 'ZJ' . date('Ymdhis', time()) . rand('1000', '9999');
  39. switch ($type) {
  40. case 'order':
  41. $data['trading_type'] = 1;
  42. break;
  43. case 'refund':
  44. $data['price'] = bcmul('-1', $data['price'], 2);
  45. $data['trading_type'] = 2;
  46. break;
  47. case 'recharge':
  48. $data['trading_type'] = 3;
  49. break;
  50. case 'refund_recharge':
  51. $data['price'] = bcmul('-1', $data['price'], 2);
  52. $data['trading_type'] = 4;
  53. break;
  54. case 'luck':
  55. $data['price'] = bcmul('-1', $data['price'], 2);
  56. $data['trading_type'] = 5;
  57. break;
  58. case 'extract':
  59. $data['price'] = bcmul('-1', $data['price'], 2);
  60. $data['trading_type'] = 6;
  61. break;
  62. case 'pay_member':
  63. $data['trading_type'] = 7;
  64. break;
  65. case 'offline_scan':
  66. $data['trading_type'] = 8;
  67. break;
  68. default:
  69. break;
  70. }
  71. $data['add_time'] = time();
  72. $this->dao->save($data);
  73. }
  74. /**
  75. * 获取资金流水
  76. * @param $where
  77. * @return array
  78. */
  79. public function getFlowList($where)
  80. {
  81. $export = $where['export'] ?? 0;
  82. unset($where['export']);
  83. [$page, $limit] = $this->getPageValue();
  84. $status = ['未知', '支付订单', '订单退款', '充值订单', '充值退款', '抽奖红包', '佣金提现', '购买会员', '线下收银'];
  85. $pay_type = ['weixin' => '微信支付', 'routine' => '小程序', 'alipay' => '支付宝', 'offline' => '线下支付', 'bank' => '银行'];
  86. $list = $this->dao->getList($where, '*', $page, $limit);
  87. if ($list) {
  88. $typeName = $this->typeName;
  89. foreach ($list as &$item) {
  90. $item['add_time'] = date('Y-m-d H:i:s', $item['add_time']);
  91. $item['trading_type'] = $typeName[$item['trading_type']] ?? '未知';
  92. $item['pay_type'] = $pay_type[$item['pay_type']] ?? '';
  93. }
  94. }
  95. $count = $this->dao->count($where);
  96. if ($export) {
  97. $fileKey = ['flow_id', 'order_id', 'nickname', 'phone', 'price', 'trading_type', 'pay_type', 'add_time', 'mark'];
  98. $header = ['交易单号', '关联订单', '用户', '电话', '金额', '订单类型', '支付类型', '交易时间', '备注'];
  99. $fileName = '账单导出' . date('YmdHis') . rand(1000, 9999);
  100. return compact('list', 'fileKey', 'header', 'fileName');
  101. } else {
  102. return compact('list', 'count', 'status');
  103. }
  104. }
  105. /**
  106. * 添加备注
  107. * @param $id
  108. * @param $data
  109. * @return bool
  110. */
  111. public function setMark($id, $data)
  112. {
  113. $res = $this->dao->update($id, $data);
  114. if ($res) {
  115. return true;
  116. } else {
  117. throw new AdminException('备注失败');
  118. }
  119. }
  120. /**
  121. * 获取账单记录
  122. * @param $where
  123. * @return array
  124. */
  125. public function getFlowRecord($where)
  126. {
  127. [$page, $limit] = $this->getPageValue();
  128. $data = $this->dao->getRecordList($where, $page, $limit);
  129. $i = 1;
  130. foreach ($data['list'] as &$item) {
  131. $item['id'] = $i;
  132. $i++;
  133. $item['entry_price'] = bcadd($item['income_price'], $item['exp_price'], 2);
  134. switch ($where['type']) {
  135. case "day" :
  136. $item['title'] = "日账单";
  137. $item['add_time'] = date('Y-m-d', $item['add_time']);
  138. break;
  139. case "week" :
  140. $item['title'] = "周账单";
  141. $item['add_time'] = '第' . $item['day'] . '周(' . date('m', $item['add_time']) . '月)';
  142. break;
  143. case "month" :
  144. $item['title'] = "月账单";
  145. $item['add_time'] = date('Y-m', $item['add_time']);
  146. break;
  147. }
  148. }
  149. return $data;
  150. }
  151. /**
  152. * 用户资金记录
  153. * @param int $uid
  154. * @param array $data
  155. * @return array
  156. */
  157. public function userCapitalList(int $uid, array $data)
  158. {
  159. $where = [];
  160. $where['uid'] = $uid;
  161. $where['trading_type'] = [1, 7];
  162. if ((isset($data['start']) && $data['start']) || (isset($data['stop']) && $data['stop'])) {
  163. $where['time'] = [$data['start'], $data['stop']];
  164. }
  165. [$page, $limit] = $this->getPageValue();
  166. $list = $this->dao->getList($where, '*', $page, $limit);
  167. $times = [];
  168. if ($list) {
  169. $typeName = $this->typeName;
  170. foreach ($list as &$item) {
  171. $item['time_key'] = $item['add_time'] ? date('Y-m', (int)$item['add_time']) : '';
  172. $item['day'] = $item['add_time'] ? date('Y-m-d', (int)$item['add_time']) : '';
  173. $item['add_time'] = $item['add_time'] ? date('Y-m-d H:i', (int)$item['add_time']) : '';
  174. $item['type'] = $item['trading_type'];
  175. $item['type_name'] = $typeName[$item['type'] ?? ''] ?? '未知类型';
  176. $item['title'] = $item['type_name'];
  177. }
  178. $times = array_merge(array_unique(array_column($list, 'time_key')));
  179. }
  180. return ['list' => $list, 'time' => $times];
  181. }
  182. }