VipServiceImpl.java 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. package com.caimei.service.vip.impl;
  2. import com.caimei.mapper.SystemMapper;
  3. import com.caimei.mapper.VipMapper;
  4. import com.caimei.model.ResponseJson;
  5. import com.caimei.model.dto.PackageDto;
  6. import com.caimei.model.po.*;
  7. import com.caimei.model.vo.*;
  8. import com.caimei.service.sys.SysMenuService;
  9. import com.caimei.service.sys.SysRoleService;
  10. import com.caimei.service.sys.SysUserService;
  11. import com.caimei.service.vip.VipService;
  12. import com.github.pagehelper.PageHelper;
  13. import com.github.pagehelper.PageInfo;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.stereotype.Service;
  16. import javax.annotation.Resource;
  17. import java.math.BigDecimal;
  18. import java.util.*;
  19. /**
  20. * Description
  21. *
  22. * @author : Aslee
  23. * @date : 2021/5/11
  24. */
  25. @Slf4j
  26. @Service
  27. public class VipServiceImpl implements VipService {
  28. @Resource
  29. private VipMapper vipMapper;
  30. @Resource
  31. private SystemMapper systemMapper;
  32. @Resource
  33. private SysMenuService sysMenuService;
  34. @Resource
  35. private SysUserService sysUserService;
  36. @Resource
  37. private SysRoleService sysRoleService;
  38. @Override
  39. public ResponseJson<Integer> payVip(Integer authUserId, Integer packageId, String services, Integer payWay, Integer payStatus, Date payTime) {
  40. // 查询购买套餐信息
  41. VipPackageVo packageVo = vipMapper.getVipPackageById(packageId);
  42. if (null == packageVo) {
  43. return ResponseJson.error("会员套餐不存在", null);
  44. }
  45. // 会员生效日期
  46. Date beginTime = new Date();
  47. /*
  48. * 构建会员信息
  49. */
  50. AuthVipPo authVip = new AuthVipPo();
  51. AuthVipPo dbAuthVip = vipMapper.getAuthVipInfo(authUserId);
  52. if (null != dbAuthVip) {
  53. authVip.setId(dbAuthVip.getId());
  54. if (dbAuthVip.getEndTime().compareTo(beginTime) > 0) {
  55. // 有效期内续费,用原结束时间作为开始时间来计算结束时间
  56. beginTime = dbAuthVip.getEndTime();
  57. authVip.setBeginTime(dbAuthVip.getBeginTime());
  58. } else {
  59. // 过期重新续费,重置生效时间
  60. authVip.setBeginTime(beginTime);
  61. }
  62. } else {
  63. // 新会员
  64. authVip.setBeginTime(beginTime);
  65. }
  66. // 计算会员到期时间
  67. Calendar calendar = Calendar.getInstance();
  68. calendar.setTime(beginTime);
  69. calendar.add(1 == packageVo.getUnit() ? Calendar.MONTH : Calendar.YEAR, packageVo.getDuration());
  70. Date endTime = calendar.getTime();
  71. // 查询未支付的当前会员套餐购买记录
  72. Integer dbHistoryId = vipMapper.getVipHistoryId(authUserId, packageId);
  73. VipHistoryPo vipHistory = new VipHistoryPo();
  74. vipHistory.setAuthUserId(authUserId);
  75. vipHistory.setPackageId(packageId);
  76. vipHistory.setDuration(packageVo.getDuration() + (1 == packageVo.getUnit() ? "月" : "年"));
  77. vipHistory.setBeginTime(beginTime);
  78. vipHistory.setEndTime(endTime);
  79. vipHistory.setPayStatus(payStatus);
  80. vipHistory.setPayWay(payWay);
  81. vipHistory.setPrice(packageVo.getPrice());
  82. vipHistory.setServices(services);
  83. vipHistory.setPayTime(payTime);
  84. if (null != dbHistoryId) {
  85. vipHistory.setId(dbHistoryId);
  86. // 更新未支付的当前会员购买记录
  87. vipMapper.updateVipHistory(vipHistory);
  88. } else {
  89. // 新增会员购买记录
  90. vipMapper.insertVipHistory(vipHistory);
  91. }
  92. if (2 == payWay) {
  93. // 赠送会员保存会员信息
  94. authVip.setAuthUserId(authUserId);
  95. authVip.setUpdateTime(new Date());
  96. authVip.setEndTime(endTime);
  97. authVip.setDelFlag(0);
  98. if (null != authVip.getId()) {
  99. // 更新会员信息
  100. vipMapper.updateAuthVipInfo(authVip);
  101. if (authVip.getBeginTime().compareTo(beginTime) >= 0) {
  102. // 删除原有角色关联
  103. systemMapper.deleteUserRoleRelation(authUserId);
  104. // 续费重新分配角色
  105. sysUserService.saveRoleRelation(authUserId, "1,2");
  106. }
  107. } else {
  108. // 新增会员信息
  109. vipMapper.insertAuthVipInfo(authVip);
  110. // 删除原有角色关联
  111. systemMapper.deleteUserRoleRelation(authUserId);
  112. // 分配角色
  113. sysUserService.saveRoleRelation(authUserId, "1,2");
  114. }
  115. }
  116. if (null != vipHistory.getId() && vipHistory.getId() > 0) {
  117. return ResponseJson.success(vipHistory.getId());
  118. }
  119. return ResponseJson.error("支付开通会员异常!", null);
  120. }
  121. @Override
  122. public ResponseJson configureVip(List<Map<String,Object>> packageList, List<Map<String, String>> serviceList) {
  123. // 删除原有的套餐及订制服务
  124. vipMapper.deleteVipPackages();
  125. vipMapper.deleteVipServices();
  126. // 保存套餐及订制服务
  127. packageList.forEach(pac->{
  128. PackageDto packageDto = new PackageDto();
  129. packageDto.setDuration(Integer.parseInt(pac.get("duration").toString()));
  130. packageDto.setUnit(Integer.parseInt(pac.get("unit").toString()));
  131. packageDto.setOriginalPrice(new BigDecimal(pac.get("originalPrice").toString()) );
  132. packageDto.setPrice(new BigDecimal(pac.get("price").toString()));
  133. vipMapper.insertVipPackage(packageDto);
  134. });
  135. serviceList.forEach(service -> vipMapper.insertVipService(service.get("name")));
  136. return ResponseJson.success();
  137. }
  138. @Override
  139. public ResponseJson<VipConfigurationVo> configureVipForm() {
  140. List<VipPackageVo> packageList = vipMapper.getVipPackageList();
  141. List<VipServiceVo> serviceList = vipMapper.getVipServiceList();
  142. VipConfigurationVo vipConfiguration = new VipConfigurationVo();
  143. vipConfiguration.setPackageList(packageList);
  144. vipConfiguration.setServiceList(serviceList);
  145. return ResponseJson.success(vipConfiguration);
  146. }
  147. @Override
  148. public ResponseJson<PageInfo<VipListVo>> vipList(String shopName, Integer shopType, Integer vipStatus, String mobile, String linkMan, Integer pageNum, Integer pageSize) {
  149. PageHelper.startPage(pageNum, pageSize);
  150. List<VipListVo> vipList = vipMapper.getVipList(shopName, shopType, vipStatus, mobile, linkMan);
  151. PageInfo<VipListVo> pageData = new PageInfo<>(vipList);
  152. return ResponseJson.success(pageData);
  153. }
  154. @Override
  155. public ResponseJson<PageInfo<VipHistoryListVo>> vipHistoryList(Integer authUserId, Integer vipPackageId, Integer vipStatus, String payBeginTime, String payEndTime, String endBeginTime, String endEndTime, Integer pageNum, Integer pageSize) {
  156. if (null == authUserId) {
  157. return ResponseJson.error("参数异常,供应商用户id不能为空", null);
  158. }
  159. PageHelper.startPage(pageNum, pageSize);
  160. List<VipHistoryListVo> vipHistoryList = vipMapper.getVipHistoryList(authUserId, vipPackageId, vipStatus, payBeginTime, payEndTime, endBeginTime, endEndTime);
  161. PageInfo<VipHistoryListVo> pageData = new PageInfo<>(vipHistoryList);
  162. return ResponseJson.success(pageData);
  163. }
  164. @Override
  165. public ResponseJson<VipInfoVo> getVipInfo(Integer authUserId) {
  166. if (null == authUserId) {
  167. return ResponseJson.error("参数异常,供应商用户id不能为空", null);
  168. }
  169. VipInfoVo vipInfo = vipMapper.getVipInfo(authUserId);
  170. if (null == vipInfo) {
  171. return ResponseJson.error("供应商用户不存在", null);
  172. }
  173. Integer freeDayLeft = vipInfo.getFreeDayLeft();
  174. vipInfo.setFreeUseFlag(freeDayLeft > 0 ? 1 : 0);
  175. vipInfo.setTipType(0);
  176. if (0 == vipInfo.getVipStatus()) {
  177. // 会员到期
  178. vipInfo.setTipType(4);
  179. } else if (1 == vipInfo.getVipStatus() && vipInfo.getEndDayLeft() <= 30) {
  180. // 会员即将到期
  181. vipInfo.setTipType(3);
  182. } else if (3 == vipInfo.getVipStatus()) {
  183. if (freeDayLeft > 0 && freeDayLeft <= 30) {
  184. // 试用即将到期
  185. vipInfo.setTipType(1);
  186. } else if (freeDayLeft < 0) {
  187. // 试用到期
  188. vipInfo.setTipType(2);
  189. }
  190. }
  191. return ResponseJson.success(vipInfo);
  192. }
  193. @Override
  194. public ResponseJson<List<VipPackageVo>> vipPackageList() {
  195. List<VipPackageVo> vipPackageList = vipMapper.getVipPackageList();
  196. return ResponseJson.success(vipPackageList);
  197. }
  198. @Override
  199. public ResponseJson<Map<String, Object>> vipMenusForm() {
  200. HashMap<String, Object> map = new HashMap<>();
  201. List<SysMenu> baseMenuList = vipMapper.getBaseMenuList();
  202. List<SysMenu> upMenuList = vipMapper.getUpMenuList();
  203. map.put("baseMenuList", baseMenuList);
  204. map.put("upMenuList", upMenuList);
  205. return ResponseJson.success(map);
  206. }
  207. @Override
  208. public ResponseJson vipMenusConfigure(List<Map<String, Object>> baseMenuList, List<Map<String, Object>> upMenuList) {
  209. systemMapper.deleteRoleMenuRelation(1);
  210. systemMapper.deleteRolePermissionRelation(1);
  211. systemMapper.deleteRoleMenuRelation(2);
  212. systemMapper.deleteRolePermissionRelation(2);
  213. Set<Integer> baseMenuIdSet = new HashSet<>();
  214. Set<Integer> basePermissionIdSet = new HashSet<>();
  215. for (Map<String,Object> menu : baseMenuList) {
  216. SysMenu baseMenu = new SysMenu();
  217. baseMenu.setBaseFlag(1);
  218. String menuId = menu.get("id").toString();
  219. baseMenu.setId(Integer.parseInt(menuId));
  220. baseMenu.setStatus(Integer.parseInt(menu.get("status").toString()));
  221. baseMenu.setTitle(menu.get("title").toString());
  222. // 更新菜单
  223. systemMapper.updateShopMenu(baseMenu);
  224. getAllBaseMenuIds(baseMenu, baseMenuIdSet, basePermissionIdSet);
  225. }
  226. baseMenuIdSet.forEach(menuId -> {
  227. // 保存角色菜单关系
  228. systemMapper.insertRoleMenuRelation(1, menuId);
  229. });
  230. basePermissionIdSet.forEach(permissionId->{
  231. // 保存角色权限关系
  232. systemMapper.insertRolePermissionRelation(1, permissionId);
  233. });
  234. upMenuList.forEach(menu->{
  235. Set<Integer> vipMenuIdSet = new HashSet<>();
  236. Set<Integer> vipPermissionIdSet = new HashSet<>();
  237. SysMenu upMenu = new SysMenu();
  238. Integer menuId = Integer.parseInt(menu.get("id").toString());
  239. upMenu.setBaseFlag(0);
  240. upMenu.setParentId(0);
  241. upMenu.setId(menuId);
  242. upMenu.setStatus(Integer.parseInt(menu.get("status").toString()));
  243. upMenu.setTitle(menu.get("title").toString());
  244. systemMapper.updateShopMenu(upMenu);
  245. // 获取菜单下所有权限id
  246. List<SysPermission> permissionList = systemMapper.getPermissionList(menuId);
  247. Integer dbRoleId = systemMapper.getVipRoleIdByMenuId(menuId);
  248. sysMenuService.saveVipMenu(upMenu, permissionList);
  249. Integer roleId = systemMapper.getVipRoleIdByMenuId(menuId);
  250. // 获取子菜单列表
  251. List<SysMenu> childMenuList = systemMapper.getMenuList(menuId, 2, null);
  252. childMenuList.forEach(childMenu->{
  253. getAllVipMenuIds(childMenu, vipMenuIdSet, vipPermissionIdSet);
  254. });
  255. if (null == dbRoleId) {
  256. vipMenuIdSet.forEach(vipMenuId-> systemMapper.insertRoleMenuRelation(roleId, vipMenuId));
  257. vipPermissionIdSet.forEach(vipPermissionId-> systemMapper.insertRolePermissionRelation(roleId, vipPermissionId));
  258. }
  259. });
  260. return ResponseJson.success();
  261. }
  262. /**
  263. * 获取一颗菜单树下的所有菜单id和权限id
  264. */
  265. private ResponseJson<Void> getAllBaseMenuIds(SysMenu menu, Set<Integer> menuIdSet, Set<Integer> permissionIdSet) {
  266. // 删除基础菜单与会员角色的关联
  267. Integer menuId = menu.getId();
  268. menuIdSet.add(menuId);
  269. Integer roleId = systemMapper.getVipRoleIdByMenuId(menuId);
  270. if (null != roleId) {
  271. systemMapper.deleteRole(roleId);
  272. systemMapper.deleteRoleMenuRelation(roleId);
  273. systemMapper.deleteRolePermissionRelation(roleId);
  274. }
  275. // 获取菜单下所有权限id
  276. List<Integer> permissionIdList = systemMapper.getPermissionIds(menuId);
  277. permissionIdSet.addAll(permissionIdList);
  278. // 获取子菜单列表
  279. List<SysMenu> childMenuList = systemMapper.getMenuList(menuId, 2, null);
  280. // 遍历获取子菜单id和
  281. childMenuList.forEach(childMenu -> getAllBaseMenuIds(childMenu, menuIdSet, permissionIdSet));
  282. return ResponseJson.success();
  283. }
  284. /**
  285. * 获取一颗菜单树下的所有菜单id和权限id
  286. */
  287. private ResponseJson<Void> getAllVipMenuIds(SysMenu menu, Set<Integer> menuIdSet, Set<Integer> permissionIdSet) {
  288. Integer menuId = menu.getId();
  289. menuIdSet.add(menuId);
  290. // 获取菜单下所有权限id
  291. List<Integer> permissionIdList = systemMapper.getPermissionIds(menuId);
  292. permissionIdSet.addAll(permissionIdList);
  293. // 获取子菜单列表
  294. List<SysMenu> childMenuList = systemMapper.getMenuList(menuId, 2, null);
  295. // 遍历获取子菜单id和
  296. childMenuList.forEach(childMenu -> getAllBaseMenuIds(childMenu, menuIdSet, permissionIdSet));
  297. return ResponseJson.success();
  298. }
  299. @Override
  300. public ResponseJson<List<SysMenu>> vipServicesForm(Integer authUserId) {
  301. List<SysMenu> vipServiceList = systemMapper.getVipMenuList();
  302. List<Integer> vipRoleList = systemMapper.getVipRoleIdList(authUserId);
  303. vipServiceList.forEach(vipService->{
  304. vipService.setCheckFlag(0);
  305. vipRoleList.forEach(roleId->{
  306. if (roleId.equals(vipService.getRoleId())) {
  307. vipService.setCheckFlag(1);
  308. }
  309. });
  310. });
  311. return ResponseJson.success(vipServiceList);
  312. }
  313. @Override
  314. public ResponseJson vipServicesConfigure(Integer authUserId, String roleIds) {
  315. if (null == authUserId) {
  316. return ResponseJson.error("参数异常,用户id不能为空");
  317. }
  318. // 删除原有角色关联
  319. systemMapper.deleteUserRoleRelation(authUserId);
  320. // 保存用户角色关系
  321. sysUserService.saveRoleRelation(authUserId, roleIds + ",1,2");
  322. return ResponseJson.success();
  323. }
  324. }