jl_service.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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. //组合数据-账号 - 标注 计量授权账号-设置为管理员
  88. account := &models.CmProjectAccount{}
  89. account.Account = JlResultAccount["account"].(string)
  90. account.Password = "JL"
  91. account.AccountGroup = accountGroup
  92. account.Name = JlResultAccount["name"].(string)
  93. account.Company = JlResultAccount["company"].(string)
  94. account.Position = JlResultAccount["role"].(string)
  95. account.Mobile = JlResultAccount["mobile"].(string)
  96. account.Telephone = JlResultAccount["telephone"].(string)
  97. account.Enable = 1
  98. account.IsAdmin = 1
  99. account.CreateTime = time.Now()
  100. account.JlAuth = 1
  101. // 创建项目和账号
  102. if err = s.dao.AddProjectAndAccount(project, account); err != nil {
  103. return nil, err
  104. }
  105. } else {
  106. // 1.需要开启互通
  107. project := &models.CmProject{}
  108. project.JlReciprocate = 1
  109. project.Id = projectData.Id
  110. if err := s.dao.Update(project, []string{"jl_reciprocate"}); err != nil {
  111. return nil, err
  112. }
  113. // 计量授权账号
  114. account := &models.CmProjectAccount{}
  115. account.JlAuth = 1
  116. // 1-2. 获得账号-计量账号在项目管理中
  117. accountData = s.accountDao.GetAccountProjectId(claimsData.Account, projectData.Id)
  118. // 1-3. 不存在
  119. if accountData.Id == 0 {
  120. // 管理员-是否存在 ——需求还不明确,是否要设置成管理员 -先不做 ——NOTODO
  121. // adminAccount := s.accountDao.GetAdmin(projectData.Id)
  122. // 管理员不存在设置管理员
  123. // if adminAccount.Id == 0 {
  124. // account.IsAdmin = 1
  125. // }
  126. account.ProjectId = projectData.Id
  127. account.Account = JlResultAccount["account"].(string)
  128. account.Password = "JL"
  129. account.AccountGroup = accountGroup
  130. account.Name = JlResultAccount["name"].(string)
  131. account.Company = JlResultAccount["company"].(string)
  132. account.Position = JlResultAccount["role"].(string)
  133. account.Mobile = JlResultAccount["mobile"].(string)
  134. account.Telephone = JlResultAccount["telephone"].(string)
  135. account.Enable = 1
  136. account.CreateTime = time.Now()
  137. if err := s.accountDao.Add(account); err != nil {
  138. return nil, err
  139. }
  140. } else {
  141. // 存在
  142. account.Id = accountData.Id
  143. if err := s.accountDao.Update(account, []string{"jl_auth"}); err != nil {
  144. return nil, err
  145. }
  146. }
  147. }
  148. } else {
  149. //2-2. 普通账号
  150. return nil, errors.New("只能由 管理员 创建 项目管理项目")
  151. }
  152. // 返回一个token 6秒
  153. tokenString, _ := utils.CreateJlToken(jwt.MapClaims{
  154. "data": map[string]string{"code": claimsData.Code, "account": claimsData.Account},
  155. "exp": time.Now().Add(9 * time.Second).Unix(),
  156. })
  157. log.Println("登陆验证,=", tokenString)
  158. return map[string]interface{}{"token": tokenString}, nil
  159. }
  160. // 授权登陆
  161. func (s *JlService) AuthLogin(claimsData *viewmodels.Jl, writer http.ResponseWriter) (*viewmodels.ProjectAccount, error) {
  162. var (
  163. err error
  164. // JlResultProject map[string]interface{}
  165. JlResultAccount map[string]interface{}
  166. )
  167. // 1-1.工程项目是否存在
  168. projectInfo := s.dao.GetCode(claimsData.Code)
  169. if projectInfo.Id == 0 {
  170. return nil, errors.New("工程建设管理员还未创建项目,禁止登录")
  171. }
  172. // // 1-2.获得项目管理员- 授权登陆不需要验证管理员
  173. // projectAdminInfo := s.accountDao.Get(projectInfo.UserId, projectInfo.Id)
  174. // if projectAdminInfo.Id == 0 {
  175. // return nil, errors.New("工程建设管理员不存在,禁止登录")
  176. // }
  177. // 计量 的 项目下 是否存在 账号
  178. Jlzf := lib.NewJlzf()
  179. // 1.获得计量 账号和项目 信息 - 表示验证通过
  180. if _, JlResultAccount, err = Jlzf.GetProjectAndAccount(claimsData.Code, claimsData.Account); err != nil {
  181. return nil, errors.New("计量 校验失败-未找到项目或账号")
  182. }
  183. // 2.验证登陆-临时
  184. projectAccountInfo := s.accountDao.GetAccountProjectId(claimsData.Account, projectInfo.Id)
  185. account := &models.CmProjectAccount{}
  186. account.JlAuth = 1
  187. // 本地没有账号
  188. if projectAccountInfo.Id == 0 {
  189. accountGroup := int(JlResultAccount["accountGroup"].(float64))
  190. account.ProjectId = projectInfo.Id
  191. account.Account = JlResultAccount["account"].(string)
  192. account.Password = "JL"
  193. account.AccountGroup = accountGroup
  194. account.Name = JlResultAccount["name"].(string)
  195. account.Company = JlResultAccount["company"].(string)
  196. account.Position = JlResultAccount["role"].(string)
  197. account.Mobile = JlResultAccount["mobile"].(string)
  198. account.Telephone = JlResultAccount["telephone"].(string)
  199. account.Enable = 1
  200. account.CreateTime = time.Now()
  201. if err := s.accountDao.Add(account); err != nil {
  202. return nil, err
  203. }
  204. // 覆盖原来的信息
  205. projectAccountInfo = account
  206. } else if projectAccountInfo.JlAuth == 0 {
  207. // 更新为互通授权账号
  208. account.Id = projectAccountInfo.Id
  209. if err := s.accountDao.Update(account, []string{"jl_auth"}); err != nil {
  210. return nil, err
  211. }
  212. }
  213. // 2-1.账号停用
  214. if projectAccountInfo.Enable == 0 {
  215. return nil, errors.New("该账号已被停用")
  216. }
  217. // 加密用户标识
  218. identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
  219. if err != nil {
  220. return nil, err
  221. }
  222. // 加密项目标识
  223. projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
  224. if err != nil {
  225. return nil, err
  226. }
  227. digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
  228. // 设置cookie
  229. maxAge := 60 * 60 * 24 * 7
  230. params := url.Values{}
  231. params.Add("identity", identity)
  232. params.Add("attachedIdentity", projectId)
  233. params.Add("digitalToken", digitalToken)
  234. c := &http.Cookie{
  235. Name: "cm",
  236. Value: params.Encode(),
  237. Path: "/",
  238. MaxAge: maxAge,
  239. HttpOnly: true,
  240. }
  241. http.SetCookie(writer, c)
  242. viewAccountData := comm.MakeProjectAccountVM(projectAccountInfo)
  243. return &viewAccountData, nil
  244. }
  245. // 项目存在
  246. func (s *JlService) ProjectExist(projectId int, accountId int) (map[string]interface{}, error) {
  247. projectData := s.dao.Get(projectId)
  248. if projectData.Id == 0 {
  249. return nil, errors.New("项目未找到")
  250. }
  251. if projectData.JlReciprocate != 1 {
  252. return nil, errors.New("计量未开通 跳转")
  253. }
  254. accountData := s.accountDao.Get(accountId, projectId)
  255. if accountData.Id == 0 {
  256. return nil, errors.New("账号未找到")
  257. }
  258. if accountData.JlAuth != 1 {
  259. return nil, errors.New("计量未开通 此账号 跳转")
  260. }
  261. // 计量 的 项目下 是否存在 账号
  262. Jlzf := lib.NewJlzf()
  263. // 1.获得计量 账号和项目 信息 - 表示验证通过
  264. if _, _, err := Jlzf.GetProjectAndAccount(projectData.Code, accountData.Account); err != nil {
  265. return nil, errors.New("计量 校验失败-未找到项目或账号")
  266. }
  267. debug := GetEnvInfo("DEBUG")
  268. expirationTime := time.Now().Add(6 * time.Second)
  269. tokenString, _ := utils.CreateJlToken(jwt.MapClaims{
  270. "data": map[string]string{"code": projectData.Code, "account": accountData.Account},
  271. "exp": expirationTime.Unix(),
  272. "iat": time.Now().Unix(),
  273. })
  274. return map[string]interface{}{"env": debug, "token": tokenString}, nil
  275. }
  276. func GetEnvInfo(env string) bool {
  277. viper.AutomaticEnv()
  278. return viper.GetBool(env)
  279. }
  280. // 项目存在
  281. func (s *JlService) AccountUpdate(claimsData *viewmodels.Jl) error {
  282. // 1-1.工程项目是否存在
  283. projectInfo := s.dao.GetCode(claimsData.Code)
  284. if projectInfo.Id == 0 {
  285. return errors.New("项目未找到")
  286. }
  287. newAccountData := s.accountDao.GetAccount(claimsData.NewAccount)
  288. if newAccountData.Id != 0 {
  289. return errors.New("项目管理 已存在该账号")
  290. }
  291. accountData := s.accountDao.GetAccountByAuth(claimsData.Account)
  292. if accountData.Id == 0 {
  293. return errors.New("未找到该项目下的 授权账号")
  294. }
  295. account := models.CmProjectAccount{}
  296. updateField := []string{"account"}
  297. account.Id = accountData.Id
  298. account.Account = claimsData.NewAccount
  299. if err := s.accountDao.Update(&account, updateField); err != nil {
  300. return err
  301. }
  302. return nil
  303. }