Pārlūkot izejas kodu

feature(*): 1、硬件交付工单需求调整,调整完成、部署等相关逻辑
2、经销商、代理商所属区域进行数据权限限制
3、合同时间查询逻辑调整,将签订时间改为结束时间
4、回款页面默认查询前30天、后30天数据,调整部分字段显示宽度

lk 2 gadi atpakaļ
vecāks
revīzija
7973682483

+ 36 - 0
opms_parent/app/dao/work/deliver_progress_product.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"
+)
+
+// deliverProgressProductDao 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 deliverProgressProductDao struct {
+	internal.DeliverProgressProductDao
+}
+
+var (
+	// DeliverProgressProduct is globally public accessible object for table deliver_progress_product operations.
+	DeliverProgressProduct = deliverProgressProductDao{
+		internal.DeliverProgressProduct,
+	}
+)
+
+type DeliverProgressProductDao struct {
+	internal.DeliverProgressProductDao
+}
+
+func NewDeliverProgressProductDao(tenant string) *DeliverProgressProductDao {
+	dao := internal.NewDeliverProgressProductDao(tenant)
+	return &DeliverProgressProductDao{
+		dao,
+	}
+}
+
+// Fill with you ideas below.

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

@@ -33,6 +33,7 @@ type deliverOrderImpProgressColumns struct {
 	Id                   string // 主键
 	DeliverOrderId       string // 关联交付订单ID
 	PlanId               string // 关联实施计划
+	DeliverProgressId    string // 关联发货任务单Id
 	ProgressTitle        string // 任务标题
 	ProgressContext      string // 任务内容
 	StartDate            string // 开始时间
@@ -78,6 +79,7 @@ var (
 			Id:                   "id",
 			DeliverOrderId:       "deliver_order_id",
 			PlanId:               "plan_id",
+			DeliverProgressId:    "deliver_progress_id",
 			ProgressTitle:        "progress_title",
 			ProgressContext:      "progress_context",
 			StartDate:            "start_date",
@@ -125,6 +127,7 @@ func NewDeliverOrderImpProgressDao(tenant string) DeliverOrderImpProgressDao {
 			Id:                   "id",
 			DeliverOrderId:       "deliver_order_id",
 			PlanId:               "plan_id",
+			DeliverProgressId:    "deliver_progress_id",
 			ProgressTitle:        "progress_title",
 			ProgressContext:      "progress_context",
 			StartDate:            "start_date",

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

@@ -36,6 +36,7 @@ type deliverOrderProductColumns struct {
 	ProductName        string // 产品名称
 	ProductType        string // 产品类型
 	ProductNum         string // 产品数量
+	CompleteNum        string // 已完成数量
 	IsDeliver          string // 10 未开始;20 已操作
 	IsComplete         string // 10 未完成;20 组装或外购
 	IsInstall          string // 10 未开始;20 安装部署完成
@@ -66,6 +67,7 @@ var (
 			ProductName:        "product_name",
 			ProductType:        "product_type",
 			ProductNum:         "product_num",
+			CompleteNum:        "complete_num",
 			IsDeliver:          "is_deliver",
 			IsComplete:         "is_complete",
 			IsInstall:          "is_install",
@@ -98,6 +100,7 @@ func NewDeliverOrderProductDao(tenant string) DeliverOrderProductDao {
 			ProductName:        "product_name",
 			ProductType:        "product_type",
 			ProductNum:         "product_num",
+			CompleteNum:        "complete_num",
 			IsDeliver:          "is_deliver",
 			IsComplete:         "is_complete",
 			IsInstall:          "is_install",

+ 851 - 0
opms_parent/app/dao/work/internal/deliver_progress_product.go

@@ -0,0 +1,851 @@
+// ==========================================================================
+// 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"
+)
+
+// DeliverProgressProductDao is the manager for logic model data accessing and custom defined data operations functions management.
+type DeliverProgressProductDao struct {
+	gmvc.M                                // M is the core and embedded struct that inherits all chaining operations from gdb.Model.
+	C       deliverProgressProductColumns // 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.
+}
+
+// DeliverProgressProductColumns defines and stores column names for table deliver_progress_product.
+type deliverProgressProductColumns struct {
+	Id                 string // 主键
+	DeliverOrderId     string // 关联交付订单ID
+	DeliverProgressId  string // 关联的发货任务单Id
+	AssembleProgressId string // 关联的组装任务单Id
+	InstallProgressId  string // 关联的部署安装单
+	ProductId          string // 关联产品Id
+	ProductCode        string // 产品编码
+	ProductName        string // 产品名称
+	ProductType        string // 产品类型
+	ProductNum         string // 产品数量
+	IsDeliver          string // 10 未开始;20 已操作
+	IsComplete         string // 10 未完成;20 组装或外购完成
+	IsInstall          string // 10 未开始;20 安装部署完成
+	OperateType        string // 获取方式:组装;外购
+	Remark             string // 备注
+	CreatedBy          string // 创建者
+	CreatedName        string // 创建人
+	CreatedTime        string // 创建时间
+	UpdatedBy          string // 更新者
+	UpdatedName        string // 更新人
+	UpdatedTime        string // 更新时间
+	DeletedTime        string // 删除时间
+}
+
+var (
+	// DeliverProgressProduct is globally public accessible object for table deliver_progress_product operations.
+	DeliverProgressProduct = DeliverProgressProductDao{
+		M:     g.DB("default").Model("deliver_progress_product").Safe(),
+		DB:    g.DB("default"),
+		Table: "deliver_progress_product",
+		C: deliverProgressProductColumns{
+			Id:                 "id",
+			DeliverOrderId:     "deliver_order_id",
+			DeliverProgressId:  "deliver_progress_id",
+			AssembleProgressId: "assemble_progress_id",
+			InstallProgressId:  "install_progress_id",
+			ProductId:          "product_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",
+			Remark:             "remark",
+			CreatedBy:          "created_by",
+			CreatedName:        "created_name",
+			CreatedTime:        "created_time",
+			UpdatedBy:          "updated_by",
+			UpdatedName:        "updated_name",
+			UpdatedTime:        "updated_time",
+			DeletedTime:        "deleted_time",
+		},
+	}
+)
+
+func NewDeliverProgressProductDao(tenant string) DeliverProgressProductDao {
+	var dao DeliverProgressProductDao
+	dao = DeliverProgressProductDao{
+		M:     g.DB(tenant).Model("deliver_progress_product").Safe(),
+		DB:    g.DB(tenant),
+		Table: "deliver_progress_product",
+		C: deliverProgressProductColumns{
+			Id:                 "id",
+			DeliverOrderId:     "deliver_order_id",
+			DeliverProgressId:  "deliver_progress_id",
+			AssembleProgressId: "assemble_progress_id",
+			InstallProgressId:  "install_progress_id",
+			ProductId:          "product_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",
+			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 *DeliverProgressProductDao) Ctx(ctx context.Context) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) GetCtx() context.Context {
+	return d.M.GetCtx()
+}
+
+// As sets an alias name for current table.
+func (d *DeliverProgressProductDao) As(as string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.As(as), Table: d.Table, TableAs: as}
+}
+
+// TX sets the transaction for current operation.
+func (d *DeliverProgressProductDao) TX(tx *gdb.TX) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.TX(tx), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Master marks the following operation on master node.
+func (d *DeliverProgressProductDao) Master() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Slave() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Slave(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Args sets custom arguments for model operation.
+func (d *DeliverProgressProductDao) Args(args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Handler(handlers ...gdb.ModelHandler) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) LeftJoin(table ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) RightJoin(table ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) InnerJoin(table ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Fields(fieldNamesOrMapStruct ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) FieldsEx(fieldNamesOrMapStruct ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) FieldCount(column string, as ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) FieldSum(column string, as ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) FieldMin(column string, as ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) FieldMax(column string, as ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) FieldAvg(column string, as ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Option(option int) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) OmitEmpty() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) OmitEmptyWhere() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) OmitEmptyData() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) OmitNil() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) OmitNilWhere() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) OmitNilData() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Filter() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Where(where interface{}, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WherePri(where interface{}, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Having(having interface{}, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Wheref(format string, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Wheref(format, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereLT builds "column < value" statement.
+func (d *DeliverProgressProductDao) WhereLT(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereLT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereLTE builds "column <= value" statement.
+func (d *DeliverProgressProductDao) WhereLTE(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereLTE(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereGT builds "column > value" statement.
+func (d *DeliverProgressProductDao) WhereGT(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereGT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereGTE builds "column >= value" statement.
+func (d *DeliverProgressProductDao) WhereGTE(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereGTE(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereBetween builds "column BETWEEN min AND max" statement.
+func (d *DeliverProgressProductDao) WhereBetween(column string, min, max interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereBetween(column, min, max), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereLike builds "column LIKE like" statement.
+func (d *DeliverProgressProductDao) WhereLike(column string, like interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereIn builds "column IN (in)" statement.
+func (d *DeliverProgressProductDao) WhereIn(column string, in interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WhereNull(columns ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereNull(columns...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNotBetween builds "column NOT BETWEEN min AND max" statement.
+func (d *DeliverProgressProductDao) WhereNotBetween(column string, min, max interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereNotBetween(column, min, max), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNotLike builds "column NOT LIKE like" statement.
+func (d *DeliverProgressProductDao) WhereNotLike(column string, like interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereNotLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNot builds "column != value" statement.
+func (d *DeliverProgressProductDao) WhereNot(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereNot(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereNotIn builds "column NOT IN (in)" statement.
+func (d *DeliverProgressProductDao) WhereNotIn(column string, in interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WhereNotNull(columns ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereNotNull(columns...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOr adds "OR" condition to the where statement.
+func (d *DeliverProgressProductDao) WhereOr(where interface{}, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOr(where, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrf builds "OR" condition string using fmt.Sprintf and arguments.
+func (d *DeliverProgressProductDao) WhereOrf(format string, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrf(format, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrLT builds "column < value" statement in "OR" conditions..
+func (d *DeliverProgressProductDao) WhereOrLT(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrLT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrLTE builds "column <= value" statement in "OR" conditions..
+func (d *DeliverProgressProductDao) WhereOrLTE(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrLTE(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrGT builds "column > value" statement in "OR" conditions..
+func (d *DeliverProgressProductDao) WhereOrGT(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrGT(column, value), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrGTE builds "column >= value" statement in "OR" conditions..
+func (d *DeliverProgressProductDao) WhereOrGTE(column string, value interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WhereOrBetween(column string, min, max interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrBetween(column, min, max), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrLike builds "column LIKE like" statement in "OR" conditions.
+func (d *DeliverProgressProductDao) WhereOrLike(column string, like interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrIn builds "column IN (in)" statement in "OR" conditions.
+func (d *DeliverProgressProductDao) WhereOrIn(column string, in interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WhereOrNull(columns ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WhereOrNotBetween(column string, min, max interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WhereOrNotLike(column string, like interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrNotLike(column, like), Table: d.Table, TableAs: d.TableAs}
+}
+
+// WhereOrNotIn builds "column NOT IN (in)" statement.
+func (d *DeliverProgressProductDao) WhereOrNotIn(column string, in interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) WhereOrNotNull(columns ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.WhereOrNotNull(columns...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Group sets the "GROUP BY" statement for the model.
+func (d *DeliverProgressProductDao) Group(groupBy ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) And(where interface{}, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Or(where interface{}, args ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Or(where, args...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// GroupBy sets the "GROUP BY" statement for the model.
+func (d *DeliverProgressProductDao) GroupBy(groupBy string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Group(groupBy), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Order sets the "ORDER BY" statement for the model.
+func (d *DeliverProgressProductDao) Order(orderBy ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Order(orderBy...), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OrderAsc sets the "ORDER BY xxx ASC" statement for the model.
+func (d *DeliverProgressProductDao) OrderAsc(column string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.OrderAsc(column), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OrderDesc sets the "ORDER BY xxx DESC" statement for the model.
+func (d *DeliverProgressProductDao) OrderDesc(column string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.OrderDesc(column), Table: d.Table, TableAs: d.TableAs}
+}
+
+// OrderRandom sets the "ORDER BY RANDOM()" statement for the model.
+func (d *DeliverProgressProductDao) OrderRandom() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) OrderBy(orderBy string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Limit(limit ...int) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Offset(offset int) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Offset(offset), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Distinct forces the query to only return distinct results.
+func (d *DeliverProgressProductDao) Distinct() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Page(page, limit int) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Page(page, limit), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Batch sets the batch operation number for the model.
+func (d *DeliverProgressProductDao) Batch(batch int) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Cache(duration time.Duration, name ...string) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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 *DeliverProgressProductDao) Data(data ...interface{}) *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{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.DeliverProgressProduct.
+// 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 *DeliverProgressProductDao) All(where ...interface{}) ([]*model.DeliverProgressProduct, error) {
+	all, err := d.M.All(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entities []*model.DeliverProgressProduct
+	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.DeliverProgressProduct.
+// 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 *DeliverProgressProductDao) One(where ...interface{}) (*model.DeliverProgressProduct, error) {
+	one, err := d.M.One(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entity *model.DeliverProgressProduct
+	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 *DeliverProgressProductDao) FindOne(where ...interface{}) (*model.DeliverProgressProduct, error) {
+	one, err := d.M.FindOne(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entity *model.DeliverProgressProduct
+	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 *DeliverProgressProductDao) FindAll(where ...interface{}) ([]*model.DeliverProgressProduct, error) {
+	all, err := d.M.FindAll(where...)
+	if err != nil {
+		return nil, err
+	}
+	var entities []*model.DeliverProgressProduct
+	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 *DeliverProgressProductDao) 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 *DeliverProgressProductDao) 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 *DeliverProgressProductDao) Scan(pointer interface{}, where ...interface{}) error {
+	return d.M.Scan(pointer, where...)
+}
+
+// Chunk iterates the table with given size and callback function.
+func (d *DeliverProgressProductDao) Chunk(limit int, callback func(entities []*model.DeliverProgressProduct, err error) bool) {
+	d.M.Chunk(limit, func(result gdb.Result, err error) bool {
+		var entities []*model.DeliverProgressProduct
+		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 *DeliverProgressProductDao) LockUpdate() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.LockUpdate(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// LockShared sets the lock in share mode for current operation.
+func (d *DeliverProgressProductDao) LockShared() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.LockShared(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// Unscoped enables/disables the soft deleting feature.
+func (d *DeliverProgressProductDao) Unscoped() *DeliverProgressProductDao {
+	return &DeliverProgressProductDao{M: d.M.Unscoped(), Table: d.Table, TableAs: d.TableAs}
+}
+
+// DataScope enables the DataScope feature.
+func (d *DeliverProgressProductDao) DataScope(ctx context.Context, args ...interface{}) *DeliverProgressProductDao {
+	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 &DeliverProgressProductDao{M: d.M.Where(whereSql, orValues...).Ctx(ctx), Table: d.Table, TableAs: d.TableAs}
+	}
+	return d
+}
+
+// args 1、字段
+// args 2、字段、表名
+// args 3、字段对应关系
+func (d *DeliverProgressProductDao) 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
+}

+ 2 - 2
opms_parent/app/handler/base/region.go

@@ -42,12 +42,12 @@ func (r *RegionHandler) GetRegionDetailList(ctx context.Context, req *model.SecB
 }
 
 // GetRegionTree 获取大区及下属地区
-func (p *RegionHandler) GetRegionTree(ctx context.Context, null, rsp *comm_def.CommonMsg) error {
+func (p *RegionHandler) GetRegionTree(ctx context.Context, req *model.RegionTreeReq, rsp *comm_def.CommonMsg) error {
 	regionServer, err := server.NewSalesRegionService(ctx)
 	if err != nil {
 		return err
 	}
-	list, err := regionServer.GetRegionTree()
+	list, err := regionServer.GetRegionTree(req)
 	if err != nil {
 		return err
 	}

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

@@ -108,3 +108,17 @@ func (w *DeliverOrder) Start(ctx context.Context, req *model.StartReq, rsp *comm
 	}
 	return nil
 }
+
+// GetHardwareUserInfo 获取硬件负责人信息
+func (w *DeliverOrder) GetHardwareUserInfo(ctx context.Context, req *model.HardwareReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderService(ctx)
+	if err != nil {
+		return err
+	}
+	info, err := s.GetHardwareUserInfo(ctx, req)
+	if err != nil {
+		return err
+	}
+	rsp.Data = info
+	return nil
+}

+ 4 - 0
opms_parent/app/model/base/base_sales_region.go

@@ -38,3 +38,7 @@ type District struct {
 	RegionCode string `json:"regionCode" `
 	RegionDesc string `json:"regionDesc" `
 }
+
+type RegionTreeReq struct {
+	IsPermission string `json:"isPermission" `
+}

+ 4 - 4
opms_parent/app/model/contract/ctr_contract.go

@@ -43,10 +43,10 @@ type CtrContractListReq struct {
 	DistributorId   int    `json:"distributorId"`   // 经销商ID
 	DistributorName string `json:"distributorName"` // 经销商
 
-	ContractSignTimeStart string `p:"contractSignTimeStart"` //开始时间
-	ContractSignTimeEnd   string `p:"contractSignTimeEnd"`   //结束时间
-	CustProvinceId        int    `json:"custProvinceId"`     // 所在省ID
-	CustCityId            int    `json:"custCityId"`         // 所在市ID
+	ContractEndTimeStart string `p:"contractEndTimeStart"` //开始时间
+	ContractEndTimeEnd   string `p:"contractEndTimeEnd"`   //结束时间
+	CustProvinceId       int    `json:"custProvinceId"`    // 所在省ID
+	CustCityId           int    `json:"custCityId"`        // 所在市ID
 }
 
 type CtrAddProduct struct {

+ 14 - 8
opms_parent/app/model/work/deliver_order.go

@@ -17,9 +17,11 @@ 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"`
+	SaleId           int                       `json:"saleId"`
+	Plan             []*DeliverOrderImpPlan    `json:"plan"`
+	Product          []*DeliverOrderProduct    `json:"product"`
+	ProgressProducts []*DeliverProgressProduct `json:"progressProducts"`
+	Number           int                       `json:"number"` // 发货单数量
 }
 
 type DeliverOrderInfo struct {
@@ -48,7 +50,7 @@ type DeliverOrderListReq struct {
 
 type DeliverOrderAddReq struct {
 	OrderTypeCode string                 `json:"orderTypeCode"`
-	ContractId    int                    `json:"contractId" v:"required#请输入合同ID"`        // 关联合同ID
+	ContractId    int                    `json:"contractId" v:"required#请输入合同ID"`           // 关联合同ID
 	FormData      []DingTalkFormItemData `json:"formData"         v:"required#表单数据不能为空"` // 表单数据
 }
 
@@ -63,15 +65,15 @@ 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"`          // 特殊要求说明
+	RequiredDeliveryTime *gtime.Time `json:"requiredDeliveryTime"`               // 要求发货时间
+	ReceivingInfo        string      `json:"receivingInfo"`                      // 收货信息
+	SpecialRequirements  string      `json:"specialRequirements"`                // 特殊要求说明
 }
 
 type ProductInfo struct {
@@ -79,3 +81,7 @@ type ProductInfo struct {
 	Products    []*contractmodel.CtrContractProduct
 	Remark      string
 }
+
+type HardwareReq struct {
+	Name string `json:"name"`
+}

+ 4 - 3
opms_parent/app/model/work/deliver_order_imp_progress.go

@@ -23,6 +23,7 @@ type DeliverOrderProgressListReq struct {
 	ProgressType      string `json:"progressType"`      // 10发货任务单/20组装任务单/30部署安装单
 	ProgressLevel     string `json:"progressLevel"`     // 优先级(10最高 20普通 30较低 )
 	IsPrincipalPerson string `json:"isPrincipalPerson"` // 是否按照负责人查询
+	DeliverProgressId int    `json:"deliverProgressId"` // 关联发货任务单Id
 }
 
 type DeliverOrderProgressAddReq struct {
@@ -64,12 +65,12 @@ type DeliverOrderImpProgressFinishReq struct {
 }
 
 type StartDeliverGoodsProgressReq struct {
-	Progress *DeliverOrderImpProgress `json:"progress"`
-	Products []*productInfo           `json:"products"`
+	Progress *DeliverOrderImpProgress  `json:"progress"`
+	Products []*DeliverProgressProduct `json:"products"`
 }
 
 type productInfo struct {
-	DeliverOrderProduct
+	DeliverProgressProduct
 	OperateType string `json:"operateType"` // 外购;组装
 }
 

+ 14 - 0
opms_parent/app/model/work/deliver_progress_product.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"
+)
+
+// DeliverProgressProduct is the golang structure for table deliver_progress_product.
+type DeliverProgressProduct internal.DeliverProgressProduct
+
+// Fill with you ideas below.

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

@@ -13,6 +13,7 @@ type DeliverOrderImpProgress struct {
 	Id                   int         `orm:"id,primary"              json:"id"`                   // 主键
 	DeliverOrderId       int         `orm:"deliver_order_id"        json:"deliverOrderId"`       // 关联交付订单ID
 	PlanId               int         `orm:"plan_id"                 json:"planId"`               // 关联实施计划
+	DeliverProgressId    int         `orm:"deliver_progress_id"     json:"deliverProgressId"`    // 关联发货任务单Id
 	ProgressTitle        string      `orm:"progress_title"          json:"progressTitle"`        // 任务标题
 	ProgressContext      string      `orm:"progress_context"        json:"progressContext"`      // 任务内容
 	StartDate            *gtime.Time `orm:"start_date"              json:"startDate"`            // 开始时间

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

@@ -16,6 +16,7 @@ type DeliverOrderProduct struct {
 	ProductName        string      `orm:"product_name"         json:"productName"`        // 产品名称
 	ProductType        string      `orm:"product_type"         json:"productType"`        // 产品类型
 	ProductNum         int         `orm:"product_num"          json:"productNum"`         // 产品数量
+	CompleteNum        int         `orm:"complete_num"         json:"completeNum"`        // 已完成数量
 	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 安装部署完成

+ 35 - 0
opms_parent/app/model/work/internal/deliver_progress_product.go

@@ -0,0 +1,35 @@
+// ==========================================================================
+// This is auto-generated by gf cli tool. DO NOT EDIT THIS FILE MANUALLY.
+// ==========================================================================
+
+package internal
+
+import (
+	"github.com/gogf/gf/os/gtime"
+)
+
+// DeliverProgressProduct is the golang structure for table deliver_progress_product.
+type DeliverProgressProduct struct {
+	Id                 int         `orm:"id,primary"           json:"id"`                 // 主键
+	DeliverOrderId     int         `orm:"deliver_order_id"     json:"deliverOrderId"`     // 关联交付订单ID
+	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"`  // 关联的部署安装单
+	ProductId          int         `orm:"product_id"           json:"productId"`          // 关联产品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"`        // 获取方式:组装;外购
+	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"`        // 删除时间
+}

+ 37 - 7
opms_parent/app/service/base/base_sales_region.go

@@ -2,11 +2,11 @@ package base
 
 import (
 	"context"
-	"strconv"
-
+	"fmt"
 	"github.com/gogf/gf/frame/g"
 	"github.com/gogf/gf/os/gtime"
 	"github.com/gogf/gf/util/gconv"
+	"strconv"
 
 	"dashoo.cn/micro/app/dao/base"
 	model "dashoo.cn/micro/app/model/base"
@@ -59,18 +59,48 @@ func (s *salesRegionService) GetRegionList() (RegionList []*model.Region, err er
 }
 
 // GetRegionTree 获取大区及下属地区
-func (s *salesRegionService) GetRegionTree() (regionList []*model.Region, err error) {
-	err = s.Dao.Order("id asc").Scan(&regionList)
-	if err != nil {
-		return
+func (s *salesRegionService) GetRegionTree(req *model.RegionTreeReq) (regionList []*model.Region, err error) {
+	where1 := ""
+	where2 := ""
+	if req.IsPermission == "1" {
+		//	系统管理员、总经理、销售总监、销售助理看到所有区域
+		if service.StringsContains(s.CxtUser.Roles, "GeneralManager") || service.StringsContains(s.CxtUser.Roles, "SalesDirector") || service.StringsContains(s.CxtUser.Roles, "SaleAssociate") || service.StringsContains(s.CxtUser.Roles, "SysAdmin") {
+			//	无条件,查询全部
+		} else {
+			// 大区经理:看到大区及所负责的其他区域;销售工程师:看到所负责的区域
+			if data, ok := s.CxtUser.DataScope["cust_city_id"]; ok {
+				if data != nil {
+					idArr := data.([]interface{})
+					ids := "-1"
+					for _, id := range idArr {
+						ids += "," + gconv.String(id)
+					}
+					where2 = fmt.Sprintf("cust_city_id IN (%v)", ids)
+				}
+			}
+		}
 	}
+
 	detailDao := base.NewBaseSalesRegionDetailDao(s.Tenant)
 	regionDetailsList := ([]*model.District)(nil)
-	err = detailDao.Fields("region_id, cust_province_id as regionCode, cust_province as regionDesc").Group("cust_province_id").
+	err = detailDao.Where(where2).Fields("region_id, cust_province_id as regionCode, cust_province as regionDesc").Group("cust_province_id").
 		OrderAsc(detailDao.C.RegionId).Scan(&regionDetailsList)
 	if err != nil {
 		return
 	}
+	regionMap := make(map[int]int, 0)
+	regionIds := "-1"
+	for _, detail := range regionDetailsList {
+		if _, ok := regionMap[detail.RegionId]; !ok {
+			regionMap[detail.RegionId] = 1
+			regionIds += "," + gconv.String(detail.RegionId)
+		}
+	}
+	where1 += fmt.Sprintf("id IN (%v)", regionIds)
+	err = s.Dao.Order("created_time asc").Where(where1).Scan(&regionList)
+	if err != nil {
+		return
+	}
 	for _, item := range regionList {
 		item.Children = make([]*model.District, 0)
 		for _, v := range regionDetailsList {

+ 4 - 4
opms_parent/app/service/contract/ctr_contract.go

@@ -232,11 +232,11 @@ func (s CtrContractService) List(ctx context.Context, req *model.CtrContractList
 	if req.EndTime != "" {
 		dao = dao.Where("a.created_time < ?", req.EndTime)
 	}
-	if req.ContractSignTimeStart != "" {
-		dao = dao.Where("a.contract_sign_time >= ?", req.ContractSignTimeStart)
+	if req.ContractEndTimeStart != "" {
+		dao = dao.Where("a.contract_end_time >= ?", req.ContractEndTimeStart)
 	}
-	if req.ContractSignTimeEnd != "" {
-		dao = dao.Where("a.contract_sign_time <= ?", req.ContractSignTimeEnd)
+	if req.ContractEndTimeEnd != "" {
+		dao = dao.Where("a.contract_end_time <= ?", req.ContractEndTimeEnd)
 	}
 	if req.CustProvinceId != 0 {
 		dao = dao.Where("a.cust_province_id = ?", req.CustProvinceId)

+ 3 - 3
opms_parent/app/service/plat/plat_task_cron.go

@@ -83,7 +83,7 @@ func (c taskCron) Run() {
 					// 校验当前时间
 					remindTime := gtime.NewFromStr(fmt.Sprintf("%v %v:%v:%v", now.Format("Y-m-d"), rules[2], rules[1], rules[0]))
 					// 10分钟一次定时循环,两者相差在10分钟之内(纳秒转换1e9)
-					if (now.Nanosecond()-remindTime.Nanosecond())/(1*60*1e9) <= 10 && now.Nanosecond() > remindTime.Nanosecond() {
+					if (now.UnixNano()-remindTime.UnixNano())/(1*60*1e9) <= 10 && now.UnixNano() > remindTime.UnixNano() {
 						taskNotifyMessage(task.MainUserId, task.OwnerUserId, TaskTitle+"督办需要处理,请前往执行")
 					}
 				} else if rules[3] == "?" { // 每周提醒
@@ -100,7 +100,7 @@ func (c taskCron) Run() {
 						// 校验当前时间
 						remindTime := gtime.NewFromStr(fmt.Sprintf("%v %v:%v:%v", now.Format("Y-m-d"), rules[2], rules[1], rules[0]))
 						// 10分钟一次定时循环,两者相差在10分钟之内(纳秒转换1e9)
-						if (now.Nanosecond()-remindTime.Nanosecond())/(1*60*1e9) <= 10 && now.Nanosecond() > remindTime.Nanosecond() {
+						if (now.UnixNano()-remindTime.UnixNano())/(1*60*1e9) <= 10 && now.UnixNano() > remindTime.UnixNano() {
 							taskNotifyMessage(task.MainUserId, task.OwnerUserId, TaskTitle+"督办需要处理,请前往执行")
 						}
 					}
@@ -117,7 +117,7 @@ func (c taskCron) Run() {
 						// 校验当前时间
 						remindTime := gtime.NewFromStr(fmt.Sprintf("%v %v:%v:%v", now.Format("Y-m-d"), rules[2], rules[1], rules[0]))
 						// 10分钟一次定时循环,两者相差在10分钟之内(纳秒转换1e9)
-						if (now.Nanosecond()-remindTime.Nanosecond())/(1*60*1e9) <= 10 && now.Nanosecond() > remindTime.Nanosecond() {
+						if (now.UnixNano()-remindTime.UnixNano())/(1*60*1e9) <= 10 && now.UnixNano() > remindTime.UnixNano() {
 							taskNotifyMessage(task.MainUserId, task.OwnerUserId, TaskTitle+"督办需要处理,请前往执行")
 						}
 					}

+ 53 - 23
opms_parent/app/service/work/deliver_order.go

@@ -33,14 +33,15 @@ import (
 )
 
 type DeliverOrderService struct {
-	Dao             *workdao.DeliverOrderDao
-	PlanDao         *workdao.DeliverOrderImpPlanDao
-	ProductDao      *workdao.DeliverOrderProductDao
-	ContractDao     *contractdao.CtrContractDao
-	ProjBusinessDao *projdao.ProjBusinessDao
-	CustomerDao     *custdao.CustCustomerDao
-	CtrProductDao   *contractdao.CtrContractProductDao
-	BaseProductDao  *basedao.BaseProductDao
+	Dao                *workdao.DeliverOrderDao
+	PlanDao            *workdao.DeliverOrderImpPlanDao
+	ProductDao         *workdao.DeliverOrderProductDao
+	ContractDao        *contractdao.CtrContractDao
+	ProjBusinessDao    *projdao.ProjBusinessDao
+	CustomerDao        *custdao.CustCustomerDao
+	CtrProductDao      *contractdao.CtrContractProductDao
+	BaseProductDao     *basedao.BaseProductDao
+	ProgressProductDao *workdao.DeliverProgressProductDao
 
 	Tenant    string
 	userInfo  request.UserInfo
@@ -59,21 +60,23 @@ func NewDeliverOrderService(ctx context.Context) (*DeliverOrderService, error) {
 		return nil, fmt.Errorf("获取用户信息异常:%s", err.Error())
 	}
 	return &DeliverOrderService{
-		Dao:             workdao.NewDeliverOrderDao(tenant),
-		PlanDao:         workdao.NewDeliverOrderImpPlanDao(tenant),
-		ContractDao:     contractdao.NewCtrContractDao(tenant),
-		ProjBusinessDao: projdao.NewProjBusinessDao(tenant),
-		CustomerDao:     custdao.NewCustCustomerDao(tenant),
-		CtrProductDao:   contractdao.NewCtrContractProductDao(tenant),
-		ProductDao:      workdao.NewDeliverOrderProductDao(tenant),
-		BaseProductDao:  basedao.NewBaseProductDao(tenant),
-		Tenant:          tenant,
-		userInfo:        userInfo,
-		DataScope:       userInfo.DataScope,
+		Dao:                workdao.NewDeliverOrderDao(tenant),
+		PlanDao:            workdao.NewDeliverOrderImpPlanDao(tenant),
+		ContractDao:        contractdao.NewCtrContractDao(tenant),
+		ProjBusinessDao:    projdao.NewProjBusinessDao(tenant),
+		CustomerDao:        custdao.NewCustCustomerDao(tenant),
+		CtrProductDao:      contractdao.NewCtrContractProductDao(tenant),
+		ProductDao:         workdao.NewDeliverOrderProductDao(tenant),
+		BaseProductDao:     basedao.NewBaseProductDao(tenant),
+		ProgressProductDao: workdao.NewDeliverProgressProductDao(tenant),
+		Tenant:             tenant,
+		userInfo:           userInfo,
+		DataScope:          userInfo.DataScope,
 	}, nil
 }
 
 func (s DeliverOrderService) Get(ctx context.Context, id int) (*work.DeliverOrderGetRsp, error) {
+	number := 0
 	ent, err := s.Dao.Where("Id = ?", id).One()
 	if err != nil {
 		return nil, err
@@ -103,11 +106,23 @@ func (s DeliverOrderService) Get(ctx context.Context, id int) (*work.DeliverOrde
 	if proj != nil {
 		saleId = proj.SaleId
 	}
+	progressProducts, err := s.ProgressProductDao.Where("deliver_order_id = ?", id).All()
+	if err != nil {
+		return nil, err
+	}
+	// 发货单数量
+	number, err = s.Dao.DB.Model("deliver_order_imp_progress").Where(fmt.Sprintf("deliver_order_id='%v' AND progress_type='10'", id)).Count()
+	if err != nil {
+		return nil, err
+	}
+
 	return &work.DeliverOrderGetRsp{
-		DeliverOrder: *ent,
-		Plan:         plan,
-		Product:      product,
-		SaleId:       saleId,
+		DeliverOrder:     *ent,
+		Plan:             plan,
+		Product:          product,
+		ProgressProducts: progressProducts,
+		SaleId:           saleId,
+		Number:           number + 1,
 	}, nil
 }
 
@@ -725,3 +740,18 @@ func (s DeliverOrderService) Start(ctx context.Context, req *work.StartReq) erro
 
 	return err
 }
+
+func (s DeliverOrderService) GetHardwareUserInfo(ctx context.Context, req *work.HardwareReq) (map[string]interface{}, error) {
+	user, err := s.Dao.DB.Model("sys_user").Where(fmt.Sprintf("nick_name='%v'", req.Name)).One()
+	if err != nil {
+		if err == sql.ErrNoRows {
+			return nil, nil
+		}
+		return nil, err
+	}
+
+	return map[string]interface{}{
+		"id":       user["id"],
+		"nickName": user["nick_name"],
+	}, nil
+}

+ 2 - 2
opms_parent/app/service/work/deliver_order_cron.go

@@ -15,7 +15,7 @@ import (
 func init() {
 	// 定时任务
 	c := cron.New()
-	spec := "1 0/10 * * * ?" // 每天10分钟执行一次
+	spec := "1 0/1 * * * ?" // 每天10分钟执行一次
 
 	if err := c.AddJob(spec, deliverOrderProgressCron{}); err != nil {
 		glog.Error(err)
@@ -46,7 +46,7 @@ func (c deliverOrderProgressCron) Run() {
 		// 校验当前时间
 		remindTime := p["estimated_arrival_time"].GTime()
 		// 10分钟一次定时循环,两者相差在10分钟之内(纳秒转换1e9)
-		if (now.Nanosecond()-remindTime.Nanosecond())/(1*60*1e9) <= 10 {
+		if (now.UnixNano()-remindTime.UnixNano())/(1*60*1e9) <= 10 {
 			ids := gconv.String(p["principal_person_id"])
 			if gconv.String(p["sale_id"]) != gconv.String(p["principal_person_id"]) {
 				ids += "," + gconv.String(p["sale_id"])

+ 139 - 57
opms_parent/app/service/work/deliver_order_progress.go

@@ -20,11 +20,12 @@ import (
 )
 
 type DeliverOrderProgressService struct {
-	Dao         *workdao.DeliverOrderImpProgressDao
-	PlanDao     *workdao.DeliverOrderImpPlanDao
-	OrderDao    *workdao.DeliverOrderDao
-	ProductDao  *workdao.DeliverOrderProductDao
-	ContractDao *contractdao.CtrContractDao
+	Dao                *workdao.DeliverOrderImpProgressDao
+	PlanDao            *workdao.DeliverOrderImpPlanDao
+	OrderDao           *workdao.DeliverOrderDao
+	ProductDao         *workdao.DeliverOrderProductDao
+	ProgressProductDao *workdao.DeliverProgressProductDao
+	ContractDao        *contractdao.CtrContractDao
 
 	Tenant    string
 	userInfo  request.UserInfo
@@ -43,14 +44,15 @@ func NewDeliverOrderProgressService(ctx context.Context) (*DeliverOrderProgressS
 		return nil, fmt.Errorf("获取用户信息异常:%s", err.Error())
 	}
 	return &DeliverOrderProgressService{
-		Dao:         workdao.NewDeliverOrderImpProgressDao(tenant),
-		PlanDao:     workdao.NewDeliverOrderImpPlanDao(tenant),
-		OrderDao:    workdao.NewDeliverOrderDao(tenant),
-		ContractDao: contractdao.NewCtrContractDao(tenant),
-		ProductDao:  workdao.NewDeliverOrderProductDao(tenant),
-		Tenant:      tenant,
-		userInfo:    userInfo,
-		DataScope:   userInfo.DataScope,
+		Dao:                workdao.NewDeliverOrderImpProgressDao(tenant),
+		PlanDao:            workdao.NewDeliverOrderImpPlanDao(tenant),
+		OrderDao:           workdao.NewDeliverOrderDao(tenant),
+		ContractDao:        contractdao.NewCtrContractDao(tenant),
+		ProductDao:         workdao.NewDeliverOrderProductDao(tenant),
+		ProgressProductDao: workdao.NewDeliverProgressProductDao(tenant),
+		Tenant:             tenant,
+		userInfo:           userInfo,
+		DataScope:          userInfo.DataScope,
 	}, nil
 }
 
@@ -59,6 +61,9 @@ func (s DeliverOrderProgressService) List(ctx context.Context, req *work.Deliver
 	if req.DeliverOrderId != 0 {
 		dao = dao.Where("deliver_order_id = ?", req.DeliverOrderId)
 	}
+	if req.DeliverProgressId != 0 {
+		dao = dao.Where("deliver_progress_id = ?", req.DeliverProgressId)
+	}
 	if req.PlanId != 0 {
 		dao = dao.Where("plan_id = ?", req.PlanId)
 	}
@@ -301,9 +306,10 @@ func (s DeliverOrderProgressService) StartDeliverGoodsProgress(ctx context.Conte
 			return err
 		}
 		// 初始化数据
-		deliverProgress.ProgressStatus = "10" // 状态(10未开始20进行中30已完成)
-		deliverProgress.DeliverStatus = "10"  // 发货状态(10未开始、20进行中、30已发货、40产品已验收、50确认已到货、60安装完成)
+		deliverProgress.ProgressStatus = "20" // 状态(10未开始20进行中30已完成)
+		deliverProgress.DeliverStatus = "20"  // 发货状态(10未开始、20进行中、30已发货、40产品已验收、50确认已到货、60安装完成)
 		//deliverProgress.ProgressType = "10"   // 10发货任务单/20组装任务单/30部署安装单
+		deliverProgress.ReaStartDate = gtime.Now()
 		if deliverProgress.PrincipalPerson == "" {
 			deliverProgress.PrincipalPersonId, deliverProgress.PrincipalPerson, err = s.getUserInfo("丁岳嵩")
 		}
@@ -327,21 +333,21 @@ func (s DeliverOrderProgressService) StartDeliverGoodsProgress(ctx context.Conte
 		}
 		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)
-			}
+		var indexArr []int
+		for index, product := range req.Products {
+			product.Id = 0
+			product.UpdatedName = ""
+			product.UpdatedTime = nil
+			product.UpdatedBy = 0
+			service.SetCreatedInfo(product, s.userInfo.Id, s.userInfo.NickName)
+
 			// 外购;组装
 			if product.OperateType == "组装" {
-				if assembleIds == "" {
-					assembleIds = gconv.String(product.Id)
-				} else {
-					assembleIds += "," + gconv.String(product.Id)
-				}
+				indexArr = append(indexArr, index)
+			}
+			_, err = tx.Update("deliver_order_product", fmt.Sprintf("complete_num=IFNULL(complete_num,0) + %v", product.ProductNum), fmt.Sprintf("id='%v'", product.ProductId))
+			if err != nil {
+				return err
 			}
 		}
 
@@ -352,25 +358,30 @@ func (s DeliverOrderProgressService) StartDeliverGoodsProgress(ctx context.Conte
 		}
 
 		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
-			}
+		for _, product := range req.Products {
+			product.IsDeliver = "20"
+			product.DeliverProgressId = int(deliverId)
+			product.OperateType = "外购"
 		}
+		assembleProgress.DeliverProgressId = int(deliverId)
 		// 存在硬件安装
-		if assembleIds != "" {
+		if len(indexArr) > 0 {
 			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
+			for _, ind := range indexArr {
+				req.Products[ind].AssembleProgressId = int(assembleId)
+				req.Products[ind].OperateType = "组装"
 			}
 		}
 
+		_, err = tx.Save("deliver_progress_product", req.Products)
+		if err != nil {
+			return err
+		}
+
 		return nil
 	})
 	if err != nil {
@@ -394,7 +405,7 @@ func (s DeliverOrderProgressService) CompleteAssembleGoodsProgress(ctx context.C
 	if err != nil {
 		return err
 	}
-	_, err = s.ProductDao.Update("is_complete='20'", fmt.Sprintf("assemble_progress_id='%v'", req.Id))
+	_, err = s.ProgressProductDao.Update("is_complete='20'", fmt.Sprintf("assemble_progress_id='%v'", req.Id))
 
 	return err
 }
@@ -405,23 +416,77 @@ func (s DeliverOrderProgressService) DeliverGoods(ctx context.Context, req *work
 	if err != nil {
 		return err
 	}
+	// 10发货任务单/20组装任务单/30部署安装单
+	installProgress, err := s.Dao.Where(fmt.Sprintf("deliver_order_id='%v' AND progress_status<>'30' AND progress_type='30'", progress.DeliverOrderId)).FindOne()
+	if err != nil && err != sql.ErrNoRows {
+		return err
+	}
+
+	err = s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		_, err = tx.Update("deliver_order_imp_progress", 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))
+		if err != nil {
+			return err
+		}
+
+		if installProgress != nil {
+			_, err = tx.Update("deliver_progress_product", fmt.Sprintf("install_progress_id='%v'", installProgress.Id), fmt.Sprintf("deliver_progress_id='%v'", req.Id))
+			if err != nil {
+				return err
+			}
+		} else {
+			// 生成部署安装计划
+			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)
+			r, err := tx.Save("deliver_order_imp_plan", plan)
+			if err != nil {
+				return err
+			}
+			planId, _ := r.LastInsertId()
+
+			// 生成部署安装任务(只存在一个未完成的部署安装任务)
+			var insProgress work.DeliverOrderImpProgress
+			insProgress.PlanId = int(planId)
+			insProgress.DeliverOrderId = progress.DeliverOrderId
+			insProgress.DeliverProgressId = req.Id
+			insProgress.ProgressTitle = "安装任务单"
+			insProgress.StartDate = gtime.Now()
+			insProgress.EndDate = progress.EndDate
+			insProgress.ProgressStatus = "10" // 状态(10未开始20进行中30已完成
+			insProgress.ProgressLevel = "10"  // 优先级
+			insProgress.ProgressType = "30"   // 10发货任务单/20组装任务单/30部署安装单
+			if insProgress.PrincipalPerson == "" {
+				insProgress.PrincipalPersonId, insProgress.PrincipalPerson, err = s.getUserInfo("王志强")
+				if err != nil {
+					return err
+				}
+			}
+			service.SetCreatedInfo(&insProgress, s.userInfo.Id, s.userInfo.NickName)
 
-	_, 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))
+			// 保存数据
+			result1, err := tx.Save("deliver_order_imp_progress", insProgress)
+			if err != nil {
+				return err
+			}
 
-	// 生成部署安装计划
-	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)
+			id, _ := result1.LastInsertId()
+			_, err = tx.Update("deliver_progress_product", fmt.Sprintf("install_progress_id='%v'", id), fmt.Sprintf("deliver_progress_id='%v'", req.Id))
+			if err != nil {
+				return err
+			}
+
+		}
+
+		return nil
+	})
 	if err != nil {
 		return err
 	}
-
-	return err
+	return nil
 }
 
 // InspectGoods 验收
@@ -453,9 +518,9 @@ func (s DeliverOrderProgressService) StartInstallProgress(ctx context.Context, r
 		progress.ProgressType = "30"   // 10发货任务单/20组装任务单/30部署安装单
 		if progress.PrincipalPerson == "" {
 			progress.PrincipalPersonId, progress.PrincipalPerson, err = s.getUserInfo("王志强")
-		}
-		if err != nil {
-			return err
+			if err != nil {
+				return err
+			}
 		}
 		service.SetCreatedInfo(&progress, s.userInfo.Id, s.userInfo.NickName)
 
@@ -475,7 +540,7 @@ func (s DeliverOrderProgressService) StartInstallProgress(ctx context.Context, r
 			}
 		}
 
-		_, err = tx.Update("deliver_order_product", fmt.Sprintf("install_progress_id='%v'", deliverId), fmt.Sprintf("id IN (%v)", ids))
+		_, err = tx.Update("deliver_progress_product", fmt.Sprintf("install_progress_id='%v'", deliverId), fmt.Sprintf("id IN (%v)", ids))
 		if err != nil {
 			return err
 		}
@@ -494,7 +559,11 @@ func (s DeliverOrderProgressService) CompleteInstall(ctx context.Context, req *w
 	if err != nil {
 		return err
 	}
-	allProducts, err := s.ProductDao.Where(fmt.Sprintf("deliver_order_id='%v'", progress.DeliverOrderId)).FindAll()
+	count, err := s.ProductDao.Where(fmt.Sprintf("deliver_order_id='%v' AND product_num<>complete_num", progress.DeliverOrderId)).Count()
+	if err != nil {
+		return err
+	}
+	allProducts, err := s.ProgressProductDao.Where(fmt.Sprintf("deliver_order_id='%v'", progress.DeliverOrderId)).FindAll()
 	if err != nil {
 		return err
 	}
@@ -536,17 +605,30 @@ func (s DeliverOrderProgressService) CompleteInstall(ctx context.Context, req *w
 		}
 		// 更新发货任务单状态
 		if progressIds != "" {
-			_, err = tx.Update("deliver_order_imp_progress", "deliver_status='60'", fmt.Sprintf("id IN (%v)", progressIds))
+			_, err = tx.Update("deliver_order_imp_progress", fmt.Sprintf("deliver_status='60',progress_status='30',rea_end_date='%v'", gtime.Now().Format("Y-m-d H:i:s")), 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))
+			_, err = tx.Update("deliver_progress_product", "is_install='20'", fmt.Sprintf("id IN (%v)", ids))
+			if err != nil {
+				return err
+			}
+		}
+		// 更新硬件交付工单完成状态
+		if count == 0 {
+			count1, err := tx.Model("deliver_order_imp_progress").Where(fmt.Sprintf("(progress_status='20' OR progress_status='10') AND progress_type='10' AND deliver_progress_id='%v'", progress.DeliverOrderId)).Count()
 			if err != nil {
 				return err
 			}
+			if count1 == 0 {
+				_, err = tx.Update("deliver_order", fmt.Sprintf("order_status='20',finish_time='%v'", gtime.Now().Format("Y-m-d H:i:s")), fmt.Sprintf("id='%v'", progress.DeliverOrderId))
+				if err != nil {
+					return err
+				}
+			}
 		}
 
 		return nil