ziwen 2 年之前
父節點
當前提交
1cab82ee75
共有 4 個文件被更改,包括 346 次插入0 次删除
  1. 244 0
      controller/contract/pre_register.go
  2. 24 0
      models/fms/contract_pre_payment.go
  3. 77 0
      models/fms/contract_register.go
  4. 1 0
      routers/contract.go

+ 244 - 0
controller/contract/pre_register.go

@@ -800,3 +800,247 @@ func (rg *PreRegisterController) Detail(c *gin.Context) {
 
 	resp.OkData("获取成功", respItem, c)
 }
+
+// Save
+// @Title 预登记保存
+// @Description 预登记保存
+// @Param	request  body  fms.PrepayAddReq  true  "type json string"
+// @Success 200 string "操作成功"
+// @router /contract/pre_register/save [post]
+func (rg *PreRegisterController) Save(c *gin.Context) {
+	req := new(fms.PreRegisterSaveReq)
+	err := c.ShouldBind(&req)
+	if err != nil {
+		errs, ok := err.(validator.ValidationErrors)
+		if !ok {
+			resp.FailData("参数解析失败", "Err:"+err.Error(), c)
+			return
+		}
+		resp.FailData("参数解析失败", errs.Translate(global.Trans), c)
+		return
+	}
+	claims, _ := c.Get("adminInfo")
+	adminInfo := claims.(*system.SysAdmin)
+
+	// 日期校验
+	var startDate, endDate time.Time
+	if req.StartDate != "" && req.EndDate != "" {
+		startDate, err = time.ParseInLocation(utils.FormatDate, req.StartDate, time.Local)
+		if err != nil {
+			resp.FailMsg("约定开始日期格式有误", "合同开始日期格式有误, Err: "+err.Error(), c)
+			return
+		}
+		endDate, err = time.ParseInLocation(utils.FormatDate, req.EndDate, time.Local)
+		if err != nil {
+			resp.FailMsg("约定结束日期格式有误", "合同结束日期格式有误, Err: "+err.Error(), c)
+			return
+		}
+	}
+
+	// 获取销售分组信息
+	sellerList, e := crmService.GetSellerDepartmentListWithGroupAndTeam()
+	if e != nil {
+		resp.FailData("获取销售失败", "Err:"+e.Error(), c)
+		return
+	}
+	sellerMap := make(map[int]*crm.SellerAdminWithGroupTeam)
+	for i := range sellerList {
+		sellerMap[sellerList[i].SellerId] = sellerList[i]
+	}
+
+	admin := new(crm.Admin)
+	sellerIds := strings.Split(req.SellerIds, ",")
+	if len(sellerIds) > 2 {
+		resp.Fail("最多只能选择两个销售", c)
+		return
+	}
+
+	var sellers []*crm.Admin
+	var pars []interface{}
+	cond := ``
+	if len(sellerIds) > 0 {
+		cond = ` admin_id in (?) `
+		pars = append(pars, sellerIds)
+		sellers, e = admin.List(cond, pars)
+		if e != nil {
+			resp.FailMsg("获取销售信息失败", "获取销售信息失败, Err: "+e.Error(), c)
+			return
+		}
+	}
+	updateCols := []string{"CompanyName", "ProductIds", "StartDate", "EndDate", "ModifyTime"}
+
+	//更新合同
+	ob := new(fms.ContractRegister)
+	//ob.ContractCode = req.ContractCode
+	ob.ContractRegisterId = req.ContractRegisterId
+	ob.CompanyName = req.CompanyName
+	ob.ProductIds = req.ProductIds
+	ob.StartDate = startDate
+	ob.EndDate = endDate
+	ob.ModifyTime = time.Now()
+	if req.RegisterType == fms.ContractInvoiceTypePreMake {
+		//sellerItem := sellerMap[r.SellerId]
+		//if sellerItem == nil {
+		//	resp.Fail("销售信息异常", c)
+		//	return
+		//}
+		for _, v := range sellers {
+			if v.DepartmentId == crm.SellerDepartmentId {
+				ob.SellerId = v.AdminId
+				ob.SellerName = v.AdminName
+				updateCols = append(updateCols, "SellerId", "SellerName")
+			} else if v.DepartmentId == crm.RaiSellerDepartmentId {
+				ob.RaiSellerId = v.AdminId
+				ob.RaiSellerName = v.AdminName
+				updateCols = append(updateCols, "RaiSellerId", "RaiSellerName")
+			}
+		}
+	}
+
+	// 套餐信息
+	serviceAmountMap := make(map[int]float64)
+	serviceList, e := fmsService.HandleContractServiceAndDetail(req.Services, true, serviceAmountMap)
+	if e != nil {
+		resp.FailMsg("操作失败", "获取合同套餐详情失败, Err: "+e.Error(), c)
+		return
+	}
+	invoiceUpdateCols := make([]string, 0)
+	invoiceHandleType := 0
+	invoiceList := make([]*fms.ContractInvoice, 0)
+	for _, r := range req.List {
+		// 货币及汇率
+		rateList, e := fmsService.GetTodayCurrencyRateList()
+		if e != nil {
+			resp.FailMsg("操作失败", "获取今日货币汇率失败, Err: "+e.Error(), c)
+			return
+		}
+		var rate float64
+		for i := range rateList {
+			if r.CurrencyUnit == rateList[i].Code {
+				rate = rateList[i].RMBRate
+				break
+			}
+		}
+		if rate <= 0 {
+			resp.FailMsg("操作失败", "货币汇率信息有误", c)
+			return
+		}
+
+		registerDate, e := time.Parse(utils.FormatDate, r.RegisterDate)
+		if e != nil {
+			resp.FailMsg("日期转换失败", "日期转换失败, Err: "+e.Error(), c)
+			return
+		}
+
+		v := &fms.ContractInvoice{
+			ContractInvoiceId:  r.InvoiceId,
+			ContractRegisterId: ob.ContractRegisterId,
+			OriginAmount:       r.Amount,
+			CurrencyUnit:       r.CurrencyUnit,
+			InvoiceType:        req.RegisterType,
+			InvoiceDate:        registerDate,
+			AdminId:            int(adminInfo.AdminId),
+			AdminName:          adminInfo.AdminName,
+			Remark:             r.Remark,
+			ServiceProductId:   r.ServiceProductId,
+			IsPrePay:           1,
+			StartDate:          startDate,
+			EndDate:            endDate,
+			TimeBase:           base.TimeBase{},
+		}
+		v.TimeBase.ModifyTime = time.Now()
+
+		a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", v.OriginAmount/rate), 64)
+		v.Amount = a
+
+		if req.RegisterType == fms.ContractInvoiceTypePreMake {
+			sellerItem := sellerMap[r.SellerId]
+			if sellerItem == nil {
+				resp.Fail("销售信息异常", c)
+				return
+			}
+
+			v.SellerId = sellerItem.SellerId
+			v.SellerName = sellerItem.SellerName
+			v.SellerGroupId = sellerItem.GroupId
+			v.SellerGroupName = sellerItem.GroupName
+			v.SellerTeamId = sellerItem.TeamId
+			v.SellerTeamName = sellerItem.TeamName
+			invoiceUpdateCols = append(invoiceUpdateCols,"SellerId","SellerName","SellerGroupId",
+				"SellerGroupName","SellerTeamId","SellerTeamName")
+		}
+
+		// 新增开票到款记录
+		if v.ContractInvoiceId != 0 {
+			//更新
+			invoiceHandleType = 1
+			invoiceUpdateCols = append(invoiceUpdateCols, "OriginAmount","CurrencyUnit",
+				"InvoiceDate","Remark","ServiceProductId","StartDate","EndDate","ModifyTime")
+		}else {
+			//新增
+			invoiceHandleType = 2
+		}
+		invoiceList = append(invoiceList, v)
+
+		//预登记列表
+		pp := &fms.ContractPreRegister{
+			ContractRegisterId: ob.ContractRegisterId,
+			CompanyName:        req.CompanyName,
+			InvoiceType:        req.RegisterType,
+			InvoiceDate:        registerDate,
+			AdminId:            int(adminInfo.AdminId),
+			AdminName:          adminInfo.AdminName,
+			Remark:             r.Remark,
+			ServiceProductId:   r.ServiceProductId,
+			IsPrePay:           1,
+			StartDate:          startDate,
+			EndDate:            endDate,
+			TimeBase:           base.TimeBase{},
+		}
+		pp.Set()
+		if pp.InvoiceType == fms.ContractInvoiceTypePreMake {
+			//开票走开票字段
+			pp.InvoiceId = v.ContractInvoiceId
+			pp.InvoiceDate = registerDate
+			pp.OriginAmount = r.Amount
+			pp.CurrencyUnit = r.CurrencyUnit
+			a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", pp.OriginAmount/rate), 64)
+			pp.Amount = a
+
+			sellerItem := sellerMap[r.SellerId]
+			if sellerItem == nil {
+				resp.Fail("销售信息异常", c)
+				return
+			}
+
+			pp.SellerId = sellerItem.SellerId
+			pp.SellerName = sellerItem.SellerName
+			pp.SellerGroupId = sellerItem.GroupId
+			pp.SellerGroupName = sellerItem.GroupName
+			pp.SellerTeamId = sellerItem.TeamId
+			pp.SellerTeamName = sellerItem.TeamName
+		} else {
+			//到款
+			pp.ArriveId = v.ContractInvoiceId
+			pp.ArriveDate = registerDate
+			pp.ArriveOriginAmount = r.Amount
+			pp.ArriveCurrencyUnit = r.CurrencyUnit
+			a, _ := strconv.ParseFloat(fmt.Sprintf("%.2f", pp.ArriveOriginAmount/rate), 64)
+			pp.ArriveAmount = a
+		}
+
+		// 新增开票到款记录
+		if e = pp.Create(); e != nil {
+			resp.FailMsg("操作失败", "新增预登记失败, Err: "+e.Error(), c)
+			return
+		}
+	}
+	if e = fms.UpdateContractRegisterPre(ob, updateCols, serviceList,invoiceList, invoiceUpdateCols, invoiceHandleType); e != nil {
+		resp.FailMsg("操作失败", "新增合同及套餐失败, Err: "+e.Error(), c)
+		return
+	}
+	// 开票到款汇总
+	go fmsService.SummaryInvoicePaymentByContractRegisterId(ob.ContractRegisterId)
+
+	resp.Ok("操作成功", c)
+}

