order.go 29 KB

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