Browse Source

新增小程序授权登录
新增基础审批流程接口

Roc 3 years ago
parent
commit
d46695b6e7

+ 19 - 0
controllers/admin.go

@@ -71,3 +71,22 @@ func (this *AdminCommon) Login() {
 	resp.Authority = adminWx.Authority
 	this.OkDetailed(resp, "登录成功")
 }
+
+// @Title 用户退出登录接口
+// @Description 用户退出登录接口
+// @Success Ret=200 退出成功
+// @router /logout [post]
+func (this *AdminCommon) Logout() {
+	adminWx := this.AdminWx
+	err := services.UnbindWxUser(adminWx.OpenId)
+	if err != nil {
+		this.FailWithMessage("退出失败", "退出失败,Err:"+err.Error())
+		return
+	}
+	err = h5_admin_session.UpdateSession(this.Session.SessionId, 0, time.Now().AddDate(0, 0, 10))
+	if err != nil {
+		this.FailWithMessage("退出失败", "变更session信息失败,Err:"+err.Error())
+		return
+	}
+	this.OkWithMessage("退出成功")
+}

+ 24 - 0
controllers/approval.go

@@ -2,6 +2,7 @@ package controllers
 
 import (
 	"encoding/json"
+	"fmt"
 	approval2 "hongze/hongze_mobile_admin/models/request/approval"
 	"hongze/hongze_mobile_admin/models/response/approval"
 	"hongze/hongze_mobile_admin/models/tables/admin"
@@ -18,6 +19,7 @@ import (
 	"time"
 )
 
+//客户审批列表
 type ApprovalCommon struct {
 	BaseAuth
 }
@@ -498,6 +500,28 @@ func (this *ApprovalCommon) ApplyApprove() {
 	this.OkWithMessage("审批操作成功")
 }
 
+// @Title 获取审批流详情接口
+// @Description 获取审批流详情接口
+// @Param   FlowId   query   int  true       "审批流程id;1:ficc客户审批;2:权益客户审批;3:ficc合同审批,4:权益合同审批,5:用印审批"
+// @Success 200 {object} approval_flow.ApprovalFlowItem
+// @router /flowDetail [get]
+func (this *ApprovalCommon) GetFlowDetail() {
+	//sysUser := this.AdminWx
+	flowId, _ := this.GetInt("FlowId", 0)
+	if flowId <= 0 {
+		this.FailWithMessage("参数异常", fmt.Sprint("审批流程id异常,FlowId:", flowId))
+		return
+	}
+
+	flowItem, err := services.GetApprovalFlow(flowId)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取数据失败,Err:"+err.Error())
+		return
+	}
+
+	this.OkDetailed(flowItem, "获取成功")
+}
+
 //// @Title 审批列表删除
 //// @Description 审批列表删除接口
 //// @Param	request	body company.CompanyApplyDeleteReq true "type json string"

+ 618 - 0
controllers/message.go

