package fms import ( "hongze/fms_api/global" "hongze/fms_api/models/base" "hongze/fms_api/utils" "time" ) // ContractRegister 合同登记表 type ContractRegister struct { ContractRegisterId int `gorm:"primaryKey;column:contract_register_id" json:"contract_register_id" description:"登记ID"` ContractCode string `gorm:"column:contract_code" json:"contract_code" description:"合同编号"` RelateContractCode string `gorm:"column:relate_contract_code" json:"relate_contract_code" description:"关联合同编号"` CrmContractId int `gorm:"column:crm_contract_id" json:"crm_contract_id" description:"CRM系统-合同ID"` ContractSource int `gorm:"column:contract_source" json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"` CompanyName string `gorm:"column:company_name" json:"company_name" description:"客户名称"` ActualCompanyName string `gorm:"column:actual_company_name" json:"actual_company_name" description:"实际使用方"` ProductIds string `gorm:"column:product_ids" json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"` SellerId int `gorm:"column:seller_id" json:"seller_id" description:"CRM系统-销售ID"` SellerName string `gorm:"column:seller_name" json:"seller_name" description:"CRM系统-销售名称"` RaiSellerId int `gorm:"column:rai_seller_id" json:"rai_seller_id" binding:"required" description:"CRM系统-权益销售ID"` RaiSellerName string `gorm:"column:rai_seller_name" json:"rai_seller_name" binding:"required" description:"CRM系统-权益销售名称"` ContractType int `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"` ContractAmount float64 `gorm:"column:contract_amount" json:"contract_amount" description:"合同金额"` InvoicedAmount float64 `gorm:"column:invoiced_amount" json:"invoiced_amount" description:"开票金额"` PaymentAmount float64 `gorm:"column:payment_amount" json:"payment_amount" description:"到款金额"` CurrencyUnit string `gorm:"column:currency_unit" json:"currency_unit" description:"货币国际代码"` RMBRate float64 `gorm:"column:rmb_rate" json:"rmb_rate" description:"人民币汇率(create_time当日)"` StartDate time.Time `gorm:"column:start_date" json:"start_date" description:"合同开始日期"` EndDate time.Time `gorm:"column:end_date" json:"end_date" description:"合同结束日期"` SignDate time.Time `gorm:"column:sign_date" json:"sign_date" description:"合同签订日期"` AgreedPayTime string `gorm:"column:agreed_pay_time" json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"` ContractStatus int `gorm:"column:contract_status" json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"` RegisterStatus int `gorm:"column:register_status" json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"` Remark string `gorm:"column:remark" json:"remark" description:"备注信息"` ServiceRemark string `gorm:"column:service_remark" json:"service_remark" description:"套餐备注信息"` HasPayment int `gorm:"column:has_payment" json:"has_payment" description:"是否有代付: 0-无; 1-有"` NewCompany int `gorm:"column:new_company" json:"new_company" description:"是否为新客户: 0-否; 1-是"` IsDeleted int `gorm:"column:is_deleted" json:"is_deleted" description:"是否已删除: 0-正常; 1-已删除"` base.TimeBase } func (c *ContractRegister) TableName() string { return "contract_register" } func (c *ContractRegister) Create() (err error) { err = global.DEFAULT_MYSQL.Create(c).Error return } func (c *ContractRegister) AddInBatches(list []*ContractRegister) (err error) { err = global.DEFAULT_MYSQL.CreateInBatches(list, len(list)).Error return } func (c *ContractRegister) Update(updateCols []string) (err error) { err = global.DEFAULT_MYSQL.Model(c).Select(updateCols).Updates(c).Error return } func (c *ContractRegister) Fetch(id int) (item *ContractRegister, err error) { err = global.DEFAULT_MYSQL.Model(c).Where("is_deleted = 0 AND contract_register_id = ?", id).First(&item).Error return } func (c *ContractRegister) FetchByCondition(condition string, pars []interface{}) (item *ContractRegister, err error) { err = global.DEFAULT_MYSQL.Model(c). Where("is_deleted = 0"). Where(condition, pars...). First(&item).Error return } func (c *ContractRegister) List(condition string, pars []interface{}) (list []*ContractRegister, err error) { list = make([]*ContractRegister, 0) err = global.DEFAULT_MYSQL.Model(c). Where("is_deleted = 0"). Where(condition, pars...). Find(&list).Error return } func (c *ContractRegister) PageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegister, err error) { results = make([]*ContractRegister, 0) query := global.DEFAULT_MYSQL.Model(c). Where("is_deleted = 0"). Where(condition, pars...) query.Count(&count) if len(page.GetOrderItemsString()) > 0 { query = query.Order(page.GetOrderItemsString()) } err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&results).Error return } // ContractRegisterListReq 合同登记列表请求体 type ContractRegisterListReq struct { Keyword string `json:"keyword" form:"keyword" binding:"omitempty" description:"关键词"` StartDate string `json:"start_date" form:"start_date" binding:"omitempty,datetime=2006-01-02" description:"合同开始日期"` EndDate string `json:"end_date" form:"end_date" binding:"omitempty,datetime=2006-01-02" description:"合同结束日期"` ServiceTypes string `json:"service_types" form:"service_types" description:"套餐类型"` ContractType int `json:"contract_type" form:"contract_type" description:"合同类型"` RegisterStatus int `json:"register_status" form:"register_status" description:"登记状态"` base.PageReq } // ContractRegisterItem 合同登记 type ContractRegisterItem struct { ContractRegisterId int `json:"contract_register_id" description:"登记ID"` ContractCode string `json:"contract_code" description:"合同编号"` RelateContractCode string `json:"relate_contract_code" description:"关联合同编号"` CrmContractId int `json:"crm_contract_id" description:"CRM系统-合同ID"` ContractSource int `json:"contract_source" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"` CompanyName string `json:"company_name" description:"客户名称"` ActualCompanyName string `json:"actual_company_name" description:"实际使用方"` SellerId int `json:"seller_id" description:"CRM系统-销售ID"` SellerName string `json:"seller_name" description:"CRM系统-销售名称"` ContractType int `json:"contract_type" description:"合同类型: 1-新签; 2-续约"` ContractAmount float64 `json:"contract_amount" description:"合同金额"` InvoicedAmount float64 `json:"invoiced_amount" description:"开票金额"` PaymentAmount float64 `json:"payment_amount" description:"到款金额"` CurrencyUnit string `json:"currency_unit" description:"货币国际代码"` RMBRate float64 `json:"rmb_rate" description:"人民币汇率(create_time当日)"` StartDate string `json:"start_date" description:"合同开始日期"` EndDate string `json:"end_date" description:"合同结束日期"` SignDate string `json:"sign_date" description:"合同签订日期"` AgreedPayTime string `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"` ContractStatus int `json:"contract_status" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"` RegisterStatus int `json:"register_status" description:"登记状态: 1-进行中; 2-已完成;"` Remark string `json:"remark" description:"备注信息"` ServiceRemark string `json:"service_remark" description:"套餐备注信息"` HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"` NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"` CreateTime string `json:"create_time" description:"登记时间"` } // ContractRegisterList 合同登记列表 type ContractRegisterList struct { *ContractRegisterItem ServicesName string `json:"services" description:"套餐名称"` InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"` PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"` } // ContractRegisterDelReq 合同登记-删除请求体 type ContractRegisterDelReq struct { ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"` } // ContractRegisterUpdateStatusReq 合同登记-修改合同状态请求体 type ContractRegisterUpdateStatusReq struct { ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"` ContractStatus int `json:"contract_status" binding:"oneof=1 2 3 4" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止"` } // ContractRegisterAddReq 新增合同登记请求体 type ContractRegisterAddReq struct { ContractCode string `json:"contract_code" binding:"required" description:"合同编号"` RelateContractCode string `json:"relate_contract_code" description:"关联合同编号"` CrmContractId int `json:"crm_contract_id" description:"CRM系统-合同ID"` ContractSource int `json:"contract_source" binding:"oneof=0 1" description:"合同来源: 0-非系统合同导入; 1-CRM合同导入"` CompanyName string `json:"company_name" binding:"required" description:"客户名称"` ActualCompanyName string `json:"actual_company_name" description:"实际使用方"` SellerId int `json:"seller_id" binding:"required" description:"CRM系统-销售ID"` SellerName string `json:"seller_name" binding:"required" description:"CRM系统-销售名称"` RaiSellerId int `json:"rai_seller_id" binding:"required" description:"CRM系统-权益销售ID"` RaiSellerName string `json:"rai_seller_name" binding:"required" description:"CRM系统-权益销售名称"` ContractType int `json:"contract_type" binding:"oneof=1 2 3 4" description:"合同类型: 1-新签; 2-续约; 3-代付; 4-补充协议"` ContractAmount float64 `json:"contract_amount" binding:"required" description:"合同金额"` CurrencyUnit string `json:"currency_unit" binding:"required" description:"货币单位"` StartDate string `json:"start_date" binding:"required" description:"合同开始日期"` EndDate string `json:"end_date" binding:"required" description:"合同结束日期"` SignDate string `json:"sign_date" description:"合同签订日期"` AgreedPayTime string `json:"agreed_pay_time" description:"约定付款时间(如:生效日起10日内)"` ContractStatus int `json:"contract_status" binding:"oneof=1 2 3 4" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止"` Remark string `json:"remark" description:"备注信息"` ServiceRemark string `json:"service_remark" description:"套餐备注"` ProductIds string `json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"` HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"` NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"` Services []ContractServiceAddReq `json:"services" description:"服务套餐内容"` ServiceAmount []ContractServiceAmountAddReq `json:"service_amount" description:"服务套餐金额"` } // ContractRegisterEditReq 编辑合同登记请求体 type ContractRegisterEditReq struct { ContractRegisterId int `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"` ContractRegisterAddReq } // CreateContractRegisterAndServices 新增合同登记及套餐 func CreateContractRegisterAndServices(item *ContractRegister, serviceDetail []*ContractServiceAndDetail, serviceAmount []*ContractServiceAmount) (err error) { tx := global.DEFAULT_MYSQL.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() // 合同登记 tx.Create(item) //nowTime := time.Now().Local() for i := 0; i < len(serviceDetail); i++ { // 合同服务 t := serviceDetail[i] contractService := &ContractService{ ContractRegisterId: item.ContractRegisterId, ProductId: t.ProductId, ServiceTemplateId: t.ServiceTemplateId, Title: t.Title, Value: t.Value, TableValue: t.TableValue, HasDetail: t.HasDetail, ChartPermissionId: t.ChartPermissionId, ChartPermissionIds: t.ChartPermissionIds, ServiceAmount: t.ServiceAmount, } contractService.Set() tx.Create(contractService) //// 合同服务详情 //for j := 0; j < len(t.Detail); j++ { // contractServiceDetail := t.Detail[j] // contractServiceDetail.ContractServiceId = contractService.ContractServiceId // contractServiceDetail.ContractRegisterId = item.ContractRegisterId // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId // contractServiceDetail.CreateTime = nowTime // tx.Create(contractServiceDetail) // t.Detail[j] = contractServiceDetail //} } for i := 0; i < len(serviceAmount); i++ { // 合同服务 t := serviceAmount[i] tmp := &ContractServiceAmount{ ContractRegisterId: item.ContractRegisterId, ProductId: t.ProductId, ServiceAmount: t.ServiceAmount, CurrencyUnit: t.CurrencyUnit, } tx.Create(tmp) } return } // UpdateContractRegister 更新合同登记 func UpdateContractRegister(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail, invoiceList []*ContractInvoice, invoiceUpdateCols []string, invoiceHandleType int, serviceAmount []*ContractServiceAmount) (err error) { tx := global.DEFAULT_MYSQL.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() // 更新合同登记 if e := tx.Model(item).Select(updateCols).Updates(item).Error; e != nil { err = e return } // 删除原服务及详情信息 sql := `DELETE FROM contract_service WHERE contract_register_id = ?` tx.Exec(sql, item.ContractRegisterId) sql = `DELETE FROM contract_service_detail WHERE contract_register_id = ?` tx.Exec(sql, item.ContractRegisterId) sql = `DELETE FROM contract_service_amount WHERE contract_register_id = ?` tx.Exec(sql, item.ContractRegisterId) // 新增合同服务 //nowTime := time.Now().Local() for i := 0; i < len(serviceDetail); i++ { // 合同服务 t := serviceDetail[i] contractService := &ContractService{ ContractRegisterId: item.ContractRegisterId, ProductId: t.ProductId, ServiceTemplateId: t.ServiceTemplateId, Title: t.Title, Value: t.Value, TableValue: t.TableValue, HasDetail: t.HasDetail, ChartPermissionId: t.ChartPermissionId, ChartPermissionIds: t.ChartPermissionIds, } contractService.Set() tx.Create(contractService) //// 合同服务详情 //for j := 0; j < len(t.Detail); j++ { // contractServiceDetail := t.Detail[j] // contractServiceDetail.ContractServiceId = contractService.ContractServiceId // contractServiceDetail.ContractRegisterId = item.ContractRegisterId // contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId // contractServiceDetail.CreateTime = nowTime // tx.Create(contractServiceDetail) // t.Detail[j] = contractServiceDetail //} } for i := 0; i < len(serviceAmount); i++ { // 合同服务 t := serviceAmount[i] tmp := &ContractServiceAmount{ ContractRegisterId: item.ContractRegisterId, ProductId: t.ProductId, ServiceAmount: t.ServiceAmount, CurrencyUnit: t.CurrencyUnit, } tx.Create(tmp) } // 开票到款操作类型: 0-无; 1-更新; 2-删除; if invoiceHandleType == 2 { sql = `UPDATE contract_invoice SET is_deleted = 1 WHERE contract_register_id = ?` if e := tx.Exec(sql, item.ContractRegisterId).Error; e != nil { err = e return } } if invoiceHandleType == 1 { for i := range invoiceList { if e := tx.Model(invoiceList[i]).Select(invoiceUpdateCols).Updates(invoiceList[i]).Error; e != nil { err = e return } } } return } // ContractRegisterDetailReq 合同登记-详情请求体 type ContractRegisterDetailReq struct { ContractRegisterId int `json:"contract_register_id" form:"contract_register_id" binding:"required,gte=1"` } // ContractRegisterDetail-合同登记详情 type ContractRegisterDetail struct { *ContractRegisterItem ServiceList []*ContractServiceAndDetail `json:"service_list" description:"合同服务及详情"` InvoiceList []*ContractInvoiceItem `json:"invoice_list" description:"开票信息"` PaymentList []*ContractInvoiceItem `json:"payment_list" description:"到款信息"` Logs []*ContractRegisterLogItem `json:"logs" description:"登记日志"` } // GetContractRegisterItemById 获取合同登记信息 func GetContractRegisterItemById(id int) (result *ContractRegisterItem, err error) { item := new(ContractRegister) err = global.DEFAULT_MYSQL.Model(ContractRegister{}). Where("is_deleted = 0 AND contract_register_id = ?", id). First(&item).Error if err != nil && err != utils.ErrNoRow { return } result = formatContractRegister2Item(item) return } // GetContractRegisterItemPageList 获取合同登记列表-分页 func GetContractRegisterItemPageList(page base.IPage, condition string, pars []interface{}) (count int64, results []*ContractRegisterItem, err error) { list := make([]*ContractRegister, 0) query := global.DEFAULT_MYSQL.Table("contract_register"). Where("is_deleted = 0"). Where(condition, pars...) query.Count(&count) if len(page.GetOrderItemsString()) > 0 { query = query.Order(page.GetOrderItemsString()) } err = query.Limit(int(page.GetPageSize())).Offset(int(page.Offset())).Find(&list).Error if err != nil { return } for i := range list { results = append(results, formatContractRegister2Item(list[i])) } return } // formatContractRegister2Item 格式化ContractRegister func formatContractRegister2Item(item *ContractRegister) (formatItem *ContractRegisterItem) { formatItem = new(ContractRegisterItem) formatItem.ContractRegisterId = item.ContractRegisterId formatItem.ContractCode = item.ContractCode formatItem.RelateContractCode = item.RelateContractCode formatItem.CrmContractId = item.CrmContractId formatItem.ContractSource = item.ContractSource formatItem.CompanyName = item.CompanyName formatItem.ActualCompanyName = item.ActualCompanyName formatItem.SellerId = item.SellerId formatItem.SellerName = item.SellerName formatItem.ContractType = item.ContractType formatItem.ContractAmount = item.ContractAmount formatItem.InvoicedAmount = item.InvoicedAmount formatItem.PaymentAmount = item.PaymentAmount formatItem.CurrencyUnit = item.CurrencyUnit formatItem.RMBRate = item.RMBRate formatItem.StartDate = utils.TimeTransferString(utils.FormatDate, item.StartDate) formatItem.EndDate = utils.TimeTransferString(utils.FormatDate, item.EndDate) formatItem.SignDate = utils.TimeTransferString(utils.FormatDate, item.SignDate) formatItem.AgreedPayTime = item.AgreedPayTime formatItem.ContractStatus = item.ContractStatus formatItem.RegisterStatus = item.RegisterStatus formatItem.Remark = item.Remark formatItem.ServiceRemark = item.ServiceRemark formatItem.HasPayment = item.HasPayment formatItem.NewCompany = item.NewCompany formatItem.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime) return } // CreateImportContractRegister 新增导入的合同登记及套餐、开票到款信息 func CreateImportContractRegister(item *ContractRegister, serviceList []*ContractService, invoiceList []*ContractInvoice, serviceAmountList []*ContractServiceAmount) (newId int, err error) { tx := global.DEFAULT_MYSQL.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() // 新增合同登记 if e := tx.Create(item).Error; e != nil { err = e return } newId = item.ContractRegisterId // 新增套餐 if len(serviceList) > 0 { // 过滤重复的数组 serviceMap := make(map[int]struct{}) addServiceList := make([]*ContractService, 0) for i := range serviceList { if _, ok := serviceMap[serviceList[i].ServiceTemplateId]; !ok { serviceList[i].ContractRegisterId = newId addServiceList = append(addServiceList, serviceList[i]) serviceMap[serviceList[i].ServiceTemplateId] = struct{}{} } } if e := tx.CreateInBatches(addServiceList, len(addServiceList)).Error; e != nil { err = e return } } // 新增合同套餐金额相关信息 if len(serviceAmountList) > 0 { for i := range serviceAmountList { serviceAmountList[i].ContractRegisterId = newId } if e := tx.CreateInBatches(serviceAmountList, len(serviceAmountList)).Error; e != nil { err = e return } } // 新增开票/到款 if len(invoiceList) > 0 { for i := range invoiceList { invoiceList[i].ContractRegisterId = newId } if e := tx.CreateInBatches(invoiceList, len(invoiceList)).Error; e != nil { err = e return } } return }