BackendCouponController.java 19 KB

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