Pārlūkot izejas kodu

fix:计算预计回款时间

duxin 4 mēneši atpakaļ
vecāks
revīzija
d043c7178c

+ 1 - 0
internal/cmd/cmd.go

@@ -62,6 +62,7 @@ var (
 					orderGroup.POST("/uploadContractFile", controller.OrderUploadContractFile) //订单上传协议
 					orderGroup.POST("/upload", controller.OrderUpload)                         //订单协议归档
 					orderGroup.POST("/selfInvoice", controller.OrderSelfInvoice)               //订单自助开票
+					orderGroup.POST("/getWorkDay", controller.OrderGetWorkDay)                 //计算预计回款时间
 					//group.POST("/transferAccounts", controller.TransferAccounts)          //对公转行审核
 
 					//业绩相关

+ 31 - 0
internal/controller/orderGetWorkDay.go

@@ -0,0 +1,31 @@
+package controller
+
+import (
+	. "app.yhyue.com/moapp/jybase/api"
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/util/gconv"
+	"github.com/pkg/errors"
+	"jyOrderManager/internal/logic/order"
+	"jyOrderManager/internal/model"
+)
+
+// OrderGetWorkDay 计算预计回款时间
+func OrderGetWorkDay(r *ghttp.Request) {
+	rData, err := func() (interface{}, error) {
+		var param model.OrderGetWorkDayParams
+		err := gconv.Struct(r.GetBody(), &param)
+		if err != nil {
+			return nil, errors.Wrap(err, "数据校验异常")
+		}
+		list, err := order.GetWorkDay(r.Context(), param)
+		if err != nil {
+			return nil, errors.Wrap(err, "计算预计回款时间异常")
+		}
+		return list, nil
+	}()
+	if err != nil {
+		g.Log().Errorf(r.Context(), "计算预计回款时间异常 %v", err)
+	}
+	r.Response.WriteJson(NewResult(rData, err))
+}

+ 118 - 0
internal/logic/order/getWorkDay.go

@@ -0,0 +1,118 @@
+package order
+
+import (
+	"app.yhyue.com/moapp/jybase/date"
+	"context"
+	"encoding/json"
+	"fmt"
+	"io"
+	"jyOrderManager/internal/model"
+	"net/http"
+	"sync"
+	"time"
+)
+
+type (
+	holidaysManager struct {
+		holidayCache map[int]map[time.Time]bool
+		sync.Mutex
+	}
+)
+
+func (hm *holidaysManager) GetEndTime(currentDate time.Time, workDays int) (string, error) {
+	for workDays > 0 {
+		currentDate = currentDate.AddDate(0, 0, 1)
+		yMap := hm.getHolidaysByYear(currentDate.Year())
+		if yMap != nil && !yMap[currentDate] {
+			fmt.Println(currentDate.Format(date.Date_Short_Layout), "工作日")
+			workDays--
+		}
+	}
+	return currentDate.Format(date.Date_Short_Layout), nil
+}
+
+func (hm *holidaysManager) getHolidaysByYear(year int) map[time.Time]bool {
+	hm.Lock()
+	rData := hm.holidayCache[year]
+	hm.Unlock()
+	if len(rData) > 0 {
+		return rData
+	}
+	newData := requestHolidayApi(year)
+	if len(newData) > 0 {
+		//hm.Lock()
+		//defer hm.Unlock()
+		hm.holidayCache[year] = newData
+	}
+	return newData
+}
+
+func requestHolidayApi(year int) map[time.Time]bool {
+	client := http.Client{}
+	req, _ := http.NewRequest("GET", fmt.Sprintf("https://timor.tech/api/holiday/year/%d?type=Y&week=Y", year), nil)
+	req.Header.Add("Accept", "application/json")
+	req.Header.Add("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36")
+	for i := 0; i < 5; i++ {
+		holidayTime := func() map[time.Time]bool {
+			res, err := client.Do(req)
+			defer res.Body.Close()
+			if err != nil {
+				return nil
+			}
+
+			bytes, err := io.ReadAll(res.Body)
+			if err != nil {
+				return nil
+			}
+			type holidayApiRes struct {
+				Code    int `json:"code"`
+				Holiday map[string]struct {
+					Holiday bool   `json:"holiday"`
+					Name    string `json:"name"`
+					Wage    int    `json:"wage"`
+					Date    string `json:"date"`
+					Rest    int    `json:"rest"`
+				} `json:"holiday"`
+			}
+			hRes := &holidayApiRes{}
+			err = json.Unmarshal(bytes, hRes)
+			if err != nil {
+				return nil
+			}
+
+			rData := map[time.Time]bool{}
+			for _, s := range hRes.Holiday {
+				if s.Holiday {
+					t, err := time.Parse(date.Date_Short_Layout, s.Date)
+					if err != nil {
+						continue
+					}
+					rData[t] = true
+				}
+			}
+			return rData
+		}()
+		if len(holidayTime) > 0 {
+			return holidayTime
+		}
+	}
+	return nil
+}
+
+var hManager *holidaysManager
+
+func init() {
+	hManager = &holidaysManager{
+		holidayCache: map[int]map[time.Time]bool{},
+	}
+}
+func GetWorkDay(ctx context.Context, param model.OrderGetWorkDayParams) (interface{}, error) {
+	if param.WorkDayNum < 0 {
+		return nil, fmt.Errorf("请输入正确工作日数量")
+	}
+	t, err := time.Parse(date.Date_Short_Layout, param.InputTime)
+	if err != nil {
+		return nil, fmt.Errorf("开始时间格式异常")
+	}
+	return hManager.GetEndTime(t, param.WorkDayNum)
+}

+ 16 - 7
internal/model/orderParams.go

@@ -1,5 +1,7 @@
 package model
 
+import "time"
+
 type (
 	ProductCommonParam struct {
 		Id            int64  `json:"id"`                   //订单详情表id
@@ -198,20 +200,27 @@ type (
 		BuySubject string `json:"buySubject"` // 购买主体,  1 个人, 2公司
 		EntName    string `json:"entName"`    // 购买企业
 
-		ServiceType int `json:"serviceType" json:"serviceType"` //付费类型 购买 续费 升级 试用
+		ServiceType int `json:"serviceType"` //付费类型 购买 续费 升级 试用
 
 	}
 
 	UploadContract struct { //上传合同
-		Id              int    `form:"contractId"`
-		ContractFileUrl string `form:"contractFileUrl"`
-		OrderCode       string `form:"orderCode"`
+		Id              int    `json:"contractId"`
+		ContractFileUrl string `json:"contractFileUrl"`
+		OrderCode       string `json:"orderCode"`
 	}
 
 	TransferAccountsParams struct { //对公转账审核
-		OrderCode    string `form:"order_code"`   //订单编号
-		CourseStatus string `form:"courseStatus"` //审核状态
-		PayMoney     string `form:"pay_money"`    //实付金额
+		OrderCode    string `json:"order_code"`   //订单编号
+		CourseStatus string `json:"courseStatus"` //审核状态
+		PayMoney     string `json:"pay_money"`    //实付金额
+	}
+
+	OrderGetWorkDayParams struct {
+		InputTime  string    `json:"inputTime"`  //开始时间
+		WorkDayNum int       `json:"workDayNum"` //工作日
+		Start      time.Time `json:"start"`      //实付金额
+		End        time.Time `json:"end"`
 	}
 )