contract_register.go 39 KB

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