ソースを参照

Merge branch 'feature/needs_business_contract'

hsun 1 年間 前
コミット
9493ce9d60

+ 51 - 50
controllers/eta_business/eta_business.go

@@ -224,8 +224,8 @@ func (this *EtaBusinessController) PageList() {
 		b.SigningStatus = v.SigningStatus
 		b.Enable = v.Enable
 		b.ContractId = v.ContractId
-		b.SigningTime = v.SigningTime.Format(utils.FormatDate)
-		b.ExpiredTime = v.ExpiredTime.Format(utils.FormatDate)
+		b.SigningTime = utils.TimeTransferString(utils.FormatDate, v.SigningTime)
+		b.ExpiredTime = utils.TimeTransferString(utils.FormatDate, v.ExpiredTime)
 		b.CreateTime = v.CreateTime.Format(utils.FormatDateTime)
 		b.ModifyTime = v.ModifyTime.Format(utils.FormatDateTime)
 		items = append(items, b)
@@ -319,32 +319,26 @@ func (this *EtaBusinessController) Add() {
 	}
 	req.CapitalScale = strings.TrimSpace(req.CapitalScale)
 
-	// 如果仅校验不新增, 那么不做第二页签约时间的校验
+	// 如果仅校验不新增, 那么不做第二页签约时间的校验(已废弃, 20230919签约时间非必填)
 	var signTime, expiredTime time.Time
 	if !req.IsCheck {
-		if req.SigningTime == "" {
-			br.Msg = "签约时间不可为空"
-			return
-		}
-		if req.ExpiredTime == "" {
-			br.Msg = "到期时间不可为空"
-			return
-		}
-		signTime, e = time.ParseInLocation(utils.FormatDate, req.SigningTime, time.Local)
-		if e != nil {
-			br.Msg = "签约时间格式有误"
-			br.ErrMsg = "签约时间格式有误, Err: " + e.Error()
-			return
-		}
-		expiredTime, e = time.ParseInLocation(utils.FormatDate, req.ExpiredTime, time.Local)
-		if e != nil {
-			br.Msg = "到期时间格式有误"
-			br.ErrMsg = "到期时间格式有误, Err: " + e.Error()
-			return
-		}
-		if !expiredTime.After(signTime) {
-			br.Msg = "到期时间不得早于签约时间"
-			return
+		if req.SigningTime != "" && req.ExpiredTime != "" {
+			signTime, e = time.ParseInLocation(utils.FormatDate, req.SigningTime, time.Local)
+			if e != nil {
+				br.Msg = "签约时间格式有误"
+				br.ErrMsg = "签约时间格式有误, Err: " + e.Error()
+				return
+			}
+			expiredTime, e = time.ParseInLocation(utils.FormatDate, req.ExpiredTime, time.Local)
+			if e != nil {
+				br.Msg = "到期时间格式有误"
+				br.ErrMsg = "到期时间格式有误, Err: " + e.Error()
+				return
+			}
+			if !expiredTime.After(signTime) {
+				br.Msg = "到期时间不得早于签约时间"
+				return
+			}
 		}
 	}
 
@@ -403,17 +397,14 @@ func (this *EtaBusinessController) Add() {
 	codeEncrypt := utils.MD5(fmt.Sprintf("%s%s", businessCode, utils.BusinessCodeSalt))
 
 	now := time.Now().Local()
+	status := eta_business.EtaBusinessSigningStatusWait // 默认待签约
 	// 若当前时间不在首次签约时间内, 也算作已终止, 进入合约期时会由定时任务改为首次签约
-	status := eta_business.EtaBusinessSigningStatusFirst
-	isTerminate := true
-	if now.Equal(signTime) || now.Equal(expiredTime) {
-		isTerminate = false
-	}
-	if now.After(signTime) && now.Before(expiredTime) {
-		isTerminate = false
-	}
-	if isTerminate {
-		status = eta_business.EtaBusinessSigningStatusTerminate
+	if !signTime.IsZero() && !expiredTime.IsZero() {
+		if !now.Before(signTime) && !now.After(expiredTime) {
+			status = eta_business.EtaBusinessSigningStatusFirst // 首次签约
+		} else {
+			status = eta_business.EtaBusinessSigningStatusTerminate // 已终止
+		}
 	}
 
 	// 新增商家和签约
@@ -441,11 +432,15 @@ func (this *EtaBusinessController) Add() {
 	businessItem.CreateTime = now
 	businessItem.ModifyTime = now
 	contractItem := new(eta_business.EtaBusinessContract)
-	contractItem.SigningTime = signTime
-	contractItem.ExpiredTime = expiredTime
-	contractItem.IsFirst = 1
-	contractItem.CreateTime = now
-	contractItem.ModifyTime = now
+	if !signTime.IsZero() && !expiredTime.IsZero() {
+		contractItem.SigningTime = signTime
+		contractItem.ExpiredTime = expiredTime
+		contractItem.IsFirst = 1
+		contractItem.CreateTime = now
+		contractItem.ModifyTime = now
+	} else {
+		contractItem = nil
+	}
 	if e = eta_business.CreateEtaBusinessAndContract(businessItem, contractItem); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增商家和签约失败, Err: " + e.Error()
@@ -704,7 +699,7 @@ func (this *EtaBusinessController) Signing() {
 	cond := fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessContractColumns.EtaBusinessId)
 	pars := make([]interface{}, 0)
 	pars = append(pars, req.EtaBusinessId)
-	contracts, e := contract.GetItemsByCondition(cond, pars, []string{}, "")
+	contracts, e := contract.GetItemsByCondition(cond, pars, []string{}, "signing_time ASC")
 	if e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "获取商家签约列表失败, Err: " + e.Error()
@@ -712,10 +707,11 @@ func (this *EtaBusinessController) Signing() {
 	}
 
 	// 校验签约时间是否重叠
-	isFirst := true // 是否为首次签约
+	isFirst := true      // 是否为首次签约
+	changeFirst := false // 是否需要更新首次签约合同
 	if len(contracts) > 0 {
 		isFirst = false
-		for _, c := range contracts {
+		for k, c := range contracts {
 			pass := false
 			if expiredTime.Before(c.SigningTime) {
 				pass = true
@@ -727,6 +723,11 @@ func (this *EtaBusinessController) Signing() {
 				br.Msg = "签约时间在存续期内, 请检查"
 				return
 			}
+			// 若该合同签约时间早于第一份合同(业务上未限制所以可能会出现这种情况, contracts已排序), 则更新为首次签约合同
+			if k == 0 && signTime.Before(c.SigningTime) {
+				changeFirst = true
+				isFirst = true
+			}
 		}
 	}
 
@@ -739,7 +740,7 @@ func (this *EtaBusinessController) Signing() {
 	if isFirst {
 		contract.IsFirst = 1
 	}
-	if e = contract.Create(); e != nil {
+	if e = contract.CreateMaybeUpdateFirst(contract, changeFirst); e != nil {
 		br.Msg = "操作失败"
 		br.ErrMsg = "新增签约失败, Err: " + e.Error()
 		return
@@ -1034,8 +1035,8 @@ func (this *EtaBusinessController) Detail() {
 	resp.SigningStatus = item.SigningStatus
 	resp.Enable = item.Enable
 	resp.ContractId = item.ContractId
-	resp.SigningTime = item.SigningTime.Format(utils.FormatDate)
-	resp.ExpiredTime = item.ExpiredTime.Format(utils.FormatDate)
+	resp.SigningTime = utils.TimeTransferString(utils.FormatDate, item.SigningTime)
+	resp.ExpiredTime = utils.TimeTransferString(utils.FormatDate, item.ExpiredTime)
 	resp.CreateTime = item.CreateTime.Format(utils.FormatDateTime)
 	resp.ModifyTime = item.ModifyTime.Format(utils.FormatDateTime)
 
@@ -1092,7 +1093,7 @@ func (this *EtaBusinessController) ContractList() {
 	cond := fmt.Sprintf(` AND %s = ?`, eta_business.EtaBusinessContractColumns.EtaBusinessId)
 	pars := make([]interface{}, 0)
 	pars = append(pars, businessId)
-	order := `signing_time DESC`
+	order := `signing_time ASC`
 
 	contractOb := new(eta_business.EtaBusinessContract)
 	list, e := contractOb.GetItemsByCondition(cond, pars, []string{}, order)
@@ -1106,8 +1107,8 @@ func (this *EtaBusinessController) ContractList() {
 		b := new(eta_business.EtaBusinessContractItem)
 		b.EtaBusinessContractId = v.EtaBusinessContractId
 		b.EtaBusinessId = v.EtaBusinessId
-		b.SigningTime = v.SigningTime.Format(utils.FormatDate)
-		b.ExpiredTime = v.ExpiredTime.Format(utils.FormatDate)
+		b.SigningTime = utils.TimeTransferString(utils.FormatDate, v.SigningTime)
+		b.ExpiredTime = utils.TimeTransferString(utils.FormatDate, v.ExpiredTime)
 		// 到期天数, 终止日按当天的23:59:59算
 		strEnd := v.ExpiredTime.Format(utils.FormatDate)
 		strEnd = strEnd + " 23:59:59"

+ 15 - 12
models/eta_business/eta_business.go

@@ -13,6 +13,7 @@ const (
 	EtaBusinessSigningStatusFirst = iota + 1
 	EtaBusinessSigningStatusContinue
 	EtaBusinessSigningStatusTerminate
+	EtaBusinessSigningStatusWait
 )
 
 type EtaBusiness struct {
@@ -33,7 +34,7 @@ type EtaBusiness struct {
 	CapitalScale     string    `description:"资金规模"`
 	ResearchTeamSize string    `description:"研究团队规模"`
 	UserMax          int       `description:"用户上限"`
-	SigningStatus    int       `description:"签约状态:1-首次签约;2-续约中;3-已终止"`
+	SigningStatus    int       `description:"签约状态:1-首次签约;2-续约中;3-已终止;4-待签约"`
 	Enable           int       `description:"状态:0-禁用;1-启用"`
 	ContractId       int       `description:"当前合约ID"`
 	SigningTime      time.Time `description:"当前合约的签约时间"`
@@ -185,7 +186,7 @@ func (m *EtaBusiness) GetPageItemsByCondition(condition string, pars []interface
 
 // CreateEtaBusinessAndContract 新增商家和签约
 func CreateEtaBusinessAndContract(businessItem *EtaBusiness, contractItem *EtaBusinessContract) (err error) {
-	if businessItem == nil || contractItem == nil {
+	if businessItem == nil {
 		err = fmt.Errorf("item empty")
 		return
 	}
@@ -212,17 +213,19 @@ func CreateEtaBusinessAndContract(businessItem *EtaBusiness, contractItem *EtaBu
 	businessItem.EtaBusinessId = int(businessId)
 
 	// 签约
-	contractItem.EtaBusinessId = businessItem.EtaBusinessId
-	contractId, e := tx.Insert(contractItem)
-	if e != nil {
-		err = fmt.Errorf("contract insert err: %s", e.Error())
-		return
-	}
+	if contractItem != nil {
+		contractItem.EtaBusinessId = businessItem.EtaBusinessId
+		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...)
+		// 更新商家当前签约ID
+		businessItem.ContractId = int(contractId)
+		cols := []string{"ContractId"}
+		_, err = tx.Update(businessItem, cols...)
+	}
 	return
 }
 

+ 42 - 0
models/eta_business/eta_business_contract.go

@@ -112,6 +112,48 @@ func (m *EtaBusinessContract) GetItemsByCondition(condition string, pars []inter
 	return
 }
 
+// CreateMaybeUpdateFirst 新增签约合同, 或同时更新首次签约合同
+func (m *EtaBusinessContract) CreateMaybeUpdateFirst(item *EtaBusinessContract, changeFirst bool) (err error) {
+	// 直接新增
+	o := orm.NewOrm()
+	if !changeFirst {
+		id, e := o.Insert(item)
+		if e != nil {
+			return e
+		}
+		item.EtaBusinessContractId = int(id)
+		return
+	}
+
+	// 更新签约合同
+	tx, e := o.Begin()
+	if e != nil {
+		return e
+	}
+	defer func() {
+		if err != nil {
+			_ = tx.Rollback()
+			return
+		}
+		_ = tx.Commit()
+	}()
+
+	id, e := tx.Insert(item)
+	if e != nil {
+		err = fmt.Errorf("contract insert err: %s", e.Error())
+		return
+	}
+	item.EtaBusinessContractId = int(id)
+
+	sql := fmt.Sprintf(`UPDATE %s SET %s = 0 WHERE %s = ? AND %s <> ?`, m.TableName(), EtaBusinessContractColumns.IsFirst, EtaBusinessContractColumns.EtaBusinessId, EtaBusinessContractColumns.EtaBusinessContractId)
+	_, e = tx.Raw(sql, item.EtaBusinessId, item.EtaBusinessContractId).Exec()
+	if e != nil {
+		err = fmt.Errorf("update first contract err: %s", e.Error())
+		return
+	}
+	return
+}
+
 // EtaBusinessContractItem 商家签约信息
 type EtaBusinessContractItem struct {
 	EtaBusinessContractId int