project_account_service.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615
  1. /*
  2. * @description:项目用户相关数据处理
  3. * @Author: CP
  4. * @Date: 2020-08-27 17:23:58
  5. * @FilePath: \construction_management\services\project_account_service.go
  6. */
  7. package services
  8. import (
  9. "encoding/json"
  10. "errors"
  11. "html"
  12. "log"
  13. "strconv"
  14. "strings"
  15. "time"
  16. "github.com/kataras/iris/v12"
  17. "go.mod/comm"
  18. "go.mod/models"
  19. "go.mod/web/viewmodels"
  20. "go.mod/dao"
  21. "go.mod/datasource"
  22. )
  23. //定义项目用户Service接口
  24. type ProjectAccountService interface {
  25. ValidRule(ctx iris.Context) (viewmodels.ProjectAccount, error)
  26. ValidRuleChangePassword(ctx iris.Context) (viewmodels.AccountPassword, error)
  27. ValidRulePermission(ctx iris.Context) (viewmodels.Permission, error)
  28. ValidRuleAccount(ctx iris.Context) (viewmodels.ProjectAccount, error)
  29. ValidGetPermission(ctx iris.Context) (viewmodels.Permission, error)
  30. ValidRuleProjectId(ctx iris.Context) (viewmodels.ProjectAccount, error)
  31. Get(accountId int, projectId int) *viewmodels.ProjectAccount
  32. GetAll(projectId int) []viewmodels.ProjectAccount
  33. GetBidAccount(bidsectionId int, projectId int, projectAccountId int, name string) []viewmodels.ProjectAccount
  34. Search(name string, projectId int) []viewmodels.ProjectAccount
  35. AddBs(viewAccount viewmodels.ProjectAccount, projectId int) error
  36. SaveBs(viewAccount viewmodels.ProjectAccount, id int, projectId int, staffName string) error
  37. Add(viewAccount viewmodels.ProjectAccount, projectId int) error
  38. Save(viewAccount viewmodels.ProjectAccount, id int, projectId int) error
  39. SaveAccount(viewAccount viewmodels.ProjectAccount, id int, projectId int) error
  40. Enable(id int, projectId int, enable int) error
  41. ChangeAccount(id int, projectId int, viewAccount viewmodels.ProjectAccount) error
  42. ChangeAccountBS(id int, projectId int, viewAccount viewmodels.ProjectAccount) error
  43. GetProjectInfo(id int) (viewmodels.ProjectInfo, error)
  44. Delete(id int, projectId int) error
  45. ChangePassword(AccountData viewmodels.AccountPassword, projectId int, projectAccountId int) error
  46. SaveAuth(permission viewmodels.Permission, projectId int, bidsectionId int, accountId int) error
  47. }
  48. //返回service操作类
  49. type projectAccountService struct {
  50. dao *dao.ProjectAccountDao
  51. bidAccountDao *dao.BidAccountDao
  52. permissionAccountDao *dao.PermissionAccountDao
  53. validSave string
  54. validAdd string
  55. validPassword string
  56. }
  57. //创建项目用户service
  58. func NewProjectAccountService() ProjectAccountService {
  59. return &projectAccountService{
  60. dao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
  61. bidAccountDao: dao.NewBidAccountDao(datasource.InstanceDbMaster()),
  62. permissionAccountDao: dao.NewPermissionAccountDao(datasource.InstanceDbMaster()),
  63. validSave: "/api/projectSetting/account/save",
  64. validAdd: "/api/projectSetting/account/create",
  65. validPassword: "/api/projectSetting/account/change",
  66. }
  67. }
  68. // 用户规则验证
  69. func (s *projectAccountService) ValidRule(ctx iris.Context) (viewmodels.ProjectAccount, error) {
  70. accountVaild := viewmodels.ProjectAccount{}
  71. err := ctx.ReadJSON(&accountVaild)
  72. if err != nil {
  73. log.Println("account-ValidRule-ReadForm转换异常, error=", err)
  74. return accountVaild, err
  75. }
  76. if ctx.Path() == s.validAdd {
  77. err = accountVaild.Validate()
  78. } else if ctx.Path() == s.validSave {
  79. err = accountVaild.ValidateUpdate()
  80. } else if ctx.Path() == s.validPassword {
  81. err = accountVaild.ValidatePassword()
  82. } else {
  83. log.Println("请求路径找不到对应的验证规则")
  84. return accountVaild, errors.New("验证错误-未找到验证规则")
  85. }
  86. if err != nil {
  87. log.Println("用户验证, error=", err)
  88. return accountVaild, err
  89. }
  90. // 验证账号组
  91. if ctx.Path() != s.validPassword {
  92. accountGroup := comm.NewAccountGroup()
  93. err = accountGroup.ValidRule(accountVaild.AccountGroup)
  94. if err != nil {
  95. log.Println("用户验证, error=", err)
  96. return accountVaild, err
  97. }
  98. }
  99. // xss
  100. accountVaild.Account = html.EscapeString(accountVaild.Account)
  101. accountVaild.Password = html.EscapeString(accountVaild.Password)
  102. accountVaild.Name = html.EscapeString(accountVaild.Name)
  103. accountVaild.Company = html.EscapeString(accountVaild.Company)
  104. accountVaild.Position = html.EscapeString(accountVaild.Position)
  105. accountVaild.Mobile = html.EscapeString(accountVaild.Mobile)
  106. accountVaild.Telephone = html.EscapeString(accountVaild.Telephone)
  107. return accountVaild, nil
  108. }
  109. // 验证密码
  110. func (s *projectAccountService) ValidRuleChangePassword(ctx iris.Context) (viewmodels.AccountPassword, error) {
  111. accountVaild := viewmodels.AccountPassword{}
  112. err := ctx.ReadJSON(&accountVaild)
  113. if err != nil {
  114. log.Println("account-ValidRule-ReadForm转换异常, error=", err)
  115. return accountVaild, err
  116. }
  117. err = accountVaild.ValidateChangePassword()
  118. if err != nil {
  119. log.Println("权限验证, error=", err)
  120. return accountVaild, err
  121. }
  122. return accountVaild, nil
  123. }
  124. // 用户规则验证
  125. func (s *projectAccountService) ValidRulePermission(ctx iris.Context) (viewmodels.Permission, error) {
  126. accountVaild := viewmodels.Permission{}
  127. err := ctx.ReadJSON(&accountVaild)
  128. if err != nil {
  129. log.Println("account-ValidRule-ReadForm转换异常, error=", err)
  130. return accountVaild, err
  131. }
  132. err = accountVaild.Validate()
  133. if err != nil {
  134. log.Println("权限验证, error=", err)
  135. return accountVaild, err
  136. }
  137. return accountVaild, nil
  138. }
  139. // 用户规则验证
  140. func (s *projectAccountService) ValidGetPermission(ctx iris.Context) (viewmodels.Permission, error) {
  141. accountVaild := viewmodels.Permission{}
  142. err := ctx.ReadForm(&accountVaild)
  143. if err != nil {
  144. log.Println("account-ValidRule-ReadForm转换异常, error=", err)
  145. return accountVaild, err
  146. }
  147. err = accountVaild.ValidateSinglePermission()
  148. if err != nil {
  149. log.Println("权限验证, error=", err)
  150. return accountVaild, err
  151. }
  152. return accountVaild, nil
  153. }
  154. // 验证编辑用户
  155. func (s *projectAccountService) ValidRuleAccount(ctx iris.Context) (viewmodels.ProjectAccount, error) {
  156. accountVaild := viewmodels.ProjectAccount{}
  157. err := ctx.ReadJSON(&accountVaild)
  158. if err != nil {
  159. log.Println("account-ValidRule-ReadForm转换异常, error=", err)
  160. return accountVaild, err
  161. }
  162. err = accountVaild.ValidateAccount()
  163. if err != nil {
  164. log.Println("权限验证, error=", err)
  165. return accountVaild, err
  166. }
  167. return accountVaild, nil
  168. }
  169. // 验证用户项目ID
  170. func (s *projectAccountService) ValidRuleProjectId(ctx iris.Context) (viewmodels.ProjectAccount, error) {
  171. accountVaild := viewmodels.ProjectAccount{}
  172. err := ctx.ReadForm(&accountVaild)
  173. if err != nil {
  174. log.Println("account-ValidRule-ReadForm转换异常, error=", err)
  175. return accountVaild, err
  176. }
  177. err = accountVaild.ValidateProjectId()
  178. if err != nil {
  179. log.Println("权限验证, error=", err)
  180. return accountVaild, err
  181. }
  182. return accountVaild, nil
  183. }
  184. // 获得一个项目用户
  185. func (s *projectAccountService) Get(id int, projectId int) *viewmodels.ProjectAccount {
  186. modelsAccount := s.dao.Get(id, projectId)
  187. viewAccountData := viewmodels.ProjectAccount{}
  188. if modelsAccount.Id == 0 {
  189. viewAccountData.Id = "0"
  190. return &viewAccountData
  191. }
  192. viewAccountData = comm.MakeProjectAccountVM(modelsAccount)
  193. return &viewAccountData
  194. }
  195. // 获得项目下所有账号信息
  196. func (s *projectAccountService) GetAll(projectId int) []viewmodels.ProjectAccount {
  197. accountList := s.dao.GetAll(projectId)
  198. accountListVM := make([]viewmodels.ProjectAccount, 0)
  199. for _, data := range accountList {
  200. //if data.IsAdmin != 1 {
  201. account := comm.MakeProjectAccountVM(&data)
  202. accountListVM = append(accountListVM, account)
  203. //}
  204. }
  205. return accountListVM
  206. }
  207. // 获得标段下的账号
  208. func (s *projectAccountService) GetBidAccount(bidsectionId int, projectId int, projectAccountId int, name string) []viewmodels.ProjectAccount {
  209. // 1.获得标段账号ID
  210. bidAccountData := s.bidAccountDao.GetBidAccount(bidsectionId, projectId)
  211. // 组合账号ID集合
  212. idList := []string{}
  213. // 管理员账号-可能不必要-加入管理员ID
  214. projectDao := dao.NewProjectDao(datasource.InstanceDbMaster())
  215. projectData := projectDao.Get(projectId)
  216. idList = append(idList, strconv.Itoa(projectData.UserId))
  217. for _, item := range bidAccountData {
  218. idList = append(idList, strconv.Itoa(item.AccountId))
  219. }
  220. inId := strings.Join(idList, ",")
  221. // 获得账号信息
  222. accountData := s.dao.GetInId(inId, name)
  223. // 2.获得账号权限
  224. permissionData := s.permissionAccountDao.GetBidsectionId(bidsectionId)
  225. // 格式化账号数据
  226. accountListVM := make([]viewmodels.ProjectAccount, 0)
  227. for _, data := range accountData {
  228. account := comm.MakeProjectAccountVM(&data)
  229. for _, item := range permissionData {
  230. if data.Id == item.AccountId {
  231. account.ContractPermission = item.ContractPermission
  232. account.QualityPermission = item.QualityPermission
  233. account.SafePermission = item.SafePermission
  234. break
  235. }
  236. }
  237. accountListVM = append(accountListVM, account)
  238. }
  239. return accountListVM
  240. }
  241. // 检索 账号姓名单位手机
  242. func (s *projectAccountService) Search(name string, projectId int) []viewmodels.ProjectAccount {
  243. accountList := s.dao.Search(name, projectId)
  244. accountListVM := make([]viewmodels.ProjectAccount, 0)
  245. for _, data := range accountList {
  246. account := comm.MakeProjectAccountVM(&data)
  247. accountListVM = append(accountListVM, account)
  248. }
  249. return accountListVM
  250. }
  251. // 新增账号-后台
  252. func (s *projectAccountService) AddBs(viewAccount viewmodels.ProjectAccount, projectId int) error {
  253. // 验证该项目下是否有同名账号
  254. // accountValid := s.dao.GetAccount(viewAccount.Account)
  255. accountValid := s.dao.GetAccountProjectId(viewAccount.Account, projectId)
  256. if accountValid.Id != 0 {
  257. return errors.New("项目下已存在相同的账号")
  258. }
  259. account := models.CmProjectAccount{}
  260. if viewAccount.BoolAdmin {
  261. account.IsAdmin = 1
  262. if err := s.updateAdminZero(projectId); err != nil {
  263. return err
  264. }
  265. }
  266. account.ProjectId = projectId
  267. account.Account = viewAccount.Account
  268. account.Password = comm.CreatePasswordSign(viewAccount.Password, viewAccount.Account)
  269. account.AccountGroup = viewAccount.AccountGroup
  270. account.Name = viewAccount.Name
  271. account.Company = viewAccount.Company
  272. account.Position = viewAccount.Position
  273. account.Mobile = viewAccount.Mobile
  274. account.Telephone = viewAccount.Telephone
  275. account.Enable = 1
  276. account.CreateTime = time.Now()
  277. err := s.dao.Add(&account)
  278. // 同步更新项目管理员信息
  279. projectDao := dao.NewProjectDao(datasource.InstanceDbMaster())
  280. project := &models.CmProject{}
  281. project.Id = projectId
  282. project.UserId = account.Id
  283. project.UserAccount = viewAccount.Name
  284. if err := projectDao.Update(project, []string{"user_id", "user_account"}); err != nil {
  285. return err
  286. }
  287. return err
  288. }
  289. // 保存用户信息
  290. func (s *projectAccountService) SaveBs(viewAccount viewmodels.ProjectAccount, id int, projectId int, staffName string) error {
  291. // 1.获得项目信息
  292. projectDao := dao.NewProjectDao(datasource.InstanceDbMaster())
  293. // projectData, _ := projectDao.FindById(projectId)
  294. // if staffName != projectData.StaffName {
  295. // return errors.New("无权编辑")
  296. // }
  297. account := models.CmProjectAccount{}
  298. updateField := []string{"name", "company", "position", "telephone", "account_group"}
  299. // 是否重新设置管理员
  300. if viewAccount.BoolAdmin {
  301. account.IsAdmin = 1
  302. updateField = append(updateField, "is_admin")
  303. // 1.更新项目管理员信息
  304. project := &models.CmProject{}
  305. project.Id = projectId
  306. project.UserId = id
  307. project.UserAccount = viewAccount.Name
  308. if err := projectDao.Update(project, []string{"user_id", "user_account"}); err != nil {
  309. return err
  310. }
  311. // 去除其他账号的管理员
  312. if err := s.updateAdminZero(projectId); err != nil {
  313. return err
  314. }
  315. }
  316. account.Id = id
  317. account.ProjectId = projectId
  318. account.Name = viewAccount.Name
  319. account.Company = viewAccount.Company
  320. account.Position = viewAccount.Position
  321. account.Mobile = viewAccount.Mobile
  322. account.Telephone = viewAccount.Telephone
  323. account.AccountGroup = viewAccount.AccountGroup
  324. err := s.dao.Update(&account, updateField)
  325. return err
  326. }
  327. // 设置is_admin为0
  328. func (s *projectAccountService) updateAdminZero(projectId int) error {
  329. dataDao := s.dao.GetAdmin(projectId)
  330. if dataDao.Id != 0 {
  331. updateData := models.CmProjectAccount{}
  332. updateData.Id = dataDao.Id
  333. updateData.ProjectId = projectId
  334. updateData.IsAdmin = 0
  335. if err := s.dao.Update(&updateData, []string{"is_admin"}); err != nil {
  336. return errors.New("原管理员取消失败")
  337. }
  338. }
  339. return nil
  340. }
  341. // 新增账号
  342. func (s *projectAccountService) Add(viewAccount viewmodels.ProjectAccount, projectId int) error {
  343. // 验证该项目下是否有同名账号
  344. accountValid := s.dao.GetAccountProjectId(viewAccount.Account, projectId)
  345. if accountValid.Id != 0 {
  346. return errors.New("已存在相同的账号")
  347. }
  348. account := models.CmProjectAccount{}
  349. account.ProjectId = projectId
  350. account.Account = viewAccount.Account
  351. account.Password = comm.CreatePasswordSign(viewAccount.Password, viewAccount.Account)
  352. account.Name = viewAccount.Name
  353. account.Company = viewAccount.Company
  354. account.Position = viewAccount.Position
  355. account.Mobile = viewAccount.Mobile
  356. account.Telephone = viewAccount.Telephone
  357. account.AccountGroup = viewAccount.AccountGroup
  358. account.Enable = 1
  359. account.CreateTime = time.Now()
  360. err := s.dao.Add(&account)
  361. return err
  362. }
  363. // 保存用户信息
  364. func (s *projectAccountService) Save(viewAccount viewmodels.ProjectAccount, id int, projectId int) error {
  365. account := models.CmProjectAccount{}
  366. account.Id = id
  367. account.ProjectId = projectId
  368. account.Name = viewAccount.Name
  369. account.Company = viewAccount.Company
  370. account.Position = viewAccount.Position
  371. account.Mobile = viewAccount.Mobile
  372. account.Telephone = viewAccount.Telephone
  373. account.AccountGroup = viewAccount.AccountGroup
  374. err := s.dao.Update(&account, []string{"Name", "Company", "Position", "Telephone", "AccountGroup"})
  375. return err
  376. }
  377. func (s *projectAccountService) SaveAccount(viewAccount viewmodels.ProjectAccount, id int, projectId int) error {
  378. account := models.CmProjectAccount{}
  379. account.Id = id
  380. account.ProjectId = projectId
  381. account.Name = viewAccount.Name
  382. account.Company = viewAccount.Company
  383. account.Position = viewAccount.Position
  384. account.Telephone = viewAccount.Telephone
  385. err := s.dao.Update(&account, []string{"Name", "Company", "Position", "Telephone"})
  386. return err
  387. }
  388. // 设置启用/禁止
  389. func (s *projectAccountService) Enable(id int, projectId int, enable int) error {
  390. account := models.CmProjectAccount{}
  391. account.Id = id
  392. account.ProjectId = projectId
  393. account.Enable = enable
  394. err := s.dao.Update(&account, []string{"Enable"})
  395. return err
  396. }
  397. // 删除账号
  398. func (s *projectAccountService) Delete(id int, projectId int) error {
  399. account := models.CmProjectAccount{}
  400. account.Id = id
  401. account.ProjectId = projectId
  402. err := s.dao.Delete(&account)
  403. return err
  404. }
  405. // 更改账号或者密码
  406. func (s *projectAccountService) ChangeAccount(id int, projectId int, viewAccount viewmodels.ProjectAccount) error {
  407. // 1.是否修改账号
  408. field := []string{"Password"}
  409. account := models.CmProjectAccount{}
  410. account.Id = id
  411. account.ProjectId = projectId
  412. // 2.修改密码
  413. account.Password = comm.CreatePasswordSign(viewAccount.Password, viewAccount.Account)
  414. accountData := s.dao.Get(id, projectId)
  415. if accountData.Account != viewAccount.Account {
  416. account.Account = viewAccount.Account
  417. field = append(field, "Account")
  418. }
  419. // 3.发送短信-TODO
  420. // utils.SendSMS()
  421. s.dao.Update(&account, field)
  422. return nil
  423. }
  424. // 更改账号或者密码-后台
  425. func (s *projectAccountService) ChangeAccountBS(id int, projectId int, viewAccount viewmodels.ProjectAccount) error {
  426. // 1.是否修改账号
  427. field := []string{"Password"}
  428. account := models.CmProjectAccount{}
  429. account.Id = id
  430. account.ProjectId = projectId
  431. // 2.修改密码
  432. account.Password = comm.CreatePasswordSign(viewAccount.Password, viewAccount.Account)
  433. accountData := s.dao.Get(id, projectId)
  434. if accountData.Account != viewAccount.Account {
  435. account.Account = viewAccount.Account
  436. field = append(field, "Account")
  437. }
  438. s.dao.Update(&account, field)
  439. return nil
  440. }
  441. // 更换密码
  442. func (s *projectAccountService) ChangePassword(AccountData viewmodels.AccountPassword, projectId int, projectAccountId int) error {
  443. // 1.获得账号
  444. accountData := s.dao.Get(projectAccountId, projectId)
  445. // 2.比对密码
  446. password := comm.CreatePasswordSign(AccountData.Password, accountData.Account)
  447. if accountData.Password == "JL" {
  448. return errors.New("计量密码不允许修改密码")
  449. }
  450. if accountData.Password != password {
  451. return errors.New("原密码输入不正确")
  452. }
  453. // 3修改密码
  454. field := []string{"Password"}
  455. account := models.CmProjectAccount{}
  456. account.Id = projectAccountId
  457. account.ProjectId = projectId
  458. account.Password = comm.CreatePasswordSign(AccountData.NewPassword, accountData.Account)
  459. err := s.dao.Update(&account, field)
  460. if err != nil {
  461. return errors.New("密码更新失败")
  462. }
  463. return nil
  464. }
  465. func (s *projectAccountService) GetProjectInfo(id int) (viewmodels.ProjectInfo, error) {
  466. projectInfo, err := s.dao.FindById(id)
  467. return projectInfo, err
  468. }
  469. // 保存权限设置
  470. func (s *projectAccountService) SaveAuth(permission viewmodels.Permission, projectId int, bidsectionId int, accountId int) error {
  471. // 1.构造权限字符串
  472. // 1-1.合同权限
  473. contractPermission := map[string]int{
  474. "add": permission.ContractAdd,
  475. "delete": permission.ContractDelete,
  476. "access": permission.ContractAccess,
  477. }
  478. contractPermissionByte, err := json.Marshal(contractPermission)
  479. if err != nil {
  480. return errors.New("合同权限解析失败")
  481. }
  482. contractPermissionStr := string(contractPermissionByte)
  483. // 1.2 安全巡检权限
  484. safePermission := map[string]int{
  485. "add": permission.SafeAdd,
  486. "delete": permission.SafeDelete,
  487. "access": permission.SafeAccess,
  488. }
  489. safePermissionByte, err := json.Marshal(safePermission)
  490. if err != nil {
  491. return errors.New("合同权限解析失败")
  492. }
  493. safePermissionStr := string(safePermissionByte)
  494. // 1.3 质量巡检权限
  495. qualityPermission := map[string]int{
  496. "add": permission.QualityAdd,
  497. "delete": permission.QualityDelete,
  498. "access": permission.QualityAccess,
  499. }
  500. qualityPermissionByte, err := json.Marshal(qualityPermission)
  501. if err != nil {
  502. return errors.New("合同权限解析失败")
  503. }
  504. qualityPermissionStr := string(qualityPermissionByte)
  505. // 2.保存权限
  506. permissionAccount := models.CmPermissionAccount{}
  507. permissionAccount.ProjectId = projectId
  508. permissionAccount.BidsectionId = bidsectionId
  509. permissionAccount.AccountId = accountId
  510. permissionAccount.ContractPermission = contractPermissionStr
  511. permissionAccount.SafePermission = safePermissionStr
  512. permissionAccount.QualityPermission = qualityPermissionStr
  513. err = s.permissionAccountDao.Update(&permissionAccount, []string{"ContractPermission", "SafePermission", "QualityPermission"})
  514. return err
  515. }