Browse Source

ETA商家优化续约

hsun 1 year ago
parent
commit
5c415bfc39

+ 31 - 47
controllers/eta_business/eta_business.go

@@ -429,6 +429,7 @@ func (this *EtaBusinessController) Add() {
 	contractItem := new(eta_business.EtaBusinessContract)
 	contractItem.SigningTime = signTime
 	contractItem.ExpiredTime = expiredTime
+	contractItem.IsFirst = 1
 	contractItem.CreateTime = now
 	contractItem.ModifyTime = now
 	if e = eta_business.CreateEtaBusinessAndContract(businessItem, contractItem); e != nil {
@@ -579,7 +580,7 @@ func (this *EtaBusinessController) Edit() {
 
 // Signing
 // @Title 签约续约
-// @Description 签约续约
+// @Description 签约续约(业务上仅用于续约, 兼容首次签约)
 // @Param	request	body eta_business.EtaBusinessSigningReq true "type json string"
 // @Success 200 Ret=200 操作成功
 // @router /signing [post]
@@ -660,6 +661,23 @@ func (this *EtaBusinessController) Signing() {
 		return
 	}
 
+	// 续约不可早于当前生效合约的到期时间
+	if business.ContractId > 0 {
+		{
+			ob := new(eta_business.EtaBusinessContract)
+			item, e := ob.GetItemById(business.ContractId)
+			if e != nil {
+				br.Msg = "操作失败"
+				br.ErrMsg = "获取商家当前合同失败, Err: " + e.Error()
+				return
+			}
+			if !signTime.After(item.ExpiredTime) {
+				br.Msg = "签约时间不可早于当前合同的到期时间"
+				return
+			}
+		}
+	}
+
 	// 获取历史签约, 签约日期不可交叠
 	contract := new(eta_business.EtaBusinessContract)
 	cond := fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessContractColumns.EtaBusinessId)
@@ -672,22 +690,11 @@ func (this *EtaBusinessController) Signing() {
 		return
 	}
 
-	// 本次签约是否属于终止期
-	now := time.Now().Local()
-	isTerminate := true
-	if now.Equal(signTime) || now.Equal(expiredTime) {
-		isTerminate = false
-	}
-	if now.After(signTime) && now.Before(expiredTime) {
-		isTerminate = false
-	}
-
-	// 是否为首次签约
-	isFirst := true
+	// 校验签约时间是否重叠
+	isFirst := true // 是否为首次签约
 	if len(contracts) > 0 {
 		isFirst = false
 		for _, c := range contracts {
-			// 校验签约时间是否重叠
 			pass := false
 			if expiredTime.Before(c.SigningTime) {
 				pass = true
@@ -699,37 +706,6 @@ func (this *EtaBusinessController) Signing() {
 				br.Msg = "签约时间在存续期内, 请检查"
 				return
 			}
-			// 上面判断若为终止, 则判断是否在历史签约存续期间
-			if !isTerminate {
-				continue
-			}
-			if now.Equal(c.SigningTime) || now.Equal(c.ExpiredTime) {
-				isTerminate = false
-				continue
-			}
-			if now.After(c.SigningTime) && now.Before(c.ExpiredTime) {
-				isTerminate = false
-				continue
-			}
-		}
-	}
-
-	// 是否更新签约状态
-	status := eta_business.EtaBusinessSigningStatusContinue
-	if isTerminate {
-		status = eta_business.EtaBusinessSigningStatusTerminate
-	}
-	if !isTerminate && isFirst {
-		status = eta_business.EtaBusinessSigningStatusFirst
-	}
-	if business.SigningStatus != status {
-		business.SigningStatus = status
-		business.ModifyTime = now
-		cols := []string{"SigningStatus", "ModifyTime"}
-		if e = business.Update(cols); e != nil {
-			br.Msg = "操作失败"
-			br.ErrMsg = "更新签约状态失败, Err: " + e.Error()
-			return
 		}
 	}
 
@@ -737,14 +713,22 @@ func (this *EtaBusinessController) Signing() {
 	contract.EtaBusinessId = req.EtaBusinessId
 	contract.SigningTime = signTime
 	contract.ExpiredTime = expiredTime
-	contract.CreateTime = now
-	contract.ModifyTime = now
+	contract.CreateTime = time.Now().Local()
+	contract.ModifyTime = time.Now().Local()
+	if isFirst {
+		contract.IsFirst = 1
+	}
 	if e = contract.Create(); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增签约失败, Err: " + e.Error()
 		return
 	}
 
+	// 签约后续操作
+	go func() {
+		_ = etaBusinessService.UpdateEtaBusinessAfterSigning(business.EtaBusinessId)
+	}()
+
 	// 续约操作日志
 	if !isFirst {
 		go func() {

+ 10 - 1
models/eta_business/eta_business.go

@@ -34,6 +34,7 @@ type EtaBusiness struct {
 	UserMax          int       `description:"用户上限"`
 	SigningStatus    int       `description:"签约状态:1-首次签约;2-续约中;3-已终止"`
 	Enable           int       `description:"状态:0-禁用;1-启用"`
+	ContractId       int       `description:"当前合约ID"`
 	SigningTime      time.Time `description:"当前合约的签约时间"`
 	ExpiredTime      time.Time `description:"当前合约的到期时间"`
 	CreateTime       time.Time `description:"创建时间"`
@@ -67,6 +68,7 @@ var EtaBusinessColumns = struct {
 	UserMax          string
 	SigningStatus    string
 	Enable           string
+	ContractId       string
 	SigningTime      string
 	ExpiredTime      string
 	CreateTime       string
@@ -90,6 +92,7 @@ var EtaBusinessColumns = struct {
 	UserMax:          "user_max",
 	SigningStatus:    "signing_status",
 	Enable:           "enable",
+	ContractId:       "contract_id",
 	SigningTime:      "signing_time",
 	ExpiredTime:      "expired_time",
 	CreateTime:       "create_time",
@@ -209,10 +212,16 @@ func CreateEtaBusinessAndContract(businessItem *EtaBusiness, contractItem *EtaBu
 
 	// 签约
 	contractItem.EtaBusinessId = businessItem.EtaBusinessId
-	_, e = tx.Insert(contractItem)
+	contractId, e := tx.Insert(contractItem)
 	if e != nil {
 		err = fmt.Errorf("contract insert err: %s", e.Error())
+		return
 	}
+
+	// 更新商家当前签约ID
+	businessItem.ContractId = int(contractId)
+	cols := []string{"ContractId"}
+	_, err = tx.Update(businessItem, cols...)
 	return
 }
 

+ 3 - 0
models/eta_business/eta_business_contract.go

@@ -13,6 +13,7 @@ type EtaBusinessContract struct {
 	EtaBusinessId         int       `description:"ETA商家ID"`
 	SigningTime           time.Time `description:"签约时间"`
 	ExpiredTime           time.Time `description:"到期时间"`
+	IsFirst               int       `description:"是否为首份签约"`
 	CreateTime            time.Time `description:"创建时间"`
 	ModifyTime            time.Time `description:"更新时间"`
 }
@@ -30,6 +31,7 @@ var EtaBusinessContractColumns = struct {
 	EtaBusinessId         string
 	SigningTime           string
 	ExpiredTime           string
+	IsFirst               string
 	CreateTime            string
 	ModifyTime            string
 }{
@@ -37,6 +39,7 @@ var EtaBusinessContractColumns = struct {
 	EtaBusinessId:         "eta_business_id",
 	SigningTime:           "signing_time",
 	ExpiredTime:           "expired_time",
+	IsFirst:               "is_first",
 	CreateTime:            "create_time",
 	ModifyTime:            "modify_time",
 }

+ 79 - 0
services/eta_business/eta_business.go

@@ -3,8 +3,11 @@ package eta_business
 import (
 	"fmt"
 	"hongze/hz_crm_api/models/company"
+	"hongze/hz_crm_api/models/eta_business"
+	"hongze/hz_crm_api/services/alarm_msg"
 	"hongze/hz_crm_api/utils"
 	"strings"
+	"time"
 )
 
 // CheckEtaBusinessOperateAuth 校验ETA商家操作权限
@@ -25,3 +28,79 @@ func CheckEtaBusinessOperateAuth(roleCode string) (ok bool, err error) {
 	}
 	return
 }
+
+// UpdateEtaBusinessAfterSigning 签约后的后置操作
+func UpdateEtaBusinessAfterSigning(businessId int) (err error) {
+	if businessId <= 0 {
+		return
+	}
+	defer func() {
+		if err != nil {
+			tips := "签约后更新商家信息失败, Err: " + err.Error()
+			utils.FileLog.Info("%s", tips)
+			go alarm_msg.SendAlarmMsg(tips, 3)
+		}
+	}()
+
+	businessOb := new(eta_business.EtaBusiness)
+	business, e := businessOb.GetItemById(businessId)
+	if e != nil {
+		err = fmt.Errorf("获取商家信息失败, Err: %s", e.Error())
+		return
+	}
+
+	contracts := make([]*eta_business.EtaBusinessContract, 0)
+	{
+		ob := new(eta_business.EtaBusinessContract)
+		cond := fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessContractColumns.EtaBusinessId)
+		pars := make([]interface{}, 0)
+		pars = append(pars, businessId)
+		list, e := ob.GetItemsByCondition(cond, pars, []string{}, "")
+		if e != nil {
+			err = fmt.Errorf("获取商家合同列表失败, Err: " + e.Error())
+			return
+		}
+		contracts = list
+	}
+	if len(contracts) == 0 {
+		return
+	}
+
+	strToday := time.Now().Format(utils.FormatDate)
+	today, _ := time.ParseInLocation(utils.FormatDate, strToday, time.Local)
+	using := false // 是否在任一存续期内
+	for _, c := range contracts {
+		// 当前合约
+		if today.Equal(c.SigningTime) || today.Equal(c.ExpiredTime) || (today.After(c.SigningTime) && today.Before(c.ExpiredTime)) {
+			business.ContractId = c.EtaBusinessContractId
+			business.SigningTime = c.SigningTime
+			business.ExpiredTime = c.ExpiredTime
+			business.ModifyTime = time.Now().Local()
+			// 是否为首次签约
+			if c.IsFirst == 1 {
+				business.SigningStatus = eta_business.EtaBusinessSigningStatusFirst
+			} else {
+				business.SigningStatus = eta_business.EtaBusinessSigningStatusContinue
+			}
+			using = true
+			break
+		}
+	}
+	// 不存在任一合同期内, 当前合同不变, 更新状态
+	if !using {
+		business.SigningStatus = eta_business.EtaBusinessSigningStatusTerminate
+		business.ModifyTime = time.Now().Local()
+		cols := []string{"SigningStatus", "ModifyTime"}
+		if e = business.Update(cols); e != nil {
+			err = fmt.Errorf("更新商家信息失败, Err: %s", e.Error())
+			return
+		}
+		return
+	}
+	// 合同期内
+	cols := []string{"ContractId", "SigningStatus", "SigningTime", "ExpiredTime", "ModifyTime"}
+	if e = business.Update(cols); e != nil {
+		err = fmt.Errorf("更新商家信息失败, Err: %s", e.Error())
+	}
+	return
+}