UserSpaceServiceImpl.java 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  1. package com.uas.account.service;
  2. import java.util.Arrays;
  3. import java.util.Collections;
  4. import java.util.Date;
  5. import java.util.HashSet;
  6. import java.util.List;
  7. import java.util.Set;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.cache.annotation.CacheEvict;
  10. import org.springframework.cache.annotation.Cacheable;
  11. import org.springframework.stereotype.Service;
  12. import org.springframework.transaction.annotation.Transactional;
  13. import org.springframework.ui.ModelMap;
  14. import org.springframework.util.CollectionUtils;
  15. import org.springframework.util.StringUtils;
  16. import com.alibaba.fastjson.JSON;
  17. import com.alibaba.fastjson.JSONObject;
  18. import com.uas.account.AccountConfig;
  19. import com.uas.account.core.Const;
  20. import com.uas.account.core.ICallable;
  21. import com.uas.account.core.Logger;
  22. import com.uas.account.core.Page;
  23. import com.uas.account.core.Status;
  24. import com.uas.account.core.util.ExecuteUtils;
  25. import com.uas.account.dao.PartnershipRecordDao;
  26. import com.uas.account.dao.UserDao;
  27. import com.uas.account.dao.UserSpaceDao;
  28. import com.uas.account.entity.App;
  29. import com.uas.account.entity.InvitationRecord;
  30. import com.uas.account.entity.PartnershipRecord;
  31. import com.uas.account.entity.Token;
  32. import com.uas.account.entity.User;
  33. import com.uas.account.entity.UserDetail;
  34. import com.uas.account.entity.UserFailed;
  35. import com.uas.account.entity.UserSpace;
  36. import com.uas.account.entity.UserSpaceAndUserInfo;
  37. import com.uas.account.entity.UserSpaceDetail;
  38. import com.uas.account.entity.UserSpaceDetailInfo;
  39. import com.uas.account.entity.UserSpaceFailed;
  40. import com.uas.account.entity.UserView;
  41. import com.uas.account.exception.VisibleError;
  42. import com.uas.account.util.BeanUtil;
  43. import com.uas.account.viewmodel.UserSpaceDetailView;
  44. import com.uas.dfs.service.FileClient;
  45. import com.uas.sso.common.util.HttpUtil;
  46. import com.uas.sso.common.util.HttpUtil.ResponseWrap;
  47. @Service
  48. @Transactional
  49. public class UserSpaceServiceImpl implements UserSpaceService {
  50. @Autowired
  51. private UserSpaceDao userSpaceDao;
  52. @Autowired
  53. private UserDao userDao;
  54. @Autowired
  55. private AppService appService;
  56. @Autowired
  57. private UserService userService;
  58. @Autowired
  59. private FileClient fileClient;
  60. @Autowired
  61. private TokenService tokenService ;
  62. @Autowired
  63. private PartnershipRecordDao partnershipRecordDao;
  64. @Autowired
  65. private SysDataToMallService sysService;
  66. private Logger logger = Logger.getLogger();
  67. @Override
  68. @CacheEvict(value = "userspaces", allEntries = true)
  69. public boolean save(UserSpace userSpace, UserSpaceDetail spaceDetail, Set<String> apps) {
  70. boolean isNew = false;
  71. // 详细资料
  72. UserSpaceDetail oldSpaceDetail = userSpaceDao.findByBusinessCode(spaceDetail.getBusinessCode());
  73. UserDetail adminDetail = new UserDetail(spaceDetail);
  74. if (oldSpaceDetail == null) {
  75. // 这里是通过其他应用直接注册
  76. if (!StringUtils.isEmpty(spaceDetail.getName())) {
  77. spaceDetail.setStatus(Status.ENABLED.value());
  78. if (null == spaceDetail.getRegisterDate()) {
  79. spaceDetail.setRegisterDate(new Date().getTime());
  80. }
  81. userSpaceDao.save(spaceDetail);
  82. logger.info(this.getClass(), spaceDetail.getBusinessCode(), "企业注册(来自接口)");
  83. oldSpaceDetail = spaceDetail;
  84. isNew = true;
  85. } else {
  86. throw new VisibleError("企业账户不存在,请先注册");
  87. }
  88. } else {
  89. BeanUtil.copyProperties(spaceDetail, oldSpaceDetail, true, "adminName", "adminTel", "adminEmail");
  90. if (!StringUtils.isEmpty(adminDetail.getMobile())) {
  91. // 未设置管理员的情况下,才覆盖管理员信息
  92. if (StringUtils.isEmpty(oldSpaceDetail.getAdminTel())) {
  93. oldSpaceDetail.setAdminName(adminDetail.getName());
  94. oldSpaceDetail.setAdminTel(adminDetail.getMobile());
  95. oldSpaceDetail.setAdminEmail(adminDetail.getEmail());
  96. }
  97. }
  98. userSpaceDao.save(oldSpaceDetail);
  99. }
  100. // 应用相关资料
  101. UserSpace oldOne = getExistUserSpace(userSpace);
  102. if (oldOne != null) {
  103. BeanUtil.copyProperties(userSpace, oldOne, true);
  104. if (userSpace.getId() != null) {
  105. // 只有在提供了ID的情况下,才能修改AppId和UID;
  106. // 同时,旗下的用户也一并修改AppId和spaceUID
  107. if (!userSpace.getAppId().equals(oldOne.getAppId()) || !userSpace.getUid().equals(oldOne.getUid())) {
  108. userDao.updateUserSpace(oldOne.getId(), userSpace.getAppId(), userSpace.getUid());
  109. }
  110. }
  111. logger.info(this.getClass(), oldSpaceDetail.getBusinessCode(), "修改企业信息,From: " + oldOne.getAppId(), oldSpaceDetail);
  112. } else {
  113. oldOne = userSpace;
  114. logger.info(this.getClass(), oldSpaceDetail.getBusinessCode(), "开通应用: " + oldOne.getAppId(), userSpace);
  115. }
  116. oldOne = userSpaceDao.save(oldOne);
  117. // 自动同步到其他App
  118. syncUserSpace(oldOne, oldSpaceDetail, apps);
  119. // 同步管理员信息
  120. App app = appService.findOne(oldOne.getAppId());
  121. User adminUser = new User(app, oldOne, adminDetail);
  122. userService.save(adminUser, adminDetail);
  123. // 从应用调用接口时,务必传dialectUID;否则视为并未开通过该应用
  124. if (isNew && null == oldOne.getDialectUID()) {
  125. applyApp(oldSpaceDetail.getBusinessCode(), oldOne.getAppId(), null, null);
  126. }
  127. return isNew;
  128. }
  129. private UserSpace getExistUserSpace(UserSpace userSpace) {
  130. UserSpace oldOne = null;
  131. if (userSpace.getUid() != null) {
  132. oldOne = findOne(userSpace.getAppId(), userSpace.getUid());
  133. }
  134. if (oldOne == null && userSpace.getId() != null) {
  135. oldOne = userSpaceDao.findOne(userSpace.getId());
  136. }
  137. return oldOne;
  138. }
  139. /**
  140. * 同步企业信息
  141. *
  142. * @param userSpace
  143. * @param spaceDetail
  144. * @param apps
  145. */
  146. private void syncUserSpace(final UserSpace userSpace, final UserSpaceDetail spaceDetail, Set<String> apps) {
  147. final App app = appService.findOne(userSpace.getAppId());
  148. String copyApps = app.getCopyApps();
  149. // 未指定应用,按当前应用的配置来选择
  150. if (null == apps) {
  151. // 默认all表示全部
  152. if (StringUtils.isEmpty(copyApps) || App.COPY_ALL.equals(copyApps)) {
  153. apps = new HashSet<String>(appService.findAllIDs());
  154. } else {
  155. apps = new HashSet<String>(Arrays.asList(copyApps.split(App.COPY_APP_SPLIT)));
  156. }
  157. } else {
  158. // 指定了应用时,也要带上Copy属性指定的应用
  159. if (!StringUtils.isEmpty(copyApps) && !App.COPY_ALL.equals(copyApps)) {
  160. apps.addAll(Arrays.asList(copyApps.split(App.COPY_APP_SPLIT)));
  161. }
  162. }
  163. ExecuteUtils.execute(new ICallable<Void, String>() {
  164. @Override
  165. public Void call(String appId) throws Exception {
  166. App tempApp = appService.findOne(appId);
  167. // 不是级联应用(如商城,级联于平台)+ 配置了回调接口 + 属于PUBLIC作用域
  168. if (tempApp != null && !tempApp.getUid().equals(app.getUid()) && StringUtils.isEmpty(tempApp.getUserControl())
  169. && !StringUtils.isEmpty(tempApp.getBackSpaceUrl()) && "PUBLIC".equals(tempApp.getScope())
  170. && (Const.YES == tempApp.getDefaultUse())) {
  171. UserSpace tempS = new UserSpace();
  172. tempS.setUid(userSpace.getUid());
  173. tempS.setName(userSpace.getName());
  174. tempS.setAppId(tempApp.getUid());
  175. UserSpace oldOne = findOne(tempApp.getUid(), tempS.getUid());
  176. if (oldOne == null) {
  177. tempS.setId(null);
  178. } else {
  179. tempS.setId(oldOne.getId());
  180. }
  181. try {
  182. UserSpace backUserSpace = callbackToApp(tempApp, tempS, spaceDetail);
  183. if (backUserSpace != null) {
  184. tempS.setDialectUID(backUserSpace.getDialectUID());
  185. }
  186. userSpaceDao.save(tempS);
  187. logger.info(this.getClass(), spaceDetail.getBusinessCode(), String.format("同步企业信息,To: %s", tempApp.getUid()));
  188. } catch (Exception e) {
  189. logger.error(this.getClass(), spaceDetail.getBusinessCode(), String.format("同步企业信息,To: %s", tempApp.getUid()), e);
  190. userSpaceDao.saveFailed(new UserSpaceFailed(userSpace, tempS, e));
  191. }
  192. }
  193. return null;
  194. }
  195. }, apps);
  196. }
  197. @Override
  198. public UserSpace callbackToApp(App app, UserSpace userSpace, UserSpaceDetail userSpaceDetail) throws Exception {
  199. String url = app.getBackSpaceUrl();
  200. if (!StringUtils.isEmpty(url)) {
  201. JSONObject formData = JSON.parseObject(JSON.toJSONString(userSpace));
  202. formData.putAll(JSON.parseObject(JSON.toJSONString(userSpaceDetail)));
  203. ResponseWrap res = HttpUtil.doPost(url, formData, 300000);// 5分钟超时
  204. if (!res.isSuccess()) {
  205. throw new Exception(res.getContent());
  206. } else {
  207. return JSON.parseObject(res.getContent(), UserSpace.class);
  208. }
  209. }
  210. return null;
  211. }
  212. @Override
  213. @Cacheable("userspaces")
  214. public UserSpace findOne(String appId, String uid) {
  215. return userSpaceDao.findOne(appId, uid);
  216. }
  217. @Override
  218. @Cacheable("userspaces")
  219. public List<UserSpace> findByUID(String uid) {
  220. return userSpaceDao.findByUID(uid);
  221. }
  222. @Override
  223. @Cacheable("userspaces")
  224. public UserSpace findByDialectUID(String appId, String dialectUID){
  225. return userSpaceDao.findDialectOne(appId, dialectUID);
  226. }
  227. @Override
  228. @Cacheable("userspaces")
  229. public Page<UserSpace> findAll(String appId, int pageNumber, int pageSize) {
  230. return userSpaceDao.findAll(appId, pageNumber, pageSize);
  231. }
  232. @Override
  233. @CacheEvict(value = "userspaces", allEntries = true)
  234. public UserSpaceDetail register(UserSpaceDetail userSpaceDetail) {
  235. UserSpaceDetail oldOne = findByName(userSpaceDetail.getName());
  236. if (oldOne != null && oldOne.getStatus().equals(Status.ENABLED.value())) {
  237. throw new VisibleError("企业名称已被注册!");
  238. }
  239. oldOne = findByBusinessCode(userSpaceDetail.getBusinessCode());
  240. if (oldOne != null && oldOne.getStatus().equals(Status.ENABLED.value())) {
  241. throw new VisibleError("营业执照号已被注册!");
  242. }
  243. // 对提交的验证码和手机号进行验证
  244. String checkcode = userSpaceDetail.getCheckcode();
  245. String checkcodeToken = userSpaceDetail.getCheckcodeToken();
  246. if (StringUtils.isEmpty(checkcodeToken)) {
  247. throw new VisibleError("请先获取验证码!");
  248. }
  249. if (StringUtils.isEmpty(checkcode)) {
  250. throw new VisibleError("请先输入验证码!");
  251. }
  252. Token existToken = tokenService.findOne(checkcodeToken);
  253. if (existToken == null || existToken.isExpired()) {
  254. throw new VisibleError("验证码已经失效,请重新获取");
  255. }
  256. if (!existToken.getTel().equals(userSpaceDetail.getAdminTel()) || !existToken.getEmail().equals(userSpaceDetail.getAdminEmail())){
  257. throw new VisibleError("请重新获取验证码");
  258. }
  259. String existCode = existToken.getBind().toString();
  260. if (!checkcode.equals(existCode)) {
  261. throw new VisibleError("验证码错误");
  262. }
  263. // 企业状态注册状态设为待激活
  264. // userSpaceDetail.setStatus(Status.UNACT.value());
  265. // 资料验证状态设为待验证
  266. // userSpaceDetail.setApproveStatus(Status.UNAPPROVED.value());
  267. // 不用验证状态,不设置待激活状态了
  268. userSpaceDetail.setRegisterDate(new Date().getTime());
  269. if (!StringUtils.isEmpty(userSpaceDetail.getUrl())) {
  270. userSpaceDetail.setUrl(StringUtils.trimAllWhitespace(userSpaceDetail.getUrl()));
  271. if (!userSpaceDetail.getUrl().toLowerCase().startsWith("http")) {
  272. userSpaceDetail.setUrl("http://" + userSpaceDetail.getUrl());
  273. }
  274. }
  275. if (StringUtils.isEmpty(userSpaceDetail.getArea())) {
  276. userSpaceDetail.setArea("中国大陆");
  277. }
  278. if (StringUtils.isEmpty(userSpaceDetail.getIndustry())) {
  279. userSpaceDetail.setIndustry("make");
  280. }
  281. if (!StringUtils.isEmpty(userSpaceDetail.getFax())) {
  282. userSpaceDetail.setFax(StringUtils.trimAllWhitespace(userSpaceDetail.getFax()));
  283. }
  284. if (!StringUtils.isEmpty(userSpaceDetail.getTel())) {
  285. userSpaceDetail.setTel(StringUtils.trimAllWhitespace(userSpaceDetail.getTel()));
  286. }
  287. if (!StringUtils.isEmpty(userSpaceDetail.getAdminTel())) {
  288. userSpaceDetail.setAdminTel(StringUtils.trimAllWhitespace(userSpaceDetail.getAdminTel()));
  289. }
  290. if (!StringUtils.isEmpty(userSpaceDetail.getAdminEmail())) {
  291. userSpaceDetail.setAdminEmail(StringUtils.trimAllWhitespace(userSpaceDetail.getAdminEmail()));
  292. }
  293. userSpaceDetail = userSpaceDao.save(userSpaceDetail);
  294. // 管理员
  295. userDao.save(new UserDetail(userSpaceDetail));
  296. logger.info(this.getClass(), userSpaceDetail.getBusinessCode(), "企业注册");
  297. return userSpaceDetail;
  298. }
  299. @Override
  300. @CacheEvict(value = "userspaces", allEntries = true)
  301. public UserSpaceDetail registerByMobile(UserSpaceDetail userSpaceDetail) {
  302. userSpaceDetail.setStatus(Status.UNAUDIT.value());
  303. userSpaceDetail.setRegisterDate(new Date().getTime());
  304. if (!StringUtils.isEmpty(userSpaceDetail.getUrl())) {
  305. userSpaceDetail.setUrl(StringUtils.trimAllWhitespace(userSpaceDetail.getUrl()));
  306. if (!userSpaceDetail.getUrl().toLowerCase().startsWith("http")) {
  307. userSpaceDetail.setUrl("http://" + userSpaceDetail.getUrl());
  308. }
  309. }
  310. if (StringUtils.isEmpty(userSpaceDetail.getArea())) {
  311. userSpaceDetail.setArea("中国大陆");
  312. }
  313. if (StringUtils.isEmpty(userSpaceDetail.getIndustry())) {
  314. userSpaceDetail.setIndustry("make");
  315. }
  316. if (!StringUtils.isEmpty(userSpaceDetail.getFax())) {
  317. userSpaceDetail.setFax(StringUtils.trimAllWhitespace(userSpaceDetail.getFax()));
  318. }
  319. if (!StringUtils.isEmpty(userSpaceDetail.getTel())) {
  320. userSpaceDetail.setTel(StringUtils.trimAllWhitespace(userSpaceDetail.getTel()));
  321. }
  322. if (!StringUtils.isEmpty(userSpaceDetail.getAdminTel())) {
  323. userSpaceDetail.setAdminTel(StringUtils.trimAllWhitespace(userSpaceDetail.getAdminTel()));
  324. }
  325. if (!StringUtils.isEmpty(userSpaceDetail.getAdminEmail())) {
  326. userSpaceDetail.setAdminEmail(StringUtils.trimAllWhitespace(userSpaceDetail.getAdminEmail()));
  327. }
  328. userSpaceDetail = userSpaceDao.save(userSpaceDetail);
  329. // 管理员
  330. userDao.save(new UserDetail(userSpaceDetail));
  331. logger.info(this.getClass(), userSpaceDetail.getName(), "企业注册(通过手机)");
  332. return userSpaceDetail;
  333. }
  334. @Override
  335. @Cacheable(value = "userspaces", key = "'businessCode:'+#businessCode")
  336. public UserSpaceDetail findByBusinessCode(String businessCode) {
  337. return userSpaceDao.findByBusinessCode(businessCode);
  338. }
  339. @Override
  340. @Cacheable(value = "userspaces", key = "'id:'+#id")
  341. public UserSpaceDetail findById(Long id) {
  342. return userSpaceDao.findById(id);
  343. }
  344. @Override
  345. @Cacheable(value = "userspaces", key = "'domain:'+#domain")
  346. public UserSpaceDetail findByDomain(String domain) {
  347. return userSpaceDao.findByDomain(domain);
  348. }
  349. @Override
  350. @Cacheable(value = "userspaces", key = "'name:'+#name")
  351. public UserSpaceDetail findByName(String name) {
  352. return userSpaceDao.findByName(name);
  353. }
  354. @Override
  355. public Page<UserSpaceDetailView> findAllUnActive(String name, String businessCode, int pageNumber, int pageSize) {
  356. return userSpaceDao.findAllView(pageNumber, pageSize, name, businessCode, Status.UNACT.value());
  357. }
  358. @Override
  359. public Page<UserSpaceDetailView> findAllEnable(String name, String businessCode, int pageNumber, int pageSize) {
  360. return userSpaceDao.findAllView(pageNumber, pageSize, name, businessCode, Status.ENABLED.value());
  361. }
  362. @Override
  363. public Page<UserSpaceDetailView> findAllUnAudit(String name, String businessCode, int pageNumber, int pageSize) {
  364. return userSpaceDao.findAllView(pageNumber, pageSize, name, businessCode, Status.UNAUDIT.value());
  365. }
  366. @Override
  367. public Page<UserSpaceDetailView> findAllUnApply(String name, String businessCode, int pageNumber, int pageSize) {
  368. return userSpaceDao.findAllView(pageNumber, pageSize, name, businessCode, Status.UNAPPLY.value());
  369. }
  370. @Override
  371. @CacheEvict(value = "userspaces", allEntries = true)
  372. public UserSpaceDetail save(UserSpaceDetail userSpaceDetail) {
  373. return userSpaceDao.save(userSpaceDetail);
  374. }
  375. @Override
  376. @CacheEvict(value = "userspaces", allEntries = true)
  377. public void delete(UserSpaceDetail userSpaceDetail) {
  378. UserSpaceDetail oldOne = findByBusinessCode(userSpaceDetail.getBusinessCode());
  379. if (oldOne != null) {
  380. if (Status.ENABLED.value() == oldOne.getStatus()) {
  381. throw new VisibleError("企业已激活,无法删除");
  382. }
  383. if (!StringUtils.isEmpty(oldOne.getBusinessCodeImage())) {
  384. fileClient.delete(oldOne.getBusinessCodeImage());
  385. }
  386. userSpaceDao.delete(userSpaceDetail);
  387. }
  388. }
  389. @Override
  390. @CacheEvict(value = "userspaces", allEntries = true)
  391. public void enable(String businessCode) {
  392. UserSpaceDetail detail = findByBusinessCode(businessCode);
  393. if (detail != null) {
  394. detail.setStatus(Status.UNACT.value());
  395. userSpaceDao.save(detail);
  396. logger.info(this.getClass(), businessCode, "审批企业信息", "允许通过");
  397. } else {
  398. throw new VisibleError("找不到该企业资料");
  399. }
  400. }
  401. @Override
  402. @CacheEvict(value = "userspaces", allEntries = true)
  403. public void disable(Long id, String reason) {
  404. UserSpaceDetail detail = findById(id);
  405. if (detail != null) {
  406. detail.setStatus(Status.UNAPPLY.value());
  407. detail.setErrMsg(reason);
  408. userSpaceDao.save(detail);
  409. logger.info(this.getClass(), String.valueOf(id), "审批企业信息", reason);
  410. } else {
  411. throw new VisibleError("找不到该企业资料");
  412. }
  413. }
  414. @Override
  415. @CacheEvict(value = { "userspaces", "users", "userView" }, allEntries = true)
  416. public UserSpaceAndUserInfo initUserSpaceDetail(final UserSpaceDetail detail, final String adminPassword,
  417. final List<UserDetail> users) {
  418. final UserSpaceAndUserInfo info = new UserSpaceAndUserInfo();
  419. List<App> apps = appService.findAll();
  420. final UserDetail userDetail = new UserDetail(detail);
  421. detail.setStatus(Status.ENABLED.value());
  422. userSpaceDao.save(detail);
  423. if (!CollectionUtils.isEmpty(users)) {
  424. for (UserDetail det : users) {
  425. det = userDao.save(det);
  426. }
  427. }
  428. ExecuteUtils.execute(new ICallable<Void, App>() {
  429. @Override
  430. public Void call(App app) throws Exception {
  431. if (StringUtils.isEmpty(app.getUserControl())
  432. && (!StringUtils.isEmpty(app.getBackSpaceUrl()) || !StringUtils.isEmpty(app.getBackUserUrl()))
  433. && (Const.YES == app.getDefaultUse())) {
  434. if (!StringUtils.isEmpty(app.getBackSpaceUrl())) {
  435. UserSpace userSpace = new UserSpace(app, detail);
  436. try {
  437. userSpace = userSpaceDao.save(userSpace);
  438. UserSpace backUserSpace = callbackToApp(app, userSpace, detail);
  439. if (backUserSpace != null) {
  440. userSpace.setDialectUID(backUserSpace.getDialectUID());
  441. userSpace = userSpaceDao.save(userSpace);
  442. info.setSpaceDialectUID(userSpace.getDialectUID());
  443. logger.info(this.getClass(), detail.getBusinessCode(), "开通应用: " + app.getUid(), userSpace);
  444. sysService.UserSpace(userSpace, detail);
  445. User user = new User(app, userSpace, detail);
  446. user.setPassword(adminPassword);
  447. user = userDao.save(user);
  448. try {
  449. User backUser = userService.syncUserToApp(app, user, userDetail);
  450. if (backUser != null) {
  451. user.setDialectUID(backUser.getDialectUID());
  452. if (backUser.getAppId().equals("b2b")) {
  453. user.setSalt(backUser.getSalt());
  454. user.setPassword(userService.getEncryPassword(app.getEncryFormat(),
  455. adminPassword, backUser.getSalt()));
  456. } else if (backUser.getAppId().equals("im")) {
  457. user.setPassword(userService.getEncryPassword(app.getEncryFormat(),
  458. adminPassword, null));
  459. }
  460. // 不能调用userService的save()
  461. user = userDao.save(user);
  462. info.setUserDialectUID(user.getDialectUID());
  463. logger.info(this.getClass(), detail.getBusinessCode(), "创建用户: " + user.getUid(), user);
  464. sysService.user(user);
  465. if (null != detail.getInviteuid() && null != detail.getInviteUserCode()) {
  466. addPartnershipRecord(detail, user);
  467. } else {
  468. addPartnershipList(detail, user);
  469. }
  470. }
  471. } catch (Exception e) {
  472. e.printStackTrace();
  473. userDao.saveFailed(new UserFailed(user, e));
  474. }
  475. if (!CollectionUtils.isEmpty(users)) {
  476. for (UserDetail det : users) {
  477. List<UserView> othUsers = userService.findByAppAndUID(app.getUid(), det.getMobile());
  478. user = new User(app, userSpace, det);
  479. if (!CollectionUtils.isEmpty(othUsers)) {
  480. // 同应用下,密码密文是一致的,可以直接设置
  481. user.setPassword(othUsers.get(0).getPassword());
  482. user.setDialectUID(othUsers.get(0).getDialectUID());
  483. }
  484. // 密码为空的用户会在首次登录的时候去设置密码
  485. user = userDao.save(user);
  486. try {
  487. User backUser = userService.syncUserToApp(app, user, det);
  488. if (backUser != null) {
  489. user.setDialectUID(backUser.getDialectUID());
  490. if (backUser.getAppId().equals("b2b")) {
  491. user.setSalt(backUser.getSalt());
  492. }
  493. // 不能调用userService的save()
  494. user = userDao.save(user);
  495. logger.info(this.getClass(), detail.getBusinessCode(), "创建用户: " + user.getUid(), user);
  496. }
  497. } catch (Exception e) {
  498. e.printStackTrace();
  499. userDao.saveFailed(new UserFailed(user, e));
  500. }
  501. }
  502. }
  503. } else {
  504. logger.error(this.getClass(), detail.getBusinessCode(), "开通应用: " + app.getUid(), userSpace);
  505. }
  506. } catch (Exception e) {
  507. e.printStackTrace();
  508. logger.error(this.getClass(), detail.getBusinessCode(), "开通应用: " + app.getUid(), e);
  509. userSpaceDao.saveFailed(new UserSpaceFailed(userSpace, e));
  510. }
  511. } else {
  512. // 应用本身无需绑定企业
  513. User user = new User(app, detail);
  514. user.setPassword(adminPassword);
  515. userDao.save(user);// save or update
  516. try {
  517. User backUser = userService.syncUserToApp(app, user, userDetail);
  518. if (backUser != null) {
  519. user.setDialectUID(backUser.getDialectUID());
  520. user.setPassword(
  521. userService.getEncryPassword(app.getEncryFormat(), adminPassword, null));
  522. // 不能调用userService的save()
  523. userDao.save(user);
  524. logger.info(this.getClass(), detail.getBusinessCode(), "创建用户: " + user.getUid(), user);
  525. }
  526. } catch (Exception e) {
  527. e.printStackTrace();
  528. userDao.saveFailed(new UserFailed(user, e));
  529. }
  530. if (!CollectionUtils.isEmpty(users)) {
  531. for (UserDetail det : users) {
  532. user = new User(app, det);
  533. userService.setPasswordBySameApp(app, user, det);
  534. user = userDao.save(user);
  535. try {
  536. User backUser = userService.syncUserToApp(app, user, det);
  537. if (backUser != null) {
  538. user.setDialectUID(backUser.getDialectUID());
  539. user.setPassword(userService.getEncryPassword(app.getEncryFormat(),
  540. adminPassword, null));
  541. // 不能调用userService的save()
  542. user = userDao.save(user);
  543. logger.info(this.getClass(), detail.getBusinessCode(), "创建用户: " + user.getUid(), user);
  544. }
  545. } catch (Exception e) {
  546. e.printStackTrace();
  547. userDao.saveFailed(new UserFailed(user, e));
  548. }
  549. }
  550. }
  551. }
  552. }
  553. return null;
  554. }
  555. }, apps);
  556. return info;
  557. }
  558. /**
  559. * 如果是从邀请链接注册,自动添加合作关系并是已同意状态
  560. *
  561. * @param detail
  562. * @param user
  563. */
  564. private void addPartnershipRecord(UserSpaceDetail detail, User user) {
  565. PartnershipRecord record = new PartnershipRecord();
  566. UserSpaceDetail spaceDetail = userSpaceDao.findByBusinessCode(detail.getInviteuid());
  567. List<User> userInfos = userDao.findByDialectUID(detail.getInviteUserCode());
  568. User userInfo = new User();
  569. if (!CollectionUtils.isEmpty(userInfos)) {
  570. userInfo = userInfos.get(0);
  571. }
  572. record.setAppId(AccountConfig.ACCOUNT_CENTER);
  573. record.setCustName(spaceDetail.getName());
  574. record.setCustUID(spaceDetail.getBusinessCode());
  575. record.setCustUserCode(userInfo.getDialectUID());
  576. record.setCustUserEmail(userInfo.getSecondUID());
  577. record.setCustUserName(userInfo.getName());
  578. record.setCustUserTel(userInfo.getUid());
  579. record.setOperateDate(new Date());
  580. record.setRequestDate(new Date());
  581. record.setStatus(Status.ENABLED.getPhrase());
  582. record.setStatusCode(Status.ENABLED.value());
  583. record.setVendName(detail.getName());
  584. record.setVendUID(detail.getBusinessCode());
  585. record.setVendUserCode(user.getDialectUID());
  586. record.setVendUserEmail(user.getSecondUID());
  587. record.setVendUserName(user.getName());
  588. record.setVendUserTel(user.getUid());
  589. record.setMethod(detail.getMethod());
  590. try {
  591. partnershipRecordDao.save(record);
  592. } catch (Exception e) {
  593. e.printStackTrace();
  594. }
  595. if ("addVendor".equals(record.getMethod())) {
  596. // 同步到平台生成供应商关系,并且设置同步到ERP状态为待下载
  597. try {
  598. synchroToPlatform(record);
  599. } catch (Exception e) {
  600. e.printStackTrace();
  601. }
  602. }
  603. }
  604. private void synchroToPlatform(PartnershipRecord record) throws Exception {
  605. App app = appService.findOne("b2b");
  606. String url = app.getBackPartnerUrl();
  607. if (!StringUtils.isEmpty(url)) {
  608. //时间不需要
  609. record.setRequestDate(null);
  610. record.setOperateDate(null);
  611. JSONObject formData = JSON.parseObject(JSON.toJSONString(record));
  612. ResponseWrap res = HttpUtil.doPost(url, formData, 30000);
  613. if (!res.isSuccess()) {
  614. logger.error("同步合作伙关系失败", "cust:" + record.getCustUID() + ",vend:" + record.getVendUID());
  615. } else {
  616. logger.info("同步合作伙关系", "cust:" + record.getCustUID() + ",vend:" + record.getVendUID());
  617. }
  618. }
  619. }
  620. /**
  621. * 批量模糊建立合作关系(这个不是精确添加,数据不会很准确)
  622. *
  623. * @param detail
  624. * @param user
  625. */
  626. private void addPartnershipList(UserSpaceDetail detail, User user) {
  627. List<InvitationRecord> records = partnershipRecordDao.findByVendname(detail.getName());
  628. if (!CollectionUtils.isEmpty(records)) {
  629. for (InvitationRecord record : records) {
  630. detail.setInviteuid(record.getBussinesscode());
  631. detail.setInviteUserCode(String.valueOf(record.getUseruu()));
  632. if ("erp".equals(record.getSource())) {
  633. detail.setMethod("addVendor");
  634. }
  635. addPartnershipRecord(detail, user);
  636. }
  637. }
  638. }
  639. @Override
  640. @CacheEvict(value = { "userspaces", "users", "userView" }, allEntries = true)
  641. public void applyApp(String businessCode, String appId, String adminPassword, final List<UserDetail> users) {
  642. if (!CollectionUtils.isEmpty(users)) {
  643. for (UserDetail det : users) {
  644. userDao.save(det);
  645. }
  646. }
  647. UserSpaceDetail detail = findByBusinessCode(businessCode);
  648. App app = appService.findOne(appId);
  649. if (detail != null && app != null && !StringUtils.isEmpty(app.getBackSpaceUrl())) {
  650. UserSpace userSpace = findOne(appId, businessCode);
  651. if (userSpace == null) {
  652. userSpace = userSpaceDao.save(new UserSpace(app, detail));
  653. }
  654. try {
  655. UserSpace backUserSpace = callbackToApp(app, userSpace, detail);
  656. if (backUserSpace != null) {
  657. userSpace.setDialectUID(backUserSpace.getDialectUID());
  658. userSpace = userSpaceDao.save(userSpace);
  659. logger.info(this.getClass(), detail.getBusinessCode(), "开通应用: " + app.getUid(), userSpace);
  660. // 同步企业数据到商城
  661. sysService.UserSpace(userSpace, detail);
  662. if (!StringUtils.isEmpty(app.getBackUserUrl())) {
  663. UserDetail userDetail = userService.findOne(detail.getAdminTel());
  664. if (userDetail == null) {
  665. userDetail = new UserDetail(detail);
  666. detail.setStatus(Status.ENABLED.value());
  667. userSpaceDao.save(detail);
  668. }
  669. User user = userService.findOne(appId, userSpace.getUid(), detail.getAdminTel());
  670. user = null == user ? new User(app, userSpace, detail) : user;
  671. if (null == user.getId()) {// is new
  672. if (!StringUtils.isEmpty(adminPassword)) {
  673. user.setPassword(adminPassword);
  674. } else {
  675. List<UserView> othUsers = userService.findByAppAndUID(appId, user.getUid());
  676. if (!CollectionUtils.isEmpty(othUsers)) {
  677. // 同应用下,密码密文是一致的,可以直接设置
  678. user.setPassword(othUsers.get(0).getPassword());
  679. user.setDialectUID(othUsers.get(0).getDialectUID());
  680. }
  681. }
  682. user = userDao.save(user);
  683. try {
  684. User backUser = userService.syncUserToApp(app, user, userDetail);
  685. if (backUser != null) {
  686. if (!StringUtils.isEmpty(adminPassword)) {
  687. if (adminPassword.length() < 32) {// 明文
  688. user.setPassword(userService.getEncryPassword(app.getEncryFormat(),
  689. adminPassword, backUser.getSalt()));
  690. } else {// 直接赋值以前的密码
  691. user.setPassword(adminPassword);
  692. }
  693. }
  694. user.setDialectUID(backUser.getDialectUID());
  695. user.setSalt(backUser.getSalt());
  696. // 不能调用userService的save()
  697. user = userDao.save(user);
  698. logger.info(this.getClass(), detail.getBusinessCode(), "创建用户: " + user.getUid(), user);
  699. // 同步人员信息到商城
  700. sysService.user(backUser);
  701. }
  702. } catch (Exception e) {
  703. e.printStackTrace();
  704. userDao.saveFailed(new UserFailed(user, e));
  705. }
  706. } else {// 之前开通时调用子应用接口失败,账户中心有对照关系,而子应用里面还没有的情况下
  707. user.setSpaceId(userSpace.getId());
  708. user.setSpaceDialectUID(userSpace.getDialectUID());
  709. user = userDao.save(user);
  710. if (StringUtils.isEmpty(user.getDialectUID())) {
  711. try {
  712. User backUser = userService.syncUserToApp(app, user, userDetail);
  713. if (backUser != null) {
  714. if (user.getPassword().length() < 32) {
  715. user.setPassword(userService.getEncryPassword(app.getEncryFormat(), user.getPassword(),
  716. backUser.getSalt()));
  717. }
  718. user.setDialectUID(backUser.getDialectUID());
  719. user.setSalt(backUser.getSalt());
  720. user = userDao.save(user);
  721. // 同步人员信息到商城
  722. sysService.user(backUser);
  723. }
  724. } catch (Exception e) {
  725. e.printStackTrace();
  726. userDao.saveFailed(new UserFailed(user, e));
  727. }
  728. }
  729. }
  730. if (!CollectionUtils.isEmpty(users)) {
  731. for (UserDetail det : users) {
  732. user = userService.findOne(appId, userSpace.getUid(), det.getMobile());
  733. user = null == user ? new User(app, userSpace, det) : user;
  734. if (null == user.getId()) {// is new
  735. List<UserView> othUsers = userService.findByAppAndUID(app.getUid(), det.getMobile());
  736. if (!CollectionUtils.isEmpty(othUsers)) {
  737. // 同应用下,密码密文是一致的,可以直接设置
  738. user.setPassword(othUsers.get(0).getPassword());
  739. user.setDialectUID(othUsers.get(0).getDialectUID());
  740. }
  741. if (user.getPassword() == null) {
  742. user.setPassword("111111");
  743. }
  744. user = userDao.save(user);
  745. try {
  746. User backUser = userService.syncUserToApp(app, user, det);
  747. if (backUser != null) {
  748. user.setDialectUID(backUser.getDialectUID());
  749. user.setSalt(backUser.getSalt());
  750. if (null != backUser.getPassword())
  751. user.setPassword(backUser.getPassword());
  752. // 不能调用userService的save()
  753. user = userDao.save(user);
  754. logger.info(this.getClass(), detail.getBusinessCode(), "创建用户: " + user.getUid(), user);
  755. // 同步人员信息到商城
  756. sysService.user(backUser);
  757. }
  758. } catch (Exception e) {
  759. e.printStackTrace();
  760. userDao.saveFailed(new UserFailed(user, e));
  761. }
  762. } else {// 之前开通时调用子应用接口失败,账户中心有对照关系,而子应用里面还没有的情况下
  763. user.setSpaceId(userSpace.getId());
  764. user.setSpaceDialectUID(userSpace.getDialectUID());
  765. user = userDao.save(user);
  766. // 去掉这个条件语句,因为存在同用户多组织情况,目前程序必须得sync多次
  767. // if
  768. // (StringUtils.isEmpty(user.getDialectUID()))
  769. // {}
  770. try {
  771. User backUser = userService.syncUserToApp(app, user, det);
  772. if (backUser != null) {
  773. if (user.getPassword().length() < 32) {
  774. user.setPassword(userService.getEncryPassword(app.getEncryFormat(), user.getPassword(),
  775. backUser.getSalt()));
  776. }
  777. user.setDialectUID(backUser.getDialectUID());
  778. user.setSalt(backUser.getSalt());
  779. user = userDao.save(user);
  780. // 同步人员信息到商城
  781. sysService.user(backUser);
  782. }
  783. } catch (Exception e) {
  784. e.printStackTrace();
  785. userDao.saveFailed(new UserFailed(user, e));
  786. }
  787. }
  788. }
  789. }
  790. }
  791. }
  792. } catch (Exception e) {
  793. e.printStackTrace();
  794. logger.error(this.getClass(), detail.getBusinessCode(), "开通应用: " + app.getUid(), e);
  795. userSpaceDao.saveFailed(new UserSpaceFailed(userSpace, e));
  796. }
  797. }
  798. }
  799. @Override
  800. public ModelMap getUserSpaceAppCount() {
  801. ModelMap map = new ModelMap("全部", userSpaceDao.getUserSpaceDetailCount());
  802. map.addAllAttributes(userSpaceDao.getUserSpaceAppCount());
  803. return map;
  804. }
  805. @Override
  806. public void enable(Long id) {
  807. UserSpaceDetail detail = findById(id);
  808. if (detail != null) {
  809. detail.setStatus(Status.UNACT.value());
  810. userSpaceDao.save(detail);
  811. logger.info(this.getClass(), detail.getBusinessCode(), "审批企业信息", "允许通过");
  812. } else {
  813. throw new VisibleError("找不到该企业资料");
  814. }
  815. }
  816. @Override
  817. public Page<UserSpaceDetailView> findAll(String name, String businessCode, String address, int pageNumber, int pageSize) {
  818. return userSpaceDao.findAllView(pageNumber, pageSize, name, businessCode, address);
  819. }
  820. @Override
  821. public Page<UserSpaceDetail> findByKeyword(String keyword, int pageNumber, int pageSize) {
  822. return userSpaceDao.findByKeyword(keyword, pageNumber, pageSize);
  823. }
  824. @Override
  825. public void delete(UserSpace userSpace) {
  826. userSpace = getExistUserSpace(userSpace);
  827. if (null != userSpace) {
  828. userService.deleteByAppAndSpace(userSpace.getAppId(), userSpace.getId());
  829. userSpaceDao.delete(userSpace);
  830. }
  831. }
  832. @Override
  833. public List<UserSpaceDetail> findAll(String ids) {
  834. List<Long> idList = JSONObject.parseArray(ids, Long.class);
  835. if (!CollectionUtils.isEmpty(idList))
  836. return userSpaceDao.findAll(idList);
  837. return Collections.emptyList();
  838. }
  839. @Override
  840. public String callbacktoAppAfterUpdate(App app, UserSpaceDetail detail) throws Exception {
  841. String url = app.getBackSpaceUrl();
  842. url = url + "/renewUserSpace";
  843. if (!StringUtils.isEmpty(url)) {
  844. JSONObject formData = JSON.parseObject(JSON.toJSONString(detail));
  845. ResponseWrap res = HttpUtil.doPost(url, formData, 300000);// 5分钟超时
  846. if (!res.isSuccess())
  847. throw new Exception(res.getContent());
  848. else
  849. return res.getContent();
  850. }
  851. return null;
  852. }
  853. @Override
  854. public List<UserSpaceDetailInfo> findByTel(List<String> tels) {
  855. return userSpaceDao.findByTel(tels);
  856. }
  857. @Override
  858. public List<UserSpaceDetailInfo> findUserByTel(List<String> tels) {
  859. return userSpaceDao.findUserByTel(tels);
  860. }
  861. @Override
  862. public List<UserSpaceDetailInfo> findByKeyword(String keyword, Integer pageNumber) {
  863. return userSpaceDao.findByKeyword(keyword, pageNumber);
  864. }
  865. @Override
  866. public void saveUserSpace(UserSpace space) {
  867. userSpaceDao.save(space);
  868. }
  869. @Override
  870. public void update(UserSpace space, Long id) {
  871. userSpaceDao.update(space, id);
  872. }
  873. @Override
  874. public List<String> searchName(String keyword, Integer number) {
  875. return userSpaceDao.searchName(keyword, number);
  876. }
  877. }