| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155 |
- package workflow
- import (
- "context"
- 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/message"
- "dashoo.cn/opms_libary/plugin/dingtalk/workflow"
- "dashoo.cn/opms_libary/utils"
- "github.com/gogf/gf/frame/g"
- "github.com/gogf/gf/os/gtime"
- "github.com/gogf/gf/util/gconv"
- "time"
- )
- type workflowService struct {
- *service.ContextService
- Dao *dao.PlatWorkflowDao
- }
- 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 = dao.NewPlatWorkflowDao(svc.Tenant)
- return svc, nil
- }
- // GetSchemaByProcessCode 获取表单 schema(钉钉接口)
- func (s *workflowService) GetSchemaByProcessCode(processCode string) (*workflow.QuerySchemaByProcessCodeResponse, error) {
- g.Log().Info("搜索值", processCode)
- // 调用钉钉接口
- client := dingtalk.NewClient()
- w := client.GetWorkflow()
- resp, err := w.QuerySchemaByProcessCode(processCode)
- if err != nil {
- return nil, err
- }
- return &resp, nil
- }
- // GetProcessInstanceDetail 获取审批实例详情(钉钉接口)
- func (s *workflowService) GetProcessInstanceDetail(instId string) (*workflow.QueryProcessInstanceResponse, error) {
- g.Log().Info("搜索值", instId)
- // 调用钉钉接口
- client := dingtalk.NewClient()
- w := client.GetWorkflow()
- resp, err := w.QueryProcessInstanceDetail(instId)
- if err != nil {
- return nil, err
- }
- return &resp, nil
- }
- // StartProcessInstance 发起一个新的审批流(钉钉接口,并回填到本地系统)
- // OriginatorUserId = utils.String("当前用户的钉钉中的Id")
- // ProcessCode = utils.String("每种审批对应固定的code")
- // bizType:业务类型(10领用20项目创建30合同创建
- // 详情参照文档:https://open.dingtalk.com/document/orgapp/create-an-approval-instance
- func (s *workflowService) StartProcessInstance(bizCode, bizType, remark string, flow *workflow.StartProcessInstanceRequest) (instanceId string, err error) {
- // 参数调整
- if flow.OriginatorUserId == nil {
- flow.OriginatorUserId = utils.String(s.GetCxtUserDingtalkUid())
- }
- if flow.DeptId == nil {
- flow.DeptId = utils.Int64(gconv.Int64(s.GetCxtUserDeptId()))
- }
- g.Log().Info("搜索值", flow)
- // 调用钉钉接口
- client := dingtalk.NewClient()
- w := client.GetWorkflow()
- resp, err := w.StartProcessInstance(flow)
- if err != nil {
- return "", err
- }
- _, err = s.saveWorkflowInstance(bizCode, bizType, remark, resp.InstanceId)
- return resp.InstanceId, err
- }
- // RevokeProcessInstance 撤销审批实例(钉钉接口)
- func (s *workflowService) RevokeProcessInstance(instId, remark string) (string, error) {
- g.Log().Info("搜索值instId, remark:", instId, remark)
- // 调用钉钉接口
- client := dingtalk.NewClient()
- w := client.GetWorkflow()
- resp, err := w.RevokeProcessInstance(instId, remark, s.GetCxtUserDingtalkUid())
- if err != nil {
- return "", err
- }
- return resp.InstanceId, nil
- }
- // 将审批实例同步到数据库中
- func (s *workflowService) saveWorkflowInstance(bizCode, bizType, remark, instanceId string) (insertId int64, err error) {
- now := gtime.Now()
- // 构造基础数据
- var instance model.PlatWorkflow
- instance.BizCode = bizCode
- instance.BizType = bizType
- instance.CurrentNode = "create"
- instance.CurrentNodeTime = now.Format("Y-m-d H:i:s")
- instance.ProcessInstId = instanceId
- instance.Remark = remark
- // 填充创建信息
- 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()
- }
- // Update 更新(本地数据)
- func (s *workflowService) Update(instance *model.PlatWorkflow, msg *message.MixMessage) (err error) {
- // 保存实例
- instance.CurrentNode = msg.ProcessType
- instance.CurrentNodeTime = time.Unix(gconv.Int64(msg.FinishTime), 0).Format("2006-01-02 15:04:05")
- instance.ApprovalResult = msg.Result
- _, err = s.Dao.Save(instance)
- return
- }
- // 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
- }
|