project.go 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package dao
  2. import (
  3. "github.com/shopspring/decimal"
  4. "gorm.io/gorm"
  5. "server/dao/system"
  6. "server/global"
  7. )
  8. type Project struct {
  9. global.GVA_MODEL
  10. Code string `json:"code" form:"code" gorm:"comment:项目编号"`
  11. Name string `json:"name" form:"name" gorm:"comment:项目名称"`
  12. Address string `json:"address" form:"address" gorm:"comment:项目地址"`
  13. FirstPrincipal string `json:"firstPrincipal" form:"firstPrincipal" gorm:"comment:甲方负责人"`
  14. FirstPhone string `json:"firstPhone" form:"firstPhone" gorm:"comment:甲方电话"`
  15. ProjectPrice float64 `json:"projectPrice" form:"projectPrice" gorm:"type:decimal(10,2);comment:合同金额"`
  16. SecondPrincipal int `json:"secondPrincipal" form:"secondPrincipal" gorm:"comment:乙方负责人"`
  17. Principal system.SysUser `json:"principal" form:"principal" gorm:"foreignKey:SecondPrincipal;references:id;"`
  18. SecondPrincipalName string `json:"secondPrincipalName" form:"secondPrincipalName" gorm:"comment:乙方姓名"`
  19. SignTime string `json:"signTime" form:"signTime" gorm:"comment:合同签订日期"`
  20. IntoConstructionTime string `json:"intoConstructionTime" form:"intoConstructionTime" gorm:"comment:进场施工时间"`
  21. CompletedTime string `json:"completedTime" form:"completedTime" gorm:"comment:竣工时间"`
  22. SupervisorUint string `json:"supervisorUint" form:"supervisorUint" gorm:"comment:监理单位"`
  23. SupervisorName string `json:"supervisorName" form:"supervisorName" gorm:"comment:监理姓名"`
  24. SupervisorPhone string `json:"supervisorPhone" form:"supervisorPhone" gorm:"comment:监理电话"`
  25. CooperativeUnits string `json:"cooperativeUnits" form:"cooperativeUnits" gorm:"comment:合作单位"`
  26. CooperativePrincipal string `json:"cooperativePrincipal" form:"cooperativePrincipal" gorm:"comment:合作单位负责人"`
  27. CooperativePhone string `json:"cooperativePhone" form:"cooperativePhone" gorm:"comment:合作单位电话"`
  28. Illustrate string `json:"illustrate" form:"illustrate" gorm:"comment:说明;type:varchar(200)"`
  29. State int `json:"state" form:"state" gorm:"comment:状态"`
  30. ProjectState ProjectState `json:"projectState" form:"projectState" gorm:"foreignKey:State;references:id;"`
  31. CollectionTime string `json:"collectionTime" form:"collectionTime" gorm:"comment:收款时间"`
  32. EndTime string `json:"endTime" form:"endTime" gorm:"comment:结束时间"`
  33. Files []ProjectFile `json:"files" form:"files" gorm:"-"`
  34. WorkingHours []ProjectWorkingHours `json:"workingHours" form:"workingHours" gorm:"-"`
  35. WorkingHoursTotal int64 `json:"workingHoursTotal" form:"workingHoursTotal" gorm:"-"`
  36. Collection []Collection `json:"collection" form:"collection" gorm:"-"`
  37. CollectionTotal int64 `json:"collectionTotal" form:"collectionTotal" gorm:"-"`
  38. Reimbursement []Reimbursement `json:"reimbursement" form:"reimbursement" gorm:"-"`
  39. ReimbursementTotal int64 `json:"reimbursementTotal" form:"reimbursementTotal" gorm:"-"`
  40. ProjectFee []ProjectFee `json:"projectFee" form:"project" gorm:"-"`
  41. ProjectMaterials []ProjectMaterials `json:"projectMaterials" form:"projectMaterials" gorm:"-"`
  42. ProjectFeeTotal int64 `json:"projectFeeTotal" form:"projectFeeTotal" gorm:"-"`
  43. IsApprove bool `json:"isApprove" form:"isApprove" gorm:"comment:是否审批;default:0"`
  44. }
  45. func (Project) TableName() string {
  46. return "project"
  47. }
  48. // TODO:项目查询
  49. // QueryProjectList 查询项目列表
  50. func QueryProjectList(limit, offset, state int, name, time string) (project []Project, total int64, err error) {
  51. // 创建db
  52. db := global.GVA_DB.Model(&Project{}).Where("is_approve = ?", true)
  53. // 如果有条件搜索 下方会自动创建搜索语句
  54. if state != 0 {
  55. db = db.Where("state = ?", state)
  56. }
  57. if name != "" {
  58. db = db.Where("name LIKE ?", "%"+name+"%")
  59. }
  60. if time != "" {
  61. db = db.Where("DATE_FORMAT(created_at, '%Y-%m') = ?", time)
  62. }
  63. err = db.Count(&total).Error
  64. if err != nil {
  65. return
  66. }
  67. err = db.Order("id desc").Limit(limit).Offset(offset).Preload("Principal").Preload("ProjectState").Find(&project).Error
  68. for i, p := range project {
  69. project[i].SecondPrincipalName = p.Principal.NickName
  70. }
  71. return project, total, err
  72. }
  73. // QueryProjectByCode 查询单个项目 按编号
  74. func QueryProjectByCode(code string) (project Project, err error) {
  75. err = global.GVA_DB.Model(&Project{}).Where("code = ?", code).Preload("Principal").Preload("ProjectState").First(&project).Error
  76. project.SecondPrincipalName = project.Principal.NickName
  77. return
  78. }
  79. func QueryProjectById(id int) (project Project, err error) {
  80. err = global.GVA_DB.Model(&Project{}).Where("id =?", id).Preload("Principal").Preload("ProjectState").First(&project).Error
  81. project.SecondPrincipalName = project.Principal.NickName
  82. return
  83. }
  84. // QueryAllProject 查询所以项目
  85. func QueryAllProject() (projects []Project, err error) {
  86. err = global.GVA_DB.Model(&Project{}).Find(&projects).Error
  87. return projects, err
  88. }
  89. // TODO:项目新增
  90. // CreateProject 新增项目
  91. func (p Project) CreateProject() error {
  92. return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  93. var process Process
  94. txErr := global.GVA_DB.Model(&Process{}).Where("process_type = ? AND is_use = 1", "立项").Find(&process).Error
  95. if txErr != nil {
  96. return txErr
  97. }
  98. var processNodes []ProcessNodes
  99. txErr = global.GVA_DB.Model(&ProcessNodes{}).Where("process_id = ?", process.ID).Find(&processNodes).Error
  100. if txErr != nil {
  101. return txErr
  102. }
  103. var nodes []Node
  104. for _, node := range processNodes {
  105. var node1 Node
  106. txErr := global.GVA_DB.Model(&Node{}).Where("id = ?", node.NodeId).Preload("Approver").Find(&node1).Error
  107. if txErr != nil {
  108. return txErr
  109. }
  110. node1.Order = node.NodeOrder
  111. nodes = append(nodes, node1)
  112. }
  113. process.Nodes = nodes
  114. if process.ID == 0 {
  115. p.IsApprove = true
  116. }
  117. txErr = tx.Model(&Project{}).Create(&p).Error
  118. if txErr != nil {
  119. return txErr
  120. }
  121. for _, file := range p.Files {
  122. var isFile ProjectFile
  123. tx.Model(&ProjectFile{}).Where("project_code = ? AND name = ? AND genre = ?", file.ProjectCode, file.Name, file.Genre).First(&isFile)
  124. if isFile.ID != 0 {
  125. txErr := tx.Model(&ProjectFile{}).Where("id = ?", isFile.ID).Updates(&file).Error
  126. if txErr != nil {
  127. return txErr
  128. }
  129. } else {
  130. txErr := tx.Model(&ProjectFile{}).Create(&file).Error
  131. if txErr != nil {
  132. return txErr
  133. }
  134. }
  135. }
  136. // 查询是否有使用的流程
  137. if process.ID != 0 {
  138. projectProcess := ProjectProcess{
  139. ProjectProcessName: p.Name + "审批",
  140. Applicant: p.SecondPrincipal,
  141. ProjectId: int(p.ID),
  142. CurrentNodeOrder: int(process.Nodes[0].ID),
  143. ProcessApprovalId: int(process.ID),
  144. ProjectType: "立项",
  145. }
  146. txErr := projectProcess.CreateProjectProcess()
  147. if txErr != nil {
  148. return txErr
  149. }
  150. }
  151. return txErr
  152. })
  153. }
  154. type ProjectSum struct {
  155. TotalProjectAmount float64
  156. TotalCollectionAmount float64
  157. Receivables float64
  158. }
  159. // QueryProjectSum 查询项目总
  160. func QueryProjectSum(code string) (projectSum ProjectSum, err error) {
  161. err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
  162. projectDB := tx.Model(&Project{}).Select("SUM(project_price) AS total_project_amount")
  163. collectionDB := tx.Model(&Collection{}).Select("SUM(collection_price) AS total_collection_amount")
  164. if code != "" {
  165. projectDB = projectDB.Where("code =?", code)
  166. collectionDB = collectionDB.Where("project_code =?", code)
  167. }
  168. txErr := projectDB.First(&projectSum).Error
  169. if txErr != nil {
  170. return txErr
  171. }
  172. txErr = collectionDB.First(&projectSum).Error
  173. if txErr != nil {
  174. return txErr
  175. }
  176. return txErr
  177. })
  178. // 使用decimal 防止精度不准
  179. exponent := decimal.NewFromFloatWithExponent(projectSum.TotalProjectAmount-projectSum.TotalCollectionAmount, -2)
  180. projectSum.Receivables = exponent.InexactFloat64()
  181. return
  182. }
  183. // TODO:项目修改
  184. // UpdateProject 修改项目
  185. func (p Project) UpdateProject() error {
  186. return global.GVA_DB.Model(&p).Where("id = ?", p.ID).Updates(p).Error
  187. }
  188. // TODO:项目删除
  189. // DeleteProject 删除项目
  190. func DeleteProject(code string) error {
  191. return global.GVA_DB.Unscoped().Where("code = ?", code).Delete(&Project{}).Error
  192. }