project_account_service.go 16 KB

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