Browse Source

feat(审批单):新增合同详情接口

Roc 3 years ago
parent
commit
f147c5faf3

+ 186 - 212
controllers/approval.go

@@ -1,12 +1,20 @@
 package controllers
 
 import (
+	"encoding/json"
+	approval2 "hongze/hongze_mobile_admin/models/request/approval"
 	"hongze/hongze_mobile_admin/models/response/approval"
+	"hongze/hongze_mobile_admin/models/tables/admin"
 	"hongze/hongze_mobile_admin/models/tables/company_approval"
+	"hongze/hongze_mobile_admin/models/tables/company_contract"
 	"hongze/hongze_mobile_admin/models/tables/company_delay_permission"
+	"hongze/hongze_mobile_admin/models/tables/company_product"
+	"hongze/hongze_mobile_admin/models/tables/company_product_log"
 	"hongze/hongze_mobile_admin/models/tables/company_report_permission"
+	services "hongze/hongze_mobile_admin/service"
 	"hongze/hongze_mobile_admin/utils"
 	"rdluck_tools/paging"
+	"strconv"
 	"time"
 )
 
@@ -191,218 +199,184 @@ func (this *ApprovalCommon) GetApprovalPermissionList() {
 	this.OkDetailed(resp, "获取成功")
 }
 
-//// @Title 审批
-//// @Description 审批接口
-//// @Param	request	body company.CompanyApplyApproveReq true "type json string"
-//// @Success Ret=200 审批成功
-//// @router /approval/approve [post]
-//func (this *CompanyApprovalController) ApplyApprove() {
-//	br := new(models.BaseResponse).Init()
-//	defer func() {
-//		this.Data["json"] = br
-//		this.ServeJSON()
-//	}()
-//	sysUser := this.SysUser
-//	if sysUser == nil {
-//		br.Msg = "请登录"
-//		br.ErrMsg = "请登录,SysUser Is Empty"
-//		br.Ret = 408
-//		return
-//	}
-//	var req company.CompanyApplyApproveReq
-//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
-//	if err != nil {
-//		br.Msg = "参数解析异常!"
-//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
-//		return
-//	}
-//	roleTypeCode := sysUser.RoleTypeCode
-//	productId := services.GetProductId(roleTypeCode)
-//	if productId == 0 {
-//		br.Msg = "参数错误"
-//		br.ErrMsg = "客户类型为:" + roleTypeCode
-//		return
-//	}
-//	if req.CompanyId <= 0 {
-//		br.Msg = "参数错误"
-//		br.ErrMsg = "客户Id小于等于0:"
-//		return
-//	}
-//	if req.Status != 1 && req.Status != 2 {
-//		br.Msg = "参数错误"
-//		br.ErrMsg = "审批状态Id小于等于0:"
-//		return
-//	}
-//	companyProduct, err := company.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
-//	if err != nil {
-//		br.Msg = "获取信息失败"
-//		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-//		return
-//	}
-//	if companyProduct == nil {
-//		br.Msg = "获取信息失败"
-//		br.ErrMsg = "获取审批信息失败,Err:" + err.Error()
-//		return
-//	}
-//
-//	approvalItem, err := company.GetCompanyApprovalById(req.CompanyId, productId)
-//	if err != nil {
-//		if err.Error() == utils.ErrNoRow() {
-//			br.Msg = "订单已审批,请刷新页面查看最新状态"
-//			br.ErrMsg = "待审批信息不存在,CompanyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
-//			return
-//		}
-//		br.Msg = "获取信息失败"
-//		br.ErrMsg = "获取信息失败,Err:" + err.Error()
-//		return
-//	}
-//	if approvalItem == nil {
-//		br.Msg = "订单已审批,请刷新页面查看最新状态"
-//		br.ErrMsg = "待审批信息不存在,CompanyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
-//		return
-//	}
-//
-//	if approvalItem.ApproveRoleTypeCode != roleTypeCode {
-//		br.Msg = "您无权审批"
-//		br.ErrMsg = "ApproveRoleTypeCode:" + approvalItem.ApproveRoleTypeCode + ";roleTypeCode:" + roleTypeCode
-//		return
-//	}
-//
-//	var approveStatus, approveContent string
-//
-//	if req.Status == 1 { //通过
-//		//申请类型:1:试用->正式,2:冻结—>试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新
-//		if approvalItem.ApplyMethod == 1 { //试用转正式
-//			//获取合同信息
-//			contract, err := company.GetCompanyContractDetail(req.CompanyId, productId, req.CompanyContractId)
-//			if err != nil {
-//				br.Msg = "待审批信息不存在"
-//				br.ErrMsg = "待审批信息不存在,CompanyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId) + ";Err:" + err.Error()
-//				return
-//			}
-//			if contract == nil {
-//				br.Msg = "待审批信息不存在"
-//				br.ErrMsg = "待审批信息不存在,CompanyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
-//				return
-//			}
-//			err = company.TryOutToFormal(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, contract.CompanyContractId, contract.StartDate, contract.EndDate, sysUser.RealName, companyProduct.ProductName)
-//			if err != nil {
-//				br.Msg = "审批失败"
-//				br.ErrMsg = "审批失败,Err:" + err.Error()
-//				return
-//			}
-//		} else if approvalItem.ApplyMethod == 2 { //冻结->试用
-//			err = company.FreezeToTryOut(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, approvalItem.ApplyUserId, sysUser.RealName,companyProduct.ProductName)
-//			if err != nil {
-//				br.Msg = "审批失败"
-//				br.ErrMsg = "审批失败,Err:" + err.Error()
-//				return
-//			}
-//		} else if approvalItem.ApplyMethod == 3 { //试用延期
-//			err = company.TryOutDelay(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, sysUser.RealName, companyProduct.EndDate, companyProduct.ProductName)
-//			if err != nil {
-//				br.Msg = "审批失败"
-//				br.ErrMsg = "审批失败,Err:" + err.Error()
-//				return
-//			}
-//		} else if approvalItem.ApplyMethod == 4 { //原销售申请领取流失客户
-//			err = company.ApplyReceive(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, approvalItem.ApplyUserId, sysUser.RealName,companyProduct.ProductName)
-//			if err != nil {
-//				br.Msg = "审批失败"
-//				br.ErrMsg = "审批失败,Err:" + err.Error()
-//				return
-//			}
-//		} else if approvalItem.ApplyMethod == 5 { //正式客户申请服务更新
-//			//获取合同信息
-//			contract, err := company.GetCompanyContractDetail(req.CompanyId, productId, req.CompanyContractId)
-//			if err != nil {
-//				br.Msg = "待审批信息不存在"
-//				br.ErrMsg = "待审批信息不存在,CompanyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId) + ";Err:" + err.Error()
-//				return
-//			}
-//			if contract == nil {
-//				br.Msg = "待审批信息不存在"
-//				br.ErrMsg = "待审批信息不存在,CompanyId:" + strconv.Itoa(req.CompanyId) + ";productId:" + strconv.Itoa(productId)
-//				return
-//			}
-//			err = company.ApplyServiceUpdate(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, contract.CompanyContractId, companyProduct.StartDate, contract.EndDate, sysUser.RealName, companyProduct.ProductName)
-//			if err != nil {
-//				br.Msg = "审批失败"
-//				br.ErrMsg = "审批失败,Err:" + err.Error()
-//				return
-//			}
-//		} else {
-//			br.Msg = "审批失败"
-//			br.ErrMsg = "无效的审批状态,CompanyId:" + strconv.Itoa(req.CompanyId) + ";productId:" +
-//				strconv.Itoa(productId) + ";ApplyMethod:" + strconv.Itoa(approvalItem.ApplyMethod) + " ApproveStatus;" + approvalItem.ApproveStatus
-//			return
-//		}
-//		approveContent = "审批通过"
-//	} else { //拒绝
-//		approveStatus = "驳回"
-//		err = company.ApproveRefuse(req.CompanyId, productId, approveStatus, req.Remark)
-//		approveContent = "审批驳回"
-//		if err != nil {
-//			br.Msg = "审批失败"
-//			br.ErrMsg = "审批失败,Err:" + err.Error()
-//			return
-//		}
-//	}
-//
-//	//新增客户产品日志
-//	{
-//		productLog := new(company.CompanyProductLog)
-//		productLog.CompanyProductId = companyProduct.CompanyProductId
-//		productLog.CompanyId = companyProduct.CompanyId
-//		productLog.ProductId = companyProduct.ProductId
-//		productLog.ProductName = companyProduct.ProductName
-//		productLog.CompanyName = companyProduct.CompanyName
-//		productLog.CompanyName = companyProduct.CompanyName
-//		productLog.Source = companyProduct.Source
-//		productLog.Reasons = companyProduct.Reasons
-//		productLog.Status = companyProduct.Status
-//		productLog.IndustryId = companyProduct.IndustryId
-//		productLog.IndustryName = companyProduct.IndustryName
-//		productLog.SellerId = companyProduct.SellerId
-//		productLog.SellerName = companyProduct.SellerName
-//		productLog.GroupId = companyProduct.GroupId
-//		productLog.DepartmentId = companyProduct.DepartmentId
-//		productLog.IsSuspend = companyProduct.IsSuspend
-//		productLog.SuspendTime = companyProduct.SuspendTime
-//		productLog.ApproveStatus = companyProduct.ApproveStatus
-//		productLog.FreezeTime = companyProduct.FreezeTime
-//		productLog.Remark = companyProduct.Remark
-//		productLog.StartDate = companyProduct.StartDate
-//		productLog.EndDate = companyProduct.EndDate
-//		productLog.CreateTime = companyProduct.CreateTime
-//		productLog.ModifyTime = companyProduct.ModifyTime
-//		productLog.LoseReason = companyProduct.LoseReason
-//		productLog.LossTime = companyProduct.LossTime
-//		productLog.LogType = "modify"
-//		productLog.LogCreateTime = time.Now()
-//		productLog.AdminId = this.SysUser.AdminId
-//		go company.AddCompanyProductLog(productLog)
-//	}
-//	//新增操作记录
-//	{
-//		remark := "审批"
-//		operation := "approve"
-//		services.AddCompanyOperationRecord(req.CompanyId, companyProduct.SellerId, sysUser.AdminId, productId, sysUser.AdminId, companyProduct.CompanyName,
-//			companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, req.Remark, companyProduct.Status)
-//	}
-//	//待办通知
-//	{
-//		content := companyProduct.CompanyName + " " + approvalItem.ApproveContent + approveContent
-//		approvalSysUser, _ := system.GetSysAdminById(approvalItem.ApplyUserId)
-//		if sysUser != nil {
-//			go services.AddCompanyApprovalMessage(sysUser.AdminId, approvalItem.ApplyUserId, req.CompanyId, approvalItem.CompanyApprovalId, 2, companyProduct.CompanyName, content, content, approvalSysUser.Mobile)
-//		}
-//	}
-//	br.Ret = 200
-//	br.Success = true
-//	br.Msg = "审批成功"
-//}
-//
+// @Title 审批
+// @Description 审批接口
+// @Param	request	body company.CompanyApplyApproveReq true "type json string"
+// @Success Ret=200 审批成功
+// @router /approval/approve [post]
+func (this *ApprovalCommon) ApplyApprove() {
+	sysUser := this.AdminWx
+	var req approval2.CompanyApplyApproveReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+		return
+	}
+	roleTypeCode := sysUser.RoleTypeCode
+	productId := services.GetProductId(roleTypeCode)
+	if productId == 0 {
+		this.FailWithMessage("参数错误", "参数解析失败,Err:"+"客户类型为:"+roleTypeCode)
+		return
+	}
+	if req.CompanyId <= 0 {
+		this.FailWithMessage("参数错误", "客户Id小于等于0")
+		return
+	}
+	if req.Status != 1 && req.Status != 2 {
+		this.FailWithMessage("参数错误", "审批状态Id小于等于0")
+		return
+	}
+	companyProduct, err := company_product.GetCompanyProductByCompanyIdAndProductId(req.CompanyId, productId)
+	if err != nil {
+		this.FailWithMessage("获取信息失败", "获取信息失败,Err:"+err.Error())
+		return
+	}
+	if companyProduct == nil {
+		this.FailWithMessage("获取审批信息失败", "获取信息失败,Err:"+err.Error())
+		return
+	}
+
+	approvalItem, err := company_approval.GetCompanyApprovalById(req.CompanyId, productId)
+	if err != nil {
+		if err.Error() == utils.ErrNoRow() {
+			this.FailWithMessage("订单已审批,请刷新页面查看最新状态", "待审批信息不存在,CompanyId:"+strconv.Itoa(req.CompanyId)+";productId:"+strconv.Itoa(productId))
+		} else {
+			this.FailWithMessage("获取信息失败", "获取信息失败,Err:"+err.Error())
+		}
+		return
+	}
+	if approvalItem == nil {
+		this.FailWithMessage("订单已审批,请刷新页面查看最新状态", "待审批信息不存在,CompanyId:"+strconv.Itoa(req.CompanyId)+";productId:"+strconv.Itoa(productId))
+		return
+	}
+
+	if approvalItem.ApproveRoleTypeCode != roleTypeCode {
+		this.FailWithMessage("您无权审批", "ApproveRoleTypeCode:"+approvalItem.ApproveRoleTypeCode+";roleTypeCode:"+roleTypeCode)
+		return
+	}
+
+	var approveStatus, approveContent string
+
+	if req.Status == 1 { //通过
+		//申请类型:1:试用->正式,2:冻结—>试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新
+		if approvalItem.ApplyMethod == 1 { //试用转正式
+			//获取合同信息
+			contract, err := company_contract.GetCompanyContractDetail(req.CompanyId, productId, req.CompanyContractId)
+			if err != nil {
+				this.FailWithMessage("待审批信息不存在", "待审批信息不存在,CompanyId:"+strconv.Itoa(req.CompanyId)+";productId:"+strconv.Itoa(productId)+";Err:"+err.Error())
+				return
+			}
+			if contract == nil {
+				this.FailWithMessage("待审批信息不存在", "待审批信息不存在,CompanyId:"+strconv.Itoa(req.CompanyId)+";productId:"+strconv.Itoa(productId))
+				return
+			}
+			err = company_approval.TryOutToFormal(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, contract.CompanyContractId, contract.StartDate, contract.EndDate, sysUser.RealName, companyProduct.ProductName)
+			if err != nil {
+				this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+				return
+			}
+		} else if approvalItem.ApplyMethod == 2 { //冻结->试用
+			err = company_approval.FreezeToTryOut(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, approvalItem.ApplyUserId, sysUser.RealName, companyProduct.ProductName)
+			if err != nil {
+				this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+				return
+			}
+		} else if approvalItem.ApplyMethod == 3 { //试用延期
+			err = company_approval.TryOutDelay(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, sysUser.RealName, companyProduct.EndDate, companyProduct.ProductName)
+			if err != nil {
+				this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+				return
+			}
+		} else if approvalItem.ApplyMethod == 4 { //原销售申请领取流失客户
+			err = company_approval.ApplyReceive(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, approvalItem.ApplyUserId, sysUser.RealName, companyProduct.ProductName)
+			if err != nil {
+				this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+				return
+			}
+		} else if approvalItem.ApplyMethod == 5 { //正式客户申请服务更新
+			//获取合同信息
+			contract, err := company_contract.GetCompanyContractDetail(req.CompanyId, productId, req.CompanyContractId)
+			if err != nil {
+				this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+				return
+			}
+			if contract == nil {
+				this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+				return
+			}
+			err = company_approval.ApplyServiceUpdate(req.CompanyId, productId, sysUser.AdminId, approvalItem.CompanyApprovalId, contract.CompanyContractId, companyProduct.StartDate, contract.EndDate, sysUser.RealName, companyProduct.ProductName)
+			if err != nil {
+				this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+				return
+			}
+		} else {
+			this.FailWithMessage("审批失败", "无效的审批状态,CompanyId:"+strconv.Itoa(req.CompanyId)+";productId:"+
+				strconv.Itoa(productId)+";ApplyMethod:"+strconv.Itoa(approvalItem.ApplyMethod)+" ApproveStatus;"+approvalItem.ApproveStatus)
+			return
+		}
+		approveContent = "审批通过"
+	} else { //拒绝
+		approveStatus = "驳回"
+		err = company_approval.ApproveRefuse(req.CompanyId, productId, approveStatus, req.Remark)
+		approveContent = "审批驳回"
+		if err != nil {
+			this.FailWithMessage("审批失败", "审批失败,Err:"+err.Error())
+			return
+		}
+	}
+
+	//新增客户产品日志
+	{
+		productLog := new(company_product_log.CompanyProductLog)
+		productLog.CompanyProductId = companyProduct.CompanyProductId
+		productLog.CompanyId = companyProduct.CompanyId
+		productLog.ProductId = companyProduct.ProductId
+		productLog.ProductName = companyProduct.ProductName
+		productLog.CompanyName = companyProduct.CompanyName
+		productLog.CompanyName = companyProduct.CompanyName
+		productLog.Source = companyProduct.Source
+		productLog.Reasons = companyProduct.Reasons
+		productLog.Status = companyProduct.Status
+		productLog.IndustryId = companyProduct.IndustryId
+		productLog.IndustryName = companyProduct.IndustryName
+		productLog.SellerId = companyProduct.SellerId
+		productLog.SellerName = companyProduct.SellerName
+		productLog.GroupId = companyProduct.GroupId
+		productLog.DepartmentId = companyProduct.DepartmentId
+		productLog.IsSuspend = companyProduct.IsSuspend
+		productLog.SuspendTime = companyProduct.SuspendTime
+		productLog.ApproveStatus = companyProduct.ApproveStatus
+		productLog.FreezeTime = companyProduct.FreezeTime
+		productLog.Remark = companyProduct.Remark
+		productLog.StartDate = companyProduct.StartDate
+		productLog.EndDate = companyProduct.EndDate
+		productLog.CreateTime = companyProduct.CreateTime
+		productLog.ModifyTime = companyProduct.ModifyTime
+		productLog.LoseReason = companyProduct.LoseReason
+		productLog.LossTime = companyProduct.LossTime
+		productLog.LogType = "modify"
+		productLog.LogCreateTime = time.Now()
+		productLog.AdminId = this.AdminWx.AdminId
+		go company_product_log.AddCompanyProductLog(productLog)
+	}
+	//新增操作记录
+	{
+		remark := "审批"
+		operation := "approve"
+		services.AddCompanyOperationRecord(req.CompanyId, companyProduct.SellerId, sysUser.AdminId, productId, sysUser.AdminId, companyProduct.CompanyName,
+			companyProduct.ProductName, sysUser.RealName, remark, operation, approveContent, sysUser.RealName, req.Remark, companyProduct.Status)
+	}
+	//待办通知
+	{
+		content := companyProduct.CompanyName + " " + approvalItem.ApproveContent + approveContent
+		approvalSysUser, _ := admin.GetAdminById(approvalItem.ApplyUserId)
+		if sysUser != nil {
+			go services.AddCompanyApprovalMessage(sysUser.AdminId, approvalItem.ApplyUserId, req.CompanyId, approvalItem.CompanyApprovalId, 2, companyProduct.CompanyName, content, content, approvalSysUser.Mobile)
+		}
+	}
+	this.OkWithMessage("审批成功")
+}
+
 //// @Title 审批列表删除
 //// @Description 审批列表删除接口
 //// @Param	request	body company.CompanyApplyDeleteReq true "type json string"

