BackendCouponController.java 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. package com.fuint.module.backendApi.controller;
  2. import com.fuint.common.Constants;
  3. import com.fuint.common.dto.*;
  4. import com.fuint.common.enums.CouponTypeEnum;
  5. import com.fuint.common.enums.CouponUseForEnum;
  6. import com.fuint.common.enums.StatusEnum;
  7. import com.fuint.common.service.*;
  8. import com.fuint.common.util.PhoneFormatCheckUtils;
  9. import com.fuint.common.util.TokenUtil;
  10. import com.fuint.framework.exception.BusinessCheckException;
  11. import com.fuint.framework.pagination.PaginationRequest;
  12. import com.fuint.framework.pagination.PaginationResponse;
  13. import com.fuint.framework.web.BaseController;
  14. import com.fuint.framework.web.ResponseObject;
  15. import com.fuint.repository.mapper.MtCouponGoodsMapper;
  16. import com.fuint.repository.mapper.MtCouponGroupMapper;
  17. import com.fuint.repository.model.*;
  18. import com.fuint.utils.StringUtil;
  19. import io.swagger.annotations.Api;
  20. import io.swagger.annotations.ApiOperation;
  21. import lombok.AllArgsConstructor;
  22. import org.springframework.security.access.prepost.PreAuthorize;
  23. import org.springframework.web.bind.annotation.*;
  24. import javax.servlet.http.HttpServletRequest;
  25. import java.text.ParseException;
  26. import java.util.*;
  27. import java.util.regex.Pattern;
  28. /**
  29. * 卡券管理类controller
  30. *
  31. * Created by FSQ
  32. * CopyRight https://www.fuint.cn
  33. */
  34. @Api(tags="管理端-卡券管理相关接口")
  35. @RestController
  36. @AllArgsConstructor
  37. @RequestMapping(value = "/backendApi/coupon")
  38. public class BackendCouponController extends BaseController {
  39. private MtCouponGroupMapper mtCouponGroupMapper;
  40. private MtCouponGoodsMapper mtCouponGoodsMapper;
  41. /**
  42. * 卡券服务接口
  43. */
  44. private CouponService couponService;
  45. /**
  46. * 卡券分组服务接口
  47. * */
  48. private CouponGroupService couponGroupService;
  49. /**
  50. * 店铺服务接口
  51. */
  52. private StoreService storeService;
  53. /**
  54. * 商品服务接口
  55. * */
  56. private GoodsService goodsService;
  57. /**
  58. * 会员服务接口
  59. * */
  60. private MemberService memberService;
  61. /**
  62. * 后台账户服务接口
  63. * */
  64. private AccountService accountService;
  65. /**
  66. * 系统配置服务接口
  67. * */
  68. private SettingService settingService;
  69. /**
  70. * 查询卡券列表
  71. *
  72. * @param request
  73. * @return
  74. * @throws BusinessCheckException
  75. */
  76. @ApiOperation(value = "查询卡券列表")
  77. @RequestMapping(value = "/list", method = RequestMethod.GET)
  78. @CrossOrigin
  79. @PreAuthorize("@pms.hasPermission('coupon:coupon:index')")
  80. public ResponseObject list(HttpServletRequest request) throws BusinessCheckException {
  81. String token = request.getHeader("Access-Token");
  82. Integer page = request.getParameter("page") == null ? Constants.PAGE_NUMBER : Integer.parseInt(request.getParameter("page"));
  83. Integer pageSize = request.getParameter("pageSize") == null ? Constants.PAGE_SIZE : Integer.parseInt(request.getParameter("pageSize"));
  84. Integer groupId = (request.getParameter("groupId") == null || StringUtil.isEmpty(request.getParameter("groupId"))) ? 0 : Integer.parseInt(request.getParameter("groupId"));
  85. Integer couponId = (request.getParameter("id") == null || StringUtil.isEmpty(request.getParameter("id"))) ? 0 : Integer.parseInt(request.getParameter("id"));
  86. String name = request.getParameter("name") == null ? "" : request.getParameter("name");
  87. String type = request.getParameter("type") == null ? "" : request.getParameter("type");
  88. String status = request.getParameter("status") == null ? "" : request.getParameter("status");
  89. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  90. if (accountInfo == null) {
  91. return getFailureResult(1001, "请先登录");
  92. }
  93. PaginationRequest paginationRequest = new PaginationRequest();
  94. paginationRequest.setCurrentPage(page);
  95. paginationRequest.setPageSize(pageSize);
  96. Map<String, Object> params = new HashMap<>();
  97. if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) {
  98. params.put("merchantId", accountInfo.getMerchantId());
  99. }
  100. if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) {
  101. params.put("storeId", accountInfo.getStoreId());
  102. }
  103. if (groupId > 0) {
  104. params.put("groupId", groupId.toString());
  105. }
  106. if (couponId > 0) {
  107. params.put("id", couponId.toString());
  108. }
  109. if (StringUtil.isNotEmpty(name)) {
  110. params.put("name", name);
  111. }
  112. if (StringUtil.isNotEmpty(type)) {
  113. params.put("type", type);
  114. }
  115. if (StringUtil.isNotEmpty(status)) {
  116. params.put("status", status);
  117. }
  118. if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) {
  119. params.put("merchantId", accountInfo.getMerchantId());
  120. }
  121. if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) {
  122. params.put("storeId", accountInfo.getStoreId());
  123. }
  124. paginationRequest.setSearchParams(params);
  125. PaginationResponse<MtCoupon> paginationResponse = couponService.queryCouponListByPagination(paginationRequest);
  126. List<MtCoupon> dataList = paginationResponse.getContent();
  127. List<MtCouponGroup> groupList = new ArrayList<>();
  128. Map<String, Object> paramsStore = new HashMap<>();
  129. paramsStore.put("status", StatusEnum.ENABLED.getKey());
  130. if (accountInfo.getStoreId() != null && accountInfo.getStoreId() > 0) {
  131. paramsStore.put("storeId", accountInfo.getStoreId().toString());
  132. }
  133. if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) {
  134. paramsStore.put("merchantId", accountInfo.getMerchantId());
  135. }
  136. List<MtStore> storeList = storeService.queryStoresByParams(paramsStore);
  137. if (dataList.size() > 0) {
  138. for (MtCoupon coupon : dataList) {
  139. MtCouponGroup groupInfo = mtCouponGroupMapper.selectById(coupon.getGroupId());
  140. if (groupInfo == null) {
  141. continue;
  142. }
  143. MtCouponGroup g = new MtCouponGroup();
  144. g.setId(groupInfo.getId());
  145. g.setName(groupInfo.getName());
  146. g.setTotal(groupInfo.getTotal());
  147. Boolean isInGroup = false;
  148. for (MtCouponGroup gg : groupList) {
  149. if (gg.getId().equals(groupInfo.getId())) {
  150. isInGroup = true;
  151. }
  152. }
  153. if (!isInGroup) {
  154. groupList.add(g);
  155. }
  156. }
  157. }
  158. Integer groupTotal = 0;
  159. if (groupId > 0) {
  160. MtCouponGroup groupInfo = couponGroupService.queryCouponGroupById(groupId);
  161. groupTotal = groupInfo.getTotal();
  162. }
  163. // 卡券类型列表
  164. List<ParamDto> typeList = CouponTypeEnum.getCouponTypeList();
  165. // 状态列表
  166. List<ParamDto> statusList = StatusEnum.getStatusList();
  167. // 卡券使用专项列表
  168. List<ParamDto> couponUseForList = CouponUseForEnum.getCouponUseForList();
  169. // 会员等级列表
  170. Map<String, Object> param = new HashMap<>();
  171. param.put("status", StatusEnum.ENABLED.getKey());
  172. if (accountInfo.getMerchantId() != null && accountInfo.getMerchantId() > 0) {
  173. param.put("MERCHANT_ID", accountInfo.getMerchantId());
  174. }
  175. List<MtUserGrade> gradeList = memberService.queryMemberGradeByParams(param);
  176. String imagePath = settingService.getUploadBasePath();
  177. Map<String, Object> result = new HashMap<>();
  178. result.put("imagePath", imagePath);
  179. result.put("groupTotal", groupTotal);
  180. result.put("storeList", storeList);
  181. result.put("groupList", groupList);
  182. result.put("typeList", typeList);
  183. result.put("statusList", statusList);
  184. result.put("gradeList", gradeList);
  185. result.put("couponUseForList", couponUseForList);
  186. result.put("paginationResponse", paginationResponse);
  187. return getSuccessResult(result);
  188. }
  189. /**
  190. * 删除卡券
  191. *
  192. * @param request
  193. * @return
  194. */
  195. @ApiOperation(value = "删除卡券")
  196. @RequestMapping(value = "/delete/{id}", method = RequestMethod.GET)
  197. @CrossOrigin
  198. @PreAuthorize("@pms.hasPermission('coupon:coupon:index')")
  199. public ResponseObject delete(HttpServletRequest request, @PathVariable("id") Long id) throws BusinessCheckException {
  200. String token = request.getHeader("Access-Token");
  201. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  202. if (accountInfo == null) {
  203. return getFailureResult(1001, "请先登录");
  204. }
  205. List<Long> ids = new ArrayList<>();
  206. ids.add(id);
  207. String operator = accountInfo.getAccountName();
  208. couponService.deleteCoupon(id, operator);
  209. return getSuccessResult(true);
  210. }
  211. /**
  212. * 保存卡券
  213. *
  214. * @param request HttpServletRequest对象
  215. * @return
  216. */
  217. @ApiOperation(value = "保存卡券")
  218. @RequestMapping(value = "/save", method = RequestMethod.POST)
  219. @CrossOrigin
  220. @PreAuthorize("@pms.hasPermission('coupon:coupon:add')")
  221. public ResponseObject saveCouponHandler(HttpServletRequest request, @RequestBody ReqCouponDto reqCouponDto) throws BusinessCheckException,ParseException {
  222. String token = request.getHeader("Access-Token");
  223. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  224. if (accountInfo == null) {
  225. return getFailureResult(1001, "请先登录");
  226. }
  227. reqCouponDto.setOperator(accountInfo.getAccountName());
  228. // 同一分组内卡券名称不能重复
  229. PaginationRequest requestSearch = new PaginationRequest();
  230. requestSearch.setCurrentPage(Constants.PAGE_NUMBER);
  231. requestSearch.setPageSize(Constants.PAGE_SIZE);
  232. Map<String, Object> requestParams = new HashMap<>();
  233. requestParams.put("name", reqCouponDto.getName());
  234. requestParams.put("groupId", reqCouponDto.getGroupId().toString());
  235. requestSearch.setSearchParams(requestParams);
  236. PaginationResponse<MtCoupon> dataName = couponService.queryCouponListByPagination(requestSearch);
  237. if (dataName.getContent().size() > 0 && reqCouponDto.getId() == null) {
  238. return getFailureResult(201, "卡券名称已存在,请修改");
  239. }
  240. TAccount account = accountService.getAccountInfoById(accountInfo.getId());
  241. if (account.getStoreId() != null && account.getStoreId() > 0) {
  242. reqCouponDto.setStoreId(account.getStoreId());
  243. }
  244. if (account.getMerchantId() != null && account.getMerchantId() > 0) {
  245. reqCouponDto.setMerchantId(account.getMerchantId());
  246. }
  247. couponService.saveCoupon(reqCouponDto);
  248. return getSuccessResult(true);
  249. }
  250. /**
  251. * 卡券详情
  252. *
  253. * @param request
  254. * @return
  255. */
  256. @ApiOperation(value = "卡券详情")
  257. @RequestMapping(value = "/info/{id}", method = RequestMethod.GET)
  258. @CrossOrigin
  259. @PreAuthorize("@pms.hasPermission('coupon:coupon:index')")
  260. public ResponseObject info(HttpServletRequest request, @PathVariable("id") Integer id) throws BusinessCheckException {
  261. String token = request.getHeader("Access-Token");
  262. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  263. if (accountInfo == null) {
  264. return getFailureResult(1001, "请先登录");
  265. }
  266. MtCoupon mtCouponInfo = couponService.queryCouponById(id);
  267. String baseImage = settingService.getUploadBasePath();
  268. Map<String, Object> result = new HashMap<>();
  269. result.put("baseImage", baseImage);
  270. result.put("couponInfo", mtCouponInfo);
  271. MtCouponGroup mtGroupInfo = couponGroupService.queryCouponGroupById(mtCouponInfo.getGroupId());
  272. result.put("groupInfo", mtGroupInfo);
  273. List<MtStore> storeList = new ArrayList<>();
  274. if (StringUtil.isNotEmpty(mtCouponInfo.getStoreIds())) {
  275. String[] ids = mtCouponInfo.getStoreIds().split(",");
  276. for (String storeId : ids) {
  277. MtStore info = storeService.queryStoreById(Integer.parseInt(storeId));
  278. storeList.add(info);
  279. }
  280. }
  281. // 卡券适用商品
  282. List<MtCouponGoods> couponGoodsList = mtCouponGoodsMapper.getCouponGoods(id);
  283. String goodsIds = "";
  284. List<MtGoods> goodsList = new ArrayList<>();
  285. if (couponGoodsList.size() > 0) {
  286. for (MtCouponGoods cg : couponGoodsList) {
  287. if (goodsIds.length() > 0) {
  288. goodsIds = goodsIds + "," + cg.getGoodsId();
  289. } else {
  290. goodsIds = cg.getGoodsId().toString();
  291. }
  292. MtGoods goodsInfo = goodsService.queryGoodsById(cg.getGoodsId());
  293. goodsList.add(goodsInfo);
  294. }
  295. }
  296. // 不可用日期
  297. List<DateDto> exceptTimeList = new ArrayList<>();
  298. if (StringUtil.isNotEmpty(mtCouponInfo.getExceptTime())) {
  299. String[] exceptTimeArr = mtCouponInfo.getExceptTime().split(",");
  300. if (exceptTimeArr.length > 0) {
  301. for (int i = 0; i < exceptTimeArr.length; i++) {
  302. if (!exceptTimeArr[i].equals("weekend")) {
  303. String[] date = exceptTimeArr[i].split("_");
  304. DateDto dto = new DateDto();
  305. dto.setStartDate(date[0]);
  306. dto.setEndDate(date[1]);
  307. exceptTimeList.add(dto);
  308. }
  309. }
  310. }
  311. }
  312. // 储值卡的预存规则
  313. List<PreStoreRuleDto> preStoreList = new ArrayList<>();
  314. if (StringUtil.isNotEmpty(mtCouponInfo.getInRule()) && mtCouponInfo.getType().equals(CouponTypeEnum.PRESTORE.getKey())) {
  315. String[] ruleArr = mtCouponInfo.getInRule().split(",");
  316. if (ruleArr.length > 0) {
  317. for (int i = 0; i < ruleArr.length; i++) {
  318. if (StringUtil.isNotEmpty(ruleArr[i])) {
  319. String[] ruleItem = ruleArr[i].split("_");
  320. if (ruleItem.length == 2) {
  321. PreStoreRuleDto dto = new PreStoreRuleDto();
  322. dto.setPreStoreAmount(ruleItem[0]);
  323. dto.setTargetAmount(ruleItem[1]);
  324. preStoreList.add(dto);
  325. }
  326. }
  327. }
  328. }
  329. }
  330. result.put("exceptTimeList", exceptTimeList);
  331. result.put("preStoreList", preStoreList);
  332. result.put("isEdit", true);
  333. result.put("goodsIds", goodsIds);
  334. result.put("goodsList", goodsList);
  335. result.put("storeList", storeList);
  336. return getSuccessResult(result);
  337. }
  338. /**
  339. * 发放卡券
  340. *
  341. * @param request
  342. * @return
  343. */
  344. @ApiOperation(value = "发放卡券")
  345. @RequestMapping(value = "/sendCoupon", method = RequestMethod.GET)
  346. @CrossOrigin
  347. @PreAuthorize("@pms.hasPermission('coupon:coupon:index')")
  348. public ResponseObject sendCoupon(HttpServletRequest request) throws BusinessCheckException {
  349. String token = request.getHeader("Access-Token");
  350. String mobile = request.getParameter("mobile");
  351. String num = request.getParameter("num");
  352. String couponId = request.getParameter("couponId");
  353. String userIds = request.getParameter("userIds");
  354. String object = request.getParameter("object");
  355. AccountInfo accountInfo = TokenUtil.getAccountInfoByToken(token);
  356. if (accountInfo == null) {
  357. return getFailureResult(1001, "请先登录");
  358. }
  359. if (couponId == null) {
  360. return getFailureResult(201, "系统参数有误");
  361. }
  362. if (!PhoneFormatCheckUtils.isChinaPhoneLegal(mobile) && StringUtil.isNotEmpty(mobile)) {
  363. return getFailureResult(201, "手机号格式有误");
  364. }
  365. Pattern pattern = Pattern.compile("[0-9]*");
  366. if (num == null || (!pattern.matcher(num).matches())) {
  367. return getFailureResult(201, "发放数量必须为正整数");
  368. }
  369. if (Integer.parseInt(num) > 100) {
  370. return getFailureResult(201, "发放数量最多为100");
  371. }
  372. // 导入批次
  373. String uuid = UUID.randomUUID().toString().replaceAll("-", "");
  374. List<Integer> userIdList = new ArrayList<>();
  375. if (StringUtil.isNotEmpty(mobile)) {
  376. MtUser mtUser = memberService.queryMemberByMobile(accountInfo.getMerchantId(), mobile);
  377. if (mtUser != null) {
  378. userIdList.add(mtUser.getId());
  379. }
  380. } else if (object.equals("part") && StringUtil.isNotEmpty(userIds)) {
  381. List<String> ids = Arrays.asList(userIds.split(","));
  382. if (ids != null && ids.size() > 0) {
  383. for (String userId : ids) {
  384. if (StringUtil.isNotEmpty(userId)) {
  385. userIdList.add(Integer.parseInt(userId));
  386. }
  387. }
  388. }
  389. } else if (object.equals("all")) {
  390. userIdList = memberService.getUserIdList(accountInfo.getMerchantId(), accountInfo.getStoreId());
  391. } else {
  392. return getFailureResult(201, "系统参数有误");
  393. }
  394. couponService.batchSendCoupon(Integer.parseInt(couponId), userIdList, Integer.parseInt(num), uuid, accountInfo.getAccountName());
  395. return getSuccessResult(true);
  396. }
  397. }