package fms import ( "errors" "fmt" "github.com/shopspring/decimal" "hongze/fms_api/models/crm" "hongze/fms_api/models/fms" "hongze/fms_api/services/alarm_msg" crmService "hongze/fms_api/services/crm" "hongze/fms_api/services/resource" "hongze/fms_api/utils" "os" "regexp" "strings" "time" ) // CheckContractRegisterAmount 校验合同登记金额-判断是否需要更新合同登记状态 func CheckContractRegisterAmount(registerId int) { var err error defer func() { if err != nil { alarm_msg.SendAlarmMsg("校验合同登记金额失败, ErrMsg: "+err.Error(), 3) } }() // 获取合同登记信息 cr := new(fms.ContractRegister) item, e := cr.Fetch(registerId) if e != nil { err = errors.New("获取合同登记信息失败, Err: " + e.Error()) return } amount := decimal.NewFromFloat(item.ContractAmount).Round(2) // 获取开票/到款信息 invoiceCond := `contract_register_id = ?` invoicePars := make([]interface{}, 0) invoicePars = append(invoicePars, registerId) ci := new(fms.ContractInvoice) invoiceList, e := ci.List(invoiceCond, invoicePars, "") if e != nil { err = errors.New("获取开票到款信息失败, Err: " + e.Error()) return } invoiceAmount := decimal.NewFromFloat(0).Round(2) paymentAmount := decimal.NewFromFloat(0).Round(2) for i := range invoiceList { a := decimal.NewFromFloat(invoiceList[i].OriginAmount).Round(2) if invoiceList[i].InvoiceType == fms.ContractInvoiceTypeMake { invoiceAmount = invoiceAmount.Add(a) } if invoiceList[i].InvoiceType == fms.ContractInvoiceTypePay { paymentAmount = paymentAmount.Add(a) } } status := fms.ContractRegisterStatusIng // 以下情况更新合同登记状态为已完成 // 1.合同存在代付; 2.合同状态为已签回且合同金额=开票金额=到款金额; 3合同状态为已终止 if item.HasPayment == 1 || (amount.Equal(invoiceAmount) && invoiceAmount.Equal(paymentAmount) && item.ContractStatus == fms.ContractStatusCheckedBack) || item.ContractStatus == fms.ContractStatusEnd { status = fms.ContractRegisterStatusComplete } updateCols := []string{"InvoicedAmount", "PaymentAmount", "RegisterStatus", "ModifyTime"} ia, _ := invoiceAmount.Round(2).Float64() pa, _ := paymentAmount.Round(2).Float64() item.InvoicedAmount = ia item.PaymentAmount = pa item.RegisterStatus = status item.ModifyTime = time.Now().Local() if e = item.Update(updateCols); e != nil { err = errors.New("更新合同登记金额及状态失败, Err: " + e.Error()) return } return } // HandleContractServiceAndDetail 根据请求数据获取套餐服务详情信息 func HandleContractServiceAndDetail(productId int, serviceList []fms.ContractServiceAddReq, base642Image bool) (serviceDetailList []*fms.ContractServiceAndDetail, err error) { serviceDetailList = make([]*fms.ContractServiceAndDetail, 0) if len(serviceList) < 0 { err = errors.New("请至少选择一种套餐") return } for i := 0; i < len(serviceList); i++ { item := serviceList[i] //detail := item.Detail // //detailList := make([]*fms.ContractServiceDetail, 0) //if len(detail) > 0 { // for j := 0; j < len(detail); j++ { // detailItem := detail[j] // cellMap := make(map[string]string) // for k := 0; k < len(detailItem); k++ { // key := fmt.Sprint("cell_", k+1) // v, e := json.Marshal(detailItem[k]) // if e != nil { // err = errors.New(fmt.Sprint("json转换失败:", e)) // return // } // cellMap[key] = string(v) // } // contractServiceDetail := &fms.ContractServiceDetail{ // Col1: func(cellMap map[string]string) string { // v, ok := cellMap["cell_1"] // if ok { // return v // } else { // return "" // } // }(cellMap), // Col2: func(cellMap map[string]string) string { // v, ok := cellMap["cell_2"] // if ok { // return v // } else { // return "" // } // }(cellMap), // Col3: func(cellMap map[string]string) string { // v, ok := cellMap["cell_3"] // if ok { // return v // } else { // return "" // } // }(cellMap), // Col4: func(cellMap map[string]string) string { // v, ok := cellMap["cell_4"] // if ok { // return v // } else { // return "" // } // }(cellMap), // Col5: func(cellMap map[string]string) string { // v, ok := cellMap["cell_5"] // if ok { // return v // } else { // return "" // } // }(cellMap), // Col6: func(cellMap map[string]string) string { // v, ok := cellMap["cell_6"] // if ok { // return v // } else { // return "" // } // }(cellMap), // Col7: func(cellMap map[string]string) string { // v, ok := cellMap["cell_7"] // if ok { // return v // } else { // return "" // } // }(cellMap), // ServiceTemplateId: item.ServiceTemplateId, // CreateTime: time.Now(), // } // detailList = append(detailList, contractServiceDetail) // } //} hasDetail := "否" //if len(detailList) > 0 { // hasDetail = "是" //} //// 报价单图片地址 //newValue := item.Value //if base642Image { // b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, newValue) // if b { // imageUrl, e := UploadImageBase64(newValue) // if e != nil { // err = errors.New(fmt.Sprint("base64图片上传失败:", e)) // return // } // newValue = imageUrl // } //} // 合同模板 serviceTemp, e := fms.GetContractServiceTemplateById(item.ServiceTemplateId) if e != nil { err = errors.New("找不到该模板") return } serviceDetail := &fms.ContractServiceAndDetail{ ServiceTemplateId: item.ServiceTemplateId, Title: item.Title, Value: item.Value, ProductId: productId, HasDetail: hasDetail, TableValue: serviceTemp.TableValue, ChartPermissionId: serviceTemp.ChartPermissionId, ChartPermissionIds: item.ChartPermissionIds, //Detail: detailList, } serviceDetailList = append(serviceDetailList, serviceDetail) } return } // GetContractServiceAndDetail 根据合同登记ID获取服务详情 func GetContractServiceAndDetail(contractRegisterId int) (serviceList []*fms.ContractServiceAndDetail, err error) { list, e := fms.GetContractServiceAndDetailList(contractRegisterId) if e != nil { err = errors.New(fmt.Sprint("查找合同服务异常", e)) return } serviceList = list //newLen := len(serviceList) //for i := 0; newLen > i; i++ { // if serviceList[i].HasDetail == "是" { // detail, e := fms.GetContractServiceDetailByServiceId(serviceList[i].ContractServiceId) // if e != nil { // err = errors.New(fmt.Sprint("查找合同服务详情异常", e)) // return // } // serviceList[i].Detail = detail // } //} return } // UploadImageBase64 将base64的图片上传至oss func UploadImageBase64(base64Str string) (resourceUrl string, err error) { ext := ".png" uploadDir := "./static" randStr := utils.GetRandStringNoSpecialChar(28) fileName := randStr + ext fpath := uploadDir + "/" + fileName b, _ := regexp.MatchString(`^data:\s*image\/(\w+);base64,`, base64Str) if !b { err = errors.New("图片格式不正确") return } re, _ := regexp.Compile(`^data:\s*image\/(\w+);base64,`) base64Str = re.ReplaceAllString(base64Str, "") base64Str = strings.Replace(base64Str, " ", "", -1) base64Str = strings.Replace(base64Str, " ", "", -1) err = utils.SaveBase64ToFile(base64Str, fpath) if err != nil { return } defer os.Remove(fpath) savePath := utils.OssUploadImgDir + time.Now().Format("200601/20060102/") savePath += fileName // 上传到阿里云 err = resource.UploadVideoAliyun(fileName, fpath, savePath) if err != nil { return } resourceUrl = utils.OssHost + savePath return } // FixContractInvoiceSellerInfo 修复开票登记销售相关信息(一次性) func FixContractInvoiceSellerInfo() { sellerList, e := crmService.GetSellerDepartmentListWithGroupAndTeam() if e != nil { fmt.Println("获取销售列表失败, Err: " + e.Error()) return } sellerMap := make(map[int]*crm.SellerAdminWithGroupTeam) for i := range sellerList { sellerMap[sellerList[i].SellerId] = sellerList[i] } registerCond := `` registerPars := make([]interface{}, 0) registerOB := new(fms.ContractRegister) registerList, e := registerOB.List(registerCond, registerPars) if e != nil { fmt.Println("获取合同登记列表失败, Err: " + e.Error()) return } invUpCols := []string{"SellerId", "SellerName", "SellerGroupId", "SellerGroupName", "SellerTeamId", "SellerTeamName"} fmt.Println("start 修复") for i := range registerList { registerId := registerList[i].ContractRegisterId sellerId := registerList[i].SellerId sellerItem := sellerMap[sellerId] if sellerItem == nil { fmt.Printf("ID-%d 无销售信息\n", registerId) continue } invOB := new(fms.ContractInvoice) invCond := `invoice_type = 1 AND contract_register_id = ?` invPars := make([]interface{}, 0) invPars = append(invPars, registerId) invList, e := invOB.List(invCond, invPars, "") if e != nil { fmt.Println("获取开票登记列表失败, Err: " + e.Error()) return } for _, v := range invList { v.SellerId = sellerItem.SellerId v.SellerName = sellerItem.SellerName v.SellerGroupId = sellerItem.GroupId v.SellerGroupName = sellerItem.GroupName v.SellerTeamId = sellerItem.TeamId v.SellerTeamName = sellerItem.TeamName if e = v.Update(invUpCols); e != nil { fmt.Println("更新开票登记失败, Err: " + e.Error()) return } fmt.Printf("ID-%d 修复成功\n", v.ContractInvoiceId) } } fmt.Println("end 修复") return } // FixContractInvoicePaymentType 修复历史到款登记付款方式(一次性) func FixContractInvoicePaymentType() { registerCond := `` registerPars := make([]interface{}, 0) registerOB := new(fms.ContractRegister) registerList, e := registerOB.List(registerCond, registerPars) if e != nil { fmt.Println("获取合同登记列表失败, Err: " + e.Error()) return } invUpCols := []string{"PayType"} fmt.Println("start 修复") for i := range registerList { registerId := registerList[i].ContractRegisterId invOB := new(fms.ContractInvoice) invCond := `invoice_type = 2 AND contract_register_id = ?` invPars := make([]interface{}, 0) invPars = append(invPars, registerId) invList, e := invOB.List(invCond, invPars, "") if e != nil { fmt.Println("获取到款登记列表失败, Err: " + e.Error()) return } dayDiff := registerList[i].EndDate.Sub(registerList[i].StartDate).Hours() / 24 for _, v := range invList { v.PayType = CalculateContractPaymentType(v.Amount, registerList[i].ContractAmount, dayDiff) if e = v.Update(invUpCols); e != nil { fmt.Println("更新到款登记付款方式失败, Err: " + e.Error()) return } fmt.Printf("ID-%d 修复成功\n", v.ContractInvoiceId) } } fmt.Println("end 修复") return } // FixContractSummaryData 修复开票到款汇总数据(一次性) func FixContractSummaryData() { registerCond := `` registerPars := make([]interface{}, 0) registerOB := new(fms.ContractRegister) registerList, e := registerOB.List(registerCond, registerPars) if e != nil { fmt.Println("获取合同登记列表失败, Err: " + e.Error()) return } fmt.Println("start 修复") for i := range registerList { fmt.Printf("正在修复-%d", registerList[i].ContractRegisterId) SummaryInvoicePaymentByContractRegisterId(registerList[i].ContractRegisterId) } fmt.Println("end 修复") return }