Browse Source

feature(客户领用审核): 接口联调、调整

likai 2 years ago
parent
commit
88f10296c5

+ 89 - 0
opms_parent/app/handler/dingtalk/ding_event.go

@@ -2,7 +2,10 @@ package dingtalk
 
 import (
 	"context"
+	model "dashoo.cn/micro/app/model/workflow"
+	custServer "dashoo.cn/micro/app/service/cust"
 	platServer "dashoo.cn/micro/app/service/plat"
+	workflowServer "dashoo.cn/micro/app/service/workflow"
 	"dashoo.cn/opms_libary/plugin/dingtalk"
 	dingContext "dashoo.cn/opms_libary/plugin/dingtalk/context"
 	"dashoo.cn/opms_libary/plugin/dingtalk/message"
@@ -25,6 +28,10 @@ func (h *DingHandler) CallBack(ctx context.Context, req *message.SubsMessage, rs
 			return h.handleCheckUrl(msg)
 		case message.EventCalendarChange:
 			return h.handleCalendarChange(msg, handler.Context)
+		case message.BpmsInstanceChange:
+			return h.handleBpmsInstanceChange(msg, handler.Context)
+		case message.BpmsTaskChange:
+			return h.handleBpmsTaskChange(msg, handler.Context)
 		}
 		return ""
 	})
@@ -33,11 +40,13 @@ func (h *DingHandler) CallBack(ctx context.Context, req *message.SubsMessage, rs
 	return nil
 }
 
+// 验证回调参数
 func (h *DingHandler) handleCheckUrl(msg *message.MixMessage) string {
 	fmt.Println(msg)
 	return "success"
 }
 
+// 处理日程回调
 func (h *DingHandler) handleCalendarChange(msg *message.MixMessage, ctx *dingContext.Context) string {
 	fmt.Println(msg)
 
@@ -55,3 +64,83 @@ func (h *DingHandler) handleCalendarChange(msg *message.MixMessage, ctx *dingCon
 	}
 	return "success"
 }
+
+// 处理审批实例回调
+func (h *DingHandler) handleBpmsInstanceChange(msg *message.MixMessage, ctx *dingContext.Context) string {
+	fmt.Println(msg)
+
+	// 构造访问服务
+	s, err := workflowServer.NewFlowService(ctx.SubsMessage.Ctx)
+	if err != nil {
+		glog.Error(err)
+		return err.Error()
+	}
+	// 获取审批实例数据
+	instance, err := s.GetWorkflowInstance(msg.ProcessInstanceId)
+	// 处理实例数据(不需要钉钉审批实例参数)
+	switch instance.BizType {
+	case model.CustomerReceive:
+		if msg.ProcessType == "finish" {
+			srv, err := custServer.NewCustomerService(ctx.SubsMessage.Ctx)
+			if err != nil {
+				glog.Error(err)
+				return "fail"
+			}
+			err = srv.AssignCustomerRequestApproval(instance, msg)
+			if err != nil {
+				glog.Error(err)
+				return "fail"
+			}
+		}
+		return "success"
+	case model.ProjectCreate:
+		if msg.ProcessType == "finish" {
+			//srv.Handle(instance, msg)
+		}
+		return "success"
+	case model.ContractCreate:
+		if msg.ProcessType == "finish" {
+			//srv.Handle(instance, msg)
+		}
+		return "success"
+	}
+
+	// 以下的代码需要调用钉钉接口查询数据,并且以下接口需要审批实例的数据
+	//// 获取钉钉数据
+	//resp, err := s.GetProcessInstanceDetail(msg.ProcessInstanceId)
+	//if err != nil {
+	//	glog.Error(err)
+	//	return err.Error()
+	//}
+	//if resp.Success == "false" {
+	//	return "fail"
+	//}
+	////按照类型处理数据(不需要钉钉审批实例参数)
+	//switch instance.BizType {
+	//case model.CustomerReceive:
+	//	if msg.ProcessType == "finish" {
+	//		//srv.Handle(instance, msg, resp)
+	//	}
+
+	return "success"
+}
+
+// 处理审批任务回调
+func (h *DingHandler) handleBpmsTaskChange(msg *message.MixMessage, ctx *dingContext.Context) string {
+	fmt.Println(msg)
+
+	// TODO 目前审批任务无处理逻辑
+	//// 本系统数据库操作
+	//s, err := platServer.NewScheduleService(ctx.SubsMessage.Ctx)
+	//if err != nil {
+	//	glog.Error(err)
+	//	return err.Error()
+	//}
+	//// 回填数据
+	//err = s.SaveByDingEvent(msg)
+	//if err != nil {
+	//	glog.Error(err)
+	//	return err.Error()
+	//}
+	return "success"
+}

