|
|
@@ -2,16 +2,17 @@ package proj
|
|
|
|
|
|
import (
|
|
|
"context"
|
|
|
+ projDao "dashoo.cn/micro/app/dao/proj"
|
|
|
+ model "dashoo.cn/micro/app/model/proj"
|
|
|
+ "dashoo.cn/micro/app/service"
|
|
|
+ "dashoo.cn/opms_libary/myerrors"
|
|
|
+ "dashoo.cn/opms_libary/utils"
|
|
|
"github.com/gogf/gf/database/gdb"
|
|
|
"github.com/gogf/gf/errors/gerror"
|
|
|
"github.com/gogf/gf/frame/g"
|
|
|
"github.com/gogf/gf/os/gtime"
|
|
|
"github.com/gogf/gf/util/gconv"
|
|
|
"strings"
|
|
|
-
|
|
|
- projDao "dashoo.cn/micro/app/dao/proj"
|
|
|
- model "dashoo.cn/micro/app/model/proj"
|
|
|
- "dashoo.cn/micro/app/service"
|
|
|
)
|
|
|
|
|
|
type businessService struct {
|
|
|
@@ -64,6 +65,66 @@ func (p *businessService) GetBusinessProduct(id int64) (productList []*model.Pro
|
|
|
return
|
|
|
}
|
|
|
|
|
|
+func (p *businessService) GetBusinessDynamics(req *model.BusinessReq) (total int, result g.ListStrAny, err error) {
|
|
|
+ result = make(g.ListStrAny, 0)
|
|
|
+ dynamicsDao := projDao.NewProjBusinessDynamicsDao(p.Tenant).ProjBusinessDynamicsDao.Where(projDao.ProjBusinessDynamics.Columns.BusId, req.BusId)
|
|
|
+ total, err = dynamicsDao.Count()
|
|
|
+ if err != nil {
|
|
|
+ g.Log().Error(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ dynamicsList, err := dynamicsDao.Page(req.GetPage()).Order("created_time desc").All()
|
|
|
+ if err != nil || len(dynamicsList) == 0 {
|
|
|
+ g.Log().Error(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 数据树格式转换
|
|
|
+ opnDateFlag := gtime.New(dynamicsList[0].OpnDate).Format("Y-m-d")
|
|
|
+ for k, v := range dynamicsList {
|
|
|
+ opnDate := gtime.New(v.OpnDate).Format("Y-m-d")
|
|
|
+ if opnDateFlag == opnDate && k != 0 {
|
|
|
+ result[len(result)-1][opnDate] = append(result[len(result)-1][opnDate].(g.ListStrAny), g.Map{
|
|
|
+ "opnPeople": v.OpnPeople,
|
|
|
+ "opnDate": v.OpnDate,
|
|
|
+ "opnType": v.OpnType,
|
|
|
+ "opnContent": gconv.Map(v.OpnContent),
|
|
|
+ })
|
|
|
+ } else {
|
|
|
+ temp := make(g.ListStrAny, 0)
|
|
|
+ temp = append(temp, g.Map{
|
|
|
+ "opnPeople": v.OpnPeople,
|
|
|
+ "opnDate": v.OpnDate,
|
|
|
+ "opnType": v.OpnType,
|
|
|
+ "opnContent": gconv.Map(v.OpnContent),
|
|
|
+ })
|
|
|
+ result = append(result, g.Map{
|
|
|
+ opnDate: temp,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
+func (p *businessService) GetBusinessDynamicsList(req *model.BusinessReq) (total int, list []map[string]interface{}, err error) {
|
|
|
+ dynamicsDao := projDao.NewProjBusinessDynamicsDao(p.Tenant).ProjBusinessDynamicsDao.Where(projDao.ProjBusinessDynamics.Columns.BusId, req.BusId)
|
|
|
+ if req.OpnType != "" {
|
|
|
+ dynamicsDao = dynamicsDao.Where(projDao.ProjBusinessDynamics.Columns.OpnType+" = ?", req.OpnType)
|
|
|
+ }
|
|
|
+ total, err = dynamicsDao.Count()
|
|
|
+ if err != nil {
|
|
|
+ g.Log().Error(err)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ dynamicsList, err := dynamicsDao.Page(req.GetPage()).Order("created_time desc").All()
|
|
|
+ for _, v := range dynamicsList {
|
|
|
+ val := gconv.Map(v)
|
|
|
+ val["opnContent"] = gconv.Map(v.OpnContent)
|
|
|
+ list = append(list, val)
|
|
|
+ }
|
|
|
+ return
|
|
|
+}
|
|
|
+
|
|
|
func (p *businessService) Create(req *model.AddProjBusinessReq) (err error) {
|
|
|
businessData := new(model.ProjBusiness)
|
|
|
if err = gconv.Struct(req, businessData); err != nil {
|
|
|
@@ -73,20 +134,27 @@ func (p *businessService) Create(req *model.AddProjBusinessReq) (err error) {
|
|
|
if err = gconv.Structs(req.Products, &products); err != nil {
|
|
|
return
|
|
|
}
|
|
|
+ var totalPrice float64
|
|
|
+ for _, v := range products {
|
|
|
+ v.TotalPrice = v.ProdPrice * float64(v.ProdNum)
|
|
|
+ totalPrice += v.TotalPrice
|
|
|
+ service.SetCreatedInfo(v, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
+ }
|
|
|
|
|
|
+ businessData.NboType = "C"
|
|
|
+ businessData.ApproStatus = "10"
|
|
|
+ businessData.EstTransPrice = totalPrice
|
|
|
+ businessData.DeptId = p.GetCxtUserDeptId()
|
|
|
service.SetCreatedInfo(businessData, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
|
|
|
// 添加项目
|
|
|
- res, err := p.Dao.TX(tx).Insert(businessData)
|
|
|
+ lastId, err := p.Dao.TX(tx).InsertAndGetId(businessData)
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
// 处理项目产品信息
|
|
|
- lastId, _ := res.LastInsertId()
|
|
|
for _, v := range products {
|
|
|
v.BusId = int(lastId)
|
|
|
- v.TotalPrice = v.SellingPrice * v.Quantity
|
|
|
- service.SetCreatedInfo(v, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
}
|
|
|
// 添加项目产品
|
|
|
_, err = projDao.NewProjBusinessProductDao(p.Tenant).TX(tx).Insert(products)
|
|
|
@@ -95,15 +163,11 @@ func (p *businessService) Create(req *model.AddProjBusinessReq) (err error) {
|
|
|
}
|
|
|
// 添加项目动态
|
|
|
dynamics := model.ProjBusinessDynamics{
|
|
|
- OpnPeopleId: p.GetCxtUserId(),
|
|
|
- OpnPeople: p.GetCxtUserName(),
|
|
|
- OpnDate: gtime.Now(),
|
|
|
- OpnType: "CREATED",
|
|
|
- OpnContent: "创建项目",
|
|
|
- Remark: gconv.String(businessData),
|
|
|
+ BusId: int(lastId),
|
|
|
+ OpnType: "10",
|
|
|
+ Remark: businessData.Remark,
|
|
|
}
|
|
|
- service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
- _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
|
|
|
+ err = p.CreateProjBusinessDynamics(tx, dynamics, businessData)
|
|
|
return err
|
|
|
})
|
|
|
|
|
|
@@ -130,15 +194,11 @@ func (p *businessService) UpdateById(req *model.UpdateProjBusinessReq) (err erro
|
|
|
}
|
|
|
// 添加项目动态
|
|
|
dynamics := model.ProjBusinessDynamics{
|
|
|
- OpnPeopleId: p.GetCxtUserId(),
|
|
|
- OpnPeople: p.GetCxtUserName(),
|
|
|
- OpnDate: gtime.Now(),
|
|
|
- OpnType: "UPDATED",
|
|
|
- OpnContent: "编辑项目",
|
|
|
- Remark: gconv.String(businessData),
|
|
|
+ BusId: req.Id,
|
|
|
+ OpnType: "20",
|
|
|
+ Remark: businessData.Remark,
|
|
|
}
|
|
|
- service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
- _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
|
|
|
+ err = p.CreateProjBusinessDynamics(tx, dynamics, businessData)
|
|
|
return err
|
|
|
})
|
|
|
return
|
|
|
@@ -149,75 +209,135 @@ func (p *businessService) DeleteByIds(ids []int64) (err error) {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-// 项目调级
|
|
|
+// BusinessTransfer 项目转移
|
|
|
+func (p *businessService) BusinessTransfer(req *model.BusinessTransferReq) error {
|
|
|
+ business, err := p.Dao.WherePri(req.Id).One()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ if business == nil {
|
|
|
+ return myerrors.NewMsgError(nil, "项目不存在")
|
|
|
+ }
|
|
|
+ businessMap := g.Map{
|
|
|
+ p.Dao.Columns.SaleId: req.UserId,
|
|
|
+ p.Dao.Columns.SaleName: req.UserName,
|
|
|
+ p.Dao.Columns.Remark: req.Remark,
|
|
|
+ }
|
|
|
+ service.SetUpdatedInfo(businessMap, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
+
|
|
|
+ opnContent := businessMap
|
|
|
+ opnContent["origSaleId"] = business.SaleId
|
|
|
+ opnContent["origSaleName"] = business.SaleName
|
|
|
+ err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
|
|
|
+ // 更新项目
|
|
|
+ _, err = p.Dao.TX(tx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Data(businessMap).Update()
|
|
|
+ if err != nil {
|
|
|
+ return err
|
|
|
+ }
|
|
|
+ // 添加项目动态
|
|
|
+ dynamics := model.ProjBusinessDynamics{
|
|
|
+ BusId: req.Id,
|
|
|
+ OpnType: "30",
|
|
|
+ Remark: req.Remark,
|
|
|
+ }
|
|
|
+ err = p.CreateProjBusinessDynamics(tx, dynamics, opnContent)
|
|
|
+ return err
|
|
|
+ })
|
|
|
+ return err
|
|
|
+}
|
|
|
+
|
|
|
+// BusinessGradation 项目调级
|
|
|
func (p *businessService) BusinessGradation(req *model.BusinessGradationReq) error {
|
|
|
- var business model.ProjBusiness
|
|
|
- err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).Scan(&business)
|
|
|
+ business, err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).One()
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
+ if business == nil {
|
|
|
+ return myerrors.NewMsgError(nil, "项目不存在")
|
|
|
+ }
|
|
|
if business.NboType == req.NboType {
|
|
|
- return gerror.New("同级无法进行调级。")
|
|
|
+ return myerrors.NewMsgError(nil, "同级无法进行调级。")
|
|
|
}
|
|
|
+ opnType := "40"
|
|
|
opnContent := "项目升级 " + business.NboType + " => " + req.NboType
|
|
|
// A < B return -1 项目降级
|
|
|
if strings.Compare(business.NboType, req.NboType) < 0 {
|
|
|
opnContent = "项目降级 " + business.NboType + " => " + req.NboType
|
|
|
+ opnType = "50"
|
|
|
}
|
|
|
- business.NboType = req.NboType
|
|
|
- service.SetUpdatedInfo(business, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
|
|
|
+ businessMap := g.Map{
|
|
|
+ p.Dao.Columns.NboType: req.NboType,
|
|
|
+ }
|
|
|
+ service.SetUpdatedInfo(businessMap, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
|
|
|
// 更新项目调级
|
|
|
- _, err = p.Dao.TX(tx).Fields(p.Dao.Columns.NboType).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Update(business)
|
|
|
+ _, err = p.Dao.TX(tx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Data(businessMap).Update()
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
// 添加项目动态
|
|
|
dynamics := model.ProjBusinessDynamics{
|
|
|
- OpnPeopleId: p.GetCxtUserId(),
|
|
|
- OpnPeople: p.GetCxtUserName(),
|
|
|
- OpnDate: gtime.Now(),
|
|
|
- OpnType: "UPDATED",
|
|
|
- OpnContent: opnContent,
|
|
|
+ BusId: business.Id,
|
|
|
+ OpnType: opnType,
|
|
|
}
|
|
|
- service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
- _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
|
|
|
+ err = p.CreateProjBusinessDynamics(tx, dynamics, opnContent)
|
|
|
return err
|
|
|
})
|
|
|
return err
|
|
|
}
|
|
|
|
|
|
-// 项目转移
|
|
|
-func (p *businessService) BusinessTransfer(req *model.BusinessTransferReq) error {
|
|
|
- var business model.ProjBusiness
|
|
|
- err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).Scan(&business)
|
|
|
+// SetPrimacyContact 项目设置首要联系人
|
|
|
+func (p *businessService) SetPrimacyContact(req *model.BusinessPrimacyContactReq) (err error) {
|
|
|
+ business, err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).One()
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
- business.SaleId = req.UserId
|
|
|
- business.SaleName = req.UserName
|
|
|
- business.Remark = req.Remark
|
|
|
- service.SetUpdatedInfo(business, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
+ if business == nil {
|
|
|
+ return myerrors.NewMsgError(nil, "项目不存在")
|
|
|
+ }
|
|
|
+ businessMap := g.Map{
|
|
|
+ p.Dao.Columns.ContactId: req.ContactId,
|
|
|
+ p.Dao.Columns.ContactName: req.ContactName,
|
|
|
+ p.Dao.Columns.ContactPostion: req.ContactPostion,
|
|
|
+ p.Dao.Columns.ContactTelephone: req.ContactTelephone,
|
|
|
+ }
|
|
|
+ service.SetUpdatedInfo(businessMap, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
|
|
|
+ opnContent := businessMap
|
|
|
+ opnContent["origContactId"] = business.ContactId
|
|
|
+ opnContent["origContactName"] = business.ContactName
|
|
|
+ opnContent["origContactPostion"] = business.ContactPostion
|
|
|
+ opnContent["origContactTelephone"] = business.ContactTelephone
|
|
|
err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
|
|
|
- // 更新项目调级
|
|
|
- _, err = p.Dao.TX(tx).Fields(p.Dao.Columns.SaleId, p.Dao.Columns.SaleName).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Update(business)
|
|
|
+ // 更新项目
|
|
|
+ _, err = p.Dao.TX(tx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Data(businessMap).Update()
|
|
|
if err != nil {
|
|
|
return err
|
|
|
}
|
|
|
// 添加项目动态
|
|
|
dynamics := model.ProjBusinessDynamics{
|
|
|
- OpnPeopleId: p.GetCxtUserId(),
|
|
|
- OpnPeople: p.GetCxtUserName(),
|
|
|
- OpnDate: gtime.Now(),
|
|
|
- OpnType: "UPDATED",
|
|
|
- OpnContent: "项目转移",
|
|
|
- Remark: gconv.String(business),
|
|
|
+ BusId: req.Id,
|
|
|
+ OpnType: "60",
|
|
|
+ Remark: req.Remark,
|
|
|
}
|
|
|
- service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
- _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
|
|
|
+ err = p.CreateProjBusinessDynamics(tx, dynamics, opnContent)
|
|
|
return err
|
|
|
})
|
|
|
return err
|
|
|
}
|
|
|
+
|
|
|
+// CreateProjBusinessDynamics 创建项目动态
|
|
|
+func (p *businessService) CreateProjBusinessDynamics(tx *gdb.TX, dynamics model.ProjBusinessDynamics, opnContent interface{}) error {
|
|
|
+ if v, ok := opnContent.(g.Map); ok {
|
|
|
+ opnContent = utils.MapKeySnakeCamelCase(v)
|
|
|
+ }
|
|
|
+ // 添加项目动态
|
|
|
+ dynamics.OpnPeopleId = p.GetCxtUserId()
|
|
|
+ dynamics.OpnPeople = p.GetCxtUserName()
|
|
|
+ dynamics.OpnDate = gtime.Now()
|
|
|
+ dynamics.OpnContent = gconv.String(opnContent)
|
|
|
+ service.SetCreatedInfo(&dynamics, p.GetCxtUserId(), p.GetCxtUserName())
|
|
|
+ _, err := projDao.NewProjBusinessDynamicsDao(p.Tenant).TX(tx).Insert(&dynamics)
|
|
|
+ return err
|
|
|
+}
|