瀏覽代碼

fix 客户审批流程调整

Roc 3 年之前
父節點
當前提交
056b99ce27

+ 4 - 4
controllers/approval.go

@@ -151,8 +151,8 @@ func (this *ApprovalCommon) List() {
 // @Description 获取审批单详情接口
 // @Param   ApprovalId   query   int  true       "审批单id"
 // @Success 200 {object} approval.CompanyApprovalDetailResp
-// @router /detail [get]
-func (this *ApprovalCommon) Detail() {
+// @router /detail_old [get]
+func (this *ApprovalCommon) DetailOld() {
 	sysUser := this.AdminWx
 	roleTypeCode := sysUser.RoleTypeCode
 
@@ -397,8 +397,8 @@ func (this *ApprovalCommon) GetApprovalPermissionList() {
 // @Description 审批接口
 // @Param	request	body approval.CompanyApplyApproveReq true "type json string"
 // @Success Ret=200 审批成功
-// @router /approve [post]
-func (this *ApprovalCommon) ApplyApprove() {
+// @router /approve_old [post]
+func (this *ApprovalCommon) ApplyApproveOld() {
 	sysUser := this.AdminWx
 	var req approval2.CompanyApplyApproveReq
 	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)

+ 497 - 0
controllers/approval_new.go

@@ -0,0 +1,497 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	approval2 "hongze/hongze_mobile_admin/models/request/approval"
+	approvalResp "hongze/hongze_mobile_admin/models/response/approval"
+	"hongze/hongze_mobile_admin/models/tables/company_approval"
+	"hongze/hongze_mobile_admin/models/tables/company_delay_permission"
+	"hongze/hongze_mobile_admin/models/tables/company_product"
+	"hongze/hongze_mobile_admin/models/tables/company_report_permission"
+	"hongze/hongze_mobile_admin/models/tables/contract"
+	"hongze/hongze_mobile_admin/models/tables/contract_approval"
+	"hongze/hongze_mobile_admin/models/tables/contract_approval_record"
+	"hongze/hongze_mobile_admin/services"
+	company_apply "hongze/hongze_mobile_admin/services/company_approval"
+	"hongze/hongze_mobile_admin/utils"
+	"rdluck_tools/paging"
+	"strconv"
+	"strings"
+	"time"
+)
+
+// ListV2
+// @Title 获取审批列表接口
+// @Description 获取审批列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Status   query   string  true       "状态:'待审批','已审批','驳回','已撤回'"
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Param   Keyword   query   string  true       "搜索关键词"
+// @Param   KeywordEq   query   string  true       "搜索关键词(全等)"
+// @Success 200 {object} approval.CompanyApprovalListResp
+// @router /listV2 [get]
+func (this *ApprovalCommon) ListV2() {
+	sysUser := this.AdminWx
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	status := this.GetString("Status")
+	keyword := this.GetString("Keyword")
+	keywordEq := this.GetString("KeywordEq")
+
+	condition := ""
+	pars := make([]interface{}, 0)
+	////如果不是超管或者合规,那么只能查看自己的合同
+	//join表字段
+	//归属
+	if status == "待审批" {
+		condition += ` AND ((c.apply_user_id = ? and a.start_node_id = a.curr_node_id) OR (d.approve_user_id = ? )) and d.approve_status="待审批" `
+		//condition += ` AND (c.user_id = ?  OR d.approve_user_id = ?) and (d.approve_user_id is null or d.approve_user_id = c.user_id)`
+
+	} else if status == "处理中" {
+		condition += ` AND ((c.apply_user_id = ? and a.start_node_id != a.curr_node_id) OR (d.approve_user_id = ? )) and c.approve_status="待审批" `
+	} else {
+		condition += ` AND (c.apply_user_id = ? or d.approve_user_id = ?)`
+	}
+	pars = append(pars, sysUser.AdminId, sysUser.AdminId)
+
+	//审批状态
+	if status != "" {
+		if status == "已审批" {
+			condition += ` AND c.approve_status in ("已审批","驳回")  `
+		} else {
+			condition += ` AND c.approve_status = ? `
+			if status == "处理中" {
+				pars = append(pars, "待审批")
+			} else {
+				pars = append(pars, status)
+			}
+		}
+	} else {
+		condition += ` AND c.approve_status  != "已撤回"  `
+	}
+
+	//关键字
+	if keyword != "" {
+		condition += ` AND ( c.company_name LIKE '%` + keyword + `%' OR c.credit_code LIKE '%` + keyword + `%' ) `
+	}
+	//关键字(全等)
+	if keywordEq != "" {
+		condition += ` AND  c.company_name =? `
+		pars = append(pars, keywordEq, keywordEq)
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	total, err := contract_approval.GetCompanyApprovalCount(condition, pars)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取数据总数失败,Err:"+err.Error())
+		return
+	}
+
+	list, err := contract_approval.GetCompanyApprovalList(condition, pars, startSize, pageSize)
+	if err != nil {
+		this.FailWithMessage("获取审批列表失败!", "获取审批列表失败,Err:"+err.Error())
+		return
+	}
+
+	respList := make([]*company_approval.CompanyApprovalList, 0)
+
+	listLen := len(list)
+	if listLen > 0 {
+		contractApprovalIdSlice := make([]string, 0)
+		for i := 0; i < len(list); i++ {
+			contractApprovalIdSlice = append(contractApprovalIdSlice, strconv.Itoa(list[i].ContractApprovalId))
+		}
+		contractApprovalIdStr := strings.Join(contractApprovalIdSlice, ",")
+
+		//获取审批流列表数据
+		contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordList(contractApprovalIdStr, sysUser.AdminId)
+		if err != nil {
+			this.FailWithMessage("获取审批流列表失败!", "获取审批流列表失败,Err:"+err.Error())
+			return
+		}
+		contractApprovalRecordMap := make(map[int]*contract_approval_record.ContractApprovalRecord)
+		for i := 0; i < len(contractApprovalRecordList); i++ {
+			contractApprovalRecordMap[contractApprovalRecordList[i].ContractApprovalId] = contractApprovalRecordList[i]
+		}
+
+		for i := 0; i < len(list); i++ {
+			item := list[i]
+			list[i].StartDateStr = item.StartDate.Format(utils.FormatDate)
+			list[i].EndDateStr = item.EndDate.Format(utils.FormatDate)
+			list[i].CreateTimeStr = item.CreateTime.Format(utils.FormatDateTime)
+			list[i].ModifyTimeStr = item.ModifyTime.Format(utils.FormatDateTime)
+			list[i].ApproveTimeStr = item.ApproveTime.Format(utils.FormatDateTime)
+
+			//合同审批权限
+			ApprovalButton := false
+			var contractDetail contract.ContractDetail
+			jsonErr := json.Unmarshal([]byte(list[i].ContractDetail), &contractDetail)
+			if jsonErr != nil {
+				this.FailWithMessage("审批合同数据转换失败!", "审批合同数据转换失败,Err:"+jsonErr.Error())
+				return
+			}
+			list[i].ContractInfo = contractDetail
+			//校验最新审批流数据
+			if contractApprovalRecord, has := contractApprovalRecordMap[item.ContractApprovalId]; has {
+				//审批流id
+				list[i].ContractApprovalRecordId = contractApprovalRecord.ContractApprovalRecordId
+				//审批时间
+				list[i].ApproveTime = contractApprovalRecord.ApproveTime
+				list[i].ApproveTimeStr = contractApprovalRecord.ApproveTime.Format(utils.FormatDateTime)
+				//判断是否有操作权限
+				list[i].Status = contractApprovalRecord.Status
+
+				fmt.Println("contractApprovalRecord.Status:", contractApprovalRecord.Status)
+				//判断是否处于待审批状态
+				if contractApprovalRecord.Status == "待审批" {
+					//如果不是审批者,那么不能审批操作
+					if contractApprovalRecord.NodeType != "check" {
+						continue
+					}
+					//如果没有指定审批人的话
+					if contractApprovalRecord.ApproveUserId <= 0 {
+						//判断是否与审批角色一致,如果一致,那么允许操作审批
+						if contractApprovalRecord.ApproveRoleTypeCode == sysUser.RoleTypeCode {
+							ApprovalButton = true
+						}
+					} else if contractApprovalRecord.ApproveUserId == sysUser.AdminId {
+						//如果指定审批人就是自己的话,那么操作审批
+						ApprovalButton = true
+					}
+				}
+			}
+
+			//撤销权限(本人才有,然后没有审核操作过的才允许撤销)
+			//if item.Status == "待审批" && item.StartNodeId == item.CurrNodeId && item.ApplyUserId == sysUser.AdminId {
+			//	opButton.Cancel = true
+			//}
+
+			respTmp := &company_approval.CompanyApprovalList{
+				CompanyId:         item.CompanyId,
+				ProductId:         item.ProductId,
+				CompanyName:       item.CompanyName,
+				CreditCode:        item.CreditCode,
+				CompanyType:       item.CompanyType,
+				IndustryName:      item.IndustryName,
+				SellerName:        item.SellerName,
+				CreateTime:        item.CreateTimeStr,
+				ApprovalTime:      item.CreateTime.Format(utils.FormatDateTime),
+				ApproveTime:       item.ApproveTimeStr,
+				Status:            item.CompanyProductStatus,
+				ApproveContent:    item.ApplyContent,
+				ApproveStatus:     item.ApproveStatus,
+				ApplyMethod:       item.ApplyMethod,
+				ApplyReasons:      item.ApplyReasons,
+				FreezeStartDate:   item.FreezeStartDate,
+				FreezeEndDate:     item.FreezeEndDate,
+				FreezeExpireDays:  item.FreezeExpireDays,
+				Address:           item.Address,
+				Source:            item.Source,
+				ApproveRemark:     item.ApproveRemark,
+				StartDate:         item.StartDate.Format(utils.FormatDate),
+				EndDate:           item.EndDate.Format(utils.FormatDate),
+				ExpireDay:         item.ExpireDay,
+				CompanyApprovalId: item.CompanyApprovalId,
+				//ApprovalCount     int            `description:"已延期审批次数"`
+				CompanyContractId: item.CompanyContractId,
+				//DelayPermission   :
+				ApplyRealName: item.ApplyRealName,
+				OpButton:      ApprovalButton,
+			}
+
+			if respTmp.FreezeStartDate != "" && respTmp.FreezeEndDate != "" && respTmp.Status == utils.COMPANY_STATUS_FREEZE {
+				freezeEndDate, _ := time.Parse(utils.FormatDate, item.FreezeEndDate)
+				if time.Now().Before(freezeEndDate) {
+					expireDays := freezeEndDate.Sub(time.Now()).Hours() / 24
+					respTmp.FreezeExpireDays = int(expireDays)
+				}
+			}
+			if respTmp.StartDate != "" && respTmp.EndDate != "" {
+				endDate, _ := time.Parse(utils.FormatDate, respTmp.EndDate)
+				if time.Now().Before(endDate) {
+					expireDays := endDate.Sub(time.Now()).Hours() / 24
+					list[i].ExpireDay = int(expireDays)
+				}
+			}
+
+			approvalCount, err := company_approval.GetCompanyApprovalCount(item.CompanyId, item.ProductId)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				this.FailWithMessage("获取失败", "获取延期审批次数失败,Err:"+err.Error())
+				return
+			}
+			respTmp.ApprovalCount = approvalCount
+
+			if respTmp.ApplyMethod == 3 {
+				delayPermission, err := company_delay_permission.GetApplyDelayPermission(item.CompanyApprovalId)
+				if err != nil && err.Error() != utils.ErrNoRow() {
+					this.FailWithMessage("获取失败", "获取延期审批权限失败,Err:"+err.Error())
+					return
+				}
+				respTmp.DelayPermission = delayPermission
+			}
+			respList = append(respList, respTmp)
+		}
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	this.OkDetailed(approvalResp.CompanyApprovalListResp{
+		List:   respList,
+		Paging: page,
+	}, "获取成功")
+}
+func (this *ApprovalCommon) ListNew() {
+	sysUser := this.AdminWx
+	roleTypeCode := sysUser.RoleTypeCode
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	status := this.GetString("Status")
+	keyword := this.GetString("Keyword")
+	keywordEq := this.GetString("KeywordEq")
+	keyWord := this.GetString("KeyWord")
+	if keyword == "" {
+		keyword = keyWord
+	}
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	var condition string
+	var pars []interface{}
+
+	if status != "" {
+		if status == "已审批" {
+			condition += ` AND c.approve_status IN('已审批','驳回') `
+		} else {
+			condition += ` AND c.approve_status=? `
+			pars = append(pars, status)
+		}
+	}
+
+	if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { //审批
+		condition += ` AND c.approve_role_type_code=? `
+		pars = append(pars, roleTypeCode)
+	} else if roleTypeCode == utils.ROLE_TYPE_CODE_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_COMPLIANCE { //超管或者合规
+
+	} else { //销售
+		condition += ` AND c.apply_user_id=? `
+		pars = append(pars, sysUser.AdminId)
+	}
+
+	if keyword != "" {
+		condition += ` AND (a.company_name LIKE '%` + keyword + `%' OR a.credit_code LIKE '%` + keyword + `%') `
+	}
+	if keywordEq != "" {
+		condition += ` AND a.company_name = ? `
+		pars = append(pars, keywordEq)
+	}
+
+	total, err := company_approval.GetApprovalCount(condition, pars)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取数据总数失败,Err:"+err.Error())
+		return
+	}
+
+	list, err := company_approval.GetApprovalList(condition, pars, startSize, pageSize)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取数据失败,Err:"+err.Error())
+		return
+	}
+	listLen := len(list)
+	for i := 0; i < listLen; i++ {
+		item := list[i]
+		if item.FreezeStartDate != "" && item.FreezeEndDate != "" && item.Status == utils.COMPANY_STATUS_FREEZE {
+			freezeEndDate, _ := time.Parse(utils.FormatDate, item.FreezeEndDate)
+			if time.Now().Before(freezeEndDate) {
+				expireDays := freezeEndDate.Sub(time.Now()).Hours() / 24
+				list[i].FreezeExpireDays = int(expireDays)
+			}
+		}
+		if item.StartDate != "" && item.EndDate != "" {
+			endDate, _ := time.Parse(utils.FormatDate, item.EndDate)
+			if time.Now().Before(endDate) {
+				expireDays := endDate.Sub(time.Now()).Hours() / 24
+				list[i].ExpireDay = int(expireDays)
+			}
+		}
+
+		approvalCount, err := company_approval.GetCompanyApprovalCount(item.CompanyId, item.ProductId)
+		if err != nil && err.Error() != utils.ErrNoRow() {
+			this.FailWithMessage("获取失败", "获取延期审批次数失败,Err:"+err.Error())
+			return
+		}
+		list[i].ApprovalCount = approvalCount
+
+		if item.ApplyMethod == 3 {
+			delayPermission, err := company_delay_permission.GetApplyDelayPermission(item.CompanyApprovalId)
+			if err != nil && err.Error() != utils.ErrNoRow() {
+				this.FailWithMessage("获取失败", "获取延期审批权限失败,Err:"+err.Error())
+				return
+			}
+			list[i].DelayPermission = delayPermission
+		}
+		if item.ApproveRoleTypeCode == roleTypeCode {
+			list[i].OpButton = true
+		}
+	}
+
+	page := paging.GetPaging(currentIndex, pageSize, total)
+	resp := approvalResp.CompanyApprovalListResp{
+		Paging: page,
+		List:   list,
+	}
+	this.OkDetailed(resp, "获取成功")
+}
+
+// @Title 获取审批单详情接口
+// @Description 获取审批单详情接口
+// @Param   ApprovalId   query   int  true       "审批单id"
+// @Success 200 {object} approval.CompanyApprovalDetailResp
+// @router /detail [get]
+func (this *ApprovalCommon) Detail() {
+	companyApprovalId, _ := this.GetInt("ApprovalId")
+
+	//if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_ADMIN || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_ADMIN { //审批
+	//	condition += ` AND c.approve_role_type_code=? `
+	//	pars = append(pars, roleTypeCode)
+	//} else if roleTypeCode == utils.ROLE_TYPE_CODE_FICC_SELLER || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER { //销售
+	//	condition += ` AND c.apply_user_id=? `
+	//	pars = append(pars, sysUser.AdminId)
+	//}
+
+	item, flowNodeListResp, err := company_apply.GetApprovalDetailByCompanyApprovalId(companyApprovalId, this.AdminWx)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取数据失败,Err:"+err.Error())
+		return
+	}
+
+	resp := approvalResp.CompanyApprovalDetailResp{
+		CompanyApprovalDetail: item,
+		FlowNodeList:          flowNodeListResp,
+	}
+	//获取权限列表
+
+	//子权限切片集合
+	var permissionClassifyArr []string
+	if item.ProductId == 1 {
+		for _, v := range utils.PermissionFiccClassifyArr {
+			permissionClassifyArr = append(permissionClassifyArr, v)
+		}
+	} else {
+		permissionClassifyArr = append(permissionClassifyArr, "权益")
+	}
+
+	//获取需要审批的权限
+	delayPermissionList, err := company_delay_permission.GetDelayPermissionItems(item.CompanyId, item.CompanyApprovalId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		this.FailWithMessage("获取失败", "获取审批权限失败,Err:"+err.Error())
+		return
+	}
+	delayPermissionIdMap := make(map[int]int)
+	for _, delayPermission := range delayPermissionList {
+		delayPermissionIdMap[delayPermission.ChartPermissionId] = 0
+	}
+
+	//遍历获取
+	for _, v := range permissionClassifyArr {
+		checkList := make([]int, 0)
+		plist := new(company_report_permission.PermissionLookList)
+		items, err := company_report_permission.GetPermissionLookItems(item.ProductId, v)
+		if err != nil {
+			this.FailWithMessage("获取失败", "获取权限信息失败,Err:"+err.Error())
+			return
+		}
+		for _, n := range items {
+			if _, ok := delayPermissionIdMap[n.ChartPermissionId]; ok {
+				checkList = append(checkList, n.ChartPermissionId)
+			}
+		}
+		plist.Items = items
+		plist.ClassifyName = v
+		plist.CheckList = checkList
+
+		if item.ProductId == 1 {
+			resp.FiccPermissionList = append(resp.FiccPermissionList, plist)
+		} else {
+			resp.PermissionList = append(resp.PermissionList, plist)
+		}
+
+	}
+
+	this.OkDetailed(resp, "获取成功")
+}
+
+// ApplyApprove
+// @Title 审批
+// @Description 审批接口
+// @Param	request	body approval.CompanyApplyApproveReq true "type json string"
+// @Success Ret=200 审批成功
+// @router /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
+	}
+
+	//数据校验(校验是否具有审批权限)
+	_, _, approvalRecord, err := company_apply.CheckApproveAuth(req.CompanyId, productId, sysUser)
+	//真实审核操作
+	if req.Status == 1 {
+		err = company_apply.Approved(approvalRecord, sysUser, req.Remark)
+		if err != nil {
+			this.FailWithMessage("审核失败!", "审核失败,Err:"+err.Error())
+			return
+		}
+	} else {
+		err = company_apply.Reject(approvalRecord, sysUser, req.Remark)
+		if err != nil {
+			this.FailWithMessage("审核失败!", "审核失败,Err:"+err.Error())
+			return
+		}
+	}
+
+	this.OkWithMessage("审批操作成功")
+}