+ 27 - 0
opms_parent/app/handler/workflow/plat_workflow.go

@@ -0,0 +1,27 @@
+package workflow
+
+import (
+	"context"
+
+	"dashoo.cn/common_definition/comm_def"
+	model "dashoo.cn/micro/app/model/workflow"
+	server "dashoo.cn/micro/app/service/workflow"
+	"github.com/gogf/gf/frame/g"
+)
+
+type PlatWorkflowHandler struct{}
+
+// GetList 获取列表
+func (h *PlatWorkflowHandler) GetList(ctx context.Context, req *model.SearchWorkflowReq, rsp *comm_def.CommonMsg) error {
+	flowService, err := server.NewFlowService(ctx)
+	if err != nil {
+		return err
+	}
+	g.Log().Info("搜索值", req)
+	total, list, err := flowService.GetList(req)
+	if err != nil {
+		return err
+	}
+	rsp.Data = g.Map{"list": list, "total": total}
+	return nil
+}

+ 16 - 0
opms_parent/app/model/workflow/plat_workflow.go

@@ -6,9 +6,25 @@ package workflow
 
 import (
 	"dashoo.cn/micro/app/model/workflow/internal"
+	"dashoo.cn/opms_libary/request"
+)
+
+// BizType 业务类型(10领用20项目创建30合同创建)
+const (
+	CustomerReceive = "11" // 领取公海客户
+	ProjectCreate   = "20" // 项目创建
+	ContractCreate  = "30" // 合同创建
 )
 
 // PlatWorkflow is the golang structure for table plat_workflow.
 type PlatWorkflow internal.PlatWorkflow
 
 // Fill with you ideas below.
+
+// SearchWorkflowReq 查询
+type SearchWorkflowReq struct {
+	BizCode string `json:"bizCode"`
+	BizType string `son:"bizType"`
+	MySelf  string `json:"mySelf"` // 不为0时,查询自己的数据;为0时,查询全部数据
+	request.PageReq
+}

+ 10 - 10
opms_parent/app/service/cust/cust_customer.go

@@ -21,9 +21,9 @@ import (
 
 	"dashoo.cn/micro/app/dao/cust"
 	platdao "dashoo.cn/micro/app/dao/plat"
+	sysDao "dashoo.cn/micro/app/dao/sys"
 	model "dashoo.cn/micro/app/model/cust"
 	workflowModel "dashoo.cn/micro/app/model/workflow"
-	sysDao "dashoo.cn/micro/app/dao/sys"
 	"dashoo.cn/micro/app/service"
 	workflowService "dashoo.cn/micro/app/service/workflow"
 )
@@ -35,7 +35,7 @@ type CustomerService struct {
 	DynamicsDao    *cust.CustCustomerDynamicsDao
 	ContactDao     *cust.CustCustomerContactDao
 	FollowDao      *platdao.PlatFollowupDao
-	UserDao *sysDao.SysUserDao
+	UserDao        *sysDao.SysUserDao
 	BelongServer   *CustomerbelongService
 	ContanctServer *CustomercontactService
 }
@@ -356,7 +356,7 @@ func (s *CustomerService) AssignCustomerRequest(ctx context.Context, req *model.
 		}
 	}
 
-	workflowSrv, err := workflowService.NewTaskService(ctx)
+	workflowSrv, err := workflowService.NewFlowService(ctx)
 	if err != nil {
 		return err
 	}
@@ -386,7 +386,7 @@ func (s *CustomerService) AssignCustomerRequest(ctx context.Context, req *model.
 	return nil
 }
 
