contract_register.go 33 KB

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