فهرست منبع

feature:工单优化

liuyaqi 2 سال پیش
والد
کامیت
b991143689

+ 138 - 93
opms_parent/app/dao/work/internal/work_order.go

@@ -30,37 +30,52 @@ type WorkOrderDao struct {
 
 // WorkOrderColumns defines and stores column names for table work_order.
 type workOrderColumns struct {
-	Id             string // 主键
-	Name           string // 工单名称
-	NboId          string // 关联项目
-	NboCode        string // 项目编码
-	NboName        string // 项目名称
-	ProductLine    string // 产品线
-	CustId         string // 关联客户
-	CustName       string // 客户名称
-	OrderTypeId    string // 工单类型
-	OrderTypeName  string // 工单类型名称
-	OrderStatus    string // 工单状态(10发起20审批中30审批通过40审批拒绝50关闭60已完成)
-	EndTime        string // 结束时间
-	FormData       string // 表单数据
-	AssignUserId   string // 分派人员ID
-	AssignUserName string // 分派人员姓名
-	SaleId         string // 销售工程师ID
-	SaleName       string // 销售工程师
-	Feedback       string // 反馈信息
-	File           string // 相关文件
-	FinishRemark   string // 完成信息
-	FinishTime     string // 完成信息
-	FinishBy       string // 完成操作人
-	FinishByName   string // 完成操作人
-	Remark         string // 备注
-	CreatedBy      string // 创建者
-	CreatedName    string // 创建人
-	CreatedTime    string // 创建时间
-	UpdatedBy      string // 更新者
-	UpdatedName    string // 更新人
-	UpdatedTime    string // 更新时间
-	DeletedTime    string // 删除时间
+	Id                     string // 主键
+	Name                   string // 工单名称
+	NboId                  string // 关联项目
+	NboCode                string // 项目编码
+	NboName                string // 项目名称
+	ProductLine            string // 产品线
+	CustId                 string // 关联客户
+	CustName               string // 客户名称
+	OrderTypeId            string // 工单类型
+	OrderTypeName          string // 工单类型名称
+	OrderStatus            string // 工单状态(10发起20审批中30审批通过40审批拒绝50关闭60已完成)
+	EndTime                string // 结束时间
+	FormData               string // 表单数据
+	AssignUserId           string // 分派人员ID
+	AssignUserName         string // 分派人员姓名
+	SaleId                 string // 销售工程师ID
+	SaleName               string // 销售工程师
+	Feedback               string // 反馈信息
+	File                   string // 相关文件
+	FinishRemark           string // 完成信息
+	FinishTime             string // 完成信息
+	FinishBy               string // 完成操作人
+	FinishByName           string // 完成操作人
+	Remark                 string // 备注
+	CreatedBy              string // 创建者
+	CreatedName            string // 创建人
+	CreatedTime            string // 创建时间
+	UpdatedBy              string // 更新者
+	UpdatedName            string // 更新人
+	UpdatedTime            string // 更新时间
+	DeletedTime            string // 删除时间
+	ExpectTime             string // 期望完成时间 (技术文件)
+	SupportTime            string // 支持时间 (售前讲解)
+	TrialTimeStart         string // 试用开始时间 (试用)
+	TrialTimeEnd           string // 试用结束时间 (试用)
+	FeedbackSupportTime    string // 支持反馈-反馈时间 (售前讲解 技术文件)
+	FeedbackSupportBy      string // 支持反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSupportName    string // 支持反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSupportContent string // 支持反馈-本次讲解情况反馈 (售前讲解 技术文件)
+	FeedbackSaleTime       string // 销售反馈-反馈时间 (售前讲解 技术文件)
+	FeedbackSaleBy         string // 销售反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSaleName       string // 销售反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSaleMeeting    string // 销售反馈-会议纪要 (售前讲解)
+	FeedbackSaleDist       string // 销售反馈-客户经销商反馈 (售前讲解)
+	FeedbackSaleNext       string // 销售反馈-下一步计划 (售前讲解 技术文件)
+	FeedbackSaleUser       string // 销售反馈-用户反馈 (技术文件)
 }
 
 var (
@@ -70,37 +85,52 @@ var (
 		DB:    g.DB("default"),
 		Table: "work_order",
 		C: workOrderColumns{
-			Id:             "id",
-			Name:           "name",
-			NboId:          "nbo_id",
-			NboCode:        "nbo_code",
-			NboName:        "nbo_name",
-			ProductLine:    "product_line",
-			CustId:         "cust_id",
-			CustName:       "cust_name",
-			OrderTypeId:    "order_type_id",
-			OrderTypeName:  "order_type_name",
-			OrderStatus:    "order_status",
-			EndTime:        "end_time",
-			FormData:       "form_data",
-			AssignUserId:   "assign_user_id",
-			AssignUserName: "assign_user_name",
-			SaleId:         "sale_id",
-			SaleName:       "sale_name",
-			Feedback:       "feedback",
-			File:           "file",
-			FinishRemark:   "finish_remark",
-			FinishTime:     "finish_time",
-			FinishBy:       "finish_by",
-			FinishByName:   "finish_by_name",
-			Remark:         "remark",
-			CreatedBy:      "created_by",
-			CreatedName:    "created_name",
-			CreatedTime:    "created_time",
-			UpdatedBy:      "updated_by",
-			UpdatedName:    "updated_name",
-			UpdatedTime:    "updated_time",
-			DeletedTime:    "deleted_time",
+			Id:                     "id",
+			Name:                   "name",
+			NboId:                  "nbo_id",
+			NboCode:                "nbo_code",
+			NboName:                "nbo_name",
+			ProductLine:            "product_line",
+			CustId:                 "cust_id",
+			CustName:               "cust_name",
+			OrderTypeId:            "order_type_id",
+			OrderTypeName:          "order_type_name",
+			OrderStatus:            "order_status",
+			EndTime:                "end_time",
+			FormData:               "form_data",
+			AssignUserId:           "assign_user_id",
+			AssignUserName:         "assign_user_name",
+			SaleId:                 "sale_id",
+			SaleName:               "sale_name",
+			Feedback:               "feedback",
+			File:                   "file",
+			FinishRemark:           "finish_remark",
+			FinishTime:             "finish_time",
+			FinishBy:               "finish_by",
+			FinishByName:           "finish_by_name",
+			Remark:                 "remark",
+			CreatedBy:              "created_by",
+			CreatedName:            "created_name",
+			CreatedTime:            "created_time",
+			UpdatedBy:              "updated_by",
+			UpdatedName:            "updated_name",
+			UpdatedTime:            "updated_time",
+			DeletedTime:            "deleted_time",
+			ExpectTime:             "expect_time",
+			SupportTime:            "support_time",
+			TrialTimeStart:         "trial_time_start",
+			TrialTimeEnd:           "trial_time_end",
+			FeedbackSupportTime:    "feedback_support_time",
+			FeedbackSupportBy:      "feedback_support_by",
+			FeedbackSupportName:    "feedback_support_name",
+			FeedbackSupportContent: "feedback_support_content",
+			FeedbackSaleTime:       "feedback_sale_time",
+			FeedbackSaleBy:         "feedback_sale_by",
+			FeedbackSaleName:       "feedback_sale_name",
+			FeedbackSaleMeeting:    "feedback_sale_meeting",
+			FeedbackSaleDist:       "feedback_sale_dist",
+			FeedbackSaleNext:       "feedback_sale_next",
+			FeedbackSaleUser:       "feedback_sale_user",
 		},
 	}
 )
@@ -112,37 +142,52 @@ func NewWorkOrderDao(tenant string) WorkOrderDao {
 		DB:    g.DB(tenant),
 		Table: "work_order",
 		C: workOrderColumns{
-			Id:             "id",
-			Name:           "name",
-			NboId:          "nbo_id",
-			NboCode:        "nbo_code",
-			NboName:        "nbo_name",
-			ProductLine:    "product_line",
-			CustId:         "cust_id",
-			CustName:       "cust_name",
-			OrderTypeId:    "order_type_id",
-			OrderTypeName:  "order_type_name",
-			OrderStatus:    "order_status",
-			EndTime:        "end_time",
-			FormData:       "form_data",
-			AssignUserId:   "assign_user_id",
-			AssignUserName: "assign_user_name",
-			SaleId:         "sale_id",
-			SaleName:       "sale_name",
-			Feedback:       "feedback",
-			File:           "file",
-			FinishRemark:   "finish_remark",
-			FinishTime:     "finish_time",
-			FinishBy:       "finish_by",
-			FinishByName:   "finish_by_name",
-			Remark:         "remark",
-			CreatedBy:      "created_by",
-			CreatedName:    "created_name",
-			CreatedTime:    "created_time",
-			UpdatedBy:      "updated_by",
-			UpdatedName:    "updated_name",
-			UpdatedTime:    "updated_time",
-			DeletedTime:    "deleted_time",
+			Id:                     "id",
+			Name:                   "name",
+			NboId:                  "nbo_id",
+			NboCode:                "nbo_code",
+			NboName:                "nbo_name",
+			ProductLine:            "product_line",
+			CustId:                 "cust_id",
+			CustName:               "cust_name",
+			OrderTypeId:            "order_type_id",
+			OrderTypeName:          "order_type_name",
+			OrderStatus:            "order_status",
+			EndTime:                "end_time",
+			FormData:               "form_data",
+			AssignUserId:           "assign_user_id",
+			AssignUserName:         "assign_user_name",
+			SaleId:                 "sale_id",
+			SaleName:               "sale_name",
+			Feedback:               "feedback",
+			File:                   "file",
+			FinishRemark:           "finish_remark",
+			FinishTime:             "finish_time",
+			FinishBy:               "finish_by",
+			FinishByName:           "finish_by_name",
+			Remark:                 "remark",
+			CreatedBy:              "created_by",
+			CreatedName:            "created_name",
+			CreatedTime:            "created_time",
+			UpdatedBy:              "updated_by",
+			UpdatedName:            "updated_name",
+			UpdatedTime:            "updated_time",
+			DeletedTime:            "deleted_time",
+			ExpectTime:             "expect_time",
+			SupportTime:            "support_time",
+			TrialTimeStart:         "trial_time_start",
+			TrialTimeEnd:           "trial_time_end",
+			FeedbackSupportTime:    "feedback_support_time",
+			FeedbackSupportBy:      "feedback_support_by",
+			FeedbackSupportName:    "feedback_support_name",
+			FeedbackSupportContent: "feedback_support_content",
+			FeedbackSaleTime:       "feedback_sale_time",
+			FeedbackSaleBy:         "feedback_sale_by",
+			FeedbackSaleName:       "feedback_sale_name",
+			FeedbackSaleMeeting:    "feedback_sale_meeting",
+			FeedbackSaleDist:       "feedback_sale_dist",
+			FeedbackSaleNext:       "feedback_sale_next",
+			FeedbackSaleUser:       "feedback_sale_user",
 		},
 	}
 	return dao

+ 836 - 0
opms_parent/app/dao/work/internal/work_order_feedback_trial.go

@@ -0,0 +1,836 @@
+// ==========================================================================
+// This is auto-generated by gf cli tool. DO NOT EDIT THIS FILE MANUALLY.
+// ==========================================================================
+
+package internal
+
+import (
+	"context"
+	"database/sql"
+	"fmt"
+	"github.com/gogf/gf/container/garray"
+	"github.com/gogf/gf/database/gdb"
+	"github.com/gogf/gf/frame/g"
+	"github.com/gogf/gf/frame/gmvc"
+	"github.com/gogf/gf/util/gconv"
+	"strings"
+	"time"
+
+	model "dashoo.cn/micro/app/model/work"
+)
+
+// WorkOrderFeedbackTrialDao is the manager for logic model data accessing and custom defined data operations functions management.
+type WorkOrderFeedbackTrialDao struct {
+	gmvc.M                                // M is the core and embedded struct that inherits all chaining operations from gdb.Model.
+	C       workOrderFeedbackTrialColumns // C is the short type for Columns, which contains all the column names of Table for convenient usage.
+	DB      gdb.DB                        // DB is the raw underlying database management object.
+	Table   string                        // Table is the underlying table name of the DAO.
+	TableAs string                        // TableAs is the underlying table alias name of the DAO.
+}
+
+// WorkOrderFeedbackTrialColumns defines and stores column names for table work_order_feedback_trial.
+type workOrderFeedbackTrialColumns struct {
+	Id                   string // 主键
+	WorkOrderId          string // 关联工单ID
+	FeedbackTrialType    string // 试用反馈类型 10 启动 20 过程 30 总结
+	FeedbackTrialTime    string // 试用反馈-反馈时间 (试用)
+	FeedbackTrialBy      string // 试用反馈-反馈人 (试用)
+	FeedbackTrialName    string // 试用反馈-反馈人 (试用)
+	FeedbackTrialContent string // 试用反馈-部署安装总结会议总结过程问题试用总结 (试用)
+	FeedbackTrialDist    string // 试用反馈-客户经销商反馈 (试用)
+	FeedbackTrialPlan    string // 试用反馈-下一步计划跟进计划 (试用)
+	Remark               string // 备注
+	CreatedBy            string // 创建者
+	CreatedName          string // 创建人
+	CreatedTime          string // 创建时间
+	UpdatedBy            string // 更新者
+	UpdatedName          string // 更新人
+	UpdatedTime          string // 更新时间
+	DeletedTime          string // 删除时间
+}
+
+var (
+	// WorkOrderFeedbackTrial is globally public accessible object for table work_order_feedback_trial operations.
+	WorkOrderFeedbackTrial = WorkOrderFeedbackTrialDao{
+		M:     g.DB("default").Model("work_order_feedback_trial").Safe(),
+		DB:    g.DB("default"),
+		Table: "work_order_feedback_trial",
+		C: workOrderFeedbackTrialColumns{
+			Id:                   "id",
+			WorkOrderId:          "work_order_id",
+			FeedbackTrialType:    "feedback_trial_type",
+			FeedbackTrialTime:    "feedback_trial_time",
+			FeedbackTrialBy:      "feedback_trial_by",
+			FeedbackTrialName:    "feedback_trial_name",
+			FeedbackTrialContent: "feedback_trial_content",
+			FeedbackTrialDist:    "feedback_trial_dist",
+			FeedbackTrialPlan:    "feedback_trial_plan",
+			Remark:               "remark",
+			CreatedBy:            "created_by",
+			CreatedName:          "created_name",
+			CreatedTime:          "created_time",
+			UpdatedBy:            "updated_by",
+			UpdatedName:          "updated_name",
+			UpdatedTime:          "updated_time",
+			DeletedTime:          "deleted_time",
+		},
+	}
+)
+
+func NewWorkOrderFeedbackTrialDao(tenant string) WorkOrderFeedbackTrialDao {
+	var dao WorkOrderFeedbackTrialDao
+	dao = WorkOrderFeedbackTrialDao{
+		M:     g.DB(tenant).Model("work_order_feedback_trial").Safe(),
+		DB:    g.DB(tenant),
+		Table: "work_order_feedback_trial",
+		C: workOrderFeedbackTrialColumns{
+			Id:                   "id",
+			WorkOrderId:          "work_order_id",
+			FeedbackTrialType:    "feedback_trial_type",
+			FeedbackTrialTime:    "feedback_trial_time",
+			FeedbackTrialBy:      "feedback_trial_by",
+			FeedbackTrialName:    "feedback_trial_name",
+			FeedbackTrialContent: "feedback_trial_content",
+			FeedbackTrialDist:    "feedback_trial_dist",
+			FeedbackTrialPlan:    "feedback_trial_plan",
+			Remark:               "remark",
+			CreatedBy:            "created_by",
+			CreatedName:          "created_name",
+			CreatedTime:          "created_time",
+			UpdatedBy:            "updated_by",
+			UpdatedName:          "updated_name",
+			UpdatedTime:          "updated_time",
+			DeletedTime:          "deleted_time",
+		},
+	}
+	return dao
+}
+
+// Ctx is a chaining function, which creates and returns a new DB that is a shallow copy
+// of current DB object and with given context in it.
+// Note that this returned DB object can be used only once, so do not assign it to
+// a global or package variable for long using.
+func (d *WorkOrderFeedbackTrialDao) Ctx(ctx context.Context) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Ctx(ctx), Table: d.Table, TableAs: d.TableAs}
+}
+
+// GetCtx returns the context for current Model.
+// It returns "context.Background() i"s there's no context previously set.
+func (d *WorkOrderFeedbackTrialDao) GetCtx() context.Context {
+	return d.M.GetCtx()
+}
+
+// As sets an alias name for current table.
+func (d *WorkOrderFeedbackTrialDao) As(as string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.As(as), Table: d.Table, TableAs: as}
+}
+
+// TX sets the transaction for current operation.
+func (d *WorkOrderFeedbackTrialDao) TX(tx *gdb.TX) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.TX(tx), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Master marks the following operation on master node.
+func (d *WorkOrderFeedbackTrialDao) Master() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Master(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Slave marks the following operation on slave node.
+// Note that it makes sense only if there's any slave node configured.
+func (d *WorkOrderFeedbackTrialDao) Slave() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Slave(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Args sets custom arguments for model operation.
+func (d *WorkOrderFeedbackTrialDao) Args(args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Args(args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Handler calls each of "handlers" on current Model and returns a new Model.
+// ModelHandler is a function that handles given Model and returns a new Model that is custom modified.
+func (d *WorkOrderFeedbackTrialDao) Handler(handlers ...gdb.ModelHandler) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Handler(handlers...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// LeftJoin does "LEFT JOIN ... ON ..." statement on the model.
+// The parameter <table> can be joined table and its joined condition,
+// and also with its alias name, like:
+// Table("user").LeftJoin("user_detail", "user_detail.uid=user.uid")
+// Table("user", "u").LeftJoin("user_detail", "ud", "ud.uid=u.uid")
+func (d *WorkOrderFeedbackTrialDao) LeftJoin(table ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.LeftJoin(table...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// RightJoin does "RIGHT JOIN ... ON ..." statement on the model.
+// The parameter <table> can be joined table and its joined condition,
+// and also with its alias name, like:
+// Table("user").RightJoin("user_detail", "user_detail.uid=user.uid")
+// Table("user", "u").RightJoin("user_detail", "ud", "ud.uid=u.uid")
+func (d *WorkOrderFeedbackTrialDao) RightJoin(table ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.RightJoin(table...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// InnerJoin does "INNER JOIN ... ON ..." statement on the model.
+// The parameter <table> can be joined table and its joined condition,
+// and also with its alias name, like:
+// Table("user").InnerJoin("user_detail", "user_detail.uid=user.uid")
+// Table("user", "u").InnerJoin("user_detail", "ud", "ud.uid=u.uid")
+func (d *WorkOrderFeedbackTrialDao) InnerJoin(table ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.InnerJoin(table...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Fields sets the operation fields of the model, multiple fields joined using char ','.
+// The parameter <fieldNamesOrMapStruct> can be type of string/map/*map/struct/*struct.
+func (d *WorkOrderFeedbackTrialDao) Fields(fieldNamesOrMapStruct ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Fields(fieldNamesOrMapStruct...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// FieldsEx sets the excluded operation fields of the model, multiple fields joined using char ','.
+// The parameter <fieldNamesOrMapStruct> can be type of string/map/*map/struct/*struct.
+func (d *WorkOrderFeedbackTrialDao) FieldsEx(fieldNamesOrMapStruct ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.FieldsEx(fieldNamesOrMapStruct...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// FieldCount formats and appends commonly used field "COUNT(column)" to the select fields of model.
+func (d *WorkOrderFeedbackTrialDao) FieldCount(column string, as ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.FieldCount(column, as...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// FieldSum formats and appends commonly used field "SUM(column)" to the select fields of model.
+func (d *WorkOrderFeedbackTrialDao) FieldSum(column string, as ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.FieldSum(column, as...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// FieldMin formats and appends commonly used field "MIN(column)" to the select fields of model.
+func (d *WorkOrderFeedbackTrialDao) FieldMin(column string, as ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.FieldMin(column, as...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// FieldMax formats and appends commonly used field "MAX(column)" to the select fields of model.
+func (d *WorkOrderFeedbackTrialDao) FieldMax(column string, as ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.FieldMax(column, as...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// FieldAvg formats and appends commonly used field "AVG(column)" to the select fields of model.
+func (d *WorkOrderFeedbackTrialDao) FieldAvg(column string, as ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.FieldAvg(column, as...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Option adds extra operation option for the model.
+// Deprecated, use separate operations instead.
+func (d *WorkOrderFeedbackTrialDao) Option(option int) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Option(option), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OmitEmpty sets OPTION_OMITEMPTY option for the model, which automatically filers
+// the data and where attributes for empty values.
+func (d *WorkOrderFeedbackTrialDao) OmitEmpty() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OmitEmpty(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OmitEmptyWhere sets optionOmitEmptyWhere option for the model, which automatically filers
+// the Where/Having parameters for "empty" values.
+func (d *WorkOrderFeedbackTrialDao) OmitEmptyWhere() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OmitEmptyWhere(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OmitEmptyData sets optionOmitEmptyData option for the model, which automatically filers
+// the Data parameters for "empty" values.
+func (d *WorkOrderFeedbackTrialDao) OmitEmptyData() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OmitEmptyData(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OmitNil sets optionOmitNil option for the model, which automatically filers
+// the data and where parameters for "nil" values.
+func (d *WorkOrderFeedbackTrialDao) OmitNil() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OmitNil(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OmitNilWhere sets optionOmitNilWhere option for the model, which automatically filers
+// the Where/Having parameters for "nil" values.
+func (d *WorkOrderFeedbackTrialDao) OmitNilWhere() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OmitNilWhere(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OmitNilData sets optionOmitNilData option for the model, which automatically filers
+// the Data parameters for "nil" values.
+func (d *WorkOrderFeedbackTrialDao) OmitNilData() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OmitNilData(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Filter marks filtering the fields which does not exist in the fields of the operated table.
+// Note that this function supports only single table operations.
+// Deprecated, filter feature is automatically enabled from GoFrame v1.16.0, it is so no longer used.
+func (d *WorkOrderFeedbackTrialDao) Filter() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Filter(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Where sets the condition statement for the model. The parameter <where> can be type of
+// string/map/gmap/slice/struct/*struct, etc. Note that, if it's called more than one times,
+// multiple conditions will be joined into where statement using "AND".
+// Eg:
+// Where("uid=10000")
+// Where("uid", 10000)
+// Where("money>? AND name like ?", 99999, "vip_%")
+// Where("uid", 1).Where("name", "john")
+// Where("status IN (?)", g.Slice{1,2,3})
+// Where("age IN(?,?)", 18, 50)
+// Where(User{ Id : 1, UserName : "john"})
+func (d *WorkOrderFeedbackTrialDao) Where(where interface{}, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Where(where, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WherePri does the same logic as M.Where except that if the parameter <where>
+// is a single condition like int/string/float/slice, it treats the condition as the primary
+// key value. That is, if primary key is "id" and given <where> parameter as "123", the
+// WherePri function treats the condition as "id=123", but M.Where treats the condition
+// as string "123".
+func (d *WorkOrderFeedbackTrialDao) WherePri(where interface{}, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WherePri(where, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Having sets the having statement for the model.
+// The parameters of this function usage are as the same as function Where.
+// See Where.
+func (d *WorkOrderFeedbackTrialDao) Having(having interface{}, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Having(having, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Wheref builds condition string using fmt.Sprintf and arguments.
+// Note that if the number of "args" is more than the place holder in "format",
+// the extra "args" will be used as the where condition arguments of the Model.
+func (d *WorkOrderFeedbackTrialDao) Wheref(format string, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Wheref(format, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereLT builds "column < value" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereLT(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereLT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereLTE builds "column <= value" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereLTE(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereLTE(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereGT builds "column > value" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereGT(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereGT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereGTE builds "column >= value" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereGTE(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereGTE(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereBetween builds "column BETWEEN min AND max" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereBetween(column string, min, max interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereBetween(column, min, max), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereLike builds "column LIKE like" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereLike(column string, like interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereIn builds "column IN (in)" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereIn(column string, in interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereIn(column, in), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNull builds "columns[0] IS NULL AND columns[1] IS NULL ..." statement.
+func (d *WorkOrderFeedbackTrialDao) WhereNull(columns ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereNull(columns...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNotBetween builds "column NOT BETWEEN min AND max" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereNotBetween(column string, min, max interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereNotBetween(column, min, max), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNotLike builds "column NOT LIKE like" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereNotLike(column string, like interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereNotLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNot builds "column != value" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereNot(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereNot(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNotIn builds "column NOT IN (in)" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereNotIn(column string, in interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereNotIn(column, in), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNotNull builds "columns[0] IS NOT NULL AND columns[1] IS NOT NULL ..." statement.
+func (d *WorkOrderFeedbackTrialDao) WhereNotNull(columns ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereNotNull(columns...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOr adds "OR" condition to the where statement.
+func (d *WorkOrderFeedbackTrialDao) WhereOr(where interface{}, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOr(where, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrf builds "OR" condition string using fmt.Sprintf and arguments.
+func (d *WorkOrderFeedbackTrialDao) WhereOrf(format string, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrf(format, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrLT builds "column < value" statement in "OR" conditions..
+func (d *WorkOrderFeedbackTrialDao) WhereOrLT(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrLT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrLTE builds "column <= value" statement in "OR" conditions..
+func (d *WorkOrderFeedbackTrialDao) WhereOrLTE(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrLTE(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrGT builds "column > value" statement in "OR" conditions..
+func (d *WorkOrderFeedbackTrialDao) WhereOrGT(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrGT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrGTE builds "column >= value" statement in "OR" conditions..
+func (d *WorkOrderFeedbackTrialDao) WhereOrGTE(column string, value interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrGTE(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrBetween builds "column BETWEEN min AND max" statement in "OR" conditions.
+func (d *WorkOrderFeedbackTrialDao) WhereOrBetween(column string, min, max interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrBetween(column, min, max), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrLike builds "column LIKE like" statement in "OR" conditions.
+func (d *WorkOrderFeedbackTrialDao) WhereOrLike(column string, like interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrIn builds "column IN (in)" statement in "OR" conditions.
+func (d *WorkOrderFeedbackTrialDao) WhereOrIn(column string, in interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrIn(column, in), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrNull builds "columns[0] IS NULL OR columns[1] IS NULL ..." statement in "OR" conditions.
+func (d *WorkOrderFeedbackTrialDao) WhereOrNull(columns ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrNull(columns...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrNotBetween builds "column NOT BETWEEN min AND max" statement in "OR" conditions.
+func (d *WorkOrderFeedbackTrialDao) WhereOrNotBetween(column string, min, max interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrNotBetween(column, min, max), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrNotLike builds "column NOT LIKE like" statement in "OR" conditions.
+func (d *WorkOrderFeedbackTrialDao) WhereOrNotLike(column string, like interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrNotLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrNotIn builds "column NOT IN (in)" statement.
+func (d *WorkOrderFeedbackTrialDao) WhereOrNotIn(column string, in interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrNotIn(column, in), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrNotNull builds "columns[0] IS NOT NULL OR columns[1] IS NOT NULL ..." statement in "OR" conditions.
+func (d *WorkOrderFeedbackTrialDao) WhereOrNotNull(columns ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.WhereOrNotNull(columns...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Group sets the "GROUP BY" statement for the model.
+func (d *WorkOrderFeedbackTrialDao) Group(groupBy ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Group(groupBy...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// And adds "AND" condition to the where statement.
+// Deprecated, use Where instead.
+func (d *WorkOrderFeedbackTrialDao) And(where interface{}, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.And(where, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Or adds "OR" condition to the where statement.
+// Deprecated, use WhereOr instead.
+func (d *WorkOrderFeedbackTrialDao) Or(where interface{}, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Or(where, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// GroupBy sets the "GROUP BY" statement for the model.
+func (d *WorkOrderFeedbackTrialDao) GroupBy(groupBy string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Group(groupBy), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Order sets the "ORDER BY" statement for the model.
+func (d *WorkOrderFeedbackTrialDao) Order(orderBy ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Order(orderBy...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OrderAsc sets the "ORDER BY xxx ASC" statement for the model.
+func (d *WorkOrderFeedbackTrialDao) OrderAsc(column string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OrderAsc(column), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OrderDesc sets the "ORDER BY xxx DESC" statement for the model.
+func (d *WorkOrderFeedbackTrialDao) OrderDesc(column string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OrderDesc(column), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OrderRandom sets the "ORDER BY RANDOM()" statement for the model.
+func (d *WorkOrderFeedbackTrialDao) OrderRandom() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.OrderRandom(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OrderBy is alias of Model.Order.
+// See Model.Order.
+// Deprecated, use Order instead.
+func (d *WorkOrderFeedbackTrialDao) OrderBy(orderBy string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Order(orderBy), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Limit sets the "LIMIT" statement for the model.
+// The parameter <limit> can be either one or two number, if passed two number is passed,
+// it then sets "LIMIT limit[0],limit[1]" statement for the model, or else it sets "LIMIT limit[0]"
+// statement.
+func (d *WorkOrderFeedbackTrialDao) Limit(limit ...int) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Limit(limit...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Offset sets the "OFFSET" statement for the model.
+// It only makes sense for some databases like SQLServer, PostgreSQL, etc.
+func (d *WorkOrderFeedbackTrialDao) Offset(offset int) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Offset(offset), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Distinct forces the query to only return distinct results.
+func (d *WorkOrderFeedbackTrialDao) Distinct() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Distinct(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Page sets the paging number for the model.
+// The parameter <page> is started from 1 for paging.
+// Note that, it differs that the Limit function start from 0 for "LIMIT" statement.
+func (d *WorkOrderFeedbackTrialDao) Page(page, limit int) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Page(page, limit), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Batch sets the batch operation number for the model.
+func (d *WorkOrderFeedbackTrialDao) Batch(batch int) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Batch(batch), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Cache sets the cache feature for the model. It caches the result of the sql, which means
+// if there's another same sql request, it just reads and returns the result from cache, it
+// but not committed and executed into the database.
+//
+// If the parameter <duration> < 0, which means it clear the cache with given <name>.
+// If the parameter <duration> = 0, which means it never expires.
+// If the parameter <duration> > 0, which means it expires after <duration>.
+//
+// The optional parameter <name> is used to bind a name to the cache, which means you can later
+// control the cache like changing the <duration> or clearing the cache with specified <name>.
+//
+// Note that, the cache feature is disabled if the model is operating on a transaction.
+func (d *WorkOrderFeedbackTrialDao) Cache(duration time.Duration, name ...string) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Cache(duration, name...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Data sets the operation data for the model.
+// The parameter <data> can be type of string/map/gmap/slice/struct/*struct, etc.
+// Eg:
+// Data("uid=10000")
+// Data("uid", 10000)
+// Data(g.Map{"uid": 10000, "name":"john"})
+// Data(g.Slice{g.Map{"uid": 10000, "name":"john"}, g.Map{"uid": 20000, "name":"smith"})
+func (d *WorkOrderFeedbackTrialDao) Data(data ...interface{}) *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Data(data...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// All does "SELECT FROM ..." statement for the model.
+// It retrieves the records from table and returns the result as []*model.WorkOrderFeedbackTrial.
+// It returns nil if there's no record retrieved with the given conditions from table.
+//
+// The optional parameter <where> is the same as the parameter of M.Where function,
+// see M.Where.
+func (d *WorkOrderFeedbackTrialDao) All(where ...interface{}) ([]*model.WorkOrderFeedbackTrial, error) {
+	all, err := d.M.All(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entities []*model.WorkOrderFeedbackTrial
+	if err = all.Structs(&entities); err != nil && err != sql.ErrNoRows {
+		return nil, err
+	}
+	return entities, nil
+}
+
+// One retrieves one record from table and returns the result as *model.WorkOrderFeedbackTrial.
+// It returns nil if there's no record retrieved with the given conditions from table.
+//
+// The optional parameter <where> is the same as the parameter of M.Where function,
+// see M.Where.
+func (d *WorkOrderFeedbackTrialDao) One(where ...interface{}) (*model.WorkOrderFeedbackTrial, error) {
+	one, err := d.M.One(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entity *model.WorkOrderFeedbackTrial
+	if err = one.Struct(&entity); err != nil && err != sql.ErrNoRows {
+		return nil, err
+	}
+	return entity, nil
+}
+
+// FindOne retrieves and returns a single Record by M.WherePri and M.One.
+// Also see M.WherePri and M.One.
+func (d *WorkOrderFeedbackTrialDao) FindOne(where ...interface{}) (*model.WorkOrderFeedbackTrial, error) {
+	one, err := d.M.FindOne(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entity *model.WorkOrderFeedbackTrial
+	if err = one.Struct(&entity); err != nil && err != sql.ErrNoRows {
+		return nil, err
+	}
+	return entity, nil
+}
+
+// FindAll retrieves and returns Result by by M.WherePri and M.All.
+// Also see M.WherePri and M.All.
+func (d *WorkOrderFeedbackTrialDao) FindAll(where ...interface{}) ([]*model.WorkOrderFeedbackTrial, error) {
+	all, err := d.M.FindAll(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entities []*model.WorkOrderFeedbackTrial
+	if err = all.Structs(&entities); err != nil && err != sql.ErrNoRows {
+		return nil, err
+	}
+	return entities, nil
+}
+
+// Struct retrieves one record from table and converts it into given struct.
+// The parameter <pointer> should be type of *struct/**struct. If type **struct is given,
+// it can create the struct internally during converting.
+//
+// The optional parameter <where> is the same as the parameter of Model.Where function,
+// see Model.Where.
+//
+// Note that it returns sql.ErrNoRows if there's no record retrieved with the given conditions
+// from table and <pointer> is not nil.
+//
+// Eg:
+// user := new(User)
+// err  := dao.User.Where("id", 1).Struct(user)
+//
+// user := (*User)(nil)
+// err  := dao.User.Where("id", 1).Struct(&user)
+func (d *WorkOrderFeedbackTrialDao) Struct(pointer interface{}, where ...interface{}) error {
+	return d.M.Struct(pointer, where...)
+}
+
+// Structs retrieves records from table and converts them into given struct slice.
+// The parameter <pointer> should be type of *[]struct/*[]*struct. It can create and fill the struct
+// slice internally during converting.
+//
+// The optional parameter <where> is the same as the parameter of Model.Where function,
+// see Model.Where.
+//
+// Note that it returns sql.ErrNoRows if there's no record retrieved with the given conditions
+// from table and <pointer> is not empty.
+//
+// Eg:
+// users := ([]User)(nil)
+// err   := dao.User.Structs(&users)
+//
+// users := ([]*User)(nil)
+// err   := dao.User.Structs(&users)
+func (d *WorkOrderFeedbackTrialDao) Structs(pointer interface{}, where ...interface{}) error {
+	return d.M.Structs(pointer, where...)
+}
+
+// Scan automatically calls Struct or Structs function according to the type of parameter <pointer>.
+// It calls function Struct if <pointer> is type of *struct/**struct.
+// It calls function Structs if <pointer> is type of *[]struct/*[]*struct.
+//
+// The optional parameter <where> is the same as the parameter of Model.Where function,
+// see Model.Where.
+//
+// Note that it returns sql.ErrNoRows if there's no record retrieved and given pointer is not empty or nil.
+//
+// Eg:
+// user  := new(User)
+// err   := dao.User.Where("id", 1).Scan(user)
+//
+// user  := (*User)(nil)
+// err   := dao.User.Where("id", 1).Scan(&user)
+//
+// users := ([]User)(nil)
+// err   := dao.User.Scan(&users)
+//
+// users := ([]*User)(nil)
+// err   := dao.User.Scan(&users)
+func (d *WorkOrderFeedbackTrialDao) Scan(pointer interface{}, where ...interface{}) error {
+	return d.M.Scan(pointer, where...)
+}
+
+// Chunk iterates the table with given size and callback function.
+func (d *WorkOrderFeedbackTrialDao) Chunk(limit int, callback func(entities []*model.WorkOrderFeedbackTrial, err error) bool) {
+	d.M.Chunk(limit, func(result gdb.Result, err error) bool {
+		var entities []*model.WorkOrderFeedbackTrial
+		err = result.Structs(&entities)
+		if err == sql.ErrNoRows {
+			return false
+		}
+		return callback(entities, err)
+	})
+}
+
+// LockUpdate sets the lock for update for current operation.
+func (d *WorkOrderFeedbackTrialDao) LockUpdate() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.LockUpdate(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// LockShared sets the lock in share mode for current operation.
+func (d *WorkOrderFeedbackTrialDao) LockShared() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.LockShared(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Unscoped enables/disables the soft deleting feature.
+func (d *WorkOrderFeedbackTrialDao) Unscoped() *WorkOrderFeedbackTrialDao {
+	return &WorkOrderFeedbackTrialDao{M: d.M.Unscoped(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// DataScope enables the DataScope feature.
+func (d *WorkOrderFeedbackTrialDao) DataScope(ctx context.Context, args ...interface{}) *WorkOrderFeedbackTrialDao {
+	cs := ctx.Value("contextService")
+	dataScope := gconv.Map(gconv.String(gconv.Map(cs)["dataScope"]))
+	if dataScope != nil {
+		// 销售工程师判断
+		var salesEngineerFlag bool
+		if roles, ok := dataScope["roles"]; ok {
+			arr := garray.NewArrayFrom(roles.([]interface{}), true)
+			if arr.Len() == 1 && arr.Contains("SalesEngineer") {
+				salesEngineerFlag = true
+			}
+		}
+		userIds, ok := dataScope["userIds"]
+		specialFlag, userCols, orColsMap := d.checkColumnsName(dataScope, args...)
+
+		var orColumns []string
+		var orValues []interface{}
+		if ok && userIds != "-1" {
+			for _, column := range userCols {
+				if ok, _ := d.M.HasField(column); ok || specialFlag {
+					orColumns = append(orColumns, column+" IN (?) ")
+					orValues = append(orValues, userIds)
+				}
+			}
+		}
+		for col, params := range orColsMap {
+			if ok, _ := d.M.HasField(col); ok || specialFlag {
+				orColumns = append(orColumns, fmt.Sprintf(" ( %s IN (?) )", col))
+				orValues = append(orValues, params)
+			}
+		}
+
+		// 销售工程师权限加成
+		if !salesEngineerFlag {
+			var andColumns []string
+			var andValues []interface{}
+			for col, params := range dataScope {
+				if ok, _ := d.M.HasField(col); ok || specialFlag {
+					andColumns = append(andColumns, fmt.Sprintf(" ( %s IN (?) )", col))
+					andValues = append(andValues, params)
+				}
+			}
+			if len(andColumns) > 0 {
+				andWhereSql := strings.Join(andColumns, " AND ")
+				orColumns = append(orColumns, "("+andWhereSql+")")
+				orValues = append(orValues, andValues...)
+			}
+		}
+
+		whereSql := strings.Join(orColumns, " OR ")
+		return &WorkOrderFeedbackTrialDao{M: d.M.Where(whereSql, orValues...).Ctx(ctx), Table: d.Table, TableAs: d.TableAs}
+	}
+	return d
+}
+
+// args 1、字段
+// args 2、字段、表名
+// args 3、字段对应关系
+func (d *WorkOrderFeedbackTrialDao) checkColumnsName(dataScope map[string]interface{}, args ...interface{}) (bool, []string, map[string]interface{}) {
+	var userCols []string
+	tableAs, specialFlag := "", false
+	orColsMap, colsContrast := map[string]interface{}{}, map[string]interface{}{}
+
+	if d.TableAs != "" && len(args) <= 1 {
+		tableAs = d.TableAs + "."
+	}
+	if len(args) > 1 {
+		specialFlag = true
+		if val, ok := args[1].(string); ok {
+			tableAs = val + "."
+		}
+	}
+	if len(args) > 0 {
+		userCols = []string{"created_by"}
+		if column, ok := args[0].(string); ok {
+			userCols = []string{tableAs + column}
+		}
+		if cols, ok := args[0].([]string); ok {
+			for _, v := range cols {
+				userCols = append(userCols, tableAs+v)
+			}
+		}
+		if val, ok := args[0].(map[string]interface{}); ok {
+			specialFlag = true
+			colsContrast = val
+			if orcols, ok := val["orcols"]; ok {
+				if col, ok := orcols.(string); ok && gconv.String(val[col]) != "" {
+					orColsMap[col] = val[col]
+					delete(colsContrast, col)
+				}
+				if cols, ok := orcols.([]string); ok {
+					for _, col := range cols {
+						if gconv.String(val[col]) == "" {
+							continue
+						}
+						orColsMap[col] = val[col]
+						delete(colsContrast, col)
+					}
+				}
+			}
+			delete(colsContrast, "orcols")
+		}
+	}
+	bigColumns := "is_big"
+	if isBig, ok := dataScope[bigColumns]; ok {
+		if bigCol, ok := colsContrast[bigColumns]; ok {
+			orColsMap[bigCol.(string)] = isBig
+			delete(colsContrast, bigCol.(string))
+		} else {
+			if ok, _ := d.M.HasField(bigColumns); ok && specialFlag {
+				orColsMap[tableAs+bigColumns] = isBig
+			}
+		}
+	}
+
+	delete(dataScope, "userIds")
+	delete(dataScope, "roles")
+	delete(dataScope, "posts")
+	delete(dataScope, bigColumns)
+	if len(colsContrast) > 0 {
+		for k, v := range dataScope {
+			if data, ok := colsContrast[k]; ok {
+				dataScope[data.(string)] = v
+			}
+			delete(dataScope, k)
+			delete(colsContrast, k)
+		}
+		for k, v := range colsContrast {
+			dataScope[k] = v
+		}
+	}
+	return specialFlag, userCols, orColsMap
+}

+ 36 - 0
opms_parent/app/dao/work/work_order_feedback_trial.go

@@ -0,0 +1,36 @@
+// ============================================================================
+// This is auto-generated by gf cli tool only once. Fill this file as you wish.
+// ============================================================================
+
+package work
+
+import (
+	"dashoo.cn/micro/app/dao/work/internal"
+)
+
+// workOrderFeedbackTrialDao is the manager for logic model data accessing
+// and custom defined data operations functions management. You can define
+// methods on it to extend its functionality as you wish.
+type workOrderFeedbackTrialDao struct {
+	internal.WorkOrderFeedbackTrialDao
+}
+
+var (
+	// WorkOrderFeedbackTrial is globally public accessible object for table work_order_feedback_trial operations.
+	WorkOrderFeedbackTrial = workOrderFeedbackTrialDao{
+		internal.WorkOrderFeedbackTrial,
+	}
+)
+
+type WorkOrderFeedbackTrialDao struct {
+	internal.WorkOrderFeedbackTrialDao
+}
+
+func NewWorkOrderFeedbackTrialDao(tenant string) *WorkOrderFeedbackTrialDao {
+	dao := internal.NewWorkOrderFeedbackTrialDao(tenant)
+	return &WorkOrderFeedbackTrialDao{
+		dao,
+	}
+}
+
+// Fill with you ideas below.

+ 110 - 0
opms_parent/app/handler/work/work_order.go

@@ -32,6 +32,20 @@ func (w *WorkOrderHandler) GetList(ctx context.Context, req *model.WorkOrderSear
 
 }
 
+// Swagger:WorkOrder 工单,测试tag 首页工单时间轴
+func (w *WorkOrderHandler) ListFull(ctx context.Context, req *model.WorkOrderSearchReq, rsp *comm_def.CommonMsg) error {
+	orderService, err := workSrv.NewOrderService(ctx)
+	if err != nil {
+		return err
+	}
+	total, list, err := orderService.ListFull(req)
+	if err != nil {
+		return err
+	}
+	rsp.Data = g.Map{"list": list, "total": total}
+	return nil
+}
+
 // 导出
 func (w *WorkOrderHandler) DeriveList(ctx context.Context, req *model.WorkOrderExport, rsp *comm_def.CommonMsg) error {
 	orderService, err := workSrv.NewOrderService(ctx)
@@ -206,6 +220,102 @@ func (w *WorkOrderHandler) GetWorkOrderFeedbackByDay(ctx context.Context, req *m
 // 	return nil
 // }
 
+// Swagger:WorkOrder 工单 支持反馈
+func (w *WorkOrderHandler) FeedbackSupport(ctx context.Context, req *model.FeedbackSupportReq, 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.FeedbackSupport(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Swagger:WorkOrder 工单 销售反馈
+func (w *WorkOrderHandler) FeedbackSale(ctx context.Context, req *model.FeedbackSaleReq, 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.FeedbackSale(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Swagger:WorkOrder 工单 试用反馈
+func (w *WorkOrderHandler) FeedbackTrail(ctx context.Context, req *model.FeedbackTrailReq, 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.FeedbackTrail(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Swagger:WorkOrder 工单 修改期望完成时间(技术文件)
+func (w *WorkOrderHandler) TimeUpdateExpect(ctx context.Context, req *model.TimeUpdateExpectReq, 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.TimeUpdateExpect(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Swagger:WorkOrder 工单 修改支持时间(售前讲解)
+func (w *WorkOrderHandler) TimeUpdateSupport(ctx context.Context, req *model.TimeUpdateSupportReq, 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.TimeUpdateSupport(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Swagger:WorkOrder 工单 修改试用时间(试用)
+func (w *WorkOrderHandler) TimeUpdateTrial(ctx context.Context, req *model.TimeUpdateTrialReq, 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.TimeUpdateTrial(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 {
 	orderService, err := workSrv.NewOrderService(ctx)

+ 46 - 31
opms_parent/app/model/work/internal/work_order.go

@@ -10,35 +10,50 @@ import (
 
 // WorkOrder is the golang structure for table work_order.
 type WorkOrder struct {
-	Id             int         `orm:"id,primary"       json:"id"`             // 主键
-	Name           string      `orm:"name"             json:"name"`           // 工单名称
-	NboId          int         `orm:"nbo_id"           json:"nboId"`          // 关联项目
-	NboCode        string      `orm:"nbo_code"         json:"nboCode"`        // 项目编码
-	NboName        string      `orm:"nbo_name"         json:"nboName"`        // 项目名称
-	ProductLine    string      `orm:"product_line"     json:"productLine"`    // 产品线
-	CustId         int         `orm:"cust_id"          json:"custId"`         // 关联客户
-	CustName       string      `orm:"cust_name"        json:"custName"`       // 客户名称
-	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已完成)
-	EndTime        *gtime.Time `orm:"end_time"         json:"endTime"`        // 结束时间
-	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"`   // 完成信息
-	FinishTime     *gtime.Time `orm:"finish_time"      json:"finishTime"`     // 完成信息
-	FinishBy       int         `orm:"finish_by"        json:"finishBy"`       // 完成操作人
-	FinishByName   string      `orm:"finish_by_name"   json:"finishByName"`   // 完成操作人
-	Remark         string      `orm:"remark"           json:"remark"`         // 备注
-	CreatedBy      int         `orm:"created_by"       json:"createdBy"`      // 创建者
-	CreatedName    string      `orm:"created_name"     json:"createdName"`    // 创建人
-	CreatedTime    *gtime.Time `orm:"created_time"     json:"createdTime"`    // 创建时间
-	UpdatedBy      int         `orm:"updated_by"       json:"updatedBy"`      // 更新者
-	UpdatedName    string      `orm:"updated_name"     json:"updatedName"`    // 更新人
-	UpdatedTime    *gtime.Time `orm:"updated_time"     json:"updatedTime"`    // 更新时间
-	DeletedTime    *gtime.Time `orm:"deleted_time"     json:"deletedTime"`    // 删除时间
+	Id                     int         `orm:"id,primary"               json:"id"`                     // 主键
+	Name                   string      `orm:"name"                     json:"name"`                   // 工单名称
+	NboId                  int         `orm:"nbo_id"                   json:"nboId"`                  // 关联项目
+	NboCode                string      `orm:"nbo_code"                 json:"nboCode"`                // 项目编码
+	NboName                string      `orm:"nbo_name"                 json:"nboName"`                // 项目名称
+	ProductLine            string      `orm:"product_line"             json:"productLine"`            // 产品线
+	CustId                 int         `orm:"cust_id"                  json:"custId"`                 // 关联客户
+	CustName               string      `orm:"cust_name"                json:"custName"`               // 客户名称
+	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已完成)
+	EndTime                *gtime.Time `orm:"end_time"                 json:"endTime"`                // 结束时间
+	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"`           // 完成信息
+	FinishTime             *gtime.Time `orm:"finish_time"              json:"finishTime"`             // 完成信息
+	FinishBy               int         `orm:"finish_by"                json:"finishBy"`               // 完成操作人
+	FinishByName           string      `orm:"finish_by_name"           json:"finishByName"`           // 完成操作人
+	Remark                 string      `orm:"remark"                   json:"remark"`                 // 备注
+	CreatedBy              int         `orm:"created_by"               json:"createdBy"`              // 创建者
+	CreatedName            string      `orm:"created_name"             json:"createdName"`            // 创建人
+	CreatedTime            *gtime.Time `orm:"created_time"             json:"createdTime"`            // 创建时间
+	UpdatedBy              int         `orm:"updated_by"               json:"updatedBy"`              // 更新者
+	UpdatedName            string      `orm:"updated_name"             json:"updatedName"`            // 更新人
+	UpdatedTime            *gtime.Time `orm:"updated_time"             json:"updatedTime"`            // 更新时间
+	DeletedTime            *gtime.Time `orm:"deleted_time"             json:"deletedTime"`            // 删除时间
+	ExpectTime             *gtime.Time `orm:"expect_time"              json:"expectTime"`             // 期望完成时间 (技术文件)
+	SupportTime            *gtime.Time `orm:"support_time"             json:"supportTime"`            // 支持时间 (售前讲解)
+	TrialTimeStart         *gtime.Time `orm:"trial_time_start"         json:"trialTimeStart"`         // 试用开始时间 (试用)
+	TrialTimeEnd           *gtime.Time `orm:"trial_time_end"           json:"trialTimeEnd"`           // 试用结束时间 (试用)
+	FeedbackSupportTime    *gtime.Time `orm:"feedback_support_time"    json:"feedbackSupportTime"`    // 支持反馈-反馈时间 (售前讲解 技术文件)
+	FeedbackSupportBy      int         `orm:"feedback_support_by"      json:"feedbackSupportBy"`      // 支持反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSupportName    string      `orm:"feedback_support_name"    json:"feedbackSupportName"`    // 支持反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSupportContent string      `orm:"feedback_support_content" json:"feedbackSupportContent"` // 支持反馈-本次讲解情况反馈 (售前讲解 技术文件)
+	FeedbackSaleTime       *gtime.Time `orm:"feedback_sale_time"       json:"feedbackSaleTime"`       // 销售反馈-反馈时间 (售前讲解 技术文件)
+	FeedbackSaleBy         int         `orm:"feedback_sale_by"         json:"feedbackSaleBy"`         // 销售反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSaleName       string      `orm:"feedback_sale_name"       json:"feedbackSaleName"`       // 销售反馈-反馈人 (售前讲解 技术文件)
+	FeedbackSaleMeeting    string      `orm:"feedback_sale_meeting"    json:"feedbackSaleMeeting"`    // 销售反馈-会议纪要 (售前讲解)
+	FeedbackSaleDist       string      `orm:"feedback_sale_dist"       json:"feedbackSaleDist"`       // 销售反馈-客户经销商反馈 (售前讲解)
+	FeedbackSaleNext       string      `orm:"feedback_sale_next"       json:"feedbackSaleNext"`       // 销售反馈-下一步计划 (售前讲解 技术文件)
+	FeedbackSaleUser       string      `orm:"feedback_sale_user"       json:"feedbackSaleUser"`       // 销售反馈-用户反馈 (技术文件)
 }

+ 30 - 0
opms_parent/app/model/work/internal/work_order_feedback_trial.go

@@ -0,0 +1,30 @@
+// ==========================================================================
+// This is auto-generated by gf cli tool. DO NOT EDIT THIS FILE MANUALLY.
+// ==========================================================================
+
+package internal
+
+import (
+	"github.com/gogf/gf/os/gtime"
+)
+
+// WorkOrderFeedbackTrial is the golang structure for table work_order_feedback_trial.
+type WorkOrderFeedbackTrial struct {
+	Id                   int         `orm:"id,primary"             json:"id"`                   // 主键
+	WorkOrderId          int         `orm:"work_order_id"          json:"workOrderId"`          // 关联工单ID
+	FeedbackTrialType    string      `orm:"feedback_trial_type"    json:"feedbackTrialType"`    // 试用反馈类型 10 启动 20 过程 30 总结
+	FeedbackTrialTime    *gtime.Time `orm:"feedback_trial_time"    json:"feedbackTrialTime"`    // 试用反馈-反馈时间 (试用)
+	FeedbackTrialBy      int         `orm:"feedback_trial_by"      json:"feedbackTrialBy"`      // 试用反馈-反馈人 (试用)
+	FeedbackTrialName    string      `orm:"feedback_trial_name"    json:"feedbackTrialName"`    // 试用反馈-反馈人 (试用)
+	FeedbackTrialContent string      `orm:"feedback_trial_content" json:"feedbackTrialContent"` // 试用反馈-部署安装总结会议总结过程问题试用总结 (试用)
+	FeedbackTrialDist    string      `orm:"feedback_trial_dist"    json:"feedbackTrialDist"`    // 试用反馈-客户经销商反馈 (试用)
+	FeedbackTrialPlan    string      `orm:"feedback_trial_plan"    json:"feedbackTrialPlan"`    // 试用反馈-下一步计划跟进计划 (试用)
+	Remark               string      `orm:"remark"                 json:"remark"`               // 备注
+	CreatedBy            int         `orm:"created_by"             json:"createdBy"`            // 创建者
+	CreatedName          string      `orm:"created_name"           json:"createdName"`          // 创建人
+	CreatedTime          *gtime.Time `orm:"created_time"           json:"createdTime"`          // 创建时间
+	UpdatedBy            int         `orm:"updated_by"             json:"updatedBy"`            // 更新者
+	UpdatedName          string      `orm:"updated_name"           json:"updatedName"`          // 更新人
+	UpdatedTime          *gtime.Time `orm:"updated_time"           json:"updatedTime"`          // 更新时间
+	DeletedTime          *gtime.Time `orm:"deleted_time"           json:"deletedTime"`          // 删除时间
+}

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

@@ -14,6 +14,10 @@ import (
 type WorkOrder internal.WorkOrder
 
 // Fill with you ideas below.
+type WorkOrderGetRsp struct {
+	WorkOrder
+	FeedbackTrail []*WorkOrderFeedbackTrial `json:"feedbackTrail"` // 试用反馈
+}
 
 type WorkOrderSearchReq struct {
 	NboId          int    `json:"nboId"`          // 主键
@@ -46,6 +50,11 @@ type WorkOrderReq struct {
 	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"`   // '试用结束时间 (试用)';
 }
 
 type UploadDingtalkReq struct {
@@ -85,6 +94,47 @@ type WorkOrderFinishReq struct {
 	FinishRemark string `json:"finishRemark"`                 // 完成信息
 }
 
+type FeedbackSupportReq struct {
+	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"`             // 销售反馈-用户反馈 (技术文件)
+}
+
+type FeedbackTrailReq struct {
+	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"`                                  // 备注
+}
+
+type TimeUpdateExpectReq struct {
+	OrderId    int         `json:"orderId"     v:"min:1#工单不能为空"` //
+	ExpectTime *gtime.Time `json:"expectTime"`                   // 期望完成时间 (技术文件)
+}
+
+type TimeUpdateSupportReq struct {
+	OrderId     int         `json:"orderId"     v:"min:1#工单不能为空"` //
+	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"`                 // '试用结束时间 (试用)';
+}
+
 type WorkOrderCloseReq struct {
 	OrderId int `json:"orderId"     v:"min:1#工单不能为空"` // 主健
 }

+ 14 - 0
opms_parent/app/model/work/work_order_feedback_trial.go

@@ -0,0 +1,14 @@
+// ==========================================================================
+// This is auto-generated by gf cli tool. Fill this file as you wish.
+// ==========================================================================
+
+package work
+
+import (
+	"dashoo.cn/micro/app/model/work/internal"
+)
+
+// WorkOrderFeedbackTrial is the golang structure for table work_order_feedback_trial.
+type WorkOrderFeedbackTrial internal.WorkOrderFeedbackTrial
+
+// Fill with you ideas below.

+ 345 - 4
opms_parent/app/service/work/work_order.go

@@ -36,6 +36,7 @@ type OrderService struct {
 	*service.ContextService
 	Dao             *work.WorkOrderDao
 	FeedbackDao     *work.WorkOrderFeedbackDao
+	TrialDao        *work.WorkOrderFeedbackTrialDao
 	ProjBusinessDao *proj.ProjBusinessDao
 	DynamicsDao     *work.WorkOrderDynamicsDao
 }
@@ -53,6 +54,7 @@ func NewOrderService(ctx context.Context) (svc *OrderService, err error) {
 	svc.FeedbackDao = work.NewWorkOrderFeedbackDao(svc.Tenant)
 	svc.ProjBusinessDao = proj.NewProjBusinessDao(svc.Tenant)
 	svc.DynamicsDao = work.NewWorkOrderDynamicsDao(svc.Tenant)
+	svc.TrialDao = work.NewWorkOrderFeedbackTrialDao(svc.Tenant)
 	return svc, nil
 }
 
@@ -103,10 +105,39 @@ func (s *OrderService) GetList(req *model.WorkOrderSearchReq) (total int, orderL
 		err = myerrors.DbError("获取总行数失败。")
 		return
 	}
-	err = db.Page(req.GetPage()).Order("id desc").Fields("a.*").Scan(&orderList)
+
+	orderBy := "id desc"
+	if req.OrderBy != "" {
+		orderBy = req.OrderBy
+	}
+	err = db.Page(req.GetPage()).Order(orderBy).Fields("a.*").Scan(&orderList)
 	return
 }
 
+func (s *OrderService) ListFull(req *model.WorkOrderSearchReq) (int, []*model.WorkOrderGetRsp, error) {
+	if req.OrderBy == "" {
+		req.OrderBy = "updated_time desc"
+	}
+	total, data, err := s.GetList(req)
+	if err != nil {
+		return 0, nil, err
+	}
+
+	res := []*model.WorkOrderGetRsp{}
+	for _, i := range data {
+		trial, err := s.TrialDao.Where("work_order_id", i.Id).Order("created_time desc").All()
+		if err != nil {
+			return 0, nil, err
+		}
+
+		res = append(res, &model.WorkOrderGetRsp{
+			WorkOrder:     *i,
+			FeedbackTrail: trial,
+		})
+	}
+	return total, res, nil
+}
+
 // 导出
 func (s *OrderService) DeriveList(req *model.WorkOrderExport) (content *model.WorkByteExport, err error) {
 	var con model.WorkByteExport
@@ -156,9 +187,22 @@ func (s *OrderService) DeriveList(req *model.WorkOrderExport) (content *model.Wo
 }
 
 // 详情
-func (s *OrderService) GetEntityById(req *comm_def.IdReq) (detail *model.WorkOrder, err error) {
-	detail, err = s.Dao.WherePri(req.Id).One()
-	return
+func (s *OrderService) GetEntityById(req *comm_def.IdReq) (*model.WorkOrderGetRsp, error) {
+	ent, err := s.Dao.WherePri(req.Id).One()
+	if err != nil {
+		return nil, err
+	}
+	if ent == nil {
+		return nil, myerrors.TipsError("工单不存在")
+	}
+	trial, err := s.TrialDao.Where("work_order_id", req.Id).All()
+	if err != nil {
+		return nil, err
+	}
+	return &model.WorkOrderGetRsp{
+		WorkOrder:     *ent,
+		FeedbackTrail: trial,
+	}, nil
 }
 
 func (s *OrderService) UpdateById(req *model.UpdateWorkOrderReq) error {
@@ -234,6 +278,10 @@ func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.
 	}
 	fileInfoByte, err := json.Marshal(fileInfo)
 	data.File = string(fileInfoByte)
+	data.ExpectTime = req.ExpectTime
+	data.SupportTime = req.SupportTime
+	data.TrialTimeStart = req.TrialTimeStart
+	data.TrialTimeEnd = req.TrialTimeEnd
 
 	formComponentValues := make([]*workflow.StartProcessInstanceRequestFormComponentValues, 0)
 	if err = gconv.Structs(req.FormData, &formComponentValues); err != nil {
@@ -458,6 +506,299 @@ func (s *OrderService) GetWorkOrderFeedbackByDay(req *model.WorkOrderFeedbackSea
 // 	})
 // }
 
+func (s *OrderService) FeedbackSupport(ctx context.Context, req *model.FeedbackSupportReq) 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" || !(ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持") {
+		return myerrors.TipsError("当前工单不可进行支持反馈")
+	}
+	if req.FeedbackSupportTime == nil {
+		req.FeedbackSupportTime = gtime.Now()
+	}
+	if ent.FeedbackSupportBy != 0 {
+		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{}{
+			"feedback_support_time":    req.FeedbackSupportTime,
+			"feedback_support_by":      s.CxtUser.Id,
+			"feedback_support_name":    s.CxtUser.NickName,
+			"feedback_support_content": req.FeedbackSupportContent,
+			"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{}{
+			"feedback_support_time":    req.FeedbackSupportTime,
+			"feedback_support_by":      s.CxtUser.Id,
+			"feedback_support_name":    s.CxtUser.NickName,
+			"feedback_support_content": req.FeedbackSupportContent,
+		})
+		return err
+	})
+}
+
+func (s *OrderService) FeedbackSale(ctx context.Context, req *model.FeedbackSaleReq) 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" || !(ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持") {
+		return myerrors.TipsError("当前工单不可进行销售反馈")
+	}
+	if req.FeedbackSaleTime == nil {
+		req.FeedbackSaleTime = gtime.Now()
+	}
+	if ent.FeedbackSupportBy == 0 {
+		return myerrors.TipsError("当前工单未进行支持反馈")
+	}
+	if ent.FeedbackSaleBy != 0 {
+		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", // 销售反馈之后工单完成
+			"feedback_sale_time":    req.FeedbackSaleTime,
+			"feedback_sale_by":      s.CxtUser.Id,
+			"feedback_sale_name":    s.CxtUser.NickName,
+			"feedback_sale_meeting": req.FeedbackSaleMeeting,
+			"feedback_sale_dist":    req.FeedbackSaleDist,
+			"feedback_sale_next":    req.FeedbackSaleNext,
+			"feedback_sale_user":    req.FeedbackSaleUser,
+			"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{}{
+			"feedback_sale_time":    req.FeedbackSaleTime,
+			"feedback_sale_by":      s.CxtUser.Id,
+			"feedback_sale_name":    s.CxtUser.NickName,
+			"feedback_sale_meeting": req.FeedbackSaleMeeting,
+			"feedback_sale_dist":    req.FeedbackSaleDist,
+			"feedback_sale_next":    req.FeedbackSaleNext,
+			"feedback_sale_user":    req.FeedbackSaleUser,
+		})
+		return err
+	})
+}
+
+func (s *OrderService) FeedbackTrail(ctx context.Context, req *model.FeedbackTrailReq) error {
+	ent, err := s.Dao.Where("id = ?", req.WorkOrderId).One()
+	if err != nil {
+		return err
+	}
+	if ent == nil {
+		return myerrors.TipsError("工单不存在")
+	}
+	if ent.OrderStatus != "30" || (ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持") {
+		return myerrors.TipsError("当前工单不可进行试用反馈")
+	}
+
+	start, err := s.TrialDao.Where("work_order_id = ?", req.WorkOrderId).
+		Where("feedback_trial_type = ?", "10").One()
+	if err != nil {
+		return err
+	}
+	end, err := s.TrialDao.Where("work_order_id = ?", req.WorkOrderId).
+		Where("feedback_trial_type = ?", "30").One()
+	if err != nil {
+		return err
+	}
+
+	var dynamic string
+	if req.FeedbackTrialType == "10" {
+		if start != nil {
+			dynamic = "试用启动反馈"
+			return myerrors.TipsError("试用启动反馈已创建")
+		}
+	} else if req.FeedbackTrialType == "20" {
+		dynamic = "试用过程反馈"
+		if start == nil {
+			return myerrors.TipsError("试用启动反馈未创建")
+		}
+		if end != nil {
+			return myerrors.TipsError("试用总结反馈已创建")
+		}
+	} else if req.FeedbackTrialType == "30" {
+		dynamic = "试用总结反馈"
+		if end != nil {
+			return myerrors.TipsError("试用总结反馈已创建")
+		}
+	} else {
+		return myerrors.TipsError("试用反馈类型不合法")
+	}
+
+	if req.FeedbackTrialTime == nil {
+		req.FeedbackTrialTime = gtime.Now()
+	}
+
+	return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		_, err = tx.InsertAndGetId("work_order_feedback_trial", model.WorkOrderFeedbackTrial{
+			WorkOrderId:          req.WorkOrderId,
+			FeedbackTrialType:    req.FeedbackTrialType,
+			FeedbackTrialTime:    req.FeedbackTrialTime,
+			FeedbackTrialBy:      s.CxtUser.Id,
+			FeedbackTrialName:    s.CxtUser.NickName,
+			FeedbackTrialContent: req.FeedbackTrialContent,
+			FeedbackTrialDist:    req.FeedbackTrialDist,
+			FeedbackTrialPlan:    req.FeedbackTrialPlan,
+			Remark:               "",
+			CreatedBy:            s.CxtUser.Id,
+			CreatedName:          s.CxtUser.NickName,
+			CreatedTime:          gtime.Now(),
+			UpdatedBy:            s.CxtUser.Id,
+			UpdatedName:          s.CxtUser.NickName,
+			UpdatedTime:          gtime.Now(),
+		})
+		if err != nil {
+			return err
+		}
+
+		if req.FeedbackTrialType == "30" { // 试用总结反馈之后工单完成
+			_, err = tx.Update("work_order", map[string]interface{}{
+				"order_status": "60",
+				"updated_by":   s.CxtUser.Id,
+				"updated_name": s.CxtUser.NickName,
+				"updated_time": gtime.Now(),
+			}, "id = ?", req.WorkOrderId)
+			if err != nil {
+				return err
+			}
+		}
+
+		err = s.AddDynamicsByCurrentUser(tx, int(req.WorkOrderId), dynamic, map[string]interface{}{
+			"feedback_trial_time":    req.FeedbackTrialTime,
+			"feedback_trial_content": req.FeedbackTrialContent,
+			"feedback_trial_dist":    req.FeedbackTrialDist,
+			"feedback_trial_plan":    req.FeedbackTrialPlan,
+		})
+		return err
+	})
+}
+
+func (s *OrderService) TimeUpdateExpect(ctx context.Context, req *model.TimeUpdateExpectReq) 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" || ent.OrderTypeName != "技术文件支持" {
+		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{}{
+			"expect_time":  req.ExpectTime,
+			"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{}{
+			"old_expect_time": ent.ExpectTime,
+			"new_expect_time": req.ExpectTime,
+		})
+		return err
+	})
+}
+
+func (s *OrderService) TimeUpdateSupport(ctx context.Context, req *model.TimeUpdateSupportReq) 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" || ent.OrderTypeName != "售前讲解支持" {
+		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{}{
+			"support_time": req.SupportTime,
+			"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{}{
+			"old_support_time": ent.SupportTime,
+			"new_support_time": req.SupportTime,
+		})
+		return err
+	})
+}
+
+func (s *OrderService) TimeUpdateTrial(ctx context.Context, req *model.TimeUpdateTrialReq) 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" || (ent.OrderTypeName == "售前讲解支持" || ent.OrderTypeName == "技术文件支持") {
+		return myerrors.TipsError("当前工单不可修改试用时间")
+	}
+	if req.TrialTimeStart == nil {
+		return myerrors.TipsError("试用开始时间不能为空")
+	}
+	if req.TrialTimeEnd == nil {
+		return myerrors.TipsError("试用结束时间不能为空")
+	}
+	if req.TrialTimeEnd.Sub(req.TrialTimeStart) <= 0 {
+		return myerrors.TipsError("试用结束时间必须大于开始时间")
+	}
+
+	dynamic := "改期"
+	if ent.TrialTimeStart.Sub(req.TrialTimeStart) == 0 {
+		dynamic = "延期"
+	}
+
+	return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		_, err = tx.Update("work_order", map[string]interface{}{
+			"trial_time_start": req.TrialTimeStart,
+			"trial_time_end":   req.TrialTimeEnd,
+			"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), dynamic, map[string]interface{}{
+			"old_trial_time_start": ent.TrialTimeStart,
+			"old_trial_time_end":   ent.TrialTimeEnd,
+			"new_trial_time_start": req.TrialTimeStart,
+			"new_trial_time_end":   req.TrialTimeEnd,
+		})
+		return err
+	})
+}
+
 func (s *OrderService) Close(ctx context.Context, req *model.WorkOrderCloseReq) error {
 	ent, err := s.Dao.Where("id = ?", req.OrderId).One()
 	if err != nil {

+ 46 - 0
opms_parent/schema/tmp.sql

@@ -143,3 +143,49 @@ alter table work_order add `finish_by_name`  varchar(90) DEFAULT NULL COMMENT '
 alter table work_order modify `order_status` varchar(4) NOT NULL COMMENT '工单状态(10发起20审批中30审批通过40审批拒绝50关闭60已完成)';
 -- 添加工单状态字典 60已完成
 
+-- 2023-07-06
+alter table work_order add `sale_id` int(11) DEFAULT NULL COMMENT '销售工程师ID' after assign_user_name;
+alter table work_order add `sale_name` varchar(90) DEFAULT NULL COMMENT '销售工程师' after sale_id;
+
+alter table work_order add `expect_time` datetime COMMENT '期望完成时间 (技术文件)';
+alter table work_order add `support_time` datetime COMMENT '支持时间 (售前讲解)';
+alter table work_order add `trial_time_start` datetime COMMENT '试用开始时间 (试用)';
+alter table work_order add `trial_time_end` datetime COMMENT '试用结束时间 (试用)';
+
+-- 售前讲解 技术文件 试用
+
+alter table work_order add `feedback_support_time` datetime DEFAULT NULL COMMENT '支持反馈-反馈时间 (售前讲解 技术文件)';
+alter table work_order add `feedback_support_by` int(11) DEFAULT NULL COMMENT '支持反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_support_name` varchar(90) DEFAULT NULL COMMENT '支持反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_support_content` text DEFAULT NULL COMMENT '支持反馈-本次讲解情况反馈 (售前讲解 技术文件)';
+
+alter table work_order add `feedback_sale_time` datetime DEFAULT NULL COMMENT '销售反馈-反馈时间 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_by` int(11) DEFAULT NULL COMMENT '销售反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_name` varchar(90) DEFAULT NULL COMMENT '销售反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_meeting` text DEFAULT NULL COMMENT '销售反馈-会议纪要 (售前讲解)';
+alter table work_order add `feedback_sale_dist` text DEFAULT NULL COMMENT '销售反馈-客户\经销商反馈 (售前讲解)';
+alter table work_order add `feedback_sale_next` text DEFAULT NULL COMMENT '销售反馈-下一步计划 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_user` text DEFAULT NULL COMMENT '销售反馈-用户反馈 (技术文件)';
+
+CREATE TABLE work_order_feedback_trial(
+    `id` INT(11) NOT NULL AUTO_INCREMENT  COMMENT '主键' ,
+    `work_order_id` INT(11) NOT NULL COMMENT '关联工单ID' ,
+    `feedback_trial_type` VARCHAR(4) NOT NULL COMMENT '试用反馈类型 10 启动 20 过程 30 总结',
+    `feedback_trial_time` DATETIME COMMENT '试用反馈-反馈时间 (试用)',
+    `feedback_trial_by`INT(11) COMMENT '试用反馈-反馈人 (试用)',
+    `feedback_trial_name` VARCHAR(90) COMMENT '试用反馈-反馈人 (试用)',
+    `feedback_trial_content` TEXT COMMENT '试用反馈-部署安装总结\会议总结\过程问题\试用总结 (试用)',
+    `feedback_trial_dist` TEXT COMMENT '试用反馈-客户\经销商反馈 (试用)',
+    `feedback_trial_plan` TEXT COMMENT '试用反馈-下一步计划\跟进计划 (试用)',
+    `remark` TEXT    COMMENT '备注' ,
+    `created_by` INT(11) NOT NULL   COMMENT '创建者' ,
+    `created_name` VARCHAR(90) NOT NULL   COMMENT '创建人' ,
+    `created_time` DATETIME NOT NULL   COMMENT '创建时间' ,
+    `updated_by` INT(11)    COMMENT '更新者' ,
+    `updated_name` VARCHAR(90)    COMMENT '更新人' ,
+    `updated_time` DATETIME    COMMENT '更新时间' ,
+    `deleted_time` DATETIME    COMMENT '删除时间' ,
+    PRIMARY KEY (id)
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '试用反馈';
+
+alter table work_order_dynamics modify `opn_type` varchar(90) NOT NULL COMMENT '操作类型';

+ 45 - 0
opms_parent/schema/work_order.sql

@@ -34,6 +34,51 @@ alter table work_order add `finish_by` int(11) DEFAULT NULL COMMENT '完成操
 alter table work_order add `finish_by_name`  varchar(90) DEFAULT NULL COMMENT '完成操作人' after `finish_by`;
 alter table work_order modify `order_status` varchar(4) NOT NULL COMMENT '工单状态(10发起20审批中30审批通过40审批拒绝50关闭60已完成)';
 
+alter table work_order add `sale_id` int(11) DEFAULT NULL COMMENT '销售工程师ID' after assign_user_name;
+alter table work_order add `sale_name` varchar(90) DEFAULT NULL COMMENT '销售工程师' after sale_id;
+
+alter table work_order add `expect_time` datetime COMMENT '期望完成时间 (技术文件)';
+alter table work_order add `support_time` datetime COMMENT '支持时间 (售前讲解)';
+alter table work_order add `trial_time_start` datetime COMMENT '试用开始时间 (试用)';
+alter table work_order add `trial_time_end` datetime COMMENT '试用结束时间 (试用)';
+
+-- 售前讲解 技术文件 试用
+
+alter table work_order add `feedback_support_time` datetime DEFAULT NULL COMMENT '支持反馈-反馈时间 (售前讲解 技术文件)';
+alter table work_order add `feedback_support_by` int(11) DEFAULT NULL COMMENT '支持反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_support_name` varchar(90) DEFAULT NULL COMMENT '支持反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_support_content` text DEFAULT NULL COMMENT '支持反馈-本次讲解情况反馈 (售前讲解 技术文件)';
+
+alter table work_order add `feedback_sale_time` datetime DEFAULT NULL COMMENT '销售反馈-反馈时间 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_by` int(11) DEFAULT NULL COMMENT '销售反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_name` varchar(90) DEFAULT NULL COMMENT '销售反馈-反馈人 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_meeting` text DEFAULT NULL COMMENT '销售反馈-会议纪要 (售前讲解)';
+alter table work_order add `feedback_sale_dist` text DEFAULT NULL COMMENT '销售反馈-客户\经销商反馈 (售前讲解)';
+alter table work_order add `feedback_sale_next` text DEFAULT NULL COMMENT '销售反馈-下一步计划 (售前讲解 技术文件)';
+alter table work_order add `feedback_sale_user` text DEFAULT NULL COMMENT '销售反馈-用户反馈 (技术文件)';
+
+CREATE TABLE work_order_feedback_trial(
+    `id` INT(11) NOT NULL AUTO_INCREMENT  COMMENT '主键' ,
+    `work_order_id` INT(11) NOT NULL COMMENT '关联工单ID' ,
+    `feedback_trial_type` VARCHAR(4) NOT NULL COMMENT '试用反馈类型 10 启动 20 过程 30 总结',
+    `feedback_trial_time` DATETIME COMMENT '试用反馈-反馈时间 (试用)',
+    `feedback_trial_by`INT(11) COMMENT '试用反馈-反馈人 (试用)',
+    `feedback_trial_name` VARCHAR(90) COMMENT '试用反馈-反馈人 (试用)',
+    `feedback_trial_content` TEXT COMMENT '试用反馈-部署安装总结\会议总结\过程问题\试用总结 (试用)',
+    `feedback_trial_dist` TEXT COMMENT '试用反馈-客户\经销商反馈 (试用)',
+    `feedback_trial_plan` TEXT COMMENT '试用反馈-下一步计划\跟进计划 (试用)',
+    `remark` TEXT    COMMENT '备注' ,
+    `created_by` INT(11) NOT NULL   COMMENT '创建者' ,
+    `created_name` VARCHAR(90) NOT NULL   COMMENT '创建人' ,
+    `created_time` DATETIME NOT NULL   COMMENT '创建时间' ,
+    `updated_by` INT(11)    COMMENT '更新者' ,
+    `updated_name` VARCHAR(90)    COMMENT '更新人' ,
+    `updated_time` DATETIME    COMMENT '更新时间' ,
+    `deleted_time` DATETIME    COMMENT '删除时间' ,
+    PRIMARY KEY (id)
+) ENGINE = InnoDB DEFAULT CHARSET = utf8mb4 COMMENT = '试用反馈';
+
+alter table work_order_dynamics modify `opn_type` varchar(90) NOT NULL COMMENT '操作类型';
 
 DROP TABLE IF EXISTS deliver_order;
 CREATE TABLE deliver_order(