+ 95 - 0
controllers/contract.go

@@ -0,0 +1,95 @@
+package controllers
+
+import (
+	"hongze/hongze_mobile_admin/models/response/contract"
+	"hongze/hongze_mobile_admin/models/tables/company_contract"
+	"hongze/hongze_mobile_admin/models/tables/company_report_permission"
+	services "hongze/hongze_mobile_admin/service"
+	"hongze/hongze_mobile_admin/utils"
+)
+
+type ContractCommon struct {
+	BaseAuth
+}
+
+// @Title 合同详情详情
+// @Description 合同详情接口接口
+// @Param   CompanyId   query   int  true       "客户ID"
+// @Param   CompanyContractId   query   int  true       "合同id"
+// @Success 200 {object} contract.CompanyContractDetailResp
+// @router /contract/detail [get]
+func (this *ContractCommon) ApplyContractDetail() {
+	sysUser := this.AdminWx
+
+	companyId, _ := this.GetInt("CompanyId")
+	if companyId <= 0 {
+		this.FailWithMessage("参数错误", "参数错误,客户id小于等于0")
+		return
+	}
+	companyContractId, _ := this.GetInt("CompanyContractId")
+
+	roleTypeCode := sysUser.RoleTypeCode
+	productId := services.GetProductId(roleTypeCode)
+	if productId == 0 {
+		this.FailWithMessage("参数错误", "客户类型为:"+roleTypeCode)
+		return
+	}
+	detail, err := company_contract.GetCompanyContractDetail(companyId, productId, companyContractId)
+	if err != nil {
+		this.FailWithMessage("获取信息失败", "获取信息失败,Err:"+err.Error())
+		return
+	}
+	productId = detail.ProductId
+	if productId == 1 {
+		for _, v := range utils.PermissionFiccClassifyArr {
+			checkList := make([]int, 0)
+			plist := new(company_report_permission.PermissionLookList)
+			items, err := company_report_permission.GetPermissionLookItems(productId, v)
+			if err != nil {
+				this.FailWithMessage("获取失败", "获取权限信息失败,Err:"+err.Error())
+				return
+			}
+			for _, n := range items {
+				count, err := company_contract.GetCompanyContractPermissionCheckByContractId(companyId, detail.CompanyContractId, n.ChartPermissionId)
+				if err != nil {
+					this.FailWithMessage("获取失败", "获取权限信息失败,Err:"+err.Error())
+					return
+				}
+				if count > 0 {
+					checkList = append(checkList, n.ChartPermissionId)
+				}
+			}
+			plist.Items = items
+			plist.ClassifyName = v
+			plist.CheckList = checkList
+			detail.PermissionList = append(detail.PermissionList, plist)
+		}
+	} else {
+		classifyName := "权益"
+		checkList := make([]int, 0)
+		plist := new(company_report_permission.PermissionLookList)
+		items, err := company_report_permission.GetPermissionLookItems(productId, classifyName)
+		if err != nil {
+			this.FailWithMessage("获取失败", "获取权限信息失败,Err:"+err.Error())
+			return
+		}
+		for _, n := range items {
+			count, err := company_contract.GetCompanyContractPermissionCheckByContractId(companyId, detail.CompanyContractId, n.ChartPermissionId)
+			if err != nil {
+				this.FailWithMessage("获取失败", "获取权限信息失败,Err:"+err.Error())
+				return
+			}
+			if count > 0 {
+				checkList = append(checkList, n.ChartPermissionId)
+			}
+		}
+		plist.Items = items
+		plist.ClassifyName = classifyName
+		plist.CheckList = checkList
+		detail.PermissionList = append(detail.PermissionList, plist)
+	}
+	resp := contract.CompanyContractDetailResp{
+		Item: detail,
+	}
+	this.OkDetailed(resp, "获取成功")
+}

