FinancialRecordDao.php 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\common\dao\system\merchant;
  12. use app\common\dao\BaseDao;
  13. use app\common\model\user\User;
  14. use app\common\model\system\merchant\FinancialRecord;
  15. class FinancialRecordDao extends BaseDao
  16. {
  17. protected function getModel(): string
  18. {
  19. return FinancialRecord::class;
  20. }
  21. /**
  22. * 生成订单编号
  23. *
  24. * 本函数旨在生成一个唯一的订单编号。编号由时间戳和随机数组成,确保了编号的唯一性和时间顺序。
  25. * 时间戳精确到毫秒,随机数确保在同一毫秒内仍能生成不同的编号。
  26. *
  27. * @return string 返回生成的订单编号
  28. */
  29. public function getSn()
  30. {
  31. // 获取当前时间的微秒和秒部分
  32. list($msec, $sec) = explode(' ', microtime());
  33. // 将微秒和秒转换为毫秒,并格式化为整数
  34. $msectime = number_format((floatval($msec) + floatval($sec)) * 1000, 0, '', '');
  35. // 生成订单编号:前缀 + 毫秒时间戳 + 随机数
  36. // 保证随机数在特定范围内,避免生成重复的订单编号
  37. $orderId = 'jy' . $msectime . mt_rand(10000, max(intval($msec * 10000) + 10000, 98369));
  38. return $orderId;
  39. }
  40. /**
  41. * 对数据进行增量更新操作。
  42. * 此函数用于处理特定业务逻辑,即给定数据数组和商户ID后,通过生成序列号并设置特定的业务标志,来创建新的数据记录。
  43. *
  44. * @param array $data 数据数组,包含需要进行增量更新的所有字段。
  45. * @param string $merId 商户ID,用于标识数据所属的商户。
  46. * @return mixed 返回执行创建操作的结果,具体类型取决于create方法的实现。
  47. */
  48. public function inc(array $data, $merId)
  49. {
  50. // 为数据数组添加商户ID,用于标识数据来源。
  51. $data['mer_id'] = $merId;
  52. // 设置业务标志为1,表示这是一条财务相关记录。
  53. $data['financial_pm'] = 1;
  54. // 生成序列号,并将其添加到数据数组中,用于唯一标识该记录。
  55. $data['financial_record_sn'] = $this->getSn();
  56. // 调用create方法,使用加工后的数据数组创建新的记录,并返回创建结果。
  57. return $this->create($data);
  58. }
  59. /**
  60. * 解密数据并创建记录
  61. *
  62. * 本函数用于处理解密后的数据,并根据这些数据创建相应的记录。
  63. * 它首先将传入的商户ID赋值给数据数组,然后设置财务相关字段的值,
  64. * 最后调用创建方法来实际创建记录。
  65. *
  66. * @param array $data 解密后的数据数组
  67. * @param string $merId 商户ID,用于标识数据所属的商户
  68. * @return mixed 创建记录的结果,可能是ID或其他标识符
  69. */
  70. public function dec(array $data, $merId)
  71. {
  72. // 将商户ID赋值给数据数组
  73. $data['mer_id'] = $merId;
  74. // 初始化财务相关字段的值
  75. $data['financial_pm'] = 0;
  76. // 生成记录序列号,并赋值给数据数组
  77. $data['financial_record_sn'] = $this->getSn();
  78. // 调用创建方法,传入处理后的数据数组,返回创建结果
  79. return $this->create($data);
  80. }
  81. /**
  82. * 根据条件搜索数据。
  83. *
  84. * 该方法用于根据提供的条件数组来构建查询语句,灵活地根据不同的条件进行数据库查询。
  85. * 条件数组中的每个键值对代表一个查询条件,方法内部通过判断键的存在与否来决定是否添加相应的查询条件。
  86. * 支持的条件包括财务类型、商户ID、用户信息、用户ID、关键字、日期范围以及是否为商户等。
  87. *
  88. * @param array $where 包含查询条件的数组。
  89. *
  90. * @return \Illuminate\Database\Query\Builder|static 返回构建好的查询语句。
  91. */
  92. public function search(array $where)
  93. {
  94. // 获取模型实例并连接数据库。
  95. $query = $this->getModel()::getDB();
  96. // 如果条件数组中包含'financial_type'键,且其值不为空,添加WHERE IN查询条件。
  97. $query = $query->when(isset($where['financial_type']) && $where['financial_type'] !== '', function ($query) use ($where) {
  98. $query->whereIn('financial_type', $where['financial_type']);
  99. });
  100. // 如果条件数组中包含'mer_id'键,且其值不为空,添加WHERE查询条件。
  101. $query = $query->when(isset($where['mer_id']) && $where['mer_id'] !== '', function ($query) use ($where) {
  102. $query->where('mer_id', $where['mer_id']);
  103. });
  104. // 如果条件数组中包含'user_info'键,且其值不为空,添加WHERE查询条件。
  105. $query = $query->when(isset($where['user_info']) && $where['user_info'] !== '', function ($query) use ($where) {
  106. $query->where('user_info', $where['user_info']);
  107. });
  108. // 如果条件数组中包含'user_id'键,且其值不为空,添加WHERE查询条件。
  109. $query = $query->when(isset($where['uid']) && $where['uid'] !== '', function ($query) use ($where) {
  110. $query->where('user_id', $where['uid']);
  111. });
  112. $query = $query->when(isset($where['nickname']) && $where['nickname'] !== '', function ($query) use ($where) {
  113. $uid = User::where('nickname', 'like', "%{$where['nickname']}%")->column('uid');
  114. $query->whereIn('user_id', $uid);
  115. });
  116. // 如果条件数组中包含'keyword'键,且其值不为空,添加WHERE LIKE查询条件,搜索字段包括订单号、用户信息和财务记录号。
  117. $query = $query->when(isset($where['keyword']) && $where['keyword'] !== '', function ($query) use ($where) {
  118. $query->whereLike('order_sn|user_info|financial_record_sn', "%{$where['keyword']}%");
  119. });
  120. $query = $query->when(isset($where['order_sn']) && $where['order_sn'] !== '', function ($query) use ($where) {
  121. $query->whereLike('order_sn', "%{$where['order_sn']}%");
  122. });
  123. $query = $query->when(isset($where['real_name']) && $where['real_name'] !== '', function ($query) use ($where) {
  124. $query->whereLike('user_info', "%{$where['real_name']}%");
  125. });
  126. $query->when(isset($where['pay_type']) && $where['pay_type'] !== '', function ($query) use ($where) {
  127. if (is_int($where['pay_type'])) {
  128. $query->where('pay_type', $where['pay_type']);
  129. } else {
  130. $query->whereIn('pay_type', $where['pay_type']);
  131. }
  132. });
  133. // 如果条件数组中包含'date'键,且其值不为空,调用getModelTime函数添加日期范围查询条件。
  134. $query = $query->when(isset($where['date']) && $where['date'] !== '', function ($query) use ($where) {
  135. getModelTime($query, $where['date'], 'create_time');
  136. });
  137. // 如果条件数组中包含'is_mer'键,根据其值添加不同的WHERE查询条件,判断是否为商户以及类型条件。
  138. $query = $query->when(isset($where['is_mer']) && $where['is_mer'] !== '', function ($query) use ($where) {
  139. if($where['is_mer']){
  140. $query->where('mer_id',$where['is_mer'])->where('type','in',[0,1]);
  141. }else{
  142. $query->where('type','in',[1,2]);
  143. }
  144. });
  145. // 返回构建好的查询语句。
  146. return $query;
  147. }
  148. /**
  149. * 根据条件和时间查询出相对类型的数量个金额
  150. * @param int $type
  151. * @param array $where
  152. * @param string $date
  153. * @param array $financialType
  154. * @return array
  155. * @author Qinii
  156. * @day 4/14/22
  157. */
  158. public function getDataByType(int $type, array $where, string $date, array $financialType)
  159. {
  160. if (empty($financialType)) return [0,0];
  161. $query = $this->search($where)->where('financial_type','in',$financialType);
  162. if($type == 1) {
  163. $query->whereDay('create_time',$date);
  164. } else if ($type ==2) {
  165. $query->whereMonth('create_time',$date);
  166. }
  167. $count = $query->group('order_id')->count();
  168. $number = $query->sum('number');
  169. return [$count,$number];
  170. }
  171. public function getDateByPayType(int $type, array $where, string $date, array $payType)
  172. {
  173. if (empty($payType)) return [0,0];
  174. $query = $this->search($where)->where('pay_type', 'in', $payType);
  175. if($type == 1) {
  176. $query->whereDay('create_time',$date);
  177. } else if ($type ==2) {
  178. $query->whereMonth('create_time',$date);
  179. }
  180. $count = $query->group('order_id')->count();
  181. $number = $query->sum('number');
  182. return [$count,$number];
  183. }
  184. }