QuotaController.php 10 KB

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