jl_service.go 11 KB

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