project_account_service.go 18 KB

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