浏览代码

feature(交付工单): 硬件交付-安装工单流程优化后端接口示实现

lk 2 年之前
父节点
当前提交
a45b56506a

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

@@ -59,6 +59,13 @@ type deliverOrderImpProgressColumns struct {
 	InstallDate          string // 安装日期
 	InstallCheckFileUrl  string // 安装验收单文件
 	InstallCheckFileName string // 安装验收单文件名称
+	ExpectInstallTime    string // 期望安装时间
+	InstallBeginTime     string // 安装开始时间
+	InstallEndTime       string // 安装结束时间
+	AuditUserId          string // 审核人Id
+	AuditUser            string // 审核人
+	AuditTime            string // 审核时间
+	AuditDesc            string // 审核描述
 	Remark               string // 备注
 	CreatedBy            string // 创建者
 	CreatedName          string // 创建人
@@ -105,6 +112,13 @@ var (
 			InstallDate:          "install_date",
 			InstallCheckFileUrl:  "install_check_file_url",
 			InstallCheckFileName: "install_check_file_name",
+			ExpectInstallTime:    "expect_install_time",
+			InstallBeginTime:     "install_begin_time",
+			InstallEndTime:       "install_end_time",
+			AuditUserId:          "audit_user_id",
+			AuditUser:            "audit_user",
+			AuditTime:            "audit_time",
+			AuditDesc:            "audit_desc",
 			Remark:               "remark",
 			CreatedBy:            "created_by",
 			CreatedName:          "created_name",
@@ -153,6 +167,13 @@ func NewDeliverOrderImpProgressDao(tenant string) DeliverOrderImpProgressDao {
 			InstallDate:          "install_date",
 			InstallCheckFileUrl:  "install_check_file_url",
 			InstallCheckFileName: "install_check_file_name",
+			ExpectInstallTime:    "expect_install_time",
+			InstallBeginTime:     "install_begin_time",
+			InstallEndTime:       "install_end_time",
+			AuditUserId:          "audit_user_id",
+			AuditUser:            "audit_user",
+			AuditTime:            "audit_time",
+			AuditDesc:            "audit_desc",
 			Remark:               "remark",
 			CreatedBy:            "created_by",
 			CreatedName:          "created_name",

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

@@ -44,6 +44,8 @@ type deliverProgressProductColumns struct {
 	IsComplete         string // 10 未完成;20 组装或外购完成
 	IsInstall          string // 10 未开始;20 安装部署完成
 	OperateType        string // 获取方式:组装;外购
+	Pictures           string // 安装图片(地址串)
+	Desc               string // 安装描述
 	Remark             string // 备注
 	CreatedBy          string // 创建者
 	CreatedName        string // 创建人
@@ -75,6 +77,8 @@ var (
 			IsComplete:         "is_complete",
 			IsInstall:          "is_install",
 			OperateType:        "operate_type",
+			Pictures:           "pictures",
+			Desc:               "desc",
 			Remark:             "remark",
 			CreatedBy:          "created_by",
 			CreatedName:        "created_name",
@@ -108,6 +112,8 @@ func NewDeliverProgressProductDao(tenant string) DeliverProgressProductDao {
 			IsComplete:         "is_complete",
 			IsInstall:          "is_install",
 			OperateType:        "operate_type",
+			Pictures:           "pictures",
+			Desc:               "desc",
 			Remark:             "remark",
 			CreatedBy:          "created_by",
 			CreatedName:        "created_name",

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

@@ -68,6 +68,19 @@ func (w *DeliverOrderProgress) Start(ctx context.Context, req *model.DeliverOrde
 	return nil
 }
 
+// Swagger:DeliverOrderProgress 交付工单任务 确认安装信息
+func (w *DeliverOrderProgress) ConfirmInstallInfo(ctx context.Context, req *model.DeliverOrderImpProgressConfirmReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.ConfirmInstallInfo(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
 // Swagger:DeliverOrderProgress 交付工单任务 结束任务
 func (w *DeliverOrderProgress) Finish(ctx context.Context, req *model.DeliverOrderImpProgressFinishReq, rsp *comm_def.CommonMsg) error {
 	s, err := workSrv.NewDeliverOrderProgressService(ctx)
@@ -191,3 +204,29 @@ func (w *DeliverOrderProgress) CompleteInstall(ctx context.Context, req *model.C
 	}
 	return nil
 }
+
+// Swagger:DeliverOrderProgress 交付工单任务 部署安装任务审核
+func (w *DeliverOrderProgress) AuditInstall(ctx context.Context, req *model.DeliverOrderImpProgressAuditReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.AuditInstall(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+// Swagger:DeliverOrderProgress 交付工单任务 更新任务单产品明细信息
+func (w *DeliverOrderProgress) UpdateProgressProductInfo(ctx context.Context, req *model.UpdateProductReq, rsp *comm_def.CommonMsg) error {
+	s, err := workSrv.NewDeliverOrderProgressService(ctx)
+	if err != nil {
+		return err
+	}
+	err = s.UpdateProgressProductInfo(ctx, req)
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 25 - 12
opms_parent/app/model/work/deliver_order_imp_progress.go

@@ -31,14 +31,13 @@ type DeliverOrderProgressAddReq struct {
 	PlanId          int         `json:"planId" v:"required#请输入工单计划ID"`         // 关联实施计划
 	DeliverOrderId  int         `json:"deliverOrderId" v:"required#请输入交付订单ID"` // 关联交付订单ID
 	ProgressTitle   string      `json:"progressTitle" v:"required#请输入任务标题"`    // 任务标题
-	ProgressContext string      `json:"progressContext"`                              // 任务内容
+	ProgressContext string      `json:"progressContext"`                       // 任务内容
 	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 {
@@ -57,11 +56,24 @@ type DeliverOrderProgressUpdateReq struct {
 }
 
 type DeliverOrderImpProgressStartReq struct {
+	Id                int         `json:"id" v:"required#请输入Id"`
+	ExpectInstallTime *gtime.Time `json:"expectInstallTime"` // 期望安装时间
+	Remark            string      `json:"remark"`            // 备注
+}
+
+type DeliverOrderImpProgressConfirmReq struct {
+	Id               int         `json:"id" v:"required#请输入Id"`
+	InstallBeginTime *gtime.Time `json:"installBeginTime"` // 安装开始时间
+	InstallEndTime   *gtime.Time `json:"installEndTime"`   // 安装结束时间
+	Remark           string      `json:"remark"`           // 备注
+}
+
+type DeliverOrderImpProgressFinishReq struct {
 	Id     int    `json:"id" v:"required#请输入Id"`
 	Remark string `json:"remark"` // 备注
 }
 
-type DeliverOrderImpProgressFinishReq struct {
+type DeliverOrderImpProgressAuditReq struct {
 	Id     int    `json:"id" v:"required#请输入Id"`
 	Remark string `json:"remark"` // 备注
 }
@@ -71,11 +83,6 @@ type StartDeliverGoodsProgressReq struct {
 	Products []*DeliverProgressProduct `json:"products"`
 }
 
-type productInfo struct {
-	DeliverProgressProduct
-	OperateType string `json:"operateType"` // 外购;组装
-}
-
 type CompleteAssembleGoodsProgressReq struct {
 	Id         int         `json:"id" v:"required#请输入Id"`
 	ReaEndDate *gtime.Time `json:"reaEndDate"` // 实际结束时间
@@ -110,3 +117,9 @@ type CompleteInstallReq struct {
 	FileName    string      `json:"fileName"`    // 附件名称
 	Remark      string      `json:"remark"`      // 备注
 }
+
+type UpdateProductReq struct {
+	Id       int    `json:"id" v:"required#请输入Id"`
+	Pictures string `json:"pictures"` // 安装图片(地址串)
+	Desc     string `json:"desc"`     // 安装描述
+}

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

@@ -39,6 +39,13 @@ type DeliverOrderImpProgress struct {
 	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"` // 安装验收单文件名称
+	ExpectInstallTime    *gtime.Time `orm:"expect_install_time"     json:"expectInstallTime"`    // 期望安装时间
+	InstallBeginTime     *gtime.Time `orm:"install_begin_time"      json:"installBeginTime"`     // 安装开始时间
+	InstallEndTime       *gtime.Time `orm:"install_end_time"        json:"installEndTime"`       // 安装结束时间
+	AuditUserId          int         `orm:"audit_user_id"           json:"auditUserId"`          // 审核人Id
+	AuditUser            string      `orm:"audit_user"              json:"auditUser"`            // 审核人
+	AuditTime            *gtime.Time `orm:"audit_time"              json:"auditTime"`            // 审核时间
+	AuditDesc            string      `orm:"audit_desc"              json:"auditDesc"`            // 审核描述
 	Remark               string      `orm:"remark"                  json:"remark"`               // 备注
 	CreatedBy            int         `orm:"created_by"              json:"createdBy"`            // 创建者
 	CreatedName          string      `orm:"created_name"            json:"createdName"`          // 创建人

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

@@ -24,6 +24,8 @@ type DeliverProgressProduct struct {
 	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"`        // 获取方式:组装;外购
+	Pictures           string      `orm:"pictures"             json:"pictures"`           // 安装图片(地址串)
+	Desc               string      `orm:"desc"                 json:"desc"`               // 安装描述
 	Remark             string      `orm:"remark"               json:"remark"`             // 备注
 	CreatedBy          int         `orm:"created_by"           json:"createdBy"`          // 创建者
 	CreatedName        string      `orm:"created_name"         json:"createdName"`        // 创建人

+ 5 - 0
opms_parent/app/service/contract/ctr_contract.go

@@ -10,6 +10,7 @@ import (
 	"net/http"
 	"strconv"
 	"strings"
+	"sync"
 	"time"
 
 	basedao "dashoo.cn/micro/app/dao/base"
@@ -58,6 +59,8 @@ type CtrContractService struct {
 	DataScope g.Map `json:"dataScope"`
 }
 
+var mtx sync.Mutex
+
 func NewCtrContractService(ctx context.Context) (*CtrContractService, error) {
 	tenant, err := micro_srv.GetTenant(ctx)
 	if err != nil {
@@ -754,6 +757,8 @@ func (s CtrContractService) DownloadDingtalkFile(ctx context.Context, id int) (s
 }
 
 func ContractApplyApproval(ctx context.Context, flow *workflowModel.PlatWorkflow, msg *message.MixMessage) error {
+	mtx.Lock()
+	defer mtx.Unlock()
 	tenant, err := micro_srv.GetTenant(ctx)
 	if err != nil {
 		return fmt.Errorf("获取租户码异常:%s", err.Error())

+ 15 - 4
opms_parent/app/service/work/deliver_order.go

@@ -352,6 +352,17 @@ func (s DeliverOrderService) Add(ctx context.Context, req *work.DeliverOrderAddR
 }
 
 func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo, productInfo *work.ProductInfo, state string) ([]int, error) {
+	// 该状态为合同审批通过之后自动生成的交付工单
+	if state == "10" {
+		// 校验是否已自动生成交付工单
+		count, err := tx.Model("deliver_order").Where(fmt.Sprintf("contract_id='%v' AND created_by=0", contractId)).Count()
+		if err != nil {
+			return nil, err
+		}
+		if count > 0 {
+			return nil, nil
+		}
+	}
 	var c contractmodel.CtrContract
 	err := tx.GetStruct(&c, "select * from ctr_contract where id = ?", contractId)
 	if err == sql.ErrNoRows {
@@ -421,10 +432,10 @@ func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo, prod
 			DeliverManName: deliverManName,
 			Product:        line,
 			Remark:         remark,
-			CreatedBy:      int(userInfo.Id),
+			CreatedBy:      userInfo.Id,
 			CreatedName:    userInfo.NickName,
 			CreatedTime:    gtime.Now(),
-			UpdatedBy:      int(userInfo.Id),
+			UpdatedBy:      userInfo.Id,
 			UpdatedName:    userInfo.NickName,
 			UpdatedTime:    gtime.Now(),
 		}
@@ -438,10 +449,10 @@ func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo, prod
 			IsComplete:     "10",
 			IsInstall:      "10",
 			Remark:         "",
-			CreatedBy:      int(userInfo.Id),
+			CreatedBy:      userInfo.Id,
 			CreatedName:    userInfo.NickName,
 			CreatedTime:    gtime.Now(),
-			UpdatedBy:      int(userInfo.Id),
+			UpdatedBy:      userInfo.Id,
 			UpdatedName:    userInfo.NickName,
 			UpdatedTime:    gtime.Now(),
 		}

+ 86 - 1
opms_parent/app/service/work/deliver_order_progress.go

@@ -246,14 +246,54 @@ func (s DeliverOrderProgressService) Start(ctx context.Context, req *work.Delive
 				"rea_start_date":  gtime.Now(),
 				"remark":          req.Remark,
 			}, "id = ?", req.Id)
-		} else {
+		} else if ent.ProgressType == "20" {
 			_, err = tx.Update("deliver_order_imp_progress", map[string]interface{}{
 				"progress_status": "20",
 				"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",
+				"deliver_status":      "15",
+				"expect_install_time": req.ExpectInstallTime,
+				"remark":              req.Remark,
+			}, "id = ?", req.Id)
+		}
+
+		if err != nil {
+			return err
 		}
+		return nil
+	})
+	if txerr != nil {
+		return txerr
+	}
+	return nil
+}
 
+func (s DeliverOrderProgressService) ConfirmInstallInfo(ctx context.Context, req *work.DeliverOrderImpProgressConfirmReq) error {
+	validErr := gvalid.CheckStruct(ctx, req, nil)
+	if validErr != nil {
+		return myerrors.TipsError(validErr.Current().Error())
+	}
+
+	ent, err := s.Dao.Where("id = ?", req.Id).One()
+	if err != nil {
+		return err
+	}
+	if ent == nil {
+		return myerrors.TipsError(fmt.Sprintf("工单任务不存在: %d", req.Id))
+	}
+
+	txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		_, err = tx.Update("deliver_order_imp_progress", map[string]interface{}{
+			"deliver_status":     "20",
+			"rea_start_date":     gtime.Now(),
+			"install_begin_time": req.InstallBeginTime,
+			"install_end_time":   req.InstallBeginTime,
+			"remark":             req.Remark,
+		}, "id = ?", req.Id)
 		if err != nil {
 			return err
 		}
@@ -442,6 +482,7 @@ func (s DeliverOrderProgressService) DeliverGoods(ctx context.Context, req *work
 		}
 
 		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
@@ -649,3 +690,47 @@ func (s DeliverOrderProgressService) CompleteInstall(ctx context.Context, req *w
 
 	return err
 }
+
+func (s DeliverOrderProgressService) AuditInstall(ctx context.Context, req *work.DeliverOrderImpProgressAuditReq) error {
+	validErr := gvalid.CheckStruct(ctx, req, nil)
+	if validErr != nil {
+		return myerrors.TipsError(validErr.Current().Error())
+	}
+
+	ent, err := s.Dao.Where("id = ?", req.Id).One()
+	if err != nil {
+		return err
+	}
+	if ent == nil {
+		return myerrors.TipsError(fmt.Sprintf("工单任务不存在: %d", req.Id))
+	}
+
+	txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
+		_, err = tx.Update("deliver_order_imp_progress", map[string]interface{}{
+			"deliver_status": "70", // 发货状态(10未开始、15待确认、20进行中、30已发货、40产品已验收、50确认已到货、60安装完成、70安装审批通过)
+			"audit_user_id":  s.userInfo.Id,
+			"audit_user":     s.userInfo.NickName,
+			"audit_time":     gtime.Now(),
+			"audit_desc":     req.Remark,
+		}, "id = ?", req.Id)
+		if err != nil {
+			return err
+		}
+		return nil
+	})
+	if txerr != nil {
+		return txerr
+	}
+	return nil
+}
+
+// UpdateProgressProductInfo 更新任务单产品明细信息
+func (s DeliverOrderProgressService) UpdateProgressProductInfo(ctx context.Context, req *work.UpdateProductReq) error {
+	data := map[string]interface{}{
+		"pictures": req.Pictures,
+		"desc":     req.Desc,
+	}
+	where := fmt.Sprintf("id='%v'", req.Id)
+	_, err := s.ProductDao.Update(data, where)
+	return err
+}