+ 2 - 0
models/db_init.go

@@ -5,6 +5,7 @@ import (
 	"hongze/hongze_mobile_admin/models/tables/admin"
 	"hongze/hongze_mobile_admin/models/tables/admin_record"
 	"hongze/hongze_mobile_admin/models/tables/company_approval"
+	"hongze/hongze_mobile_admin/models/tables/company_contract"
 	"hongze/hongze_mobile_admin/models/tables/company_delay_permission"
 	"hongze/hongze_mobile_admin/models/tables/company_permission_log"
 	"hongze/hongze_mobile_admin/models/tables/company_report_permission"
@@ -33,5 +34,6 @@ func InitDb() {
 		new(company_report_permission.CompanyReportPermission),
 		new(h5_admin_session.H5AdminSession),
 		new(wx_token.WxToken),
+		new(company_contract.CompanyContract),
 	)
 }

+ 8 - 0
models/request/approval/approval.go

@@ -0,0 +1,8 @@
+package approval
+
+type CompanyApplyApproveReq struct {
+	CompanyId         int    `description:"客户id"`
+	Status            int    `description:"审批状态,1:通过,2:拒绝"`
+	Remark            string `description:"审批理由"`
+	CompanyContractId int    `description:"合同id"`
+}

+ 7 - 0
models/response/contract/contract.go

