Browse Source

fix(新增定时任务):新增每日定时合同处理

Roc 3 năm trước cách đây
mục cha
commit
7281d40fba

+ 131 - 0
models/company/company.go

@@ -0,0 +1,131 @@
+package company
+
+import (
+	"hongze/hongze_task/models"
+	"rdluck_tools/orm"
+	"time"
+)
+
+//试用转正式
+func TryOutToFormal(companyId, productId, sellerId, companyContractId int, startDate, endDate, sellerName, productName string) (err error) {
+	o := orm.NewOrm()
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+	sql := `UPDATE company_product SET status='正式',start_date=?,end_date=?,modify_time=NOW(),formal_time=NOW() WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, startDate, endDate, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+	sql = `UPDATE company SET type=1,last_updated_time=NOW() WHERE company_id=? `
+	_, err = o.Raw(sql, companyId).Exec()
+	if err != nil {
+		return
+	}
+	items := make([]*models.CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_report_permission WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	for _, pv := range items {
+		cpLog := new(models.CompanyPermissionLog)
+		cpLog.CompanyId = companyId
+		cpLog.ChartPermissionId = pv.ChartPermissionId
+		cpLog.CreateTime = time.Now()
+		cpLog.SysUserId = sellerId
+		cpLog.SysUserName = sellerName
+		cpLog.StartDate = pv.StartDate
+		cpLog.EndDate = pv.EndDate
+		cpLog.ProductId = productId
+		cpLog.ProductName = pv.ProductName
+		go models.AddCompanyPermissionLog(cpLog)
+	}
+
+	sql = `DELETE FROM company_report_permission WHERE company_id=? AND product_id=?`
+	_, err = o.Raw(sql, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+
+	contractPermission := make([]*models.CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_contract_permission WHERE company_contract_id=? AND company_id=? `
+	_, err = o.Raw(sql, companyContractId, companyId).QueryRows(&contractPermission)
+	if err != nil {
+		return
+	}
+	for _, pv := range contractPermission {
+		sql = `INSERT INTO company_report_permission(company_id, report_permission_id,created_time, last_updated_time,
+             chart_permission_id, start_date,end_date,product_id,product_name, modify_time,company_contract_id,status) 
+			VALUES(?,?,NOW(),NOW(),?,?,?,?,?,NOW(),?,?) `
+		_, err = o.Raw(sql, companyId, pv.ChartPermissionId, pv.ChartPermissionId, pv.StartDate, pv.EndDate, productId, productName, companyContractId, "正式").Exec()
+		if err != nil {
+			return
+		}
+	}
+	return
+}
+
+//服务更新
+func ApplyServiceUpdate(companyId, productId, sellerId, companyContractId int, startDate, endDate, sellerName, productName string) (err error) {
+	o := orm.NewOrm()
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+
+	sql := `UPDATE company_product SET status='正式',start_date=?,end_date=?,modify_time=NOW() WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, startDate, endDate, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+
+	//合同权限变更
+	items := make([]*models.CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_report_permission WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, companyId, productId).QueryRows(&items)
+	if err != nil {
+		return
+	}
+	for _, pv := range items {
+		cpLog := new(models.CompanyPermissionLog)
+		cpLog.CompanyId = companyId
+		cpLog.ChartPermissionId = pv.ChartPermissionId
+		cpLog.CreateTime = time.Now()
+		cpLog.SysUserId = sellerId
+		cpLog.SysUserName = sellerName
+		cpLog.StartDate = pv.StartDate
+		cpLog.EndDate = pv.EndDate
+		cpLog.ProductId = productId
+		cpLog.ProductName = pv.ProductName
+		go models.AddCompanyPermissionLog(cpLog)
+	}
+	sql = `DELETE FROM company_report_permission WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+
+	contractPermission := make([]*models.CompanyReportPermission, 0)
+	sql = `SELECT * FROM company_contract_permission WHERE company_contract_id=? AND company_id=? `
+	_, err = o.Raw(sql, companyContractId, companyId).QueryRows(&contractPermission)
+	if err != nil {
+		return
+	}
+	for _, pv := range contractPermission {
+		sql = `INSERT INTO company_report_permission(company_id, report_permission_id,created_time, last_updated_time,
+             chart_permission_id, start_date,end_date,product_id,product_name, modify_time,company_contract_id,status) 
+			VALUES(?,?,NOW(),NOW(),?,?,?,?,?,NOW(),?,?) `
+		_, err = o.Raw(sql, companyId, pv.ChartPermissionId, pv.ChartPermissionId, pv.StartDate, pv.EndDate, productId, productName, companyContractId, "正式").Exec()
+		if err != nil {
+			return
+		}
+	}
+	return
+}