-func (s *CustomerService) AssignCustomerRequestApproval(flow workflowModel.PlatWorkflow, msg message.MixMessage) error {
+func (s *CustomerService) AssignCustomerRequestApproval(flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
 	bizCode := strings.Split(flow.BizCode, ":")
 	if len(bizCode) != 2 {
 		return fmt.Errorf("客户领取审批 bizCode 不合法:%s Id: %d", flow.BizCode, flow.Id)
@@ -414,10 +414,10 @@ func (s *CustomerService) AssignCustomerRequestApproval(flow workflowModel.PlatW
 		return fmt.Errorf("客户不存在:%s Id: %d", flow.BizCode, flow.Id)
 	}
 
-	if (msg.ProcessType != "finish" && msg.ProcessType != "terminate") {
+	if msg.ProcessType != "finish" && msg.ProcessType != "terminate" {
 		return fmt.Errorf("无法识别的 ProcessType :%s", msg.ProcessType)
 	}
-	if (msg.Result != "agree" && msg.Result != "refuse") {
+	if msg.Result != "agree" && msg.Result != "refuse" {
 		return fmt.Errorf("无法识别的 Result :%s", msg.Result)
 	}
 
@@ -443,11 +443,11 @@ func (s *CustomerService) AssignCustomerRequestApproval(flow workflowModel.PlatW
 		return err
 	}
 	s.BatchCreatebelong([]*model.CustCustomer{cust}, &model.AssignCustomerReq{
-		Ids: []int64{int64(custId)},
-		SalesId: int64(user.Id),
+		Ids:       []int64{int64(custId)},
+		SalesId:   int64(user.Id),
 		SalesName: user.NickName,
-		Remark: "",
-		Receive: Receive,
+		Remark:    "",
+		Receive:   Receive,
 	})
 	return nil
 }

+ 58 - 12
opms_parent/app/service/workflow/work_flow.go

@@ -2,30 +2,33 @@ package workflow
 
 import (
 	"context"
-	"dashoo.cn/micro/app/dao/plat"
+	dao "dashoo.cn/micro/app/dao/workflow"
+	model "dashoo.cn/micro/app/model/workflow"
 	"dashoo.cn/micro/app/service"
+	"dashoo.cn/opms_libary/myerrors"
 	"dashoo.cn/opms_libary/plugin/dingtalk"
 	"dashoo.cn/opms_libary/plugin/dingtalk/workflow"
 	"dashoo.cn/opms_libary/utils"
 	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/os/gtime"
 )
 
 type workflowService struct {
 	*service.ContextService
 
-	Dao *plat.PlatTaskDao
+	Dao *dao.PlatWorkflowDao
 }
 
-func NewTaskService(ctx context.Context) (svc *workflowService, err error) {
+func NewFlowService(ctx context.Context) (svc *workflowService, err error) {
 	svc = new(workflowService)
 	if svc.ContextService, err = svc.Init(ctx); err != nil {
 		return nil, err
 	}
-	svc.Dao = plat.NewPlatTaskDao(svc.Tenant)
+	svc.Dao = dao.NewPlatWorkflowDao(svc.Tenant)
 	return svc, nil
 }
 
-// GetProcessInstanceDetail 获取审批实例详情
+// GetProcessInstanceDetail 获取审批实例详情(钉钉接口)
 func (s *workflowService) GetProcessInstanceDetail(instId string) (*workflow.QueryProcessInstanceResponse, error) {
 	g.Log().Info("搜索值", instId)
 	// 调用钉钉接口
@@ -38,7 +41,7 @@ func (s *workflowService) GetProcessInstanceDetail(instId string) (*workflow.Que
 	return &resp, nil
 }
 
-// StartProcessInstance 发起一个新的审批流
+// StartProcessInstance 发起一个新的审批流(钉钉接口,并回填到本地系统)
 // OriginatorUserId = utils.String("当前用户的钉钉中的Id")
 // ProcessCode = utils.String("每种审批对应固定的code")
 // bizType:业务类型(10领用20项目创建30合同创建
@@ -47,8 +50,8 @@ func (s *workflowService) StartProcessInstance(bizCode, bizType string, flow *wo
 	g.Log().Info("搜索值", flow)
 	// 参数调整
 	if flow.OriginatorUserId == nil {
-		// TODO s.GetCxtDingId()
-		flow.OriginatorUserId = utils.String("s.GetCxtDingId()")
+		// TODO s.GetCxtDingId() 目前写死
+		flow.OriginatorUserId = utils.String("2710120955840801")
 	}
 	// 调用钉钉接口
 	client := dingtalk.NewClient()
@@ -58,10 +61,10 @@ func (s *workflowService) StartProcessInstance(bizCode, bizType string, flow *wo
 		return 0, err
 	}
 
-	return s.saveWorkflowInstance(bizCode, bizType, resp.InstanceId, flow)
+	return s.saveWorkflowInstance(bizCode, bizType, resp.InstanceId)
 }
 
-// RevokeProcessInstance 撤销审批实例
+// RevokeProcessInstance 撤销审批实例(钉钉接口)
 func (s *workflowService) RevokeProcessInstance(instId, remark string) (string, error) {
 	g.Log().Info("搜索值instId, remark:", instId, remark)
 	// 调用钉钉接口
@@ -76,6 +79,49 @@ func (s *workflowService) RevokeProcessInstance(instId, remark string) (string,
 }
 
 // 将审批实例同步到数据库中
-func (s *workflowService) saveWorkflowInstance(bizCode, bizType, instanceId string, flow *workflow.StartProcessInstanceRequest) (insertId int64, err error) {
-	return 0, nil
+func (s *workflowService) saveWorkflowInstance(bizCode, bizType, instanceId string) (insertId int64, err error) {
+	now := gtime.Now()
+
+	// 构造基础数据
+	var instance model.PlatWorkflow
+	instance.BizCode = bizCode
+	instance.BizType = bizType
+	instance.CurrentNode = "新建"
+	instance.CurrentNodeTime = now.Format("Y-m-d H:i:s")
+	instance.ProcessInstId = instanceId
+	// 填充创建信息
+	service.SetCreatedInfo(&instance, s.GetCxtUserId(), s.GetCxtUserName())
+
+	// 保存数据并返回
+	return s.Dao.InsertAndGetId(instance)
+}
+
+// GetWorkflowInstance 获取实例(本地数据)
+func (s *workflowService) GetWorkflowInstance(instanceId string) (*model.PlatWorkflow, error) {
+	// 查询日程实例
+	return s.Dao.Where("process_inst_id", instanceId).FindOne()
+}
+
+// GetList 任务信息列表(本地数据)
+func (s *workflowService) GetList(req *model.SearchWorkflowReq) (total int, flowList []*model.PlatWorkflow, err error) {
+	flowModel := s.Dao.M
+	if req.BizCode != "" {
+		flowModel = flowModel.Where("biz_code", req.BizCode)
+	}
+	if req.BizType != "" {
+		flowModel = flowModel.Where("biz_type", req.BizType)
+	}
+	if req.MySelf != "0" {
+		flowModel = flowModel.Where("created_by", s.GetCxtUserId())
+	}
+
+	total, err = flowModel.Count()
+	if err != nil {
+		g.Log().Error(err)
+		err = myerrors.DbError("获取总行数失败。")
+		return
+	}
+
+	err = flowModel.Page(req.GetPage()).Order("plat_task.created_time DESC").Scan(&flowList)
+	return
 }

+ 2 - 0
opms_parent/main.go

@@ -3,6 +3,7 @@ package main
 import (
 	"context"
 	"dashoo.cn/micro/app/handler/dingtalk"
+	"dashoo.cn/micro/app/handler/workflow"
 	"dashoo.cn/opms_libary/myerrors"
 	"net/http"
 
@@ -52,6 +53,7 @@ func main() {
 	s.RegisterName("CtrContractInvoice", new(contract.CtrContractInvoice), "")
 	s.RegisterName("WorkOrder", new(work.WorkOrderHandler), "")
 	s.RegisterName("Schedule", new(plat.ScheduleHeader), "")
+	s.RegisterName("PlatWorkflow", new(workflow.PlatWorkflowHandler), "")
 
 	// 钉钉回调接口
 	s.RegisterName("DingEvent", new(dingtalk.DingHandler), "")