contract_register.go 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427
  1. package fms
  2. import (
  3. "hongze/fms_api/global"
  4. "hongze/fms_api/models/base"
  5. "hongze/fms_api/utils"
  6. "time"
  7. )
  8. // ContractRegister 合同登记表
  9. type ContractRegister struct {
  10. ContractRegisterId int `gorm:"primaryKey;column:contract_register_id" json:"contract_register_id" description:"登记ID"`
  11. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  12. RelateContractCode string `gorm:"column:relate_contract_code" json:"relate_contract_code" description:"关联合同编号"`
  13. CrmContractId int `gorm:"column:crm_contract_id" json:"crm_contract_id" description:"CRM系统-合同ID"`
  14. ContractSource int `gorm:"column:contract_source" json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  15. CompanyName string `gorm:"column:company_name" json:"company_name" description:"客户名称"`
  16. ActualCompanyName string `gorm:"column:actual_company_name" json:"actual_company_name" description:"实际使用方"`
  17. ProductId int `gorm:"column:product_id" json:"product_id" description:"产品ID: 1-FICC; 2-权益"`
  18. SellerId int `gorm:"column:seller_id" json:"seller_id" description:"CRM系统-销售ID"`
  19. SellerName string `gorm:"column:seller_name" json:"seller_name" description:"CRM系统-销售名称"`
  20. ContractType int `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"`
  21. ContractAmount float64 `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"`
  22. InvoicedAmount float64 `gorm:"column:invoiced_amount" json:"invoiced_amount" description:"开票金额"`
  23. PaymentAmount float64 `gorm:"column:payment_amount" json:"payment_amount" description:"到款金额"`
  24. CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
  25. RMBRate float64 `gorm:"column:rmb_rate" json:"rmb_rate" description:"人民币汇率(create_time当日)"`
  26. StartDate time.Time `gorm:"column:start_date" json:"start_date" description:"合同开始日期"`
  27. EndDate time.Time `gorm:"column:end_date" json:"end_date" description:"合同结束日期"`
  28. SignDate time.Time `gorm:"column:sign_date" json:"sign_date" description:"合同签订日期"`
  29. AgreedPayTime string `gorm:"column:agreed_pay_time" json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  30. ContractStatus int `gorm:"column:contract_status" json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  31. RegisterStatus int `gorm:"column:register_status" json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
  32. Remark string `gorm:"column:remark" json:"remark" description:"备注信息"`
  33. ServiceRemark string `gorm:"column:service_remark" json:"service_remark" description:"套餐备注信息"`
  34. HasPayment int `gorm:"column:has_payment" json:"has_payment" description:"是否有代付: 0-无; 1-有"`
  35. NewCompany int `gorm:"column:new_company" json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  36. IsDeleted int `gorm:"column:is_deleted" json:"is_deleted" description:"是否已删除: 0-正常; 1-已删除"`
  37. base.TimeBase
  38. }
  39. func (c *ContractRegister) TableName() string {
  40. return "contract_register"
  41. }
  42. func (c *ContractRegister) Create() (err error) {
  43. err = global.DEFAULT_MYSQL.Create(c).Error
  44. return
  45. }
  46. func (c *ContractRegister) AddInBatches(list []*ContractRegister) (err error) {
  47. err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
  48. return
  49. }
  50. func (c *ContractRegister) Update(updateCols []string) (err error) {
  51. err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error
  52. return
  53. }
  54. func (c *ContractRegister) Fetch(id int) (item *ContractRegister, err error) {
  55. err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_register_id = ?", id).First(&item).Error
  56. return
  57. }
  58. func (c *ContractRegister) FetchByCondition(condition string, pars []interface{}) (item *ContractRegister, err error) {
  59. err = global.DEFAULT_MYSQL.Model(c).
  60. Where("is_deleted = 0").
  61. Where(condition, pars...).
  62. First(&item).Error
  63. return
  64. }
  65. func (c *ContractRegister) List(condition string, pars []interface{}) (list []*ContractRegister, err error) {
  66. list = make([]*ContractRegister, 0)
  67. err = global.DEFAULT_MYSQL.Model(c).
  68. Where("is_deleted = 0").
  69. Where(condition, pars...).
  70. Find(&list).Error
  71. return
  72. }
  73. func (c *ContractRegister) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegister, err error) {
  74. results = make([]*ContractRegister, 0)
  75. query := global.DEFAULT_MYSQL.Model(c).
  76. Where("is_deleted = 0").
  77. Where(condition, pars...)
  78. query.Count(&count)
  79. if len(page.GetOrderItemsString()) > 0 {
  80. query = query.Order(page.GetOrderItemsString())
  81. }
  82. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  83. return
  84. }
  85. // ContractRegisterListReq 合同登记列表请求体
  86. type ContractRegisterListReq struct {
  87. Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
  88. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"合同开始日期"`
  89. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"合同结束日期"`
  90. ServiceType int `json:"service_type" form:"service_type" description:"套餐类型"`
  91. ContractType int `json:"contract_type" form:"contract_type" description:"合同类型"`
  92. RegisterStatus int `json:"register_status" form:"register_status" description:"登记状态"`
  93. base.PageReq
  94. }
  95. // ContractRegisterItem 合同登记
  96. type ContractRegisterItem struct {
  97. ContractRegisterId int `json:"contract_register_id" description:"登记ID"`
  98. ContractCode string `json:"contract_code" description:"合同编号"`
  99. RelateContractCode string `json:"relate_contract_code" description:"关联合同编号"`
  100. CrmContractId int `json:"crm_contract_id" description:"CRM系统-合同ID"`
  101. ContractSource int `json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  102. CompanyName string `json:"company_name" description:"客户名称"`
  103. ActualCompanyName string `json:"actual_company_name" description:"实际使用方"`
  104. SellerId int `json:"seller_id" description:"CRM系统-销售ID"`
  105. SellerName string `json:"seller_name" description:"CRM系统-销售名称"`
  106. ContractType int `json:"contract_type" description:"合同类型: 1-新签; 2-续约"`
  107. ContractAmount float64 `json:"contract_amount" description:"合同金额"`
  108. InvoicedAmount float64 `json:"invoiced_amount" description:"开票金额"`
  109. PaymentAmount float64 `json:"payment_amount" description:"到款金额"`
  110. CurrencyUnit string `json:"currency_unit" description:"货币国际代码"`
  111. RMBRate float64 `json:"rmb_rate" description:"人民币汇率(create_time当日)"`
  112. StartDate string `json:"start_date" description:"合同开始日期"`
  113. EndDate string `json:"end_date" description:"合同结束日期"`
  114. SignDate string `json:"sign_date" description:"合同签订日期"`
  115. AgreedPayTime string `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  116. ContractStatus int `json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  117. RegisterStatus int `json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
  118. Remark string `json:"remark" description:"备注信息"`
  119. ServiceRemark string `json:"service_remark" description:"套餐备注信息"`
  120. HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"`
  121. NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  122. CreateTime string `json:"create_time" description:"登记时间"`
  123. }
  124. // ContractRegisterList 合同登记列表
  125. type ContractRegisterList struct {
  126. *ContractRegisterItem
  127. ServicesName string `json:"services" description:"套餐名称"`
  128. InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"`
  129. PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"`
  130. }
  131. // ContractRegisterDelReq 合同登记-删除请求体
  132. type ContractRegisterDelReq struct {
  133. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  134. }
  135. // ContractRegisterUpdateStatusReq 合同登记-修改合同状态请求体
  136. type ContractRegisterUpdateStatusReq struct {
  137. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  138. ContractStatus int `json:"contract_status" binding:"oneof=1 2 3 4 5" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止, 5-邮件备案"`
  139. }
  140. // ContractRegisterAddReq 新增合同登记请求体
  141. type ContractRegisterAddReq struct {
  142. ContractCode string `json:"contract_code" binding:"required" description:"合同编号"`
  143. RelateContractCode string `json:"relate_contract_code" description:"关联合同编号"`
  144. CrmContractId int `json:"crm_contract_id" description:"CRM系统-合同ID"`
  145. ContractSource int `json:"contract_source" binding:"oneof=0 1" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  146. CompanyName string `json:"company_name" binding:"required" description:"客户名称"`
  147. ActualCompanyName string `json:"actual_company_name" description:"实际使用方"`
  148. SellerId int `json:"seller_id" binding:"required" description:"CRM系统-销售ID"`
  149. SellerName string `json:"seller_name" binding:"required" description:"CRM系统-销售名称"`
  150. ContractType int `json:"contract_type" binding:"oneof=1 2 3 4" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"`
  151. ContractAmount float64 `json:"contract_amount" binding:"required" description:"合同金额"`
  152. CurrencyUnit string `json:"currency_unit" binding:"required" description:"货币单位"`
  153. StartDate string `json:"start_date" binding:"required" description:"合同开始日期"`
  154. EndDate string `json:"end_date" binding:"required" description:"合同结束日期"`
  155. SignDate string `json:"sign_date" description:"合同签订日期"`
  156. AgreedPayTime string `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  157. ContractStatus int `json:"contract_status" binding:"oneof=1 2 3 4 5" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止; 5-邮件备案"`
  158. Remark string `json:"remark" description:"备注信息"`
  159. ProductId int `json:"product_id" binding:"oneof=1 2" description:"产品ID"`
  160. ServiceRemark string `json:"service_remark" description:"套餐备注"`
  161. HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"`
  162. NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  163. Services []ContractServiceAddReq `json:"services" description:"服务套餐内容"`
  164. }
  165. // ContractRegisterEditReq 编辑合同登记请求体
  166. type ContractRegisterEditReq struct {
  167. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  168. ContractRegisterAddReq
  169. }
  170. // CreateContractRegisterAndServices 新增合同登记及套餐
  171. func CreateContractRegisterAndServices(item *ContractRegister, serviceDetail []*ContractServiceAndDetail) (err error) {
  172. tx := global.DEFAULT_MYSQL.Begin()
  173. defer func() {
  174. if err != nil {
  175. tx.Rollback()
  176. } else {
  177. tx.Commit()
  178. }
  179. }()
  180. // 合同登记
  181. tx.Create(item)
  182. //nowTime := time.Now().Local()
  183. for i := 0; i < len(serviceDetail); i++ {
  184. // 合同服务
  185. t := serviceDetail[i]
  186. contractService := &ContractService{
  187. ContractRegisterId: item.ContractRegisterId,
  188. ProductId: item.ProductId,
  189. ServiceTemplateId: t.ServiceTemplateId,
  190. Title: t.Title,
  191. Value: t.Value,
  192. TableValue: t.TableValue,
  193. HasDetail: t.HasDetail,
  194. ChartPermissionId: t.ChartPermissionId,
  195. ChartPermissionIds: t.ChartPermissionIds,
  196. }
  197. contractService.Set()
  198. tx.Create(contractService)
  199. //// 合同服务详情
  200. //for j := 0; j < len(t.Detail); j++ {
  201. // contractServiceDetail := t.Detail[j]
  202. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  203. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  204. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  205. // contractServiceDetail.CreateTime = nowTime
  206. // tx.Create(contractServiceDetail)
  207. // t.Detail[j] = contractServiceDetail
  208. //}
  209. }
  210. return
  211. }
  212. // UpdateContractRegister 更新合同登记
  213. func UpdateContractRegister(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail,
  214. invoiceList []*ContractInvoice, invoiceUpdateCols []string, invoiceHandleType int) (err error) {
  215. tx := global.DEFAULT_MYSQL.Begin()
  216. defer func() {
  217. if err != nil {
  218. tx.Rollback()
  219. } else {
  220. tx.Commit()
  221. }
  222. }()
  223. // 更新合同登记
  224. if e := tx.Model(item).Select(updateCols).Updates(item).Error; e != nil {
  225. err = e
  226. return
  227. }
  228. // 删除原服务及详情信息
  229. sql := `DELETE FROM contract_service WHERE contract_register_id = ?`
  230. tx.Exec(sql, item.ContractRegisterId)
  231. sql = `DELETE FROM contract_service_detail WHERE contract_register_id = ?`
  232. tx.Exec(sql, item.ContractRegisterId)
  233. // 新增合同服务
  234. //nowTime := time.Now().Local()
  235. for i := 0; i < len(serviceDetail); i++ {
  236. // 合同服务
  237. t := serviceDetail[i]
  238. contractService := &ContractService{
  239. ContractRegisterId: item.ContractRegisterId,
  240. ProductId: item.ProductId,
  241. ServiceTemplateId: t.ServiceTemplateId,
  242. Title: t.Title,
  243. Value: t.Value,
  244. TableValue: t.TableValue,
  245. HasDetail: t.HasDetail,
  246. ChartPermissionId: t.ChartPermissionId,
  247. ChartPermissionIds: t.ChartPermissionIds,
  248. }
  249. contractService.Set()
  250. tx.Create(contractService)
  251. //// 合同服务详情
  252. //for j := 0; j < len(t.Detail); j++ {
  253. // contractServiceDetail := t.Detail[j]
  254. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  255. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  256. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  257. // contractServiceDetail.CreateTime = nowTime
  258. // tx.Create(contractServiceDetail)
  259. // t.Detail[j] = contractServiceDetail
  260. //}
  261. }
  262. // 开票到款操作类型: 0-无; 1-更新; 2-删除;
  263. if invoiceHandleType == 2 {
  264. sql = `UPDATE contract_invoice SET is_deleted = 1 WHERE contract_register_id = ?`
  265. if e := tx.Exec(sql, item.ContractRegisterId).Error; e != nil {
  266. err = e
  267. return
  268. }
  269. }
  270. if invoiceHandleType == 1 {
  271. for i := range invoiceList {
  272. if e := tx.Model(invoiceList[i]).Select(invoiceUpdateCols).Updates(invoiceList[i]).Error; e != nil {
  273. err = e
  274. return
  275. }
  276. }
  277. }
  278. return
  279. }
  280. // ContractRegisterDetailReq 合同登记-详情请求体
  281. type ContractRegisterDetailReq struct {
  282. ContractRegisterId int `json:"contract_register_id" form:"contract_register_id" binding:"required,gte=1"`
  283. }
  284. // ContractRegisterDetail-合同登记详情
  285. type ContractRegisterDetail struct {
  286. *ContractRegisterItem
  287. ServiceList []*ContractServiceAndDetail `json:"service_list" description:"合同服务及详情"`
  288. InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"`
  289. PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"`
  290. Logs []*ContractRegisterLogItem `json:"logs" description:"登记日志"`
  291. }
  292. // GetContractRegisterItemById 获取合同登记信息
  293. func GetContractRegisterItemById(id int) (result *ContractRegisterItem, err error) {
  294. item := new(ContractRegister)
  295. err = global.DEFAULT_MYSQL.Model(ContractRegister{}).
  296. Where("is_deleted = 0 AND contract_register_id = ?", id).
  297. First(&item).Error
  298. if err != nil && err != utils.ErrNoRow {
  299. return
  300. }
  301. result = formatContractRegister2Item(item)
  302. return
  303. }
  304. // GetContractRegisterItemPageList 获取合同登记列表-分页
  305. func GetContractRegisterItemPageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegisterItem, err error) {
  306. list := make([]*ContractRegister, 0)
  307. query := global.DEFAULT_MYSQL.Table("contract_register").
  308. Where("is_deleted = 0").
  309. Where(condition, pars...)
  310. query.Count(&count)
  311. if len(page.GetOrderItemsString()) > 0 {
  312. query = query.Order(page.GetOrderItemsString())
  313. }
  314. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&list).Error
  315. if err != nil {
  316. return
  317. }
  318. for i := range list {
  319. results = append(results, formatContractRegister2Item(list[i]))
  320. }
  321. return
  322. }
  323. // formatContractRegister2Item 格式化ContractRegister
  324. func formatContractRegister2Item(item *ContractRegister) (formatItem *ContractRegisterItem) {
  325. formatItem = new(ContractRegisterItem)
  326. formatItem.ContractRegisterId = item.ContractRegisterId
  327. formatItem.ContractCode = item.ContractCode
  328. formatItem.RelateContractCode = item.RelateContractCode
  329. formatItem.CrmContractId = item.CrmContractId
  330. formatItem.ContractSource = item.ContractSource
  331. formatItem.CompanyName = item.CompanyName
  332. formatItem.ActualCompanyName = item.ActualCompanyName
  333. formatItem.SellerId = item.SellerId
  334. formatItem.SellerName = item.SellerName
  335. formatItem.ContractType = item.ContractType
  336. formatItem.ContractAmount = item.ContractAmount
  337. formatItem.InvoicedAmount = item.InvoicedAmount
  338. formatItem.PaymentAmount = item.PaymentAmount
  339. formatItem.CurrencyUnit = item.CurrencyUnit
  340. formatItem.RMBRate = item.RMBRate
  341. formatItem.StartDate = utils.TimeTransferString(utils.FormatDate, item.StartDate)
  342. formatItem.EndDate = utils.TimeTransferString(utils.FormatDate, item.EndDate)
  343. formatItem.SignDate = utils.TimeTransferString(utils.FormatDate, item.SignDate)
  344. formatItem.AgreedPayTime = item.AgreedPayTime
  345. formatItem.ContractStatus = item.ContractStatus
  346. formatItem.RegisterStatus = item.RegisterStatus
  347. formatItem.Remark = item.Remark
  348. formatItem.ServiceRemark = item.ServiceRemark
  349. formatItem.HasPayment = item.HasPayment
  350. formatItem.NewCompany = item.NewCompany
  351. formatItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
  352. return
  353. }
  354. // CreateImportContractRegister 新增导入的合同登记及套餐、开票到款信息
  355. func CreateImportContractRegister(item *ContractRegister, serviceList []*ContractService, invoiceList []*ContractInvoice) (newId int, err error) {
  356. tx := global.DEFAULT_MYSQL.Begin()
  357. defer func() {
  358. if err != nil {
  359. tx.Rollback()
  360. } else {
  361. tx.Commit()
  362. }
  363. }()
  364. // 新增合同登记
  365. if e := tx.Create(item).Error; e != nil {
  366. err = e
  367. return
  368. }
  369. newId = item.ContractRegisterId
  370. // 新增套餐
  371. if len(serviceList) > 0 {
  372. for i := range serviceList {
  373. serviceList[i].ContractRegisterId = newId
  374. }
  375. if e := tx.CreateInBatches(serviceList, len(serviceList)).Error; e != nil {
  376. err = e
  377. return
  378. }
  379. }
  380. // 新增开票/到款
  381. if len(invoiceList) > 0 {
  382. for i := range invoiceList {
  383. invoiceList[i].ContractRegisterId = newId
  384. }
  385. if e := tx.CreateInBatches(invoiceList, len(invoiceList)).Error; e != nil {
  386. err = e
  387. return
  388. }
  389. }
  390. return
  391. }