deliver_order.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. package work
  2. import (
  3. "context"
  4. "database/sql"
  5. "fmt"
  6. "github.com/gogf/gf/os/glog"
  7. basedao "dashoo.cn/micro/app/dao/base"
  8. contractdao "dashoo.cn/micro/app/dao/contract"
  9. custdao "dashoo.cn/micro/app/dao/cust"
  10. projdao "dashoo.cn/micro/app/dao/proj"
  11. workdao "dashoo.cn/micro/app/dao/work"
  12. contractmodel "dashoo.cn/micro/app/model/contract"
  13. work "dashoo.cn/micro/app/model/work"
  14. "dashoo.cn/micro/app/service"
  15. "dashoo.cn/opms_libary/micro_srv"
  16. "dashoo.cn/opms_libary/myerrors"
  17. "dashoo.cn/opms_libary/request"
  18. "github.com/gogf/gf/database/gdb"
  19. "github.com/gogf/gf/frame/g"
  20. "github.com/gogf/gf/os/gtime"
  21. "github.com/gogf/gf/util/gvalid"
  22. )
  23. type DeliverOrderService struct {
  24. Dao *workdao.DeliverOrderDao
  25. PlanDao *workdao.DeliverOrderImpPlanDao
  26. ProductDao *workdao.DeliverOrderProductDao
  27. ContractDao *contractdao.CtrContractDao
  28. ProjBusinessDao *projdao.ProjBusinessDao
  29. CustomerDao *custdao.CustCustomerDao
  30. CtrProductDao *contractdao.CtrContractProductDao
  31. BaseProductDao *basedao.BaseProductDao
  32. Tenant string
  33. userInfo request.UserInfo
  34. DataScope g.Map `json:"dataScope"`
  35. }
  36. func NewDeliverOrderService(ctx context.Context) (*DeliverOrderService, error) {
  37. tenant, err := micro_srv.GetTenant(ctx)
  38. if err != nil {
  39. err = myerrors.TipsError(fmt.Sprintf("获取租户码异常:%s", err.Error()))
  40. return nil, err
  41. }
  42. // 获取用户信息
  43. userInfo, err := micro_srv.GetUserInfo(ctx)
  44. if err != nil {
  45. return nil, fmt.Errorf("获取用户信息异常:%s", err.Error())
  46. }
  47. return &DeliverOrderService{
  48. Dao: workdao.NewDeliverOrderDao(tenant),
  49. PlanDao: workdao.NewDeliverOrderImpPlanDao(tenant),
  50. ContractDao: contractdao.NewCtrContractDao(tenant),
  51. ProjBusinessDao: projdao.NewProjBusinessDao(tenant),
  52. CustomerDao: custdao.NewCustCustomerDao(tenant),
  53. CtrProductDao: contractdao.NewCtrContractProductDao(tenant),
  54. ProductDao: workdao.NewDeliverOrderProductDao(tenant),
  55. BaseProductDao: basedao.NewBaseProductDao(tenant),
  56. Tenant: tenant,
  57. userInfo: userInfo,
  58. DataScope: userInfo.DataScope,
  59. }, nil
  60. }
  61. func (s DeliverOrderService) Get(ctx context.Context, id int) (*work.DeliverOrderGetRsp, error) {
  62. ent, err := s.Dao.Where("Id = ?", id).One()
  63. if err != nil {
  64. return nil, err
  65. }
  66. if ent == nil {
  67. return nil, myerrors.TipsError("工单不存在")
  68. }
  69. plan, err := s.PlanDao.Where("deliver_order_id = ?", id).All()
  70. if err != nil {
  71. return nil, err
  72. }
  73. if plan == nil {
  74. plan = []*work.DeliverOrderImpPlan{}
  75. }
  76. product, err := s.ProductDao.Where("deliver_order_id = ?", id).All()
  77. if err != nil {
  78. return nil, err
  79. }
  80. if product == nil {
  81. product = []*work.DeliverOrderProduct{}
  82. }
  83. return &work.DeliverOrderGetRsp{
  84. DeliverOrder: *ent,
  85. Plan: plan,
  86. Product: product,
  87. }, nil
  88. }
  89. func (s DeliverOrderService) List(ctx context.Context, req *work.DeliverOrderListReq) (int, []*work.DeliverOrder, error) {
  90. g.Log().Infof("DeliverOrderService List roles %v", s.userInfo.Roles)
  91. dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("ctr_contract b", "a.contract_id=b.id").Unscoped().Where("a.deleted_time is null")
  92. // 销售只能看自己所属的,其他人只能看自己所属产品线的 (大区经理有可能同时具有销售角色,这里需要排除大区经理)
  93. if service.StringsContains(s.userInfo.Roles, "SalesEngineer") &&
  94. !service.StringsContains(s.userInfo.Roles, "RegionalManager") {
  95. dao = dao.Where("b.incharge_id = ?", s.userInfo.Id)
  96. // } else if service.StringsContains(s.userInfo.Roles, "ProjectDeliveryManager") {
  97. // dao = dao.Where("a.deliver_man_id = ?", s.userInfo.Id)
  98. // 项目经理、交付经理看自己的,研发主管、研发总监看全部的
  99. } else if service.StringsContains(s.userInfo.Roles, "ProjectManager") {
  100. dao = dao.Where("a.project_man_id = ?", s.userInfo.Id)
  101. } else if service.StringsContains(s.userInfo.Roles, "ProjectDeliveryManager") {
  102. dao = dao.Where("a.deliver_man_id = ?", s.userInfo.Id)
  103. } else if service.StringsContains(s.userInfo.Roles, "ProductIntegrationManager") {
  104. // 丁岳嵩 查看全部硬件 交付类型:10软件;20硬件
  105. dao = dao.Where("a.order_type = ?", "20")
  106. } else if service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentDirector") || service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentSupervisor") {
  107. // 研发主管、研发总监看全部的
  108. } else {
  109. productCode, err := service.ColumnString(s.Dao.DB.Table("base_product_auth").Wheref("user_id = ?", s.userInfo.Id), "product_code")
  110. if err != nil {
  111. return 0, nil, err
  112. }
  113. g.Log().Infof("DeliverOrderService List product_code %v", productCode)
  114. dao = dao.Where("a.product in (?)", productCode)
  115. }
  116. if req.OrderCode != "" {
  117. dao = dao.Where("a.order_code = ?", req.OrderCode)
  118. }
  119. if req.OrderStatus != "" {
  120. dao = dao.Where("a.order_status = ?", req.OrderStatus)
  121. }
  122. if req.OrderType != "" {
  123. dao = dao.Where("a.order_type = ?", req.OrderType)
  124. }
  125. if req.CustId != 0 {
  126. dao = dao.Where("a.cust_id = ?", req.CustId)
  127. }
  128. if req.CustName != "" {
  129. likestr := fmt.Sprintf("%%%s%%", req.CustName)
  130. dao = dao.Where("a.cust_name like ?", likestr)
  131. }
  132. if req.ProjectId != 0 {
  133. dao = dao.Where("a.project_id = ?", req.ProjectId)
  134. }
  135. if req.ProjectName != "" {
  136. likestr := fmt.Sprintf("%%%s%%", req.ProjectName)
  137. dao = dao.Where("a.project_name like ?", likestr)
  138. }
  139. if req.ContractId != 0 {
  140. dao = dao.Where("a.contract_id = ?", req.ContractId)
  141. }
  142. if req.ContractCode != "" {
  143. dao = dao.Where("a.contract_code = ?", req.ContractCode)
  144. }
  145. if req.ProjectManId != 0 {
  146. dao = dao.Where("a.project_man_id = ?", req.ProjectManId)
  147. }
  148. if req.ProjectManName != "" {
  149. likestr := fmt.Sprintf("%%%s%%", req.ProjectManName)
  150. dao = dao.Where("a.project_man_name like ?", likestr)
  151. }
  152. if req.DeliverManId != 0 {
  153. dao = dao.Where("a.deliver_man_id = ?", req.DeliverManId)
  154. }
  155. if req.DeliverManName != "" {
  156. likestr := fmt.Sprintf("%%%s%%", req.DeliverManName)
  157. dao = dao.Where("a.deliver_man_name like ?", likestr)
  158. }
  159. if req.Product != "" {
  160. dao = dao.Where("a.product = ?", req.Product)
  161. }
  162. total, err := dao.Count()
  163. if err != nil {
  164. return 0, nil, err
  165. }
  166. if req.PageNum != 0 {
  167. dao = dao.Page(req.GetPage())
  168. }
  169. orderby := "a.created_time desc"
  170. if req.OrderBy != "" {
  171. orderby = req.OrderBy
  172. }
  173. dao = dao.Order(orderby)
  174. ents := []*work.DeliverOrder{}
  175. err = dao.Fields("a.*").Structs(&ents)
  176. if err != nil && err != sql.ErrNoRows {
  177. return 0, nil, err
  178. }
  179. return total, ents, err
  180. }
  181. func (s DeliverOrderService) Add(ctx context.Context, req *work.DeliverOrderAddReq) ([]int, error) {
  182. validErr := gvalid.CheckStruct(ctx, req, nil)
  183. if validErr != nil {
  184. return nil, myerrors.TipsError(validErr.Current().Error())
  185. }
  186. var id = []int{}
  187. txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  188. var err error
  189. id, err = DeliverOrderAdd(tx, req.ContractId, s.userInfo)
  190. return err
  191. })
  192. return id, txerr
  193. }
  194. func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo) ([]int, error) {
  195. var c contractmodel.CtrContract
  196. err := tx.GetStruct(&c, "select * from ctr_contract where id = ?", contractId)
  197. if err == sql.ErrNoRows {
  198. return nil, myerrors.TipsError(fmt.Sprintf("合同:%d 不存在", contractId))
  199. }
  200. if err != nil {
  201. return nil, err
  202. }
  203. var product []*contractmodel.CtrContractProduct
  204. err = tx.GetStructs(&product, "select * from ctr_contract_product where contract_id = ?", contractId)
  205. if err == sql.ErrNoRows {
  206. return nil, myerrors.TipsError(fmt.Sprintf("合同产品为空: %d", contractId))
  207. }
  208. if err != nil {
  209. return nil, err
  210. }
  211. var deliverSoft *work.DeliverOrder
  212. var deliverHard *work.DeliverOrder
  213. deliverProductSoft := []work.DeliverOrderProduct{}
  214. deliverProductHard := []work.DeliverOrderProduct{}
  215. for _, p := range product {
  216. var orderType string
  217. if p.ProdClass == "10" || p.ProdClass == "20" || p.ProdClass == "30" {
  218. orderType = "10"
  219. }
  220. if p.ProdClass == "40" || p.ProdClass == "60" {
  221. orderType = "20"
  222. }
  223. projectManId, projectManName := getProjectUser(tx, &c)
  224. o := work.DeliverOrder{
  225. OrderCode: fmt.Sprintf("%s%s", c.ContractCode, orderType),
  226. OrderStatus: "10",
  227. OrderType: orderType,
  228. CustId: c.CustId,
  229. CustName: c.CustName,
  230. ProjectId: c.NboId,
  231. ProjectName: c.NboName,
  232. ContractId: c.Id,
  233. ContractCode: c.ContractCode,
  234. ProjectManId: projectManId,
  235. ProjectManName: projectManName,
  236. DeliverManId: 0,
  237. DeliverManName: "",
  238. Product: c.ProductLine,
  239. Remark: "",
  240. CreatedBy: int(userInfo.Id),
  241. CreatedName: userInfo.NickName,
  242. CreatedTime: gtime.Now(),
  243. UpdatedBy: int(userInfo.Id),
  244. UpdatedName: userInfo.NickName,
  245. UpdatedTime: gtime.Now(),
  246. }
  247. op := work.DeliverOrderProduct{
  248. DeliverOrderId: 0,
  249. ProductCode: p.ProdCode,
  250. ProductName: p.ProdName,
  251. ProductType: p.ProdClass,
  252. ProductNum: p.ProdNum,
  253. Remark: "",
  254. CreatedBy: int(userInfo.Id),
  255. CreatedName: userInfo.NickName,
  256. CreatedTime: gtime.Now(),
  257. UpdatedBy: int(userInfo.Id),
  258. UpdatedName: userInfo.NickName,
  259. UpdatedTime: gtime.Now(),
  260. }
  261. if orderType == "10" {
  262. deliverSoft = &o
  263. deliverProductSoft = append(deliverProductSoft, op)
  264. }
  265. if orderType == "20" {
  266. deliverHard = &o
  267. deliverProductHard = append(deliverProductHard, op)
  268. }
  269. }
  270. var id = []int{}
  271. if deliverHard != nil {
  272. oid, err := tx.InsertAndGetId("deliver_order", *deliverHard)
  273. if err != nil {
  274. return nil, err
  275. }
  276. err = DeliverOrderBindProduct(tx, int(oid), deliverProductHard)
  277. if err != nil {
  278. return nil, err
  279. }
  280. id = append(id, int(oid))
  281. }
  282. if deliverSoft != nil {
  283. oid, err := tx.InsertAndGetId("deliver_order", *deliverSoft)
  284. if err != nil {
  285. return nil, err
  286. }
  287. err = DeliverOrderBindProduct(tx, int(oid), deliverProductSoft)
  288. if err != nil {
  289. return nil, err
  290. }
  291. id = append(id, int(oid))
  292. }
  293. return id, nil
  294. }
  295. func getProjectUser(tx *gdb.TX, c *contractmodel.CtrContract) (int, string) {
  296. projectManId := 0
  297. projectManName := ""
  298. // 根据产品线,设置项目经理: 10 BIOBANK; 20 CELLSOP; 30 LIMS+基因; 40 智能硬件; 50 液氮罐; 60 MCS;
  299. // 非交付工单产品线: 70 咨询服务; 80 石油; 90 外购
  300. if c.ProductLine == "10" {
  301. projectManName = "姜辉"
  302. projectManId = 0
  303. } else if c.ProductLine == "20" {
  304. projectManName = "王晓宇"
  305. projectManId = 0
  306. } else if c.ProductLine == "30" {
  307. projectManName = "程健"
  308. projectManId = 0
  309. } else if c.ProductLine == "40" || c.ProductLine == "50" || c.ProductLine == "60" {
  310. projectManName = "孙淼"
  311. projectManId = 0
  312. }
  313. if projectManName != "" {
  314. user, err := tx.Model("sys_user").Where(fmt.Sprintf("nick_name='%v'", projectManName)).One()
  315. if err != nil && err != sql.ErrNoRows {
  316. glog.Error(err)
  317. }
  318. if user != nil {
  319. projectManId = user["id"].Int()
  320. }
  321. }
  322. return projectManId, projectManName
  323. }
  324. func DeliverOrderBindProduct(tx *gdb.TX, id int, product []work.DeliverOrderProduct) error {
  325. _, err := tx.Delete("deliver_order_product", "deliver_order_id = ?", id)
  326. if err != nil {
  327. return err
  328. }
  329. for i := range product {
  330. product[i].DeliverOrderId = id
  331. }
  332. if len(product) != 0 {
  333. _, err = tx.Insert("deliver_order_product", product)
  334. if err != nil {
  335. return err
  336. }
  337. }
  338. return nil
  339. }
  340. func (s DeliverOrderService) Update(ctx context.Context, req *work.DeliverOrderUpdateReq) error {
  341. validErr := gvalid.CheckStruct(ctx, req, nil)
  342. if validErr != nil {
  343. return myerrors.TipsError(validErr.Current().Error())
  344. }
  345. ent, err := s.Dao.Where("id = ?", req.Id).One()
  346. if err != nil {
  347. return err
  348. }
  349. if ent == nil {
  350. return myerrors.TipsError(fmt.Sprintf("工单不存在: %d", req.Id))
  351. }
  352. toupdate := map[string]interface{}{}
  353. if req.OrderStatus != "" {
  354. toupdate["order_status"] = req.OrderStatus
  355. }
  356. if req.ProjectManId != 0 {
  357. toupdate["project_man_id"] = req.ProjectManId
  358. }
  359. if req.ProjectManName != "" {
  360. toupdate["project_man_name"] = req.ProjectManName
  361. }
  362. if req.DeliverManId != 0 {
  363. toupdate["deliver_man_id"] = req.DeliverManId
  364. }
  365. if req.DeliverManName != "" {
  366. toupdate["deliver_man_name"] = req.DeliverManName
  367. }
  368. if len(toupdate) != 0 {
  369. toupdate["updated_by"] = int(s.userInfo.Id)
  370. toupdate["updated_name"] = s.userInfo.NickName
  371. toupdate["updated_time"] = gtime.Now()
  372. txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  373. _, err = tx.Update("deliver_order", toupdate, "id = ?", req.Id)
  374. if err != nil {
  375. return err
  376. }
  377. return nil
  378. })
  379. if txerr != nil {
  380. return txerr
  381. }
  382. }
  383. return nil
  384. }
  385. func (s *DeliverOrderService) Finish(ctx context.Context, req *work.DeliverOrderFinishReq) error {
  386. ent, err := s.Dao.Where("id = ?", req.OrderId).One()
  387. if err != nil {
  388. return err
  389. }
  390. if ent == nil {
  391. return myerrors.TipsError("工单不存在")
  392. }
  393. // if ent.OrderStatus != "30" {
  394. // return myerrors.TipsError("当前工单不可完成")
  395. // }
  396. return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  397. _, err = tx.Update("deliver_order", map[string]interface{}{
  398. "order_status": "20",
  399. "finish_remark": req.FinishRemark,
  400. "finish_time": gtime.Now(),
  401. "finish_by": int(s.userInfo.Id),
  402. "finish_by_name": s.userInfo.NickName,
  403. "updated_by": int(s.userInfo.Id),
  404. "updated_name": s.userInfo.NickName,
  405. "updated_time": gtime.Now(),
  406. }, "id = ?", req.OrderId)
  407. return err
  408. })
  409. }
  410. func (s DeliverOrderService) Delete(ctx context.Context, id []int) error {
  411. if len(id) == 0 {
  412. return nil
  413. }
  414. _, err := s.Dao.Where("Id IN (?)", id).Delete()
  415. return err
  416. }