business.go 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. package proj
  2. import (
  3. "context"
  4. projDao "dashoo.cn/micro/app/dao/proj"
  5. model "dashoo.cn/micro/app/model/proj"
  6. "dashoo.cn/micro/app/service"
  7. "dashoo.cn/opms_libary/myerrors"
  8. "dashoo.cn/opms_libary/utils"
  9. "github.com/gogf/gf/database/gdb"
  10. "github.com/gogf/gf/frame/g"
  11. "github.com/gogf/gf/os/gtime"
  12. "github.com/gogf/gf/util/gconv"
  13. "strconv"
  14. "strings"
  15. )
  16. type businessService struct {
  17. *service.ContextService
  18. Dao *projDao.ProjBusinessDao
  19. }
  20. func NewBusinessService(ctx context.Context) (svc *businessService, err error) {
  21. svc = new(businessService)
  22. if svc.ContextService, err = svc.Init(ctx); err != nil {
  23. return nil, err
  24. }
  25. svc.Dao = projDao.NewProjBusinessDao(svc.Tenant)
  26. return svc, nil
  27. }
  28. func (p *businessService) GetList(req *model.ProjBusinessSearchReq) (total int, businessList []*model.ProjBusiness, err error) {
  29. db := p.Dao.M
  30. if req.NboName != "" {
  31. db = db.WhereLike(p.Dao.Columns.NboName, "%"+req.NboName+"%")
  32. }
  33. if req.CustName != "" {
  34. db = db.WhereLike(p.Dao.Columns.CustName, "%"+req.CustName+"%")
  35. }
  36. if req.SaleName != "" {
  37. db = db.WhereLike(p.Dao.Columns.SaleName, "%"+req.SaleName+"%")
  38. }
  39. if req.NboType != "" {
  40. db = db.Where(p.Dao.Columns.NboType, req.NboType)
  41. }
  42. total, err = db.Count()
  43. if err != nil {
  44. g.Log().Error(err)
  45. err = myerrors.DbError("获取总行数失败。")
  46. return
  47. }
  48. err = db.Page(req.PageNum, req.PageSize).Order("id asc").Scan(&businessList)
  49. return
  50. }
  51. func (p *businessService) GetEntityById(id int64) (business *model.ProjBusiness, err error) {
  52. err = p.Dao.Where(projDao.ProjBusiness.Columns.Id, id).Scan(&business)
  53. return
  54. }
  55. func (p *businessService) GetBusinessProduct(id int64) (productList []*model.ProjBusinessProduct, err error) {
  56. productDao := projDao.NewProjBusinessProductDao(p.Tenant)
  57. err = productDao.Where(productDao.ProjBusinessProductDao.Columns.BusId, id).Scan(&productList)
  58. return
  59. }
  60. func (p *businessService) GetBusinessDynamics(req *model.BusinessReq) (total int, result g.MapStrAny, err error) {
  61. result = make(g.MapStrAny, 0)
  62. dynamicsDao := projDao.NewProjBusinessDynamicsDao(p.Tenant).ProjBusinessDynamicsDao.Where(projDao.ProjBusinessDynamics.Columns.BusId, req.BusId)
  63. total, err = dynamicsDao.Count()
  64. if err != nil {
  65. g.Log().Error(err)
  66. return
  67. }
  68. dynamicsList, err := dynamicsDao.Page(req.GetPage()).Order("created_time desc").All()
  69. if err != nil || dynamicsList == nil {
  70. return
  71. }
  72. // 数据树格式转换
  73. opnDateFlag := gtime.New(dynamicsList[0].OpnDate).Format("Y-m-d")
  74. for k, v := range dynamicsList {
  75. opnDate := gtime.New(v.OpnDate).Format("Y-m-d")
  76. if opnDateFlag == opnDate && k != 0 {
  77. result[opnDate] = append(result[opnDate].(g.ListStrAny), g.Map{
  78. "opnPeople": v.OpnPeople,
  79. "opnDate": v.OpnDate,
  80. "opnType": v.OpnType,
  81. "remark": v.Remark,
  82. "opnContent": gconv.Map(v.OpnContent),
  83. })
  84. } else {
  85. temp := make(g.ListStrAny, 0)
  86. temp = append(temp, g.Map{
  87. "opnPeople": v.OpnPeople,
  88. "opnDate": v.OpnDate,
  89. "opnType": v.OpnType,
  90. "remark": v.Remark,
  91. "opnContent": gconv.Map(v.OpnContent),
  92. })
  93. result[opnDate] = temp
  94. }
  95. }
  96. return
  97. }
  98. func (p *businessService) GetBusinessDynamicsList(req *model.BusinessReq) (total int, list []map[string]interface{}, err error) {
  99. dynamicsDao := projDao.NewProjBusinessDynamicsDao(p.Tenant).ProjBusinessDynamicsDao.Where(projDao.ProjBusinessDynamics.Columns.BusId, req.BusId)
  100. if req.OpnType != "" {
  101. dynamicsDao = dynamicsDao.Where(projDao.ProjBusinessDynamics.Columns.OpnType+" = ?", req.OpnType)
  102. }
  103. total, err = dynamicsDao.Count()
  104. if err != nil {
  105. g.Log().Error(err)
  106. return
  107. }
  108. dynamicsList, err := dynamicsDao.Page(req.GetPage()).Order("created_time desc").All()
  109. for _, v := range dynamicsList {
  110. val := gconv.Map(v)
  111. val["opnContent"] = gconv.Map(v.OpnContent)
  112. list = append(list, val)
  113. }
  114. return
  115. }
  116. func (p *businessService) Create(req *model.AddProjBusinessReq) (err error) {
  117. businessData := new(model.ProjBusiness)
  118. if err = gconv.Struct(req, businessData); err != nil {
  119. return
  120. }
  121. contact := g.Map{
  122. projDao.ProjBusinessContact.Columns.ContactId: req.ContactId,
  123. }
  124. service.SetCreatedInfo(contact, p.GetCxtUserId(), p.GetCxtUserName())
  125. products := make([]*model.ProjBusinessProduct, len(req.Products))
  126. if err = gconv.Structs(req.Products, &products); err != nil {
  127. return
  128. }
  129. var totalPrice float64
  130. for _, v := range products {
  131. v.TotalPrice = v.ProdPrice * float64(v.ProdNum)
  132. totalPrice += v.TotalPrice
  133. service.SetCreatedInfo(v, p.GetCxtUserId(), p.GetCxtUserName())
  134. }
  135. businessData.NboCode = "NBO" + strconv.Itoa(int(gtime.Timestamp()))
  136. businessData.NboStatus = "10"
  137. businessData.NboType = "C"
  138. businessData.ApproStatus = "10"
  139. businessData.EstTransPrice = totalPrice
  140. businessData.DeptId = p.GetCxtUserDeptId()
  141. service.SetCreatedInfo(businessData, p.GetCxtUserId(), p.GetCxtUserName())
  142. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  143. // 添加项目
  144. lastId, err := p.Dao.TX(tx).InsertAndGetId(businessData)
  145. if err != nil {
  146. return err
  147. }
  148. // 创建了联系人
  149. contact[projDao.ProjBusinessContact.Columns.BusId] = lastId
  150. _, err = projDao.NewProjBusinessContactDao(p.Tenant).TX(tx).Insert(contact)
  151. if err != nil {
  152. return err
  153. }
  154. // 处理项目产品信息
  155. for _, v := range products {
  156. v.BusId = int(lastId)
  157. }
  158. // 添加项目产品
  159. _, err = projDao.NewProjBusinessProductDao(p.Tenant).TX(tx).Insert(products)
  160. if err != nil {
  161. return err
  162. }
  163. // 添加项目动态
  164. dynamics := model.ProjBusinessDynamics{
  165. BusId: int(lastId),
  166. OpnType: "10",
  167. Remark: businessData.Remark,
  168. }
  169. err = p.CreateProjBusinessDynamics(tx, dynamics, businessData)
  170. return err
  171. })
  172. return
  173. }
  174. func (p *businessService) UpdateById(req *model.UpdateProjBusinessReq) error {
  175. record, err := p.Dao.Count("Id", req.Id)
  176. if err != nil {
  177. return err
  178. }
  179. if record == 0 {
  180. return myerrors.TipsError("项目不存在。")
  181. }
  182. businessData := gconv.Map(req)
  183. businessData = utils.MapKeySnakeCamelCase(businessData, "snake")
  184. products := make([]*model.ProjBusinessProduct, len(req.Products))
  185. if err = gconv.Structs(req.Products, &products); err != nil {
  186. return err
  187. }
  188. var totalPrice float64
  189. for _, v := range products {
  190. v.Id = 0
  191. v.BusId = req.Id
  192. v.TotalPrice = v.ProdPrice * float64(v.ProdNum)
  193. totalPrice += v.TotalPrice
  194. service.SetCreatedInfo(v, p.GetCxtUserId(), p.GetCxtUserName())
  195. }
  196. service.SetUpdatedInfo(businessData, p.GetCxtUserId(), p.GetCxtUserName())
  197. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  198. // 更新项目
  199. _, err = p.Dao.TX(tx).FieldsEx(service.UpdateFieldEx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Update(businessData)
  200. if err != nil {
  201. return err
  202. }
  203. // 添加项目产品
  204. _, err = projDao.NewProjBusinessProductDao(p.Tenant).TX(tx).Where(projDao.ProjBusinessProduct.Columns.BusId, req.Id).Delete()
  205. if err != nil {
  206. return err
  207. }
  208. // 添加项目产品
  209. _, err = projDao.NewProjBusinessProductDao(p.Tenant).TX(tx).Insert(products)
  210. if err != nil {
  211. return err
  212. }
  213. // 添加项目动态
  214. dynamics := model.ProjBusinessDynamics{
  215. BusId: req.Id,
  216. OpnType: "20",
  217. Remark: req.Remark,
  218. }
  219. err = p.CreateProjBusinessDynamics(tx, dynamics, req)
  220. return err
  221. })
  222. return err
  223. }
  224. func (p *businessService) DeleteByIds(ids []int64) (err error) {
  225. _, err = p.Dao.WhereIn(projDao.ProjBusiness.Columns.Id, ids).Delete()
  226. return
  227. }
  228. // BusinessTransfer 项目转移
  229. func (p *businessService) BusinessTransfer(req *model.BusinessTransferReq) error {
  230. business, err := p.Dao.WherePri(req.Id).One()
  231. if err != nil {
  232. return err
  233. }
  234. if business == nil {
  235. return myerrors.TipsError("项目不存在。")
  236. }
  237. businessMap := g.Map{
  238. p.Dao.Columns.SaleId: req.UserId,
  239. p.Dao.Columns.SaleName: req.UserName,
  240. p.Dao.Columns.Remark: req.Remark,
  241. }
  242. service.SetUpdatedInfo(businessMap, p.GetCxtUserId(), p.GetCxtUserName())
  243. opnContent := businessMap
  244. opnContent["origSaleId"] = business.SaleId
  245. opnContent["origSaleName"] = business.SaleName
  246. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  247. // 更新项目
  248. _, err = p.Dao.TX(tx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Data(businessMap).Update()
  249. if err != nil {
  250. return err
  251. }
  252. // 添加项目动态
  253. dynamics := model.ProjBusinessDynamics{
  254. BusId: req.Id,
  255. OpnType: "30",
  256. Remark: req.Remark,
  257. }
  258. err = p.CreateProjBusinessDynamics(tx, dynamics, opnContent)
  259. return err
  260. })
  261. return err
  262. }
  263. // BusinessGradation 项目调级
  264. func (p *businessService) BusinessGradation(req *model.BusinessGradationReq) error {
  265. business, err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).One()
  266. if err != nil {
  267. return err
  268. }
  269. if business == nil {
  270. return myerrors.TipsError("项目不存在。")
  271. }
  272. if business.NboType == req.NboType {
  273. return myerrors.TipsError("同级无法进行调级。")
  274. }
  275. opnType := "40"
  276. // A < B return -1 项目降级
  277. if strings.Compare(business.NboType, req.NboType) < 0 {
  278. opnType = "50"
  279. }
  280. businessMap := g.Map{
  281. p.Dao.Columns.NboType: req.NboType,
  282. }
  283. service.SetUpdatedInfo(businessMap, p.GetCxtUserId(), p.GetCxtUserName())
  284. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  285. // 更新项目调级
  286. _, err = p.Dao.TX(tx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Data(businessMap).Update()
  287. if err != nil {
  288. return err
  289. }
  290. // 添加项目动态
  291. dynamics := model.ProjBusinessDynamics{
  292. BusId: business.Id,
  293. OpnType: opnType,
  294. Remark: req.Remark,
  295. }
  296. err = p.CreateProjBusinessDynamics(tx, dynamics, g.Map{
  297. "origNboType": business.NboType,
  298. "nboType": req.NboType,
  299. })
  300. return err
  301. })
  302. return err
  303. }
  304. // SetPrimacyContact 项目设置首要联系人
  305. func (p *businessService) SetPrimacyContact(req *model.BusinessPrimacyContactReq) (err error) {
  306. business, err := p.Dao.Where(projDao.ProjBusiness.Columns.Id, req.Id).One()
  307. if err != nil {
  308. return err
  309. }
  310. if business == nil {
  311. return myerrors.TipsError("项目不存在。")
  312. }
  313. businessMap := g.Map{
  314. p.Dao.Columns.ContactId: req.ContactId,
  315. p.Dao.Columns.ContactName: req.ContactName,
  316. p.Dao.Columns.ContactPostion: req.ContactPostion,
  317. p.Dao.Columns.ContactTelephone: req.ContactTelephone,
  318. }
  319. service.SetUpdatedInfo(businessMap, p.GetCxtUserId(), p.GetCxtUserName())
  320. opnContent := businessMap
  321. opnContent["origContactId"] = business.ContactId
  322. opnContent["origContactName"] = business.ContactName
  323. opnContent["origContactPostion"] = business.ContactPostion
  324. opnContent["origContactTelephone"] = business.ContactTelephone
  325. err = p.Dao.Transaction(context.TODO(), func(ctx context.Context, tx *gdb.TX) error {
  326. // 更新项目
  327. _, err = p.Dao.TX(tx).WherePri(projDao.ProjBusiness.Columns.Id, req.Id).Data(businessMap).Update()
  328. if err != nil {
  329. return err
  330. }
  331. // 添加项目动态
  332. dynamics := model.ProjBusinessDynamics{
  333. BusId: req.Id,
  334. OpnType: "60",
  335. Remark: req.Remark,
  336. }
  337. err = p.CreateProjBusinessDynamics(tx, dynamics, opnContent)
  338. return err
  339. })
  340. return err
  341. }
  342. // CreateProjBusinessDynamics 创建项目动态
  343. func (p *businessService) CreateProjBusinessDynamics(tx *gdb.TX, dynamics model.ProjBusinessDynamics, opnContent interface{}) error {
  344. if v, ok := opnContent.(g.Map); ok {
  345. opnContent = utils.MapKeySnakeCamelCase(v)
  346. }
  347. // 添加项目动态
  348. dynamics.OpnPeopleId = p.GetCxtUserId()
  349. dynamics.OpnPeople = p.GetCxtUserName()
  350. dynamics.OpnDate = gtime.Now()
  351. dynamics.OpnContent = gconv.String(opnContent)
  352. service.SetCreatedInfo(&dynamics, p.GetCxtUserId(), p.GetCxtUserName())
  353. _, err := projDao.NewProjBusinessDynamicsDao(p.Tenant).TX(tx).Insert(&dynamics)
  354. return err
  355. }