@@ -0,0 +1,7 @@
+package contract
+
+import "hongze/hongze_mobile_admin/models/tables/company_contract"
+
+type CompanyContractDetailResp struct {
+	Item *company_contract.CompanyContractDetail
+}

+ 31 - 0
models/tables/company_approval/company_approval.go

@@ -539,6 +539,37 @@ func ApplyServiceUpdate(companyId, productId, sellerId, companyApprovalId, compa
 	return
 }
 
+//审批拒绝
+func ApproveRefuse(companyId, productId int, approveStatus, approveRemark string) (err error) {
+	o := orm.NewOrm()
+	o.Begin()
+	defer func() {
+		if err != nil {
+			o.Rollback()
+		} else {
+			o.Commit()
+		}
+	}()
+	sql := `UPDATE  company_product
+			SET
+			  approve_status = '驳回',
+			  modify_time=NOW()
+			WHERE company_id = ? AND product_id=? `
+	_, err = o.Raw(sql, companyId, productId).Exec()
+	if err != nil {
+		return
+	}
+	sql = ` UPDATE  company_approval
+			SET
+			  approve_status = '驳回',
+			  approve_remark=?,
+			  approve_time=NOW(),
+			  modify_time=NOW()
+			WHERE company_id = ? AND product_id=? AND approve_status='待审批' `
+	_, err = o.Raw(sql, approveRemark, companyId, productId).Exec()
+	return
+}
+
 func GetCompanyApprovalDetailById(companyId, productId int) (item *CompanyApproval, err error) {
 	sql := `SELECT * FROM company_approval WHERE company_id=? AND product_id=? AND approve_status IN('驳回','已撤回') ORDER BY modify_time DESC LIMIT 1 `
 	o := orm.NewOrm()

+ 37 - 0
models/tables/company_approval_message/company_approval_message.go

@@ -0,0 +1,37 @@
+package company_approval_message
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CompanyApprovalMessage struct {
+	Id                int       `orm:"column(id);pk"`
+	CreateUserId      int       `description:"申请者id"`
+	ReceiveUserId     int       `description:"审批者id"`
+	MessageStatus     int       `description:"消息状态:0未读,1:已读"`
+	Remark            string    `description:"备注信息"`
+	Content           string    `description:"消息内容"`
+	CompanyId         int       `description:"客户id"`
+	CompanyName       string    `description:"客户名称"`
+	CreateTime        time.Time `description:"创建时间"`
+	ModifyTime        time.Time `description:"修改时间"`
+	CompanyApprovalId int       `description:"审批单id"`
+	OperationStatus   int       `description:"消息状态:1:待审批,2:已审批"`
+	MessageType       int       `description:"1:申请消息,2:审批结果"`
+}
+
+//添加审批消息
+func AddCompanyApprovalMessage(item *CompanyApprovalMessage) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}
+
+//修改审批消息
+func ModifyCompanyApprovalMessage(companyApprovalId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_approval_message SET operation_status=2,modify_time=NOW() WHERE company_approval_id=? AND message_type=1 AND operation_status=1 `
+	_, err = o.Raw(sql, companyApprovalId).Exec()
+	return
+}

+ 64 - 0
models/tables/company_contract/company_contract.go

@@ -0,0 +1,64 @@
+package company_contract
+
+import (
+	"hongze/hongze_mobile_admin/models/tables/company_report_permission"
+	"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:"状态"`
+}
+
+type CompanyContractDetail struct {
+	CompanyContractId int
+	CompanyId         int       `description:"客户id"`
+	ProductId         int       `description:"产品id";json:"-"`
+	ContractCode      string    `description:"合同编码"`
+	ContractType      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:"状态"`
+	PermissionList    []*company_report_permission.PermissionLookList
+}
+
+func GetCompanyContractDetail(companyId, productId, companyContractId int) (item *CompanyContractDetail, err error) {
+	o := orm.NewOrm()
+	if companyContractId == 0 {
+		sql := `SELECT * FROM company_contract WHERE company_id=? AND product_id=? AND status=0 `
+		err = o.Raw(sql, companyId, productId).QueryRow(&item)
+	} else {
+		sql := `SELECT * FROM company_contract WHERE company_contract_id=? `
+		err = o.Raw(sql, companyContractId).QueryRow(&item)
+	}
+	return
+}
+
+//根据合同id获取已经勾选的权限
+func GetCompanyContractPermissionCheckByContractId(companyId, companyContractId, permissionId int) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count FROM company_contract_permission AS a WHERE a.company_id=? AND company_contract_id=? AND a.chart_permission_id=? `
+	err = o.Raw(sql, companyId, companyContractId, permissionId).QueryRow(&count)
+	return
+}

+ 46 - 0
models/tables/company_operation_record/company_operation_record.go

@@ -0,0 +1,46 @@
+package company_operation_record
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CompanyOperationRecord struct {
+	Id              int       `orm:"column(id);pk"`
+	CompanyId       int       `description:"客户id"`
+	CompanyName     string    `description:"客户名称"`
+	SellerId        int       `description:"销售员id"`
+	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:"状态"`
+}
+
+type CompanyOperationRecordList struct {
+	Id             int    `orm:"column(id);pk"`
+	CompanyId      int64  `description:"客户id"`
+	CompanyName    string `description:"客户名称"`
+	SysUserId      int    `description:"操作者id"`
+	SysRealName    string `description:"操作者名称"`
+	Remark         string `description:"备注"`
+	Operation      string `description:"操作"`
+	ApproveContent string `json:"-",description:"详情"`
+	CreateTime     string `description:"操作时间"`
+	ProductId      int
+	ProductName    string
+}
+
+//新增客户操作记录
+func AddCompanyOperationRecord(item *CompanyOperationRecord) (lastId int64, err error) {
+	o := orm.NewOrm()
+	lastId, err = o.Insert(item)
+	return
+}

+ 44 - 0
models/tables/company_product/company_product.go

@@ -0,0 +1,44 @@
+package company_product
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+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 GetCompanyProductByCompanyIdAndProductId(companyId, productId int) (item *CompanyProduct, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT b.* FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			WHERE a.company_id=? AND b.product_id=? LIMIT 1 `
+	err = o.Raw(sql, companyId, productId).QueryRow(&item)
+	return
+}

+ 47 - 0
models/tables/company_product_log/company_product_log.go

