package fms import ( "fmt" "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:"关联合同编号"` RelateContractMainCode string `gorm:"column:relate_contract_main_code" json:"relate_contract_main_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" description:"CRM系统-权益销售ID"` RaiSellerName string `gorm:"column:rai_seller_name" json:"rai_seller_name" 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-有"` HasInvoice int `gorm:"column:has_invoice" json:"has_invoice" 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-已删除"` ActualPayCompanies string `gorm:"column:actual_pay_companies" json:"actual_pay_companies" description:"合同关联的所有代付方名称, 英文逗号拼接"` 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("register_status <> 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 string `json:"contract_type" form:"contract_type" description:"合同类型"` RegisterStatus int `json:"register_status" form:"register_status" description:"登记状态"` ListParam int `json:"list_param" form:"list_param" description:"套餐类型: 0-全部; 1-ficc; 2-权益"` 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:"实际使用方"` ProductIds string `json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"` SellerId int `json:"seller_id" description:"CRM系统-销售ID"` SellerName string `json:"seller_name" description:"CRM系统-销售名称"` RaiSellerId int `json:"rai_seller_id" description:"CRM系统-权益销售ID"` RaiSellerName string `json:"rai_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-有"` HasInvoice int `json:"has_invoice" description:"是否需要开票到款: 0-无; 1-有"` NewCompany int `json:"new_company" description:"是否为新客户: 0-否; 1-是"` ActualPayCompanies string `json:"actual_pay_companies" description:"合同关联的所有代付方名称, 英文逗号拼接"` CreateTime string `json:"create_time" description:"登记时间"` SellerIds string `json:"seller_ids"` } // ContractRegisterList 合同登记列表 type ContractRegisterList struct { *ContractRegisterItem ContractTypeString string `json:"contract_type_string" description:"合同类型"` 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 5" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止, 5-邮件备案"` } // ContractRegisterAddReq 新增合同登记请求体 type ContractRegisterAddReq struct { ContractCode string `json:"contract_code" binding:"required" description:"合同编号"` RelateContractCode string `json:"relate_contract_code" description:"关联合同编号"` RelateContractMainCode string `json:"relate_contract_main_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:"客户名称"` SellerIds string `json:"seller_ids" binding:"required" description:"CRM系统-销售ID"` 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 5" description:"合同状态: 1-已审批; 2-单章寄出; 3-已签回; 4-已终止; 5-邮件备案"` Remark string `json:"remark" description:"备注信息"` ProductIds string `json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"` ServiceRemark string `json:"service_remark" description:"套餐备注"` HasPayment int `json:"has_payment" description:"是否有代付: 0-无; 1-有"` HasInvoice int `json:"has_invoice" description:"是否需要开票到款流程: 0-无; 1-有"` Supplement int `json:"supplement" description:"是否为补录合同: 0-否; 1-是"` ContractRegisterId int `json:"contract_register_id" description:"登记ID"` Services []ContractServiceAddReq `json:"services" description:"服务套餐内容"` ServiceAmount []ContractServiceAmountAddReq `json:"service_amount" description:"服务套餐金额"` ActualPayCompanies string `json:"actual_pay_companies" 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, } 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:"登记日志"` ServiceAmountList []*ContractServiceAmountItem `json:"service_amount_list" 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("register_status <> 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.ProductIds = item.ProductIds formatItem.SellerId = item.SellerId formatItem.SellerName = item.SellerName formatItem.RaiSellerId = item.RaiSellerId formatItem.RaiSellerName = item.RaiSellerName 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.HasInvoice = item.HasInvoice formatItem.NewCompany = item.NewCompany formatItem.ActualPayCompanies = item.ActualPayCompanies 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 } func GetContractInfoByRegisterIds(registerIds []int) (list []ContractRegister, err error) { err = global.DEFAULT_MYSQL.Model(ContractRegister{}). Where("is_deleted = 0 AND contract_register_id in ?", registerIds). Find(&list).Error return } // CreateContractRegisterAndServices 新增合同登记及套餐 func CreateContractRegisterAndServicesAndPayMent(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: 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 //} } return } type CheckContractNameReq struct { CompanyName string `json:"company_name" form:"company_name" description:"客户名称"` StartDate string `json:"start_date" form:"start_date" description:"合同开始日期"` EndDate string `json:"end_date" form:"end_date" description:"合同结束日期"` SellerIds string `json:"seller_ids" form:"seller_ids" binding:"required" description:"CRM系统-销售ID"` } type CheckContractNameResp struct { Exist int `json:"exist" description:"是否存在相似的合同:0不存在,1存在"` } // UpdateContractPreRegister 更新合同预登记 func UpdateContractPreRegister(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail, invoiceList []*ContractInvoice, invoiceUpdateCols []string, delInvoiceIds, delPreRegisterIds []int, ppList []*ContractPreRegister) (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) // 新增合同服务 //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 := range invoiceList { if invoiceList[i].ContractInvoiceId == 0 { if e := invoiceList[i].Create(); e != nil { err = e return } if len(ppList) > 0 { pp := &ContractPreRegister{ PreRegisterId: invoiceList[i].PreRegisterId, } fmt.Println("PreRegisterId:", pp.PreRegisterId) fmt.Println("invoiceList[i].ContractInvoiceId:", invoiceList[i].ContractInvoiceId) ppUpdateCols := make([]string, 0) if invoiceList[i].InvoiceType == 3 { pp.InvoiceId = invoiceList[i].ContractInvoiceId ppUpdateCols = append(ppUpdateCols, "InvoiceId") } else { pp.ArriveId = invoiceList[i].ContractInvoiceId ppUpdateCols = append(ppUpdateCols, "ArriveId") } if e := pp.Update(ppUpdateCols); e != nil { err = e return } } } else { if e := tx.Model(invoiceList[i]).Select(invoiceUpdateCols).Updates(invoiceList[i]).Error; e != nil { err = e return } } } //更新另一类型的invoice表数据 invoiceItem := ContractInvoice{ ContractRegisterId: item.ContractRegisterId, StartDate: item.StartDate, EndDate: item.EndDate, CurrencyUnit: item.CurrencyUnit, } tx.Model(&invoiceItem).Select([]string{"StartDate", "EndDate", "CurrencyUnit"}).Where("ContractRegisterId", item.ContractRegisterId).Updates(invoiceItem) //pp := &ContractPreRegister{} //ppItem, e := pp.Fetch(ppList[0].PreRegisterId) //if e != nil { // err = e //} //otherInvoiceItem := ContractInvoice{} //if ppList[0].InvoiceType == ContractInvoiceTypePreMake { // otherInvoiceItem.ContractInvoiceId = ppItem.ArriveId // if ppItem.ArriveId > 0 { // //如果是开票类型,那么更新预登记里的预到款销售信息 // otherInvoiceItem.SellerId = invoiceList[0].SellerId // otherInvoiceItem.SellerName = invoiceList[0].SellerName // otherInvoiceItem.SellerGroupId = invoiceList[0].SellerGroupId // otherInvoiceItem.SellerGroupName = invoiceList[0].SellerGroupName // otherInvoiceItem.SellerTeamId = invoiceList[0].SellerTeamId // otherInvoiceItem.SellerTeamName = invoiceList[0].SellerTeamName // } // tx.Model(&otherInvoiceItem).Select([]string{"SellerId", "SellerName", "SellerGroupId","SellerGroupName","SellerTeamId","SellerTeamName"}).Updates(otherInvoiceItem) //} //删除 if len(delInvoiceIds) > 0 { for _, id := range delInvoiceIds { ob := ContractInvoice{ContractInvoiceId: id} tx.Model(&ob).Delete(ob) } } if len(delPreRegisterIds) > 0 { for _, id := range delPreRegisterIds { ob := ContractPreRegister{PreRegisterId: id} tx.Model(&ob).Delete(ob) } } return } // UpdateContractRegister 预登记保存和更新 func UpdateContractRegisterPre(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail, invoiceList []*ContractInvoice, invoiceUpdateCols []string, invoiceHandleType int, ppList []*ContractPreRegister) (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 //} } productId := 0 if len(invoiceList) > 0 { productId = invoiceList[0].ServiceProductId } pp := &ContractPreRegister{} ppItem, e := pp.Fetch(ppList[0].PreRegisterId) if e != nil { err = e } //更新同一预登记记录下的productid otherInvoiceItem := ContractInvoice{ ServiceProductId: productId, } if ppList[0].InvoiceType == ContractInvoiceTypePreMake { otherInvoiceItem.ContractInvoiceId = ppItem.ArriveId if ppItem.ArriveId > 0 { //如果是开票类型,那么更新预登记里的预到款销售信息 otherInvoiceItem.SellerId = invoiceList[0].SellerId otherInvoiceItem.SellerName = invoiceList[0].SellerName otherInvoiceItem.SellerGroupId = invoiceList[0].SellerGroupId otherInvoiceItem.SellerGroupName = invoiceList[0].SellerGroupName otherInvoiceItem.SellerTeamId = invoiceList[0].SellerTeamId otherInvoiceItem.SellerTeamName = invoiceList[0].SellerTeamName } tx.Model(&otherInvoiceItem).Select([]string{"ServiceProductId","SellerId", "SellerName", "SellerGroupId","SellerGroupName","SellerTeamId","SellerTeamName"}).Updates(otherInvoiceItem) } else { otherInvoiceItem.ContractInvoiceId = ppItem.InvoiceId tx.Model(&otherInvoiceItem).Select([]string{"ServiceProductId"}).Updates(otherInvoiceItem) } //更新另一类型的invoice表数据 invoiceItem := ContractInvoice{ ContractRegisterId: item.ContractRegisterId, StartDate: item.StartDate, EndDate: item.EndDate, CurrencyUnit: item.CurrencyUnit, } tx.Model(&invoiceItem).Select([]string{"StartDate", "EndDate", "CurrencyUnit"}).Where("contract_register_id", item.ContractRegisterId).Updates(invoiceItem) // 开票到款操作类型: 0-无; 1-更新; 2-新增; if invoiceHandleType == 2 { for _, v := range invoiceList { if e := v.Create(); e != nil { err = e return } if len(ppList) > 0 { pp := &ContractPreRegister{ PreRegisterId: ppList[0].PreRegisterId, } ppUpdateCols := make([]string, 0) if v.InvoiceType == 3 { pp.InvoiceId = v.ContractInvoiceId ppUpdateCols = append(ppUpdateCols, "InvoiceId") } else { pp.ArriveId = v.ContractInvoiceId ppUpdateCols = append(ppUpdateCols, "ArriveId") } if e := pp.Update(ppUpdateCols); 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 } // UpdateSupplementContractPreRegister 更新补录合同预登记 func UpdateSupplementContractPreRegister(item *ContractRegister, serviceAmountList []*ContractServiceAmount, serviceDetail []*ContractServiceAndDetail) (err error) { tx := global.DEFAULT_MYSQL.Begin() defer func() { if err != nil { tx.Rollback() } else { tx.Commit() } }() for i := 0; i < len(serviceAmountList); i++ { // 合同服务 t := serviceAmountList[i] tmp := &ContractServiceAmount{ ContractRegisterId: item.ContractRegisterId, ProductId: t.ProductId, ServiceAmount: t.ServiceAmount, CurrencyUnit: t.CurrencyUnit, } if e := tmp.Create(); e != nil { err = e return } } // 删除原服务及详情信息 sql := `DELETE FROM contract_service 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 //} } return } type CheckContractDuplicateReq struct { CompanyName string `json:"company_name" form:"company_name" description:"客户名称"` StartDate string `json:"start_date" form:"start_date" description:"合同开始日期"` EndDate string `json:"end_date" form:"end_date" description:"合同结束日期"` Services []ContractServiceAddReq `json:"services" description:"服务套餐内容"` } func CheckContractDuplicate(condition string, pars []interface{}) (list []*ContractRegister,err error) { query := global.DEFAULT_MYSQL.Table("contract_register AS a"). Select("a.* "). Joins(" JOIN contract_service AS b ON a.contract_register_id = b.contract_register_id "). Where(condition, pars...). Group("a.contract_register_id") err = query.Find(&list).Error return } type CheckContractDuplicateResp struct { Exist int `json:"exist" description:"是否存在重复的合同:0不存在,1存在"` }