project_account_service.go 13 KB

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