@@ -0,0 +1,47 @@
+package company_product_log
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+type CompanyProductLog struct {
+	Id               int       `orm:"column(id);pk"`
+	CompanyProductId int       `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:"暂停时间"`
+	FreezeTime       time.Time `description:"冻结时间"`
+	Remark           string    `description:"备注信息"`
+	StartDate        string    `description:"开始日期"`
+	EndDate          string    `description:"结束日期"`
+	CreateTime       time.Time `description:"创建时间"`
+	ModifyTime       time.Time `description:"修改时间"`
+	LoseReason       string    `description:"流失原因"`
+	LossTime         time.Time `description:"流失时间"`
+	LogType          string    `description:"日志类型"`
+	LogCreateTime    time.Time `description:"日志创建时间"`
+	AdminId          int       `description:"操作人id"`
+	ApproveStatus    string    `description:"审批状态:'审批中','通过','驳回'"`
+	FreezeStartDate  string    `description:"冻结开始日期"`
+	FreezeEndDate    string    `description:"冻结结束日期"`
+}
+
+//新增客户产品
+func AddCompanyProductLog(item *CompanyProductLog) (err error) {
+	o := orm.NewOrm()
+	_, err = o.Insert(item)
+	return
+}

+ 390 - 0
models/tables/report/report.go

