QuotaController.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace app\admin\controller\member;
  3. use app\admin\validate\member\RuleAddedValidate;
  4. use app\admin\validate\member\RulePricingValidate;
  5. use app\controller\Curd;
  6. use app\model\Member;
  7. use app\model\MemberQuota;
  8. use app\model\RuleAdded;
  9. use app\model\RuleAddedComponent;
  10. use app\model\RulePricing;
  11. use app\model\SysSerial;
  12. use support\Db;
  13. use support\Redis;
  14. use support\exception\BusinessException;
  15. use support\Request;
  16. use support\Response;
  17. class QuotaController extends Curd
  18. {
  19. public function __construct()
  20. {
  21. $this->model = new MemberQuota();
  22. // $this->validate = true;
  23. // $this->validateClass = new RuleAddedValidate();
  24. }
  25. public function select(Request $request): Response
  26. {
  27. $page = $request->get('page', 1);
  28. $pageSize = $request->get('pageSize', 20);
  29. $keywords = $request->get('keywords', '');
  30. $memberIds = [];
  31. if (!empty($keywords)) {
  32. $memberIds = Member::leftJoin('member_cert', 'member_cert.join_cert_member_id', '=', 'member.member_id')
  33. ->where('member.member_mobile', 'like', '%' . $keywords . '%')
  34. ->orWhere('member_cert.member_cert_name', 'like', '%' . $keywords . '%')
  35. ->pluck('member.member_id')
  36. ->toArray();
  37. if (empty($memberIds)) {
  38. return json_success('', []);
  39. }
  40. }
  41. $rows = MemberQuota::select('join_quota_member_id', 'join_member_rule_added_component_id', 'member_quota_addtimes')
  42. ->when(!empty($memberIds), function ($query) use ($memberIds) {
  43. $query->whereIn('join_quota_member_id', $memberIds);
  44. })
  45. ->groupBy('join_quota_member_id', 'join_member_rule_added_component_id', 'member_quota_addtimes');
  46. $total = $rows->count();
  47. $rows = $rows->orderBy('member_quota_addtimes', 'DESC')
  48. ->forPage($page, $pageSize)
  49. ->get()
  50. ->toArray();
  51. foreach ($rows as &$row) {
  52. $quota = MemberQuota::with([
  53. 'member' => function ($query) {
  54. $query->select('member_id', 'member_mobile');
  55. },
  56. 'cert' => function ($query) {
  57. $query->select('join_cert_member_id', 'member_cert_name');
  58. },
  59. 'component' => function ($query) {
  60. $query->select('rule_added_component_id', 'rule_added_component_name');
  61. }
  62. ])->where('join_quota_member_id', $row['join_quota_member_id'])
  63. ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
  64. ->first()
  65. ->toArray();
  66. $quotaTotal = MemberQuota::where('join_quota_member_id', $row['join_quota_member_id'])
  67. ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
  68. ->count();
  69. $quotaUsed = MemberQuota::where('join_quota_member_id', $row['join_quota_member_id'])
  70. ->where('join_member_rule_added_component_id', $row['join_member_rule_added_component_id'])
  71. ->where('member_quota_status', 'USED')
  72. ->count();
  73. $quota['total'] = $quotaTotal;
  74. $quota['used'] = $quotaUsed;
  75. $quota['unused'] = $quotaTotal - $quotaUsed;
  76. $addedId = RuleAddedComponent::where('rule_added_component_id', $row['join_member_rule_added_component_id'])->value('join_component_rule_added_id');
  77. $addedName = RuleAdded::where('rule_added_id', $addedId)->value('rule_added_name');
  78. $quota['added_name'] = $addedName;
  79. $row = $quota;
  80. }
  81. return json_success('', compact('rows', 'page', 'pageSize', 'total'));
  82. }
  83. protected function doSelect(array $where, string $field = null, string $order = 'desc')
  84. {
  85. $model = $this->model->with([
  86. 'member' => function ($query) {
  87. $query->select('member_id', 'member_mobile');
  88. },
  89. 'cert' => function ($query) {
  90. $query->select('join_cert_member_id', 'member_cert_name');
  91. },
  92. 'component' => function ($query) {
  93. $query->select('rule_added_component_id', 'rule_added_component_name');
  94. }
  95. ]);
  96. $model = $model->groupBy('join_member_rule_added_component_id');
  97. foreach ($where as $column => $value) {
  98. if (is_array($value)) {
  99. if ($value[0] === 'like' || $value[0] === 'not like') {
  100. $model = $model->where($column, $value[0], "%$value[1]%");
  101. } elseif (in_array($value[0], ['>', '=', '<', '<>'])) {
  102. $model = $model->where($column, $value[0], $value[1]);
  103. } elseif ($value[0] == 'in' && !empty($value[1])) {
  104. $valArr = $value[1];
  105. if (is_string($value[1])) {
  106. $valArr = explode(",", trim($value[1]));
  107. }
  108. $model = $model->whereIn($column, $valArr);
  109. } elseif ($value[0] == 'not in' && !empty($value[1])) {
  110. $valArr = $value[1];
  111. if (is_string($value[1])) {
  112. $valArr = explode(",", trim($value[1]));
  113. }
  114. $model = $model->whereNotIn($column, $valArr);
  115. } elseif ($value[0] == 'null') {
  116. $model = $model->whereNull($column);
  117. } elseif ($value[0] == 'not null') {
  118. $model = $model->whereNotNull($column);
  119. } elseif ($value[0] !== '' || $value[1] !== '') {
  120. $model = $model->whereBetween($column, $value);
  121. }
  122. } else {
  123. $model = $model->where($column, $value);
  124. }
  125. }
  126. if ($field) {
  127. $model = $model->orderBy($field, $order);
  128. }
  129. return $model;
  130. }
  131. // protected function insertInput(Request $request): array
  132. // {
  133. // $data = $this->inputFilter($request->post());
  134. // $data['rule_added_id'] = "RA" . str_pad(SysSerial::getSerial(), 16, '0', STR_PAD_LEFT) . random_string(6, 'up');
  135. //
  136. // return $data;
  137. // }
  138. protected function updateInput(Request $request): array
  139. {
  140. $primary_key = $this->model->getKeyName();
  141. $id = $request->post($primary_key);
  142. $data = $this->inputFilter($request->post());
  143. // if (!empty($data['rule_pricing_goods_json'])) {
  144. // $data['rule_pricing_goods_json'] = json_encode(explode(',', $data['rule_pricing_goods_json']));
  145. // } else {
  146. // $data['rule_pricing_goods_json'] = '[]';
  147. // }
  148. $model = $this->model->find($id);
  149. if (!$model) {
  150. throw new BusinessException('记录不存在', 2);
  151. }
  152. unset($data[$primary_key]);
  153. return [$id, $data];
  154. }
  155. public function writeOffList(Request $request)
  156. {
  157. $memberId = $request->get('member_id', '');
  158. $componentId = $request->get('component_id', '');
  159. $quotas = MemberQuota::with([
  160. 'member' => function ($query) {
  161. $query->select('member_id', 'member_mobile');
  162. },
  163. 'cert' => function ($query) {
  164. $query->select('join_cert_member_id', 'member_cert_name');
  165. },
  166. 'component' => function ($query) {
  167. $query->select('rule_added_component_id', 'rule_added_component_name');
  168. }
  169. ])->where('join_quota_member_id', $memberId)
  170. ->where('join_member_rule_added_component_id', $componentId)
  171. ->where('member_quota_status', 'USED')
  172. ->get();
  173. return json_success('', $quotas);
  174. }
  175. /**
  176. * @Desc 额度核销
  177. * @Author Gorden
  178. * @Date 2024/6/4 8:32
  179. *
  180. * @param Request $request
  181. * @return Response
  182. */
  183. public function writeOff(Request $request)
  184. {
  185. $memberId = $request->post('member_id', []);
  186. $componentId = $request->post('component_id', []);
  187. $nbr = $request->post('nbr');
  188. $times = $request->post('times', '');
  189. $code = $request->post('sms_code', '');
  190. if (!$memberId || !$componentId) {
  191. return json_fail("参数异常");
  192. }
  193. $quotas = MemberQuota::where('join_quota_member_id', $memberId[0])
  194. ->where('join_member_rule_added_component_id', $componentId[0])
  195. ->where('member_quota_status', 'PENDING')
  196. ->limit($nbr)
  197. ->get()
  198. ->toArray();
  199. if (count($quotas) < intval($nbr)) {
  200. return json_fail("可核销数量不足");
  201. }
  202. $member = Member::find(current($memberId));
  203. $mobile = $member->member_mobile;
  204. $key = "SMS:CODE:QUOTA:" . $mobile;
  205. $redisCode = Redis::get($key);
  206. if ($redisCode != $code) {
  207. return json_fail("验证码错误,请重新输入");
  208. }
  209. Redis::del($key);
  210. if (!$times) {
  211. $times = date('Y-m-d H:i:s');
  212. } else {
  213. $times = date('Y-m-d H:i:s', strtotime($times));
  214. }
  215. try {
  216. foreach ($quotas as $quota) {
  217. $extend = [];
  218. if (!empty($quota['member_quota_extend_json'])) {
  219. $extend = json_decode($quota['member_quota_extend_json'], true);
  220. }
  221. $extend['writeOffTime'] = $times;
  222. MemberQuota::where('member_quota_id', $quota['member_quota_id'])->update(['member_quota_status' => 'USED', 'member_quota_extend_json' => $extend]);
  223. }
  224. } catch (\Exception $e) {
  225. return json_fail("核销失败");
  226. }
  227. return json_success("核销成功");
  228. }
  229. }