contract_register.go 40 KB

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