@@ -0,0 +1,390 @@
+package report
+
+import (
+	"rdluck_tools/orm"
+	"rdluck_tools/paging"
+	"time"
+)
+
+type Report struct {
+	Id                 int       `orm:"column(id)" description:"报告Id"`
+	AddType            int       `description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst    int       `description:"一级分类id"`
+	ClassifyNameFirst  string    `description:"一级分类名称"`
+	ClassifyIdSecond   int       `description:"二级分类id"`
+	ClassifyNameSecond string    `description:"二级分类名称"`
+	Title              string    `description:"标题"`
+	Abstract           string    `description:"摘要"`
+	Author             string    `description:"作者"`
+	Frequency          string    `description:"频度"`
+	CreateTime         string    `description:"创建时间"`
+	ModifyTime         time.Time `description:"修改时间"`
+	State              int       `description:"1:未发布,2:已发布"`
+	PublishTime        time.Time `description:"发布时间"`
+	Stage              int       `description:"期数"`
+	MsgIsSend          int       `description:"消息是否已发送,0:否,1:是"`
+	Content            string    `description:"内容"`
+	VideoUrl           string    `description:"音频文件URL"`
+	VideoName          string    `description:"音频文件名称"`
+	VideoPlaySeconds   string    `description:"音频播放时长"`
+	ContentSub         string    `description:"内容前两个章节"`
+}
+
+type ReportList struct {
+	Id                 int       `description:"报告Id"`
+	AddType            int       `description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst    int       `description:"一级分类id"`
+	ClassifyNameFirst  string    `description:"一级分类名称"`
+	ClassifyIdSecond   int       `description:"二级分类id"`
+	ClassifyNameSecond string    `description:"二级分类名称"`
+	Title              string    `description:"标题"`
+	Abstract           string    `description:"摘要"`
+	Author             string    `description:"作者"`
+	Frequency          string    `description:"频度"`
+	CreateTime         string    `description:"创建时间"`
+	ModifyTime         time.Time `description:"修改时间"`
+	State              int       `description:"1:未发布,2:已发布"`
+	PublishTime        string    `description:"发布时间"`
+	Stage              int       `description:"期数"`
+	MsgIsSend          int       `description:"消息是否已发送,0:否,1:是"`
+	Content            string    `description:"内容"`
+	VideoUrl           string    `description:"音频文件URL"`
+	VideoName          string    `description:"音频文件名称"`
+	VideoPlaySeconds   string    `description:"音频播放时长"`
+	ContentSub         string    `description:"内容前两个章节"`
+	Pv                 int       `description:"Pv"`
+	Uv                 int       `description:"Uv"`
+	ReportCode         string    `description:"报告唯一编码"`
+}
+
+type ReportListResp struct {
+	List   []*ReportList
+	Paging *paging.PagingItem `description:"分页数据"`
+}
+
+func GetReportListCount(condition string, pars []interface{}, companyType string) (count int, err error) {
+	o := orm.NewOrm()
+
+	//产品权限
+	companyTypeSqlStr := ``
+	if companyType == "ficc" {
+		companyTypeSqlStr = " AND classify_id_first != 40 "
+	} else if companyType == "权益" {
+		companyTypeSqlStr = " AND classify_id_first = 40 "
+	}
+
+	o.Using("rddp")
+	sql := `SELECT COUNT(1) AS count  FROM report WHERE 1=1 ` + companyTypeSqlStr
+	if condition != "" {
+		sql += condition
+	}
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+func GetReportList(condition string, pars []interface{}, companyType string, startSize, pageSize int) (items []*ReportList, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	//产品权限
+	companyTypeSqlStr := ``
+	if companyType == "ficc" {
+		companyTypeSqlStr = " AND classify_id_first != 40 "
+	} else if companyType == "权益" {
+		companyTypeSqlStr = " AND classify_id_first = 40 "
+	}
+
+	sql := `SELECT *,
+        (SELECT COUNT(1) FROM report_view_record AS rvr WHERE rvr.report_id=report.id) AS pv,
+        (SELECT COUNT(DISTINCT user_id) FROM report_view_record AS rvr WHERE rvr.report_id=report.id) AS uv
+        FROM report WHERE 1=1  ` + companyTypeSqlStr
+	if condition != "" {
+		sql += condition
+	}
+	sql += `ORDER BY  modify_time DESC LIMIT ?,?`
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+//发布报告
+func PublishReport(reportIds string) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `UPDATE report SET state=2,publish_time=now(),modify_time=NOW() WHERE id IN (` + reportIds + `)`
+	_, err = o.Raw(sql).Exec()
+	return
+}
+
+//取消发布报告
+func PublishCancleReport(reportIds int) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` UPDATE report SET state=1,publish_time=null WHERE id =?  `
+	_, err = o.Raw(sql, reportIds).Exec()
+	return
+}
+
+//删除报告
+func DeleteReport(reportIds int) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` DELETE FROM report WHERE id =? `
+	_, err = o.Raw(sql, reportIds).Exec()
+	return
+}
+
+type ReportDetail struct {
+	Id                 int    `orm:"column(id)" description:"报告Id"`
+	AddType            int    `description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst    int    `description:"一级分类id"`
+	ClassifyNameFirst  string `description:"一级分类名称"`
+	ClassifyIdSecond   int    `description:"二级分类id"`
+	ClassifyNameSecond string `description:"二级分类名称"`
+	Title              string `description:"标题"`
+	Abstract           string `description:"摘要"`
+	Author             string `description:"作者"`
+	Frequency          string `description:"频度"`
+	CreateTime         string `description:"创建时间"`
+	ModifyTime         string `description:"修改时间"`
+	State              int    `description:"1:未发布,2:已发布"`
+	PublishTime        string `description:"发布时间"`
+	Stage              int    `description:"期数"`
+	MsgIsSend          int    `description:"消息是否已发送,0:否,1:是"`
+	Content            string `description:"内容"`
+	VideoUrl           string `description:"音频文件URL"`
+	VideoName          string `description:"音频文件名称"`
+	VideoPlaySeconds   string `description:"音频播放时长"`
+	ContentSub         string `description:"内容前两个章节"`
+}
+
+func GetReportById(reportId int) (item *ReportDetail, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `SELECT * FROM report WHERE id=?`
+	err = o.Raw(sql, reportId).QueryRow(&item)
+	return
+}
+
+func GetReportStage(classifyIdFirst, classifyIdSecond int) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ``
+	if classifyIdSecond > 0 {
+		sql = "SELECT MAX(stage) AS max_stage FROM report WHERE classify_id_second=? "
+		o.Raw(sql, classifyIdSecond).QueryRow(&count)
+	} else {
+		sql = "SELECT MAX(stage) AS max_stage FROM report WHERE classify_id_first=? "
+		o.Raw(sql, classifyIdFirst).QueryRow(&count)
+	}
+	return
+}
+
+func GetReportStageEdit(classifyIdFirst, classifyIdSecond, reportId int) (count int, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ``
+	if classifyIdSecond > 0 {
+		sql = "SELECT MAX(stage) AS max_stage FROM report WHERE classify_id_second=? AND id<>? "
+		o.Raw(sql, classifyIdSecond, reportId).QueryRow(&count)
+	} else {
+		sql = "SELECT MAX(stage) AS max_stage FROM report WHERE classify_id_first=? AND id<>? "
+		o.Raw(sql, classifyIdFirst, reportId).QueryRow(&count)
+	}
+	return
+}
+
+type PublishReq struct {
+	ReportIds string `description:"报告id,多个用英文逗号隔开"`
+}
+
+type PublishCancelReq struct {
+	ReportIds int `description:"报告id,多个用英文逗号隔开"`
+}
+
+type DeleteReq struct {
+	ReportIds int `description:"报告id"`
+}
+
+type AddReq struct {
+	AddType            int    `description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst    int    `description:"一级分类id"`
+	ClassifyNameFirst  string `description:"一级分类名称"`
+	ClassifyIdSecond   int    `description:"二级分类id"`
+	ClassifyNameSecond string `description:"二级分类名称"`
+	Title              string `description:"标题"`
+	Abstract           string `description:"摘要"`
+	Author             string `description:"作者"`
+	Frequency          string `description:"频度"`
+	State              int    `description:"状态:1:未发布,2:已发布"`
+	Content            string `description:"内容"`
+	CreateTime         string `description:"创建时间"`
+}
+
+type AddResp struct {
+	ReportId   int64  `description:"报告id"`
+	ReportCode string `description:"报告code"`
+}
+
+func AddReport(item *Report) (lastId int64, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	lastId, err = o.Insert(item)
+	return
+}
+
+type EditReq struct {
+	ReportId           int64  `description:"报告id"`
+	ClassifyIdFirst    int    `description:"一级分类id"`
+	ClassifyNameFirst  string `description:"一级分类名称"`
+	ClassifyIdSecond   int    `description:"二级分类id"`
+	ClassifyNameSecond string `description:"二级分类名称"`
+	Title              string `description:"标题"`
+	Abstract           string `description:"摘要"`
+	Author             string `description:"作者"`
+	Frequency          string `description:"频度"`
+	State              int    `description:"状态:1:未发布,2:已发布"`
+	Content            string `description:"内容"`
+	CreateTime         string `description:"创建时间"`
+}
+
+type EditResp struct {
+	ReportId   int64  `description:"报告id"`
+	ReportCode string `description:"报告code"`
+}
+
+func EditReport(item *Report, reportId int64) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `UPDATE report
+			SET
+			  classify_id_first =?,
+			  classify_name_first = ?,
+			  classify_id_second = ?,
+			  classify_name_second = ?,
+			  title = ?,
+			  abstract = ?,
+			  author = ?,
+			  frequency = ?,
+			  state = ?,
+			  content = ?,
+			  content_sub = ?,
+              stage=?,
+			  modify_time = ?
+			WHERE id = ? `
+	_, err = o.Raw(sql, item.ClassifyIdFirst, item.ClassifyNameFirst, item.ClassifyIdSecond, item.ClassifyNameSecond, item.Title,
+		item.Abstract, item.Author, item.Frequency, item.State, item.Content, item.ContentSub, item.Stage, time.Now(), reportId).Exec()
+	return
+}
+
+type ReportDetailReq struct {
+	ReportId int `description:"报告id"`
+}
+
+type ClassifyIdDetailReq struct {
+	ClassifyIdFirst  int `description:"报告一级分类id"`
+	ClassifyIdSecond int `description:"报告二级分类id"`
+}
+
+func GetReportDetailByClassifyId(classifyIdFirst, classifyIdSecond int) (item *Report, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` SELECT * FROM report WHERE 1=1 `
+	if classifyIdSecond > 0 {
+		sql = sql + ` AND classify_id_second=?   ORDER BY stage DESC LIMIT 1`
+		err = o.Raw(sql, classifyIdSecond).QueryRow(&item)
+	} else {
+		sql = sql + ` AND classify_id_first=?   ORDER BY stage DESC LIMIT 1`
+		err = o.Raw(sql, classifyIdFirst).QueryRow(&item)
+	}
+	return
+}
+
+type SendTemplateMsgReq struct {
+	ReportId int `description:"报告id"`
+}
+
+func ModifyReportMsgIsSend(reportId int) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	report, err := GetReportById(reportId)
+	if err != nil {
+		return
+	}
+	if report.MsgIsSend == 0 {
+		sql := `UPDATE report SET msg_is_send = 1 WHERE id = ? `
+		_, err = o.Raw(sql, reportId).Exec()
+	}
+	return
+}
+
+func ModifyReportVideo(reportId int, videoUrl, videoName, videoSize string, playSeconds float64) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `UPDATE report SET video_url=?,video_name=?,video_play_seconds=?,video_size=? WHERE id=? `
+	_, err = o.Raw(sql, videoUrl, videoName, playSeconds, videoSize, reportId).Exec()
+	return
+}
+
+type ReportItem struct {
+	Id                 int       `orm:"column(id)" description:"报告Id"`
+	AddType            int       `description:"新增方式:1:新增报告,2:继承报告"`
+	ClassifyIdFirst    int       `description:"一级分类id"`
+	ClassifyNameFirst  string    `description:"一级分类名称"`
+	ClassifyIdSecond   int       `description:"二级分类id"`
+	ClassifyNameSecond string    `description:"二级分类名称"`
+	Title              string    `description:"标题"`
+	Abstract           string    `description:"摘要"`
+	Author             string    `description:"作者"`
+	Frequency          string    `description:"频度"`
+	CreateTime         time.Time `description:"创建时间"`
+	ModifyTime         time.Time `description:"修改时间"`
+	State              int       `description:"1:未发布,2:已发布"`
+	PublishTime        time.Time `description:"发布时间"`
+	Stage              int       `description:"期数"`
+	MsgIsSend          int       `description:"消息是否已发送,0:否,1:是"`
+	Content            string    `description:"内容"`
+	VideoUrl           string    `description:"音频文件URL"`
+	VideoName          string    `description:"音频文件名称"`
+	VideoPlaySeconds   string    `description:"音频播放时长"`
+	ContentSub         string    `description:"内容前两个章节"`
+}
+
+func GetReportItemById(reportId int) (item *ReportItem, err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `SELECT * FROM report WHERE id=?`
+	err = o.Raw(sql, reportId).QueryRow(&item)
+	return
+}
+
+type SaveReportContent struct {
+	Content  string `description:"内容"`
+	ReportId int    `description:"报告id"`
+}
+
+func EditReportContent(reportId int, content, contentSub string) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` UPDATE report SET content=?,content_sub=?,modify_time=NOW() WHERE id=? `
+	_, err = o.Raw(sql, content, contentSub, reportId).Exec()
+	return
+}
+
+func AddReportSaveLog(reportId int, content, contentSub string) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := ` INSERT INTO report_save_log(report_id, content,content_sub) VALUES (?,?,?) `
+	_, err = o.Raw(sql, reportId, content, contentSub).Exec()
+	return
+}
+
+type SaveReportContentResp struct {
+	ReportId int `description:"报告id"`
+}
+
+func ModifyReportCode(reportId int64, reportCode string) (err error) {
+	o := orm.NewOrm()
+	o.Using("rddp")
+	sql := `UPDATE report SET report_code=? WHERE id=? `
+	_, err = o.Raw(sql, reportCode, reportId).Exec()
+	return
+}

