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:"合同编号"` 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:"客户名称"` ProductId int `gorm:"column:product_id" json:"product_id" 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系统-销售名称"` ContractType int `gorm:"column:contract_type" json:"contract_type" description:"合同类型: 1-新签; 2-续约"` 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:"到款金额"` 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:"备注信息"` 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:"合同结束日期"` ServiceType int `json:"service_type" form:"service_type" 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:"合同编号"` CompanyName string `json:"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:"到款金额"` 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:"备注信息"` 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" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"` } // ContractRegisterAddReq 新增合同登记请求体 type ContractRegisterAddReq struct { ContractCode string `json:"contract_code" binding:"required" 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:"客户名称"` SellerId int `json:"seller_id" binding:"required" description:"CRM系统-销售ID"` SellerName string `json:"seller_name" binding:"required" description:"CRM系统-销售名称"` ContractType int `json:"contract_type" binding:"oneof=1 2" description:"合同类型: 1-新签; 2-续约"` ContractAmount float64 `json:"contract_amount" binding:"required" description:"合同金额"` StartDate string `json:"start_date" binding:"required" description:"合同开始日期"` EndDate string `json:"end_date" binding:"required" description:"合同结束日期"` SignDate string `json:"sign_date" binding:"required" description:"合同签订日期"` AgreedPayTime string `json:"agreed_pay_time" binding:"required" description:"约定付款时间(如:生效日起10日内)"` ContractStatus int `json:"contract_status" binding:"oneof=1 2 3" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回"` Remark string `json:"remark" description:"备注信息"` ProductId int `json:"product_id" binding:"oneof=1 2" description:"产品ID"` Services []ContractServiceAddReq `json:"services" 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) (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: item.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.DetailList); j++ { contractServiceDetail := t.DetailList[j] contractServiceDetail.ContractServiceId = contractService.ContractServiceId contractServiceDetail.ContractRegisterId = item.ContractRegisterId contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId contractServiceDetail.CreateTime = nowTime tx.Create(contractServiceDetail) t.DetailList[j] = contractServiceDetail } } return } // UpdateContractRegisterAndServices 新增合同登记及套餐 func UpdateContractRegisterAndServices(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail) (err error) { tx := global.DEFAULT_MYSQL.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() // 更新合同登记 if e := item.Update(updateCols); 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) // 新增合同服务 nowTime := time.Now().Local() for i := 0; i < len(serviceDetail); i++ { // 合同服务 t := serviceDetail[i] contractService := &ContractService{ ContractRegisterId: item.ContractRegisterId, ProductId: item.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.DetailList); j++ { contractServiceDetail := t.DetailList[j] contractServiceDetail.ContractServiceId = contractService.ContractServiceId contractServiceDetail.ContractRegisterId = item.ContractRegisterId contractServiceDetail.ServiceTemplateId = contractService.ServiceTemplateId contractServiceDetail.CreateTime = nowTime tx.Create(contractServiceDetail) t.DetailList[j] = contractServiceDetail } } 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.CompanyName = item.CompanyName 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.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.CreateTime = utils.TimeTransferString(utils.FormatDateTime, item.CreateTime) return }