CouponController.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Http\Controllers\Controller;
  4. use App\Models\Coupon;
  5. use DB;
  6. use Exception;
  7. use Illuminate\Http\JsonResponse;
  8. use Illuminate\Http\Request;
  9. use Log;
  10. use PhpOffice\PhpSpreadsheet\Spreadsheet;
  11. use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
  12. use Redirect;
  13. use Response;
  14. use Str;
  15. use Validator;
  16. /**
  17. * 优惠券控制器
  18. *
  19. * Class CouponController
  20. *
  21. * @package App\Http\Controllers\Controller
  22. */
  23. class CouponController extends Controller
  24. {
  25. // 优惠券列表
  26. public function couponList(Request $request)
  27. {
  28. $sn = $request->input('sn');
  29. $type = $request->input('type');
  30. $status = $request->input('status');
  31. $query = Coupon::query();
  32. if (isset($sn)) {
  33. $query->where('sn', 'like', '%' . $sn . '%');
  34. }
  35. if (isset($type)) {
  36. $query->whereType($type);
  37. }
  38. if (isset($status)) {
  39. $query->whereStatus($status);
  40. }
  41. $view['couponList'] = $query->latest()->paginate(15)->appends(
  42. $request->except('page')
  43. );
  44. return view('admin.coupon.couponList', $view);
  45. }
  46. // 添加优惠券
  47. public function addCoupon(Request $request)
  48. {
  49. if ($request->isMethod('POST')) {
  50. Validator::make(
  51. $request->all(),
  52. [
  53. 'name' => 'required',
  54. 'sn' => 'unique:coupon',
  55. 'type' => 'required|integer|between:1,3',
  56. 'usable_times' => 'integer|nullable',
  57. 'num' => 'required|integer|min:1',
  58. 'value' => 'required|numeric|min:0',
  59. 'start_time' => 'required|date|before_or_equal:end_time',
  60. 'end_time' => 'required|date|after_or_equal:start_time',
  61. ],
  62. [
  63. 'name.required' => '请填入卡券名称',
  64. 'type.required' => '请选择卡券类型',
  65. 'type.integer' => '卡券类型不合法,请重选',
  66. 'type.between' => '卡券类型不合法,请重选',
  67. 'num.required' => '请填写卡券数量',
  68. 'num.integer' => '卡券数量不合法',
  69. 'num.min' => '卡券数量不合法,最小1',
  70. 'value.required_unless' => '请填入优惠值',
  71. 'value.numeric' => '优惠值金额不合法',
  72. 'value.min' => '优惠值不合法,最小0',
  73. 'start_time.required' => '请填入有效期',
  74. 'start_time.date' => '有效期不合法',
  75. 'start_time.before_or_equal' => '有效期不合法',
  76. 'end_time.required' => '请填入有效期',
  77. 'end_time.date' => '有效期不合法',
  78. 'end_time.after_or_equal' => '有效期不合法',
  79. ]
  80. );
  81. $type = $request->input('type');
  82. // 优惠卷LOGO
  83. $logo = '';
  84. if ($request->hasFile('logo')) {
  85. $logo = $this->uploadFile($request->file('logo'));
  86. if ( ! $logo) {
  87. return Redirect::back()->withInput()->withErrors('LOGO不合法');
  88. }
  89. }
  90. try {
  91. DB::beginTransaction();
  92. $num = $request->input('num');
  93. for ($i = 0; $i < $num; $i++) {
  94. $obj = new Coupon();
  95. $obj->name = $request->input('name');
  96. $obj->logo = $logo;
  97. $obj->sn = $num == 1 && $request->input(
  98. 'sn'
  99. ) ? $request->input('sn') : Str::random(8);
  100. $obj->type = $type;
  101. $obj->usable_times = $request->input('usable_times');
  102. $obj->value = $request->input('value');
  103. $obj->rule = $request->input('rule');
  104. $obj->start_time = strtotime(
  105. $request->input('start_time')
  106. );
  107. $obj->end_time = strtotime($request->input('end_time'));
  108. $obj->status = 0;
  109. $obj->save();
  110. }
  111. DB::commit();
  112. return Redirect::back()->with('successMsg', '生成成功');
  113. } catch (Exception $e) {
  114. DB::rollBack();
  115. Log::error('生成优惠券失败:' . $e->getMessage());
  116. return Redirect::back()->withInput()->withErrors(
  117. '生成失败:' . $e->getMessage()
  118. );
  119. }
  120. } else {
  121. return view('admin.coupon.addCoupon');
  122. }
  123. }
  124. // 删除优惠券
  125. public function delCoupon(Request $request): JsonResponse
  126. {
  127. Coupon::find($request->input('id'))->delete();
  128. return Response::json(['status' => 'success', 'message' => '删除成功']);
  129. }
  130. // 导出卡券
  131. public function exportCoupon(): void
  132. {
  133. $voucherList = Coupon::type(1)->whereStatus(0)->get();
  134. $discountCouponList = Coupon::type(2)->whereStatus(0)->get();
  135. $refillList = Coupon::type(3)->whereStatus(0)->get();
  136. $filename = '卡券' . date('Ymd') . '.xlsx';
  137. $spreadsheet = new Spreadsheet();
  138. $spreadsheet->getProperties()
  139. ->setCreator('ProxyPanel')
  140. ->setLastModifiedBy('ProxyPanel')
  141. ->setTitle('邀请码')
  142. ->setSubject('邀请码')
  143. ->setDescription('')
  144. ->setKeywords('')
  145. ->setCategory('');
  146. // 抵用券
  147. $spreadsheet->setActiveSheetIndex(0);
  148. $sheet = $spreadsheet->getActiveSheet();
  149. $sheet->setTitle('抵用券');
  150. $sheet->fromArray(
  151. ['名称', '使用次数', '有效期', '券码', '金额(元)', '使用限制(元)'],
  152. null
  153. );
  154. foreach ($voucherList as $k => $vo) {
  155. $dateRange = date('Y-m-d', $vo->start_time) . ' ~ ' . date(
  156. 'Y-m-d',
  157. $vo->end_time
  158. );
  159. $sheet->fromArray(
  160. [
  161. $vo->name,
  162. $vo->usable_times,
  163. $dateRange,
  164. $vo->sn,
  165. $vo->value,
  166. $vo->rule,
  167. ],
  168. null,
  169. 'A' . ($k + 2)
  170. );
  171. }
  172. // 折扣券
  173. $spreadsheet->createSheet(1);
  174. $spreadsheet->setActiveSheetIndex(1);
  175. $sheet = $spreadsheet->getActiveSheet();
  176. $sheet->setTitle('折扣券');
  177. $sheet->fromArray(
  178. ['名称', '使用次数', '有效期', '券码', '折扣(折)', '使用限制(元)'],
  179. null
  180. );
  181. foreach ($discountCouponList as $k => $vo) {
  182. $dateRange = date('Y-m-d', $vo->start_time) . ' ~ ' . date(
  183. 'Y-m-d',
  184. $vo->end_time
  185. );
  186. $sheet->fromArray(
  187. [
  188. $vo->name,
  189. $vo->usable_times,
  190. $dateRange,
  191. $vo->sn,
  192. $vo->value,
  193. $vo->rule,
  194. ],
  195. null,
  196. 'A' . ($k + 2)
  197. );
  198. }
  199. // 充值券
  200. $spreadsheet->createSheet(2);
  201. $spreadsheet->setActiveSheetIndex(2);
  202. $sheet = $spreadsheet->getActiveSheet();
  203. $sheet->setTitle('充值券');
  204. $sheet->fromArray(['名称', '有效期', '券码', '金额(元)'], null);
  205. foreach ($refillList as $k => $vo) {
  206. $dateRange = date('Y-m-d', $vo->start_time) . ' ~ ' . date(
  207. 'Y-m-d',
  208. $vo->end_time
  209. );
  210. $sheet->fromArray(
  211. [$vo->name, $dateRange, $vo->sn, $vo->value],
  212. null,
  213. 'A' . ($k + 2)
  214. );
  215. }
  216. // 指针切换回第一个sheet
  217. $spreadsheet->setActiveSheetIndex(0);
  218. header(
  219. 'Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  220. ); // 输出07Excel文件
  221. //header('Content-Type:application/vnd.ms-excel'); // 输出Excel03版本文件
  222. header('Content-Disposition: attachment;filename="' . $filename . '"');
  223. header('Cache-Control: max-age=0');
  224. $writer = new Xlsx($spreadsheet);
  225. $writer->save('php://output');
  226. }
  227. }