jl_service.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351
  1. /*
  2. * @description: 计量业务相关
  3. * @Author: CP
  4. * @Date: 2021-12-25 14:37:01
  5. * @FilePath: \construction_management\services\jl_service.go
  6. */
  7. package services
  8. import (
  9. "errors"
  10. "log"
  11. "net/http"
  12. "net/url"
  13. "strconv"
  14. "time"
  15. "github.com/dgrijalva/jwt-go"
  16. "github.com/spf13/viper"
  17. "go.mod/comm"
  18. "go.mod/conf"
  19. "go.mod/dao"
  20. "go.mod/datasource"
  21. "go.mod/lib"
  22. "go.mod/models"
  23. "go.mod/web/utils"
  24. "go.mod/web/viewmodels"
  25. )
  26. type JlService struct {
  27. dao *dao.ProjectDao
  28. accountDao *dao.ProjectAccountDao
  29. }
  30. // 创建项目用户service
  31. func NewJlService() *JlService {
  32. return &JlService{
  33. dao: dao.NewProjectDao(datasource.InstanceDbMaster()),
  34. accountDao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
  35. }
  36. }
  37. // 是否有项目
  38. func (s *JlService) IsCode(code string) map[string]interface{} {
  39. exist := 0
  40. if code != "" {
  41. projectData := s.dao.GetCode(code)
  42. if projectData.Id != 0 {
  43. exist = 1
  44. }
  45. }
  46. data := map[string]interface{}{
  47. "exist": exist,
  48. }
  49. return data
  50. }
  51. // 从计量 创建 项目和管理员账号
  52. func (s *JlService) ProjectAdd(claimsData *viewmodels.Jl) (map[string]interface{}, error) {
  53. var (
  54. err error
  55. JlResultProject map[string]interface{}
  56. JlResultAccount map[string]interface{}
  57. accountData *models.CmProjectAccount
  58. )
  59. Jlzf := lib.NewJlzf()
  60. // 1.获得计量 账号和项目 信息
  61. if JlResultProject, JlResultAccount, err = Jlzf.GetProjectAndAccount(claimsData.Code, claimsData.Account); err != nil {
  62. return nil, err
  63. }
  64. accountGroup := int(JlResultAccount["accountGroup"].(float64))
  65. // fmt.Println(JlResultProject)
  66. // fmt.Println(JlResultAccount)
  67. // 2. 计量账号 是否是管理员
  68. // 管理员 --只能管理员才能创建项目
  69. if JlResultAccount["isAdmin"].(float64) == 1 {
  70. // 2-1. 获得本地项目
  71. projectData := s.dao.GetCode(claimsData.Code)
  72. // 2-1-1.项目不存在(账号肯定不存在) - 创建项目
  73. if projectData.Id == 0 {
  74. //组合数据-项目 - 标注授权开启互通
  75. categoryId := strconv.FormatFloat(JlResultProject["categoryId"].(float64), 'f', 0, 64)
  76. project := &models.CmProject{}
  77. project.Name = JlResultProject["name"].(string)
  78. project.Code = JlResultProject["code"].(string)
  79. project.StaffName = JlResultProject["staff"].(string)
  80. project.CategoryId = categoryId
  81. project.Category = JlResultProject["category"].(string)
  82. project.InsideCategoryid = categoryId
  83. project.InsideCategory = JlResultProject["category"].(string)
  84. project.CreateTime = time.Now()
  85. project.CreateName = "计量授权创建"
  86. project.JlReciprocate = 1
  87. project.Status = 1
  88. //组合数据-账号 - 标注 计量授权账号-设置为管理员
  89. account := &models.CmProjectAccount{}
  90. account.Account = JlResultAccount["account"].(string)
  91. account.Password = "JL"
  92. account.AccountGroup = accountGroup
  93. account.Name = JlResultAccount["name"].(string)
  94. account.Company = JlResultAccount["company"].(string)
  95. account.Position = JlResultAccount["role"].(string)
  96. account.Mobile = JlResultAccount["mobile"].(string)
  97. account.Telephone = JlResultAccount["telephone"].(string)
  98. account.Enable = 1
  99. account.IsAdmin = 1
  100. account.CreateTime = time.Now()
  101. account.JlAuth = 1
  102. // 创建项目和账号
  103. if err = s.dao.AddProjectAndAccount(project, account); err != nil {
  104. return nil, err
  105. }
  106. } else {
  107. // 1.需要开启互通
  108. project := &models.CmProject{}
  109. project.JlReciprocate = 1
  110. project.Id = projectData.Id
  111. if err := s.dao.Update(project, []string{"jl_reciprocate"}); err != nil {
  112. return nil, err
  113. }
  114. // 计量授权账号
  115. account := &models.CmProjectAccount{}
  116. account.JlAuth = 1
  117. // 1-2. 获得账号-计量账号在项目管理中
  118. accountData = s.accountDao.GetAccountProjectId(claimsData.Account, projectData.Id)
  119. // 1-3. 不存在
  120. if accountData.Id == 0 {
  121. // 管理员-是否存在 ——需求还不明确,是否要设置成管理员 -先不做 ——NOTODO
  122. // adminAccount := s.accountDao.GetAdmin(projectData.Id)
  123. // 管理员不存在设置管理员
  124. // if adminAccount.Id == 0 {
  125. // account.IsAdmin = 1
  126. // }
  127. account.ProjectId = projectData.Id
  128. account.Account = JlResultAccount["account"].(string)
  129. account.Password = "JL"
  130. account.AccountGroup = accountGroup
  131. account.Name = JlResultAccount["name"].(string)
  132. account.Company = JlResultAccount["company"].(string)
  133. account.Position = JlResultAccount["role"].(string)
  134. account.Mobile = JlResultAccount["mobile"].(string)
  135. account.Telephone = JlResultAccount["telephone"].(string)
  136. account.Enable = 1
  137. account.CreateTime = time.Now()
  138. if err := s.accountDao.Add(account); err != nil {
  139. return nil, err
  140. }
  141. } else {
  142. // 存在
  143. account.Id = accountData.Id
  144. if err := s.accountDao.Update(account, []string{"jl_auth"}); err != nil {
  145. return nil, err
  146. }
  147. }
  148. }
  149. } else {
  150. //2-2. 普通账号
  151. return nil, errors.New("只能由 管理员 创建 项目管理项目")
  152. }
  153. // 返回一个token 6秒
  154. tokenString, _ := utils.CreateJlToken(jwt.MapClaims{
  155. "data": map[string]string{"code": claimsData.Code, "account": claimsData.Account},
  156. "exp": time.Now().Add(9 * time.Second).Unix(),
  157. })
  158. log.Println("登陆验证,=", tokenString)
  159. return map[string]interface{}{"token": tokenString}, nil
  160. }
  161. // 授权登陆
  162. func (s *JlService) AuthLogin(claimsData *viewmodels.Jl, writer http.ResponseWriter) (*viewmodels.ProjectAccount, error) {
  163. var (
  164. err error
  165. // JlResultProject map[string]interface{}
  166. JlResultAccount map[string]interface{}
  167. )
  168. // 1-1.工程项目是否存在
  169. projectInfo := s.dao.GetCode(claimsData.Code)
  170. if projectInfo.Id == 0 {
  171. return nil, errors.New("工程建设管理员还未创建项目,禁止登录")
  172. }
  173. if projectInfo.Status == 0 {
  174. return nil, errors.New("项目被禁用,请联系管理员开启")
  175. }
  176. // // 1-2.获得项目管理员- 授权登陆不需要验证管理员
  177. // projectAdminInfo := s.accountDao.Get(projectInfo.UserId, projectInfo.Id)
  178. // if projectAdminInfo.Id == 0 {
  179. // return nil, errors.New("工程建设管理员不存在,禁止登录")
  180. // }
  181. // 计量 的 项目下 是否存在 账号
  182. Jlzf := lib.NewJlzf()
  183. // 1.获得计量 账号和项目 信息 - 表示验证通过
  184. if _, JlResultAccount, err = Jlzf.GetProjectAndAccount(claimsData.Code, claimsData.Account); err != nil {
  185. return nil, errors.New("计量 校验失败-未找到项目或账号")
  186. }
  187. // 2.验证登陆-临时
  188. projectAccountInfo := s.accountDao.GetAccountProjectId(claimsData.Account, projectInfo.Id)
  189. account := &models.CmProjectAccount{}
  190. account.JlAuth = 1
  191. // 本地没有账号
  192. if projectAccountInfo.Id == 0 {
  193. accountGroup := int(JlResultAccount["accountGroup"].(float64))
  194. account.ProjectId = projectInfo.Id
  195. account.Account = JlResultAccount["account"].(string)
  196. account.Password = "JL"
  197. account.AccountGroup = accountGroup
  198. account.Name = JlResultAccount["name"].(string)
  199. account.Company = JlResultAccount["company"].(string)
  200. account.Position = JlResultAccount["role"].(string)
  201. account.Mobile = JlResultAccount["mobile"].(string)
  202. account.Telephone = JlResultAccount["telephone"].(string)
  203. account.Enable = 1
  204. account.CreateTime = time.Now()
  205. if err := s.accountDao.Add(account); err != nil {
  206. return nil, err
  207. }
  208. // 覆盖原来的信息
  209. projectAccountInfo = account
  210. } else if projectAccountInfo.JlAuth == 0 {
  211. // 更新为互通授权账号
  212. account.Id = projectAccountInfo.Id
  213. if err := s.accountDao.Update(account, []string{"jl_auth"}); err != nil {
  214. return nil, err
  215. }
  216. }
  217. // 2-1.账号停用
  218. if projectAccountInfo.Enable == 0 {
  219. return nil, errors.New("该账号已被停用")
  220. }
  221. // 加密用户标识
  222. identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
  223. if err != nil {
  224. return nil, err
  225. }
  226. // 加密项目标识
  227. projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
  228. if err != nil {
  229. return nil, err
  230. }
  231. digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
  232. // 设置cookie
  233. maxAge := 60 * 60 * 24 * 7
  234. params := url.Values{}
  235. params.Add("identity", identity)
  236. params.Add("attachedIdentity", projectId)
  237. params.Add("digitalToken", digitalToken)
  238. c := &http.Cookie{
  239. Name: "cm",
  240. Value: params.Encode(),
  241. Path: "/",
  242. MaxAge: maxAge,
  243. HttpOnly: true,
  244. }
  245. http.SetCookie(writer, c)
  246. viewAccountData := comm.MakeProjectAccountVM(projectAccountInfo)
  247. return &viewAccountData, nil
  248. }
  249. // 项目存在
  250. func (s *JlService) ProjectExist(projectId int, accountId int) (map[string]interface{}, error) {
  251. projectData := s.dao.Get(projectId)
  252. if projectData.Id == 0 {
  253. return nil, errors.New("项目未找到")
  254. }
  255. if projectData.JlReciprocate != 1 {
  256. return nil, errors.New("计量未开通 跳转")
  257. }
  258. accountData := s.accountDao.Get(accountId, projectId)
  259. if accountData.Id == 0 {
  260. return nil, errors.New("账号未找到")
  261. }
  262. if accountData.JlAuth != 1 {
  263. return nil, errors.New("计量未开通 此账号 跳转")
  264. }
  265. // 计量 的 项目下 是否存在 账号
  266. Jlzf := lib.NewJlzf()
  267. // 1.获得计量 账号和项目 信息 - 表示验证通过
  268. if _, _, err := Jlzf.GetProjectAndAccount(projectData.Code, accountData.Account); err != nil {
  269. return nil, errors.New("计量 校验失败-未找到项目或账号")
  270. }
  271. debug := GetEnvInfo("DEBUG")
  272. expirationTime := time.Now().Add(6 * time.Second)
  273. tokenString, _ := utils.CreateJlToken(jwt.MapClaims{
  274. "data": map[string]string{"code": projectData.Code, "account": accountData.Account},
  275. "exp": expirationTime.Unix(),
  276. "iat": time.Now().Unix(),
  277. })
  278. return map[string]interface{}{"env": debug, "token": tokenString}, nil
  279. }
  280. func GetEnvInfo(env string) bool {
  281. viper.AutomaticEnv()
  282. return viper.GetBool(env)
  283. }
  284. // 项目存在
  285. func (s *JlService) AccountUpdate(claimsData *viewmodels.Jl) error {
  286. // 1-1.工程项目是否存在
  287. projectInfo := s.dao.GetCode(claimsData.Code)
  288. if projectInfo.Id == 0 {
  289. return errors.New("项目未找到")
  290. }
  291. newAccountData := s.accountDao.GetAccountProjectId(claimsData.NewAccount, projectInfo.Id)
  292. if newAccountData.Id != 0 {
  293. return errors.New("项目管理 已存在该账号")
  294. }
  295. accountData := s.accountDao.GetAccountByAuth(claimsData.Account)
  296. if accountData.Id == 0 {
  297. return errors.New("未找到该项目下的 授权账号")
  298. }
  299. account := models.CmProjectAccount{}
  300. updateField := []string{"account"}
  301. account.Id = accountData.Id
  302. account.ProjectId = projectInfo.Id
  303. account.Account = claimsData.NewAccount
  304. if err := s.accountDao.Update(&account, updateField); err != nil {
  305. return err
  306. }
  307. return nil
  308. }