project_account_service.go 11 KB

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