+ 24 - 0
models/fms/contract_pre_payment.go

@@ -181,3 +181,27 @@ type PreRegisterDelReq struct {
 	ArriveId           int `json:"arrive_id" description:"到款ID"`
 	PreRegisterId      int `json:"pre_register_id" description:"预登记ID"`
 }
+
+type PreRegisterSaveReqItem struct {
+	InvoiceId        int     `json:"invoice_id" description:"开票ID"`
+	Amount           float64 `json:"amount" binding:"required" description:"到款金额"`
+	CurrencyUnit     string  `json:"currency_unit" binding:"required" description:"货币单位"`
+	Remark           string  `json:"remark" description:"备注信息"`
+	RegisterDate     string  `json:"register_date" description:"到款或开票日期"`
+	SellerId         int     `gorm:"column:seller_id" json:"seller_id" description:"销售ID"`
+	SellerName       string  `gorm:"column:seller_name" json:"seller_name" description:"销售名称"`
+	ServiceProductId int     `gorm:"column:service_product_id" json:"service_product_id" description:"套餐类型:1ficc套餐,2权益套餐"`
+}
+
+// PreRegisterSaveReq 预登记保存请求体
+type PreRegisterSaveReq struct {
+	ContractRegisterId int                      `json:"contract_register_id" binding:"required,gte=1" description:"登记ID"`
+	CompanyName        string                   `json:"company_name" binding:"required" description:"客户名称"`
+	StartDate          string                   `json:"start_date" binding:"required" description:"约定开始日期"`
+	EndDate            string                   `json:"end_date" binding:"required" description:"约定结束日期"`
+	RegisterType       int                      `json:"register_type" description:"预登记类型 3-开票预登记 4-到款预登记"`
+	ProductIds         string                   `gorm:"column:product_ids" json:"product_ids" description:"产品ID:1-FICC; 2-权益, 如果两者都有,则用英文逗号拼接"`
+	SellerIds          string                   `json:"seller_ids" description:"CRM系统-销售ID"`
+	List               []PreRegisterSaveReqItem `json:"list" binding:"required" description:"预登记列表"`
+	Services           []ContractServiceAddReq  `json:"services" description:"服务套餐内容"`
+}

+ 77 - 0
models/fms/contract_register.go

@@ -612,3 +612,80 @@ func UpdateContractPreRegister(item *ContractRegister, updateCols []string, serv
 
 	return
 }
+
+// UpdateContractRegister 预登记保存和更新
+func UpdateContractRegisterPre(item *ContractRegister, updateCols []string, serviceDetail []*ContractServiceAndDetail,
+	invoiceList []*ContractInvoice, invoiceUpdateCols []string, invoiceHandleType int) (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
+		//}
+	}
+
+	// 开票到款操作类型: 0-无; 1-更新; 2-新增;
+	if invoiceHandleType == 2 {
+		for _, v := range invoiceList {
+			if e := v.Create(); 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
+}

+ 1 - 0
routers/contract.go

@@ -44,4 +44,5 @@ func InitContract(rg *gin.RouterGroup) {
 	preRegisterGroup.POST("edit", preRegister.Edit)
 	preRegisterGroup.POST("del", preRegister.Del)
 	preRegisterGroup.POST("detail", preRegister.Detail)
+	preRegisterGroup.POST("save", preRegister.Save)
 }