浏览代码

feature(工单): 1、支持工单支持手动创建,类型为“经销商支持”
2、经销商支持、技术文件支持、售前讲解支持,销售总结时可以评价

likai 1 年之前
父节点
当前提交
fb3960c228

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

@@ -38,6 +38,10 @@ type workOrderColumns struct {
 	ProductLine            string // 产品线
 	CustId                 string // 关联客户
 	CustName               string // 客户名称
+	DealerIds              string // 关联经销商(多选)
+	DealerNames            string // 经销商名称
+	AgentIds               string // 关联代理商(多选)
+	AgentNames             string // 经销商名称
 	OrderTypeId            string // 工单类型
 	OrderTypeName          string // 工单类型名称
 	OrderStatus            string // 工单状态(10发起20审批中30审批通过40审批拒绝50关闭60已完成)
@@ -77,6 +81,8 @@ type workOrderColumns struct {
 	FeedbackSaleNext       string // 销售反馈-下一步计划 (售前讲解 技术文件)
 	FeedbackSaleUser       string // 销售反馈-用户反馈 (技术文件)
 	FeedbackSaleOrder      string // 销售反馈-工单反馈(售后运维工单)
+	SatisfactionRating     string // 满意度评分(1-5)(经销商支持、技术文件支持、售前讲解支持)
+	PromotionProposal      string // 提升建议(经销商支持、技术文件支持、售前讲解支持)
 }
 
 var (
@@ -94,6 +100,10 @@ var (
 			ProductLine:            "product_line",
 			CustId:                 "cust_id",
 			CustName:               "cust_name",
+			DealerIds:              "dealer_ids",
+			DealerNames:            "dealer_names",
+			AgentIds:               "agent_ids",
+			AgentNames:             "agent_names",
 			OrderTypeId:            "order_type_id",
 			OrderTypeName:          "order_type_name",
 			OrderStatus:            "order_status",
@@ -133,6 +143,8 @@ var (
 			FeedbackSaleNext:       "feedback_sale_next",
 			FeedbackSaleUser:       "feedback_sale_user",
 			FeedbackSaleOrder:      "feedback_sale_order",
+			SatisfactionRating:     "satisfaction_rating",
+			PromotionProposal:      "promotion_proposal",
 		},
 	}
 )
@@ -152,6 +164,10 @@ func NewWorkOrderDao(tenant string) WorkOrderDao {
 			ProductLine:            "product_line",
 			CustId:                 "cust_id",
 			CustName:               "cust_name",
+			DealerIds:              "dealer_ids",
+			DealerNames:            "dealer_names",
+			AgentIds:               "agent_ids",
+			AgentNames:             "agent_names",
 			OrderTypeId:            "order_type_id",
 			OrderTypeName:          "order_type_name",
 			OrderStatus:            "order_status",
@@ -191,6 +207,8 @@ func NewWorkOrderDao(tenant string) WorkOrderDao {
 			FeedbackSaleNext:       "feedback_sale_next",
 			FeedbackSaleUser:       "feedback_sale_user",
 			FeedbackSaleOrder:      "feedback_sale_order",
+			SatisfactionRating:     "satisfaction_rating",
+			PromotionProposal:      "promotion_proposal",
 		},
 	}
 	return dao

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

@@ -18,6 +18,10 @@ type WorkOrder struct {
 	ProductLine            string      `orm:"product_line"             json:"productLine"`            // 产品线
 	CustId                 int         `orm:"cust_id"                  json:"custId"`                 // 关联客户
 	CustName               string      `orm:"cust_name"                json:"custName"`               // 客户名称
+	DealerIds              string      `orm:"dealer_ids"               json:"dealerIds"`              // 关联经销商(多选)
+	DealerNames            string      `orm:"dealer_names"             json:"dealerNames"`            // 经销商名称
+	AgentIds               string      `orm:"agent_ids"                json:"agentIds"`               // 关联代理商(多选)
+	AgentNames             string      `orm:"agent_names"              json:"agentNames"`             // 经销商名称
 	OrderTypeId            int         `orm:"order_type_id"            json:"orderTypeId"`            // 工单类型
 	OrderTypeName          string      `orm:"order_type_name"          json:"orderTypeName"`          // 工单类型名称
 	OrderStatus            string      `orm:"order_status"             json:"orderStatus"`            // 工单状态(10发起20审批中30审批通过40审批拒绝50关闭60已完成)
@@ -57,4 +61,6 @@ type WorkOrder struct {
 	FeedbackSaleNext       string      `orm:"feedback_sale_next"       json:"feedbackSaleNext"`       // 销售反馈-下一步计划 (售前讲解 技术文件)
 	FeedbackSaleUser       string      `orm:"feedback_sale_user"       json:"feedbackSaleUser"`       // 销售反馈-用户反馈 (技术文件)
 	FeedbackSaleOrder      string      `orm:"feedback_sale_order"      json:"feedbackSaleOrder"`      // 销售反馈-工单反馈(售后运维工单)
+	SatisfactionRating     string      `orm:"satisfaction_rating"      json:"satisfactionRating"`     // 满意度评分(1-5)(经销商支持、技术文件支持、售前讲解支持)
+	PromotionProposal      string      `orm:"promotion_proposal"       json:"promotionProposal"`      // 提升建议(经销商支持、技术文件支持、售前讲解支持)
 }

+ 49 - 45
opms_parent/app/model/work/work_order.go

@@ -37,29 +37,31 @@ type WorkOrderSearchReq struct {
 	request.PageReq
 }
 type WorkOrderReq struct {
-	NboId    int    `json:"nboId"`    // 主键
-	NboCode  string `json:"nboCode"`  // 项目编码
-	NboName  string `json:"nboName"`  // 项目名称
-	CustId   int    `json:"custId"`   // 关联客户
-	CustName string `json:"custName"` // 客户名称
-
-	Name           string                 `json:"name"             v:"required#工单名称不能为空"`   // 工单名称
-	OrderTypeId    int                    `json:"orderTypeId"      v:"min:1#工单类型不能为空"`      // 工单类型
+	NboId          int                    `json:"nboId"`                                              // 主键
+	NboCode        string                 `json:"nboCode"`                                            // 项目编码
+	NboName        string                 `json:"nboName"`                                            // 项目名称
+	CustId         int                    `json:"custId"`                                             // 关联客户
+	CustName       string                 `json:"custName"`                                           // 客户名称
+	Name           string                 `json:"name"             v:"required#工单名称不能为空"`     // 工单名称
+	OrderTypeId    int                    `json:"orderTypeId"      v:"min:1#工单类型不能为空"`        // 工单类型
 	OrderTypeName  string                 `json:"orderTypeName"    v:"required#工单类型名称不能为空"` // 工单类型名称
 	OrderTypeCode  string                 `json:"orderTypeCode"    v:"required#工单类型编码不能为空"` // 工单类型名称
-	FormData       []DingTalkFormItemData `json:"formData"         v:"required#表单数据不能为空"`   // 表单数据
-	AssignUserId   int                    `json:"assignUserId"     v:"min:1#分派人员不能为空"`      // 分派人员ID
+	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"`                                   // 备注
-
-	ExpectTime     *gtime.Time `json:"expectTime"`     // 期望完成时间 (技术文件)
-	SupportTime    *gtime.Time `json:"supportTime"`    // 支持时间 (售前讲解)
-	TrialTimeStart *gtime.Time `json:"trialTimeStart"` // '试用开始时间 (试用)';
-	TrialTimeEnd   *gtime.Time `json:"trialTimeEnd"`   // '试用结束时间 (试用)';
+	SaleId         int                    `json:"saleId"`                                             // 销售工程师ID
+	SaleName       string                 `json:"saleName"`                                           // 销售工程师
+	EndTime        *gtime.Time            `json:"endTime"`                                            // 结束时间
+	File           string                 `json:"file"`                                               // 相关文件
+	Remark         string                 `json:"remark"`                                             // 备注
+	ExpectTime     *gtime.Time            `json:"expectTime"`                                         // 期望完成时间 (技术文件)
+	SupportTime    *gtime.Time            `json:"supportTime"`                                        // 支持时间 (售前讲解)
+	TrialTimeStart *gtime.Time            `json:"trialTimeStart"`                                     // '试用开始时间 (试用)';
+	TrialTimeEnd   *gtime.Time            `json:"trialTimeEnd"`                                       // '试用结束时间 (试用)';
+	DealerIds      string                 `json:"dealerIds"`                                          // 关联经销商(多选)
+	DealerNames    string                 `json:"dealerNames"`                                        // 经销商名称
+	AgentIds       string                 `json:"agentIds"`                                           // 关联代理商(多选)
+	AgentNames     string                 `json:"agentNames"`                                         // 经销商名称
 }
 
 type UploadDingtalkReq struct {
@@ -76,69 +78,71 @@ type DingTalkFormItemData struct {
 }
 
 type UpdateWorkOrderReq struct {
-	Id       int    `  json:"id"     v:"min:1#工单不能为空"`      // 主健
+	Id       int    `  json:"id"     v:"min:1#工单不能为空"`        // 主健
 	Feedback string `json:"feedback" v:"required#反馈信息不能为空"` // 反馈信息
-	Remark   string `json:"remark"`                         // 备注
+	Remark   string `json:"remark"`                                 // 备注
 }
 
 type WorkOrderFeedbackReq struct {
-	OrderId  int    `json:"orderId"     v:"min:1#工单不能为空"`   // 主健
+	OrderId  int    `json:"orderId"     v:"min:1#工单不能为空"`     // 主健
 	Feedback string `json:"feedback" v:"required#反馈信息不能为空"` // 反馈信息
-	Remark   string `json:"remark"`                         // 备注
+	Remark   string `json:"remark"`                                 // 备注
 }
 
 type WorkOrderFeedbackSearchReq struct {
 	OrderId         int    `json:"orderId"     v:"min:1#工单不能为空"` // 主健
-	FeePeople       string `json:"feePeople"`                    // 反馈人
+	FeePeople       string `json:"feePeople"`                          // 反馈人
 	DaysBeforeToday int    `json:"daysBeforeToday"`
 	request.PageReq
 }
 
 type WorkOrderFinishReq struct {
 	OrderId      int    `json:"orderId"     v:"min:1#工单不能为空"` //
-	FinishRemark string `json:"finishRemark"`                 // 完成信息
+	FinishRemark string `json:"finishRemark"`                       // 完成信息
 }
 
 type FeedbackSupportReq struct {
-	OrderId                int         `json:"orderId"     v:"min:1#工单不能为空"`                     //
-	FeedbackSupportTime    *gtime.Time `json:"feedbackSupportTime"`                              // 支持反馈-反馈时间 (售前讲解 技术文件)
+	OrderId                int         `json:"orderId"     v:"min:1#工单不能为空"`                           //
+	FeedbackSupportTime    *gtime.Time `json:"feedbackSupportTime"`                                          // 支持反馈-反馈时间 (售前讲解 技术文件)
 	FeedbackSupportContent string      `json:"feedbackSupportContent" v:"required#本次讲解情况反馈不能为空"` // 支持反馈-本次讲解情况反馈 (售前讲解 技术文件)
 }
 
 type FeedbackSaleReq struct {
 	OrderId             int         `json:"orderId"     v:"min:1#工单不能为空"` //
-	FeedbackSaleTime    *gtime.Time `json:"feedbackSaleTime"`             // 销售反馈-反馈时间 (售前讲解 技术文件)
-	FeedbackSaleMeeting string      `json:"feedbackSaleMeeting"`          // 销售反馈-会议纪要 (售前讲解)
-	FeedbackSaleDist    string      `json:"feedbackSaleDist"`             // 销售反馈-客户经销商反馈 (售前讲解)
-	FeedbackSaleNext    string      `json:"feedbackSaleNext"`             // 销售反馈-下一步计划 (售前讲解 技术文件)
-	FeedbackSaleUser    string      `json:"feedbackSaleUser"`             // 销售反馈-用户反馈 (技术文件)
-	FeedbackSaleOrder   string      `json:"feedbackSaleOrder"`            // 销售反馈-工单反馈(售后运维工单)
+	FeedbackSaleTime    *gtime.Time `json:"feedbackSaleTime"`                   // 销售反馈-反馈时间 (售前讲解 技术文件)
+	FeedbackSaleMeeting string      `json:"feedbackSaleMeeting"`                // 销售反馈-会议纪要 (售前讲解)
+	FeedbackSaleDist    string      `json:"feedbackSaleDist"`                   // 销售反馈-客户经销商反馈 (售前讲解)
+	FeedbackSaleNext    string      `json:"feedbackSaleNext"`                   // 销售反馈-下一步计划 (售前讲解 技术文件)
+	FeedbackSaleUser    string      `json:"feedbackSaleUser"`                   // 销售反馈-用户反馈 (技术文件)
+	FeedbackSaleOrder   string      `json:"feedbackSaleOrder"`                  // 销售反馈-工单反馈(售后运维工单)
+	SatisfactionRating  string      `json:"satisfactionRating"`                 // 满意度评分(1-5)(经销商支持、技术文件支持、售前讲解支持)
+	PromotionProposal   string      `json:"promotionProposal"`                  // 提升建议(经销商支持、技术文件支持、售前讲解支持)
 }
 
 type FeedbackTrailReq struct {
-	WorkOrderId          int         `json:"workOrderId" v:"min:1#工单不能为空"`            // 关联工单ID
+	WorkOrderId          int         `json:"workOrderId" v:"min:1#工单不能为空"`              // 关联工单ID
 	FeedbackTrialType    string      `json:"feedbackTrialType" v:"required#反馈类型不能为空"` // 试用反馈类型 10 启动 20 过程 30 总结
-	FeedbackTrialTime    *gtime.Time `json:"feedbackTrialTime"`                       // 试用反馈-反馈时间 (试用)
-	FeedbackTrialContent string      `json:"feedbackTrialContent"`                    // 试用反馈-部署安装总结、会议总结、过程问题、试用总结 (试用)
-	FeedbackTrialDist    string      `json:"feedbackTrialDist"`                       // 试用反馈-客户经销商反馈 (试用)
-	FeedbackTrialPlan    string      `json:"feedbackTrialPlan"`                       // 试用反馈-下一步计划,跟进计划 (试用)
-	Remark               string      `json:"remark"`                                  // 备注
+	FeedbackTrialTime    *gtime.Time `json:"feedbackTrialTime"`                               // 试用反馈-反馈时间 (试用)
+	FeedbackTrialContent string      `json:"feedbackTrialContent"`                            // 试用反馈-部署安装总结、会议总结、过程问题、试用总结 (试用)
+	FeedbackTrialDist    string      `json:"feedbackTrialDist"`                               // 试用反馈-客户经销商反馈 (试用)
+	FeedbackTrialPlan    string      `json:"feedbackTrialPlan"`                               // 试用反馈-下一步计划,跟进计划 (试用)
+	Remark               string      `json:"remark"`                                          // 备注
 }
 
 type TimeUpdateExpectReq struct {
 	OrderId    int         `json:"orderId"     v:"min:1#工单不能为空"` //
-	ExpectTime *gtime.Time `json:"expectTime"`                   // 期望完成时间 (技术文件)
+	ExpectTime *gtime.Time `json:"expectTime"`                         // 期望完成时间 (技术文件)
 }
 
 type TimeUpdateSupportReq struct {
 	OrderId     int         `json:"orderId"     v:"min:1#工单不能为空"` //
-	SupportTime *gtime.Time `json:"supportTime"`                  // 支持时间 (售前讲解)
+	SupportTime *gtime.Time `json:"supportTime"`                        // 支持时间 (售前讲解)
 }
 
 type TimeUpdateTrialReq struct {
 	OrderId        int         `json:"orderId"     v:"min:1#工单不能为空"` //
-	TrialTimeStart *gtime.Time `json:"trialTimeStart"`               // '试用开始时间 (试用)';
-	TrialTimeEnd   *gtime.Time `json:"trialTimeEnd"`                 // '试用结束时间 (试用)';
+	TrialTimeStart *gtime.Time `json:"trialTimeStart"`                     // '试用开始时间 (试用)';
+	TrialTimeEnd   *gtime.Time `json:"trialTimeEnd"`                       // '试用结束时间 (试用)';
 }
 
 type WorkOrderCloseReq struct {
@@ -146,7 +150,7 @@ type WorkOrderCloseReq struct {
 }
 
 type WorkOrderAddDynamics struct {
-	OrderId int    `json:"orderId"     v:"min:1#工单不能为空"`  // 主健
+	OrderId int    `json:"orderId"     v:"min:1#工单不能为空"`    // 主健
 	Content string `json:"content" v:"required#动态信息不能为空"` // 动态信息
 }
 

+ 28 - 21
opms_parent/app/service/work/work_order.go

@@ -306,15 +306,19 @@ func (s *OrderService) CreateWorkOrder(ctx context.Context, req *model.WorkOrder
 		return
 	}
 
-	p, err := s.ProjBusinessDao.Where("id = ?", req.NboId).One()
-	if err != nil {
-		return err
-	}
-	if p == nil {
-		return myerrors.TipsError("项目不存在")
+	// 保存数据(经销商支持不走钉钉审批)
+	if data.OrderTypeName == "经销商支持" {
+		data.OrderStatus = "30"
+	} else {
+		p, err := s.ProjBusinessDao.Where("id = ?", req.NboId).One()
+		if err != nil {
+			return err
+		}
+		if p == nil {
+			return myerrors.TipsError("项目不存在")
+		}
+		data.OrderStatus = "20"
 	}
-
-	data.OrderStatus = "20"
 	service.SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
 
 	// 处理支持人员
@@ -390,23 +394,24 @@ func (s *OrderService) CreateWorkOrder(ctx context.Context, req *model.WorkOrder
 		// fmt.Println(string(aa))
 		// return fmt.Errorf("test")
 
-		// 更新项目调级
 		lastId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
 		if err != nil {
 			return err
 		}
 
-		// 提交工单 审批
-		workflowSrv, _ := workflowService.NewFlowService(s.Ctx)
-		bizCode := gconv.String(lastId) + ":" + req.OrderTypeCode
+		// 提交工单 审批(经销商支持不走钉钉审批)
+		if data.OrderTypeName != "经销商支持" {
+			workflowSrv, _ := workflowService.NewFlowService(s.Ctx)
+			bizCode := gconv.String(lastId) + ":" + req.OrderTypeCode
 
-		_, err = workflowSrv.StartProcessInstance(bizCode, workflowModel.WorkOrderCreate, "", &workflow.StartProcessInstanceRequest{
-			ProcessCode:         &req.OrderTypeCode,
-			FormComponentValues: formComponentValues,
-		})
-		if err != nil {
-			g.Log().Error(err)
-			return err
+			_, err = workflowSrv.StartProcessInstance(bizCode, workflowModel.WorkOrderCreate, "", &workflow.StartProcessInstanceRequest{
+				ProcessCode:         &req.OrderTypeCode,
+				FormComponentValues: formComponentValues,
+			})
+			if err != nil {
+				g.Log().Error(err)
+				return err
+			}
 		}
 		err = s.AddDynamicsByCurrentUser(tx, int(lastId), "创建工单", map[string]interface{}{})
 		return err
@@ -610,7 +615,7 @@ func (s *OrderService) FeedbackSupport(ctx context.Context, req *model.FeedbackS
 	if ent == nil {
 		return myerrors.TipsError("工单不存在")
 	}
-	if ent.OrderStatus != "30" || !(ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持" || ent.OrderTypeName == "售后运维工单") {
+	if ent.OrderStatus != "30" || !(ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持" || ent.OrderTypeName == "经销商支持" || ent.OrderTypeName == "售后运维工单") {
 		return myerrors.TipsError("当前工单不可进行支持反馈")
 	}
 	if req.FeedbackSupportTime == nil {
@@ -656,7 +661,7 @@ func (s *OrderService) FeedbackSale(ctx context.Context, req *model.FeedbackSale
 	if ent == nil {
 		return myerrors.TipsError("工单不存在")
 	}
-	if ent.OrderStatus != "30" || !(ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持" || ent.OrderTypeName == "售后运维工单") {
+	if ent.OrderStatus != "30" || !(ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持" || ent.OrderTypeName == "经销商支持" || ent.OrderTypeName == "售后运维工单") {
 		return myerrors.TipsError("当前工单不可进行销售反馈")
 	}
 	if req.FeedbackSaleTime == nil {
@@ -680,6 +685,8 @@ func (s *OrderService) FeedbackSale(ctx context.Context, req *model.FeedbackSale
 			"feedback_sale_next":    req.FeedbackSaleNext,
 			"feedback_sale_user":    req.FeedbackSaleUser,
 			"feedback_sale_order":   req.FeedbackSaleOrder,
+			"satisfaction_rating":   req.SatisfactionRating,
+			"promotion_proposal":    req.PromotionProposal,
 			"updated_by":            s.CxtUser.Id,
 			"updated_name":          s.CxtUser.NickName,
 			"updated_time":          gtime.Now(),