@@ -0,0 +1,618 @@
+package controllers
+
+import (
+	"encoding/json"
+	"fmt"
+	approval2 "hongze/hongze_mobile_admin/models/request/approval"
+	"hongze/hongze_mobile_admin/models/response/approval"
+	"hongze/hongze_mobile_admin/models/response/message"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"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_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"
+	"hongze/hongze_mobile_admin/services"
+	"hongze/hongze_mobile_admin/utils"
+	"rdluck_tools/paging"
+	"strconv"
+	"time"
+)
+
+//消息模块
+type MessageCommon struct {
+	BaseAuth
+}
+
+// @Title 消息列表汇总页
+// @Description 消息列表汇总页接口
+// @Success 200 {object} message.SummaryMessageListResp
+// @router /summaryMessageList [get]
+func (this *MessageCommon) SummaryMessageList() {
+	sysUser := this.AdminWx
+	sysUserId := sysUser.AdminId
+
+	SummaryMessageListResp := message.SummaryMessageListResp{}
+	sourceTypeList := [...]int{1, 2, 3}
+	for _, sourceType := range sourceTypeList {
+		//最近一条消息
+		tmpMessage := ``
+		messageInfo, err := company_approval_message.GetLastMessage(sysUserId, sourceType)
+		if err != nil {
+			if err.Error() != utils.ErrNoRow() {
+				this.FailWithMessage("获取失败", "获取消息失败,Err:"+err.Error())
+				return
+			}
+		} else {
+			tmpMessage = fmt.Sprint(messageInfo.RealName, messageInfo.CreateTime, messageInfo.Content)
+		}
+
+		notReadTotal, err := company_approval_message.GetNotReadMessageTotal(sysUserId, sourceType)
+		if err != nil {
+			this.FailWithMessage("获取失败", "获取未读消息数失败,Err:"+err.Error())
+			return
+		}
+		switch sourceType {
+		case 1:
+			SummaryMessageListResp.CompanyMessage.Message = tmpMessage
+			SummaryMessageListResp.CompanyMessage.Total = int(notReadTotal)
+		case 2:
+			SummaryMessageListResp.ContractMessage.Message = tmpMessage
+			SummaryMessageListResp.ContractMessage.Total = int(notReadTotal)
+		case 3:
+			SummaryMessageListResp.SealMessage.Message = tmpMessage
+			SummaryMessageListResp.SealMessage.Total = int(notReadTotal)
+		}
+	}
+
+	this.OkDetailed(SummaryMessageListResp, "获取成功")
+}
+
+// @Title 消息列表
+// @Description 消息列表接口
+// @Param   SourceType   query   int  true       "消息类型"
+// @Param   CurrentIndex   query   int  true       "当前页码"
+// @Param   pageSize   query   int  true       "每页数量"
+// @Success 200 {object} message.CompanyApprovalMessageListResp
+// @router /list [get]
+func (this *MessageCommon) MessageList() {
+	sysUser := this.AdminWx
+	sysUserId := sysUser.AdminId
+	sourceType, err := this.GetInt("SourceType", 1)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取消息类型失败,Err:"+err.Error())
+		return
+	}
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+
+	var startSize int
+	if pageSize <= 0 {
+		pageSize = utils.PageSize20
+	}
+	if currentIndex <= 0 {
+		currentIndex = 1
+	}
+	startSize = paging.StartIndex(currentIndex, pageSize)
+
+	total, err := company_approval_message.GetCompanyApprovalMessageCount(sysUserId, sourceType)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取消息总数失败,Err:"+err.Error())
+		return
+	}
+	list, err := company_approval_message.GetCompanyApprovalMessageList(sysUserId, sourceType, startSize, pageSize)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取消息列表失败,Err:"+err.Error())
+		return
+	}
+
+	resp := message.CompanyApprovalMessageListResp{
+		List:  list,
+		Total: total,
+	}
+	this.OkDetailed(resp, "获取成功")
+}
+
+// @Title 消息已读
+// @Description 消息已读接口
+// @Param	request	body company.CompanyApprovalMessageReadReq true "type json string"
+// @Success Ret=200 申请成功
+// @router /message/read [post]
+func (this *MessageCommon) MessageRead() {
+	//sysUser := this.AdminWx
+	var req company_approval_message.CompanyApprovalMessageReadReq
+	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+	if err != nil {
+		this.FailWithMessage("参数解析异常!", "参数解析失败,Err:"+err.Error())
+
+		return
+	}
+	if req.Id <= 0 {
+		this.FailWithMessage("参数错误", "参数错误,客户id小于等于0")
+		return
+	}
+	err = company_approval_message.ModifyCompanyApprovalMessageStatus(req.Id)
+	if err != nil {
+		this.FailWithMessage("修改失败!", "修改已读失败,Err:"+err.Error())
+		return
+	}
+	this.OkWithMessage("已读成功")
+}
+
+// @Title 获取审批列表接口
+// @Description 获取审批列表接口
+// @Param   PageSize   query   int  true       "每页数据条数"
+// @Param   CurrentIndex   query   int  true       "当前页页码,从1开始"
+// @Param   Status   query   string  true       "状态:'全部','待审批','已审批','驳回','已撤回'"
+// @Param   KeyWord   query   string  true       "搜索关键词"
+// @Success 200 {object} approval.CompanyApprovalListResp
+// @router /list [get]
+func (this *MessageCommon) List() {
+	sysUser := this.AdminWx
+	roleTypeCode := sysUser.RoleTypeCode
+
+	pageSize, _ := this.GetInt("PageSize")
+	currentIndex, _ := this.GetInt("CurrentIndex")
+	status := this.GetString("Status")
+	keyWord := this.GetString("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_FICC_SELLER || roleTypeCode == utils.ROLE_TYPE_CODE_RAI_SELLER { //销售
+		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 + `%') `
+	}
+
+	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 := approval.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 *MessageCommon) Detail() {
+	sysUser := this.AdminWx
+	roleTypeCode := sysUser.RoleTypeCode
+
+	companyApprovalId, _ := this.GetInt("ApprovalId")
+	var condition string
+	var pars []interface{}
+
+	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, err := company_approval.GetApprovalListByApprovalId(condition, pars, companyApprovalId)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取数据失败,Err:"+err.Error())
+		return
+	}
+	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
+			item.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
+			item.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
+	}
+	item.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
+	//	}
+	//	item.DelayPermission = delayPermission
+	//}
+
+	resp := approval.CompanyApprovalDetailResp{
+		CompanyApprovalDetail: item,
+	}
+
+	//获取权限列表
+
+	//子权限切片集合
+	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, "获取成功")
+}
+
+// @Title 获取审批单中的权限列表
+// @Description 获取审批单中的权限列表接口
+// @Param   ApprovalId   query   int  true       "审批单id"
+// @Success 200 {object} approval.CompanyPermissionResp
+// @router /getApprovalPermissionList [get]
+func (this *MessageCommon) GetApprovalPermissionList() {
+	//this.FailWithMessage("获取失败", "获取数据总数失败,Err:"+err.Error())
+	//返回基础参数
+	resp := new(approval.CompanyPermissionResp)
+
+	//获取审批单信息
+	approvalId, _ := this.GetInt("ApprovalId")
+	if approvalId <= 0 {
+		this.FailWithMessage("审批单参数异常", "提交审批单参数异常")
+		return
+	}
+	approvalInfo, err := company_approval.GetCompanyApprovalByApprovalId(approvalId)
+	if err != nil {
+		this.FailWithMessage("获取失败", "获取审批单数据失败,Err:"+err.Error())
+		return
+	}
+
+	//子权限切片集合
+	var permissionClassifyArr []string
+	if approvalInfo.ProductId == 1 {
+		for _, v := range utils.PermissionFiccClassifyArr {
+			permissionClassifyArr = append(permissionClassifyArr, v)
+		}
+	} else {
+		permissionClassifyArr = append(permissionClassifyArr, "权益")
+	}
+
+	//获取需要审批的权限
+	delayPermissionList, err := company_delay_permission.GetDelayPermissionItems(approvalInfo.CompanyId, approvalInfo.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(approvalInfo.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 approvalInfo.ProductId == 1 {
+			resp.FiccPermissionList = append(resp.FiccPermissionList, plist)
+		} else {
+			resp.PermissionList = append(resp.PermissionList, plist)
+		}
+
+	}
+
+	this.OkDetailed(resp, "获取成功")
+}
+
+// @Title 审批
+// @Description 审批接口
+// @Param	request	body approval.CompanyApplyApproveReq true "type json string"
+// @Success Ret=200 审批成功
+// @router /approve [post]
+func (this *MessageCommon) 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.GetCompanyApprovalByCompanyId(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 { //拒绝
+		if req.Remark == "" {
+			this.FailWithMessage("请填写驳回理由", "请填写驳回理由")
+			return
+		}
+		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("审批操作成功")
+}

+ 155 - 0
controllers/wechat.go

@@ -3,6 +3,7 @@ package controllers
 import (
 	"encoding/json"
 	"fmt"
+	"github.com/medivhzhan/weapp/v2"
 	"hongze/hongze_mobile_admin/models/response/wechat"
 	"hongze/hongze_mobile_admin/services"
 	"hongze/hongze_mobile_admin/utils"
@@ -76,3 +77,157 @@ func (this *WeChatCommon) WeChatLogin() {
 
 	this.OkDetailed(resp, "登录成功")
 }
+
+// @Title 微信登录接口
+// @Description 微信登录接口
+// @Param   Code   query   string  true       "微信唯一编码code"
+// @Success 200 {object} wechat.WxLoginResp
+// @router /wxapp/login [get]
+func (this *WeChatCommon) WxAppLogin() {
+	code := this.GetString("Code")
+	if code == "" {
+		this.FailWithMessage("参数错误", "Code 为空")
+		return
+	}
+	wxInfo, err := weapp.Login(utils.WxAppId2, utils.WxAppSecret2, code)
+	if err != nil {
+		this.FailWithMessage("获取用户信息失败", "获取用户信息失败,Err:"+err.Error())
+		return
+	}
+	if err = wxInfo.GetResponseError(); err != nil {
+		this.FailWithMessage("获取用户信息失败", "获取用户信息失败,code:"+strconv.Itoa(wxInfo.ErrCode)+",msg:"+wxInfo.ErrMSG)
+		return
+	}
+	item := &services.WxAccessToken{
+		//AccessToken  :wxInfo.
+		//ExpiresIn    :wxInfo.,
+		//RefreshToken : wxInfo,
+		Openid:  wxInfo.OpenID,
+		Unionid: wxInfo.UnionID,
+		//Scope        :wxInfo,
+		Errcode: wxInfo.ErrCode,
+		Errmsg:  wxInfo.ErrMSG,
+	}
+
+	wxUserInfo := new(services.WxUserInfo)
+	wxUserInfo.Unionid = wxInfo.UnionID
+	wxUserInfo.Openid = wxInfo.OpenID
+	wxUserInfo.Unionid = wxInfo.UnionID
+	wxUserInfo.Errcode = wxInfo.ErrCode
+	wxUserInfo.Errmsg = wxInfo.ErrMSG
+	wxUserInfo.SessionKey = wxInfo.SessionKey
+
+	fmt.Println("openId", wxInfo.OpenID)
+	fmt.Println("unionId", wxInfo.UnionID)
+
+	token, adminWx, err := services.WxLogin(utils.WxPlatform2, item, wxUserInfo)
+	if err != nil {
+		this.FailWithMessage("微信登录失败", "微信登录失败,err:"+err.Error())
+		return
+	}
+
+	resp := wechat.WxLoginResp{
+		AdminId:       adminWx.AdminId,
+		Code:          0,
+		Authorization: token,
+		Headimgurl:    adminWx.Headimgurl,
+		RealName:      adminWx.RealName,
+	}
+
+	//登录日志
+	{
+		returnResult, err := json.Marshal(resp)
+		if err != nil {
+			utils.FileLog.Info(this.Ctx.Input.URI() + " Err:%s" + err.Error())
+		}
+		utils.FileLog.Info(this.Ctx.Input.URI()+" code: %s , return data: %s", code, string(returnResult))
+	}
+
+	this.OkDetailed(resp, "登录成功")
+}
+
+// @Title 小程序获取用户信息
+// @Description 小程序获取用户信息接口(需要登录)
+// @Param	request	body models.WxGetUserInfoReq true "type json string"
+// @Success 200 {object} models.WxGetUserInfoResp
+// @router /getUserInfo [post]
+//func (this *WechatController) GetUserInfo() {
+//	br := new(models.BaseResponse).Init()
+//	defer func() {
+//		this.Data["json"] = br
+//		this.ServeJSON()
+//	}()
+//	var req models.WxGetUserInfoReq
+//	err := json.Unmarshal(this.Ctx.Input.RequestBody, &req)
+//	if err != nil {
+//		br.Msg = "参数解析异常!"
+//		br.ErrMsg = "参数解析失败,Err:" + err.Error()
+//		return
+//	}
+//	if req.RawData == "" || req.EncryptedData == "" || req.Signature == "" || req.Iv == "" {
+//		br.Msg = "参数错误"
+//		return
+//	}
+//	user := this.User
+//	if user == nil {
+//		br.Msg = "请登陆"
+//		br.Ret = 408
+//		return
+//	}
+//	userId := user.UserId
+//	sessionKey := user.SessionKey
+//	fmt.Println("sessionKey:", sessionKey)
+//	fmt.Println(sessionKey, req.RawData, req.EncryptedData, req.Signature, req.Iv)
+//	userInfo, err := weapp.DecryptUserInfo(sessionKey, req.RawData, req.EncryptedData, req.Signature, req.Iv)
+//	fmt.Println("weapp.DecryptUserInfo ", err)
+//
+//	if err != nil {
+//		br.Msg = "解析用户信息失败"
+//		br.ErrMsg = "解析用户信息失败,DecryptUserInfo Err:" + err.Error()
+//		return
+//	}
+//	//修改用户微信信息
+//	err = models.ModifyUserRecordByDetail(userInfo.OpenID, userInfo.UnionID, userInfo.Nickname, userInfo.Avatar, userInfo.City, userInfo.Province, userInfo.Country, userInfo.Gender, userId)
+//	if err != nil {
+//		br.Msg = "授权失败"
+//		br.ErrMsg = "授权失败,修改用户信息失败:" + err.Error()
+//		return
+//	}
+//	var token string
+//	tokenItem, err := models.GetTokenByOpenId(userInfo.OpenID)
+//	if err != nil && err.Error() != utils.ErrNoRow() {
+//		br.Msg = "授权失败"
+//		br.ErrMsg = "授权失败,获取token失败:" + err.Error()
+//		return
+//	}
+//
+//	if tokenItem == nil || (err != nil && err.Error() == utils.ErrNoRow()) {
+//		timeUnix := time.Now().Unix()
+//		timeUnixStr := strconv.FormatInt(timeUnix, 10)
+//		token = utils.MD5(userInfo.OpenID) + utils.MD5(timeUnixStr)
+//		//新增session
+//		{
+//			session := new(models.CygxSession)
+//			session.OpenId = userInfo.OpenID
+//			session.UnionId = userInfo.UnionID
+//			session.UserId = userId
+//			session.CreatedTime = time.Now()
+//			session.LastUpdatedTime = time.Now()
+//			session.ExpireTime = time.Now().AddDate(0, 3, 0)
+//			session.AccessToken = token
+//			err = models.AddSession(session)
+//			if err != nil {
+//				br.Msg = "授权失败"
+//				br.ErrMsg = "授权失败,新增用户session信息失败:" + err.Error()
+//				return
+//			}
+//		}
+//	} else {
+//		token = tokenItem.AccessToken
+//	}
+//	resp := new(models.WxGetUserInfoResp)
+//	resp.Authorization = token
+//	br.Msg = "获取成功!"
+//	br.Ret = 200
+//	br.Success = true
+//}

+ 7 - 1
models/db_init.go

@@ -4,6 +4,8 @@ import (
 	_ "github.com/go-sql-driver/mysql"
 	"hongze/hongze_mobile_admin/models/tables/admin"
 	"hongze/hongze_mobile_admin/models/tables/admin_record"
+	"hongze/hongze_mobile_admin/models/tables/approval_flow"
+	"hongze/hongze_mobile_admin/models/tables/approval_flow_node"
 	"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"
@@ -22,7 +24,7 @@ import (
 	"time"
 )
 
-func InitDb() {
+func init() {
 	_ = orm.RegisterDataBase("default", "mysql", utils.MYSQL_URL)
 	orm.SetMaxIdleConns("default", 50)
 	orm.SetMaxOpenConns("default", 100)
@@ -55,6 +57,10 @@ func InitDb() {
 		new(wx_token.WxToken),
 		new(wx_user.WxUser),
 		new(report.Report),
+		new(approval_flow.ApprovalFlow),
+		new(approval_flow_node.ApprovalFlowNode),
 	)
 
 }
+
+func InitDb() {}

+ 20 - 0
models/response/message/message.go

@@ -0,0 +1,20 @@
+package message
+
+import "hongze/hongze_mobile_admin/models/tables/company_approval_message"
+
+//消息汇总页数据
+type SummaryMessageListResp struct {
+	CompanyMessage  SummaryMessage `description:"客户审批数据"`
+	ContractMessage SummaryMessage `description:"合同审批数据"`
+	SealMessage     SummaryMessage `description:"用印审批数据"`
+}
+
+type SummaryMessage struct {
+	Message string `description:"消息"`
+	Total   int    `description:"未读数据数"`
+}
+
+type CompanyApprovalMessageListResp struct {
+	List  []*company_approval_message.CompanyApprovalMessageList
+	Total int `description:"总数据条数"`
+}

+ 16 - 0
models/tables/admin/admin.go

@@ -48,6 +48,22 @@ func GetAdminById(adminId int) (item *Admin, err error) {
 	return
 }
 
+//根据权限code获取系统用户列表
+func GetAdminListByRoleCode(roleTypeCode string) (items []*Admin, err error) {
+	sql := `SELECT * FROM admin WHERE role_type_code=? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, roleTypeCode).QueryRows(&items)
+	return
+}
+
+//根据用户id字符串获取系统用户列表
+func GetAdminListByIds(ids string) (items []*Admin, err error) {
+	sql := `SELECT * FROM admin WHERE admin_id in (` + ids + `)`
+	o := orm.NewOrm()
+	_, err = o.Raw(sql).QueryRows(&items)
+	return
+}
+
 //根据管理员id获取管理员信息(包含微信、第三方信息)
 func GetAdminWxById(adminId int) (item *custom.AdminWx, err error) {
 	sql := `SELECT * FROM admin WHERE admin_id=? LIMIT 1`

+ 35 - 0
models/tables/approval_flow/approval_flow.go

@@ -0,0 +1,35 @@
+package approval_flow
+
+import (
+	"hongze/hongze_mobile_admin/models/tables/approval_flow_node"
+	"rdluck_tools/orm"
+	"time"
+)
+
+//审批流程主体信息表
+type ApprovalFlow struct {
+	FlowId      int       `orm:"column(flow_id);pk";json:"flow_id"`         // 流程id
+	FlowName    string    `orm:"column(flow_name);" json:"flow_name"`       // 流程名称
+	ProductId   int       `orm:"column(product_id);" json:"product_id"`     //所属类型,0代表通用,1:ficc部门,2:权益部门
+	CurrVersion int       `orm:"column(curr_version);" json:"curr_version"` // 当前流程版本
+	ModifyTime  time.Time `orm:"column(modify_time);" json:"modify_time"`   // 最近一次修改时间
+	CreateTime  time.Time `orm:"column(create_time);" json:"create_time"`   // 创建时间
+}
+
+type ApprovalFlowItem struct {
+	FlowId      int                                        `description:"流程id"`                       // 流程id
+	FlowName    string                                     `description:"流程名称"`                       // 流程名称
+	ProductId   int                                        `description:"所属类型,0代表通用,1:ficc部门,2:权益部门"` //所属类型,0代表通用,1:ficc部门,2:权益部门
+	CurrVersion int                                        `description:"当前流程版本"`                     // 当前流程版本
+	ModifyTime  time.Time                                  `description:"最近一次修改时间"`                   // 最近一次修改时间
+	CreateTime  time.Time                                  `description:"创建时间"`                       // 创建时间
+	NodeList    []*approval_flow_node.ApprovalFlowNodeList `description:"节点流程列表"`                     //节点流程列表
+}
+
+//根据流程id获取审批流程主体信息
+func GetByFlowItemId(flowId int) (item *ApprovalFlowItem, err error) {
+	sql := `SELECT * FROM approval_flow WHERE flow_id=? LIMIT 1 `
+	o := orm.NewOrm()
+	err = o.Raw(sql, flowId).QueryRow(&item)
+	return
+}

+ 51 - 0
models/tables/approval_flow_node/approval_flow_node.go

@@ -0,0 +1,51 @@
+package approval_flow_node
+
+import (
+	"rdluck_tools/orm"
+	"time"
+)
+
+//审批流程节点路线表
+type ApprovalFlowNode struct {
+	NodeId     int       `orm:"column(node_id);pk";json:"node_id"`         // 流程节点id
+	FlowId     int       `orm:"column(flow_id);";json:"flow_id"`           // 流程id
+	NodeName   string    `orm:"column(node_name);" json:"node_name"`       // 流程节点名称
+	PrevNodeId int       `orm:"column(prev_node_id);" json:"prev_node_id"` //上级节点id,为0代表是开始节点
+	NextNodeId int       `orm:"column(next_node_id);" json:"next_node_id"` //下级节点id,为0代表是结束节点
+	NodeType   string    `orm:"column(node_type);" json:"node_type"`       //节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check
+	AuditType  int       `orm:"column(audit_type);" json:"audit_type"`     //多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)
+	UserType   string    `orm:"column(user_type);" json:"user_type"`       //用户类型,枚举值,user:指定人,manager:主管,role:角色
+	User       string    `orm:"column(user);" json:"user"`                 //所属用户,多个用英文,隔开;用户类型为user代表指定人id,manager代表几级主管,role代表角色类型
+	Version    int       `orm:"column(version);" json:"version"`           // 所属流程版本
+	CreateTime time.Time `orm:"column(create_time);" json:"create_time"`   // 创建时间
+}
+
+//审批列表数据
+type ApprovalFlowNodeList struct {
+	NodeId     int       `description:"流程节点id"`                                       // 流程节点id
+	FlowId     int       `description:"流程id"`                                         // 流程id
+	NodeName   string    `description:"流程节点名称"`                                       // 流程节点名称
+	PrevNodeId int       `description:"上级节点id,为0代表是开始节点"`                             //上级节点id,为0代表是开始节点
+	NextNodeId int       `description:"下级节点id,为0代表是结束节点"`                             //下级节点id,为0代表是结束节点
+	NodeType   string    `description:"节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check"` //节点类型,审批人:check;抄送人:cc(Carbon Copy),默认是:check
+	AuditType  int       `description:"多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)"`         //多人审批时,1:或签(一名审批人同意即可),2:会签(需所有审批人同意)
+	UserType   string    `description:"用户类型,枚举值,user:指定人,manager:主管,role:角色"`         //用户类型,枚举值,user:指定人,manager:主管,role:角色
+	User       string    `json:"-"`                                                   //所属用户,多个用英文,隔开;用户类型为user代表指定人id,manager代表几级主管,role代表角色类型
+	Version    int       `description:"所属流程版本"`                                       // 所属流程版本
+	CreateTime time.Time `description:"创建时间"`                                         // 创建时间
+	UserList   []User    `description:"审批人、抄送人列表信息"`                                  // 审批人、抄送人列表信息
+}
+
+//审批人、抄送人信息
+type User struct {
+	AdminId int    `description:"人员id(审批人、抄送人)"`
+	Name    string `description:"人员名称(审批人、抄送人)"`
+}
+
+//根据流程id获取整个审批流程节点路线
+func GetListByFlowId(flowId, version int) (items []*ApprovalFlowNodeList, err error) {
+	sql := `SELECT * FROM approval_flow_node WHERE flow_id=? AND version=? order by node_id asc `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, flowId, version).QueryRows(&items)
+	return
+}

+ 95 - 1
models/tables/company_approval_message/company_approval_message.go

@@ -9,7 +9,8 @@ type CompanyApprovalMessage struct {
 	Id                int       `orm:"column(id);pk"`
 	CreateUserId      int       `description:"申请者id"`
 	ReceiveUserId     int       `description:"审批者id"`
-	MessageStatus     int       `description:"消息状态:0未读,1:已读"`
+	MessageStatus     int       `description:"消息状态:0未读,1:已读,2:作废"`
+	SourceType        int       `description:"消息来源类型,1:客户,2:合同"`
 	Remark            string    `description:"备注信息"`
 	Content           string    `description:"消息内容"`
 	CompanyId         int       `description:"客户id"`
@@ -17,6 +18,7 @@ type CompanyApprovalMessage struct {
 	CreateTime        time.Time `description:"创建时间"`
 	ModifyTime        time.Time `description:"修改时间"`
 	CompanyApprovalId int       `description:"审批单id"`
+	ApprovalStatus    int       `description:"审批结果:1:待审批,2:已审批,3:已驳回"`
 	OperationStatus   int       `description:"消息状态:1:待审批,2:已审批"`
 	MessageType       int       `description:"1:申请消息,2:审批结果"`
 }
@@ -35,3 +37,95 @@ func ModifyCompanyApprovalMessage(companyApprovalId int) (err error) {
 	_, err = o.Raw(sql, companyApprovalId).Exec()
 	return
 }
+
+//消息列表结果
+type CompanyApprovalMessageList struct {
+	Id                int    `orm:"column(id);pk"`
+	CreateUserId      int    `description:"申请者id"`
+	MessageStatus     int    `description:"消息状态:0未读,1:已读,2:作废"`
+	MessageType       int    `description:"1:申请消息,2:审批结果"`
+	ApprovalStatus    int    `description:"审批结果:1:待审批,2:已审批,3:已驳回"`
+	SourceType        int    `description:"消息来源类型,1:客户,2:合同,3:用印"`
+	Remark            string `description:"备注信息"`
+	Content           string `description:"消息内容"`
+	CompanyName       string `description:"客户名称"`
+	CreateTime        string `description:"创建时间"`
+	RealName          string `description:"销售名称"`
+	CompanyApprovalId int    `description:"审批单id"`
+}
+
+type CompanyApprovalMessageListResp struct {
+	List  []*CompanyApprovalMessageList
+	Total int `description:"总数据条数"`
+}
+
+//待办消息列表
+type CompanyApprovalMessageListV2Resp struct {
+	Company  CompanyApprovalMessageListResp `description:"客户"`
+	Contract CompanyApprovalMessageListResp `description:"合同"`
+}
+
+//获取消息列表总数据
+func GetCompanyApprovalMessageCount(sysUserId, sourceType int) (count int, err error) {
+	sql := `SELECT COUNT(1) AS count FROM company_approval_message AS a
+			INNER JOIN admin AS b ON a.create_user_id=b.admin_id
+			WHERE receive_user_id=? AND a.operation_status=1 AND message_status !=2 AND a.source_type=? `
+	o := orm.NewOrm()
+	err = o.Raw(sql, sysUserId, sourceType).QueryRow(&count)
+	return
+}
+
+//消息列表页
+func GetCompanyApprovalMessageList(sysUserId, sourceType, startSize, pageSize int) (items []*CompanyApprovalMessageList, err error) {
+	sql := `SELECT a.*,b.real_name FROM company_approval_message AS a
+			INNER JOIN admin AS b ON a.create_user_id=b.admin_id
+			WHERE receive_user_id=? AND a.operation_status=1 AND message_status !=2 AND a.source_type=? `
+	sql += ` ORDER BY create_time DESC LIMIT ?,? `
+	o := orm.NewOrm()
+	_, err = o.Raw(sql, sysUserId, sourceType, startSize, pageSize).QueryRows(&items)
+	return
+}
+
+//获取最近一条消息
+func GetLastMessage(sysUserId, sourceType int) (item *CompanyApprovalMessageList, err error) {
+	sql := `SELECT a.*,b.real_name FROM company_approval_message AS a
+			INNER JOIN admin AS b ON a.create_user_id=b.admin_id
+			WHERE receive_user_id=? AND a.operation_status=1 AND message_status !=2 AND source_type=?`
+	sql += ` ORDER BY create_time DESC `
+	o := orm.NewOrm()
+	err = o.Raw(sql, sysUserId, sourceType).QueryRow(&item)
+	return
+}
+
+//获取未读消息数
+func GetNotReadMessageTotal(sysUserId, sourceType int) (total int64, err error) {
+	sql := `SELECT count(*) total FROM company_approval_message AS a
+			INNER JOIN admin AS b ON a.create_user_id=b.admin_id
+			WHERE receive_user_id=? AND a.operation_status=1 AND a.message_status =0 AND source_type=?`
+	o := orm.NewOrm()
+	err = o.Raw(sql, sysUserId, sourceType).QueryRow(&total)
+	return
+}
+
+//申请服务更新请求参数
+type CompanyApprovalMessageReadReq struct {
+	Id int `description:"消息id"`
+}
+
+//变更为消息已读状态
+func ModifyCompanyApprovalMessageStatus(companyApprovalMessageId int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_approval_message SET message_status=1,modify_time=NOW() WHERE id=?`
+	_, err = o.Raw(sql, companyApprovalMessageId).Exec()
+	return
+}
+
+//消息作废
+func CancelCompanyApprovalMessage(companyApprovalId, sourceType int) (err error) {
+	o := orm.NewOrm()
+	sql := `UPDATE company_approval_message SET message_status=2,modify_time=NOW() 
+WHERE company_approval_id=? AND source_type=?  AND message_type=1 AND operation_status=1 `
+	//sql := `UPDATE company_approval_message SET message_status=1,modify_time=NOW() WHERE id=?`
+	_, err = o.Raw(sql, companyApprovalId, sourceType).Exec()
+	return
+}

+ 5 - 0
routers/router.go

@@ -40,6 +40,11 @@ func init() {
 				&controllers.ApprovalCommon{},
 			),
 		),
+		beego.NSNamespace("/message",
+			beego.NSInclude(
+				&controllers.MessageCommon{},
+			),
+		),
 		beego.NSInclude(
 			&controllers.ContractCommon{},
 		),

+ 6 - 0
services/admin.go

@@ -190,6 +190,12 @@ func BindWxUser(openid, userName, password string, registerPlatform int) (adminW
 	return
 }
 
+//用户解绑
+func UnbindWxUser(openid string) (err error) {
+	err = admin_record.UnBindAdminRecordByOpenid(openid)
+	return
+}
+
 //微信登录
 func WxLogin(wxPlatform int, wxAccessToken *WxAccessToken, wxUserInfo *WxUserInfo) (token string, adminWx *custom.AdminWx, err error) {
 	openId := wxAccessToken.Openid

+ 75 - 0
services/approval_flow.go

@@ -0,0 +1,75 @@
+package services
+
+import (
+	"errors"
+	"hongze/hongze_mobile_admin/models/tables/admin"
+	"hongze/hongze_mobile_admin/models/tables/approval_flow"
+	"hongze/hongze_mobile_admin/models/tables/approval_flow_node"
+	"strings"
+)
+
+//获取审批工作流(基础)
+func GetApprovalFlow(flowId int) (approvalFlow *approval_flow.ApprovalFlowItem, err error) {
+	approvalFlow, err = approval_flow.GetByFlowItemId(flowId)
+	if err != nil {
+		err = errors.New("查询审批流程失败:Err:" + err.Error())
+		return
+	}
+	approvalFlowNodeList, err := approval_flow_node.GetListByFlowId(approvalFlow.FlowId, approvalFlow.CurrVersion)
+	if err != nil {
+		err = errors.New("查询审批节点失败:Err:" + err.Error())
+		return
+	}
+	for _, approvalFlowNode := range approvalFlowNodeList {
+		userList, tmpErr := getAdminListByUserType(approvalFlowNode.UserType, approvalFlowNode.User, approvalFlow.ProductId)
+		if tmpErr != nil {
+			err = errors.New("获取审批人失败:Err:" + tmpErr.Error())
+			return
+		}
+		for _, user := range userList {
+			userInfo := approval_flow_node.User{
+				AdminId: user.AdminId,
+				Name:    user.RealName,
+			}
+			approvalFlowNode.UserList = append(approvalFlowNode.UserList, userInfo)
+		}
+	}
+	approvalFlow.NodeList = approvalFlowNodeList
+
+	return
+}
+
+//获取审批人信息
+func getAdminListByUserType(userType, user string, productId int) (adminList []*admin.Admin, err error) {
+	switch userType {
+	case "user":
+		adminList, err = admin.GetAdminListByIds(user)
+		return
+	case "manager":
+		roleTypeCode := ``
+		if productId == 1 {
+			roleTypeCode = `ficc_admin`
+		} else if productId == 1 {
+			roleTypeCode = `rai_admin`
+		}
+		if roleTypeCode == `` {
+			err = errors.New("找不到对应的主管")
+			return
+		}
+		adminList, err = admin.GetAdminListByRoleCode(roleTypeCode)
+		return
+	case "role": //角色类型
+		roleSlice := strings.Split(user, ",")
+		for _, roleTypeCode := range roleSlice {
+			list, tmpErr := admin.GetAdminListByRoleCode(roleTypeCode)
+			if tmpErr != nil {
+				err = tmpErr
+				return
+			}
+			adminList = append(adminList, list...)
+		}
+		return
+	}
+	err = errors.New("查找审批人信息异常")
+	return
+}

+ 1 - 0
services/wechat.go

@@ -123,6 +123,7 @@ type WxUserInfo struct {
 	Remark         string `json:"remark"`
 	Groupid        int    `json:"groupid"`
 	SubscribeScene string `json:"subscribe_scene"`
+	SessionKey     string `json:"session_key"`
 	Errcode        int    `json:"errcode"`
 	Errmsg         string `json:"errmsg"`
 }

+ 12 - 0
utils/config.go

@@ -21,6 +21,12 @@ var (
 	TemplateRedirectUrl      string //模板消息跳转地址
 	WxPlatform               int    //用户来源,需要入库,用来保存该用户来自哪个平台,默认是:1
 	TemplateIdByCompanyApply string //客户申请单审批通知-模板ID
+
+	//微信小程序appid
+	WxId2        string //微信原始ID
+	WxAppId2     string
+	WxAppSecret2 string
+	WxPlatform2  int //用户来源,需要入库,用来保存该用户来自哪个平台,默认是:1
 )
 
 func init() {
@@ -34,6 +40,12 @@ func init() {
 	MYSQL_URL = config["mysql_url"]
 	MYSQL_URL_RDDP = config["mysql_url_rddp"]
 
+	//小程序appid配置
+	WxAppId2 = `wx67b68e39913e511e`
+	WxId2 = `wx67b68e39913e511e`
+	WxAppSecret2 = `660b0375f701a19220bb8a662b41c77c`
+	WxPlatform2 = 5
+
 	if RunMode == "release" {
 		WxAppId = "wx4a844c734d8c8e56"
 		WxAppSecret = "26c586e7ccb3c575433f0f37797b3eeb"