+ 36 - 0
models/tables/wx_user/wx_user.go

@@ -0,0 +1,36 @@
+package wx_user
+
+import (
+	"rdluck_tools/orm"
+)
+
+type OpenIdList struct {
+	OpenId string
+}
+
+//获取所有的用户openid列表
+func GetOpenIdList(openIdStr string) (items []*OpenIdList, err error) {
+	sql := `SELECT DISTINCT ur.open_id FROM wx_user AS wu 
+          INNER JOIN company AS c ON c.company_id = wu.company_id 
+          INNER JOIN company_product AS d ON c.company_id=d.company_id
+		INNER join user_record  as ur on wu.user_id=ur.user_id
+          WHERE ur.open_id != "" and ur.create_platform=1 AND  d.status IN('正式','试用','永续') `
+	if openIdStr != "" {
+		sql += ` AND ur.open_id in (` + openIdStr + `) `
+	}
+	_, err = orm.NewOrm().Raw(sql).QueryRows(&items)
+	return
+}
+
+//根据手机号获取用户的openid列表
+func GetOpenIdListByMobile(mobile, openIdStr string) (items []*OpenIdList, err error) {
+	sql := `SELECT DISTINCT ur.open_id FROM wx_user AS wu 
+          INNER JOIN company AS c ON c.company_id = wu.company_id 
+          INNER join user_record  as ur on wu.user_id=ur.user_id
+          WHERE ur.open_id != "" and ur.create_platform=1 AND wu.mobile=? `
+	if openIdStr != "" {
+		sql += ` AND ur.open_id in (` + openIdStr + `) `
+	}
+	_, err = orm.NewOrm().Raw(sql, mobile).QueryRows(&items)
+	return
+}

+ 4 - 0
routers/router.go

@@ -1,6 +1,7 @@
 // @APIVersion 1.0.0
 // @Title 弘则手机端管理后台接口
 // @Description 这是弘则手机端管理后台接口api文档,统一出、入参;出参格式:{"code":200,"data":{},"msg":"操作成功","errMsg":"开发人员查看的错误信息"},code是业务响应码,200 代表正常返回;400 代表业务处理失败,前端同学需要做额外逻辑处理;401 代表token异常,用户需要重新静默授权,获取最新的token;403代表用户需要进行绑定操作,需要跳转到输入账号密码绑定页面。同时如果出现其他返回值(没有在约定范围内),那么及时联系后端同事;msg是用来提示前端同学,一般只在code为 400 的情况下才会展示给用户去看;data是业务返回数据,给前端做逻辑处理。
+// 除了微信静默授权接口,其他所有接口请求都必须在header中携带token
 // @Contact astaxie@gmail.com
 // @TermsOfServiceUrl http://beego.me/
 // @License Apache 2.0
@@ -30,6 +31,9 @@ func init() {
 				&controllers.ApprovalCommon{},
 			),
 		),
+		beego.NSInclude(
+			&controllers.ContractCommon{},
+		),
 	)
 	beego.AddNamespace(ns)
 }

+ 0 - 0
service/admin.go → services/admin.go


+ 29 - 0
service/company.go → services/company.go

@@ -1,7 +1,9 @@
 package services
 
 import (
+	"hongze/hongze_mobile_admin/models/tables/company_operation_record"
 	"hongze/hongze_mobile_admin/utils"
+	"time"
 )
 
 //获取产品权限
@@ -43,3 +45,30 @@ func CheckCompanyUserButton(roleTypeCode string, itemSellerId, sysUserId, produc
 	}
 	return
 }
+
+//添加操作日志
+func AddCompanyOperationRecord(companyId, sellerId, 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(company_operation_record.CompanyOperationRecord)
+	record.CompanyId = companyId
+	record.CompanyName = companyName
+	record.SellerId = sellerId
+	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 = company_operation_record.AddCompanyOperationRecord(record)
+	return
+}

+ 40 - 0
services/company_approval_message.go

@@ -0,0 +1,40 @@
+package services
+
+import (
+	"fmt"
+	"hongze/hongze_mobile_admin/models/tables/company_approval_message"
+	"time"
+)
+
+func AddCompanyApprovalMessage(createUserId, receiveUserId, companyId, companyApprovalId, msgType int, companyName, remark, content, mobile string) (err error) {
+	var err1 error
+	defer func() {
+		if err != nil {
+			fmt.Println("AddCompanyApprovalMessage Err:", err)
+		}
+		if err1 != nil {
+			fmt.Println("ModifyCompanyApprovalMessage Err:", err)
+		}
+	}()
+	if msgType == 2 {
+		company_approval_message.ModifyCompanyApprovalMessage(companyApprovalId)
+	}
+	msgItem := new(company_approval_message.CompanyApprovalMessage)
+	msgItem.CreateUserId = createUserId
+	msgItem.ReceiveUserId = receiveUserId
+	msgItem.MessageStatus = 0
+	msgItem.Remark = remark
+	msgItem.Content = content
+	msgItem.CompanyId = companyId
+	msgItem.CompanyName = companyName
+	msgItem.CreateTime = time.Now()
+	msgItem.ModifyTime = time.Now()
+	msgItem.CompanyApprovalId = companyApprovalId
+	msgItem.OperationStatus = 1
+	msgItem.MessageType = msgType
+	err = company_approval_message.AddCompanyApprovalMessage(msgItem)
+	if mobile != "" {
+		go SendCompanyApplyWxTemplateMsg(mobile, content)
+	}
+	return
+}

+ 45 - 0
service/wechat.go → services/wechat.go

@@ -174,3 +174,48 @@ type WxUserDetail struct {
 	Headimgurl string
 	Nickname   string
 }
+
+//微信接口基础返回数据
+type WxBase struct {
+	Errcode int
+	Errmsg  string
+}
+
+//微信用户数据
+type WxUsers struct {
+	WxBase
+	Total int
+	Count int
+	Data  struct {
+		Openid []string
+	}
+	NextOpenid string
+}
+
+func WxUsersGet() (openIdStr string) {
+	accessToken, err := WxGetAccessToken()
+	if err != nil {
+		utils.FileLog.Info("GetWxAccessToken Err:%s", err.Error())
+		return
+	}
+	url := "https://api.weixin.qq.com/cgi-bin/user/get?access_token=" + accessToken
+	result, err := http.Get(url)
+	if err != nil {
+		utils.FileLog.Info("GetUser Err:", err.Error())
+		return
+	}
+	item := new(WxUsers)
+	err = json.Unmarshal(result, &item)
+	if err != nil {
+		fmt.Println("Unmarshal Err:", err.Error())
+		return
+	}
+	if item.Errcode != 0 {
+		utils.FileLog.Info("微信接口返回异常 Err:", item.Errmsg)
+		return
+	}
+	err = errors.New(item.Errmsg)
+	openIdStr = strings.Join(item.Data.Openid, "','")
+	openIdStr = "'" + openIdStr + "'"
+	return
+}

+ 191 - 0
services/wechat_send_msg.go

