浏览代码

新增冻结等客户状态改变

rdluck 4 年之前
父节点
当前提交
eb972c52e0

+ 0 - 10
b.html

@@ -1,10 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
-<head>
-    <meta charset="UTF-8">
-    <title>$Title$</title>
-</head>
-<body>
-$END$
-</body>
-</html>

二进制
company_0713.xlsx


二进制
company_0717.xlsx


二进制
hongze_task


二进制
hongze_user20200615141931.xlsx


+ 12 - 4
models/admin.go

@@ -3,10 +3,18 @@ package models
 import "rdluck_tools/orm"
 
 type Admin struct {
-	AdminId   int
-	AdminName string
-	RealName  string
-	Mobile    string
+	AdminId      int
+	AdminName    string `description:"系统用户名称"`
+	RealName     string `description:"系统用户姓名"`
+	Password     string `description:"密码"`
+	Mobile       string `description:"手机号"`
+	RoleId       int    `description:"角色id"`
+	RoleName     string `description:"角色名称"`
+	RoleTypeCode string `description:"角色编码"`
+	DepartmentId int    `description:"部门id"`
+	GroupId      int    `description:"分组id"`
+	Authority    int    `description:"管理权限,0:无,1:部门负责人,2:小组负责人"`
+	Position     string `description:"职位"`
 }
 
 func GetAdminByAdminId(adminId int) (item *Admin, err error) {

+ 31 - 3
models/company.go

@@ -6,7 +6,7 @@ import (
 )
 
 type Company struct {
-	CompanyId       int64     `orm:"column(company_id);pk"`
+	CompanyId       int     `orm:"column(company_id);pk"`
 	CompanyName     string    `description:"客户名称"`
 	CreditCode      string    `description:"社会统一信用码"`
 	CompanyCode     string    `description:"客户编码"`
@@ -57,14 +57,42 @@ func GetCompany() (items []*Company, err error) {
 type CompanyNeedFreeze struct {
 	CompanyId        int
 	CompanyProductId int
+	ProductId        int
+	CompanyName      string
+	ProductName string
+	Status string
 }
 
 func GetCompanyNeedFreeze(endDate string) (items []*CompanyNeedFreeze, err error) {
 	o := orm.NewOrm()
-	sql := `SELECT a.company_id,b.company_product_id FROM company AS a
+	sql := `SELECT a.company_id,b.company_product_id,b.product_id,a.company_name,b.product_name,b.status
+            FROM  company AS a
 			INNER JOIN company_product AS b ON a.company_id=b.company_id
 			WHERE b.status='试用'
-			AND b.end_date<? `
+			AND b.end_date<=? `
+	_, err = o.Raw(sql, endDate).QueryRows(&items)
+	return
+}
+
+func GetCompanyNeedLoss(endDate string) (items []*CompanyNeedFreeze, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.company_id,b.company_product_id,b.product_id,a.company_name,b.product_name,b.status
+            FROM  company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			WHERE b.status='冻结'
+			AND b.freeze_end_date<=? `
+	_, err = o.Raw(sql, endDate).QueryRows(&items)
+	return
+}
+
+//正式
+func GetCompanyNeedTryOut(endDate string) (items []*CompanyNeedFreeze, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.company_id,b.company_product_id,b.product_id,a.company_name,b.product_name,b.status
+            FROM  company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			WHERE b.status='正式'
+			AND b.end_date<=? `
 	_, err = o.Raw(sql, endDate).QueryRows(&items)
 	return
 }

+ 102 - 0
models/company_product.go

@@ -0,0 +1,102 @@
+package models
+
+import (
+	"hongze/hongze_task/utils"
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CompanyOperationRecord struct {
+	Id              int       `orm:"column(id);pk"`
+	CompanyId       int       `description:"客户id"`
+	CompanyName     string    `description:"客户名称"`
+	SysUserId       int       `description:"操作者id"`
+	SysRealName     string    `description:"操作者名称"`
+	Remark          string    `description:"备注"`
+	Operation       string    `description:"操作"`
+	CreateTime      time.Time `description:"操作时间"`
+	ProductId       int       `description:"产品id"`
+	ProductName     string    `description:"产品名称"`
+	ApproveUserId   int       `description:"审批人id"`
+	ApproveRealName string    `description:"审批人姓名"`
+	ApproveContent  string    `description:"审批人内容"`
+	ApproveRemark   string    `description:"审批人内容"`
+	Status          string    `description:"状态"`
+}
+
+//新增PPT
+func AddCompanyOperationRecord(item *CompanyOperationRecord) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}
+
+func CompanyFreeze(companyId, productId int) (err error) {
+	o := orm.NewOrm()
+	freezeStartDate := time.Now().Format(utils.FormatDate)
+	freezeEndDate := time.Now().AddDate(0, 3, 0).Format(utils.FormatDate)
+	sql := `UPDATE company_product SET status='冻结',freeze_time=NOW(),modify_time=NOW(),freeze_start_date=?,freeze_end_date=? WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, freezeStartDate, freezeEndDate, companyId, productId).Exec()
+	return
+}
+
+func CompanyLoss(companyId, productId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_product SET status='流失',loss_time=NOW(),modify_time=NOW(),lose_reason=‘冻结到期系统自动流失’ WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, companyId, productId).Exec()
+	return
+}
+
+func CompanyTryOut(companyId, productId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_product SET status='试用',modify_time=NOW() WHERE company_id=? AND product_id=? `
+	_, err = o.Raw(sql, companyId, productId).Exec()
+	return
+}
+
+func GetCompanyOldDataSync() (items []*Company, err error) {
+	sql := `SELECT * FROM company WHERE company_id NOT IN(
+			SELECT company_id FROM company_product
+			)
+			AND company_belong='partner' AND company_id<>1 `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
+
+type CompanyProduct struct {
+	CompanyProductId int       `orm:"column(company_product_id);pk" description:"客户产品id"`
+	CompanyId        int       `description:"客户id"`
+	ProductId        int       `description:"产品id"`
+	ProductName      string    `description:"产品名称"`
+	CompanyName      string    `description:"客户名称"`
+	Source           string    `description:"来源"`
+	Reasons          string    `description:"新增理由"`
+	Status           string    `description:"客户状态"`
+	IndustryId       int       `description:"行业id"`
+	IndustryName     string    `description:"行业名称"`
+	SellerId         int       `description:"销售id"`
+	SellerName       string    `description:"销售名称"`
+	GroupId          int       `description:"销售分组id"`
+	DepartmentId     int       `description:"销售部门id"`
+	IsSuspend        int       `description:"1:暂停,0:启用"`
+	SuspendTime      time.Time `description:"暂停启用时间"`
+	ApproveStatus    string    `description:"审批状态:'审批中','通过','驳回'"`
+	FreezeTime       time.Time `description:"冻结时间"`
+	Remark           string    `description:"备注信息"`
+	CreateTime       time.Time `description:"创建时间"`
+	ModifyTime       time.Time `description:"修改时间"`
+	StartDate        string    `description:"开始日期"`
+	EndDate          string    `description:"结束日期"`
+	LoseReason       string    `description:"流失原因"`
+	LossTime         time.Time `description:"流失时间"`
+	CompanyType      string    `description:"客户类型"`
+}
+
+//新增客户产品
+func AddCompanyProduct(item *CompanyProduct) (newId int64, err error) {
+	o := orm.NewOrm()
+	newId, err = o.Insert(item)
+	return
+}

+ 12 - 5
models/company_report_permission.go

@@ -7,21 +7,28 @@ import (
 
 type CompanyReportPermission struct {
 	CompanyReportPermissionId int64     `orm:"column(company_report_permission_id);pk"`
-	CompanyId                 int64       `description:"公司id"`
+	CompanyId                 int       `description:"公司id"`
 	ReportPermissionId        int       `description:"权限id(作废)"`
 	CreatedTime               time.Time `description:"创建时间"`
 	LastUpdatedTime           time.Time `description:"更新时间"`
 	ChartPermissionId         int       `description:"大分类ID"`
 }
 
-func GetCompanyReportPermission(companyId int64) (items []*CompanyReportPermission, err error) {
+func GetCompanyReportPermission(companyId int) (items []*CompanyReportPermission, err error) {
 	sql := `SELECT * FROM company_report_permission WHERE company_id=? `
 	_, err = orm.NewOrm().Raw(sql, companyId).QueryRows(&items)
 	return
 }
 
 func AddCompanyReportPermission(item *CompanyReportPermission) (err error) {
-	o:=orm.NewOrm()
-	_,err=o.Insert(item)
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
 	return
-}
+}
+
+func ModifyCompanyOldPermission(startDate, endDate, productName string, companyId, productId int) (err error){
+	o := orm.NewOrm()
+	sql := `UPDATE company_report_permission SET start_date=?,end_date=?,product_id=?,product_name=?,modify_time=NOW() WHERE company_id=? AND start_date IS NULL `
+	_,err=o.Raw(sql, startDate, endDate, productId, productName, companyId).Exec()
+	return
+}

+ 2 - 0
models/db.go

@@ -44,5 +44,7 @@ func init() {
 		new(EdbdataClassify),
 		new(Longzhongpriceinfo),
 		new(Longzhongpricedata),
+		new(CompanyOperationRecord),
+		new(CompanyProduct),
 	)
 }

+ 1 - 1
models/users.go

@@ -42,7 +42,7 @@ func GetWxUserByMobile(mobile string) (item *WxUser, err error) {
 	return
 }
 
-func AddWxUser(companyId int64,mobile,realName,email string) (err error) {
+func AddWxUser(companyId int,mobile,realName,email string) (err error) {
 	sql:=`INSERT INTO wx_user(company_id,real_name,mobile,first_login,enabled,is_note,from_type,apply_method,email) VALUES (?,?,?,1,1,1,'report',0,?);`
 	orm.NewOrm().Raw(sql,companyId,realName,mobile,email).Exec()
 	return

二进制
report_view_times20200614120008.xlsx


二进制
report_viewer_details20200614120000.xlsx


+ 4 - 25
services/company.go

@@ -72,7 +72,7 @@ func ImportCompany() {
 						return
 					}
 				}
-				var companyId int64
+				var companyId int
 				if company == nil {
 					sellsId := 0
 					sellsName := ""
@@ -106,7 +106,7 @@ func ImportCompany() {
 						fmt.Println("新增公司失败,Err:" + err.Error())
 						return
 					}
-					companyId = newId
+					companyId = int(newId)
 					//新增权限
 
 					return
@@ -176,7 +176,7 @@ func ImportCompanyUsers() {
 				email = strings.Trim(email, " ")
 				email = strings.Replace(email, " ", "", -1)
 				fmt.Println(mobile)
-				var companyId int64
+				var companyId int
 				companyId = 225
 				if companyId > 0 {
 					wxUser, err := models.GetWxUserByMobile(mobile)
@@ -203,25 +203,4 @@ func ImportCompanyUsers() {
 		}
 	}
 	fmt.Println("len:", n)
-}
-
-//客户自动冻结-试用两个月结束后,进入冻结
-func CompanyFreeze() (err error) {
-	endDate := time.Now().Format(utils.FormatDate)
-	items, err := models.GetCompanyNeedFreeze(endDate)
-	if err != nil {
-		fmt.Println("GetCompanyNeedFreeze Err:" + err.Error())
-		utils.FileLog.Info("GetCompanyNeedFreeze Err:%s" + err.Error())
-		return
-	}
-	for k, v := range items {
-		fmt.Println(k, v.CompanyId)
-	}
-	return
-}
-
-//客户自动流失
-func CompanyLoss() (err error) {
-
-	return
-}
+}

+ 1 - 1
services/company_permission.go

@@ -188,7 +188,7 @@ func addCompany12() {
 			fmt.Println("strconv",err.Error())
 		}
 		item := new(models.CompanyReportPermission)
-		item.CompanyId = int64(companyId)
+		item.CompanyId = companyId
 		item.ChartPermissionId = 12
 		item.CreatedTime = time.Now()
 		item.LastUpdatedTime = time.Now()

+ 214 - 0
services/company_product.go

@@ -0,0 +1,214 @@
+package services
+
+import (
+	"fmt"
+	"hongze/hongze_task/models"
+	"hongze/hongze_task/utils"
+	"time"
+)
+
+//客户自动冻结->试用两个月结束后,进入冻结
+func CompanyFreeze() (err error) {
+	defer func() {
+		if err!=nil {
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "试用两个月结束后,进入冻结 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	endDate := time.Now().Format(utils.FormatDate)
+	items, err := models.GetCompanyNeedFreeze(endDate)
+	if err != nil {
+		fmt.Println("GetCompanyNeedFreeze Err:" + err.Error())
+		utils.FileLog.Info("GetCompanyNeedFreeze Err:%s" + err.Error())
+		return
+	}
+	for k, v := range items {
+		fmt.Println(k, v.CompanyId)
+		err = models.CompanyFreeze(v.CompanyId, v.ProductId)
+		if err != nil {
+			utils.FileLog.Info("CompanyFreeze Err:%s" + err.Error())
+			return
+		}
+		//新增操作记录
+		{
+			remark := "试用转冻结"
+			operation := "freeze"
+			approveContent := "冻结"
+			AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
+				v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
+		}
+	}
+	return
+}
+
+//客户自动流失->冻结超3个月未处理
+func CompanyLoss() (err error) {
+	defer func() {
+		if err!=nil {
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "自动流失->冻结超3个月未处理 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	endDate := time.Now().Format(utils.FormatDate)
+	items, err := models.GetCompanyNeedLoss(endDate)
+	if err != nil {
+		fmt.Println("GetCompanyNeedLoss Err:" + err.Error())
+		utils.FileLog.Info("GetCompanyNeedLoss Err:%s" + err.Error())
+		return
+	}
+	for k, v := range items {
+		fmt.Println(k, v.CompanyId)
+		err = models.CompanyLoss(v.CompanyId, v.ProductId)
+		if err != nil {
+			utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
+			return
+		}
+		//新增操作记录
+		{
+			remark := "冻结转流失"
+			operation := "loss"
+			approveContent := "流失"
+			AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
+				v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
+		}
+	}
+	return
+}
+
+//正式客户自动试用->合同到期未续约转试用
+func CompanyTryOut() (err error) {
+	defer func() {
+		if err!=nil {
+			go utils.SendEmail(utils.APPNAME+"【"+utils.RunMode+"】"+"失败提醒", "正式客户自动试用->合同到期未续约转试用 ErrMsg:"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	endDate := time.Now().Format(utils.FormatDate)
+	items, err := models.GetCompanyNeedTryOut(endDate)
+	if err != nil {
+		fmt.Println("GetCompanyNeedTryOut Err:" + err.Error())
+		utils.FileLog.Info("GetCompanyNeedTryOut Err:%s" + err.Error())
+		return
+	}
+	for k, v := range items {
+		fmt.Println(k, v.CompanyId)
+		err = models.CompanyTryOut(v.CompanyId, v.ProductId)
+		if err != nil {
+			utils.FileLog.Info("CompanyLoss Err:%s" + err.Error())
+			return
+		}
+		//新增操作记录
+		{
+			remark := "正式转试用"
+			operation := "try_out"
+			approveContent := "试用"
+			AddCompanyOperationRecord(v.CompanyId, utils.AdminId, v.ProductId, utils.AdminId, v.CompanyName,
+				v.ProductName, utils.RealName, remark, operation, approveContent, approveContent, "", v.Status)
+		}
+	}
+	return
+}
+
+func AddCompanyOperationRecord(companyId, sysUserId, productId, approveAdminId int, companyName, productName, sysUserRealName, remark, operation, approveContent, approveUserRealName, approveRemark, status string) (err error) {
+	defer func() {
+		if err != nil {
+			go utils.SendEmail(utils.APPNAME+"失败提醒"+utils.RunMode, "services:AddCompanyOperationRecord;Err"+err.Error(), utils.EmailSendToUsers)
+		}
+	}()
+	record := new(models.CompanyOperationRecord)
+	record.CompanyId = companyId
+	record.CompanyName = companyName
+	record.SysUserId = sysUserId
+	record.SysRealName = sysUserRealName
+	record.Remark = remark
+	record.Operation = operation
+	record.CreateTime = time.Now()
+	record.ProductId = productId
+	record.ProductName = productName
+	record.ApproveUserId = approveAdminId
+	record.ApproveRealName = approveUserRealName
+	record.ApproveContent = approveContent
+	record.ApproveRemark = approveRemark
+	record.Status = status
+	_, err = models.AddCompanyOperationRecord(record)
+	return
+}
+
+//客户老数据同步
+func CompanyOldDataSync() {
+	companyItems, err := models.GetCompanyOldDataSync()
+	if err != nil {
+		fmt.Println("GetCompanyOldDataSync Err:" + err.Error())
+		return
+	}
+	productId := 1
+	productName := "ficc"
+	for k, v := range companyItems {
+		fmt.Println(k, v.CompanyName, v.CompanyId)
+		productItem := new(models.CompanyProduct)
+		productItem.CompanyId = v.CompanyId
+		productItem.ProductId = productId
+		productItem.ProductName = productName
+		productItem.CompanyName = v.CompanyName
+		//客户标签,1:付费客户,2:试用客户,3:流失客户,4:潜在客户,5:永续
+		//'试用','永续','冻结','流失','正式','潜在'
+		status := ""
+		if v.CompanyType == 1 {
+			status = "正式"
+		} else if v.CompanyType == 2 {
+			status = "试用"
+		} else if v.CompanyType == 3 {
+			status = "流失"
+		} else if v.CompanyType == 4 {
+			status = "潜在"
+		} else if v.CompanyType == 5 {
+			status = "永续"
+		} else {
+			fmt.Println("无效的客户状态:"+status, v.CompanyType)
+			return
+		}
+		if status == "" {
+			fmt.Println("无效的客户状态:"+status, v.CompanyType)
+			return
+		}
+		productItem.Status = status
+		//获取销售
+		seller, err := models.GetAdminByAdminId(v.SellsId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			fmt.Println("获取销售失败,Err:"+err.Error(), v.SellsId)
+			return
+		}
+		var adminId, groupId, departmentId int
+		var sellerRealName string
+		if seller == nil {
+			fmt.Println("销售不存在:", v.SellsId)
+			//return
+		}else{
+			adminId=seller.AdminId
+			sellerRealName=seller.RealName
+			groupId=seller.GroupId
+			departmentId=seller.DepartmentId
+		}
+		productItem.SellerId = adminId
+		productItem.SellerName = sellerRealName
+		productItem.GroupId = groupId
+		productItem.DepartmentId = departmentId
+		productItem.CreateTime = time.Now()
+		productItem.ModifyTime = time.Now()
+		productItem.StartDate = v.StartDate
+		productItem.EndDate = v.EndDate
+		productItem.LoseReason = v.LoseReason
+		productItem.LossTime = v.LossTime
+		_, err = models.AddCompanyProduct(productItem)
+		if err != nil {
+			fmt.Println("新增客户产品失败,Err:" + err.Error())
+			return
+		}
+		//权限处理
+		err = models.ModifyCompanyOldPermission(v.StartDate, v.EndDate, productName, v.CompanyId, productId)
+		if err != nil {
+			fmt.Println("客户权限处理失败,Err:" + err.Error())
+			return
+		}
+		if k > 500 {
+			return
+		}
+	}
+}

+ 12 - 7
services/task.go

@@ -28,6 +28,18 @@ func Task() {
 	getLzProductPriceData := toolbox.NewTask("getLzProductPriceData", "0 10 11-19/1 * * * ", GetLzProductPriceData)
 	toolbox.AddTask("getLzProductPriceData", getLzProductPriceData)
 
+	//正式->试用
+	companyTryOut := toolbox.NewTask("companyTryOut", "0 5 0 * * *", CompanyTryOut)
+	toolbox.AddTask("companyTryOut", companyTryOut)
+
+	//试用->冻结
+	companyFreeze := toolbox.NewTask("companyFreeze", "0 10 0 * * *", CompanyFreeze)
+	toolbox.AddTask("companyFreeze", companyFreeze)
+
+	//冻结->流失
+	companyLoss := toolbox.NewTask("companyLoss", "0 20 0 * * *", CompanyLoss)
+	toolbox.AddTask("companyLoss", companyLoss)
+
 	toolbox.StartTask()
 	//GetHistoryLzProductDetail()
 	//GetLzPrice()
@@ -37,13 +49,6 @@ func Task() {
 	fmt.Println("task end")
 }
 
-
-//func Task() {
-//	fmt.Println("start")
-//	ImportCompanyUsers()
-//	fmt.Println("end")
-//}
-
 func SendEmail() (err error) {
 	//报告历史访问次数
 	go ReportViewTimes()

+ 5 - 0
utils/config.go

@@ -13,6 +13,8 @@ var (
 
 var (
 	CompanyId int
+	AdminId int
+	RealName string
 )
 
 var (
@@ -34,11 +36,14 @@ func init() {
 
 	if RunMode == "release" {
 		CompanyId = 16
+		RealName="超级管理员"
 		WxAppId = "wx4a844c734d8c8e56"
 		WxAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"
 		TemplateId = "P0klzaZjEI2UYth-z-WnmtOQgyxcF8klPoA_MlsA8Eo"
 	} else {
 		CompanyId = 16
+		RealName="超级管理员"
+		AdminId=11
 		WxAppId = "wx9b5d7291e581233a"
 		WxAppSecret = "f4d52e34021eee262dce9682b31f8861"
 		TemplateId = "P0klzaZjEI2UYth-z-WnmtOQgyxcF8klPoA_MlsA8Eo"

+ 1 - 1
utils/constants.go

@@ -19,7 +19,7 @@ const (
 )
 
 const (
-	APPNAME          = "弘则-数据录入"
+	APPNAME          = "弘则-task"
 	EmailSendToUsers = "lnyan@hzinsights.com;317699326@qq.com"
 	EmailSendToMe = "317699326@qq.com"
 )

+ 2 - 4
utils/email.go

@@ -20,14 +20,12 @@ func SendEmail(title, content string, touser string)bool {
 		arr = append(arr, touser)
 	}
 	m := gomail.NewMessage()
-	m.SetHeader("From", "local.circle@qq.com")
+	m.SetHeader("From", "317699326@qq.com ")
 	m.SetHeader("To", arr...)
 	m.SetHeader("Subject", title+" "+GetRandString(16))
 	m.SetBody("text/html", content)
-
-	d := gomail.NewDialer("smtp.qq.com", 587, "local.circle@qq.com", "iyrzdcsrmmbabbge")
+	d := gomail.NewDialer("smtp.qq.com", 587, "317699326@qq.com", "oqdypwfcvruwcbea")
 	if err := d.DialAndSend(m); err != nil {
-		fmt.Println("err:",err.Error())
 		return false
 	}
 	return true