deliver_order.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458
  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. dao := s.Dao.DeliverOrderDao.As("a").LeftJoin("proj_business b", "a.project_id=b.id").Unscoped().Where("a.deleted_time is null")
  93. // 系统管理员、研发主管、研发总监、品质主管、总经理、销售总监、销售助理看全部的
  94. if service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentDirector") || service.StringsContains(s.userInfo.Roles, "ResearchAndDevelopmentSupervisor") || service.StringsContains(s.userInfo.Roles, "QualityAssuranceSupervisor") || service.StringsContains(s.userInfo.Roles, "GeneralManager") || service.StringsContains(s.userInfo.Roles, "SalesDirector") || service.StringsContains(s.userInfo.Roles, "SaleAssociate") || service.StringsContains(s.userInfo.Roles, "SysAdmin") {
  95. // 无条件,查询全部
  96. // 项目经理看对应的
  97. } else if service.StringsContains(s.userInfo.Roles, "ProjectManager") {
  98. dao = dao.Where("a.project_man_id = ?", s.userInfo.Id)
  99. // 交付经理看对应的
  100. } else if service.StringsContains(s.userInfo.Roles, "ProjectDeliveryManager") {
  101. dao = dao.Where("a.deliver_man_id = ?", s.userInfo.Id)
  102. } else if service.StringsContains(s.userInfo.Roles, "ProductIntegrationManager") {
  103. // 丁岳嵩 查看全部硬件 交付类型:10软件;20硬件
  104. dao = dao.Where("a.order_type = ?", "20")
  105. // 产品线负责人看自己负责的产品线
  106. } else if service.StringsContains(s.userInfo.Roles, "ProductLineManager") {
  107. productCode, err := service.ColumnString(s.Dao.DB.Table("base_product_auth").Wheref("user_id = ?", s.userInfo.Id), "product_code")
  108. if err != nil {
  109. return 0, nil, err
  110. }
  111. g.Log().Infof("DeliverOrderService List product_code %v", productCode)
  112. dao = dao.Where("a.product in (?)", productCode)
  113. // 大区经理看所管理的销售的(包括自己)
  114. } else if service.StringsContains(s.userInfo.Roles, "RegionalManager") {
  115. dao = dao.Where(fmt.Sprintf("b.sale_id IN (SELECT id FROM sys_user WHERE dept_id='%v')", s.userInfo.DeptId))
  116. // 销售工程师看自己负责的项目的
  117. } else if service.StringsContains(s.userInfo.Roles, "SalesEngineer") {
  118. //dao = dao.Where("b.incharge_id = ?", s.userInfo.Id) // 改为关联项目
  119. dao = dao.Where("b.sale_id = ?", s.userInfo.Id)
  120. } else {
  121. // 默认看自己的产品线
  122. productCode, err := service.ColumnString(s.Dao.DB.Table("base_product_auth").Wheref("user_id = ?", s.userInfo.Id), "product_code")
  123. if err != nil {
  124. return 0, nil, err
  125. }
  126. g.Log().Infof("DeliverOrderService List product_code %v", productCode)
  127. dao = dao.Where("a.product in (?)", productCode)
  128. }
  129. if req.OrderCode != "" {
  130. dao = dao.Where("a.order_code = ?", req.OrderCode)
  131. }
  132. if req.OrderStatus != "" {
  133. dao = dao.Where("a.order_status = ?", req.OrderStatus)
  134. }
  135. if req.OrderType != "" {
  136. dao = dao.Where("a.order_type = ?", req.OrderType)
  137. }
  138. if req.CustId != 0 {
  139. dao = dao.Where("a.cust_id = ?", req.CustId)
  140. }
  141. if req.CustName != "" {
  142. likestr := fmt.Sprintf("%%%s%%", req.CustName)
  143. dao = dao.Where("a.cust_name like ?", likestr)
  144. }
  145. if req.ProjectId != 0 {
  146. dao = dao.Where("a.project_id = ?", req.ProjectId)
  147. }
  148. if req.ProjectName != "" {
  149. likestr := fmt.Sprintf("%%%s%%", req.ProjectName)
  150. dao = dao.Where("a.project_name like ?", likestr)
  151. }
  152. if req.ContractId != 0 {
  153. dao = dao.Where("a.contract_id = ?", req.ContractId)
  154. }
  155. if req.ContractCode != "" {
  156. dao = dao.Where("a.contract_code = ?", req.ContractCode)
  157. }
  158. if req.ProjectManId != 0 {
  159. dao = dao.Where("a.project_man_id = ?", req.ProjectManId)
  160. }
  161. if req.ProjectManName != "" {
  162. likestr := fmt.Sprintf("%%%s%%", req.ProjectManName)
  163. dao = dao.Where("a.project_man_name like ?", likestr)
  164. }
  165. if req.DeliverManId != 0 {
  166. dao = dao.Where("a.deliver_man_id = ?", req.DeliverManId)
  167. }
  168. if req.DeliverManName != "" {
  169. likestr := fmt.Sprintf("%%%s%%", req.DeliverManName)
  170. dao = dao.Where("a.deliver_man_name like ?", likestr)
  171. }
  172. if req.Product != "" {
  173. dao = dao.Where("a.product = ?", req.Product)
  174. }
  175. total, err := dao.Count()
  176. if err != nil {
  177. return 0, nil, err
  178. }
  179. if req.PageNum != 0 {
  180. dao = dao.Page(req.GetPage())
  181. }
  182. orderby := "a.created_time desc"
  183. if req.OrderBy != "" {
  184. orderby = req.OrderBy
  185. }
  186. dao = dao.Order(orderby)
  187. ents := []*work.DeliverOrder{}
  188. err = dao.Fields("a.*").Structs(&ents)
  189. if err != nil && err != sql.ErrNoRows {
  190. return 0, nil, err
  191. }
  192. return total, ents, err
  193. }
  194. func (s DeliverOrderService) Add(ctx context.Context, req *work.DeliverOrderAddReq) ([]int, error) {
  195. validErr := gvalid.CheckStruct(ctx, req, nil)
  196. if validErr != nil {
  197. return nil, myerrors.TipsError(validErr.Current().Error())
  198. }
  199. var id = []int{}
  200. txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  201. var err error
  202. id, err = DeliverOrderAdd(tx, req.ContractId, s.userInfo)
  203. return err
  204. })
  205. return id, txerr
  206. }
  207. func DeliverOrderAdd(tx *gdb.TX, contractId int, userInfo request.UserInfo) ([]int, error) {
  208. var c contractmodel.CtrContract
  209. err := tx.GetStruct(&c, "select * from ctr_contract where id = ?", contractId)
  210. if err == sql.ErrNoRows {
  211. return nil, myerrors.TipsError(fmt.Sprintf("合同:%d 不存在", contractId))
  212. }
  213. if err != nil {
  214. return nil, err
  215. }
  216. var product []*contractmodel.CtrContractProduct
  217. err = tx.GetStructs(&product, "select * from ctr_contract_product where contract_id = ?", contractId)
  218. if err == sql.ErrNoRows {
  219. return nil, myerrors.TipsError(fmt.Sprintf("合同产品为空: %d", contractId))
  220. }
  221. if err != nil {
  222. return nil, err
  223. }
  224. var deliverSoft *work.DeliverOrder
  225. var deliverHard *work.DeliverOrder
  226. deliverProductSoft := []work.DeliverOrderProduct{}
  227. deliverProductHard := []work.DeliverOrderProduct{}
  228. for _, p := range product {
  229. var orderType string
  230. if p.ProdClass == "10" || p.ProdClass == "20" || p.ProdClass == "30" {
  231. orderType = "10"
  232. }
  233. if p.ProdClass == "40" || p.ProdClass == "60" {
  234. orderType = "20"
  235. }
  236. projectManId, projectManName := getProjectUser(tx, &c)
  237. o := work.DeliverOrder{
  238. OrderCode: fmt.Sprintf("%s%s", c.ContractCode, orderType),
  239. OrderStatus: "10",
  240. OrderType: orderType,
  241. CustId: c.CustId,
  242. CustName: c.CustName,
  243. ProjectId: c.NboId,
  244. ProjectName: c.NboName,
  245. ContractId: c.Id,
  246. ContractCode: c.ContractCode,
  247. ProjectManId: projectManId,
  248. ProjectManName: projectManName,
  249. DeliverManId: 0,
  250. DeliverManName: "",
  251. Product: c.ProductLine,
  252. Remark: "",
  253. CreatedBy: int(userInfo.Id),
  254. CreatedName: userInfo.NickName,
  255. CreatedTime: gtime.Now(),
  256. UpdatedBy: int(userInfo.Id),
  257. UpdatedName: userInfo.NickName,
  258. UpdatedTime: gtime.Now(),
  259. }
  260. op := work.DeliverOrderProduct{
  261. DeliverOrderId: 0,
  262. ProductCode: p.ProdCode,
  263. ProductName: p.ProdName,
  264. ProductType: p.ProdClass,
  265. ProductNum: p.ProdNum,
  266. Remark: "",
  267. CreatedBy: int(userInfo.Id),
  268. CreatedName: userInfo.NickName,
  269. CreatedTime: gtime.Now(),
  270. UpdatedBy: int(userInfo.Id),
  271. UpdatedName: userInfo.NickName,
  272. UpdatedTime: gtime.Now(),
  273. }
  274. if orderType == "10" {
  275. deliverSoft = &o
  276. deliverProductSoft = append(deliverProductSoft, op)
  277. }
  278. if orderType == "20" {
  279. deliverHard = &o
  280. deliverProductHard = append(deliverProductHard, op)
  281. }
  282. }
  283. var id = []int{}
  284. if deliverHard != nil {
  285. oid, err := tx.InsertAndGetId("deliver_order", *deliverHard)
  286. if err != nil {
  287. return nil, err
  288. }
  289. err = DeliverOrderBindProduct(tx, int(oid), deliverProductHard)
  290. if err != nil {
  291. return nil, err
  292. }
  293. id = append(id, int(oid))
  294. }
  295. if deliverSoft != nil {
  296. oid, err := tx.InsertAndGetId("deliver_order", *deliverSoft)
  297. if err != nil {
  298. return nil, err
  299. }
  300. err = DeliverOrderBindProduct(tx, int(oid), deliverProductSoft)
  301. if err != nil {
  302. return nil, err
  303. }
  304. id = append(id, int(oid))
  305. }
  306. return id, nil
  307. }
  308. func getProjectUser(tx *gdb.TX, c *contractmodel.CtrContract) (int, string) {
  309. projectManId := 0
  310. projectManName := ""
  311. // 根据产品线,设置项目经理: 10 BIOBANK; 20 CELLSOP; 30 LIMS+基因; 40 智能硬件; 50 液氮罐; 60 MCS;
  312. // 非交付工单产品线: 70 咨询服务; 80 石油; 90 外购
  313. if c.ProductLine == "10" {
  314. projectManName = "姜辉"
  315. projectManId = 0
  316. } else if c.ProductLine == "20" {
  317. projectManName = "王晓宇"
  318. projectManId = 0
  319. } else if c.ProductLine == "30" {
  320. projectManName = "程健"
  321. projectManId = 0
  322. } else if c.ProductLine == "40" || c.ProductLine == "50" || c.ProductLine == "60" {
  323. projectManName = "孙淼"
  324. projectManId = 0
  325. }
  326. if projectManName != "" {
  327. user, err := tx.Model("sys_user").Where(fmt.Sprintf("nick_name='%v'", projectManName)).One()
  328. if err != nil && err != sql.ErrNoRows {
  329. glog.Error(err)
  330. }
  331. if user != nil {
  332. projectManId = user["id"].Int()
  333. }
  334. }
  335. return projectManId, projectManName
  336. }
  337. func DeliverOrderBindProduct(tx *gdb.TX, id int, product []work.DeliverOrderProduct) error {
  338. _, err := tx.Delete("deliver_order_product", "deliver_order_id = ?", id)
  339. if err != nil {
  340. return err
  341. }
  342. for i := range product {
  343. product[i].DeliverOrderId = id
  344. }
  345. if len(product) != 0 {
  346. _, err = tx.Insert("deliver_order_product", product)
  347. if err != nil {
  348. return err
  349. }
  350. }
  351. return nil
  352. }
  353. func (s DeliverOrderService) Update(ctx context.Context, req *work.DeliverOrderUpdateReq) error {
  354. validErr := gvalid.CheckStruct(ctx, req, nil)
  355. if validErr != nil {
  356. return myerrors.TipsError(validErr.Current().Error())
  357. }
  358. ent, err := s.Dao.Where("id = ?", req.Id).One()
  359. if err != nil {
  360. return err
  361. }
  362. if ent == nil {
  363. return myerrors.TipsError(fmt.Sprintf("工单不存在: %d", req.Id))
  364. }
  365. toupdate := map[string]interface{}{}
  366. if req.OrderStatus != "" {
  367. toupdate["order_status"] = req.OrderStatus
  368. }
  369. if req.ProjectManId != 0 {
  370. toupdate["project_man_id"] = req.ProjectManId
  371. }
  372. if req.ProjectManName != "" {
  373. toupdate["project_man_name"] = req.ProjectManName
  374. }
  375. if req.DeliverManId != 0 {
  376. toupdate["deliver_man_id"] = req.DeliverManId
  377. }
  378. if req.DeliverManName != "" {
  379. toupdate["deliver_man_name"] = req.DeliverManName
  380. }
  381. if len(toupdate) != 0 {
  382. toupdate["updated_by"] = int(s.userInfo.Id)
  383. toupdate["updated_name"] = s.userInfo.NickName
  384. toupdate["updated_time"] = gtime.Now()
  385. txerr := s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  386. _, err = tx.Update("deliver_order", toupdate, "id = ?", req.Id)
  387. if err != nil {
  388. return err
  389. }
  390. return nil
  391. })
  392. if txerr != nil {
  393. return txerr
  394. }
  395. }
  396. return nil
  397. }
  398. func (s *DeliverOrderService) Finish(ctx context.Context, req *work.DeliverOrderFinishReq) error {
  399. ent, err := s.Dao.Where("id = ?", req.OrderId).One()
  400. if err != nil {
  401. return err
  402. }
  403. if ent == nil {
  404. return myerrors.TipsError("工单不存在")
  405. }
  406. // if ent.OrderStatus != "30" {
  407. // return myerrors.TipsError("当前工单不可完成")
  408. // }
  409. return s.Dao.DB.Transaction(ctx, func(ctx context.Context, tx *gdb.TX) error {
  410. _, err = tx.Update("deliver_order", map[string]interface{}{
  411. "order_status": "20",
  412. "finish_remark": req.FinishRemark,
  413. "finish_time": gtime.Now(),
  414. "finish_by": int(s.userInfo.Id),
  415. "finish_by_name": s.userInfo.NickName,
  416. "updated_by": int(s.userInfo.Id),
  417. "updated_name": s.userInfo.NickName,
  418. "updated_time": gtime.Now(),
  419. }, "id = ?", req.OrderId)
  420. return err
  421. })
  422. }
  423. func (s DeliverOrderService) Delete(ctx context.Context, id []int) error {
  424. if len(id) == 0 {
  425. return nil
  426. }
  427. _, err := s.Dao.Where("Id IN (?)", id).Delete()
  428. return err
  429. }