contract_register.go 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946
  1. package fms
  2. import (
  3. "fmt"
  4. "hongze/fms_api/global"
  5. "hongze/fms_api/models/base"
  6. "hongze/fms_api/models/crm"
  7. "hongze/fms_api/utils"
  8. "time"
  9. )
  10. // ContractRegister 合同登记表
  11. type ContractRegister struct {
  12. ContractRegisterId int `gorm:"primaryKey;column:contract_register_id" json:"contract_register_id" description:"登记ID"`
  13. ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"`
  14. RelateContractCode string `gorm:"column:relate_contract_code" json:"relate_contract_code" description:"关联合同编号"`
  15. RelateContractMainCode string `gorm:"column:relate_contract_main_code" json:"relate_contract_main_code" description:"关联主合同编号"`
  16. CrmContractId int `gorm:"column:crm_contract_id" json:"crm_contract_id" description:"CRM系统-合同ID"`
  17. ContractSource int `gorm:"column:contract_source" json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  18. CompanyName string `gorm:"column:company_name" json:"company_name" description:"客户名称"`
  19. ActualCompanyName string `gorm:"column:actual_company_name" json:"actual_company_name" description:"实际使用方"`
  20. ProductIds string `gorm:"column:product_ids" json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"`
  21. SellerId int `gorm:"column:seller_id" json:"seller_id" description:"CRM系统-销售ID"`
  22. SellerName string `gorm:"column:seller_name" json:"seller_name" description:"CRM系统-销售名称"`
  23. RaiSellerId int `gorm:"column:rai_seller_id" json:"rai_seller_id" description:"CRM系统-权益销售ID"`
  24. RaiSellerName string `gorm:"column:rai_seller_name" json:"rai_seller_name" description:"CRM系统-权益销售名称"`
  25. ContractType int `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"`
  26. ContractAmount float64 `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"`
  27. InvoicedAmount float64 `gorm:"column:invoiced_amount" json:"invoiced_amount" description:"开票金额"`
  28. PaymentAmount float64 `gorm:"column:payment_amount" json:"payment_amount" description:"到款金额"`
  29. CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"`
  30. RMBRate float64 `gorm:"column:rmb_rate" json:"rmb_rate" description:"人民币汇率(create_time当日)"`
  31. StartDate time.Time `gorm:"column:start_date" json:"start_date" description:"合同开始日期"`
  32. EndDate time.Time `gorm:"column:end_date" json:"end_date" description:"合同结束日期"`
  33. SignDate time.Time `gorm:"column:sign_date" json:"sign_date" description:"合同签订日期"`
  34. AgreedPayTime string `gorm:"column:agreed_pay_time" json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  35. ContractStatus int `gorm:"column:contract_status" json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  36. RegisterStatus int `gorm:"column:register_status" json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
  37. Remark string `gorm:"column:remark" json:"remark" description:"备注信息"`
  38. ServiceRemark string `gorm:"column:service_remark" json:"service_remark" description:"套餐备注信息"`
  39. HasPayment int `gorm:"column:has_payment" json:"has_payment" description:"是否有代付: 0-无; 1-有"`
  40. HasInvoice int `gorm:"column:has_invoice" json:"has_invoice" description:"是否需要开票到款: 0-无; 1-有"`
  41. NewCompany int `gorm:"column:new_company" json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  42. ActualPayCompanies string `gorm:"column:actual_pay_companies" json:"actual_pay_companies" description:"合同关联的所有代付方名称, 英文逗号拼接"`
  43. IsDeleted int `gorm:"column:is_deleted" json:"is_deleted" description:"是否已删除: 0-正常; 1-已删除"`
  44. base.TimeBase
  45. }
  46. func (c *ContractRegister) TableName() string {
  47. return "contract_register"
  48. }
  49. func (c *ContractRegister) Create() (err error) {
  50. err = global.DEFAULT_MYSQL.Create(c).Error
  51. return
  52. }
  53. func (c *ContractRegister) AddInBatches(list []*ContractRegister) (err error) {
  54. err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error
  55. return
  56. }
  57. func (c *ContractRegister) Update(updateCols []string) (err error) {
  58. err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error
  59. return
  60. }
  61. func (c *ContractRegister) Fetch(id int) (item *ContractRegister, err error) {
  62. err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_register_id = ?", id).First(&item).Error
  63. return
  64. }
  65. func (c *ContractRegister) FetchByCondition(condition string, pars []interface{}) (item *ContractRegister, err error) {
  66. err = global.DEFAULT_MYSQL.Model(c).
  67. Where("is_deleted = 0").
  68. Where(condition, pars...).
  69. First(&item).Error
  70. return
  71. }
  72. func (c *ContractRegister) List(condition string, pars []interface{}) (list []*ContractRegister, err error) {
  73. list = make([]*ContractRegister, 0)
  74. err = global.DEFAULT_MYSQL.Model(c).
  75. Where("is_deleted = 0").
  76. Where("register_status <> 0").
  77. Where(condition, pars...).
  78. Find(&list).Error
  79. return
  80. }
  81. func (c *ContractRegister) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegister, err error) {
  82. results = make([]*ContractRegister, 0)
  83. query := global.DEFAULT_MYSQL.Model(c).
  84. Where("is_deleted = 0").
  85. Where(condition, pars...)
  86. query.Count(&count)
  87. if len(page.GetOrderItemsString()) > 0 {
  88. query = query.Order(page.GetOrderItemsString())
  89. }
  90. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error
  91. return
  92. }
  93. // ContractRegisterListReq 合同登记列表请求体
  94. type ContractRegisterListReq struct {
  95. Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"`
  96. StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"合同开始日期"`
  97. EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"合同结束日期"`
  98. ServiceTypes string `json:"service_types" form:"service_types" description:"套餐类型"`
  99. ContractType string `json:"contract_type" form:"contract_type" description:"合同类型"`
  100. RegisterStatus int `json:"register_status" form:"register_status" description:"登记状态"`
  101. ListParam int `json:"list_param" form:"list_param" description:"套餐类型: 0-全部; 1-ficc; 2-权益"`
  102. base.PageReq
  103. }
  104. // ContractRegisterItem 合同登记
  105. type ContractRegisterItem struct {
  106. ContractRegisterId int `json:"contract_register_id" description:"登记ID"`
  107. ContractCode string `json:"contract_code" description:"合同编号"`
  108. RelateContractCode string `json:"relate_contract_code" description:"关联合同编号"`
  109. RelateContractMainCode string `json:"relate_contract_main_code" description:"关联合同主编号"`
  110. CrmContractId int `json:"crm_contract_id" description:"CRM系统-合同ID"`
  111. ContractSource int `json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  112. CompanyName string `json:"company_name" description:"客户名称"`
  113. ActualCompanyName string `json:"actual_company_name" description:"实际使用方"`
  114. ProductIds string `json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"`
  115. SellerId int `json:"seller_id" description:"CRM系统-销售ID"`
  116. SellerName string `json:"seller_name" description:"CRM系统-销售名称"`
  117. RaiSellerId int `json:"rai_seller_id" description:"CRM系统-权益销售ID"`
  118. RaiSellerName string `json:"rai_seller_name" description:"CRM系统-权益销售名称"`
  119. ContractType int `json:"contract_type" description:"合同类型: 1-新签; 2-续约"`
  120. ContractAmount float64 `json:"contract_amount" description:"合同金额"`
  121. InvoicedAmount float64 `json:"invoiced_amount" description:"开票金额"`
  122. PaymentAmount float64 `json:"payment_amount" description:"到款金额"`
  123. CurrencyUnit string `json:"currency_unit" description:"货币国际代码"`
  124. RMBRate float64 `json:"rmb_rate" description:"人民币汇率(create_time当日)"`
  125. StartDate string `json:"start_date" description:"合同开始日期"`
  126. EndDate string `json:"end_date" description:"合同结束日期"`
  127. SignDate string `json:"sign_date" description:"合同签订日期"`
  128. AgreedPayTime string `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  129. ContractStatus int `json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"`
  130. RegisterStatus int `json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"`
  131. Remark string `json:"remark" description:"备注信息"`
  132. ServiceRemark string `json:"service_remark" description:"套餐备注信息"`
  133. HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"`
  134. HasInvoice int `json:"has_invoice" description:"是否需要开票到款: 0-无; 1-有"`
  135. NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
  136. ActualPayCompanies string `json:"actual_pay_companies" description:"合同关联的所有代付方名称, 英文逗号拼接"`
  137. CreateTime string `json:"create_time" description:"登记时间"`
  138. SellerIds string `json:"seller_ids"`
  139. }
  140. // ContractRegisterList 合同登记列表
  141. type ContractRegisterList struct {
  142. *ContractRegisterItem
  143. ContractTypeString string `json:"contract_type_string" description:"合同类型"`
  144. ServicesName string `json:"services" description:"套餐名称"`
  145. InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"`
  146. PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"`
  147. }
  148. // ContractRegisterDelReq 合同登记-删除请求体
  149. type ContractRegisterDelReq struct {
  150. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  151. }
  152. // ContractRegisterUpdateStatusReq 合同登记-修改合同状态请求体
  153. type ContractRegisterUpdateStatusReq struct {
  154. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  155. ContractStatus int `json:"contract_status" binding:"oneof=1 2 3 4 5" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止, 5-邮件备案"`
  156. }
  157. // ContractRegisterAddReq 新增合同登记请求体
  158. type ContractRegisterAddReq struct {
  159. ContractCode string `json:"contract_code" binding:"required" description:"合同编号"`
  160. RelateContractCode string `json:"relate_contract_code" description:"关联合同编号"`
  161. RelateContractMainCode string `json:"relate_contract_main_code" description:"关联主合同编号"`
  162. CrmContractId int `json:"crm_contract_id" description:"CRM系统-合同ID"`
  163. ContractSource int `json:"contract_source" binding:"oneof=0 1" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"`
  164. CompanyName string `json:"company_name" binding:"required" description:"客户名称"`
  165. SellerIds string `json:"seller_ids" binding:"required" description:"CRM系统-销售ID"`
  166. ContractType int `json:"contract_type" binding:"oneof=1 2 3 4" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"`
  167. ContractAmount float64 `json:"contract_amount" binding:"required" description:"合同金额"`
  168. CurrencyUnit string `json:"currency_unit" binding:"required" description:"货币单位"`
  169. StartDate string `json:"start_date" binding:"required" description:"合同开始日期"`
  170. EndDate string `json:"end_date" binding:"required" description:"合同结束日期"`
  171. SignDate string `json:"sign_date" description:"合同签订日期"`
  172. AgreedPayTime string `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"`
  173. ContractStatus int `json:"contract_status" binding:"oneof=1 2 3 4 5" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止; 5-邮件备案"`
  174. Remark string `json:"remark" description:"备注信息"`
  175. ProductIds string `json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"`
  176. ServiceRemark string `json:"service_remark" description:"套餐备注"`
  177. HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"`
  178. HasInvoice int `json:"has_invoice" description:"是否需要开票到款流程: 0-无; 1-有"`
  179. Supplement int `json:"supplement" description:"是否为补录合同: 0-否; 1-是"`
  180. ContractRegisterId int `json:"contract_register_id" description:"登记ID"`
  181. Services []ContractServiceAddReq `json:"services" description:"服务套餐内容"`
  182. ServiceAmount []ContractServiceAmountAddReq `json:"service_amount" description:"服务套餐金额"`
  183. ActualPayCompanies string `json:"actual_pay_companies" description:"合同关联的所有代付方名称, 英文逗号拼接"`
  184. }
  185. // ContractRegisterEditReq 编辑合同登记请求体
  186. type ContractRegisterEditReq struct {
  187. ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
  188. ContractRegisterAddReq
  189. }
  190. // CreateContractRegisterAndServices 新增合同登记及套餐
  191. func CreateContractRegisterAndServices(item *ContractRegister, serviceDetail []*ContractServiceAndDetail, serviceAmount []*ContractServiceAmount) (err error) {
  192. tx := global.DEFAULT_MYSQL.Begin()
  193. defer func() {
  194. if err != nil {
  195. tx.Rollback()
  196. } else {
  197. tx.Commit()
  198. }
  199. }()
  200. // 合同登记
  201. tx.Create(item)
  202. //nowTime := time.Now().Local()
  203. for i := 0; i < len(serviceDetail); i++ {
  204. // 合同服务
  205. t := serviceDetail[i]
  206. contractService := &ContractService{
  207. ContractRegisterId: item.ContractRegisterId,
  208. ProductId: t.ProductId,
  209. ServiceTemplateId: t.ServiceTemplateId,
  210. Title: t.Title,
  211. Value: t.Value,
  212. TableValue: t.TableValue,
  213. HasDetail: t.HasDetail,
  214. ChartPermissionId: t.ChartPermissionId,
  215. ChartPermissionIds: t.ChartPermissionIds,
  216. }
  217. contractService.Set()
  218. tx.Create(contractService)
  219. //// 合同服务详情
  220. //for j := 0; j < len(t.Detail); j++ {
  221. // contractServiceDetail := t.Detail[j]
  222. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  223. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  224. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  225. // contractServiceDetail.CreateTime = nowTime
  226. // tx.Create(contractServiceDetail)
  227. // t.Detail[j] = contractServiceDetail
  228. //}
  229. }
  230. for i := 0; i < len(serviceAmount); i++ {
  231. // 合同服务
  232. t := serviceAmount[i]
  233. tmp := &ContractServiceAmount{
  234. ContractRegisterId: item.ContractRegisterId,
  235. ProductId: t.ProductId,
  236. ServiceAmount: t.ServiceAmount,
  237. CurrencyUnit: t.CurrencyUnit,
  238. }
  239. tx.Create(tmp)
  240. }
  241. return
  242. }
  243. // UpdateContractRegister 更新合同登记
  244. func UpdateContractRegister(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail,
  245. invoiceList []*ContractInvoice, invoiceUpdateCols []string, invoiceHandleType int, serviceAmount []*ContractServiceAmount) (err error) {
  246. tx := global.DEFAULT_MYSQL.Begin()
  247. defer func() {
  248. if err != nil {
  249. tx.Rollback()
  250. } else {
  251. tx.Commit()
  252. }
  253. }()
  254. // 更新合同登记
  255. if e := tx.Model(item).Select(updateCols).Updates(item).Error; e != nil {
  256. err = e
  257. return
  258. }
  259. // 删除原服务及详情信息
  260. sql := `DELETE FROM contract_service WHERE contract_register_id = ?`
  261. tx.Exec(sql, item.ContractRegisterId)
  262. sql = `DELETE FROM contract_service_detail WHERE contract_register_id = ?`
  263. tx.Exec(sql, item.ContractRegisterId)
  264. sql = `DELETE FROM contract_service_amount WHERE contract_register_id = ?`
  265. tx.Exec(sql, item.ContractRegisterId)
  266. // 新增合同服务
  267. //nowTime := time.Now().Local()
  268. for i := 0; i < len(serviceDetail); i++ {
  269. // 合同服务
  270. t := serviceDetail[i]
  271. contractService := &ContractService{
  272. ContractRegisterId: item.ContractRegisterId,
  273. ProductId: t.ProductId,
  274. ServiceTemplateId: t.ServiceTemplateId,
  275. Title: t.Title,
  276. Value: t.Value,
  277. TableValue: t.TableValue,
  278. HasDetail: t.HasDetail,
  279. ChartPermissionId: t.ChartPermissionId,
  280. ChartPermissionIds: t.ChartPermissionIds,
  281. }
  282. contractService.Set()
  283. tx.Create(contractService)
  284. //// 合同服务详情
  285. //for j := 0; j < len(t.Detail); j++ {
  286. // contractServiceDetail := t.Detail[j]
  287. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  288. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  289. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  290. // contractServiceDetail.CreateTime = nowTime
  291. // tx.Create(contractServiceDetail)
  292. // t.Detail[j] = contractServiceDetail
  293. //}
  294. }
  295. for i := 0; i < len(serviceAmount); i++ {
  296. // 合同服务
  297. t := serviceAmount[i]
  298. tmp := &ContractServiceAmount{
  299. ContractRegisterId: item.ContractRegisterId,
  300. ProductId: t.ProductId,
  301. ServiceAmount: t.ServiceAmount,
  302. CurrencyUnit: t.CurrencyUnit,
  303. }
  304. tx.Create(tmp)
  305. }
  306. // 开票到款操作类型: 0-无; 1-更新; 2-删除;
  307. if invoiceHandleType == 2 {
  308. sql = `UPDATE contract_invoice SET is_deleted = 1 WHERE contract_register_id = ?`
  309. if e := tx.Exec(sql, item.ContractRegisterId).Error; e != nil {
  310. err = e
  311. return
  312. }
  313. }
  314. if invoiceHandleType == 1 {
  315. for i := range invoiceList {
  316. if e := tx.Model(invoiceList[i]).Select(invoiceUpdateCols).Updates(invoiceList[i]).Error; e != nil {
  317. err = e
  318. return
  319. }
  320. }
  321. }
  322. return
  323. }
  324. // ContractRegisterDetailReq 合同登记-详情请求体
  325. type ContractRegisterDetailReq struct {
  326. ContractRegisterId int `json:"contract_register_id" form:"contract_register_id" binding:"required,gte=1"`
  327. }
  328. // ContractRegisterDetail 合同登记详情
  329. type ContractRegisterDetail struct {
  330. *ContractRegisterItem
  331. ServiceList []*ContractServiceAndDetail `json:"service_list" description:"合同服务及详情"`
  332. InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"`
  333. PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"`
  334. Logs []*ContractRegisterLogItem `json:"logs" description:"登记日志"`
  335. ServiceAmountList []*ContractServiceAmountItem `json:"service_amount_list" description:"合同套餐金额"`
  336. }
  337. // GetContractRegisterItemById 获取合同登记信息
  338. func GetContractRegisterItemById(id int) (result *ContractRegisterItem, err error) {
  339. item := new(ContractRegister)
  340. err = global.DEFAULT_MYSQL.Model(ContractRegister{}).
  341. Where("is_deleted = 0 AND contract_register_id = ?", id).
  342. First(&item).Error
  343. if err != nil && err != utils.ErrNoRow {
  344. return
  345. }
  346. result = formatContractRegister2Item(item)
  347. return
  348. }
  349. // GetContractRegisterItemPageList 获取合同登记列表-分页
  350. func GetContractRegisterItemPageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegisterItem, err error) {
  351. list := make([]*ContractRegister, 0)
  352. query := global.DEFAULT_MYSQL.Table("contract_register").
  353. Where("is_deleted = 0").
  354. Where("register_status <> 0").
  355. Where(condition, pars...)
  356. query.Count(&count)
  357. if len(page.GetOrderItemsString()) > 0 {
  358. query = query.Order(page.GetOrderItemsString())
  359. }
  360. err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&list).Error
  361. if err != nil {
  362. return
  363. }
  364. for i := range list {
  365. results = append(results, formatContractRegister2Item(list[i]))
  366. }
  367. return
  368. }
  369. // formatContractRegister2Item 格式化ContractRegister
  370. func formatContractRegister2Item(item *ContractRegister) (formatItem *ContractRegisterItem) {
  371. formatItem = new(ContractRegisterItem)
  372. formatItem.ContractRegisterId = item.ContractRegisterId
  373. formatItem.ContractCode = item.ContractCode
  374. formatItem.RelateContractCode = item.RelateContractCode
  375. formatItem.RelateContractMainCode = item.RelateContractMainCode
  376. formatItem.CrmContractId = item.CrmContractId
  377. formatItem.ContractSource = item.ContractSource
  378. formatItem.CompanyName = item.CompanyName
  379. formatItem.ActualCompanyName = item.ActualCompanyName
  380. formatItem.ProductIds = item.ProductIds
  381. formatItem.SellerId = item.SellerId
  382. formatItem.SellerName = item.SellerName
  383. formatItem.RaiSellerId = item.RaiSellerId
  384. formatItem.RaiSellerName = item.RaiSellerName
  385. formatItem.ContractType = item.ContractType
  386. formatItem.ContractAmount = item.ContractAmount
  387. formatItem.InvoicedAmount = item.InvoicedAmount
  388. formatItem.PaymentAmount = item.PaymentAmount
  389. formatItem.CurrencyUnit = item.CurrencyUnit
  390. formatItem.RMBRate = item.RMBRate
  391. formatItem.StartDate = utils.TimeTransferString(utils.FormatDate, item.StartDate)
  392. formatItem.EndDate = utils.TimeTransferString(utils.FormatDate, item.EndDate)
  393. formatItem.SignDate = utils.TimeTransferString(utils.FormatDate, item.SignDate)
  394. formatItem.AgreedPayTime = item.AgreedPayTime
  395. formatItem.ContractStatus = item.ContractStatus
  396. formatItem.RegisterStatus = item.RegisterStatus
  397. formatItem.Remark = item.Remark
  398. formatItem.ServiceRemark = item.ServiceRemark
  399. formatItem.HasPayment = item.HasPayment
  400. formatItem.HasInvoice = item.HasInvoice
  401. formatItem.NewCompany = item.NewCompany
  402. formatItem.ActualPayCompanies = item.ActualPayCompanies
  403. formatItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime)
  404. return
  405. }
  406. // CreateImportContractRegister 新增导入的合同登记及套餐、开票到款信息
  407. func CreateImportContractRegister(item *ContractRegister, serviceList []*ContractService, invoiceList []*ContractInvoice, serviceAmountList []*ContractServiceAmount) (newId int, err error) {
  408. tx := global.DEFAULT_MYSQL.Begin()
  409. defer func() {
  410. if err != nil {
  411. tx.Rollback()
  412. } else {
  413. tx.Commit()
  414. }
  415. }()
  416. // 新增合同登记
  417. if e := tx.Create(item).Error; e != nil {
  418. err = e
  419. return
  420. }
  421. newId = item.ContractRegisterId
  422. // 新增套餐
  423. if len(serviceList) > 0 {
  424. // 过滤重复的数组
  425. serviceMap := make(map[int]struct{})
  426. addServiceList := make([]*ContractService, 0)
  427. for i := range serviceList {
  428. if _, ok := serviceMap[serviceList[i].ServiceTemplateId]; !ok {
  429. serviceList[i].ContractRegisterId = newId
  430. addServiceList = append(addServiceList, serviceList[i])
  431. serviceMap[serviceList[i].ServiceTemplateId] = struct{}{}
  432. }
  433. }
  434. if e := tx.CreateInBatches(addServiceList, len(addServiceList)).Error; e != nil {
  435. err = e
  436. return
  437. }
  438. }
  439. // 新增合同套餐金额相关信息
  440. if len(serviceAmountList) > 0 {
  441. for i := range serviceAmountList {
  442. serviceAmountList[i].ContractRegisterId = newId
  443. }
  444. if e := tx.CreateInBatches(serviceAmountList, len(serviceAmountList)).Error; e != nil {
  445. err = e
  446. return
  447. }
  448. }
  449. // 新增开票/到款
  450. if len(invoiceList) > 0 {
  451. for i := range invoiceList {
  452. invoiceList[i].ContractRegisterId = newId
  453. }
  454. if e := tx.CreateInBatches(invoiceList, len(invoiceList)).Error; e != nil {
  455. err = e
  456. return
  457. }
  458. }
  459. return
  460. }
  461. func GetContractInfoByRegisterIds(registerIds []int) (list []ContractRegister, err error) {
  462. err = global.DEFAULT_MYSQL.Model(ContractRegister{}).
  463. Where("is_deleted = 0 AND contract_register_id in ?", registerIds).
  464. Find(&list).Error
  465. return
  466. }
  467. // CreateContractRegisterAndServices 新增合同登记及套餐
  468. func CreateContractRegisterAndServicesAndPayMent(item *ContractRegister, serviceDetail []*ContractServiceAndDetail) (err error) {
  469. tx := global.DEFAULT_MYSQL.Begin()
  470. defer func() {
  471. if err != nil {
  472. tx.Rollback()
  473. } else {
  474. tx.Commit()
  475. }
  476. }()
  477. // 合同登记
  478. //tx.Create(item)
  479. //nowTime := time.Now().Local()
  480. for i := 0; i < len(serviceDetail); i++ {
  481. // 合同服务
  482. t := serviceDetail[i]
  483. contractService := &ContractService{
  484. ContractRegisterId: item.ContractRegisterId,
  485. ProductId: t.ProductId,
  486. ServiceTemplateId: t.ServiceTemplateId,
  487. Title: t.Title,
  488. Value: t.Value,
  489. TableValue: t.TableValue,
  490. HasDetail: t.HasDetail,
  491. ChartPermissionId: t.ChartPermissionId,
  492. ChartPermissionIds: t.ChartPermissionIds,
  493. }
  494. contractService.Set()
  495. tx.Create(contractService)
  496. //// 合同服务详情
  497. //for j := 0; j < len(t.Detail); j++ {
  498. // contractServiceDetail := t.Detail[j]
  499. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  500. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  501. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  502. // contractServiceDetail.CreateTime = nowTime
  503. // tx.Create(contractServiceDetail)
  504. // t.Detail[j] = contractServiceDetail
  505. //}
  506. }
  507. return
  508. }
  509. type CheckContractNameReq struct {
  510. CompanyName string `json:"company_name" form:"company_name" description:"客户名称"`
  511. StartDate string `json:"start_date" form:"start_date" description:"合同开始日期"`
  512. EndDate string `json:"end_date" form:"end_date" description:"合同结束日期"`
  513. SellerIds string `json:"seller_ids" form:"seller_ids" binding:"required" description:"CRM系统-销售ID"`
  514. }
  515. type CheckContractNameResp struct {
  516. Exist int `json:"exist" description:"是否存在相似的合同:0不存在,1存在"`
  517. }
  518. // UpdateContractPreRegister 更新合同预登记
  519. func UpdateContractPreRegister(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail,
  520. invoiceList []*ContractInvoice, invoiceUpdateCols []string, delInvoiceIds, delPreRegisterIds []int, ppList []*ContractPreRegister, sellerItem *crm.SellerAdminWithGroupTeam, registerType int) (err error) {
  521. tx := global.DEFAULT_MYSQL.Begin()
  522. defer func() {
  523. if err != nil {
  524. tx.Rollback()
  525. } else {
  526. tx.Commit()
  527. }
  528. }()
  529. // 更新合同登记
  530. if e := tx.Model(item).Select(updateCols).Updates(item).Error; e != nil {
  531. err = e
  532. return
  533. }
  534. // 删除原服务及详情信息
  535. sql := `DELETE FROM contract_service WHERE contract_register_id = ?`
  536. tx.Exec(sql, item.ContractRegisterId)
  537. // 新增合同服务
  538. //nowTime := time.Now().Local()
  539. for i := 0; i < len(serviceDetail); i++ {
  540. // 合同服务
  541. t := serviceDetail[i]
  542. contractService := &ContractService{
  543. ContractRegisterId: item.ContractRegisterId,
  544. ProductId: t.ProductId,
  545. ServiceTemplateId: t.ServiceTemplateId,
  546. Title: t.Title,
  547. Value: t.Value,
  548. TableValue: t.TableValue,
  549. HasDetail: t.HasDetail,
  550. ChartPermissionId: t.ChartPermissionId,
  551. ChartPermissionIds: t.ChartPermissionIds,
  552. }
  553. contractService.Set()
  554. tx.Create(contractService)
  555. //// 合同服务详情
  556. //for j := 0; j < len(t.Detail); j++ {
  557. // contractServiceDetail := t.Detail[j]
  558. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  559. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  560. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  561. // contractServiceDetail.CreateTime = nowTime
  562. // tx.Create(contractServiceDetail)
  563. // t.Detail[j] = contractServiceDetail
  564. //}
  565. }
  566. for i := range invoiceList {
  567. fmt.Println("invoiceList[i].SellerName", invoiceList[i].SellerName)
  568. fmt.Println("invoiceList[i].SellerId", invoiceList[i].SellerId)
  569. if invoiceList[i].ContractInvoiceId == 0 {
  570. if e := invoiceList[i].Create(); e != nil {
  571. err = e
  572. return
  573. }
  574. if len(ppList) > 0 {
  575. pp := &ContractPreRegister{
  576. PreRegisterId: invoiceList[i].PreRegisterId,
  577. }
  578. fmt.Println("PreRegisterId:", pp.PreRegisterId)
  579. fmt.Println("invoiceList[i].ContractInvoiceId:", invoiceList[i].ContractInvoiceId)
  580. ppUpdateCols := make([]string, 0)
  581. if invoiceList[i].InvoiceType == 3 {
  582. pp.InvoiceId = invoiceList[i].ContractInvoiceId
  583. ppUpdateCols = append(ppUpdateCols, "InvoiceId")
  584. } else {
  585. pp.ArriveId = invoiceList[i].ContractInvoiceId
  586. ppUpdateCols = append(ppUpdateCols, "ArriveId")
  587. }
  588. if e := pp.Update(ppUpdateCols); e != nil {
  589. err = e
  590. return
  591. }
  592. }
  593. } else {
  594. if e := tx.Model(invoiceList[i]).Select(invoiceUpdateCols).Updates(invoiceList[i]).Error; e != nil {
  595. err = e
  596. return
  597. }
  598. }
  599. }
  600. //更新另一类型的invoice表数据
  601. invoiceItem := ContractInvoice{
  602. ContractRegisterId: item.ContractRegisterId,
  603. StartDate: item.StartDate,
  604. EndDate: item.EndDate,
  605. CurrencyUnit: item.CurrencyUnit,
  606. SellerId: sellerItem.SellerId,
  607. SellerName: sellerItem.SellerName,
  608. SellerGroupId: sellerItem.GroupId,
  609. SellerGroupName: sellerItem.GroupName,
  610. SellerTeamId: sellerItem.TeamId,
  611. SellerTeamName: sellerItem.TeamName,
  612. }
  613. if registerType == 3 {
  614. tx.Model(&invoiceItem).Select([]string{"StartDate", "EndDate", "CurrencyUnit", "SellerId",
  615. "SellerName", "SellerGroupId", "SellerGroupName", "SellerTeamId", "SellerTeamName"}).Where("contract_register_id = ? AND invoice_type = 4", item.ContractRegisterId).Updates(invoiceItem)
  616. } else {
  617. tx.Model(&invoiceItem).Select([]string{"StartDate", "EndDate", "CurrencyUnit"}).Where("contract_register_id", item.ContractRegisterId).Updates(invoiceItem)
  618. }
  619. //pp := &ContractPreRegister{}
  620. //ppItem, e := pp.Fetch(ppList[0].PreRegisterId)
  621. //if e != nil {
  622. // err = e
  623. //}
  624. //otherInvoiceItem := ContractInvoice{}
  625. //if ppList[0].InvoiceType == ContractInvoiceTypePreMake {
  626. // otherInvoiceItem.ContractInvoiceId = ppItem.ArriveId
  627. // if ppItem.ArriveId > 0 {
  628. // //如果是开票类型,那么更新预登记里的预到款销售信息
  629. // otherInvoiceItem.SellerId = invoiceList[0].SellerId
  630. // otherInvoiceItem.SellerName = invoiceList[0].SellerName
  631. // otherInvoiceItem.SellerGroupId = invoiceList[0].SellerGroupId
  632. // otherInvoiceItem.SellerGroupName = invoiceList[0].SellerGroupName
  633. // otherInvoiceItem.SellerTeamId = invoiceList[0].SellerTeamId
  634. // otherInvoiceItem.SellerTeamName = invoiceList[0].SellerTeamName
  635. // }
  636. // tx.Model(&otherInvoiceItem).Select([]string{"SellerId", "SellerName", "SellerGroupId","SellerGroupName","SellerTeamId","SellerTeamName"}).Updates(otherInvoiceItem)
  637. //}
  638. //删除
  639. if len(delInvoiceIds) > 0 {
  640. for _, id := range delInvoiceIds {
  641. ob := ContractInvoice{ContractInvoiceId: id}
  642. tx.Model(&ob).Delete(ob)
  643. }
  644. }
  645. if len(delPreRegisterIds) > 0 {
  646. for _, id := range delPreRegisterIds {
  647. ob := ContractPreRegister{PreRegisterId: id}
  648. tx.Model(&ob).Delete(ob)
  649. }
  650. }
  651. return
  652. }
  653. // UpdateContractRegister 预登记保存和更新
  654. func UpdateContractRegisterPre(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail,
  655. invoiceList []*ContractInvoice, invoiceUpdateCols []string, invoiceHandleType int, ppList []*ContractPreRegister) (err error) {
  656. tx := global.DEFAULT_MYSQL.Begin()
  657. defer func() {
  658. if err != nil {
  659. tx.Rollback()
  660. } else {
  661. tx.Commit()
  662. }
  663. }()
  664. // 更新合同登记
  665. if e := tx.Model(item).Select(updateCols).Updates(item).Error; e != nil {
  666. err = e
  667. return
  668. }
  669. // 删除原服务及详情信息
  670. sql := `DELETE FROM contract_service WHERE contract_register_id = ?`
  671. tx.Exec(sql, item.ContractRegisterId)
  672. sql = `DELETE FROM contract_service_detail WHERE contract_register_id = ?`
  673. tx.Exec(sql, item.ContractRegisterId)
  674. sql = `DELETE FROM contract_service_amount WHERE contract_register_id = ?`
  675. tx.Exec(sql, item.ContractRegisterId)
  676. // 新增合同服务
  677. //nowTime := time.Now().Local()
  678. for i := 0; i < len(serviceDetail); i++ {
  679. // 合同服务
  680. t := serviceDetail[i]
  681. contractService := &ContractService{
  682. ContractRegisterId: item.ContractRegisterId,
  683. ProductId: t.ProductId,
  684. ServiceTemplateId: t.ServiceTemplateId,
  685. Title: t.Title,
  686. Value: t.Value,
  687. TableValue: t.TableValue,
  688. HasDetail: t.HasDetail,
  689. ChartPermissionId: t.ChartPermissionId,
  690. ChartPermissionIds: t.ChartPermissionIds,
  691. }
  692. contractService.Set()
  693. tx.Create(contractService)
  694. //// 合同服务详情
  695. //for j := 0; j < len(t.Detail); j++ {
  696. // contractServiceDetail := t.Detail[j]
  697. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  698. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  699. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  700. // contractServiceDetail.CreateTime = nowTime
  701. // tx.Create(contractServiceDetail)
  702. // t.Detail[j] = contractServiceDetail
  703. //}
  704. }
  705. productId := 0
  706. if len(invoiceList) > 0 {
  707. productId = invoiceList[0].ServiceProductId
  708. }
  709. pp := &ContractPreRegister{}
  710. ppItem, e := pp.Fetch(ppList[0].PreRegisterId)
  711. if e != nil {
  712. err = e
  713. }
  714. //更新同一预登记记录下的productid
  715. otherInvoiceItem := ContractInvoice{
  716. ServiceProductId: productId,
  717. }
  718. if ppList[0].InvoiceType == ContractInvoiceTypePreMake {
  719. otherInvoiceItem.ContractInvoiceId = ppItem.ArriveId
  720. if ppItem.ArriveId > 0 {
  721. //如果是开票类型,那么更新预登记里的预到款销售信息
  722. otherInvoiceItem.SellerId = invoiceList[0].SellerId
  723. otherInvoiceItem.SellerName = invoiceList[0].SellerName
  724. otherInvoiceItem.SellerGroupId = invoiceList[0].SellerGroupId
  725. otherInvoiceItem.SellerGroupName = invoiceList[0].SellerGroupName
  726. otherInvoiceItem.SellerTeamId = invoiceList[0].SellerTeamId
  727. otherInvoiceItem.SellerTeamName = invoiceList[0].SellerTeamName
  728. }
  729. tx.Model(&otherInvoiceItem).Select([]string{"ServiceProductId", "SellerId", "SellerName", "SellerGroupId", "SellerGroupName", "SellerTeamId", "SellerTeamName"}).Updates(otherInvoiceItem)
  730. } else {
  731. otherInvoiceItem.ContractInvoiceId = ppItem.InvoiceId
  732. tx.Model(&otherInvoiceItem).Select([]string{"ServiceProductId"}).Updates(otherInvoiceItem)
  733. }
  734. //更新另一类型的invoice表数据
  735. invoiceItem := ContractInvoice{
  736. ContractRegisterId: item.ContractRegisterId,
  737. StartDate: item.StartDate,
  738. EndDate: item.EndDate,
  739. CurrencyUnit: item.CurrencyUnit,
  740. }
  741. tx.Model(&invoiceItem).Select([]string{"StartDate", "EndDate", "CurrencyUnit"}).Where("contract_register_id", item.ContractRegisterId).Updates(invoiceItem)
  742. // 开票到款操作类型: 0-无; 1-更新; 2-新增;
  743. if invoiceHandleType == 2 {
  744. for _, v := range invoiceList {
  745. if e := v.Create(); e != nil {
  746. err = e
  747. return
  748. }
  749. if len(ppList) > 0 {
  750. pp := &ContractPreRegister{
  751. PreRegisterId: ppList[0].PreRegisterId,
  752. }
  753. ppUpdateCols := make([]string, 0)
  754. if v.InvoiceType == 3 {
  755. pp.InvoiceId = v.ContractInvoiceId
  756. ppUpdateCols = append(ppUpdateCols, "InvoiceId")
  757. } else {
  758. pp.ArriveId = v.ContractInvoiceId
  759. ppUpdateCols = append(ppUpdateCols, "ArriveId")
  760. }
  761. if e := pp.Update(ppUpdateCols); e != nil {
  762. err = e
  763. return
  764. }
  765. }
  766. }
  767. }
  768. if invoiceHandleType == 1 {
  769. for i := range invoiceList {
  770. if e := tx.Model(invoiceList[i]).Select(invoiceUpdateCols).Updates(invoiceList[i]).Error; e != nil {
  771. err = e
  772. return
  773. }
  774. }
  775. }
  776. return
  777. }
  778. // UpdateSupplementContractPreRegister 更新补录合同预登记
  779. func UpdateSupplementContractPreRegister(item *ContractRegister, serviceAmountList []*ContractServiceAmount, serviceDetail []*ContractServiceAndDetail) (err error) {
  780. tx := global.DEFAULT_MYSQL.Begin()
  781. defer func() {
  782. if err != nil {
  783. tx.Rollback()
  784. } else {
  785. tx.Commit()
  786. }
  787. }()
  788. for i := 0; i < len(serviceAmountList); i++ {
  789. // 合同服务
  790. t := serviceAmountList[i]
  791. tmp := &ContractServiceAmount{
  792. ContractRegisterId: item.ContractRegisterId,
  793. ProductId: t.ProductId,
  794. ServiceAmount: t.ServiceAmount,
  795. CurrencyUnit: t.CurrencyUnit,
  796. }
  797. if e := tmp.Create(); e != nil {
  798. err = e
  799. return
  800. }
  801. }
  802. // 删除原服务及详情信息
  803. sql := `DELETE FROM contract_service WHERE contract_register_id = ?`
  804. tx.Exec(sql, item.ContractRegisterId)
  805. // 新增合同服务
  806. //nowTime := time.Now().Local()
  807. for i := 0; i < len(serviceDetail); i++ {
  808. // 合同服务
  809. t := serviceDetail[i]
  810. contractService := &ContractService{
  811. ContractRegisterId: item.ContractRegisterId,
  812. ProductId: t.ProductId,
  813. ServiceTemplateId: t.ServiceTemplateId,
  814. Title: t.Title,
  815. Value: t.Value,
  816. TableValue: t.TableValue,
  817. HasDetail: t.HasDetail,
  818. ChartPermissionId: t.ChartPermissionId,
  819. ChartPermissionIds: t.ChartPermissionIds,
  820. }
  821. contractService.Set()
  822. tx.Create(contractService)
  823. //// 合同服务详情
  824. //for j := 0; j < len(t.Detail); j++ {
  825. // contractServiceDetail := t.Detail[j]
  826. // contractServiceDetail.ContractServiceId = contractService.ContractServiceId
  827. // contractServiceDetail.ContractRegisterId = item.ContractRegisterId
  828. // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId
  829. // contractServiceDetail.CreateTime = nowTime
  830. // tx.Create(contractServiceDetail)
  831. // t.Detail[j] = contractServiceDetail
  832. //}
  833. }
  834. return
  835. }
  836. type CheckContractDuplicateReq struct {
  837. CompanyName string `json:"company_name" form:"company_name" description:"客户名称"`
  838. StartDate string `json:"start_date" form:"start_date" description:"合同开始日期"`
  839. EndDate string `json:"end_date" form:"end_date" description:"合同结束日期"`
  840. ContractType int `json:"contract_type" binding:"oneof=1 2 3 4" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"`
  841. HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"`
  842. Services []ContractServiceAddReq `json:"services" description:"服务套餐内容"`
  843. }
  844. func CheckContractDuplicate(condition string, pars []interface{}) (list []*ContractRegister, err error) {
  845. query := global.DEFAULT_MYSQL.Table("contract_register AS a").
  846. Select("a.* ").
  847. Joins(" JOIN contract_service AS b ON a.contract_register_id = b.contract_register_id ").
  848. Where(condition, pars...).
  849. Group("a.contract_register_id")
  850. err = query.Find(&list).Error
  851. return
  852. }
  853. type CheckContractDuplicateResp struct {
  854. Exist int `json:"exist" description:"是否存在重复的合同:0不存在,1存在"`
  855. Type int `json:"type" description:"重复的合同类型:0预登记,1合规登记"`
  856. }
  857. type ContractServiceDuplicateItem struct {
  858. Ids string
  859. ContractRegisterId int
  860. }
  861. func CheckContractServiceDuplicate(registerIds []int) (list []*ContractServiceDuplicateItem, err error) {
  862. err = global.DEFAULT_MYSQL.Table("contract_service").
  863. Select("GROUP_CONCAT(service_template_id ORDER BY service_template_id) AS ids, contract_register_id ").
  864. Where("contract_register_id IN (?)", registerIds).
  865. Group("contract_register_id").Find(&list).Error
  866. return
  867. }