Browse Source

feature:支持工单审批通过给销售工程师及分派人员进行提醒,动态表单文件上传修改

liuyaqi 2 years ago
parent
commit
3a3cf0f915

+ 6 - 0
opms_parent/app/dao/work/internal/work_order.go

@@ -45,6 +45,8 @@ type workOrderColumns struct {
 	FormData       string // 表单数据
 	AssignUserId   string // 分派人员ID
 	AssignUserName string // 分派人员姓名
+	SaleId         string // 销售工程师ID
+	SaleName       string // 销售工程师
 	Feedback       string // 反馈信息
 	File           string // 相关文件
 	FinishRemark   string // 完成信息
@@ -83,6 +85,8 @@ var (
 			FormData:       "form_data",
 			AssignUserId:   "assign_user_id",
 			AssignUserName: "assign_user_name",
+			SaleId:         "sale_id",
+			SaleName:       "sale_name",
 			Feedback:       "feedback",
 			File:           "file",
 			FinishRemark:   "finish_remark",
@@ -123,6 +127,8 @@ func NewWorkOrderDao(tenant string) WorkOrderDao {
 			FormData:       "form_data",
 			AssignUserId:   "assign_user_id",
 			AssignUserName: "assign_user_name",
+			SaleId:         "sale_id",
+			SaleName:       "sale_name",
 			Feedback:       "feedback",
 			File:           "file",
 			FinishRemark:   "finish_remark",

+ 32 - 15
opms_parent/app/handler/work/work_order.go

@@ -92,6 +92,23 @@ func (w *WorkOrderHandler) CreateWorkOrder(ctx context.Context, req *model.WorkO
 	return nil
 }
 
+// Swagger:WorkOrder 工单 上传文件
+func (w *WorkOrderHandler) UploadDingtalk(ctx context.Context, req *model.UploadDingtalkReq, rsp *comm_def.CommonMsg) error {
+	orderService, err := workSrv.NewOrderService(ctx)
+	if err != nil {
+		return err
+	}
+	if err := gvalid.CheckStruct(ctx, req, nil); err != nil {
+		return err
+	}
+	data, err := orderService.UploadDingtalk(req)
+	if err != nil {
+		return err
+	}
+	rsp.Data = string(data)
+	return nil
+}
+
 // 创建上传文件工单
 func (w *WorkOrderHandler) CreateUploadFileOrder(ctx context.Context, formData *multipart.Form, rsp *comm_def.CommonMsg) error {
 	orderService, err := workSrv.NewOrderService(ctx)
@@ -173,21 +190,21 @@ func (w *WorkOrderHandler) GetWorkOrderFeedbackByDay(ctx context.Context, req *m
 	return nil
 }
 
-// Swagger:WorkOrder 工单 完成工单
-func (w *WorkOrderHandler) Finish(ctx context.Context, req *model.WorkOrderFinishReq, rsp *comm_def.CommonMsg) error {
-	orderService, err := workSrv.NewOrderService(ctx)
-	if err != nil {
-		return err
-	}
-	if err := gvalid.CheckStruct(ctx, req, nil); err != nil {
-		return err
-	}
-	err = orderService.Finish(ctx, req)
-	if err != nil {
-		return err
-	}
-	return nil
-}
+// // Swagger:WorkOrder 工单 完成工单
+// func (w *WorkOrderHandler) Finish(ctx context.Context, req *model.WorkOrderFinishReq, rsp *comm_def.CommonMsg) error {
+// 	orderService, err := workSrv.NewOrderService(ctx)
+// 	if err != nil {
+// 		return err
+// 	}
+// 	if err := gvalid.CheckStruct(ctx, req, nil); err != nil {
+// 		return err
+// 	}
+// 	err = orderService.Finish(ctx, req)
+// 	if err != nil {
+// 		return err
+// 	}
+// 	return nil
+// }
 
 // Swagger:WorkOrder 工单 关闭工单
 func (w *WorkOrderHandler) Close(ctx context.Context, req *model.WorkOrderCloseReq, rsp *comm_def.CommonMsg) error {

+ 2 - 0
opms_parent/app/model/work/internal/work_order.go

@@ -25,6 +25,8 @@ type WorkOrder struct {
 	FormData       string      `orm:"form_data"        json:"formData"`       // 表单数据
 	AssignUserId   int         `orm:"assign_user_id"   json:"assignUserId"`   // 分派人员ID
 	AssignUserName string      `orm:"assign_user_name" json:"assignUserName"` // 分派人员姓名
+	SaleId         int         `orm:"sale_id"          json:"saleId"`         // 销售工程师ID
+	SaleName       string      `orm:"sale_name"        json:"saleName"`       // 销售工程师
 	Feedback       string      `orm:"feedback"         json:"feedback"`       // 反馈信息
 	File           string      `orm:"file"             json:"file"`           // 相关文件
 	FinishRemark   string      `orm:"finish_remark"    json:"finishRemark"`   // 完成信息

+ 7 - 0
opms_parent/app/model/work/work_order.go

@@ -41,11 +41,18 @@ type WorkOrderReq struct {
 	FormData       []DingTalkFormItemData `json:"formData"         v:"required#表单数据不能为空"`   // 表单数据
 	AssignUserId   int                    `json:"assignUserId"     v:"min:1#分派人员不能为空"`      // 分派人员ID
 	AssignUserName string                 `json:"assignUserName"   v:"required#分派人员姓名不能为空"` // 分派人员姓名
+	SaleId         int                    `json:"saleId"`                                   // 销售工程师ID
+	SaleName       string                 `json:"saleName"`                                 // 销售工程师
 	EndTime        *gtime.Time            `json:"endTime"`                                  // 结束时间
 	File           string                 `json:"file"`                                     // 相关文件
 	Remark         string                 `json:"remark"`                                   // 备注
 }
 
+type UploadDingtalkReq struct {
+	FileName string `json:"fileName" v:"required#文件名不能为空"`
+	FileUrl  string `json:"fileUrl" v:"required#文件地址不能为空"`
+}
+
 type DingTalkFormItemData struct {
 	Id            string      `json:"id"          v:"required#表单ID不能为空"`
 	Name          string      `json:"name"        v:"required#表单名称不能为空"`

+ 101 - 50
opms_parent/app/service/work/work_order.go

@@ -12,6 +12,7 @@ import (
 	proj "dashoo.cn/micro/app/dao/proj"
 	contractModel "dashoo.cn/micro/app/model/contract"
 	workflowModel "dashoo.cn/micro/app/model/workflow"
+	baseService "dashoo.cn/micro/app/service/base"
 	workflowService "dashoo.cn/micro/app/service/workflow"
 	"dashoo.cn/opms_libary/multipart"
 	"dashoo.cn/opms_libary/plugin/dingtalk"
@@ -180,6 +181,28 @@ func (s *OrderService) UpdateById(req *model.UpdateWorkOrderReq) error {
 	return nil
 }
 
+func (s *OrderService) UploadDingtalk(req *model.UploadDingtalkReq) ([]byte, error) {
+	return baseService.UploadDingtalk(s.CxtUser.DingtalkId, req.FileUrl, req.FileName)
+}
+
+func extractFileInfo(v interface{}) (fileinfo []contractModel.DingFileInfo, err error) {
+	defer func() {
+		if r := recover(); r != nil {
+			err = fmt.Errorf("%s", r)
+		}
+		if err != nil {
+			err = fmt.Errorf("解析动态表单文件信息异常 %s", err)
+		}
+	}()
+	fmt.Println(v)
+	s := v.(string)
+	if s == "" {
+		return
+	}
+	err = json.Unmarshal([]byte(s), &fileinfo)
+	return
+}
+
 func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.Form) (err error) {
 	data := new(model.WorkOrder)
 	if err = gconv.Struct(req, data); err != nil {
@@ -198,19 +221,19 @@ func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.
 	data.OrderStatus = "20"
 	service.SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
 
-	if args != nil {
-		for k, v := range req.FormData {
-			if v.ComponentName == "DDAttachment" {
-				file, err := s.UploadFile(args.File["file"])
-				if err != nil {
-					return err
-				}
-				v.Value = file
-				data.File = strings.Join([]string{"dingtalk", file[0].SpaceId, file[0].FileId}, ":")
-			}
-			req.FormData[k].Value = gconv.String(v.Value)
+	fileInfo := []contractModel.DingFileInfo{}
+	for _, v := range req.FormData {
+		if v.ComponentName != "DDAttachment" {
+			continue
+		}
+		fi, err := extractFileInfo(v.Value)
+		if err != nil {
+			return err
 		}
+		fileInfo = append(fileInfo, fi...)
 	}
+	fileInfoByte, err := json.Marshal(fileInfo)
+	data.File = string(fileInfoByte)
 
 	formComponentValues := make([]*workflow.StartProcessInstanceRequestFormComponentValues, 0)
 	if err = gconv.Structs(req.FormData, &formComponentValues); err != nil {
@@ -218,15 +241,15 @@ func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.
 	}
 
 	err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
-		if g.Config().GetBool("dingtalk.disable-for-dev") {
-			g.Log().Warning("disable-for-dev true 未创建钉钉审批!!!!!!!!!!!!")
-			data.OrderStatus = "30"
-			lastId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
-			if err != nil {
-				return err
-			}
-			return s.AddDynamicsByCurrentUser(tx, int(lastId), "创建工单", map[string]interface{}{})
-		}
+		// if g.Config().GetBool("dingtalk.disable-for-dev") {
+		// 	g.Log().Warning("disable-for-dev true 未创建钉钉审批!!!!!!!!!!!!")
+		// 	data.OrderStatus = "30"
+		// 	lastId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
+		// 	if err != nil {
+		// 		return err
+		// 	}
+		// 	return s.AddDynamicsByCurrentUser(tx, int(lastId), "创建工单", map[string]interface{}{})
+		// }
 
 		// 更新项目调级
 		lastId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
@@ -304,6 +327,34 @@ func (s *OrderService) WorkOrderNotify(flow *workflowModel.PlatWorkflow, msg *me
 		data[s.Dao.C.OrderStatus] = "30"
 	}
 
+	if data[s.Dao.C.OrderStatus] == "30" {
+		recvUserIds := []int{}
+		if workOrder.AssignUserId != 0 {
+			recvUserIds = append(recvUserIds, workOrder.AssignUserId)
+		}
+		if workOrder.SaleId != 0 {
+			recvUserIds = append(recvUserIds, workOrder.SaleId)
+		}
+		recvUserIds = service.SliceIntDeduplication(recvUserIds)
+		if len(recvUserIds) != 0 {
+			recvUserIdString := []string{}
+			for _, uid := range recvUserIds {
+				recvUserIdString = append(recvUserIdString, strconv.Itoa(uid))
+			}
+			msg := g.MapStrStr{
+				"msgTitle":    "支持工单审批通过提醒",
+				"msgContent":  fmt.Sprintf("<p>工单:%s 已审批通过</p>", workOrder.Name),
+				"msgType":     "20",
+				"recvUserIds": strings.Join(recvUserIdString, ","),
+				"msgStatus":   "10",
+				"sendType":    "10",
+			}
+			if err := service.CreateSystemMessage(msg); err != nil {
+				g.Log().Error("支持工单审批通过提醒异常:%s", err)
+			}
+		}
+	}
+
 	// 项目修改
 	_, err = s.Dao.WherePri(workOrder.Id).FieldsEx(service.UpdateFieldEx...).Data(data).Update()
 	if err != nil {
@@ -376,36 +427,36 @@ func (s *OrderService) GetWorkOrderFeedbackByDay(req *model.WorkOrderFeedbackSea
 	return
 }
 
-func (s *OrderService) Finish(ctx context.Context, req *model.WorkOrderFinishReq) error {
-	ent, err := s.Dao.Where("id = ?", req.OrderId).One()
-	if err != nil {
-		return err
-	}
-	if ent == nil {
-		return myerrors.TipsError("工单不存在")
-	}
-	if ent.OrderStatus != "30" {
-		return myerrors.TipsError("当前工单不可完成")
-	}
-
-	return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
-		_, err = tx.Update("work_order", map[string]interface{}{
-			"order_status":   "60",
-			"finish_remark":  req.FinishRemark,
-			"finish_time":    gtime.Now(),
-			"finish_by":      s.CxtUser.Id,
-			"finish_by_name": s.CxtUser.NickName,
-			"updated_by":     s.CxtUser.Id,
-			"updated_name":   s.CxtUser.NickName,
-			"updated_time":   gtime.Now(),
-		}, "id = ?", req.OrderId)
-		if err != nil {
-			return err
-		}
-		err = s.AddDynamicsByCurrentUser(tx, int(req.OrderId), "完成工单", map[string]interface{}{})
-		return err
-	})
-}
+// func (s *OrderService) Finish(ctx context.Context, req *model.WorkOrderFinishReq) error {
+// 	ent, err := s.Dao.Where("id = ?", req.OrderId).One()
+// 	if err != nil {
+// 		return err
+// 	}
+// 	if ent == nil {
+// 		return myerrors.TipsError("工单不存在")
+// 	}
+// 	if ent.OrderStatus != "30" {
+// 		return myerrors.TipsError("当前工单不可完成")
+// 	}
+
+// 	return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+// 		_, err = tx.Update("work_order", map[string]interface{}{
+// 			"order_status":   "60",
+// 			"finish_remark":  req.FinishRemark,
+// 			"finish_time":    gtime.Now(),
+// 			"finish_by":      s.CxtUser.Id,
+// 			"finish_by_name": s.CxtUser.NickName,
+// 			"updated_by":     s.CxtUser.Id,
+// 			"updated_name":   s.CxtUser.NickName,
+// 			"updated_time":   gtime.Now(),
+// 		}, "id = ?", req.OrderId)
+// 		if err != nil {
+// 			return err
+// 		}
+// 		err = s.AddDynamicsByCurrentUser(tx, int(req.OrderId), "完成工单", map[string]interface{}{})
+// 		return err
+// 	})
+// }
 
 func (s *OrderService) Close(ctx context.Context, req *model.WorkOrderCloseReq) error {
 	ent, err := s.Dao.Where("id = ?", req.OrderId).One()