UserspaceServiceImpl.java 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. package com.uas.sso.service.impl;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.uas.sso.common.util.HttpUtil;
  5. import com.uas.sso.core.ICallable;
  6. import com.uas.sso.core.Status;
  7. import com.uas.sso.dao.UserspaceDao;
  8. import com.uas.sso.entity.*;
  9. import com.uas.sso.exception.VisibleError;
  10. import com.uas.sso.logging.LoggerManager;
  11. import com.uas.sso.logging.SyncBufferedLogger;
  12. import com.uas.sso.service.*;
  13. import com.uas.sso.util.ChineseUtils;
  14. import com.uas.sso.util.ExecuteUtils;
  15. import com.uas.sso.util.StringUtil;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.data.domain.Page;
  18. import org.springframework.data.domain.PageRequest;
  19. import org.springframework.data.domain.Pageable;
  20. import org.springframework.data.jpa.domain.Specification;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.util.CollectionUtils;
  23. import org.springframework.util.StringUtils;
  24. import javax.persistence.criteria.*;
  25. import java.sql.Timestamp;
  26. import java.util.*;
  27. /**
  28. * 企业信息service层
  29. *
  30. * @author wangmh
  31. * @date 2018/1/5
  32. */
  33. @Service
  34. public class UserspaceServiceImpl implements UserspaceService {
  35. @Autowired
  36. private UserspaceDao userspaceDao;
  37. @Autowired
  38. private UserService userService;
  39. @Autowired
  40. private AppService appService;
  41. @Autowired
  42. private UserspaceValidService userspaceValidService;
  43. @Autowired
  44. private PartnershipService partnershipService;
  45. SyncBufferedLogger syncLog = LoggerManager.getLogger(SyncBufferedLogger.class);
  46. /**
  47. * 企业初始uu号
  48. */
  49. public static final Long SPACE_INIT_UU = 10051000L;
  50. @Override
  51. public Userspace register(Userspace userspace, String appId) {
  52. User admin = userspace.getAdmin();
  53. if (admin == null) {
  54. throw new VisibleError("管理员不能为空");
  55. }
  56. // 校验企业名是否重复
  57. checkSpaceName(userspace.getSpaceName());
  58. // 校验营业执照号是否重复
  59. checkBusinessCode(userspace.getBusinessCode());
  60. // 设置域名
  61. if (StringUtils.isEmpty(userspace.getDomain())) {
  62. generateDefaultDomain(userspace);
  63. }
  64. // 设置uu号
  65. Long maxUU = userspaceDao.findMaxUU();
  66. userspace.setSpaceUU(StringUtils.isEmpty(maxUU) ? SPACE_INIT_UU : (maxUU + 1));
  67. // 设置管理员信息
  68. if (StringUtils.isEmpty(admin.getUserUU())) {
  69. User oldUser = userService.findByMobile(admin.getMobile());
  70. if (oldUser == null) {
  71. admin = userService.register(admin);
  72. } else {
  73. admin = oldUser;
  74. }
  75. // 给企业设置管理员
  76. userspace.setAdmin(admin);
  77. }
  78. userspace.setAdminUU(admin.getUserUU());
  79. // 将管理员设置在企业下
  80. List<User> users = new ArrayList<>();
  81. users.add(admin);
  82. userspace.setUsers(users);
  83. userspace.setValidCode((short) Status.NOT_APPLYING.getCode());
  84. userspace.setRegisterDate(new Timestamp(System.currentTimeMillis()));
  85. userspace.setFromApp(appId);
  86. // 注册企业
  87. userspace.setApps(appService.findDefaultUseApp());
  88. userspace = userspaceDao.save(userspace);
  89. if (userspace.getInviteSpaceUU() != null && userspace.getInviteUserUU() != null) {
  90. // 有邀请人添加合作伙伴
  91. partnershipService.addPartnershipRecord(appId, userspace);
  92. }
  93. // 开通应用
  94. syncUserSpaceInfo(userspace.toView(), "企业注册");
  95. return userspace;
  96. }
  97. private void syncUserSpaceInfo(final UserSpaceView userSpaceView, final String msg) {
  98. List<String> apps = appService.findUid();
  99. final UserView admin = userSpaceView.getAdmin();
  100. userSpaceView.setAdminUU(userSpaceView.getAdmin().getUserUU());
  101. userSpaceView.setAdmin(null);
  102. ExecuteUtils.execute(new ICallable<Void, String>() {
  103. @Override
  104. public Void call(String appId) throws Exception {
  105. App tempApp = appService.findOne(appId);
  106. if (tempApp != null && StringUtils.isEmpty(tempApp.getUserControl())
  107. && !StringUtils.isEmpty(tempApp.getBackSpaceUrl())) {
  108. String url = tempApp.getBackSpaceUrl();
  109. JSONObject formData = JSON.parseObject(JSON.toJSONString(userSpaceView));
  110. formData.putAll(JSON.parseObject(JSON.toJSONString(admin)));
  111. HttpUtil.ResponseWrap res = null;
  112. try {
  113. res = HttpUtil.doPost(url, formData, 10000);
  114. if (!res.isSuccess()) {
  115. syncLog.error(appId, msg + ",同步企业信息失败", JSON.toJSONString(formData), res.getContent());
  116. } else {
  117. syncLog.info(appId, msg + ",同步企业信息成功", JSON.toJSONString(formData));
  118. }
  119. } catch (Exception e) {
  120. syncLog.error(appId, msg + ",同步企业信息失败", JSON.toJSONString(formData), e.getMessage());
  121. }
  122. }
  123. return null;
  124. }
  125. }, apps);
  126. }
  127. /**
  128. * 生成默认域名
  129. *
  130. * @return
  131. */
  132. private String generateDefaultDomain(Userspace userspace) {
  133. String domain = null;
  134. Userspace oldOne = null;
  135. /// 代码复制,以后可能用到这个
  136. // if (!StringUtils.isEmpty(userspace.getUrl())) {
  137. // Pattern p = Pattern.compile("http(s)*://(.+\\.)*(.+)\\..+", Pattern.CASE_INSENSITIVE);
  138. // Matcher m = p.matcher(userspace.getUrl());
  139. // if (m.find()) {
  140. // domain = m.group(3);
  141. // if ("1688".equals(domain) || "taobao".equals(domain) || "qq".equals(domain) || "baidu".equals(domain)) {
  142. // domain = m.group(2);
  143. // }
  144. // }
  145. // }
  146. if (domain == null) {
  147. domain = StringUtil.substr(ChineseUtils.converterToFirstSpell(StringUtils.trimAllWhitespace(userspace.getSpaceName())), 0, 16);
  148. } else {
  149. oldOne = findByDomain(domain);
  150. if (oldOne != null) {
  151. domain = StringUtil.substr(ChineseUtils.converterToFirstSpell(StringUtils.trimAllWhitespace(userspace.getSpaceName())), 0, 16);
  152. }
  153. }
  154. oldOne = findByDomain(domain);
  155. if (oldOne != null) {
  156. domain = StringUtil.substr(ChineseUtils.converterToSpell(StringUtils.trimAllWhitespace(userspace.getSpaceName())), 0, 16);
  157. oldOne = findByDomain(domain);
  158. if (oldOne != null) {
  159. domain = null;
  160. }
  161. }
  162. return domain;
  163. }
  164. @Override
  165. public void checkSpaceName(String spaceName) {
  166. Userspace userSpace = userspaceDao.findBySpaceName(spaceName);
  167. if (userSpace != null) {
  168. throw new VisibleError("企业已被注册,请确认无误后联系管理员("+userSpace.getAdmin().getVipName()+")处理");
  169. }
  170. }
  171. @Override
  172. public void checkBusinessCode(String businessCode) {
  173. Userspace userSpace = userspaceDao.findByBusinessCode(businessCode);
  174. if (userSpace != null) {
  175. throw new VisibleError("该企业营业执照已被注册,请确认");
  176. }
  177. }
  178. @Override
  179. public Userspace findByDomain(String domain) {
  180. return userspaceDao.findByDomain(domain);
  181. }
  182. @Override
  183. public boolean spaceNameIsValid(String spaceName) {
  184. Userspace userSpace = userspaceDao.findBySpaceName(spaceName);
  185. return userSpace == null ? false : userSpace.getValidCode() == Status.AUTHENTICATED.getCode();
  186. }
  187. @Override
  188. public boolean businessCodeIsValid(String businessCode) {
  189. Userspace userSpace = userspaceDao.findByBusinessCode(businessCode);
  190. return userSpace == null ? false : userSpace.getValidCode() == Status.AUTHENTICATED.getCode();
  191. }
  192. @Override
  193. public void submitValidInfo(Userspace validSpace, Userspace userspace, User submitter) {
  194. // 校验企业名和营业执照是否被认证
  195. boolean isValid = spaceNameIsValid(userspace.getSpaceName());
  196. if (isValid) {
  197. throw new VisibleError("该企业名已被认证,请确认");
  198. }
  199. isValid = businessCodeIsValid(userspace.getBusinessCode());
  200. if (isValid) {
  201. throw new VisibleError("该企业营业执照号已被认证,请确认");
  202. }
  203. // 添加提交申请日志
  204. validSpace = userspaceDao.findOne(validSpace.getSpaceUU());
  205. validSpace.setValidCode((short) Status.TO_BE_CERTIFIED.getCode());
  206. userspaceDao.save(validSpace);
  207. userspace.setSpaceUU(validSpace.getSpaceUU());
  208. userspaceValidService.submitValid(userspace, submitter);
  209. }
  210. @Override
  211. public Userspace findOne(Long spaceUU) {
  212. return userspaceDao.findOne(spaceUU);
  213. }
  214. @Override
  215. public Page<String> searchName(String keyword, Integer number) {
  216. Pageable pageable = new PageRequest(0, number);
  217. Page<String> pUserSpaces = userspaceDao.findByPageInfo(keyword, pageable);
  218. return pUserSpaces;
  219. }
  220. @Override
  221. public Userspace findBySpaceName(String spaceName) {
  222. return userspaceDao.findBySpaceName(spaceName);
  223. }
  224. @Override
  225. public void unbindApp(Long spaceUU, String appId) {
  226. // 获取企业信息和应用信息,并校验
  227. Userspace userspace = userspaceDao.findOne(spaceUU);
  228. if (userspace == null) {
  229. throw new VisibleError("该企业不存在");
  230. }
  231. App app = appService.findOne(appId);
  232. if (app == null) {
  233. throw new VisibleError("该应用不存在");
  234. }
  235. // 解除绑定
  236. if (userspace.getApps().contains(app)) {
  237. userspace.getApps().remove(app);
  238. }
  239. userspaceDao.save(userspace);
  240. }
  241. @Override
  242. public void bindApp(Long spaceUU, String appId) {
  243. // 获取企业信息和应用信息,并校验
  244. Userspace userspace = userspaceDao.findOne(spaceUU);
  245. if (userspace == null) {
  246. throw new VisibleError("该企业不存在");
  247. }
  248. App app = appService.findOne(appId);
  249. if (app == null) {
  250. throw new VisibleError("该应用不存在");
  251. }
  252. // 开通应用
  253. if (userspace.getApps().contains(app)) {
  254. throw new VisibleError(String.format("该企业已开通%s应用", app.getUid()));
  255. }
  256. userspace.getApps().add(app);
  257. userspaceDao.save(userspace);
  258. }
  259. @Override
  260. public Userspace findByBusinessCode(String businessCode) {
  261. return userspaceDao.findByBusinessCode(businessCode);
  262. }
  263. @Override
  264. public void addUser(Userspace userspace, List<User> users) {
  265. userspace.getUsers().addAll(users);
  266. userspaceDao.save(userspace);
  267. }
  268. @Override
  269. public Userspace save(Userspace userspace) {
  270. return userspaceDao.save(userspace);
  271. }
  272. @Override
  273. public List<String> findRepeatName() {
  274. return userspaceDao.findRepeatName();
  275. }
  276. @Override
  277. public List<Userspace> findAllBySpaceName(String name) {
  278. return userspaceDao.findAllBySpaceName(name);
  279. }
  280. @Override
  281. public List<Userspace> findAll(String ids) {
  282. List<Long> idList = JSONObject.parseArray(ids, Long.class);
  283. if (!CollectionUtils.isEmpty(idList)) {
  284. return userspaceDao.findAll(idList);
  285. }
  286. return Collections.emptyList();
  287. }
  288. @Override
  289. public void changeAdmin(String appId, Userspace space, User afterAdmin) {
  290. space.setAdminUU(afterAdmin.getUserUU());
  291. space.setAdmin(afterAdmin);
  292. if (!space.getUsers().contains(afterAdmin)) {
  293. space.getUsers().add(afterAdmin);
  294. }
  295. space = userspaceDao.save(space);
  296. syncUserSpaceInfo(space.toView(), "从应用:" + appId + "更换管理员");
  297. }
  298. @Override
  299. public Page<Userspace> findByKeyword(final String keyword, int pageNumber, int pageSize) {
  300. Pageable pageable = PageInfo.pageRequest(pageNumber, pageSize);
  301. Page<Userspace> page = userspaceDao.findAll(new Specification<Userspace>() {
  302. @Override
  303. public Predicate toPredicate(Root<Userspace> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
  304. List<Predicate> keyPredicates = new ArrayList<>();
  305. // 模糊查询企业名称,营业执照号,注册地址,管理员姓名
  306. keyPredicates.add(cb.like(cb.upper(root.get("spaceName").as(String.class)), "%" + keyword.toUpperCase() + "%"));
  307. keyPredicates.add(cb.like(cb.upper(root.get("businessCode").as(String.class)), "%" + keyword.toUpperCase() + "%"));
  308. keyPredicates.add(cb.like(cb.upper(root.get("regAddress").as(String.class)), "%" + keyword.toUpperCase() + "%"));
  309. keyPredicates.add(cb.like(cb.upper(root.join("admin", JoinType.INNER).get("vipName").as(String.class)), "%" + keyword.toUpperCase() + "%"));
  310. Predicate[] predicates = new Predicate[keyPredicates.size()];
  311. query.where(cb.or(keyPredicates.toArray(predicates)));
  312. query.orderBy(cb.desc(root.get("registerDate").as(Integer.class)));
  313. return query.getRestriction();
  314. }
  315. }, pageable);
  316. return new PageInfo<Userspace>(page.getContent(), pageable, page.getTotalElements());
  317. }
  318. }