jl_service.go 11 KB

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