business.go 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. package proj
  2. import (
  3. "context"
  4. "github.com/gogf/gf/database/gdb"
  5. "github.com/gogf/gf/errors/gerror"
  6. "github.com/gogf/gf/frame/g"
  7. "github.com/gogf/gf/os/gtime"
  8. "github.com/gogf/gf/util/gconv"
  9. "strings"
  10. projDao "dashoo.cn/micro/app/dao/proj"
  11. model "dashoo.cn/micro/app/model/proj"
  12. "dashoo.cn/micro/app/service"
  13. )
  14. type businessService struct {
  15. *service.ContextService
  16. Dao *projDao.ProjBusinessDao
  17. }
  18. func NewBusinessService(ctx context.Context) (svc *businessService, err error) {
  19. svc = new(businessService)
  20. if svc.ContextService, err = svc.Init(ctx); err != nil {
  21. return nil, err
  22. }
  23. svc.Dao = projDao.NewProjBusinessDao(svc.Tenant)
  24. return svc, nil
  25. }
  26. func (p *businessService) GetList(req *model.ProjBusinessSearchReq) (total int, businessList []*model.ProjBusiness, err error) {
  27. db := p.Dao.M
  28. if req.NboName != "" {
  29. db = db.WhereLike(p.Dao.Columns.NboName, "%"+req.NboName+"%")
  30. }
  31. if req.CustName != "" {
  32. db = db.WhereLike(p.Dao.Columns.CustName, "%"+req.CustName+"%")
  33. }
  34. if req.SaleName != "" {
  35. db = db.WhereLike(p.Dao.Columns.SaleName, "%"+req.SaleName+"%")
  36. }
  37. if req.NboType != "" {
  38. db = db.Where(p.Dao.Columns.NboType, req.NboType)
  39. }
  40. total, err = db.Count()
  41. if err != nil {
  42. g.Log().Error(err)
  43. err = gerror.New("获取总行数失败")
  44. return
  45. }
  46. err = db.Page(req.PageNum, req.PageSize).Order("id asc").Scan(&businessList)
  47. return
  48. }
  49. func (p *businessService) GetEntityById(id int64) (business *model.ProjBusiness, err error) {
  50. err = p.Dao.Where(projDao.ProjBusiness.Columns.Id, id).Scan(&business)
  51. return
  52. }
  53. func (p *businessService) GetBusinessProduct(id int64) (productList []*model.ProjBusinessProduct, err error) {
  54. productDao := projDao.NewProjBusinessProductDao(p.Tenant)
  55. err = productDao.Where(productDao.ProjBusinessProductDao.Columns.BusId, id).Scan(&productList)
  56. return
  57. }
  58. func (p *businessService) Create(req *model.AddProjBusinessReq) (err error) {
  59. businessData := new(model.ProjBusiness)
  60. if err = gconv.Struct(req, businessData); err != nil {
  61. return
  62. }
  63. products := make([]*model.ProjBusinessProduct, len(req.Products))
  64. if err = gconv.Structs(req.Products, &products); err != nil {
  65. return
  66. }
  67. service.SetCreatedInfo(businessData, p.GetCxtUserId(), p.GetCxtUserName())
  68. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  69. // 添加项目
  70. res, err := p.Dao.TX(tx).Insert(businessData)
  71. if err != nil {
  72. return err
  73. }
  74. // 处理项目产品信息
  75. lastId, _ := res.LastInsertId()
  76. for _, v := range products {
  77. v.BusId = int(lastId)
  78. v.TotalPrice = v.SellingPrice * v.Quantity
  79. service.SetCreatedInfo(v, p.GetCxtUserId(), p.GetCxtUserName())
  80. }
  81. // 添加项目产品
  82. _, err = projDao.NewProjBusinessProductDao(p.Tenant).TX(tx).Insert(products)
  83. if err != nil {
  84. return err
  85. }
  86. // 添加项目动态
  87. dynamics := model.ProjBusinessDynamics{
  88. OpnPeopleId: p.GetCxtUserId(),
  89. OpnPeople: p.GetCxtUserName(),
  90. OpnDate: gtime.Now(),
  91. OpnType: "CREATED",
  92. OpnContent: "创建项目",
  93. Remark: gconv.String(businessData),
  94. }
  95. service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
  96. _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
  97. return err
  98. })
  99. return
  100. }
  101. func (p *businessService) UpdateById(req *model.UpdateProjBusinessReq) (err error) {
  102. record, err := p.Dao.Count("Id", req.Id)
  103. if err != nil || record == 0 {
  104. err = gerror.New("该数据不存在")
  105. return err
  106. }
  107. businessData := new(model.ProjBusiness)
  108. if err = gconv.Struct(req, businessData); err != nil {
  109. return
  110. }
  111. service.SetUpdatedInfo(businessData, p.GetCxtUserId(), p.GetCxtUserName())
  112. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  113. // 更新项目
  114. _, err = p.Dao.TX(tx).FieldsEx(service.UpdateFieldEx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Update(businessData)
  115. if err != nil {
  116. return err
  117. }
  118. // 添加项目动态
  119. dynamics := model.ProjBusinessDynamics{
  120. OpnPeopleId: p.GetCxtUserId(),
  121. OpnPeople: p.GetCxtUserName(),
  122. OpnDate: gtime.Now(),
  123. OpnType: "UPDATED",
  124. OpnContent: "编辑项目",
  125. Remark: gconv.String(businessData),
  126. }
  127. service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
  128. _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
  129. return err
  130. })
  131. return
  132. }
  133. func (p *businessService) DeleteByIds(ids []int64) (err error) {
  134. _, err = p.Dao.WhereIn(projDao.ProjBusiness.Columns.Id, ids).Delete()
  135. return
  136. }
  137. // 项目调级
  138. func (p *businessService) BusinessGradation(req *model.BusinessGradationReq) error {
  139. var business model.ProjBusiness
  140. err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).Scan(&business)
  141. if err != nil {
  142. return err
  143. }
  144. if business.NboType == req.NboType {
  145. return gerror.New("同级无法进行调级。")
  146. }
  147. opnContent := "项目升级 " + business.NboType + " => " + req.NboType
  148. // A < B return -1 项目降级
  149. if strings.Compare(business.NboType, req.NboType) < 0 {
  150. opnContent = "项目降级 " + business.NboType + " => " + req.NboType
  151. }
  152. business.NboType = req.NboType
  153. service.SetUpdatedInfo(business, p.GetCxtUserId(), p.GetCxtUserName())
  154. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  155. // 更新项目调级
  156. _, err = p.Dao.TX(tx).Fields(p.Dao.Columns.NboType).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Update(business)
  157. if err != nil {
  158. return err
  159. }
  160. // 添加项目动态
  161. dynamics := model.ProjBusinessDynamics{
  162. OpnPeopleId: p.GetCxtUserId(),
  163. OpnPeople: p.GetCxtUserName(),
  164. OpnDate: gtime.Now(),
  165. OpnType: "UPDATED",
  166. OpnContent: opnContent,
  167. }
  168. service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
  169. _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
  170. return err
  171. })
  172. return err
  173. }
  174. // 项目转移
  175. func (p *businessService) BusinessTransfer(req *model.BusinessTransferReq) error {
  176. var business model.ProjBusiness
  177. err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).Scan(&business)
  178. if err != nil {
  179. return err
  180. }
  181. business.SaleId = req.UserId
  182. business.SaleName = req.UserName
  183. business.Remark = req.Remark
  184. service.SetUpdatedInfo(business, p.GetCxtUserId(), p.GetCxtUserName())
  185. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  186. // 更新项目调级
  187. _, err = p.Dao.TX(tx).Fields(p.Dao.Columns.SaleId, p.Dao.Columns.SaleName).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Update(business)
  188. if err != nil {
  189. return err
  190. }
  191. // 添加项目动态
  192. dynamics := model.ProjBusinessDynamics{
  193. OpnPeopleId: p.GetCxtUserId(),
  194. OpnPeople: p.GetCxtUserName(),
  195. OpnDate: gtime.Now(),
  196. OpnType: "UPDATED",
  197. OpnContent: "项目转移",
  198. Remark: gconv.String(business),
  199. }
  200. service.SetCreatedInfo(dynamics, p.GetCxtUserId(), p.GetCxtUserName())
  201. _, err = projDao.NewProjBusinessDao(p.Tenant).TX(tx).Insert(&dynamics)
  202. return err
  203. })
  204. return err
  205. }