order.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "strconv"
  6. "strings"
  7. "time"
  8. modernPb "gitee.com/xuyiping_admin/go_proto/proto/go/backend/xdmy"
  9. _ "github.com/go-sql-driver/mysql"
  10. "github.com/jmoiron/sqlx"
  11. "github.com/pkg/errors"
  12. log "github.com/sirupsen/logrus"
  13. "kpt.xdmy/apiserver/config"
  14. "kpt.xdmy/apiserver/model"
  15. "kpt.xdmy/apiserver/model/http"
  16. "kpt.xdmy/pkg/util"
  17. )
  18. // 推送采购订单到sap(业务触发),已关闭
  19. func (s *Service) PurchaseOrder(p interface{}) {
  20. r := new(model.BigBuyDetailReq)
  21. if e := util.Unmarshal(p, r); e != nil {
  22. log.Errorf("purchaseorder param :%v ", e)
  23. log.Info(p)
  24. return
  25. }
  26. if r.ID == "" && r.Code == "" {
  27. log.Error("buy order request param is empty")
  28. return
  29. }
  30. bdetails := []model.BigBuyDetail{}
  31. bpp := new(model.Bigpartpurchase)
  32. if r.ID != "" {
  33. pid, err := strconv.ParseInt(r.ID, 10, 32)
  34. if err != nil {
  35. log.Errorf("parseInt purchase id :%v", err)
  36. }
  37. id := int(pid)
  38. if e := s.d.DB.First(bpp, model.Bigpartpurchase{ID: id}).Error; e != nil {
  39. log.Error("Bigpartpurchase query error", e)
  40. return
  41. }
  42. if e := s.d.DB.Where(" ZeroCou >0 ").Find(&bdetails, model.BigBuyDetail{MatchCode: bpp.OrderNumber}).Error; e != nil || len(bdetails) == 0 {
  43. log.Errorf("Bigbuydetail query :matchcode =%s,e=%v", r.Code, e)
  44. return
  45. }
  46. } else if r.Code != "" {
  47. if e := s.d.DB.Where(" ZeroCou >0 ").Find(&bdetails, model.BigBuyDetail{MatchCode: r.Code}).Error; e != nil || len(bdetails) == 0 {
  48. log.Errorf("Bigbuydetail query :matchcode =%s,e=%v", r.Code, e)
  49. return
  50. }
  51. }
  52. for _, v := range bdetails {
  53. SapOrder(&v, "", v.PurchaseType)
  54. SrmOrder(&v, "0")
  55. }
  56. }
  57. // AutoSapOrderJob 定时(每分钟 一次)读取未同步的采购订单,同步到sap
  58. // 同步失败的采购订单,变更状态,改为手动同步
  59. // 状态(sapStatus):0,未同步;1,成功;2,失败
  60. func AutoSapOrderJob() {
  61. orders := []model.BigBuyDetail{}
  62. if e := s.d.DB.Raw(`select b.* from bigbuydetail b join pasture p on b.pastureId = p.id left join bigpartdeal bpd on bpd.matchCode = b.matchCode
  63. where buyerDate >'2022-11-02' and p.vendor = 1 and b.sapStatus =0 and (bpd.statue = 1 or b.matchCode like '%SG%' )`).Find(&orders, model.BigBuyDetail{}).Error; e != nil {
  64. log.Errorf("AutoSapOrderJob error: %v", e)
  65. return
  66. }
  67. var buyeCodes []string
  68. for _, v := range orders {
  69. buyeCodes = append(buyeCodes, v.BuyeCode)
  70. }
  71. if len(buyeCodes) > 0 {
  72. err := s.d.DB.Exec(` update bigbuydetail set sapStatus = 2 where buyeCode in (?)`, buyeCodes).Error
  73. fmt.Println(err)
  74. }
  75. for _, v := range orders {
  76. e, sapNumber := SapOrder(&v, "", v.PurchaseType)
  77. up := model.BigBuyDetail{SapNumber: sapNumber}
  78. if e != nil {
  79. up.SapStatus = 2
  80. up.SapError = e.Error()
  81. } else {
  82. up.SapStatus = 1
  83. }
  84. if e := s.d.DB.Model(&v).Where("buyeCode =?", v.BuyeCode).Updates(up); e != nil {
  85. log.Errorf("BigBuyDetail update error: %v", e)
  86. }
  87. }
  88. }
  89. // 手动同步采购订单到sap
  90. func ManaulSapOrderJob(buyeCode string) (err error) {
  91. order := new(model.BigBuyDetail)
  92. if e := s.d.DB.First(order, model.BigBuyDetail{BuyeCode: buyeCode}).Error; e != nil {
  93. err = errors.Wrapf(e, "ManaulSapOrderJob BigBuyDetail query ")
  94. return
  95. }
  96. e, sapNumber := SapOrder(order, "", order.PurchaseType)
  97. up := model.BigBuyDetail{SapNumber: sapNumber}
  98. if e != nil {
  99. up.SapStatus = 2
  100. up.SapError = e.Error()
  101. err = errors.Wrapf(e, "ManaulSapOrder sap ")
  102. } else {
  103. up.SapStatus = 1
  104. }
  105. if e := s.d.DB.Model(order).Where("buyeCode=?", buyeCode).Updates(up).Error; e != nil {
  106. log.Errorf("BigBuyDetail update error: %v", e)
  107. }
  108. return
  109. }
  110. // 发送采购订单到sap
  111. func SapOrder(p *model.BigBuyDetail, dflag string, purchaseType modernPb.PurchaseType_Kind) (error, string) {
  112. r := new(http.SapOrderReq)
  113. rp := new(http.OrderResp)
  114. parts := []model.BuyDetail{}
  115. pa := new(model.Pasture)
  116. pv := new(model.Provider)
  117. //pc := new(model.Bigpartpurchase)
  118. //dp := new(model.Department)
  119. r.Dest.DestID = "EQMAN"
  120. r.Dest.BussTp = "MM007"
  121. //r.Dest.Url = "http://192.168.61.117/SAPQ0/Common/MM007/PurchaseOrder"
  122. //r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM007/PurchaseOrder"
  123. r.Dest.Url = fmt.Sprintf("%s/Common/MM007/PurchaseOrder", config.Conf.Http.Routing)
  124. if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
  125. return errors.Wrapf(e, "provider query:id=%d", p.ProviderID), ""
  126. }
  127. if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
  128. return errors.Wrapf(e, "pasture query:id=%d", p.PastureID), ""
  129. }
  130. if e := s.d.DB.Where("amount>0").Find(&parts, model.BuyDetail{BigID: p.ID}).Order("rowNumber").Error; e != nil || len(parts) == 0 {
  131. return errors.Wrapf(e, "buydetail query:bigid=%d", p.ID), ""
  132. }
  133. //if len(parts) > 0 {
  134. // if e := s.d.DB.Where("name = ? ", parts[0].DepartmentName).Where("pastureid = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
  135. // }
  136. //}
  137. r.Data.IsCancle = ""
  138. r.Data.PayCondition = ""
  139. r.Data.SupplierCode = pv.SapCode
  140. r.Data.OrderDate = p.BuyerDate.Format("20060102")
  141. r.Data.CurrencyCode = "CNY"
  142. r.Data.ProofType = "ZNB4"
  143. r.Data.EqSysCode = p.BuyeCode
  144. //if dp.CompanyCode == "" {
  145. r.Data.CompanyCode = pa.CompanyCode
  146. r.Data.Organization = pa.ParchaseOrganization
  147. r.Data.Group = pa.PurchasingGroup
  148. //} else {
  149. // r.Data.CompanyCode = dp.CompanyCode
  150. // r.Data.Organization = dp.ParchaseOrganization
  151. // r.Data.Group = dp.PurchasingGroup
  152. //}
  153. for i, v := range parts {
  154. detail := http.SapOrderDetail{}
  155. c := new(model.Contract)
  156. bc := new(model.BigContract)
  157. par := new(model.Parts)
  158. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  159. //return errors.Wrapf(e, "contract query :id=%d", v.ContractID), ""
  160. }
  161. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  162. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  163. }
  164. if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
  165. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  166. }
  167. if v.RowNumber > 0 {
  168. detail.RowNumber = strconv.Itoa(v.RowNumber)
  169. } else {
  170. detail.RowNumber = fmt.Sprintf("%d", (i+1)*10)
  171. }
  172. //if dp.CompanyCode == "" {
  173. detail.Factory = pa.FactoryCode
  174. //} else {
  175. // detail.Factory = dp.Factory
  176. //}
  177. detail.Quantity = fmt.Sprintf("%d", v.Amount)
  178. detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
  179. detail.TaxCode = "J0"
  180. detail.Per = "1"
  181. detail.Location = "1004"
  182. detail.IsOwn = util.ZeroStr(bc.IsZeroStock == 1, "K")
  183. detail.NetPrice = c.Price
  184. if c.PartCode != "" {
  185. detail.Unit = c.Unit
  186. detail.MaterialCode = c.PartCode
  187. } else {
  188. if detail.NetPrice == 0 {
  189. detail.NetPrice = v.Price
  190. }
  191. detail.Unit = par.Unit
  192. detail.MaterialCode = v.PartCode
  193. }
  194. if purchaseType.Number() > 0 {
  195. detail.IsFree = "X"
  196. }
  197. detail.Dflag = dflag
  198. astr := strconv.FormatFloat(detail.NetPrice, 'f', -1, 64)
  199. b := strings.Index(astr, ".")
  200. if len(astr[b+1:]) > 2 && b > 0 {
  201. num, _ := strconv.ParseFloat(astr[b+1:], 64)
  202. if num > 0 {
  203. detail.NetPrice = detail.NetPrice * 1000
  204. detail.NetPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NetPrice), 64)
  205. detail.Per = "1000"
  206. }
  207. }
  208. r.Data.Detail = append(r.Data.Detail, detail)
  209. if e := s.d.DB.Model(&model.BuyDetail{}).Where("id=?", v.ID).Update("rowNumber", detail.RowNumber).Error; e != nil {
  210. log.Errorln(e, v.ID)
  211. }
  212. }
  213. rbyte, _ := json.Marshal(r)
  214. fmt.Println(string(rbyte))
  215. e := s.SyncSap(r, &rp, rbyte)
  216. saplog := new(model.SapLog)
  217. if e == nil && rp.Dest.Status == "S" {
  218. s.d.DB.Create(saplog)
  219. log.Infof("buy order success :eq=%s,sap=%s", rp.Data.EqNumber, rp.Data.SapNumber)
  220. return nil, rp.Data.SapNumber
  221. } else {
  222. if param, e := json.Marshal(r); e != nil {
  223. log.Errorf("sap order param marshal:%v", e)
  224. } else {
  225. saplog.Param = string(param)
  226. saplog.Name = "sap-order"
  227. s.d.DB.Create(saplog)
  228. }
  229. if e == nil {
  230. return errors.Errorf("sap order :%s", rp.Data.MsgText), ""
  231. } else {
  232. return errors.Wrapf(e, "sap order error:%v", e), ""
  233. }
  234. }
  235. //*/
  236. return nil, ""
  237. }
  238. func AutoSrmOrderJob() {
  239. orders := []model.BigBuyDetail{}
  240. if e := s.d.DB.Where("srmStatus=0 and buyerDate >= '2022-10-25' and sapStatus=1 and ifnull(sapNumber,0) > 0 ").Find(&orders, model.BigBuyDetail{SrmStatus: 0}).Error; e != nil {
  241. log.Errorf("AutoSrmOrderJob error: %v", e)
  242. return
  243. }
  244. var buyeCodes []string
  245. for _, v := range orders {
  246. buyeCodes = append(buyeCodes, v.BuyeCode)
  247. }
  248. if len(buyeCodes) > 0 {
  249. s.d.DB.Exec(` update bigbuydetail set srmStatus = 2 where buyeCode in (?)`, buyeCodes)
  250. }
  251. for _, v := range orders {
  252. SrmOrder(&v, "0")
  253. }
  254. }
  255. func ManaulSrmOrderJob(buyeCode string) {
  256. orders := []model.BigBuyDetail{}
  257. if e := s.d.DB.Where("buyeCode=?", buyeCode).Where("sapStatus=1").Find(&orders, model.BigBuyDetail{SrmStatus: 0}).Error; e != nil {
  258. log.Errorf("ManaulSrmOrderJob error: %v", e)
  259. return
  260. }
  261. for _, v := range orders {
  262. SrmOrder(&v, "0")
  263. }
  264. }
  265. func SrmOrder(p *model.BigBuyDetail, IsReturn string) {
  266. r := new(http.SrmOrderReq)
  267. rp := new(http.SrmResp)
  268. parts := []model.BuyDetail{}
  269. pa := new(model.Pasture)
  270. pv := new(model.Provider)
  271. //pc := new(model.Bigpartpurchase)
  272. //dp := new(model.Department)
  273. r.Dest.Url = "http://srm.vip.xiandaimuye.com/gateway/serviceApi/invoke/QZbycode/saveByEquipment"
  274. if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
  275. log.Error(e)
  276. return
  277. }
  278. if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
  279. log.Errorf("pasture query :id=%d,%v", p.PastureID, e)
  280. return
  281. }
  282. if e := s.d.DB.Where("amount>0").Find(&parts, model.BuyDetail{BigID: p.ID}).Error; e != nil || len(parts) == 0 {
  283. log.Errorf("buydetail query :bigid=%d,%v", p.ID, e)
  284. return
  285. }
  286. //if e := s.d.DB.Where("matchCode = ? ", p.MatchCode).Find(&pc, model.Bigpartpurchase{}).Error; e != nil {
  287. // return
  288. //}
  289. //if e := s.d.DB.Where("id = ? ", pc.DepartmentID).Find(&dp, model.Department{}).Error; e != nil {
  290. // return
  291. //}
  292. //if len(parts) > 0 {
  293. // if e := s.d.DB.Where("name = ? ", parts[0].DepartmentName).Where("pastureid = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
  294. // }
  295. //}
  296. //r.Data.CompanyCode = pa.CompanyCode
  297. r.Data.VendorErpCode = pv.SapCode
  298. r.Data.PurchaseOrderDate = p.BuyerDate.Format("20060102")
  299. r.Data.CurrencyCode = "CNY"
  300. r.Data.PurchaseOrderType = "ZNB4"
  301. r.Data.VendorName = pv.ProviderName
  302. r.Data.DeliveryTypeCode = "1"
  303. r.Data.IsReturn = "0"
  304. r.Data.Remark = ""
  305. r.Data.ErpPurchaseOrderNo = p.SapNumber
  306. r.Data.SapCode = pv.SapCode
  307. r.Data.PurchaseOrderNo = p.BuyeCode
  308. //if dp.CompanyCode == "" {
  309. r.Data.CompanyCode = pa.CompanyCode
  310. r.Data.PurchasingOrgCode = pa.ParchaseOrganization
  311. r.Data.PurchasingGroupCode = pa.PurchasingGroup
  312. //} else {
  313. // r.Data.CompanyCode = dp.CompanyCode
  314. // r.Data.PurchasingOrgCode = dp.ParchaseOrganization
  315. // r.Data.PurchasingGroupCode = dp.PurchasingGroup
  316. //}
  317. for _, v := range parts {
  318. detail := http.SrmOrderDetail{}
  319. c := new(model.Contract)
  320. bc := new(model.BigContract)
  321. pr := new(model.PartRepertory)
  322. par := new(model.Parts)
  323. //part := new(model.Parts)
  324. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  325. log.Errorf("order detail error:%v", e)
  326. //return
  327. }
  328. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  329. log.Errorf("order detail error:%v", e)
  330. //return
  331. }
  332. if len(c.PartCode) > 0 {
  333. if e := s.d.DB.First(par, model.Parts{PartCode: c.PartCode}).Error; e != nil {
  334. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  335. }
  336. } else if len(v.PartCode) > 0 {
  337. if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
  338. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  339. }
  340. }
  341. if c.Brand != "" {
  342. detail.Manufacturer = c.Brand
  343. } else {
  344. brand := new(model.Brand)
  345. if e := s.d.DB.First(brand, model.Brand{ID: v.BrandID}).Error; e != nil {
  346. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  347. }
  348. detail.Manufacturer = brand.BrandName
  349. }
  350. price := c.Price
  351. if price == 0 {
  352. price = v.Price
  353. }
  354. if c.PartCode != "" {
  355. detail.OrderUnitCode = c.Unit
  356. detail.MaterialCode = c.PartCode
  357. detail.MaterialName = c.PartName
  358. detail.PricingUnitCode = c.Unit
  359. } else {
  360. detail.OrderUnitCode = par.Unit
  361. detail.MaterialCode = par.PartCode
  362. detail.MaterialName = par.Name
  363. detail.PricingUnitCode = par.Unit
  364. }
  365. s.d.DB.First(pr, model.PartRepertory{ContractID: v.ContractID})
  366. r.Data.TotalNonTaxAmount += price
  367. r.Data.TotalTaxAmount += price
  368. detail.RowNo = strconv.Itoa(v.RowNumber)
  369. //detail.Manufacturer = pa.FactoryCode
  370. //detail.Manufacturer =
  371. //if dp.CompanyCode == "" {
  372. detail.Manufacturer = pa.FactoryCode
  373. detail.PlantCode = pa.FactoryCode
  374. //} else {
  375. // detail.Manufacturer = dp.Factory
  376. // detail.PlantCode = dp.Factory
  377. //}
  378. detail.OrderQty = fmt.Sprintf("%d", v.Amount)
  379. detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
  380. detail.TaxRateCode = "J0"
  381. detail.NonTaxPrice = price
  382. detail.MaterialDesc = par.Specification
  383. if len(c.PartCode) > 0 {
  384. detail.MaterialGroupCode = strings.ReplaceAll(c.PartCode[:strings.LastIndex(c.PartCode, ".")], ".", "")
  385. } else if len(v.PartCode) > 0 {
  386. fmt.Println(v.PartCode)
  387. detail.MaterialGroupCode = strings.ReplaceAll(v.PartCode[:strings.LastIndex(v.PartCode, ".")], ".", "")
  388. }
  389. detail.Tax = "0"
  390. detail.ConfirmDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
  391. //detail.PlantCode = pa.FactoryCode
  392. //if dp.CompanyCode == "" {
  393. //detail.PlantCode = pa.FactoryCode
  394. //} else {
  395. // detail.PlantCode = dp.Factory
  396. //}
  397. detail.StockLocationCode = "1004"
  398. detail.QualityCheck = "0"
  399. detail.IsReturn = "0"
  400. detail.OverDeliveryLimit = "0"
  401. detail.ShortDeliveryLimit = "0"
  402. detail.SourceNo = p.BuyeCode[4:]
  403. detail.ContractCode = bc.ContractCode
  404. detail.Remark = c.Remark
  405. //r.Data.Detail = append(r.Data.Detail, detail)
  406. if bc.IsZeroStock == 1 {
  407. detail.PurchaseCategory = "2"
  408. } else {
  409. detail.PurchaseCategory = "0"
  410. }
  411. detail.IsFree = "0"
  412. detail.PriceBase = "1"
  413. astr := strconv.FormatFloat(detail.NonTaxPrice, 'f', -1, 64)
  414. b := strings.Index(astr, ".")
  415. if len(astr[b+1:]) > 2 && b > 0 {
  416. num, _ := strconv.ParseFloat(astr[b+1:], 64)
  417. if num > 0 {
  418. detail.NonTaxPrice = detail.NonTaxPrice * 1000
  419. detail.NonTaxPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NonTaxPrice), 64)
  420. detail.PriceBase = "1000"
  421. }
  422. }
  423. detail.TaxAmount = detail.NonTaxPrice
  424. detail.TaxPrice = detail.NonTaxPrice
  425. detail.NonTaxAmount = detail.NonTaxPrice
  426. r.Data.Detail = append(r.Data.Detail, detail)
  427. //if e := s.d.DB.Model(&model.BuyDetail{}).Where("id=?", v.ID).Update("rowNumber", i+1).Error; e != nil {
  428. // log.Errorln(e, v.ID)
  429. //}
  430. }
  431. rbyte, _ := json.Marshal([]interface{}{r.Data})
  432. fmt.Println(string(rbyte))
  433. saplog := new(model.SapLog)
  434. saplog.Url = r.Url
  435. saplog.Param = string(rbyte)
  436. saplog.Name = "srm采购订单"
  437. if e := s.SyncSrm(r, rp, rbyte); e != nil {
  438. saplog.MsgText = e.Error()
  439. s.d.DB.Create(saplog)
  440. log.Errorf("sap buy order error: %v", e)
  441. p.SapStatus = 3
  442. } else {
  443. saplog.MsgText = rp.Message
  444. s.d.DB.Create(saplog)
  445. if rp.Success {
  446. p.SapStatus = 1
  447. p.SapNumber = rp.Code
  448. } else {
  449. log.Warnf("buy order fail :msg=%s,r=%v", rp.Code, r)
  450. p.SapStatus = 2
  451. // pp.Print(r)
  452. }
  453. }
  454. if p.SapStatus == 1 {
  455. if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigBuyDetail{SrmStatus: p.SapStatus, SrmNumber: p.SapNumber}).Error; e != nil {
  456. log.Errorf("update big buy detail error: %v", e)
  457. }
  458. } else {
  459. if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigBuyDetail{SrmStatus: p.SapStatus, SrmError: rp.Message}).Error; e != nil {
  460. log.Errorf("update big buy detail error: %v", e)
  461. }
  462. }
  463. }
  464. // AutoSapReturnOrderJob 定时(每分钟 一次)读取未同步的采购订单,同步到sap
  465. // 同步失败的采购订单,变更状态,改为手动同步
  466. // 状态(sapStatus):0,未同步;1,成功;2,失败
  467. func AutoSapReturnOrderJob() {
  468. orders := []model.BigRefunddetail{}
  469. if e := s.d.DB.Raw(`SELECT
  470. b.*
  471. FROM
  472. bigrefunddetail b
  473. JOIN pasture p ON b.pastureId = p.id
  474. WHERE
  475. buyerDate > '2022-11-02'
  476. AND p.vendor = 1
  477. AND b.sapStatus = 0`).Find(&orders, model.BigRefunddetail{}).Error; e != nil {
  478. log.Errorf("AutoSapOrderJob error: %v", e)
  479. return
  480. }
  481. var buyeCodes []string
  482. for _, v := range orders {
  483. buyeCodes = append(buyeCodes, v.BuyeCode)
  484. }
  485. if len(buyeCodes) > 0 {
  486. err := s.d.DB.Exec(` update bigrefunddetail set sapStatus = 2 where buyeCode in (?)`, buyeCodes).Error
  487. fmt.Println(err)
  488. }
  489. for _, v := range orders {
  490. e, sapNumber := SapReturnOrder(&v, "")
  491. up := model.BigRefunddetail{SapNumber: sapNumber}
  492. if e != nil {
  493. up.SapStatus = 2
  494. up.SapError = e.Error()
  495. } else {
  496. up.SapStatus = 1
  497. }
  498. if e := s.d.DB.Model(&v).Where("buyeCode =?", v.BuyeCode).Updates(up); e != nil {
  499. log.Errorf("BigBuyDetail update error: %v", e)
  500. }
  501. }
  502. }
  503. // SapReturnOrder 发送采购订单到sap
  504. func SapReturnOrder(p *model.BigRefunddetail, dflag string) (error, string) {
  505. r := new(http.SapOrderReq)
  506. rp := new(http.OrderResp)
  507. parts := []model.Refunddetail{}
  508. pa := new(model.Pasture)
  509. pv := new(model.Provider)
  510. //pc := new(model.Bigpartpurchase)
  511. //dp := new(model.Department)
  512. r.Dest.DestID = "EQMAN"
  513. r.Dest.BussTp = "MM007"
  514. //r.Dest.Url = "http://192.168.61.117/SAPQ0/Common/MM007/PurchaseOrder"
  515. //r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM007/PurchaseOrder"
  516. r.Dest.Url = fmt.Sprintf("%s/Common/MM007/PurchaseOrder", config.Conf.Http.Routing)
  517. if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
  518. return errors.Wrapf(e, "provider query:id=%d", p.ProviderID), ""
  519. }
  520. if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
  521. return errors.Wrapf(e, "pasture query:id=%d", p.PastureID), ""
  522. }
  523. if e := s.d.DB.Where("amount>0").Find(&parts, model.Refunddetail{BigID: p.ID}).Order("rowNumber").Error; e != nil || len(parts) == 0 {
  524. return errors.Wrapf(e, "buydetail query:bigid=%d", p.ID), ""
  525. }
  526. //if len(parts) > 0 {
  527. // if e := s.d.DB.Where("name = ? ", parts[0].DepartmentName).Where("pastureid = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
  528. // }
  529. //}
  530. //r.Data.IsCancle = ""
  531. r.Data.PayCondition = ""
  532. r.Data.SupplierCode = pv.SapCode
  533. r.Data.OrderDate = p.BuyerDate.Format("20060102")
  534. r.Data.CurrencyCode = "CNY"
  535. r.Data.ProofType = "ZNB4"
  536. r.Data.EqSysCode = p.BuyeCode
  537. //if dp.CompanyCode == "" {
  538. r.Data.CompanyCode = pa.CompanyCode
  539. r.Data.Organization = pa.ParchaseOrganization
  540. r.Data.Group = pa.PurchasingGroup
  541. //} else {
  542. // r.Data.CompanyCode = dp.CompanyCode
  543. // r.Data.Organization = dp.ParchaseOrganization
  544. // r.Data.Group = dp.PurchasingGroup
  545. //}
  546. r.Data.IsCancle = "X"
  547. for i, v := range parts {
  548. detail := http.SapOrderDetail{}
  549. c := new(model.Contract)
  550. bc := new(model.BigContract)
  551. par := new(model.Parts)
  552. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  553. //return errors.Wrapf(e, "contract query :id=%d", v.ContractID), ""
  554. }
  555. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  556. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  557. }
  558. if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
  559. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  560. }
  561. if v.RowNumber > 0 {
  562. detail.RowNumber = strconv.Itoa(v.RowNumber)
  563. } else {
  564. detail.RowNumber = fmt.Sprintf("%d", (i+1)*10)
  565. }
  566. //if dp.CompanyCode == "" {
  567. detail.Factory = pa.FactoryCode
  568. //} else {
  569. // detail.Factory = dp.Factory
  570. //}
  571. detail.Quantity = fmt.Sprintf("%d", v.Amount)
  572. detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
  573. detail.TaxCode = "J0"
  574. detail.Per = "1"
  575. detail.Location = "1004"
  576. detail.IsOwn = util.ZeroStr(bc.IsZeroStock == 1, "K")
  577. detail.NetPrice = c.Price
  578. detail.Dflag = dflag
  579. if c.PartCode != "" {
  580. detail.Unit = c.Unit
  581. detail.MaterialCode = c.PartCode
  582. } else {
  583. if detail.NetPrice == 0 {
  584. detail.NetPrice = v.Price
  585. }
  586. detail.Unit = par.Unit
  587. detail.MaterialCode = v.PartCode
  588. }
  589. astr := strconv.FormatFloat(detail.NetPrice, 'f', -1, 64)
  590. b := strings.Index(astr, ".")
  591. if len(astr[b+1:]) > 2 && b > 0 {
  592. num, _ := strconv.ParseFloat(astr[b+1:], 64)
  593. if num > 0 {
  594. detail.NetPrice = detail.NetPrice * 1000
  595. detail.NetPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NetPrice), 64)
  596. detail.Per = "1000"
  597. }
  598. }
  599. r.Data.Detail = append(r.Data.Detail, detail)
  600. if e := s.d.DB.Model(&model.Refunddetail{}).Where("id=?", v.ID).Update("rowNumber", detail.RowNumber).Error; e != nil {
  601. log.Errorln(e, v.ID)
  602. }
  603. }
  604. rbyte, _ := json.Marshal(r)
  605. e := s.SyncSap(r, &rp, rbyte)
  606. saplog := new(model.SapLog)
  607. if e == nil && rp.Dest.Status == "S" {
  608. s.d.DB.Create(saplog)
  609. log.Infof("buy order success :eq=%s,sap=%s", rp.Data.EqNumber, rp.Data.SapNumber)
  610. return nil, rp.Data.SapNumber
  611. } else {
  612. if param, e := json.Marshal(r); e != nil {
  613. log.Errorf("sap order param marshal:%v", e)
  614. } else {
  615. saplog.Param = string(param)
  616. saplog.Name = "sap-order"
  617. s.d.DB.Create(saplog)
  618. }
  619. if e == nil {
  620. return errors.Errorf("sap order :%s", rp.Data.MsgText), ""
  621. } else {
  622. return errors.Wrapf(e, "sap order error:%v", e), ""
  623. }
  624. }
  625. //*/
  626. return nil, ""
  627. }
  628. func AutoSrmReturnOrderJob() {
  629. orders := []model.BigRefunddetail{}
  630. if e := s.d.DB.Where("srmStatus=0 and buyerDate >= '2022-10-25' and sapStatus=1 and ifnull(sapNumber,0) > 0 ").Find(&orders, model.BigRefunddetail{SrmStatus: 0}).Error; e != nil {
  631. log.Errorf("AutoSrmOrderJob error: %v", e)
  632. return
  633. }
  634. var buyeCodes []string
  635. for _, v := range orders {
  636. buyeCodes = append(buyeCodes, v.BuyeCode)
  637. }
  638. if len(buyeCodes) > 0 {
  639. s.d.DB.Exec(` update bigrefunddetail set srmStatus = 2 where buyeCode in (?)`, buyeCodes)
  640. }
  641. for _, v := range orders {
  642. SrmReturnOrder(&v, "1")
  643. }
  644. }
  645. func SrmReturnOrder(p *model.BigRefunddetail, isReturn string) {
  646. r := new(http.SrmOrderReq)
  647. rp := new(http.SrmResp)
  648. parts := []model.Refunddetail{}
  649. pa := new(model.Pasture)
  650. pv := new(model.Provider)
  651. //pc := new(model.Bigpartpurchase)
  652. //dp := new(model.Department)
  653. r.Dest.Url = "http://srm.vip.xiandaimuye.com/gateway/serviceApi/invoke/QZbycode/saveByEquipment"
  654. if e := s.d.DB.First(pv, model.Provider{ID: p.ProviderID}).Error; e != nil {
  655. log.Error(e)
  656. return
  657. }
  658. if e := s.d.DB.First(pa, model.Pasture{ID: p.PastureID}).Error; e != nil {
  659. log.Errorf("pasture query :id=%d,%v", p.PastureID, e)
  660. return
  661. }
  662. if e := s.d.DB.Where("amount>0").Find(&parts, model.Refunddetail{BigID: p.ID}).Error; e != nil || len(parts) == 0 {
  663. log.Errorf("buydetail query :bigid=%d,%v", p.ID, e)
  664. return
  665. }
  666. //if e := s.d.DB.Where("matchCode = ? ", p.MatchCode).Find(&pc, model.Bigpartpurchase{}).Error; e != nil {
  667. // return
  668. //}
  669. //if e := s.d.DB.Where("id = ? ", pc.DepartmentID).Find(&dp, model.Department{}).Error; e != nil {
  670. // return
  671. //}
  672. //if len(parts) > 0 {
  673. // if e := s.d.DB.Where("name = ? ", parts[0].DepartmentName).Where("pastureid = ? ", p.PastureID).First(&dp, model.Department{}).Error; e != nil {
  674. // }
  675. //}
  676. //r.Data.CompanyCode = pa.CompanyCode
  677. r.Data.VendorErpCode = pv.SapCode
  678. r.Data.PurchaseOrderDate = p.BuyerDate.Format("20060102")
  679. r.Data.CurrencyCode = "CNY"
  680. r.Data.PurchaseOrderType = "ZNB4"
  681. r.Data.VendorName = pv.ProviderName
  682. r.Data.DeliveryTypeCode = "1"
  683. r.Data.IsReturn = isReturn
  684. r.Data.Remark = ""
  685. r.Data.ErpPurchaseOrderNo = p.SapNumber
  686. r.Data.SapCode = pv.SapCode
  687. r.Data.PurchaseOrderNo = p.BuyeCode
  688. //if dp.CompanyCode == "" {
  689. r.Data.CompanyCode = pa.CompanyCode
  690. r.Data.PurchasingOrgCode = pa.ParchaseOrganization
  691. r.Data.PurchasingGroupCode = pa.PurchasingGroup
  692. //} else {
  693. // r.Data.CompanyCode = dp.CompanyCode
  694. // r.Data.PurchasingOrgCode = dp.ParchaseOrganization
  695. // r.Data.PurchasingGroupCode = dp.PurchasingGroup
  696. //}
  697. for _, v := range parts {
  698. detail := http.SrmOrderDetail{}
  699. c := new(model.Contract)
  700. bc := new(model.BigContract)
  701. pr := new(model.PartRepertory)
  702. par := new(model.Parts)
  703. //part := new(model.Parts)
  704. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  705. log.Errorf("order detail error:%v", e)
  706. //return
  707. }
  708. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  709. log.Errorf("order detail error:%v", e)
  710. //return
  711. }
  712. if len(c.PartCode) > 0 {
  713. if e := s.d.DB.First(par, model.Parts{PartCode: c.PartCode}).Error; e != nil {
  714. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  715. }
  716. } else if len(v.PartCode) > 0 {
  717. if e := s.d.DB.First(par, model.Parts{PartCode: v.PartCode}).Error; e != nil {
  718. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  719. }
  720. }
  721. if c.Brand != "" {
  722. detail.Manufacturer = c.Brand
  723. } else {
  724. brand := new(model.Brand)
  725. if e := s.d.DB.First(brand, model.Brand{ID: v.BrandID}).Error; e != nil {
  726. //return errors.Wrapf(e, "bigcontract query :id=%d", c.BigID), ""
  727. }
  728. detail.Manufacturer = brand.BrandName
  729. }
  730. price := c.Price
  731. if price == 0 {
  732. price = v.Price
  733. }
  734. if c.PartCode != "" {
  735. detail.OrderUnitCode = c.Unit
  736. detail.MaterialCode = c.PartCode
  737. detail.MaterialName = c.PartName
  738. detail.PricingUnitCode = c.Unit
  739. } else {
  740. detail.OrderUnitCode = par.Unit
  741. detail.MaterialCode = par.PartCode
  742. detail.MaterialName = par.Name
  743. detail.PricingUnitCode = par.Unit
  744. }
  745. s.d.DB.First(pr, model.PartRepertory{ContractID: v.ContractID})
  746. r.Data.TotalNonTaxAmount += price
  747. r.Data.TotalTaxAmount += price
  748. detail.RowNo = strconv.Itoa(v.RowNumber)
  749. //detail.Manufacturer = pa.FactoryCode
  750. //detail.Manufacturer =
  751. //if dp.CompanyCode == "" {
  752. detail.Manufacturer = pa.FactoryCode
  753. detail.PlantCode = pa.FactoryCode
  754. //} else {
  755. // detail.Manufacturer = dp.Factory
  756. // detail.PlantCode = dp.Factory
  757. //}
  758. detail.OrderQty = fmt.Sprintf("%d", v.Amount)
  759. detail.DeliveryDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
  760. detail.TaxRateCode = "J0"
  761. detail.NonTaxPrice = price
  762. detail.MaterialDesc = par.Specification
  763. if len(c.PartCode) > 0 {
  764. detail.MaterialGroupCode = strings.ReplaceAll(c.PartCode[:strings.LastIndex(c.PartCode, ".")], ".", "")
  765. } else if len(v.PartCode) > 0 {
  766. fmt.Println(v.PartCode)
  767. detail.MaterialGroupCode = strings.ReplaceAll(v.PartCode[:strings.LastIndex(v.PartCode, ".")], ".", "")
  768. }
  769. detail.Tax = "0"
  770. detail.ConfirmDate = p.BuyerDate.Add(time.Hour * 24 * 7).Format("20060102")
  771. //detail.PlantCode = pa.FactoryCode
  772. //if dp.CompanyCode == "" {
  773. //detail.PlantCode = pa.FactoryCode
  774. //} else {
  775. // detail.PlantCode = dp.Factory
  776. //}
  777. detail.StockLocationCode = "1004"
  778. detail.QualityCheck = "0"
  779. detail.IsReturn = isReturn
  780. detail.OverDeliveryLimit = "0"
  781. detail.ShortDeliveryLimit = "0"
  782. detail.SourceNo = p.BuyeCode[4:]
  783. detail.ContractCode = bc.ContractCode
  784. detail.Remark = c.Remark
  785. //r.Data.Detail = append(r.Data.Detail, detail)
  786. if bc.IsZeroStock == 1 {
  787. detail.PurchaseCategory = "2"
  788. } else {
  789. detail.PurchaseCategory = "0"
  790. }
  791. detail.IsFree = "0"
  792. detail.PriceBase = "1"
  793. astr := strconv.FormatFloat(detail.NonTaxPrice, 'f', -1, 64)
  794. b := strings.Index(astr, ".")
  795. if len(astr[b+1:]) > 2 && b > 0 {
  796. num, _ := strconv.ParseFloat(astr[b+1:], 64)
  797. if num > 0 {
  798. detail.NonTaxPrice = detail.NonTaxPrice * 1000
  799. detail.NonTaxPrice, _ = strconv.ParseFloat(fmt.Sprintf("%.2f", detail.NonTaxPrice), 64)
  800. detail.PriceBase = "1000"
  801. }
  802. }
  803. detail.TaxAmount = detail.NonTaxPrice
  804. detail.TaxPrice = detail.NonTaxPrice
  805. detail.NonTaxAmount = detail.NonTaxPrice
  806. r.Data.Detail = append(r.Data.Detail, detail)
  807. //if e := s.d.DB.Model(&model.BuyDetail{}).Where("id=?", v.ID).Update("rowNumber", i+1).Error; e != nil {
  808. // log.Errorln(e, v.ID)
  809. //}
  810. }
  811. rbyte, _ := json.Marshal([]interface{}{r.Data})
  812. fmt.Println(string(rbyte))
  813. saplog := new(model.SapLog)
  814. saplog.Url = r.Dest.Url
  815. saplog.Param = string(rbyte)
  816. saplog.Name = "srm退货采购订单"
  817. if e := s.SyncSrm(r, rp, rbyte); e != nil {
  818. s.d.DB.Create(saplog)
  819. log.Errorf("sap buy order error: %v", e)
  820. p.SapStatus = 3
  821. } else {
  822. saplog.MsgText = rp.Message
  823. s.d.DB.Create(saplog)
  824. if rp.Success {
  825. p.SapStatus = 1
  826. p.SapNumber = rp.Code
  827. } else {
  828. log.Warnf("buy order fail :msg=%s,r=%v", rp.Code, r)
  829. p.SapStatus = 2
  830. // pp.Print(r)
  831. }
  832. }
  833. if p.SapStatus == 1 {
  834. if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigRefunddetail{SrmStatus: p.SapStatus, SrmNumber: p.SapNumber}).Error; e != nil {
  835. log.Errorf("update big buy detail error: %v", e)
  836. }
  837. } else {
  838. if e := s.d.DB.Where("id=?", p.ID).Updates(&model.BigRefunddetail{SrmStatus: p.SapStatus, SrmError: rp.Message}).Error; e != nil {
  839. log.Errorf("update big buy detail error: %v", e)
  840. }
  841. }
  842. }
  843. func NextProcurement(sqlname, procurementId string, tx *sqlx.Tx) error {
  844. if sqlname == "updateBigbuydetailStatu" {
  845. p := new(model.BigBuyDetail)
  846. s.d.DB.Where("id = ?", procurementId).First(&p)
  847. SapOrder(p, "X", p.PurchaseType)
  848. //SrmOrder(p, "1")
  849. } else if sqlname == "shutDownBigrefunddetail" {
  850. p := new(model.BigRefunddetail)
  851. s.d.DB.Where("id = ?", procurementId).First(&p)
  852. SapReturnOrder(p, "X")
  853. //SrmReturnOrder(p, "1")
  854. }
  855. return nil
  856. }