+ 1 - 0
models/response/approval/approval.go

@@ -7,6 +7,7 @@ import (
 	"rdluck_tools/paging"
 )
 
+// CompanyApprovalListResp 客户审批列表
 type CompanyApprovalListResp struct {
 	Paging *paging.PagingItem
 	List   []*company_approval.CompanyApprovalList

+ 1 - 1
models/tables/company_approval/company_approval.go

@@ -112,7 +112,7 @@ type CompanyApprovalList struct {
 	CompanyContractId   int    `description:"合同id"`
 	DelayPermission     string `description:"延期申请品种"`
 	ApplyRealName       string `description:"申请人姓名"`
-	ApproveRoleTypeCode string `description:"审批人角色类型",json:"-"`
+	ApproveRoleTypeCode string `description:"审批人角色类型" json:"-"`
 	OpButton            bool   `description:"是否审批操作权限"`
 	CurrNodeId          int    `description:"当前审批操作节点"`
 }

+ 85 - 0
models/tables/contract_approval/contract_approval.go

@@ -666,3 +666,88 @@ WHERE c.is_delete = 0 AND a.approval_type="seal" `
 	_, err = o.Raw(sql, childPars, pars, startSize, pageSize).QueryRows(&list)
 	return
 }
+
+func GetCompanyApprovalCount(condition string, pars []interface{}) (count int, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT COUNT(1) AS count
+			FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			INNER JOIN company_approval AS c ON b.company_id=c.company_id AND b.product_id=c.product_id
+ 			WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY c.modify_time DESC `
+	err = o.Raw(sql, pars).QueryRow(&count)
+	return
+}
+
+//审批列表
+type CompanyApprovalList struct {
+	ContractApprovalId       int                     `description:"审批单id"`
+	ContractId               int                     `description:"客户单id"`
+	ContractApprovalRecordId int                     `description:"审批流id"`
+	ContractCode             string                  `description:"合同编号"`
+	Status                   string                  `description:"审批单状态,枚举值:待审批','已审批','已驳回','已撤回',默认待审批"`
+	ApplyContent             string                  `description:"待审内容"`
+	ContractDetail           string                  `json:"-" description:"提交审批时的客户审批信息;客户审批快照"`
+	ContractInfo             contract.ContractDetail `description:"提交审批时的合同信息;合同快照"`
+	ApproveRemark            string                  `description:"审核备注"`
+	CompanyName              string                  `description:"客户名称"`
+	SellerId                 int                     `description:"销售id"`
+	ApplyUserId              int                     `description:"申请人id"`
+	CurrNodeId               int                     `description:"当前节点"`
+	StartNodeId              int                     `description:"开始节点"`
+	ProductId                int                     `description:"产品id,1:ficc;2:权益"`
+	SellerName               string                  `description:"销售名称"`
+	StartDate                time.Time               `description:"合同开始日期"`
+	EndDate                  time.Time               `description:"合同结束日期"`
+	CreateTime               time.Time               `description:"发起审批的时间"`
+	ModifyTime               time.Time               `description:"最后一次修改的时间"`
+	ApproveTime              time.Time               `description:"审批时间"`
+	StartDateStr             string                  `description:"合同开始日期(字符串类型)"`
+	EndDateStr               string                  `description:"合同结束日期(字符串类型)"`
+	CreateTimeStr            string                  `description:"发起审批的时间(字符串类型)"`
+	ModifyTimeStr            string                  `description:"最后一次修改的时间(字符串类型)"`
+	ApproveTimeStr           string                  `description:"审批时间(字符串类型)"`
+
+	CompanyId            int
+	CreditCode           string `description:"社会统一信用码"`
+	CompanyType          string `description:"客户类型"`
+	IndustryName         string `description:"行业名称"`
+	ApprovalTime         string `description:"提交申请时间"`
+	CompanyProductStatus string `description:"客户状态"`
+	ApproveContent       string `description:"待审内容"`
+	ApproveStatus        string `description:"当前状态"`
+	ApplyMethod          int    `description:"申请类型:1:试用->正式,2:冻结—>试用,3:流失—>正式,4:试用延期,5:原销售申请领取流失客户,6:正式客户申请服务更新"`
+	ApplyReasons         string `description:"申请理由"`
+	FreezeStartDate      string `description:"冻结开始日期"`
+	FreezeEndDate        string `description:"冻结结束日期"`
+	FreezeExpireDays     int    `description:"冻结到期天数"`
+	Address              string `description:"地址"`
+	Source               string `description:"客户来源"`
+	ExpireDay            int    `description:"服务到期天数"`
+	CompanyApprovalId    int    `description:"审批记录ID"`
+	ApprovalCount        int    `description:"已延期审批次数"`
+	CompanyContractId    int    `description:"合同id"`
+	DelayPermission      string `description:"延期申请品种"`
+	ApplyRealName        string `description:"申请人姓名"`
+}
+
+func GetCompanyApprovalList(condition string, pars []interface{}, startSize, pageSize int) (items []*CompanyApprovalList, err error) {
+	o := orm.NewOrm()
+	sql := `SELECT a.company_id,b.product_id,a.company_name,a.credit_code,a.address,b.company_type,b.industry_name,
+			b.seller_name,b.create_time,b.freeze_start_date,b.freeze_end_date,b.source,c.create_time AS approval_time,c.approve_time,b.status,
+            c.approve_content,c.approve_status,c.apply_method,c.apply_reasons,c.approve_remark,b.start_date,b.end_date,c.company_approval_id,c.company_contract_id,
+            c.apply_real_name
+			FROM company AS a
+			INNER JOIN company_product AS b ON a.company_id=b.company_id
+			INNER JOIN company_approval AS c ON b.company_id=c.company_id AND b.product_id=c.product_id
+ 			WHERE 1=1 `
+	if condition != "" {
+		sql += condition
+	}
+	sql += ` ORDER BY c.modify_time DESC LIMIT ?,? `
+	_, err = o.Raw(sql, pars, startSize, pageSize).QueryRows(&items)
+	return
+}