+ 33 - 0
models/company_approval/company_approval.go

@@ -0,0 +1,33 @@
+package company_approval
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CompanyApproval struct {
+	CompanyApprovalId   int `orm:"column(company_approval_id);pk"`
+	CompanyId           int
+	ProductId           int
+	ApproveStatus       string    `description:"'待审批','已审批','驳回','已撤回'"`
+	ApproveUserId       int       `description:"审批人"`
+	ApproveRoleTypeCode string    `description:"审批人角色类型"`
+	ApproveRealName     string    `description:"审批人姓名"`
+	ApproveTime         time.Time `description:"审批时间"`
+	ApproveContent      string    `description:"待审内容"`
+	ApplyMethod         int       `description:"申请类型:1:试用->正式,2:冻结—>试用,3:流失—>正式,4:试用延期,5:原销售申请领取流失客户,6:正式客户申请服务更新"`
+	ApplyReasons        string    `description:"申请原因"`
+	ApplyUserId         int       `description:"申请人"`
+	ApplyRealName       string    `description:"申请人姓名"`
+	CreateTime          time.Time `description:"申请时间"`
+	ModifyTime          time.Time `description:"修改时间"`
+	CompanyContractId   int       `description:"合同id"`
+}
+
+//根据合同id获取审批单
+func GetCompanyApprovalByCompanyContractId(companyContractId int) (item *CompanyApproval, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT * FROM company_approval WHERE company_contract_id=? order by company_approval_id desc`
+	err = o.Raw(sql, companyContractId).QueryRow(&item)
+	return
+}

+ 34 - 0
models/company_contract/company_contract.go

@@ -0,0 +1,34 @@
+package company_contract
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CompanyContract struct {
+	CompanyContractId int       `orm:"column(company_contract_id);pk" description:"客户合同id"`
+	ContractType      string    `description:"合同类型:枚举值:'新签合同','续约合同','补充协议'"`
+	ProductId         int       `description:"产品id"`
+	ProductName       string    `description:"产品名称"`
+	CompanyId         int       `description:"客户id"`
+	CompanyProductId  int       `description:"客户产品id"`
+	ContractCode      string    `description:"合同编码"`
+	StartDate         string    `description:"合同开始时间"`
+	EndDate           string    `description:"合同结束时间"`
+	Money             float64   `description:"合同金额"`
+	PayMethod         string    `description:"支付方式"`
+	PayChannel        string    `description:"支付渠道"`
+	ImgUrl            string    `description:"合同图片,多个用#隔开"`
+	CreateTime        time.Time `description:"合同创建时间"`
+	ModifyTime        time.Time `description:"合同修改时间"`
+	Status            int       `description:"状态"`
+}
+
+//通过开始日期获取当天开始的合同列表
+func GetStartContractListByStartDate(startDate string)(total int64,list []*CompanyContract,err error)  {
+	o := orm.NewOrm()
+	sql := "SELECT * FROM company_contract where start_date = ? AND status = 1 "
+	total, err = o.Raw(sql, startDate).QueryRows(&list)
+	return
+	return
+}

+ 26 - 0
models/company_permission_log.go

@@ -0,0 +1,26 @@
+package models
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CompanyPermissionLog struct {
+	Id                int `orm:"column(id);pk"`
+	CompanyId         int
+	ChartPermissionId int
+	CreateTime        time.Time
+	SysUserId         int
+	SysUserName       string
+	StartDate         string
+	EndDate           string
+	ProductId         int
+	ProductName       string
+}
+
+//新增客户权限日志
+func AddCompanyPermissionLog(item *CompanyPermissionLog) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 5 - 0
models/db.go

@@ -1,6 +1,8 @@
 package models
 
 import (
+	"hongze/hongze_task/models/company_approval"
+	"hongze/hongze_task/models/company_contract"
 	"hongze/hongze_task/utils"
 	_ "github.com/go-sql-driver/mysql"
 	"time"
@@ -48,5 +50,8 @@ func init() {
 		new(CompanyOperationRecord),
 		new(CompanyProduct),
 		new(StackCompanyStatistic),
+		new(CompanyPermissionLog),
+		new(company_contract.CompanyContract),
+		new(company_approval.CompanyApproval),
 	)
 }

+ 85 - 0
services/company_contract/company_contract.go

@@ -0,0 +1,85 @@
+package company_contract
+
+import (
+	"errors"
+	"fmt"
+	"hongze/hongze_task/models"
+	"hongze/hongze_task/models/company"
+	"hongze/hongze_task/models/company_approval"
+	"hongze/hongze_task/models/company_contract"
+	"hongze/hongze_task/utils"
+	"strings"
+	"time"
+)
+
+//合同处理
+func HandleCompanyContract() (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("合同处理 ErrMsg:"+err.Error())
+			//go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "合同处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	today := utils.GetToday(utils.FormatDate)
+	total,list,err := company_contract.GetStartContractListByStartDate(today)
+	if err != nil {
+		fmt.Println("HandleCompanyContract Err:" + err.Error())
+		utils.FileLog.Info("HandleCompanyContract Err:%s" + err.Error())
+		return
+	}
+	fmt.Sprintln("总共d%条数据待处理",total)
+	errorList := make([]string,0)
+	for k, v := range list {
+		fmt.Println(k, v.CompanyId)
+		fmt.Println(v)
+		companyApproval,err := company_approval.GetCompanyApprovalByCompanyContractId(v.CompanyContractId)
+		if err != nil {
+			errorList = append(errorList,fmt.Sprint("合同id:",v.CompanyContractId,";err:",err))
+			continue
+		}
+		if companyApproval == nil{
+			errorList = append(errorList,fmt.Sprint("合同id:",v.CompanyContractId,";找不到对应的审批单"))
+			continue
+		}
+
+		companyProduct,err := models.GetCompanyProduct(v.CompanyId,v.ProductId)
+		if err != nil {
+			errorList = append(errorList,fmt.Sprint("合同id:",v.CompanyContractId,";寻找客户产品时异常 err:",err))
+			continue
+		}
+		//companyProduct.EndDate
+		//格式化客户当前产品结束日期
+		companyProductEndDate, err := time.Parse(utils.FormatDate, companyProduct.EndDate)
+		if err != nil {
+			errorList = append(errorList,fmt.Sprint("合同id:",v.CompanyContractId,";格式化客户当前产品结束时间时异常 err:",err))
+			continue
+		}
+		//格式化合同结束日期
+		contractEndDate, err := time.Parse(utils.FormatDate, companyProduct.EndDate)
+		if err != nil {
+			errorList = append(errorList,fmt.Sprint("合同id:",v.CompanyContractId,";格式化合同结束日期时异常 err:",err))
+			continue
+		}
+		//如果 合同结束日期 小于 客户当前产品结束日期,那么不执行合同内容
+		if contractEndDate.Before(companyProductEndDate) {
+			errorList = append(errorList,fmt.Sprint("合同id:",v.CompanyContractId,";合同结束日期 小于 客户当前产品结束日期,不执行该合同内容"))
+			continue
+		}
+		//申请类型:1:试用->正式,2:冻结—>试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新
+		switch companyApproval.ApplyMethod {
+		case 1:
+			company.TryOutToFormal(v.CompanyId, v.ProductId, utils.AdminId, v.CompanyContractId, v.StartDate, v.EndDate, utils.RealName, v.ProductName)
+		case 5:
+			company.ApplyServiceUpdate(v.CompanyId, v.ProductId, utils.AdminId, v.CompanyContractId, v.StartDate, v.EndDate, utils.RealName, v.ProductName)
+		default:
+			errorList = append(errorList,fmt.Sprint("合同id:",v.CompanyContractId,";审批单类型异常"))
+			continue
+		}
+	}
+
+	//错误信息,批量返回错误信息
+	if len(errorList) >0 {
+		err = errors.New(strings.Join(errorList,";"))
+	}
+	return
+}

+ 4 - 0
services/task.go

@@ -3,6 +3,7 @@ package services
 import (
 	"fmt"
 	"github.com/astaxie/beego/toolbox"
+	"hongze/hongze_task/services/company_contract"
 	"hongze/hongze_task/utils"
 )
 
@@ -13,6 +14,9 @@ func Task() {
 	if utils.RunMode == "release"{
 		releaseTask()
 	}
+	//每日定时合同处理
+	handleCompanyContract := toolbox.NewTask("handleCompanyContract", "0 1 0 * * *", company_contract.HandleCompanyContract)
+	toolbox.AddTask("每日定时合同处理", handleCompanyContract)
 
 	//正式->试用
 	companyTryOut := toolbox.NewTask("companyTryOut", "0 5 0 * * *", CompanyTryOut)