瀏覽代碼

feature(支持工单): 讲解时长字段

likai 1 年之前
父節點
當前提交
3b2cb927b7

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

@@ -84,6 +84,7 @@ type workOrderColumns struct {
 	SatisfactionRating     string // 满意度评分(1-5)(经销商支持、技术文件支持、售前讲解支持)
 	PromotionProposal      string // 提升建议(经销商支持、技术文件支持、售前讲解支持)
 	TrainSaleApplyId       string // 经销商培训OMS工单申请(销售申请)Id
+	LectureDuration        string // 讲解时长
 }
 
 var (
@@ -147,6 +148,7 @@ var (
 			SatisfactionRating:     "satisfaction_rating",
 			PromotionProposal:      "promotion_proposal",
 			TrainSaleApplyId:       "train_sale_apply_id",
+			LectureDuration:        "lecture_duration",
 		},
 	}
 )
@@ -212,6 +214,7 @@ func NewWorkOrderDao(tenant string) WorkOrderDao {
 			SatisfactionRating:     "satisfaction_rating",
 			PromotionProposal:      "promotion_proposal",
 			TrainSaleApplyId:       "train_sale_apply_id",
+			LectureDuration:        "lecture_duration",
 		},
 	}
 	return dao

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

@@ -64,4 +64,5 @@ type WorkOrder struct {
 	SatisfactionRating     string      `orm:"satisfaction_rating"      json:"satisfactionRating"`     // 满意度评分(1-5)(经销商支持、技术文件支持、售前讲解支持)
 	PromotionProposal      string      `orm:"promotion_proposal"       json:"promotionProposal"`      // 提升建议(经销商支持、技术文件支持、售前讲解支持)
 	TrainSaleApplyId       int         `orm:"train_sale_apply_id"      json:"trainSaleApplyId"`       // 经销商培训OMS工单申请(销售申请)Id
+	LectureDuration        int         `orm:"lecture_duration"         json:"lectureDuration"`        // 讲解时长
 }

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

@@ -37,31 +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"`                             // '试用结束时间 (试用)';
-	DealerIds      string                 `json:"dealerIds"`                                // 关联经销商(多选)
-	DealerNames    string                 `json:"dealerNames"`                              // 经销商名称
-	AgentIds       string                 `json:"agentIds"`                                 // 关联代理商(多选)
-	AgentNames     string                 `json:"agentNames"`                               // 经销商名称
+	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 CreateWorkOrderByTrainSaleApplyReq struct {
@@ -82,71 +82,72 @@ 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#本次讲解情况反馈不能为空"` // 支持反馈-本次讲解情况反馈 (售前讲解 技术文件)
+	LectureDuration        string      `json:"lectureDuration"`                                              // 讲解时长
 }
 
 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"`            // 销售反馈-工单反馈(售后运维工单)
-	SatisfactionRating  string      `json:"satisfactionRating"`           // 满意度评分(1-5)(经销商支持、技术文件支持、售前讲解支持)
-	PromotionProposal   string      `json:"promotionProposal"`            // 提升建议(经销商支持、技术文件支持、售前讲解支持)
+	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 {
@@ -154,7 +155,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#动态信息不能为空"` // 动态信息
 }
 

+ 3 - 1
opms_parent/app/service/work/work_order.go

@@ -730,7 +730,7 @@ func (s *OrderService) FeedbackSupport(ctx context.Context, req *model.FeedbackS
 	if ent.OrderStatus != "30" || !(ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持" || ent.OrderTypeName == "经销商支持" || ent.OrderTypeName == "售后运维工单" || ent.OrderTypeName == "销售申请培训工单") {
 		return myerrors.TipsError("当前工单不可进行支持反馈")
 	}
-	if req.FeedbackSupportTime == nil {
+	if req.FeedbackSupportTime == nil || req.FeedbackSupportTime.IsZero() {
 		req.FeedbackSupportTime = gtime.Now()
 	}
 	if ent.FeedbackSupportBy != 0 {
@@ -743,6 +743,7 @@ func (s *OrderService) FeedbackSupport(ctx context.Context, req *model.FeedbackS
 			"feedback_support_by":      s.CxtUser.Id,
 			"feedback_support_name":    s.CxtUser.NickName,
 			"feedback_support_content": req.FeedbackSupportContent,
+			"lecture_duration":         req.LectureDuration,
 			"updated_by":               s.CxtUser.Id,
 			"updated_name":             s.CxtUser.NickName,
 			"updated_time":             gtime.Now(),
@@ -771,6 +772,7 @@ func (s *OrderService) FeedbackSupport(ctx context.Context, req *model.FeedbackS
 				ApplyId:                ent.TrainSaleApplyId,
 				WorkOrderId:            ent.Id,
 				FeedbackSupportContent: req.FeedbackSupportContent,
+				ExplainDuration:        req.LectureDuration,
 			})
 			if err != nil {
 				return err