@@ -0,0 +1,191 @@
+package services
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"hongze/hongze_mobile_admin/models/tables/report"
+	"hongze/hongze_mobile_admin/models/tables/wx_user"
+	"hongze/hongze_mobile_admin/utils"
+	"io/ioutil"
+	"net/http"
+	"strconv"
+	"time"
+)
+
+func SendWxTemplateMsg(reportId int) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	utils.FileLog.Info("%s", "services SendMsg")
+
+	report, err := report.GetReportById(reportId)
+	if err != nil {
+		msg = "GetReportInfo Err:" + err.Error()
+		return
+	}
+	if report == nil {
+		utils.FileLog.Info("报告信息不存在")
+		return
+	}
+	accessToken, err := WxGetAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	//获取openid列表
+	openIdStr := WxUsersGet()
+	openIdList, err := wx_user.GetOpenIdList(openIdStr)
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
+	}
+	fmt.Println("openIdListCount:", len(openIdList))
+	sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+	fmt.Println("send start")
+	utils.FileLog.Info("send start")
+	//if report.MsgIsSend == 0 {
+	sendMap := make(map[string]interface{})
+	sendData := make(map[string]interface{})
+
+	redirectUrl := utils.TemplateRedirectUrl + strconv.Itoa(reportId)
+	keyword1 := "弘则日度点评"
+	first := "Hi,最新一期日度点评已上线,欢迎查看"
+	keyword2 := report.Title
+	//keyword3 := report.PublishTime.Format(utils.FormatDateTime)
+	keyword3 := report.PublishTime
+	keyword4 := report.Abstract
+
+	sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+	sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+	sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+	sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+	sendData["keyword4"] = map[string]interface{}{"value": keyword4, "color": "#173177"}
+
+	sendMap["template_id"] = utils.TemplateIdByProduct
+	sendMap["url"] = redirectUrl
+	sendMap["data"] = sendData
+	sendTemplateMsg(sendUrl, sendMap, openIdList)
+	//}
+	fmt.Println("send end")
+	utils.FileLog.Info("send end")
+	return
+}
+
+func sendTemplateMsg(sendUrl string, sendMap map[string]interface{}, items []*wx_user.OpenIdList) (err error) {
+	for _, v := range items {
+		sendMap["touser"] = v.OpenId
+		data, err := json.Marshal(sendMap)
+		if err != nil {
+			fmt.Println("SendTemplateMsgOne Marshal Err:", err.Error())
+			utils.FileLog.Info("SendTemplateMsgOne Marshal Err:%s", err.Error())
+			return err
+		}
+		err = toSendTemplateMsg(sendUrl, data)
+		if err != nil {
+			fmt.Println("send err:", err.Error())
+			utils.FileLog.Info("ToSendTemplateMsg Err:%s", err.Error())
+		}
+	}
+	return
+}
+
+func toSendTemplateMsg(sendUrl string, data []byte) (err error) {
+	utils.FileLog.Info("Send:%s", string(data))
+	client := http.Client{}
+	resp, err := client.Post(sendUrl, "application/json", bytes.NewBuffer(data))
+	if err != nil {
+		return
+	}
+	defer resp.Body.Close()
+
+	body, _ := ioutil.ReadAll(resp.Body)
+	utils.FileLog.Info("SendResult:%s", string(body))
+	var templateResponse SendTemplateResponse
+	err = json.Unmarshal(body, &templateResponse)
+	if err != nil {
+		utils.FileLog.Info("SendResult Unmarshal Err:%s", err.Error())
+		return err
+	}
+	return
+}
+
+type SendTemplateResponse struct {
+	Errcode int    `json:"errcode"`
+	Errmsg  string `json:"errmsg"`
+	MsgID   int    `json:"msgid"`
+}
+
+func SendCompanyApplyWxTemplateMsg(mobile, applyType string) (err error) {
+	var msg string
+	defer func() {
+		if err != nil {
+			go utils.SendEmail("发送模版消息失败"+time.Now().Format("2006-01-02 15:04:05"), msg+";Err:"+err.Error(), utils.EmailSendToUsers)
+			utils.FileLog.Info("发送模版消息失败,Err:%s,%s", err.Error(), msg)
+		}
+		if msg != "" {
+			utils.FileLog.Info("发送模版消息失败,msg:%s", msg)
+		}
+	}()
+	utils.FileLog.Info("%s", "services SendMsg")
+
+	accessToken, err := WxGetAccessToken()
+	if err != nil {
+		msg = "GetWxAccessToken Err:" + err.Error()
+		return
+	}
+	if accessToken == "" {
+		msg = "accessToken is empty"
+		return
+	}
+	utils.FileLog.Info("mobile:%s", mobile)
+
+	//获取openid列表
+	openIdStr := WxUsersGet()
+	openIdList, err := wx_user.GetOpenIdListByMobile(mobile, openIdStr)
+	if err != nil {
+		msg = "get openIdList err:" + err.Error()
+		return
+	}
+	utils.FileLog.Info("openIdListCount:%s", len(openIdList))
+	//fmt.Println("openIdListCount:", len(openIdList))
+	if len(openIdList) > 0 && utils.TemplateIdByCompanyApply != "" {
+		utils.FileLog.Info("start send")
+		sendUrl := "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + accessToken
+		fmt.Println("send start")
+		utils.FileLog.Info("send start")
+		sendMap := make(map[string]interface{})
+		sendData := make(map[string]interface{})
+
+		redirectUrl := "" //utils.TemplateRedirectUrl + strconv.Itoa(reportId)
+		keyword1 := applyType
+		first := "Hi,有新的订单需要审批"
+		keyword2 := time.Now().Format(utils.FormatDateTime)
+		keyword3 := ""
+		remark := ""
+
+		sendData["first"] = map[string]interface{}{"value": first, "color": "#173177"}
+		sendData["keyword1"] = map[string]interface{}{"value": keyword1, "color": "#173177"}
+		sendData["keyword2"] = map[string]interface{}{"value": keyword2, "color": "#173177"}
+		sendData["keyword3"] = map[string]interface{}{"value": keyword3, "color": "#173177"}
+		sendData["remark"] = map[string]interface{}{"value": remark, "color": "#173177"}
+
+		sendMap["template_id"] = utils.TemplateIdByCompanyApply
+		sendMap["url"] = redirectUrl
+		sendMap["data"] = sendData
+		sendTemplateMsg(sendUrl, sendMap, openIdList)
+	}
+	utils.FileLog.Info("send end")
+	return
+}

+ 9 - 6
utils/config.go

@@ -13,12 +13,13 @@ var (
 
 //微信配置信息
 var (
-	WxId                string //微信原始ID
-	WxAppId             string
-	WxAppSecret         string
-	TemplateIdByProduct string //产品运行报告通知-模板ID
-	TemplateRedirectUrl string //模板消息跳转地址
-	WxPlatform          int    //用户来源,需要入库,用来保存该用户来自哪个平台,默认是:1
+	WxId                     string //微信原始ID
+	WxAppId                  string
+	WxAppSecret              string
+	TemplateIdByProduct      string //产品运行报告通知-模板ID
+	TemplateRedirectUrl      string //模板消息跳转地址
+	WxPlatform               int    //用户来源,需要入库,用来保存该用户来自哪个平台,默认是:1
+	TemplateIdByCompanyApply string //客户申请单审批通知-模板ID
 )
 
 func init() {
@@ -38,6 +39,7 @@ func init() {
 		TemplateIdByProduct = "Cp2wF8gvBtxyWV4DeYuI172oqwyYXVRSm3AyJO42d84"
 		TemplateRedirectUrl = "https://ficc.hzinsights.com/reportdtl?id="
 		WxPlatform = 1
+		TemplateIdByCompanyApply = "ZKcOfNIWBpwHJxpptufHIK1mp2nIwkT3cxub-35cFqI"
 	} else {
 		WxAppId = "wx9b5d7291e581233a"
 		WxAppSecret = "f4d52e34021eee262dce9682b31f8861"
@@ -45,6 +47,7 @@ func init() {
 		TemplateIdByProduct = "-YjuPOB7Fqd-S3ilabYa6wvjDY9aXmeEfPN6DCiy-EY"
 		TemplateRedirectUrl = "http://rddpweb.brilliantstart.cn/reportdtl?id="
 		WxPlatform = 1
+		TemplateIdByCompanyApply = "eTalI1LbiT_B0mTaBeDTlfSMITenK8dQIgEB5yqjjvA"
 	}
 }