contract_register.go 33 KB

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