ziwen 2 years ago
parent
commit
9838b33e72

+ 92 - 3
controller/contract/register.go

@@ -274,9 +274,98 @@ func (rg *RegisterController) Add(c *gin.Context) {
 
 	// 新增合同及套餐
 	if req.Supplement == 1 {
-		//TODO
-		//新增合同信息以及到款记录以及操作日志
-	}else {
+		//新增合同信息
+		if e = fms.CreateContractRegisterAndServicesAndPayMent(ob, serviceList); e != nil {
+			resp.FailMsg("操作失败", "新增合同及套餐失败, Err: "+e.Error(), c)
+			return
+		}
+		//新增到款信息
+		if ob.HasPayment == 1 {
+			resp.Fail("合同存在代付不允许添加开票/到款登记", c)
+			return
+		}
+
+		prePayOB := new(fms.ContractPrePayment)
+		ppItem, e := prePayOB.Fetch(req.PrePayId)
+		if e != nil {
+			if e == utils.ErrNoRow {
+				resp.Fail("预到款不存在或已被删除", c)
+				return
+			}
+			resp.FailMsg("获取预到款记录失败", "Err:"+e.Error(), c)
+			return
+		}
+		// 合同有效时长(计算付款方式)
+		dayDiff := ob.EndDate.Sub(ob.StartDate).Hours() / 24
+
+		// 获取销售分组信息
+		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]
+		}
+
+		v := &fms.ContractInvoice{
+			ContractRegisterId: ob.ContractRegisterId,
+			ContractCode:       ob.ContractCode,
+			Amount:             ppItem.Amount,
+			OriginAmount:       ppItem.OriginAmount,
+			CurrencyUnit:       ppItem.CurrencyUnit,
+			InvoiceType:        fms.ContractInvoiceTypePrePay,
+			InvoiceDate:        ppItem.CreateTime,
+			AdminId:            int(adminInfo.AdminId),
+			AdminName:          adminInfo.RealName,
+			Remark:             ppItem.Remark,
+		}
+		v.Set()
+		// 到款登记-付款方式
+		v.PayType = fmsService.CalculateContractPaymentType(ppItem.Amount, ob.ContractAmount, dayDiff)
+
+		// 新增的记录
+		logList := make([]*fms.ContractRegisterLog, 0)
+		opData := ""
+		opDataByte, e := json.Marshal(req)
+		if e != nil {
+			return
+		}
+		opData = string(opDataByte)
+		opType := fms.ContractInvoiceTypePrePay
+		newAmount := decimal.NewFromFloat(0).Round(2)
+		a := decimal.NewFromFloat(v.Amount).Round(2)
+		newAmount = newAmount.Add(a)
+		ia, _ := newAmount.Round(2).Float64()
+		logList = append(logList, &fms.ContractRegisterLog{
+			ContractRegisterId: ob.ContractRegisterId,
+			AdminId:            int(adminInfo.AdminId),
+			AdminName:          adminInfo.RealName,
+			OpData:             opData,
+			OpType:             opType,
+			CreateTime:         nowTime,
+			AmountRemark:       fmt.Sprint("新增", fms.ContractInvoiceKeyNameMap[opType], "金额", ia, "元"),
+		})
+
+		// 删除并新增登记
+		ob := new(fms.ContractInvoice)
+		if e := v.Create(); e != nil {
+			resp.FailData("日期格式有误", "Err:"+e.Error(), c)
+			return
+		}
+
+		// 开票到款汇总
+		go fmsService.SummaryInvoicePaymentByContractRegisterId(ob.ContractRegisterId)
+
+		// 操作日志
+		go func() {
+			logOB := new(fms.ContractRegisterLog)
+			if e := logOB.AddInBatches(logList); e != nil {
+				return
+			}
+		}()
+	} else {
 		if e = fms.CreateContractRegisterAndServices(ob, serviceList); e != nil {
 			resp.FailMsg("操作失败", "新增合同及套餐失败, Err: "+e.Error(), c)
 			return

+ 1 - 1
controller/statistic.go

@@ -85,7 +85,7 @@ func getIncomeList(ch chan models.IncomeChartResp) (incomeChart models.IncomeCha
 				return
 			}
 			contractMoneySlice = append(contractMoneySlice, item.ContractMoney)
-			ArrivalMoneySlice = append(contractMoneySlice, item.ArrivalMoney)
+			ArrivalMoneySlice = append(ArrivalMoneySlice, item.ArrivalMoney)
 		}
 		incomeChart.Title = "开票到款统计图"
 		incomeChart.Date = dateSlice

+ 2 - 0
models/fms/constants.go

@@ -24,10 +24,12 @@ const (
 	ContractRegisterOpTypeStatus  = 4 // 修改合同状态
 	ContractRegisterOpTypeDel     = 5 // 删除合同登记
 	ContractRegisterOpTypeEdit    = 6 // 合规编辑
+	ContractPrePayOpTypeEdit      = 7 // 到款预登记
 
 	// 合同登记开票类型
 	ContractInvoiceTypeMake = 1 // 开票登记
 	ContractInvoiceTypePay  = 2 // 到款登记
+	ContractInvoiceTypePrePay  = 3 // 到款预登记
 
 	// 到款登记付款方式
 	ContractPaymentPayTypeYear     = 1 // 年付

+ 50 - 0
models/fms/contract_register.go

@@ -177,6 +177,7 @@ type ContractRegisterAddReq struct {
 	HasPayment         int                     `json:"has_payment" description:"是否有代付: 0-无; 1-有"`
 	NewCompany         int                     `json:"new_company" description:"是否为新客户: 0-否; 1-是"`
 	Supplement         int                     `json:"supplement" description:"是否为补录合同: 0-否; 1-是"`
+	PrePayId           int                     `json:"pre_pay_id" description:"预到款信息ID"`
 	Services           []ContractServiceAddReq `json:"services" description:"服务套餐内容"`
 }
 
@@ -426,3 +427,52 @@ func CreateImportContractRegister(item *ContractRegister, serviceList []*Contrac
 	}
 	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:          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.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
+		//}
+	}
+
+	sql := `UPDATE contract_pre_payment SET contract_register_id = ?, contract_code = ?, modify_time = NOW()`
+	tx.Exec(sql, item.ContractRegisterId, item.ContractCode)
+	return
+}