contract_register.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package fms
  2. import (
  3. "hongze/fms_api/global"
  4. "hongze/fms_api/models/base"
  5. "time"
  6. )
  7. // ContractRegister 合同登记表
  8. type ContractRegister struct {
  9. ContractRegisterId int `gorm:"primaryKey;column:contract_register_id" json:"contract_register_id" description:"登记ID"`
  10. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  11. CrmContractId int `gorm:"column:crm_contract_id" json:"crm_contract_id" description:"CRM系统-合同ID"`
  12. ContractSource int `gorm:"column:contract_source" json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  13. CompanyName string `gorm:"column:company_name" json:"company_name" description:"客户名称"`
  14. ProductId int `gorm:"column:product_id" json:"product_id" description:"产品ID: 1-FICC; 2-权益"`
  15. SellerId int `gorm:"column:seller_id" json:"seller_id" description:"CRM系统-销售ID"`
  16. SellerName int `gorm:"column:seller_name" json:"seller_name" description:"CRM系统-销售名称"`
  17. ContractType int `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约"`
  18. ContractAmount float64 `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"`
  19. InvoicedAmount float64 `gorm:"column:invoiced_amount" json:"invoiced_amount" description:"开票金额"`
  20. PaymentAmount float64 `gorm:"column:payment_amount" json:"payment_amount" description:"到款金额"`
  21. StartDate time.Time `gorm:"column:start_date" json:"start_date" description:"合同开始日期"`
  22. EndDate time.Time `gorm:"column:end_date" json:"end_date" description:"合同结束日期"`
  23. SignDate time.Time `gorm:"column:sign_date" json:"sign_date" description:"合同签订日期"`
  24. AgreedPayTime string `gorm:"column:agreed_pay_time" json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  25. ContractStatus int `gorm:"column:contract_status" json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  26. RegisterStatus int `gorm:"column:register_status" json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
  27. Remark string `gorm:"column:remark" json:"remark" description:"备注信息"`
  28. IsDeleted int `gorm:"column:is_deleted" json:"is_deleted" description:"是否已删除: 0-正常; 1-已删除"`
  29. base.TimeBase
  30. }
  31. func (c *ContractRegister) TableName() string {
  32. return "contract_register"
  33. }
  34. func (c *ContractRegister) Create() (err error) {
  35. err = global.DEFAULT_MYSQL.Create(c).Error
  36. return
  37. }
  38. func (c *ContractRegister) AddInBatches(list []*ContractRegister) (err error) {
  39. err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
  40. return
  41. }
  42. func (c *ContractRegister) Update(updateCols []string) (err error) {
  43. err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error
  44. return
  45. }
  46. func (c *ContractRegister) Fetch(id int) (item *ContractRegister, err error) {
  47. err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_register_id = ?", id).First(&item).Error
  48. return
  49. }
  50. func (c *ContractRegister) FetchByCondition(condition string, pars []interface{}) (item *ContractRegister, err error) {
  51. err = global.DEFAULT_MYSQL.Model(c).
  52. Where("is_deleted = 0").
  53. Where(condition, pars...).
  54. First(&item).Error
  55. return
  56. }
  57. func (c *ContractRegister) List(condition string, pars []interface{}) (list []*ContractRegister, err error) {
  58. list = make([]*ContractRegister, 0)
  59. err = global.DEFAULT_MYSQL.Model(c).
  60. Where("is_deleted = 0").
  61. Where(condition, pars...).
  62. Find(&list).Error
  63. return
  64. }
  65. func (c *ContractRegister) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegister, err error) {
  66. results = make([]*ContractRegister, 0)
  67. query := global.DEFAULT_MYSQL.Model(c).
  68. Where("is_deleted = 0").
  69. Where(condition, pars...)
  70. query.Count(&count)
  71. if len(page.GetOrderItemsString()) > 0 {
  72. query = query.Order(page.GetOrderItemsString())
  73. }
  74. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  75. return
  76. }
  77. // ContractRegisterListReq 合同登记列表请求体
  78. type ContractRegisterListReq struct {
  79. Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
  80. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"合同开始日期"`
  81. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"合同结束日期"`
  82. ServiceType int `json:"service_type" form:"service_type" description:"套餐类型"`
  83. ContractType int `json:"contract_type" form:"contract_type" description:"合同类型"`
  84. RegisterStatus int `json:"register_status" form:"register_status" description:"登记状态"`
  85. base.PageReq
  86. }
  87. // ContractRegisterItem 合同登记
  88. type ContractRegisterItem struct {
  89. ContractRegisterId int `json:"contract_register_id" description:"登记ID"`
  90. ContractCode string `json:"contract_code" description:"合同编号"`
  91. CompanyName string `json:"company_name" description:"客户名称"`
  92. SellerId int `json:"seller_id" description:"CRM系统-销售ID"`
  93. SellerName int `json:"seller_name" description:"CRM系统-销售名称"`
  94. ContractType int `json:"contract_type" description:"合同类型: 1-新签; 2-续约"`
  95. ContractAmount float64 `json:"contract_amount" description:"合同金额"`
  96. InvoicedAmount float64 `json:"invoiced_amount" description:"开票金额"`
  97. PaymentAmount float64 `json:"payment_amount" description:"到款金额"`
  98. StartDate string `json:"start_date" description:"合同开始日期"`
  99. EndDate string `json:"end_date" description:"合同结束日期"`
  100. SignDate string `json:"sign_date" description:"合同签订日期"`
  101. AgreedPayTime string `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  102. ContractStatus int `json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  103. RegisterStatus int `json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
  104. Remark string `json:"remark" description:"备注信息"`
  105. CreateTime string `json:"create_time" description:"登记时间"`
  106. ServicesName string `json:"services" description:"套餐名称"`
  107. }
  108. // ContractRegisterList 合同登记列表
  109. type ContractRegisterList struct {
  110. ContractRegisterItem
  111. InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"`
  112. PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"`
  113. }
  114. // ContractRegisterDelReq 合同登记-删除请求体
  115. type ContractRegisterDelReq struct {
  116. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  117. }
  118. // ContractRegisterUpdateStatusReq 合同登记-修改合同状态请求体
  119. type ContractRegisterUpdateStatusReq struct {
  120. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  121. ContractStatus int `json:"contract_status" binding:"oneof=1 2 3" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  122. }
  123. // ContractRegisterAddReq 新增合同登记请求体
  124. type ContractRegisterAddReq struct {
  125. ContractCode string `json:"contract_code" binding:"required" description:"合同编号"`
  126. CrmContractId int `json:"crm_contract_id" description:"CRM系统-合同ID"`
  127. ContractSource int `json:"contract_source" binding:"oneof=0 1" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  128. CompanyName string `json:"company_name" binding:"required" description:"客户名称"`
  129. SellerId int `json:"seller_id" binding:"required" description:"CRM系统-销售ID"`
  130. SellerName int `json:"seller_name" binding:"required" description:"CRM系统-销售名称"`
  131. ContractType int `json:"contract_type" binding:"oneof=1 2" description:"合同类型: 1-新签; 2-续约"`
  132. ContractAmount float64 `json:"contract_amount" binding:"required" description:"合同金额"`
  133. StartDate string `json:"start_date" binding:"required" description:"合同开始日期"`
  134. EndDate string `json:"end_date" binding:"required" description:"合同结束日期"`
  135. SignDate string `json:"sign_date" binding:"required" description:"合同签订日期"`
  136. AgreedPayTime string `json:"agreed_pay_time" binding:"required" description:"约定付款时间(如:生效日起10日内)"`
  137. ContractStatus int `json:"contract_status" binding:"oneof=1 2 3" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  138. Remark string `json:"remark" description:"备注信息"`
  139. ProductId int `json:"remark" binding:"oneof=1 2" description:"产品ID"`
  140. Services []ContractServiceAddReq `json:"services" description:"服务套餐内容"`
  141. }
  142. // ContractRegisterEditReq 编辑合同登记请求体
  143. type ContractRegisterEditReq struct {
  144. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  145. ContractRegisterAddReq
  146. }
  147. // CreateContractRegisterAndServices 新增合同登记及套餐
  148. func CreateContractRegisterAndServices(item *ContractRegister, serviceDetail []*ContractServiceAndDetail) (err error) {
  149. tx := global.DEFAULT_MYSQL.Begin()
  150. defer func() {
  151. if err != nil {
  152. tx.Rollback()
  153. } else {
  154. tx.Commit()
  155. }
  156. }()
  157. // 合同登记
  158. tx.Create(item)
  159. nowTime := time.Now().Local()
  160. for i := 0; i < len(serviceDetail); i++ {
  161. // 合同服务
  162. t := serviceDetail[i]
  163. contractService := &ContractService{
  164. ContractRegisterId: item.ContractRegisterId,
  165. ProductId: item.ProductId,
  166. ServiceTemplateId: t.ServiceTemplateId,
  167. Title: t.Title,
  168. Value: t.Value,
  169. TableValue: t.TableValue,
  170. HasDetail: t.HasDetail,
  171. ChartPermissionId: t.ChartPermissionId,
  172. }
  173. contractService.Set()
  174. tx.Create(contractService)
  175. // 合同服务详情
  176. for j := 0; j < len(t.DetailList); j++ {
  177. contractServiceDetail := t.DetailList[j]
  178. contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  179. contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  180. contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  181. contractServiceDetail.CreateTime = nowTime
  182. tx.Create(contractServiceDetail)
  183. t.DetailList[j] = contractServiceDetail
  184. }
  185. }
  186. return
  187. }
  188. // UpdateContractRegisterAndServices 新增合同登记及套餐
  189. func UpdateContractRegisterAndServices(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail) (err error) {
  190. tx := global.DEFAULT_MYSQL.Begin()
  191. defer func() {
  192. if err != nil {
  193. tx.Rollback()
  194. } else {
  195. tx.Commit()
  196. }
  197. }()
  198. // 更新合同登记
  199. if e := item.Update(updateCols); e != nil {
  200. return
  201. }
  202. // 删除原服务及详情信息
  203. sql := `DELETE FROM contract_service WHERE contract_register_id = ?`
  204. tx.Exec(sql, item.ContractRegisterId)
  205. sql = `DELETE FROM contract_service_detail WHERE contract_register_id = ?`
  206. tx.Exec(sql, item.ContractRegisterId)
  207. // 新增合同服务
  208. nowTime := time.Now().Local()
  209. for i := 0; i < len(serviceDetail); i++ {
  210. // 合同服务
  211. t := serviceDetail[i]
  212. contractService := &ContractService{
  213. ContractRegisterId: item.ContractRegisterId,
  214. ProductId: item.ProductId,
  215. ServiceTemplateId: t.ServiceTemplateId,
  216. Title: t.Title,
  217. Value: t.Value,
  218. TableValue: t.TableValue,
  219. HasDetail: t.HasDetail,
  220. ChartPermissionId: t.ChartPermissionId,
  221. }
  222. contractService.Set()
  223. tx.Create(contractService)
  224. // 合同服务详情
  225. for j := 0; j < len(t.DetailList); j++ {
  226. contractServiceDetail := t.DetailList[j]
  227. contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  228. contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  229. contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  230. contractServiceDetail.CreateTime = nowTime
  231. tx.Create(contractServiceDetail)
  232. t.DetailList[j] = contractServiceDetail
  233. }
  234. }
  235. return
  236. }
  237. // ContractRegisterDetailReq 合同登记-详情请求体
  238. type ContractRegisterDetailReq struct {
  239. ContractRegisterId int `json:"contract_register_id" form:"contract_register_id" binding:"required,gte=1"`
  240. }
  241. // ContractRegisterDetail-合同登记详情
  242. type ContractRegisterDetail struct {
  243. ContractRegisterItem
  244. ServiceList []*ContractServiceAndDetail `json:"service_list" description:"合同服务及详情"`
  245. InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"`
  246. PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"`
  247. Logs []*ContractRegisterLogItem `json:"logs" description:"登记日志"`
  248. }
  249. // GetContractRegisterItemById 获取合同登记信息
  250. func GetContractRegisterItemById(id int) (item *ContractRegisterItem, err error) {
  251. err = global.DEFAULT_MYSQL.Model(ContractRegister{}).
  252. Where("is_deleted = 0 AND contract_register_id = ?", id).
  253. First(&item).Error
  254. return
  255. }
  256. // GetContractRegisterItemPageList 获取合同登记列表-分页
  257. func GetContractRegisterItemPageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegisterItem, err error) {
  258. results = make([]*ContractRegisterItem, 0)
  259. query := global.DEFAULT_MYSQL.Model(ContractRegister{}).
  260. Where("is_deleted = 0").
  261. Where(condition, pars...)
  262. query.Count(&count)
  263. if len(page.GetOrderItemsString()) > 0 {
  264. query = query.Order(page.GetOrderItemsString())
  265. }
  266. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  267. return
  268. }