Переглянути джерело

feature(工单): 硬件交付工单需求开发初步完成

lk 2 роки тому
батько
коміт
c9bf3f5fca

+ 90 - 81
opms_parent/app/dao/work/internal/deliver_order.go

@@ -30,33 +30,36 @@ type DeliverOrderDao struct {
 
 // DeliverOrderColumns defines and stores column names for table deliver_order.
 type deliverOrderColumns struct {
-	Id             string // 主键
-	OrderCode      string // 交付订单号
-	OrderStatus    string // 交付状态(10项目立项 20 完成)
-	OrderType      string // 交付类型(10 软件 20 硬件)
-	CustId         string // 关联客户ID
-	CustName       string // 关联客户名称
-	ProjectId      string // 关联项目ID
-	ProjectName    string // 关联项目名称
-	ContractId     string // 关联合同ID
-	ContractCode   string // 关联合同编号
-	ProjectManId   string // 项目经理
-	ProjectManName string // 项目经理
-	DeliverManId   string // 交付经理
-	DeliverManName string // 交付经理
-	Product        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 // 主键
+	OrderCode            string // 交付订单号
+	OrderStatus          string // 交付状态(10项目立项 20 完成)
+	OrderType            string // 交付类型(10 软件 20 硬件)
+	CustId               string // 关联客户ID
+	CustName             string // 关联客户名称
+	ProjectId            string // 关联项目ID
+	ProjectName          string // 关联项目名称
+	ContractId           string // 关联合同ID
+	ContractCode         string // 关联合同编号
+	ProjectManId         string // 项目经理
+	ProjectManName       string // 项目经理
+	DeliverManId         string // 交付经理
+	DeliverManName       string // 交付经理
+	Product              string // 产品线
+	FinishRemark         string // 完成信息
+	FinishTime           string // 完成时间
+	FinishBy             string // 完成操作人
+	FinishByName         string // 完成操作人
+	RequiredDeliveryTime string // 要求发货时间
+	ReceivingInfo        string // 收货信息
+	SpecialRequirements  string // 特殊要求说明
+	Remark               string // 备注
+	CreatedBy            string // 创建者
+	CreatedName          string // 创建人
+	CreatedTime          string // 创建时间
+	UpdatedBy            string // 更新者
+	UpdatedName          string // 更新人
+	UpdatedTime          string // 更新时间
+	DeletedTime          string // 删除时间
 }
 
 var (
@@ -66,33 +69,36 @@ var (
 		DB:    g.DB("default"),
 		Table: "deliver_order",
 		C: deliverOrderColumns{
-			Id:             "id",
-			OrderCode:      "order_code",
-			OrderStatus:    "order_status",
-			OrderType:      "order_type",
-			CustId:         "cust_id",
-			CustName:       "cust_name",
-			ProjectId:      "project_id",
-			ProjectName:    "project_name",
-			ContractId:     "contract_id",
-			ContractCode:   "contract_code",
-			ProjectManId:   "project_man_id",
-			ProjectManName: "project_man_name",
-			DeliverManId:   "deliver_man_id",
-			DeliverManName: "deliver_man_name",
-			Product:        "product",
-			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",
+			OrderCode:            "order_code",
+			OrderStatus:          "order_status",
+			OrderType:            "order_type",
+			CustId:               "cust_id",
+			CustName:             "cust_name",
+			ProjectId:            "project_id",
+			ProjectName:          "project_name",
+			ContractId:           "contract_id",
+			ContractCode:         "contract_code",
+			ProjectManId:         "project_man_id",
+			ProjectManName:       "project_man_name",
+			DeliverManId:         "deliver_man_id",
+			DeliverManName:       "deliver_man_name",
+			Product:              "product",
+			FinishRemark:         "finish_remark",
+			FinishTime:           "finish_time",
+			FinishBy:             "finish_by",
+			FinishByName:         "finish_by_name",
+			RequiredDeliveryTime: "required_delivery_time",
+			ReceivingInfo:        "receiving_info",
+			SpecialRequirements:  "special_requirements",
+			Remark:               "remark",
+			CreatedBy:            "created_by",
+			CreatedName:          "created_name",
+			CreatedTime:          "created_time",
+			UpdatedBy:            "updated_by",
+			UpdatedName:          "updated_name",
+			UpdatedTime:          "updated_time",
+			DeletedTime:          "deleted_time",
 		},
 	}
 )
@@ -104,33 +110,36 @@ func NewDeliverOrderDao(tenant string) DeliverOrderDao {
 		DB:    g.DB(tenant),
 		Table: "deliver_order",
 		C: deliverOrderColumns{
-			Id:             "id",
-			OrderCode:      "order_code",
-			OrderStatus:    "order_status",
-			OrderType:      "order_type",
-			CustId:         "cust_id",
-			CustName:       "cust_name",
-			ProjectId:      "project_id",
-			ProjectName:    "project_name",
-			ContractId:     "contract_id",
-			ContractCode:   "contract_code",
-			ProjectManId:   "project_man_id",
-			ProjectManName: "project_man_name",
-			DeliverManId:   "deliver_man_id",
-			DeliverManName: "deliver_man_name",
-			Product:        "product",
-			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",
+			OrderCode:            "order_code",
+			OrderStatus:          "order_status",
+			OrderType:            "order_type",
+			CustId:               "cust_id",
+			CustName:             "cust_name",
+			ProjectId:            "project_id",
+			ProjectName:          "project_name",
+			ContractId:           "contract_id",
+			ContractCode:         "contract_code",
+			ProjectManId:         "project_man_id",
+			ProjectManName:       "project_man_name",
+			DeliverManId:         "deliver_man_id",
+			DeliverManName:       "deliver_man_name",
+			Product:              "product",
+			FinishRemark:         "finish_remark",
+			FinishTime:           "finish_time",
+			FinishBy:             "finish_by",
+			FinishByName:         "finish_by_name",
+			RequiredDeliveryTime: "required_delivery_time",
+			ReceivingInfo:        "receiving_info",
+			SpecialRequirements:  "special_requirements",
+			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

+ 108 - 54
opms_parent/app/dao/work/internal/deliver_order_imp_progress.go

@@ -30,24 +30,42 @@ type DeliverOrderImpProgressDao struct {
 
 // DeliverOrderImpProgressColumns defines and stores column names for table deliver_order_imp_progress.
 type deliverOrderImpProgressColumns struct {
-	Id              string // 主键
-	PlanId          string // 关联实施计划
-	ProgressTitle   string // 任务标题
-	ProgressContext string // 任务内容
-	StartDate       string // 开始时间
-	EndDate         string // 结束时间
-	ReaStartDate    string // 实际开始时间
-	ReaEndDate      string // 实际结束时间
-	ProgressStatus  string // 状态(10未开始20已开始30已完成)
-	ProgressLevel   string // 优先级(10最高 20普通 30较低 )
-	Remark          string // 备注
-	CreatedBy       string // 创建者
-	CreatedName     string // 创建人
-	CreatedTime     string // 创建时间
-	UpdatedBy       string // 更新者
-	UpdatedName     string // 更新人
-	UpdatedTime     string // 更新时间
-	DeletedTime     string // 删除时间
+	Id                   string // 主键
+	DeliverOrderId       string // 关联交付订单ID
+	PlanId               string // 关联实施计划
+	ProgressTitle        string // 任务标题
+	ProgressContext      string // 任务内容
+	StartDate            string // 开始时间
+	EndDate              string // 结束时间
+	ReaStartDate         string // 实际开始时间
+	ReaEndDate           string // 实际结束时间
+	ProgressStatus       string // 状态(10未开始20进行中30已完成)
+	DeliverStatus        string // 发货状态(10未开始、20进行中、30已发货、40产品已验收、50确认已到货、60安装完成)
+	ProgressLevel        string // 优先级(10最高 20普通 30较低 )
+	ProgressType         string // 10发货任务单/20组装任务单/30部署安装单
+	PrincipalPersonId    string // 负责人id
+	PrincipalPerson      string // 负责人
+	AssembleFileUrl      string // 组装报告文件
+	AssembleFileName     string // 组装报告文件名称
+	ExpressName          string // 快递名称
+	ExpressCode          string // 快递单号
+	EstimatedArrivalTime string // 预计到货时间
+	ArrivalTime          string // 到货时间
+	CheckFileUrl         string // 验收单文件
+	CheckFileName        string // 验收单文件名称
+	CheckPersonId        string // 验收人Id
+	CheckPerson          string // 验收人
+	InstallDate          string // 安装日期
+	InstallCheckFileUrl  string // 安装验收单文件
+	InstallCheckFileName string // 安装验收单文件名称
+	Remark               string // 备注
+	CreatedBy            string // 创建者
+	CreatedName          string // 创建人
+	CreatedTime          string // 创建时间
+	UpdatedBy            string // 更新者
+	UpdatedName          string // 更新人
+	UpdatedTime          string // 更新时间
+	DeletedTime          string // 删除时间
 }
 
 var (
@@ -57,24 +75,42 @@ var (
 		DB:    g.DB("default"),
 		Table: "deliver_order_imp_progress",
 		C: deliverOrderImpProgressColumns{
-			Id:              "id",
-			PlanId:          "plan_id",
-			ProgressTitle:   "progress_title",
-			ProgressContext: "progress_context",
-			StartDate:       "start_date",
-			EndDate:         "end_date",
-			ReaStartDate:    "rea_start_date",
-			ReaEndDate:      "rea_end_date",
-			ProgressStatus:  "progress_status",
-			ProgressLevel:   "progress_level",
-			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",
+			DeliverOrderId:       "deliver_order_id",
+			PlanId:               "plan_id",
+			ProgressTitle:        "progress_title",
+			ProgressContext:      "progress_context",
+			StartDate:            "start_date",
+			EndDate:              "end_date",
+			ReaStartDate:         "rea_start_date",
+			ReaEndDate:           "rea_end_date",
+			ProgressStatus:       "progress_status",
+			DeliverStatus:        "deliver_status",
+			ProgressLevel:        "progress_level",
+			ProgressType:         "progress_type",
+			PrincipalPersonId:    "principal_person_id",
+			PrincipalPerson:      "principal_person",
+			AssembleFileUrl:      "assemble_file_url",
+			AssembleFileName:     "assemble_file_name",
+			ExpressName:          "express_name",
+			ExpressCode:          "express_code",
+			EstimatedArrivalTime: "estimated_arrival_time",
+			ArrivalTime:          "arrival_time",
+			CheckFileUrl:         "check_file_url",
+			CheckFileName:        "check_file_name",
+			CheckPersonId:        "check_person_id",
+			CheckPerson:          "check_person",
+			InstallDate:          "install_date",
+			InstallCheckFileUrl:  "install_check_file_url",
+			InstallCheckFileName: "install_check_file_name",
+			Remark:               "remark",
+			CreatedBy:            "created_by",
+			CreatedName:          "created_name",
+			CreatedTime:          "created_time",
+			UpdatedBy:            "updated_by",
+			UpdatedName:          "updated_name",
+			UpdatedTime:          "updated_time",
+			DeletedTime:          "deleted_time",
 		},
 	}
 )
@@ -86,24 +122,42 @@ func NewDeliverOrderImpProgressDao(tenant string) DeliverOrderImpProgressDao {
 		DB:    g.DB(tenant),
 		Table: "deliver_order_imp_progress",
 		C: deliverOrderImpProgressColumns{
-			Id:              "id",
-			PlanId:          "plan_id",
-			ProgressTitle:   "progress_title",
-			ProgressContext: "progress_context",
-			StartDate:       "start_date",
-			EndDate:         "end_date",
-			ReaStartDate:    "rea_start_date",
-			ReaEndDate:      "rea_end_date",
-			ProgressStatus:  "progress_status",
-			ProgressLevel:   "progress_level",
-			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",
+			DeliverOrderId:       "deliver_order_id",
+			PlanId:               "plan_id",
+			ProgressTitle:        "progress_title",
+			ProgressContext:      "progress_context",
+			StartDate:            "start_date",
+			EndDate:              "end_date",
+			ReaStartDate:         "rea_start_date",
+			ReaEndDate:           "rea_end_date",
+			ProgressStatus:       "progress_status",
+			DeliverStatus:        "deliver_status",
+			ProgressLevel:        "progress_level",
+			ProgressType:         "progress_type",
+			PrincipalPersonId:    "principal_person_id",
+			PrincipalPerson:      "principal_person",
+			AssembleFileUrl:      "assemble_file_url",
+			AssembleFileName:     "assemble_file_name",
+			ExpressName:          "express_name",
+			ExpressCode:          "express_code",
+			EstimatedArrivalTime: "estimated_arrival_time",
+			ArrivalTime:          "arrival_time",
+			CheckFileUrl:         "check_file_url",
+			CheckFileName:        "check_file_name",
+			CheckPersonId:        "check_person_id",
+			CheckPerson:          "check_person",
+			InstallDate:          "install_date",
+			InstallCheckFileUrl:  "install_check_file_url",
+			InstallCheckFileName: "install_check_file_name",
+			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

+ 63 - 42
opms_parent/app/dao/work/internal/deliver_order_product.go

@@ -30,20 +30,27 @@ type DeliverOrderProductDao struct {
 
 // DeliverOrderProductColumns defines and stores column names for table deliver_order_product.
 type deliverOrderProductColumns struct {
-	Id             string // 主键
-	DeliverOrderId string // 关联交付订单ID
-	ProductCode    string // 产品编码
-	ProductName    string // 产品名称
-	ProductType    string // 产品类型
-	ProductNum     string // 产品数量
-	Remark         string // 备注
-	CreatedBy      string // 创建者
-	CreatedName    string // 创建人
-	CreatedTime    string // 创建时间
-	UpdatedBy      string // 更新者
-	UpdatedName    string // 更新人
-	UpdatedTime    string // 更新时间
-	DeletedTime    string // 删除时间
+	Id                 string // 主键
+	DeliverOrderId     string // 关联交付订单ID
+	ProductCode        string // 产品编码
+	ProductName        string // 产品名称
+	ProductType        string // 产品类型
+	ProductNum         string // 产品数量
+	IsDeliver          string // 10 未开始;20 已操作
+	IsComplete         string // 10 未完成;20 组装或外购
+	IsInstall          string // 10 未开始;20 安装部署完成
+	OperateType        string // 获取方式:组装;外购
+	DeliverProgressId  string // 关联的发货任务单Id
+	AssembleProgressId string // 关联的组装任务单Id
+	InstallProgressId  string // 关联的部署安装单
+	Remark             string // 备注
+	CreatedBy          string // 创建者
+	CreatedName        string // 创建人
+	CreatedTime        string // 创建时间
+	UpdatedBy          string // 更新者
+	UpdatedName        string // 更新人
+	UpdatedTime        string // 更新时间
+	DeletedTime        string // 删除时间
 }
 
 var (
@@ -53,20 +60,27 @@ var (
 		DB:    g.DB("default"),
 		Table: "deliver_order_product",
 		C: deliverOrderProductColumns{
-			Id:             "id",
-			DeliverOrderId: "deliver_order_id",
-			ProductCode:    "product_code",
-			ProductName:    "product_name",
-			ProductType:    "product_type",
-			ProductNum:     "product_num",
-			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",
+			DeliverOrderId:     "deliver_order_id",
+			ProductCode:        "product_code",
+			ProductName:        "product_name",
+			ProductType:        "product_type",
+			ProductNum:         "product_num",
+			IsDeliver:          "is_deliver",
+			IsComplete:         "is_complete",
+			IsInstall:          "is_install",
+			OperateType:        "operate_type",
+			DeliverProgressId:  "deliver_progress_id",
+			AssembleProgressId: "assemble_progress_id",
+			InstallProgressId:  "install_progress_id",
+			Remark:             "remark",
+			CreatedBy:          "created_by",
+			CreatedName:        "created_name",
+			CreatedTime:        "created_time",
+			UpdatedBy:          "updated_by",
+			UpdatedName:        "updated_name",
+			UpdatedTime:        "updated_time",
+			DeletedTime:        "deleted_time",
 		},
 	}
 )
@@ -78,20 +92,27 @@ func NewDeliverOrderProductDao(tenant string) DeliverOrderProductDao {
 		DB:    g.DB(tenant),
 		Table: "deliver_order_product",
 		C: deliverOrderProductColumns{
-			Id:             "id",
-			DeliverOrderId: "deliver_order_id",
-			ProductCode:    "product_code",
-			ProductName:    "product_name",
-			ProductType:    "product_type",
-			ProductNum:     "product_num",
-			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",
+			DeliverOrderId:     "deliver_order_id",
+			ProductCode:        "product_code",
+			ProductName:        "product_name",
+			ProductType:        "product_type",
+			ProductNum:         "product_num",
+			IsDeliver:          "is_deliver",
+			IsComplete:         "is_complete",
+			IsInstall:          "is_install",
+			OperateType:        "operate_type",
+			DeliverProgressId:  "deliver_progress_id",
+			AssembleProgressId: "assemble_progress_id",
+			InstallProgressId:  "install_progress_id",
+			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

+ 14 - 0
opms_parent/app/handler/work/deliver_order.go

@@ -94,3 +94,17 @@ func (w *DeliverOrder) Delete(ctx context.Context, req *contractmodel.IdsReq, rs
 	}
 	return nil
 }
+
+// Start 启动
+// Swagger:DeliverOrder 交付工单 启动(开启)工单
+func (w *DeliverOrder) Start(ctx context.Context, req *model.StartReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.Start(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 98 - 0
opms_parent/app/handler/work/deliver_order_progress.go

@@ -93,3 +93,101 @@ func (w *DeliverOrderProgress) Delete(ctx context.Context, req *contractmodel.Id
 	}
 	return nil
 }
+
+// StartDeliverGoodsProgress (硬件交付工单)发起发货任务单
+// Swagger:DeliverOrderProgress 交付工单任务 (硬件交付工单)发起发货任务单
+func (w *DeliverOrderProgress) StartDeliverGoodsProgress(ctx context.Context, req *model.StartDeliverGoodsProgressReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.StartDeliverGoodsProgress(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// CompleteAssembleGoodsProgress 组装完成
+// Swagger:DeliverOrderProgress 交付工单任务 组装完成
+func (w *DeliverOrderProgress) CompleteAssembleGoodsProgress(ctx context.Context, req *model.CompleteAssembleGoodsProgressReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.CompleteAssembleGoodsProgress(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// DeliverGoods 发货
+// Swagger:DeliverOrderProgress 交付工单任务 发货
+func (w *DeliverOrderProgress) DeliverGoods(ctx context.Context, req *model.DeliverGoodsReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.DeliverGoods(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// InspectGoods 验收
+// Swagger:DeliverOrderProgress 交付工单任务 验收
+func (w *DeliverOrderProgress) InspectGoods(ctx context.Context, req *model.InspectGoodsReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.InspectGoods(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// ConfirmArrival 确认到货
+// Swagger:DeliverOrderProgress 交付工单任务 确认到货
+func (w *DeliverOrderProgress) ConfirmArrival(ctx context.Context, req *model.ConfirmArrivalReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.ConfirmArrival(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// StartInstallProgress 发起部署安装单
+// Swagger:DeliverOrderProgress 交付工单任务 发起部署安装单
+func (w *DeliverOrderProgress) StartInstallProgress(ctx context.Context, req *model.StartDeliverGoodsProgressReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.StartInstallProgress(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// CompleteInstall 部署安装完成
+// Swagger:DeliverOrderProgress 交付工单任务 部署安装完成
+func (w *DeliverOrderProgress) CompleteInstall(ctx context.Context, req *model.CompleteInstallReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.CompleteInstall(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 17 - 1
opms_parent/app/model/work/deliver_order.go

@@ -7,6 +7,7 @@ package work
 import (
 	"dashoo.cn/micro/app/model/work/internal"
 	"dashoo.cn/opms_libary/request"
+	"github.com/gogf/gf/os/gtime"
 )
 
 // DeliverOrder is the golang structure for table deliver_order.
@@ -15,10 +16,17 @@ type DeliverOrder internal.DeliverOrder
 // Fill with you ideas below.
 type DeliverOrderGetRsp struct {
 	DeliverOrder
+	SaleId  int                    `json:"saleId"`
 	Plan    []*DeliverOrderImpPlan `json:"plan"`
 	Product []*DeliverOrderProduct `json:"product"`
 }
 
+type DeliverOrderInfo struct {
+	DeliverOrder
+	Products string `json:"products"`
+	SaleId   int    `json:"saleId"`
+}
+
 type DeliverOrderListReq struct {
 	request.PageReq
 	OrderCode      string `json:"orderCode"`      // 交付订单号
@@ -52,5 +60,13 @@ type DeliverOrderUpdateReq struct {
 
 type DeliverOrderFinishReq struct {
 	OrderId      int    `json:"orderId"     v:"min:1#工单不能为空"` //
-	FinishRemark string `json:"finishRemark"`                 // 完成信息
+	FinishRemark string `json:"finishRemark"`                       // 完成信息
+}
+
+// StartReq 启动
+type StartReq struct {
+	OrderId              int         `json:"orderId"     v:"min:1#工单不能为空"` //
+	RequiredDeliveryTime *gtime.Time `json:"requiredDeliveryTime"`               // 要求发货时间
+	ReceivingInfo        string      `json:"receivingInfo"`                      // 收货信息
+	SpecialRequirements  string      `json:"specialRequirements"`                // 特殊要求说明
 }

+ 69 - 20
opms_parent/app/model/work/deliver_order_imp_progress.go

@@ -13,14 +13,16 @@ import (
 // DeliverOrderImpProgress is the golang structure for table deliver_order_imp_progress.
 type DeliverOrderImpProgress internal.DeliverOrderImpProgress
 
-// Fill with you ideas below.
+//  Fill with you ideas below.
 type DeliverOrderProgressListReq struct {
 	request.PageReq
-	DeliverOrderId int    `json:"deliverOrderId"` // 关联交付订单ID
-	PlanId         int    `json:"planId"`         // 关联实施计划
-	ProgressTitle  string `json:"progressTitle"`  // 任务标题
-	ProgressStatus string `json:"progressStatus"` // 状态(10未开始20已开始30已完成)
-	ProgressLevel  string `json:"progressLevel"`  // 优先级(10最高 20普通 30较低 )
+	DeliverOrderId    int    `json:"deliverOrderId"`    // 关联交付订单ID
+	PlanId            int    `json:"planId"`            // 关联实施计划
+	ProgressTitle     string `json:"progressTitle"`     // 任务标题
+	ProgressStatus    string `json:"progressStatus"`    // 状态(10未开始20已开始30已完成)
+	ProgressType      string `json:"progressType"`      // 10发货任务单/20组装任务单/30部署安装单
+	ProgressLevel     string `json:"progressLevel"`     // 优先级(10最高 20普通 30较低 )
+	IsPrincipalPerson string `json:"isPrincipalPerson"` // 是否按照负责人查询
 }
 
 type DeliverOrderProgressAddReq struct {
@@ -29,24 +31,26 @@ type DeliverOrderProgressAddReq struct {
 	ProgressContext string      `json:"progressContext" v:"required#请输入任务内容"` // 任务内容
 	StartDate       *gtime.Time `json:"startDate" v:"required#请输入开始时间"`       // 开始时间
 	EndDate         *gtime.Time `json:"endDate" v:"required#请输入结束时间"`         // 结束时间
-	ReaStartDate    *gtime.Time `json:"reaStartDate"`                         // 实际开始时间
-	ReaEndDate      *gtime.Time `json:"reaEndDate"`                           // 实际结束时间
-	ProgressLevel   string      `json:"progressLevel"`                        // 优先级(10最高 20普通 30较低 )
-	Remark          string      `json:"remark"`                               // 备注
+	ReaStartDate    *gtime.Time `json:"reaStartDate"`                                // 实际开始时间
+	ReaEndDate      *gtime.Time `json:"reaEndDate"`                                  // 实际结束时间
+	ProgressLevel   string      `json:"progressLevel"`                               // 优先级(10最高 20普通 30较低 )
+	Remark          string      `json:"remark"`                                      // 备注
 
 }
 
 type DeliverOrderProgressUpdateReq struct {
-	Id              int         `json:"id" v:"required#请输入Id"`
-	ProgressTitle   string      `json:"progressTitle"`   // 任务标题
-	ProgressContext string      `json:"progressContext"` // 任务内容
-	StartDate       *gtime.Time `json:"startDate"`       // 开始时间
-	EndDate         *gtime.Time `json:"endDate"`         // 结束时间
-	ReaStartDate    *gtime.Time `json:"reaStartDate"`    // 实际开始时间
-	ReaEndDate      *gtime.Time `json:"reaEndDate"`      // 实际结束时间
-	ProgressStatus  string      `json:"progressStatus"`  // 状态(10未开始20已开始30已完成)
-	ProgressLevel   string      `json:"progressLevel"`   // 优先级(10最高 20普通 30较低 )
-	Remark          *string     `json:"remark"`          // 备注
+	Id                int         `json:"id" v:"required#请输入Id"`
+	ProgressTitle     string      `json:"progressTitle"`     // 任务标题
+	ProgressContext   string      `json:"progressContext"`   // 任务内容
+	StartDate         *gtime.Time `json:"startDate"`         // 开始时间
+	EndDate           *gtime.Time `json:"endDate"`           // 结束时间
+	ReaStartDate      *gtime.Time `json:"reaStartDate"`      // 实际开始时间
+	ReaEndDate        *gtime.Time `json:"reaEndDate"`        // 实际结束时间
+	ProgressStatus    string      `json:"progressStatus"`    // 状态(10未开始20已开始30已完成)
+	ProgressLevel     string      `json:"progressLevel"`     // 优先级(10最高 20普通 30较低 )
+	Remark            *string     `json:"remark"`            // 备注
+	PrincipalPersonId int         `json:"principalPersonId"` // 负责人Id
+	PrincipalPerson   string      `json:"principalPerson"`   // 负责人
 }
 
 type DeliverOrderImpProgressStartReq struct {
@@ -58,3 +62,48 @@ type DeliverOrderImpProgressFinishReq struct {
 	Id     int    `json:"id" v:"required#请输入Id"`
 	Remark string `json:"remark"` // 备注
 }
+
+type StartDeliverGoodsProgressReq struct {
+	Progress *DeliverOrderImpProgress `json:"progress"`
+	Products []*productInfo           `json:"products"`
+}
+
+type productInfo struct {
+	DeliverOrderProduct
+	OperateType string `json:"operateType"` // 外购;组装
+}
+
+type CompleteAssembleGoodsProgressReq struct {
+	Id         int         `json:"id" v:"required#请输入Id"`
+	ReaEndDate *gtime.Time `json:"reaEndDate"` // 实际结束时间
+	FileUrl    string      `json:"fileUrl"`    // 附件
+	FileName   string      `json:"fileName"`   // 附件名称
+	Remark     string      `json:"remark"`     // 备注
+}
+
+type DeliverGoodsReq struct {
+	Id                   int         `json:"id" v:"required#请输入Id"`
+	ExpressName          string      `json:"expressName"`          // 快递名称
+	ExpressCode          string      `json:"expressCode"`          // 快递单号
+	EstimatedArrivalTime *gtime.Time `json:"estimatedArrivalTime"` // 预计到货时间
+}
+
+type InspectGoodsReq struct {
+	Id          int         `json:"id" v:"required#请输入Id"`
+	ArrivalTime *gtime.Time `json:"arrivalTime"` // 到货时间
+	FileUrl     string      `json:"fileUrl"`     // 附件
+	FileName    string      `json:"fileName"`    // 附件名称
+}
+
+type ConfirmArrivalReq struct {
+	Id     int    `json:"id" v:"required#请输入Id"`
+	Remark string `json:"remark"` // 备注
+}
+
+type CompleteInstallReq struct {
+	Id          int         `json:"id" v:"required#请输入Id"`
+	InstallDate *gtime.Time `json:"installDate"` // 安装日期
+	FileUrl     string      `json:"fileUrl"`     // 附件
+	FileName    string      `json:"fileName"`    // 附件名称
+	Remark      string      `json:"remark"`      // 备注
+}

+ 30 - 27
opms_parent/app/model/work/internal/deliver_order.go

@@ -10,31 +10,34 @@ import (
 
 // DeliverOrder is the golang structure for table deliver_order.
 type DeliverOrder struct {
-	Id             int         `orm:"id,primary"       json:"id"`             // 主键
-	OrderCode      string      `orm:"order_code"       json:"orderCode"`      // 交付订单号
-	OrderStatus    string      `orm:"order_status"     json:"orderStatus"`    // 交付状态(10项目立项 20 完成)
-	OrderType      string      `orm:"order_type"       json:"orderType"`      // 交付类型(10 软件 20 硬件)
-	CustId         int         `orm:"cust_id"          json:"custId"`         // 关联客户ID
-	CustName       string      `orm:"cust_name"        json:"custName"`       // 关联客户名称
-	ProjectId      int         `orm:"project_id"       json:"projectId"`      // 关联项目ID
-	ProjectName    string      `orm:"project_name"     json:"projectName"`    // 关联项目名称
-	ContractId     int         `orm:"contract_id"      json:"contractId"`     // 关联合同ID
-	ContractCode   string      `orm:"contract_code"    json:"contractCode"`   // 关联合同编号
-	ProjectManId   int         `orm:"project_man_id"   json:"projectManId"`   // 项目经理
-	ProjectManName string      `orm:"project_man_name" json:"projectManName"` // 项目经理
-	DeliverManId   int         `orm:"deliver_man_id"   json:"deliverManId"`   // 交付经理
-	DeliverManName string      `orm:"deliver_man_name" json:"deliverManName"` // 交付经理
-	Product        string      `orm:"product"          json:"product"`        // 产品线
-	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"`                         // 主键
+	OrderCode            string      `orm:"order_code"       json:"orderCode"`                  // 交付订单号
+	OrderStatus          string      `orm:"order_status"     json:"orderStatus"`                // 交付状态(10项目立项 20 完成)
+	OrderType            string      `orm:"order_type"       json:"orderType"`                  // 交付类型(10 软件 20 硬件)
+	CustId               int         `orm:"cust_id"          json:"custId"`                     // 关联客户ID
+	CustName             string      `orm:"cust_name"        json:"custName"`                   // 关联客户名称
+	ProjectId            int         `orm:"project_id"       json:"projectId"`                  // 关联项目ID
+	ProjectName          string      `orm:"project_name"     json:"projectName"`                // 关联项目名称
+	ContractId           int         `orm:"contract_id"      json:"contractId"`                 // 关联合同ID
+	ContractCode         string      `orm:"contract_code"    json:"contractCode"`               // 关联合同编号
+	ProjectManId         int         `orm:"project_man_id"   json:"projectManId"`               // 项目经理
+	ProjectManName       string      `orm:"project_man_name" json:"projectManName"`             // 项目经理
+	DeliverManId         int         `orm:"deliver_man_id"   json:"deliverManId"`               // 交付经理
+	DeliverManName       string      `orm:"deliver_man_name" json:"deliverManName"`             // 交付经理
+	Product              string      `orm:"product"          json:"product"`                    // 产品线
+	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"`               // 完成操作人
+	RequiredDeliveryTime *gtime.Time `orm:"required_delivery_time" json:"requiredDeliveryTime"` // 要求发货时间
+	ReceivingInfo        string      `orm:"receiving_info"         json:"receivingInfo"`        // 收货信息
+	SpecialRequirements  string      `orm:"special_requirements"   json:"specialRequirements"`  // 特殊要求说明
+	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"`                // 删除时间
 }

+ 36 - 18
opms_parent/app/model/work/internal/deliver_order_imp_progress.go

@@ -10,22 +10,40 @@ import (
 
 // DeliverOrderImpProgress is the golang structure for table deliver_order_imp_progress.
 type DeliverOrderImpProgress struct {
-	Id              int         `orm:"id,primary"       json:"id"`              // 主键
-	PlanId          int         `orm:"plan_id"          json:"planId"`          // 关联实施计划
-	ProgressTitle   string      `orm:"progress_title"   json:"progressTitle"`   // 任务标题
-	ProgressContext string      `orm:"progress_context" json:"progressContext"` // 任务内容
-	StartDate       *gtime.Time `orm:"start_date"       json:"startDate"`       // 开始时间
-	EndDate         *gtime.Time `orm:"end_date"         json:"endDate"`         // 结束时间
-	ReaStartDate    *gtime.Time `orm:"rea_start_date"   json:"reaStartDate"`    // 实际开始时间
-	ReaEndDate      *gtime.Time `orm:"rea_end_date"     json:"reaEndDate"`      // 实际结束时间
-	ProgressStatus  string      `orm:"progress_status"  json:"progressStatus"`  // 状态(10未开始20已开始30已完成)
-	ProgressLevel   string      `orm:"progress_level"   json:"progressLevel"`   // 优先级(10最高 20普通 30较低 )
-	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"`                   // 主键
+	DeliverOrderId       int         `orm:"deliver_order_id"        json:"deliverOrderId"`       // 关联交付订单ID
+	PlanId               int         `orm:"plan_id"                 json:"planId"`               // 关联实施计划
+	ProgressTitle        string      `orm:"progress_title"          json:"progressTitle"`        // 任务标题
+	ProgressContext      string      `orm:"progress_context"        json:"progressContext"`      // 任务内容
+	StartDate            *gtime.Time `orm:"start_date"              json:"startDate"`            // 开始时间
+	EndDate              *gtime.Time `orm:"end_date"                json:"endDate"`              // 结束时间
+	ReaStartDate         *gtime.Time `orm:"rea_start_date"          json:"reaStartDate"`         // 实际开始时间
+	ReaEndDate           *gtime.Time `orm:"rea_end_date"            json:"reaEndDate"`           // 实际结束时间
+	ProgressStatus       string      `orm:"progress_status"         json:"progressStatus"`       // 状态(10未开始20进行中30已完成)
+	DeliverStatus        string      `orm:"deliver_status"          json:"deliverStatus"`        // 发货状态(10未开始、20进行中、30已发货、40产品已验收、50确认已到货、60安装完成)
+	ProgressLevel        string      `orm:"progress_level"          json:"progressLevel"`        // 优先级(10最高 20普通 30较低 )
+	ProgressType         string      `orm:"progress_type"           json:"progressType"`         // 10发货任务单/20组装任务单/30部署安装单
+	PrincipalPersonId    int         `orm:"principal_person_id"     json:"principalPersonId"`    // 负责人id
+	PrincipalPerson      string      `orm:"principal_person"        json:"principalPerson"`      // 负责人
+	AssembleFileUrl      string      `orm:"assemble_file_url"       json:"assembleFileUrl"`      // 组装报告文件
+	AssembleFileName     string      `orm:"assemble_file_name"      json:"assembleFileName"`     // 组装报告文件名称
+	ExpressName          string      `orm:"express_name"            json:"expressName"`          // 快递名称
+	ExpressCode          string      `orm:"express_code"            json:"expressCode"`          // 快递单号
+	EstimatedArrivalTime *gtime.Time `orm:"estimated_arrival_time"  json:"estimatedArrivalTime"` // 预计到货时间
+	ArrivalTime          *gtime.Time `orm:"arrival_time"            json:"arrivalTime"`          // 到货时间
+	CheckFileUrl         string      `orm:"check_file_url"          json:"checkFileUrl"`         // 验收单文件
+	CheckFileName        string      `orm:"check_file_name"         json:"checkFileName"`        // 验收单文件名称
+	CheckPersonId        int         `orm:"check_person_id"         json:"checkPersonId"`        // 验收人Id
+	CheckPerson          string      `orm:"check_person"            json:"checkPerson"`          // 验收人
+	InstallDate          *gtime.Time `orm:"install_date"            json:"installDate"`          // 安装日期
+	InstallCheckFileUrl  string      `orm:"install_check_file_url"  json:"installCheckFileUrl"`  // 安装验收单文件
+	InstallCheckFileName string      `orm:"install_check_file_name" json:"installCheckFileName"` // 安装验收单文件名称
+	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"`          // 删除时间
 }

+ 21 - 14
opms_parent/app/model/work/internal/deliver_order_product.go

@@ -10,18 +10,25 @@ import (
 
 // DeliverOrderProduct is the golang structure for table deliver_order_product.
 type DeliverOrderProduct struct {
-	Id             int         `orm:"id,primary"       json:"id"`             // 主键
-	DeliverOrderId int         `orm:"deliver_order_id" json:"deliverOrderId"` // 关联交付订单ID
-	ProductCode    string      `orm:"product_code"     json:"productCode"`    // 产品编码
-	ProductName    string      `orm:"product_name"     json:"productName"`    // 产品名称
-	ProductType    string      `orm:"product_type"     json:"productType"`    // 产品类型
-	ProductNum     int         `orm:"product_num"      json:"productNum"`     // 产品数量
-	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"`                 // 主键
+	DeliverOrderId     int         `orm:"deliver_order_id"     json:"deliverOrderId"`     // 关联交付订单ID
+	ProductCode        string      `orm:"product_code"         json:"productCode"`        // 产品编码
+	ProductName        string      `orm:"product_name"         json:"productName"`        // 产品名称
+	ProductType        string      `orm:"product_type"         json:"productType"`        // 产品类型
+	ProductNum         int         `orm:"product_num"          json:"productNum"`         // 产品数量
+	IsDeliver          string      `orm:"is_deliver"           json:"isDeliver"`          // 10 未开始;20 已操作
+	IsComplete         string      `orm:"is_complete"          json:"isComplete"`         // 10 未完成;20 组装或外购完成
+	IsInstall          string      `orm:"is_install"           json:"isInstall"`          // 10 未开始;20 安装部署完成
+	OperateType        string      `orm:"operate_type"         json:"operateType"`        // 获取方式:组装;外购
+	DeliverProgressId  int         `orm:"deliver_progress_id"  json:"deliverProgressId"`  // 关联的发货任务单Id
+	AssembleProgressId int         `orm:"assemble_progress_id" json:"assembleProgressId"` // 关联的组装任务单Id
+	InstallProgressId  int         `orm:"install_progress_id"  json:"installProgressId"`  // 关联的部署安装单
+	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"`        // 删除时间
 }

+ 93 - 11
opms_parent/app/service/work/deliver_order.go

@@ -5,6 +5,7 @@ import (
 	"database/sql"
 	"fmt"
 	"github.com/gogf/gf/os/glog"
+	"github.com/gogf/gf/util/gconv"
 
 	basedao "dashoo.cn/micro/app/dao/base"
 	contractdao "dashoo.cn/micro/app/dao/contract"
@@ -87,17 +88,26 @@ func (s DeliverOrderService) Get(ctx context.Context, id int) (*work.DeliverOrde
 	if product == nil {
 		product = []*work.DeliverOrderProduct{}
 	}
+	proj, err := s.ProjBusinessDao.Where("id = ?", ent.ProjectId).One()
+	if err != nil {
+		return nil, err
+	}
+	saleId := 0
+	if proj != nil {
+		saleId = proj.SaleId
+	}
 	return &work.DeliverOrderGetRsp{
 		DeliverOrder: *ent,
 		Plan:         plan,
 		Product:      product,
+		SaleId:       saleId,
 	}, nil
 }
 
-func (s DeliverOrderService) List(ctx context.Context, req *work.DeliverOrderListReq) (int, []*work.DeliverOrder, error) {
+func (s DeliverOrderService) List(ctx context.Context, req *work.DeliverOrderListReq) (int, []*work.DeliverOrderInfo, error) {
 	g.Log().Infof("DeliverOrderService List roles %v", s.userInfo.Roles)
 	//dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("ctr_contract b", "a.contract_id=b.id").Unscoped().Where("a.deleted_time is null") // 改为关联项目
-	dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("proj_business b", "a.project_id=b.id").Unscoped().Where("a.deleted_time is null")
+	dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("proj_business b", "a.project_id=b.id").LeftJoin("deliver_order_product p", "p.deliver_order_id=a.id").Unscoped().Where("a.deleted_time is null")
 	//	系统管理员、研发主管、研发总监、品质主管、总经理、销售总监、销售助理看全部的
 	if service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentDirector") || service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentSupervisor") || service.StringsContains(s.userInfo.Roles, "QualityAssuranceSupervisor") || service.StringsContains(s.userInfo.Roles, "GeneralManager") || service.StringsContains(s.userInfo.Roles, "SalesDirector") || service.StringsContains(s.userInfo.Roles, "SaleAssociate") || service.StringsContains(s.userInfo.Roles, "SysAdmin") {
 		//	无条件,查询全部
@@ -182,6 +192,9 @@ func (s DeliverOrderService) List(ctx context.Context, req *work.DeliverOrderLis
 		dao = dao.Where("a.product = ?", req.Product)
 	}
 
+	// 分组
+	dao = dao.Group("a.id")
+
 	total, err := dao.Count()
 	if err != nil {
 		return 0, nil, err
@@ -195,8 +208,8 @@ func (s DeliverOrderService) List(ctx context.Context, req *work.DeliverOrderLis
 	}
 	dao = dao.Order(orderby)
 
-	ents := []*work.DeliverOrder{}
-	err = dao.Fields("a.*").Structs(&ents)
+	var ents []*work.DeliverOrderInfo
+	err = dao.Fields("a.*, group_concat(p.product_name) products, b.sale_id").Structs(&ents)
 	if err != nil && err != sql.ErrNoRows {
 		return 0, nil, err
 	}
@@ -241,6 +254,9 @@ func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo) ([]i
 	var deliverHard *work.DeliverOrder
 	deliverProductSoft := []work.DeliverOrderProduct{}
 	deliverProductHard := []work.DeliverOrderProduct{}
+	// 交付类型(10 软件 20 硬件)
+	projectManId1, projectManName1, deliverManId1, deliverManName1 := getProjectUser(tx, &c, true)
+	projectManId2, projectManName2, deliverManId2, deliverManName2 := getProjectUser(tx, &c, false)
 
 	for _, p := range product {
 		var orderType string
@@ -251,7 +267,11 @@ func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo) ([]i
 			orderType = "20"
 		}
 
-		projectManId, projectManName := getProjectUser(tx, &c)
+		projectManId, projectManName, deliverManId, deliverManName := projectManId2, projectManName2, deliverManId2, deliverManName2
+		// 交付类型(10 软件 20 硬件)
+		if orderType == "20" {
+			projectManId, projectManName, deliverManId, deliverManName = projectManId1, projectManName1, deliverManId1, deliverManName1
+		}
 
 		o := work.DeliverOrder{
 			OrderCode:      fmt.Sprintf("%s%s", c.ContractCode, orderType),
@@ -265,8 +285,8 @@ func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo) ([]i
 			ContractCode:   c.ContractCode,
 			ProjectManId:   projectManId,
 			ProjectManName: projectManName,
-			DeliverManId:   0,
-			DeliverManName: "",
+			DeliverManId:   deliverManId,
+			DeliverManName: deliverManName,
 			Product:        c.ProductLine,
 			Remark:         "",
 			CreatedBy:      int(userInfo.Id),
@@ -282,6 +302,9 @@ func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo) ([]i
 			ProductName:    p.ProdName,
 			ProductType:    p.ProdClass,
 			ProductNum:     p.ProdNum,
+			IsDeliver:      "10", // 10 未开始;20 已操作
+			IsComplete:     "10",
+			IsInstall:      "10",
 			Remark:         "",
 			CreatedBy:      int(userInfo.Id),
 			CreatedName:    userInfo.NickName,
@@ -326,9 +349,8 @@ func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo) ([]i
 	return id, nil
 }
 
-func getProjectUser(tx *gdb.TX, c *contractmodel.CtrContract) (int, string) {
-	projectManId := 0
-	projectManName := ""
+func getProjectUser(tx *gdb.TX, c *contractmodel.CtrContract, isDeliver bool) (int, string, int, string) {
+	projectManId, projectManName, deliverManId, deliverManName := 0, "", 0, ""
 	// 根据产品线,设置项目经理:  10 BIOBANK; 20 CELLSOP; 30 LIMS+基因; 40 智能硬件; 50 液氮罐; 60 MCS;
 	// 非交付工单产品线: 70 咨询服务; 80 石油; 90 外购
 	if c.ProductLine == "10" {
@@ -353,8 +375,18 @@ func getProjectUser(tx *gdb.TX, c *contractmodel.CtrContract) (int, string) {
 			projectManId = user["id"].Int()
 		}
 	}
+	if isDeliver {
+		deliverManName = "丁岳嵩"
+		user, err := tx.Model("sys_user").Where(fmt.Sprintf("nick_name='%v'", deliverManName)).One()
+		if err != nil && err != sql.ErrNoRows {
+			glog.Error(err)
+		}
+		if user != nil {
+			deliverManId = user["id"].Int()
+		}
+	}
 
-	return projectManId, projectManName
+	return projectManId, projectManName, deliverManId, deliverManName
 }
 
 func DeliverOrderBindProduct(tx *gdb.TX, id int, product []work.DeliverOrderProduct) error {
@@ -456,3 +488,53 @@ func (s DeliverOrderService) Delete(ctx context.Context, id []int) error {
 	_, err := s.Dao.Where("Id  IN (?)", id).Delete()
 	return err
 }
+
+// Start 硬件交付启动
+func (s DeliverOrderService) Start(ctx context.Context, req *work.StartReq) error {
+	if req.OrderId == 0 {
+		return myerrors.TipsError("交付工单Id为空,操作失败")
+	}
+	order, err := s.Dao.Where(fmt.Sprintf("id='%v'", req.OrderId)).FindOne()
+	if err != nil {
+		return err
+	}
+	// 交付状态(10项目立项 15进行中 20 完成)
+	if order.OrderStatus != "10" {
+		return myerrors.TipsError("该状态的工单不可启动")
+	}
+	order.OrderStatus = "15"
+	order.RequiredDeliveryTime = req.RequiredDeliveryTime
+	order.ReceivingInfo = req.ReceivingInfo
+	order.SpecialRequirements = req.SpecialRequirements
+
+	_, err = s.Dao.Save(order)
+	if err != nil {
+		return err
+	}
+	// 生成发货计划
+	var plan work.DeliverOrderImpPlan
+	plan.DeliverOrderId = req.OrderId
+	plan.PlanTitle = "硬件交付计划"
+	plan.PlanStatus = "10"
+	plan.PlanStartDate = gtime.Now()
+	plan.PlanEndDate = req.RequiredDeliveryTime
+	service.SetCreatedInfo(&plan, s.userInfo.Id, s.userInfo.NickName)
+	_, err = s.PlanDao.Save(plan)
+	if err != nil {
+		return err
+	}
+
+	msg := g.MapStrStr{
+		"msgTitle":    "硬件交付工单提醒",
+		"msgContent":  fmt.Sprintf("<p>%v的交付工单:<a href='%v'>%v</a>已经启动,请前去查看。</p>", order.ProjectName, fmt.Sprintf("#/work/deliveryPlan?id=%v", order.Id), order.OrderCode),
+		"msgType":     "20",
+		"recvUserIds": gconv.String(order.DeliverManId),
+		"msgStatus":   "10",
+		"sendType":    "10",
+	}
+	if err := service.CreateSystemMessage(msg); err != nil {
+		g.Log().Error("消息提醒异常:", err)
+	}
+
+	return err
+}

+ 300 - 12
opms_parent/app/service/work/deliver_order_progress.go

@@ -2,12 +2,13 @@ package work
 
 import (
 	"context"
-	"database/sql"
-	"fmt"
-
 	contractdao "dashoo.cn/micro/app/dao/contract"
 	workdao "dashoo.cn/micro/app/dao/work"
 	work "dashoo.cn/micro/app/model/work"
+	"dashoo.cn/micro/app/service"
+	"database/sql"
+	"fmt"
+	"github.com/gogf/gf/util/gconv"
 
 	"dashoo.cn/opms_libary/micro_srv"
 	"dashoo.cn/opms_libary/myerrors"
@@ -68,10 +69,17 @@ func (s DeliverOrderProgressService) List(ctx context.Context, req *work.Deliver
 	if req.ProgressStatus != "" {
 		dao = dao.Where("progress_status = ?", req.ProgressStatus)
 	}
+	if req.ProgressType != "" {
+		dao = dao.Where("progress_type = ?", req.ProgressType)
+	}
 	if req.ProgressLevel != "" {
 		dao = dao.Where("progress_level = ?", req.ProgressLevel)
 	}
 
+	if req.IsPrincipalPerson == "1" {
+		dao = dao.Where("principal_person_id = ?", s.userInfo.Id)
+	}
+
 	total, err := dao.Count()
 	if err != nil {
 		return 0, nil, err
@@ -178,6 +186,12 @@ func (s DeliverOrderProgressService) Update(ctx context.Context, req *work.Deliv
 	if req.Remark != nil {
 		toupdate["remark"] = req.Remark
 	}
+	if req.PrincipalPersonId != 0 {
+		toupdate["principal_person_id"] = req.PrincipalPersonId
+	}
+	if req.PrincipalPerson != "" {
+		toupdate["principal_person"] = req.PrincipalPerson
+	}
 	if len(toupdate) != 0 {
 		toupdate["updated_by"] = int(s.userInfo.Id)
 		toupdate["updated_name"] = s.userInfo.NickName
@@ -196,7 +210,6 @@ func (s DeliverOrderProgressService) Update(ctx context.Context, req *work.Deliv
 	return nil
 }
 
-
 func (s DeliverOrderProgressService) Start(ctx context.Context, req *work.DeliverOrderImpProgressStartReq) error {
 	validErr := gvalid.CheckStruct(ctx, req, nil)
 	if validErr != nil {
@@ -212,11 +225,22 @@ func (s DeliverOrderProgressService) Start(ctx context.Context, req *work.Delive
 	}
 
 	txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
-		_, err = tx.Update("deliver_order_imp_progress", map[string]interface{}{
-			"progress_status":    "20",
-			"rea_start_date": gtime.Now(),
-			"remark":         req.Remark,
-		}, "id = ?", req.Id)
+		// 10发货任务单/20组装任务单/30部署安装单
+		if ent.ProgressType == "10" {
+			_, err = tx.Update("deliver_order_imp_progress", map[string]interface{}{
+				"progress_status": "20",
+				"deliver_status":  "20", // 发货状态(10未开始、20进行中、30已发货、40产品已验收、50确认已到货、60安装完成)
+				"rea_start_date":  gtime.Now(),
+				"remark":          req.Remark,
+			}, "id = ?", req.Id)
+		} else {
+			_, err = tx.Update("deliver_order_imp_progress", map[string]interface{}{
+				"progress_status": "20",
+				"rea_start_date":  gtime.Now(),
+				"remark":          req.Remark,
+			}, "id = ?", req.Id)
+		}
+
 		if err != nil {
 			return err
 		}
@@ -244,9 +268,9 @@ func (s DeliverOrderProgressService) Finish(ctx context.Context, req *work.Deliv
 
 	txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
 		_, err = tx.Update("deliver_order_imp_progress", map[string]interface{}{
-			"progress_status":  "30",
-			"rea_end_date": gtime.Now(),
-			"remark":       req.Remark,
+			"progress_status": "30",
+			"rea_end_date":    gtime.Now(),
+			"remark":          req.Remark,
 		}, "id = ?", req.Id)
 		if err != nil {
 			return err
@@ -266,3 +290,267 @@ func (s DeliverOrderProgressService) Delete(ctx context.Context, id []int) error
 	_, err := s.Dao.Where("Id  IN (?)", id).Delete()
 	return err
 }
+
+// StartDeliverGoodsProgress (硬件交付工单)发起发货任务单
+func (s DeliverOrderProgressService) StartDeliverGoodsProgress(ctx context.Context, req *work.StartDeliverGoodsProgressReq) error {
+	err := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		var assembleProgress work.DeliverOrderImpProgress
+		var deliverProgress work.DeliverOrderImpProgress
+		err := gconv.Struct(req.Progress, &deliverProgress)
+		if err != nil {
+			return err
+		}
+		// 初始化数据
+		deliverProgress.ProgressStatus = "10" // 状态(10未开始20进行中30已完成)
+		deliverProgress.DeliverStatus = "10"  // 发货状态(10未开始、20进行中、30已发货、40产品已验收、50确认已到货、60安装完成)
+		//deliverProgress.ProgressType = "10"   // 10发货任务单/20组装任务单/30部署安装单
+		if deliverProgress.PrincipalPerson == "" {
+			deliverProgress.PrincipalPersonId, deliverProgress.PrincipalPerson, err = s.getUserInfo("丁岳嵩")
+		}
+		if err != nil {
+			return err
+		}
+		service.SetCreatedInfo(&deliverProgress, s.userInfo.Id, s.userInfo.NickName)
+
+		// 初始化数据
+		assembleProgress.DeliverOrderId = deliverProgress.DeliverOrderId
+		assembleProgress.PlanId = deliverProgress.PlanId
+		assembleProgress.ProgressStatus = "10" // 状态(10未开始20进行中30已完成)
+		assembleProgress.ProgressType = "20"   // 10发货任务单/20组装任务单/30部署安装单
+		assembleProgress.ProgressTitle = deliverProgress.ProgressTitle + "_组装任务单"
+		assembleProgress.StartDate = deliverProgress.StartDate
+		assembleProgress.EndDate = deliverProgress.EndDate
+		assembleProgress.ProgressLevel = deliverProgress.ProgressLevel
+		assembleProgress.PrincipalPersonId, assembleProgress.PrincipalPerson, err = s.getUserInfo("王志强")
+		if err != nil {
+			return err
+		}
+		service.SetCreatedInfo(&assembleProgress, s.userInfo.Id, s.userInfo.NickName)
+
+		progressIds := ""
+		assembleIds := ""
+		for _, product := range req.Products {
+			if progressIds == "" {
+				progressIds = gconv.String(product.Id)
+			} else {
+				progressIds += "," + gconv.String(product.Id)
+			}
+			// 外购;组装
+			if product.OperateType == "组装" {
+				if assembleIds == "" {
+					assembleIds = gconv.String(product.Id)
+				} else {
+					assembleIds += "," + gconv.String(product.Id)
+				}
+			}
+		}
+
+		// 保存数据
+		result1, err := tx.Save("deliver_order_imp_progress", deliverProgress)
+		if err != nil {
+			return err
+		}
+
+		deliverId, _ := result1.LastInsertId()
+		if progressIds != "" {
+			_, err = tx.Update("deliver_order_product", fmt.Sprintf("is_deliver='20',deliver_progress_id='%v',operate_type='外购'", deliverId), fmt.Sprintf("id IN (%v)", progressIds))
+			if err != nil {
+				return err
+			}
+		}
+		// 存在硬件安装
+		if assembleIds != "" {
+			result2, err := tx.Save("deliver_order_imp_progress", assembleProgress)
+			if err != nil {
+				return err
+			}
+			assembleId, _ := result2.LastInsertId()
+			_, err = tx.Update("deliver_order_product", fmt.Sprintf("assemble_progress_id='%v',operate_type='组装'", assembleId), fmt.Sprintf("id IN (%v)", assembleIds))
+			if err != nil {
+				return err
+			}
+		}
+
+		return nil
+	})
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func (s DeliverOrderProgressService) getUserInfo(name string) (int, string, error) {
+	user, err := s.Dao.DB.Model("sys_user").Where(fmt.Sprintf("nick_name='%v'", name)).One()
+	if err != nil {
+		return 0, "", err
+	}
+
+	return user["id"].Int(), user["nick_name"].String(), nil
+}
+
+// CompleteAssembleGoodsProgress 组装完成
+func (s DeliverOrderProgressService) CompleteAssembleGoodsProgress(ctx context.Context, req *work.CompleteAssembleGoodsProgressReq) error {
+	_, err := s.Dao.Update(fmt.Sprintf("progress_status='30',rea_end_date='%v',assemble_file_url='%v',assemble_file_name='%v',remark='%v'", req.ReaEndDate, req.FileUrl, req.FileName, req.Remark), fmt.Sprintf("id='%v'", req.Id))
+	if err != nil {
+		return err
+	}
+	_, err = s.ProductDao.Update("is_complete='20'", fmt.Sprintf("assemble_progress_id='%v'", req.Id))
+
+	return err
+}
+
+// DeliverGoods 发货
+func (s DeliverOrderProgressService) DeliverGoods(ctx context.Context, req *work.DeliverGoodsReq) error {
+	progress, err := s.Dao.Where(fmt.Sprintf("id='%v'", req.Id)).FindOne()
+	if err != nil {
+		return err
+	}
+
+	_, err = s.Dao.Update(fmt.Sprintf("deliver_status='30',express_name='%v',express_code='%v',estimated_arrival_time='%v'", req.ExpressName, req.ExpressCode, req.EstimatedArrivalTime), fmt.Sprintf("id='%v'", req.Id))
+
+	// 生成部署安装计划
+	var plan work.DeliverOrderImpPlan
+	plan.DeliverOrderId = progress.DeliverOrderId
+	plan.PlanTitle = "部署安装计划"
+	plan.PlanStatus = "10"
+	plan.PlanStartDate = gtime.Now()
+	plan.PlanEndDate = req.EstimatedArrivalTime
+	service.SetCreatedInfo(&plan, s.userInfo.Id, s.userInfo.NickName)
+	_, err = s.PlanDao.Save(plan)
+	if err != nil {
+		return err
+	}
+
+	return err
+}
+
+// InspectGoods 验收
+func (s DeliverOrderProgressService) InspectGoods(ctx context.Context, req *work.InspectGoodsReq) error {
+	_, err := s.Dao.Update(fmt.Sprintf("deliver_status='40',arrival_time='%v',check_file_url='%v',check_file_name='%v',check_person_id='%v',check_person='%v'", req.ArrivalTime, req.FileUrl, req.FileName, s.userInfo.Id, s.userInfo.NickName), fmt.Sprintf("id='%v'", req.Id))
+	return err
+}
+
+// ConfirmArrival 确认到货
+func (s DeliverOrderProgressService) ConfirmArrival(ctx context.Context, req *work.ConfirmArrivalReq) error {
+	data := fmt.Sprintf("deliver_status='50'")
+	if req.Remark != "" {
+		data = fmt.Sprintf("deliver_status='50',remark='%v'", req.Remark)
+	}
+	_, err := s.Dao.Update(data, fmt.Sprintf("id='%v'", req.Id))
+	return err
+}
+
+// StartInstallProgress (硬件交付工单)发起部署安装单
+func (s DeliverOrderProgressService) StartInstallProgress(ctx context.Context, req *work.StartDeliverGoodsProgressReq) error {
+	err := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		var progress work.DeliverOrderImpProgress
+		err := gconv.Struct(req.Progress, &progress)
+		if err != nil {
+			return err
+		}
+		// 初始化数据
+		progress.ProgressStatus = "10" // 状态(10未开始20进行中30已完成)
+		progress.ProgressType = "30"   // 10发货任务单/20组装任务单/30部署安装单
+		if progress.PrincipalPerson == "" {
+			progress.PrincipalPersonId, progress.PrincipalPerson, err = s.getUserInfo("王志强")
+		}
+		if err != nil {
+			return err
+		}
+		service.SetCreatedInfo(&progress, s.userInfo.Id, s.userInfo.NickName)
+
+		// 保存数据
+		result1, err := tx.Save("deliver_order_imp_progress", progress)
+		if err != nil {
+			return err
+		}
+
+		deliverId, _ := result1.LastInsertId()
+		ids := ""
+		for _, product := range req.Products {
+			if ids == "" {
+				ids = gconv.String(product.Id)
+			} else {
+				ids += "," + gconv.String(product.Id)
+			}
+		}
+
+		_, err = tx.Update("deliver_order_product", fmt.Sprintf("install_progress_id='%v'", deliverId), fmt.Sprintf("id IN (%v)", ids))
+		if err != nil {
+			return err
+		}
+
+		return nil
+	})
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// CompleteInstall 完成安装(部署安装单)
+func (s DeliverOrderProgressService) CompleteInstall(ctx context.Context, req *work.CompleteInstallReq) error {
+	progress, err := s.Dao.Where(fmt.Sprintf("id='%v'", req.Id)).FindOne()
+	if err != nil {
+		return err
+	}
+	allProducts, err := s.ProductDao.Where(fmt.Sprintf("deliver_order_id='%v'", progress.DeliverOrderId)).FindAll()
+	if err != nil {
+		return err
+	}
+	progressMap := make(map[int]bool, 0)
+	ids := ""
+	progressIds := ""
+	// 第一次循环,取出需要更新的数据
+	for _, product := range allProducts {
+		if product.InstallProgressId == req.Id {
+			progressMap[product.DeliverProgressId] = true
+			if ids == "" {
+				ids = gconv.String(product.Id)
+			} else {
+				ids += "," + gconv.String(product.Id)
+			}
+		}
+	}
+	// 判断是否已全部完成
+	for key := range progressMap {
+		for _, product := range allProducts {
+			if product.DeliverProgressId == key && product.IsInstall != "20" && product.InstallProgressId != req.Id {
+				progressMap[key] = false
+				break
+			}
+		}
+		if progressMap[key] {
+			if progressIds == "" {
+				progressIds = gconv.String(key)
+			} else {
+				progressIds += "," + gconv.String(key)
+			}
+		}
+	}
+
+	err = s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		_, err = tx.Update("deliver_order_imp_progress", fmt.Sprintf("progress_status='30',install_date='%v',install_check_file_url='%v',install_check_file_name='%v',remark='%v',rea_end_date='%v'", req.InstallDate, req.FileUrl, req.FileName, req.Remark, req.InstallDate), fmt.Sprintf("id='%v'", req.Id))
+		if err != nil {
+			return err
+		}
+		// 更新发货任务单状态
+		if progressIds != "" {
+			_, err = tx.Update("deliver_order_imp_progress", "deliver_status='60'", fmt.Sprintf("id IN (%v)", progressIds))
+			if err != nil {
+				return err
+			}
+		}
+		// 更新产品状态
+		if ids != "" {
+			_, err = tx.Update("deliver_order_product", "is_install='20'", fmt.Sprintf("id IN (%v)", ids))
+			if err != nil {
+				return err
+			}
+		}
+
+		return nil
+	})
+
+	return err
+}