|
|
@@ -3,6 +3,13 @@ package work
|
|
|
import (
|
|
|
"bytes"
|
|
|
"context"
|
|
|
+ "database/sql"
|
|
|
+ "encoding/json"
|
|
|
+ "fmt"
|
|
|
+ "strconv"
|
|
|
+ "strings"
|
|
|
+
|
|
|
+ proj "dashoo.cn/micro/app/dao/proj"
|
|
|
contractModel "dashoo.cn/micro/app/model/contract"
|
|
|
workflowModel "dashoo.cn/micro/app/model/workflow"
|
|
|
workflowService "dashoo.cn/micro/app/service/workflow"
|
|
|
@@ -10,14 +17,10 @@ import (
|
|
|
"dashoo.cn/opms_libary/plugin/dingtalk"
|
|
|
"dashoo.cn/opms_libary/plugin/dingtalk/message"
|
|
|
"dashoo.cn/opms_libary/plugin/dingtalk/workflow"
|
|
|
- "database/sql"
|
|
|
- "fmt"
|
|
|
"github.com/gogf/gf/database/gdb"
|
|
|
"github.com/gogf/gf/frame/g"
|
|
|
"github.com/gogf/gf/os/gtime"
|
|
|
"github.com/gogf/gf/util/gconv"
|
|
|
- "strconv"
|
|
|
- "strings"
|
|
|
|
|
|
"dashoo.cn/common_definition/comm_def"
|
|
|
"dashoo.cn/opms_libary/myerrors"
|
|
|
@@ -30,8 +33,10 @@ import (
|
|
|
|
|
|
type OrderService struct {
|
|
|
*service.ContextService
|
|
|
- Dao *work.WorkOrderDao
|
|
|
- FeedbackDao *work.WorkOrderFeedbackDao
|
|
|
+ Dao *work.WorkOrderDao
|
|
|
+ FeedbackDao *work.WorkOrderFeedbackDao
|
|
|
+ ProjBusinessDao *proj.ProjBusinessDao
|
|
|
+ DynamicsDao *work.WorkOrderDynamicsDao
|
|
|
}
|
|
|
|
|
|
// 工单状态
|
|
|
@@ -45,6 +50,8 @@ func NewOrderService(ctx context.Context) (svc *OrderService, err error) {
|
|
|
}
|
|
|
svc.Dao = work.NewWorkOrderDao(svc.Tenant)
|
|
|
svc.FeedbackDao = work.NewWorkOrderFeedbackDao(svc.Tenant)
|
|
|
+ svc.ProjBusinessDao = proj.NewProjBusinessDao(svc.Tenant)
|
|
|
+ svc.DynamicsDao = work.NewWorkOrderDynamicsDao(svc.Tenant)
|
|
|
return svc, nil
|
|
|
}
|
|
|
|
|
|
@@ -165,6 +172,16 @@ func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.
|
|
|
if err = gconv.Struct(req, data); err != nil {
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+ p, err := s.ProjBusinessDao.Where("id = ?", req.NboId).One()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if p == nil {
|
|
|
+ return myerrors.TipsError("项目不存在")
|
|
|
+ }
|
|
|
+ data.ProductLine = p.ProductLine
|
|
|
+
|
|
|
data.OrderStatus = "20"
|
|
|
service.SetCreatedInfo(data, s.GetCxtUserId(), s.GetCxtUserName())
|
|
|
|
|
|
@@ -188,6 +205,16 @@ func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.
|
|
|
}
|
|
|
|
|
|
err = s.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
|
|
|
+ if g.Config().GetBool("dingtalk.disable-for-dev") {
|
|
|
+ g.Log().Warning("disable-for-dev true 未创建钉钉审批!!!!!!!!!!!!")
|
|
|
+ data.OrderStatus = "30"
|
|
|
+ lastId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ return s.AddDynamicsByCurrentUser(tx, int(lastId), "创建工单", map[string]interface{}{})
|
|
|
+ }
|
|
|
+
|
|
|
// 更新项目调级
|
|
|
lastId, err := s.Dao.TX(tx).Data(data).InsertAndGetId()
|
|
|
if err != nil {
|
|
|
@@ -198,7 +225,7 @@ func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.
|
|
|
workflowSrv, _ := workflowService.NewFlowService(s.Ctx)
|
|
|
bizCode := gconv.String(lastId) + ":" + req.OrderTypeCode
|
|
|
|
|
|
- workflowId, err := workflowSrv.StartProcessInstance(bizCode, workflowModel.ProjectToReserve, "", &workflow.StartProcessInstanceRequest{
|
|
|
+ workflowId, err := workflowSrv.StartProcessInstance(bizCode, workflowModel.WorkOrderCreate, "", &workflow.StartProcessInstanceRequest{
|
|
|
ProcessCode: &req.OrderTypeCode,
|
|
|
FormComponentValues: formComponentValues,
|
|
|
})
|
|
|
@@ -207,6 +234,7 @@ func (s *OrderService) CreateWorkOrder(req *model.WorkOrderReq, args *multipart.
|
|
|
g.Log().Error(err)
|
|
|
return err
|
|
|
}
|
|
|
+ err = s.AddDynamicsByCurrentUser(tx, int(lastId), "创建工单", map[string]interface{}{})
|
|
|
return err
|
|
|
})
|
|
|
return
|
|
|
@@ -334,3 +362,148 @@ func (s *OrderService) GetWorkOrderFeedbackByDay(req *model.WorkOrderFeedbackSea
|
|
|
}
|
|
|
return
|
|
|
}
|
|
|
+
|
|
|
+func (s *OrderService) Finish(ctx context.Context, req *model.WorkOrderFinishReq) error {
|
|
|
+ ent, err := s.Dao.Where("id = ?", req.OrderId).One()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if ent == nil {
|
|
|
+ return myerrors.TipsError("工单不存在")
|
|
|
+ }
|
|
|
+ if ent.OrderStatus != "30" {
|
|
|
+ return myerrors.TipsError("当前工单不可完成")
|
|
|
+ }
|
|
|
+
|
|
|
+ return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
|
|
|
+ _, err = tx.Update("work_order", map[string]interface{}{
|
|
|
+ "order_status": "60",
|
|
|
+ "finish_remark": req.FinishRemark,
|
|
|
+ "finish_time": gtime.Now(),
|
|
|
+ "finish_by": s.CxtUser.Id,
|
|
|
+ "finish_by_name": s.CxtUser.NickName,
|
|
|
+ "updated_by": s.CxtUser.Id,
|
|
|
+ "updated_name": s.CxtUser.NickName,
|
|
|
+ "updated_time": gtime.Now(),
|
|
|
+ }, "id = ?", req.OrderId)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ err = s.AddDynamicsByCurrentUser(tx, int(req.OrderId), "完成工单", map[string]interface{}{})
|
|
|
+ return err
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func (s *OrderService) Close(ctx context.Context, req *model.WorkOrderCloseReq) error {
|
|
|
+ ent, err := s.Dao.Where("id = ?", req.OrderId).One()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if ent == nil {
|
|
|
+ return myerrors.TipsError("工单不存在")
|
|
|
+ }
|
|
|
+ if !(ent.OrderStatus == "30" || ent.OrderStatus == "10") {
|
|
|
+ return myerrors.TipsError("当前工单不可关闭")
|
|
|
+ }
|
|
|
+ return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
|
|
|
+ _, err = tx.Update("work_order", map[string]interface{}{
|
|
|
+ "order_status": "50",
|
|
|
+ "updated_by": s.CxtUser.Id,
|
|
|
+ "updated_name": s.CxtUser.NickName,
|
|
|
+ "updated_time": gtime.Now(),
|
|
|
+ }, "id = ?", req.OrderId)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ err = s.AddDynamicsByCurrentUser(tx, int(req.OrderId), "关闭工单", map[string]interface{}{})
|
|
|
+ return err
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func (s *OrderService) AddDynamics(ctx context.Context, req *model.WorkOrderAddDynamics) error {
|
|
|
+ return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
|
|
|
+ return s.AddDynamicsByCurrentUser(tx, req.OrderId, "添加动态", map[string]interface{}{
|
|
|
+ "content": req.Content,
|
|
|
+ })
|
|
|
+ })
|
|
|
+}
|
|
|
+
|
|
|
+func (s OrderService) AddDynamicsByCurrentUser(tx *gdb.TX, orderId int, opnType string, content map[string]interface{}) error {
|
|
|
+ contentByte, err := json.Marshal(content)
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ _, err = tx.InsertAndGetId("work_order_dynamics", model.WorkOrderDynamics{
|
|
|
+ OrderId: orderId,
|
|
|
+ OpnPeopleId: s.CxtUser.Id,
|
|
|
+ OpnPeople: s.CxtUser.NickName,
|
|
|
+ OpnDate: gtime.Now(),
|
|
|
+ OpnType: opnType,
|
|
|
+ OpnContent: string(contentByte),
|
|
|
+ Remark: "",
|
|
|
+ CreatedBy: s.CxtUser.Id,
|
|
|
+ CreatedName: s.CxtUser.NickName,
|
|
|
+ CreatedTime: gtime.Now(),
|
|
|
+ UpdatedBy: s.CxtUser.Id,
|
|
|
+ UpdatedName: s.CxtUser.NickName,
|
|
|
+ UpdatedTime: gtime.Now(),
|
|
|
+ })
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+func (s *OrderService) DynamicsList(ctx context.Context, req *model.WorkOrderDynamicsListReq) (int, interface{}, error) {
|
|
|
+ dao := &s.DynamicsDao.WorkOrderDynamicsDao
|
|
|
+ if req.SearchText != "" {
|
|
|
+ likestr := fmt.Sprintf("%%%s%%", req.SearchText)
|
|
|
+ dao = dao.Where("(opn_people LIKE ? || opn_content LIKE ?)", likestr, likestr)
|
|
|
+ }
|
|
|
+ if req.OrderId != 0 {
|
|
|
+ dao = dao.Where("order_id = ?", req.OrderId)
|
|
|
+ }
|
|
|
+ if req.OpnPeopleId != 0 {
|
|
|
+ dao = dao.Where("opn_people_id = ?", req.OpnPeopleId)
|
|
|
+ }
|
|
|
+ if req.OpnPeople != "" {
|
|
|
+ likestr := fmt.Sprintf("%%%s%%", req.OpnPeople)
|
|
|
+ dao = dao.Where("opn_people like ?", likestr)
|
|
|
+ }
|
|
|
+ if req.OpnType != "" {
|
|
|
+ dao = dao.Where("opn_type = ?", req.OpnType)
|
|
|
+ }
|
|
|
+ // if req.OpnContent != "" {
|
|
|
+ // likestr := fmt.Sprintf("%%%s%%", req.OpnContent)
|
|
|
+ // dao = dao.Where("opn_content like ?", likestr)
|
|
|
+ // }
|
|
|
+ if req.BeginTime != "" {
|
|
|
+ dao = dao.Where("created_time > ?", req.BeginTime)
|
|
|
+ }
|
|
|
+ if req.EndTime != "" {
|
|
|
+ dao = dao.Where("created_time < ?", req.EndTime)
|
|
|
+ }
|
|
|
+
|
|
|
+ total, err := dao.Count()
|
|
|
+ if err != nil {
|
|
|
+ return 0, nil, err
|
|
|
+ }
|
|
|
+ if req.PageNum != 0 {
|
|
|
+ dao = dao.Page(req.GetPage())
|
|
|
+ }
|
|
|
+ orderby := "created_time desc"
|
|
|
+ if req.OrderBy != "" {
|
|
|
+ orderby = req.OrderBy
|
|
|
+ }
|
|
|
+ dao = dao.Order(orderby)
|
|
|
+
|
|
|
+ ents := []*model.WorkOrderDynamics{}
|
|
|
+ err = dao.Structs(&ents)
|
|
|
+ if err != nil && err != sql.ErrNoRows {
|
|
|
+ return 0, nil, err
|
|
|
+ }
|
|
|
+
|
|
|
+ ret := map[string][]*model.WorkOrderDynamics{}
|
|
|
+ for _, ent := range ents {
|
|
|
+ date := ent.OpnDate.Format("Y-m-d")
|
|
|
+ ret[date] = append(ret[date], ent)
|
|
|
+ }
|
|
|
+ return total, ret, err
|
|
|
+}
|