123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378 |
- 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
- }
|