BE_ERPLogin.groovy 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323
  1. import com.sdtool.common.datas.TokenUserFrom
  2. import com.sdtool.common.entity.mall.MallUser
  3. import com.sdtool.common.entity.system.SocialUser
  4. import com.dySweetFishPlugin.sql.dao.TunaService
  5. import com.dySweetFishPlugin.tool.crypto.EncryptUtil
  6. import com.sweetfish.convert.json.JsonConvert
  7. import com.sweetfish.service.RetResult
  8. import com.sdtool.business.dao.LoginDao
  9. import com.sdtool.common.api.*
  10. import com.sdtool.common.datas.ERPModule
  11. import com.sdtool.common.entity.base.DataBaseMultiItemEx
  12. import com.sdtool.common.entity.base.ProcessEntityItem
  13. import com.sdtool.common.entity.site.ERPTokenUser
  14. import com.sdtool.common.entity.site.LoginRequest
  15. import com.sdtool.common.entity.site.LoginResult
  16. import com.sdtool.common.entity.system.LoginUser
  17. import com.sdtool.common.tool.ERPUtils
  18. import com.sweetfish.util.ResourceFactory
  19. import org.apache.commons.lang3.StringUtils
  20. import org.apache.logging.log4j.LogManager
  21. import org.apache.logging.log4j.Logger
  22. import org.rex.RMap
  23. import javax.annotation.Resource
  24. /**
  25. * ERP系统登录脚本,随着业务复杂度提高,登录功能统一一个接口提供
  26. */
  27. @SuppressWarnings("unused")
  28. class BE_ERPLogin implements BusinessExecutor<ProcessEntityItem<LoginRequest>, LoginResult> {
  29. protected final Logger logger = LogManager.getLogger(this.getClass().getSimpleName())
  30. @Resource
  31. DeptService deptService
  32. @Resource
  33. ERPService erpService
  34. @Resource
  35. TunaService tunaService
  36. @Resource
  37. SysMessageService sysMessageService
  38. @Resource
  39. JsonConvert jsonConvert
  40. @Resource(name = "server")
  41. private ResourceFactory rf
  42. @Resource(name = "property.passwordSalt")
  43. private String passwordSalt
  44. private LoginDao loginDao
  45. //登录策略,当前数据库那一个地方需要重启服务,可改成不需要的,参考TunaDaoService动态sql执行
  46. def loginStrategies = [
  47. "0" : [
  48. "name" : "后台管理系统登录",
  49. "resourceLogin": { LoginRequest loginInfo ->
  50. if (loginInfo.password == "D227E2334F89C81FDE0967B115D4F29C") {
  51. LoginUser info = new LoginUser()
  52. info.setId(-999L)
  53. info.setLoginName("SuperResourcer")
  54. info.setUserName("资源管理员")
  55. info.setDeptName("资源管理")
  56. return RetResult.<ERPTokenUser> successT().result(new ERPTokenUser(info))
  57. } else {
  58. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  59. }
  60. },
  61. "login" : { LoginRequest loginInfo, RMap mapParams, DataBaseMultiItemEx supplierItem ->
  62. mapParams.put("companyId", 0L)
  63. LoginUser info = loginDao.login(mapParams, supplierItem.dataBaseAlias, Long.parseLong(supplierItem.shardingKey))
  64. if (info == null) {
  65. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  66. }
  67. if (info.status == 1) {
  68. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号已冻结,登录失败")
  69. }
  70. info.deptName = deptService.getRedisDeptName(info.getDeptId(), Long.parseLong(supplierItem.shardingKey))
  71. sysMessageService.syncSysGroupMessage(info.getId(), Long.parseLong(supplierItem.shardingKey))
  72. return RetResult.<ERPTokenUser> successT().result(new ERPTokenUser(info))
  73. },
  74. "tokenKey" : ""
  75. ],
  76. "10" : [
  77. "name" : "PC端商城管理登录",
  78. "resourceLogin": { LoginRequest loginInfo ->
  79. if (loginInfo.password == "D227E2334F89C81FDE0967B115D4F29C") {
  80. LoginUser info = new LoginUser()
  81. info.setId(-999L)
  82. info.setLoginName("SuperResourcer")
  83. info.setUserName("资源管理员")
  84. info.setDeptName("资源管理")
  85. return RetResult.<ERPTokenUser> successT().result(new ERPTokenUser(info))
  86. } else {
  87. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  88. }
  89. },
  90. "login" : { LoginRequest loginInfo, RMap mapParams, DataBaseMultiItemEx supplierItem ->
  91. LoginUser info = loginDao.login(mapParams, supplierItem.dataBaseAlias, Long.parseLong(supplierItem.shardingKey))
  92. if (info == null) {
  93. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  94. }
  95. if (info.status == 1) {
  96. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号已冻结,登录失败")
  97. }
  98. //需要强制修改下登录来源
  99. ERPTokenUser tokenUser = new ERPTokenUser(info)
  100. tokenUser.userFrom = TokenUserFrom.PC_MALL_ADMIN.value
  101. return RetResult.<ERPTokenUser> successT().result(tokenUser)
  102. },
  103. "tokenKey" : ""
  104. ],
  105. "11" : [
  106. "name" : "PC端商城购物网站登录",
  107. "resourceLogin": { LoginRequest loginInfo ->
  108. //不允许使用superResourcer登录,防漏洞
  109. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  110. },
  111. "login" : { LoginRequest loginInfo, RMap mapParams, DataBaseMultiItemEx supplierItem ->
  112. MallUser info = loginDao.mallLogin(mapParams, supplierItem.dataBaseAlias, Long.parseLong(supplierItem.shardingKey))
  113. if (info == null) {
  114. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  115. }
  116. if (info.voidFlag == 1) {
  117. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号已冻结,登录失败")
  118. }
  119. return RetResult.<ERPTokenUser> successT().result(new ERPTokenUser(info))
  120. },
  121. "tokenKey" : ""
  122. ],
  123. "20" : [
  124. "name" : "PC端产品中心登录",
  125. "resourceLogin": { LoginRequest loginInfo ->
  126. if (loginInfo.password == "D227E2334F89C81FDE0967B115D4F29C") {
  127. LoginUser info = new LoginUser()
  128. info.setId(-999L)
  129. info.setLoginName("SuperResourcer")
  130. info.setUserName("资源管理员")
  131. info.setDeptName("资源管理")
  132. return RetResult.<ERPTokenUser> successT().result(new ERPTokenUser(info))
  133. } else {
  134. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  135. }
  136. },
  137. "login" : { LoginRequest loginInfo, RMap mapParams, DataBaseMultiItemEx supplierItem ->
  138. mapParams.put("companyId", 0L)
  139. LoginUser info = loginDao.login(mapParams, supplierItem.dataBaseAlias, Long.parseLong(supplierItem.shardingKey))
  140. if (info == null) {
  141. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  142. }
  143. if (info.status == 1) {
  144. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号已冻结,登录失败")
  145. }
  146. info.deptName = deptService.getRedisDeptName(info.getDeptId(), Long.parseLong(supplierItem.shardingKey))
  147. ERPTokenUser tokenUser = new ERPTokenUser(info)
  148. tokenUser.setUserFrom(TokenUserFrom.PC_PRODUCT_CENTER.value)
  149. return RetResult.<ERPTokenUser> successT().result(tokenUser)
  150. },
  151. "tokenKey" : ""
  152. ],
  153. "50" : [
  154. "name" : "印刷商城微信小程序",
  155. "resourceLogin": { LoginRequest loginInfo ->
  156. //不允许使用superResourcer登录,防漏洞
  157. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  158. },
  159. "login" : { LoginRequest loginInfo, RMap mapParams, DataBaseMultiItemEx supplierItem ->
  160. if (mallMiniService == null) {
  161. //启动的服务不对,不支持50登录,只有aeMall服务才支持
  162. return RetResult.<ERPTokenUser> errorT().retinfo("无效的登录方式")
  163. }
  164. SocialUser socialUser = mallMiniService.getRedisMallSocialUser(loginInfo.socialOpenId, Long.parseLong(supplierItem.shardingKey))
  165. if (socialUser == null) {
  166. return RetResult.<ERPTokenUser> errorT().retinfo("未绑定用户,请绑定")
  167. }
  168. if (socialUser.mallUser == null) {
  169. return RetResult.<ERPTokenUser> errorT().retinfo("未绑定用户,请绑定")
  170. }
  171. if (socialUser.mallUser.voidFlag == 1) {
  172. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号已冻结,登录失败")
  173. }
  174. ERPTokenUser tokenUser = new ERPTokenUser(socialUser)
  175. return RetResult.<ERPTokenUser> successT().result(tokenUser)
  176. },
  177. "tokenKey" : ""
  178. ],
  179. "60" : [
  180. "name" : "ERP手机APP登录(用于生产反馈)",
  181. "resourceLogin": { LoginRequest loginInfo ->
  182. //不允许使用superResourcer登录,防漏洞
  183. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  184. },
  185. "login" : { LoginRequest loginInfo, RMap mapParams, DataBaseMultiItemEx supplierItem ->
  186. mapParams.put("companyId", 0L)
  187. LoginUser info = loginDao.login(mapParams, supplierItem.dataBaseAlias, Long.parseLong(supplierItem.shardingKey))
  188. if (info == null) {
  189. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号或密码错误,登录失败")
  190. }
  191. if (info.status == 1) {
  192. return RetResult.<ERPTokenUser> errorT().retinfo("用户账号已冻结,登录失败")
  193. }
  194. info.deptName = deptService.getRedisDeptName(info.getDeptId(), Long.parseLong(supplierItem.shardingKey))
  195. ERPTokenUser tokenUser = new ERPTokenUser(info)
  196. tokenUser.setUserFrom(TokenUserFrom.APP_ERP_ADMIN.value)
  197. return RetResult.<ERPTokenUser> successT().result(tokenUser)
  198. },
  199. "tokenKey" : ""
  200. ]
  201. ]
  202. @Override
  203. String scriptName() {
  204. return "ERP系统登录"
  205. }
  206. @Override
  207. ERPModule module() {
  208. return ERPModule.LOGIN
  209. }
  210. @Override
  211. RetResult<LoginResult> execute(ProcessEntityItem<LoginRequest> source) {
  212. //直接定义Resource不好使,还是需要赋值
  213. loginStrategies.each {
  214. it.value.tokenKey = rf.find("property." + TokenUserFrom.getTokenKey(Integer.parseInt(it.key)), String.class)
  215. }
  216. if (source.inputItem == null) {
  217. return RetResult.<LoginResult> errorT().retinfo("未传入用户信息")
  218. }
  219. if (source.inputItem.supplierId <= 0L) {
  220. return RetResult.<LoginResult> errorT().retinfo("请选择登录公司信息")
  221. }
  222. DataBaseMultiItemEx supplierItem = erpService.getERPSupplierInfo(source.inputItem.supplierId)
  223. if (supplierItem == null) {
  224. return RetResult.<LoginResult> errorT().retinfo("无效的登录公司信息")
  225. }
  226. if (!loginStrategies.containsKey(String.valueOf(source.inputItem.loginFrom))) {
  227. return RetResult.<LoginResult> errorT().retinfo("无效的登录来源")
  228. }
  229. if (source.inputItem.loginFrom != TokenUserFrom.MINI_MALL.value) {
  230. if (StringUtils.isEmpty(source.inputItem.loginName)) {
  231. return RetResult.<LoginResult> errorT().retinfo("请输入账号")
  232. }
  233. if (StringUtils.isEmpty(source.inputItem.password)) {
  234. return RetResult.<LoginResult> errorT().retinfo("请输入密码")
  235. }
  236. source.inputItem.password = EncryptUtil.md5Digest(source.inputItem.password + passwordSalt)
  237. } else {
  238. source.inputItem.loginName = ""
  239. source.inputItem.password = ""
  240. }
  241. loginDao = tunaService.generate(LoginDao.class)
  242. RetResult<ERPTokenUser> userResult
  243. def loginStrategy = loginStrategies.get(String.valueOf(source.inputItem.loginFrom))
  244. if (source.inputItem.loginName.equalsIgnoreCase("SuperResourcer")) {
  245. userResult = loginStrategy.resourceLogin.call(source.inputItem)
  246. } else {
  247. RMap<String, Object> paramMap = new RMap<>()
  248. paramMap.put("loginName", source.inputItem.loginName)
  249. paramMap.put("password", source.inputItem.password)
  250. userResult = loginStrategy.login.call(source.inputItem, paramMap, supplierItem)
  251. }
  252. if (userResult.isSuccess()) {
  253. userResult.result.dataSourceId = supplierItem.dataBaseAlias
  254. userResult.result.supplierCode = Long.parseLong(supplierItem.shardingKey)
  255. //商城小程序的加密key单独处理一下,临时方案,最好还是前端区分一下,判断登录返回的user的userFrom
  256. String accessToken = (source.inputItem.loginFrom == TokenUserFrom.MINI_MALL.value)
  257. ? ERPUtils.parseTokenFromERPUser(userResult.result, loginStrategies.get(String.valueOf(TokenUserFrom.PC_MALL_FRONT.value)).tokenKey, jsonConvert)
  258. : ERPUtils.parseTokenFromERPUser(userResult.result, loginStrategy.tokenKey, jsonConvert)
  259. return RetResult.<LoginResult> successT().result(new LoginResult(userResult.result, accessToken))
  260. } else {
  261. return RetResult.<LoginResult> errorT().retinfo(userResult.retinfo)
  262. }
  263. }
  264. }