+ 1003 - 0
services/company_approval/company_approval.go

@@ -0,0 +1,1003 @@
+package company_apply
+
+import (
+	"encoding/json"
+	"errors"
+	"fmt"
+	"hongze/hongze_mobile_admin/models/custom"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/models/tables/approval_flow"
+	"hongze/hongze_mobile_admin/models/tables/approval_flow_node"
+	"hongze/hongze_mobile_admin/models/tables/company"
+	"hongze/hongze_mobile_admin/models/tables/company_approval"
+	"hongze/hongze_mobile_admin/models/tables/company_approval_message"
+	"hongze/hongze_mobile_admin/models/tables/company_contract"
+	"hongze/hongze_mobile_admin/models/tables/company_product"
+	"hongze/hongze_mobile_admin/models/tables/company_product_log"
+	"hongze/hongze_mobile_admin/models/tables/contract_approval"
+	"hongze/hongze_mobile_admin/models/tables/contract_approval_record"
+	"hongze/hongze_mobile_admin/services"
+	"hongze/hongze_mobile_admin/services/flow"
+	"hongze/hongze_mobile_admin/utils"
+	"strings"
+	"time"
+)
+
+var sourceType = 1 //来源客户
+//提交审批
+func Apply(companyApprovalId int, messageContent string) (err error) {
+	//获取客户单详情
+	recodeInfo, err := company_approval.GetCompanyApprovalByApprovalId(companyApprovalId)
+	if err != nil {
+		err = errors.New("获取合同信息失败,Err:" + err.Error())
+		return
+	}
+	if recodeInfo == nil {
+		err = errors.New("客户单异常,找不到客户单信息")
+		return
+	}
+	//获取客户信息
+	companyInfo, err := company.GetCompanyById(recodeInfo.CompanyId)
+	if err != nil {
+		err = errors.New("获取合同信息失败,Err:" + err.Error())
+		return
+	}
+	if companyInfo == nil {
+		err = errors.New("客户信息异常,找不到客户信息")
+		return
+	}
+
+	//合同状态判断
+	ignoreStatus := []string{"待审批", "已撤回", "驳回"}
+	if !strings.Contains(strings.Join(ignoreStatus, ","), recodeInfo.ApproveStatus) {
+		err = errors.New("客户单状态异常,不允许提交审批,当前客户单状态:" + recodeInfo.ApproveStatus)
+		return
+	}
+
+	//待审内容
+	applyContent := `试用转正式`
+	switch recodeInfo.ApplyMethod { //"1:试用->正式,2:冻结—>试用,3:试用延期,4:原销售申请领取流失客户,5:正式客户申请服务更新"
+	case 1:
+		applyContent = `试用转正式`
+	case 2:
+		applyContent = `冻结转试用`
+	case 3:
+		applyContent = `试用延期`
+	case 4:
+		applyContent = `原销售申领客户`
+	case 5:
+		applyContent = `服务更新`
+	}
+
+	contractDetailByte, err := json.Marshal(recodeInfo)
+	if err != nil {
+		err = errors.New(fmt.Sprint("合同状态异常,当前合同数据格式化失败:", err))
+		return
+	}
+
+	//获取基础审批流
+	var flowItemInfo *approval_flow.ApprovalFlowItem
+	if recodeInfo.ProductId == 1 {
+		tmpFlowItemInfo, tmpErr := flow.GetApprovalFlow(1)
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("查找审批流程配置失败:", tmpErr))
+			return
+		}
+		flowItemInfo = tmpFlowItemInfo
+	} else {
+		tmpFlowItemInfo, tmpErr := flow.GetApprovalFlow(2)
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("查找审批流程配置失败:", tmpErr))
+			return
+		}
+		flowItemInfo = tmpFlowItemInfo
+	}
+
+	//校验是否存在待审批的审批单(其实没有多大意义,只是为了 异常数据校验)
+	contractApproval := &contract_approval.ContractApproval{
+		ContractId:     recodeInfo.CompanyApprovalId,
+		Status:         "待审批",
+		ApprovalType:   "company",
+		ApplyContent:   applyContent,
+		ContractDetail: string(contractDetailByte),
+		ApplyUserId:    recodeInfo.ApplyUserId,
+		ApplyUserName:  recodeInfo.ApplyRealName,
+		FlowId:         flowItemInfo.FlowId,
+		FlowVersion:    flowItemInfo.CurrVersion,
+		CurrNodeId:     flowItemInfo.NodeList[0].NodeId,
+		StartNodeId:    flowItemInfo.NodeList[0].NodeId,
+		ModifyTime:     time.Now(),
+		CreateTime:     time.Now(),
+	}
+	has, err := contractApproval.CheckPendingByContractId(recodeInfo.CompanyApprovalId, "company")
+	if err != nil {
+		return
+	}
+	if has {
+		err = errors.New("客户单异常,不允许提交审批,存在待审核的客户单")
+		return
+	}
+	contractApprovalRecordList := make([]*contract_approval_record.ContractApprovalRecord, 0)
+
+	ApproveUserMap := make(map[int]approval_flow_node.User)
+	for _, nodeItem := range flowItemInfo.NodeList {
+		//审批流记录
+		if len(nodeItem.UserList) <= 0 {
+			err = errors.New(fmt.Sprint("审批流程异常,没有可审批的人员,Err:", err))
+			return
+		}
+		for _, userItem := range nodeItem.UserList {
+			contractApprovalRecord := &contract_approval_record.ContractApprovalRecord{
+				Status:              "待审批",
+				ApproveRemark:       "",
+				ApproveUserId:       userItem.AdminId,
+				ApproveUserName:     userItem.Name,
+				ApproveRoleTypeCode: userItem.RoleTypeCode,
+				NodeId:              nodeItem.NodeId,
+				NodeType:            nodeItem.NodeType,
+				NextNodeId:          nodeItem.NextNodeId,
+				PrevNodeId:          nodeItem.PrevNodeId,
+				AuditType:           nodeItem.AuditType,
+				CreateTime:          time.Now(),
+				ModifyTime:          time.Now(),
+			}
+			contractApprovalRecordList = append(contractApprovalRecordList, contractApprovalRecord)
+			ApproveUserMap[userItem.AdminId] = userItem
+		}
+
+	}
+
+	err = contractApproval.Apply(contractApproval, contractApprovalRecordList)
+	if err != nil {
+		return
+	}
+
+	//待办通知
+	{
+		//发送消息下级审批人
+		go messageToNodeUser(contractApproval.CurrNodeId, recodeInfo.ApplyUserId, companyInfo.CompanyId, contractApproval.ContractId, contractApproval.ContractApprovalId, 1, 1, companyInfo.CompanyName, messageContent)
+	}
+	return
+}
+
+// CancelApply 撤回审批
+func CancelApply(recordInfo *company_approval.CompanyApproval, opUserId int) (err error) {
+	if recordInfo == nil {
+		err = errors.New("客户单异常,没有客户单信息")
+		return
+	}
+
+	//客户单状态判断
+	if recordInfo.ApproveStatus != "待审批" {
+		err = errors.New("客户单状态异常,不允许撤回申请,当前客户单状态:" + recordInfo.ApproveStatus)
+		return
+	}
+
+	//校验操作人与客户单申请人是否同一人
+	if recordInfo.ApplyUserId != opUserId {
+		err = errors.New(fmt.Sprint("操作人异常,不允许撤回非本人提交的申请;客户单发起人:", recordInfo.ApplyUserId, ";撤销人:", opUserId))
+		return
+	}
+
+	//获取最近一次待审批的审批单信息
+	approval, err := contract_approval.GetLastContractApprovalByContractId(recordInfo.CompanyApprovalId, "company")
+	if err != nil {
+		return
+	}
+	//是否一级审批节点判断,如果不是一级审批节点,那么不允许撤回
+	if approval.StartNodeId != approval.CurrNodeId {
+		err = errors.New("审批单状态异常,不允许撤回申请,当前审批单已被审批操作,进入了下一级审批节点")
+		return
+	}
+
+	//获取当前待审批的审批流信息
+	approvalRecord, err := contract_approval_record.GetCurrContractApprovalRecordByContractId(approval.ContractApprovalId)
+	if err != nil {
+		return
+	}
+	//判断当前节点是否存在上级节点,如果存在,那么说明
+	if approvalRecord.PrevNodeId > 0 {
+		err = errors.New("合同已存在审批操作,不允许撤回申请")
+		return
+	}
+
+	//获取当前审批单中所有待审批的流程流
+	approvalRecordList, err := contract_approval_record.GetPendingContractApprovalRecordListByContractId(approval.ContractApprovalId, approvalRecord.NodeId)
+	if err != nil {
+		return
+	}
+
+	//撤回审批流
+	err = approval.Cancel(approval, approvalRecordList)
+	if err != nil {
+		return
+	}
+
+	//添加操作日志 (??这个看情况再说,或许没有必要)
+
+	//作废原有消息
+	for _, contractApprovalRecord := range approvalRecordList {
+		go company_approval_message.CancelCompanyApprovalMessage(contractApprovalRecord.ContractApprovalRecordId, 2)
+	}
+
+	return
+}
+
+// Reject 驳回审批
+func Reject(approvalRecord *contract_approval_record.ContractApprovalRecord, opUser *custom.AdminWx, rejectRemark string) (err error) {
+	if approvalRecord == nil {
+		err = errors.New("审批流异常,没有审批流信息")
+		return
+	}
+
+	//审批流状态判断
+	if approvalRecord.Status != "待审批" {
+		err = errors.New("审批流状态异常,不允许驳回申请,当前审批流状态:" + approvalRecord.Status)
+		return
+	}
+
+	//判断是否审批类型,如果不是审批类型,那么就没有审批权限
+	if approvalRecord.NodeType != "check" {
+		err = errors.New("当前账号没有审批权限")
+		return
+	}
+
+	//操作人
+	opUserId := opUser.AdminId
+	opUserName := opUser.RealName
+
+	//操作权限校验
+	if opUser.RoleTypeCode != approvalRecord.ApproveRoleTypeCode {
+		err = errors.New("当前账号没有审批权限")
+		return
+	}
+	if approvalRecord.ApproveUserId > 0 && approvalRecord.ApproveUserId != opUserId {
+		err = errors.New("当前账号没有审批权限,需要指定人操作")
+		return
+	}
+
+	//获取审批单详情
+	approval, err := contract_approval.GetContractApprovalById(approvalRecord.ContractApprovalId)
+	if err != nil {
+		return
+	}
+
+	//审批单状态判断
+	if approval.Status != "待审批" {
+		err = errors.New("审批单状态异常,不允许驳回申请,当前审批单状态:" + approval.Status)
+		return
+	}
+
+	//获取 客户单 信息
+	recordInfo, err := company_approval.GetCompanyApprovalById(approval.ContractId)
+	if err != nil {
+		return
+	}
+
+	//客户单 状态判断
+	if recordInfo.ApproveStatus != "待审批" {
+		err = errors.New("客户单状态异常,不允许驳回申请,当前客户单状态:" + recordInfo.ApproveStatus)
+		return
+	}
+
+	//获取 客户 信息
+	companyInfo, err := company.GetCompanyById(recordInfo.CompanyId)
+	if err != nil {
+		return
+	}
+	err = approval.Reject(approval, approvalRecord, opUserId, opUserName, rejectRemark)
+	if err != nil {
+		return
+	}
+
+	//添加操作日志
+	//remark := "驳回申请"
+	//_ = contract.AddContractOperationRecord(contractInfo.ContractId, opUserId, approvalRecord.ContractApprovalRecordId, "reject", opUserName, remark)
+
+	//完成审批后的驳回操作
+	go afterReject(approval.ContractId, opUserId, opUserName, rejectRemark)
+
+	//待办通知
+	{
+		//content := contractInfo.CompanyName + " 合同模板已驳回"
+		content := companyInfo.CompanyName + " " + recordInfo.ApproveContent + "审批驳回"
+		approvalSysUser, _ := admin.GetAdminById(approval.ApplyUserId)
+		go services.AddCompanyApprovalMessage(opUserId, approval.ApplyUserId, companyInfo.CompanyId, approval.ContractId, 2, sourceType, 3, companyInfo.CompanyName, content, content, approvalSysUser.Mobile)
+	}
+	return
+}
+
+// Approved 审批通过
+func Approved(approvalRecord *contract_approval_record.ContractApprovalRecord, opUser *custom.AdminWx, approvedRemark string) (err error) {
+	if approvalRecord == nil {
+		err = errors.New("审批流异常,没有审批流信息")
+		return
+	}
+
+	//审批流状态判断
+	if approvalRecord.Status != "待审批" {
+		err = errors.New("审批流状态异常,不允许审批,当前审批流状态:" + approvalRecord.Status)
+		return
+	}
+
+	//判断是否审批类型,如果不是审批类型,那么就没有审批权限
+	if approvalRecord.NodeType != "check" {
+		err = errors.New("当前账号没有审批权限")
+		return
+	}
+
+	//操作人
+	opUserId := opUser.AdminId
+	//opUserName := opUser.RealName
+	//操作权限校验
+	if opUser.RoleTypeCode != approvalRecord.ApproveRoleTypeCode {
+		err = errors.New("当前账号没有审批权限")
+		return
+	}
+	if approvalRecord.ApproveUserId > 0 && approvalRecord.ApproveUserId != opUserId {
+		err = errors.New("当前账号没有审批权限,需要指定人操作")
+		return
+	}
+
+	//获取审批单详情
+	approval, err := contract_approval.GetContractApprovalById(approvalRecord.ContractApprovalId)
+	if err != nil {
+		return
+	}
+
+	//审批单状态判断
+	if approval.Status != "待审批" {
+		err = errors.New("审批单状态异常,不允许审批,当前审批单状态:" + approval.Status)
+		return
+	}
+
+	//获取 客户单 信息
+	recordInfo, err := company_approval.GetCompanyApprovalById(approval.ContractId)
+	if err != nil {
+		return
+	}
+	//客户单 状态判断
+	if recordInfo.ApproveStatus != "待审批" {
+		err = errors.New("客户单状态异常,不允许审批,当前客户单状态:" + recordInfo.ApproveStatus)
+		return
+	}
+
+	//获取 客户 信息
+	companyInfo, err := company.GetCompanyById(recordInfo.CompanyId)
+	if err != nil {
+		return
+	}
+
+	//if contractApprovalRecord
+	err = approval.Approved(approval, approvalRecord, approvedRemark)
+	if err != nil {
+		return
+	}
+
+	//添加操作日志
+	//remark := "审批通过"
+	//_ = contract.AddContractOperationRecord(contractInfo.ContractId, opUserId, approvalRecord.ContractApprovalRecordId, "approval", opUserName, remark)
+
+	//发送信息给所有抄送人
+	content := companyInfo.CompanyName + " " + recordInfo.ApproveContent + "审批通过"
+
+	//如果下一个节点属于结束节点,那么通知对应的销售,同时,异步生成合同pdf
+	if approvalRecord.NextNodeId == 0 {
+		//待办通知(通知销售已经审核通过了)
+		{
+			approvalSysUser, _ := admin.GetAdminById(approval.ApplyUserId)
+			go services.AddCompanyApprovalMessage(opUserId, approval.ApplyUserId, companyInfo.CompanyId, approval.ContractId, 2, sourceType, 2, companyInfo.CompanyName, content, content, approvalSysUser.Mobile)
+		}
+
+		// 客户单审批后的异步操作(修改客户单信息、修改合同权限等)
+		go afterApproved(recordInfo.CompanyApprovalId, opUser.AdminId, opUser.RealName)
+	} else {
+		//获取下级节点信息
+		flowNodeInfo, tmpErr := approval_flow_node.GetByNodeId(approvalRecord.NextNodeId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+
+		//如果该级节点是抄送类型,那么需要将该节点给处理掉
+		if flowNodeInfo.NodeType == "cc" {
+			go approvedByCc(approvedRemark, approvalRecord)
+		} else {
+			//发送消息下级审批人
+			go messageToNodeUser(approvalRecord.NextNodeId, approval.ApplyUserId, companyInfo.CompanyId, approval.ContractId, approval.ContractApprovalId, 1, 1, companyInfo.CompanyName, content)
+		}
+	}
+
+	return
+}
+
+// approvedByCc 审批通过(抄送节点)
+func approvedByCc(approvedRemark string, sourceApprovalRecord *contract_approval_record.ContractApprovalRecord) (err error) {
+	//下个流程节点id
+	nextNodeId := 0
+	//获取审批单中抄送节点的所有数据列表
+	approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractIdAndNode(sourceApprovalRecord.ContractApprovalId, sourceApprovalRecord.NextNodeId)
+	if err != nil {
+		return
+	}
+	//遍历所有的抄送单
+	for _, contractApprovalRecord := range approvalRecordList {
+		nextNodeId = contractApprovalRecord.NextNodeId
+		//审批流状态判断
+		if contractApprovalRecord.Status != "待审批" {
+			err = errors.New("审批流状态异常,不允许审批,当前审批流状态:" + contractApprovalRecord.Status)
+			return
+		}
+		//判断是否审批类型,如果不是审批类型,那么就没有审批权限
+		if contractApprovalRecord.NodeType != "cc" {
+			err = errors.New("当前账号不是抄送权限")
+			return
+		}
+	}
+
+	//获取审批单详情
+	approval, err := contract_approval.GetContractApprovalById(sourceApprovalRecord.ContractApprovalId)
+	if err != nil {
+		return
+	}
+
+	//获取 客户单 信息
+	recordInfo, err := company_approval.GetCompanyApprovalById(approval.ContractId)
+	if err != nil {
+		return
+	}
+	//客户单 状态判断
+	if recordInfo.ApproveStatus != "待审批" {
+		err = errors.New("客户单状态异常,不允许审批,当前客户单状态:" + recordInfo.ApproveStatus)
+		return
+	}
+
+	//获取 客户 信息
+	companyInfo, err := company.GetCompanyById(recordInfo.CompanyId)
+	if err != nil {
+		return
+	}
+
+	//if contractApprovalRecord
+	err = approval.ApprovedByCc(approval, approvalRecordList, approvedRemark, nextNodeId)
+	if err != nil {
+		return
+	}
+
+	content := companyInfo.CompanyName + " " + recordInfo.ApproveContent + "审批通过"
+	//发送消息给抄送人
+	go messageToNodeUser(approvalRecordList[0].NodeId, approval.ApplyUserId, companyInfo.CompanyId, approval.ContractId, approval.ContractApprovalId, 1, 1, companyInfo.CompanyName, content)
+
+	//如果下一个节点属于结束节点,那么通知对应的销售,同时,异步生成合同pdf
+	if nextNodeId == 0 {
+		//待办通知
+		{
+			approvalSysUser, _ := admin.GetAdminById(approval.ApplyUserId)
+			go services.AddCompanyApprovalMessage(sourceApprovalRecord.ApproveUserId, approval.ApplyUserId, companyInfo.CompanyId, sourceApprovalRecord.ContractApprovalRecordId, 2, sourceType, 2, companyInfo.CompanyName, content, content, approvalSysUser.Mobile)
+		}
+
+		//客户单审批后的异步操作(修改客户单信息、修改合同权限等)
+		go afterApproved(recordInfo.CompanyApprovalId, sourceApprovalRecord.ApproveUserId, sourceApprovalRecord.ApproveUserName)
+	} else {
+		//获取下级节点信息
+		flowNodeInfo, tmpErr := approval_flow_node.GetByNodeId(nextNodeId)
+		if tmpErr != nil {
+			err = tmpErr
+			return
+		}
+		//如果下级节点是抄送类型,那么还是需要处理抄送节点逻辑
+		if flowNodeInfo.NodeType == "cc" {
+			go approvedByCc(approvedRemark, sourceApprovalRecord)
+		} else {
+			//如果下级级节点是审批类型
+			//发送消息下级审批人
+			go messageToNodeUser(nextNodeId, approval.ApplyUserId, companyInfo.CompanyId, approval.ContractId, approval.ContractApprovalId, 1, 1, companyInfo.CompanyName, content)
+		}
+	}
+
+	return
+}
+
+// messageToNodeUser 抄送信息给用户(根据节点来推送)
+func messageToNodeUser(flowNodeId, createUserId, companyId, companyApprovalId, contractApprovalId, messageType, approvalStatus int, companyName, content string) (err error) {
+	//获取审批单中抄送节点的所有数据列表
+	contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractIdAndNode(contractApprovalId, flowNodeId)
+
+	if err != nil {
+		return
+	}
+	err = messageToUser(contractApprovalRecordList, createUserId, companyId, companyApprovalId, messageType, approvalStatus, companyName, content)
+	return
+}
+
+// messageToAllCcUser 发送信息给所有抄送人
+// @param createUserId 消息发起人
+// @param contractApprovalId 审批单id
+// @param messageType 消息类型:1:申请消息,2:审批结果
+// @param approvalStatus 审批状态:1:待审批,2:已审批,3:已驳回"
+// @param companyName 企业客户名称
+// @param content 消息内容
+func messageToAllCcUser(createUserId, companyId, companyApprovalId, contractApprovalId, messageType, approvalStatus int, companyName, content string) (err error) {
+	//获取审批单中抄送节点的所有数据列表
+	contractApprovalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalId)
+
+	if err != nil {
+		return
+	}
+	err = messageToUser(contractApprovalRecordList, createUserId, companyId, companyApprovalId, messageType, approvalStatus, companyName, content)
+	return
+}
+
+// messageToUser 抄送信息给用户(发送给所有抄送人)
+// @param createUserId 待审批、抄送记录
+// @param createUserId 消息发起人
+// @param contractApprovalId 审批单id
+// @param messageType 消息类型:1:申请消息,2:审批结果
+// @param approvalStatus 审批状态:1:待审批,2:已审批,3:已驳回"
+// @param companyName 企业客户名称
+// @param content 消息内容
+func messageToUser(contractApprovalRecordList []*contract_approval_record.ContractApprovalRecord, createUserId, companyId, companyApprovalId, messageType, approvalStatus int, companyName, content string) (err error) {
+	for _, contractApprovalRecord := range contractApprovalRecordList {
+		sysUserMobile := ""
+		sysUser, _ := admin.GetAdminById(contractApprovalRecord.ApproveUserId)
+		if sysUser != nil {
+			sysUserMobile = sysUser.Mobile
+		}
+		//接收人,就是审批记录里面的待审核人(抄送人)
+		receiveUserId := contractApprovalRecord.ApproveUserId
+
+		go services.AddCompanyApprovalMessage(createUserId, receiveUserId, companyId, companyApprovalId, messageType, sourceType, approvalStatus, companyName, content, content, sysUserMobile)
+	}
+	return
+}
+
+// afterApproved 审批完成后操作
+func afterApproved(companyApprovalId int, opUserId int, opUserName string) (err error) {
+	defer func() {
+		if err != nil {
+			//fmt.Println("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
+			go utils.SendEmail("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
+		}
+
+	}()
+	opUser := custom.AdminWx{
+		AdminId:  opUserId,
+		RealName: opUserName,
+	}
+	//获取客户单详情
+	recodeInfo, err := company_approval.GetCompanyApprovalByApprovalId(companyApprovalId)
+	if err != nil {
+		err = errors.New("获取合同信息失败,Err:" + err.Error())
+		return
+	}
+	if recodeInfo == nil {
+		err = errors.New("客户单异常,找不到客户单信息")
+		return
+	}
+	//获取客户信息
+	companyInfo, err := company.GetCompanyById(recodeInfo.CompanyId)
+	if err != nil {
+		err = errors.New("获取合同信息失败,Err:" + err.Error())
+		return
+	}
+	if companyInfo == nil {
+		err = errors.New("客户信息异常,找不到客户信息")
+		return
+	}
+
+	//客户产品信息
+	companyProduct, err := company_product.GetCompanyProductByCompanyIdAndProductId(recodeInfo.CompanyId, recodeInfo.ProductId)
+	if err != nil {
+		err = errors.New(fmt.Sprint("获取信息客户产品失败", ";Err:"+err.Error()))
+		return
+	}
+	if companyProduct == nil {
+		err = errors.New("获取信息客户产品失败2")
+		return
+	}
+
+	switch recodeInfo.ApplyMethod {
+	case 1: //试用转正式
+		//获取合同信息
+		contractInfo, tmpErr := company_contract.GetCompanyContractDetail(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyContractId)
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("待审批信息不存在,CompanyId:", recodeInfo.CompanyId, ";productId:", recodeInfo.ProductId, ";Err:"+tmpErr.Error()))
+			return
+		}
+		if contractInfo == nil {
+			err = errors.New(fmt.Sprint("待审批信息不存在,CompanyId:", recodeInfo.CompanyId, ";productId:", recodeInfo.ProductId))
+			return
+		}
+
+		//格式化合同开始时间
+		contractStartDate, tmpErr := time.Parse(utils.FormatDate, contractInfo.StartDate)
+		if tmpErr != nil {
+			err = errors.New("合同开始时间转换失败,Err:" + tmpErr.Error())
+			return
+		}
+		//格式化合同结束日期
+		contractEndDate, tmpErr := time.Parse(utils.FormatDate, contractInfo.EndDate)
+		if tmpErr != nil {
+			err = errors.New("合同结束时间转换失败,Err:" + tmpErr.Error())
+			return
+		}
+		//格式化 产品中 合同结束日期
+		//productContractEndDate, err := time.Parse(utils.FormatDate, companyProduct.ContractEndDate)
+		//if err != nil {
+		//	br.Msg = "审批失败"
+		//	br.ErrMsg = "产品中合同结束时间转换失败,Err:" + err.Error()
+		//	return
+		//}
+		//如果合同时间小于等于今天,那么立马执行合同内容
+		if time.Now().After(contractStartDate) {
+			tmpErr = company_approval.TryOutToFormal(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId, contractInfo.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName)
+			if tmpErr != nil {
+				err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
+				return
+			}
+		} else {
+			tmpErr = company_approval.ApplyApproveContract(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyApprovalId, contractInfo.CompanyContractId)
+			if tmpErr != nil {
+				err = errors.New("试用转正式失败,Err:" + tmpErr.Error())
+				return
+			}
+		}
+		//如果合同中的结束日期大于产品中的合同结束日期,那么就去修改产品中的合同结束日期
+		if contractEndDate.After(companyProduct.ContractEndDate) {
+			companyProduct.ContractEndDate = contractEndDate
+			cols := make([]string, 0)
+			cols = append(cols, "ContractEndDate")
+			_ = companyProduct.Update(cols)
+		}
+	case 2: //冻结->试用
+		tmpErr := company_approval.FreezeToTryOut(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
+		if tmpErr != nil {
+			err = errors.New("冻结转试用失败,Err:" + tmpErr.Error())
+			return
+		}
+	case 3: //试用延期
+		tmpErr := company_approval.TryOutDelay(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, opUser.RealName, companyProduct.EndDate, companyProduct.ProductName)
+		if tmpErr != nil {
+			err = errors.New("试用延期失败,Err:" + tmpErr.Error())
+			return
+		}
+	case 4: //原销售申请领取流失客户
+		tmpErr := company_approval.ApplyReceive(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.ApplyUserId, opUser.RealName, companyProduct.ProductName)
+		if tmpErr != nil {
+			err = errors.New("原销售申请领取流失客户失败,Err:" + tmpErr.Error())
+			return
+		}
+	case 5: //正式客户申请服务更新
+		//获取合同信息
+		contractInfo, tmpErr := company_contract.GetCompanyContractDetail(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyContractId)
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("正式客户申请服务更新失败,待审批合同信息不存在,CompanyId:", recodeInfo.CompanyId, ";productId:", recodeInfo.ProductId, ";Err:"+tmpErr.Error()))
+			return
+		}
+		if contractInfo == nil {
+			err = errors.New(fmt.Sprint("正式客户申请服务更新失败,待审批合同信息不存在2,CompanyId:", recodeInfo.CompanyId, ";productId:", recodeInfo.ProductId))
+			return
+		}
+		//格式化合同开始时间
+		contractStartDate, tmpErr := time.Parse(utils.FormatDate, contractInfo.StartDate)
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("正式客户申请服务更新失败,合同开始时间转换失败;Err:" + tmpErr.Error()))
+			return
+		}
+
+		//格式化合同结束日期
+		contractEndDate, tmpErr := time.Parse(utils.FormatDate, contractInfo.EndDate)
+		if tmpErr != nil {
+			err = errors.New(fmt.Sprint("正式客户申请服务更新失败,合同结束时间转换失败;Err:" + tmpErr.Error()))
+			return
+		}
+		//格式化 产品中 合同结束日期
+		//productContractEndDate, err := time.Parse(utils.FormatDate, companyProduct.ContractEndDate)
+		//if err != nil {
+		//	br.Msg = "审批失败"
+		//	br.ErrMsg = "产品中合同结束时间转换失败,Err:" + err.Error()
+		//	return
+		//}
+
+		//如果合同时间小于等于今天,那么立马执行合同内容
+		if time.Now().After(contractStartDate) {
+			err = company_approval.ApplyServiceUpdate(recodeInfo.CompanyId, recodeInfo.ProductId, opUser.AdminId, recodeInfo.CompanyApprovalId, recodeInfo.CompanyContractId, companyProduct.StartDate, contractInfo.EndDate, opUser.RealName, companyProduct.ProductName)
+			if tmpErr != nil {
+				err = errors.New(fmt.Sprint("正式客户申请服务更新失败,执行失败;Err:" + tmpErr.Error()))
+				return
+			}
+		} else {
+			tmpErr = company_approval.ApplyApproveContract(recodeInfo.CompanyId, recodeInfo.ProductId, recodeInfo.CompanyApprovalId, recodeInfo.CompanyContractId)
+			if tmpErr != nil {
+				err = errors.New(fmt.Sprint("正式客户申请服务更新失败,执行失败2;Err:" + tmpErr.Error()))
+				return
+			}
+		}
+
+		//如果合同中的结束日期大于产品中的合同结束日期,那么就去修改产品中的合同结束日期
+		if contractEndDate.After(companyProduct.ContractEndDate) {
+			companyProduct.ContractEndDate = contractEndDate
+			cols := make([]string, 0)
+			cols = append(cols, "ContractEndDate")
+			_ = companyProduct.Update(cols)
+		}
+	default:
+		err = errors.New(fmt.Sprint("无效的审批状态,CompanyId:", recodeInfo.CompanyId, ";productId:", recodeInfo.ProductId, ";ApplyMethod:", recodeInfo.ApplyMethod, ";ApproveStatus:", recodeInfo.ApproveStatus))
+		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 = opUserId
+		go company_product_log.AddCompanyProductLog(productLog)
+	}
+	//新增操作记录
+	{
+		remark := "审批"
+		operation := "approve"
+		approveContent := "审批通过"
+
+		services.AddCompanyOperationRecord(recodeInfo.CompanyId, companyProduct.SellerId, opUserId, recodeInfo.ProductId, opUserId, companyProduct.CompanyName,
+			companyProduct.ProductName, opUserName, remark, operation, approveContent, opUserName, "", companyProduct.Status)
+	}
+	return
+}
+
+// afterReject 驳回完成后操作
+func afterReject(companyApprovalId, opUserId int, opUserName, remark string) (err error) {
+	defer func() {
+		if err != nil {
+			fmt.Println("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
+			go utils.SendEmail("异常提醒:"+utils.RunMode, "合同审批通过后,生成pdf失败,ERR:"+err.Error()+"", utils.EmailSendToUsers)
+		}
+
+	}()
+	//获取客户单详情
+	recodeInfo, err := company_approval.GetCompanyApprovalByApprovalId(companyApprovalId)
+	if err != nil {
+		err = errors.New("获取合同信息失败,Err:" + err.Error())
+		return
+	}
+	if recodeInfo == nil {
+		err = errors.New("客户单异常,找不到客户单信息")
+		return
+	}
+	//获取客户信息
+	companyInfo, err := company.GetCompanyById(recodeInfo.CompanyId)
+	if err != nil {
+		err = errors.New("获取合同信息失败,Err:" + err.Error())
+		return
+	}
+	if companyInfo == nil {
+		err = errors.New("客户信息异常,找不到客户信息")
+		return
+	}
+	//客户产品信息
+	companyProduct, err := company_product.GetCompanyProductByCompanyIdAndProductId(recodeInfo.CompanyId, recodeInfo.ProductId)
+	if err != nil {
+		err = errors.New(fmt.Sprint("获取信息客户产品失败", ";Err:"+err.Error()))
+		return
+	}
+	if companyProduct == nil {
+		err = errors.New("获取信息客户产品失败2")
+		return
+	}
+
+	approveStatus := "驳回"
+	err = company_approval.ApproveRefuse(recodeInfo.CompanyId, recodeInfo.ProductId, approveStatus, remark)
+	if err != nil {
+		err = errors.New("客户单审批驳回失败,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 = opUserId
+		go company_product_log.AddCompanyProductLog(productLog)
+	}
+	//新增操作记录
+	{
+		remark := "审批"
+		operation := "approve"
+		approveContent := "审批驳回"
+
+		services.AddCompanyOperationRecord(recodeInfo.CompanyId, companyProduct.SellerId, opUserId, recodeInfo.ProductId, opUserId, companyProduct.CompanyName,
+			companyProduct.ProductName, opUserName, remark, operation, approveContent, opUserName, remark, companyProduct.Status)
+	}
+	return
+}
+
+// CheckApproveAuth 校验审批操作权限
+func CheckApproveAuth(companyId, productId int, opUser *custom.AdminWx) (approvalItem *company_approval.CompanyApproval, approvalInfo *contract_approval.ContractApproval, approvalRecord *contract_approval_record.ContractApprovalRecord, err error) {
+	//客户单详情
+	approvalItem, err = company_approval.GetCompanyApprovalByCompanyId(companyId, productId)
+	if err != nil {
+		err = errors.New("获取客户单失败,Err:" + err.Error())
+		return
+	}
+	//客户单状态判断
+	if approvalItem.ApproveStatus != "待审批" {
+		err = errors.New("客户单状态异常,不允许操作申请,当前客户单状态:" + approvalItem.ApproveStatus)
+		return
+	}
+
+	//获取该最近一条审批单详情
+	approvalInfo, err = contract_approval.GetLastContractApprovalByContractId(approvalItem.CompanyApprovalId, "company")
+	if err != nil {
+		err = errors.New("获取审批单失败,Err:" + err.Error())
+		return
+	}
+	if approvalInfo.Status != "待审批" {
+		err = errors.New("当前审批单状态异常,不允许审批,审批单状态:" + approvalInfo.Status)
+		return
+	}
+
+	//审批流
+	approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalIdAndNodeId(approvalInfo.ContractApprovalId, approvalInfo.CurrNodeId)
+	if err != nil {
+		err = errors.New("获取审批失败,Err:" + err.Error())
+		return
+	}
+	for _, tmpApprovalRecord := range approvalRecordList {
+		if tmpApprovalRecord.NodeType == "check" && tmpApprovalRecord.ApproveUserId == opUser.AdminId {
+			approvalRecord = tmpApprovalRecord
+		}
+	}
+
+	if approvalRecord == nil {
+		err = errors.New("当前账号没有审批权限")
+		return
+	}
+	return
+}
+
+//获取审批流和权限
+func GetOpButton(approvalItem *company_approval.CompanyApprovalList, contractApprovalInfo *contract_approval.ContractApproval, opUser *custom.AdminWx) (flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
+	//审批流
+	approvalRecordList, err := contract_approval_record.GetContractApprovalRecordListByContractApprovalId(contractApprovalInfo.ContractApprovalId)
+	if err != nil {
+		err = errors.New("获取审批失败,Err:" + err.Error())
+		return
+	}
+	flowNodeMap := make(map[int][]contract_approval_record.ContractApprovalRecord, 0)
+	keySort := make([]int, 0)
+	for _, approvalRecord := range approvalRecordList {
+		//如果当前节点正好是该节点,同时审批单状态是待审批状态,然后当前账号又有权限,该账号也正是审批人,那么允许审批操作
+		if contractApprovalInfo.CurrNodeId == approvalRecord.NodeId && contractApprovalInfo.Status == "待审批" {
+			if opUser.AdminId == approvalRecord.ApproveUserId && approvalRecord.NodeType == "check" {
+				approvalItem.OpButton = true
+			}
+		}
+		//如果当前节点正好是该节点,同时审批单状态又是第一层节点
+		if contractApprovalInfo.CurrNodeId == approvalRecord.NodeId && approvalRecord.PrevNodeId == 0 && contractApprovalInfo.Status == "待审批" {
+			//发起人具有撤回审批单权限
+			//if opUser.AdminId == sealInfo.UserId {
+			//	sealOpButton.Cancel = true
+			//}
+		}
+		if tmpFlowNodeList, ok := flowNodeMap[approvalRecord.NodeId]; ok {
+			flowNodeMap[approvalRecord.NodeId] = append(tmpFlowNodeList, *approvalRecord)
+		} else {
+			tmpFlowNodeList := make([]contract_approval_record.ContractApprovalRecord, 1)
+			tmpFlowNodeList[0] = *approvalRecord
+			flowNodeMap[approvalRecord.NodeId] = tmpFlowNodeList
+
+			keySort = append(keySort, approvalRecord.NodeId)
+		}
+	}
+	for _, key := range keySort {
+		flowNodeListResp = append(flowNodeListResp, flowNodeMap[key])
+	}
+
+	return
+}
+
+// GetApprovalDetailByCompanyApprovalId 根据客户单id获取客户单审批详情
+func GetApprovalDetailByCompanyApprovalId(companyApprovalId int, opUser *custom.AdminWx) (approvalItem *company_approval.CompanyApprovalList, flowNodeListResp [][]contract_approval_record.ContractApprovalRecord, err error) {
+	var condition string
+	var pars []interface{}
+	approvalItem, err = company_approval.GetApprovalListByApprovalId(condition, pars, companyApprovalId)
+	if err != nil {
+		err = errors.New("获取客户单详情失败,ERR:" + err.Error())
+		return
+	}
+	if approvalItem.FreezeStartDate != "" && approvalItem.FreezeEndDate != "" && approvalItem.Status == utils.COMPANY_STATUS_FREEZE {
+		freezeEndDate, _ := time.Parse(utils.FormatDate, approvalItem.FreezeEndDate)
+		if time.Now().Before(freezeEndDate) {
+			expireDays := freezeEndDate.Sub(time.Now()).Hours() / 24
+			approvalItem.FreezeExpireDays = int(expireDays)
+		}
+	}
+	if approvalItem.StartDate != "" && approvalItem.EndDate != "" {
+		endDate, _ := time.Parse(utils.FormatDate, approvalItem.EndDate)
+		if time.Now().Before(endDate) {
+			expireDays := endDate.Sub(time.Now()).Hours() / 24
+			approvalItem.ExpireDay = int(expireDays)
+		}
+	}
+
+	approvalCount, err := company_approval.GetCompanyApprovalCount(approvalItem.CompanyId, approvalItem.ProductId)
+	if err != nil && err.Error() != utils.ErrNoRow() {
+		err = errors.New("获取延期审批次数失败,Err:" + err.Error())
+		return
+	}
+	approvalItem.ApprovalCount = approvalCount
+
+	//查询最近一次审批单信息
+	lastApprovalInfo, err := contract_approval.GetLastContractApprovalByContractId(approvalItem.CompanyApprovalId, "company")
+	if err != nil {
+		if err.Error() != utils.ErrNoRow() {
+			err = errors.New("获取最近一次审批单信息失败,ERR:" + err.Error())
+		}
+		err = nil
+		return
+	}
+	if lastApprovalInfo != nil {
+		//获取审批操作和审批流数据
+		tmpFlowNodeListResp, tmpErr := GetOpButton(approvalItem, lastApprovalInfo, opUser)
+		if tmpErr != nil {
+			err = errors.New("获取客户单按钮权限、审批流程失败,Err:" + tmpErr.Error())
+			return
+		}
+		flowNodeListResp = tmpFlowNodeListResp
+	}
+	return
+}

+ 1 - 1
services/contract/contract_approval.go

@@ -174,7 +174,7 @@ func CancelApplyByContract(contractInfo *contract.Contract, opUserId int) (err e
 	}
 
 	//获取最近一次待审批的审批单信息
-	contractApproval, err := contract_approval.GetLastPendingContractApprovalByContractId(contractInfo.ContractId)
+	contractApproval, err := contract_approval.GetLastContractApprovalByContractId(contractInfo.ContractId, "contract")
 	if err != nil {
 		return
 	}

+ 1 - 1
services/seal/seal.go

@@ -110,7 +110,7 @@ func Edit(sealId, userId, contractId, fileNum int, use, companyName, userCompany
 	sealInfo.ModifyTime = time.Now()
 	sealInfo.Status = "待提交" //用印状态
 
-	err = sealInfo.Update([]string{"Use", "CompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "ModifyTime", "Status"})
+	err = sealInfo.Update([]string{"Use", "CompanyName", "UseCompanyName", "CreditCode", "ServiceType", "SealType", "Remark", "FileUrl", "ModifyTime", "Status"})
 
 	return
 }