project_account_service.go 14 KB

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