proof.go 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. "github.com/jmoiron/sqlx"
  6. "github.com/pkg/errors"
  7. "github.com/xormplus/xorm/schemas"
  8. "kpt.xdmy/apiserver/config"
  9. "reflect"
  10. "strconv"
  11. "strings"
  12. "time"
  13. _ "github.com/go-sql-driver/mysql"
  14. "github.com/k0kubun/pp/v3"
  15. log "github.com/sirupsen/logrus"
  16. "kpt.xdmy/apiserver/model"
  17. "kpt.xdmy/apiserver/model/http"
  18. "kpt.xdmy/pkg/util"
  19. )
  20. // sap入库凭证接口,业务触发
  21. func (s *Service) LaidProof(p interface{}, tx *sqlx.Tx) error {
  22. pr := new(http.ProofPartReq)
  23. r := new(http.ProofReq)
  24. rp := new(http.ProofResp)
  25. parts := make([]*model.PartLaidStr, 0)
  26. //buyDetail := []model.BuyDetail{}
  27. //pc := new(model.Bigpartpurchase)
  28. //dp := new(model.Department)
  29. //prs := []model.BigPartLaid{}
  30. if e := util.Unmarshal(p, pr); e != nil {
  31. log.Error(e, p)
  32. return errors.New("转码失败!!!")
  33. }
  34. bp := new(model.BigPartLaid)
  35. bbd := new(model.BigBuyDetailStr)
  36. pa := new(model.Pasture)
  37. bigpartlaidByte, err := MapStr(tx, `select * from bigpartlaid where laidCode = ? `, pr.LaidCode)
  38. if err != nil {
  39. log.Error(err)
  40. return errors.New("无入库信息!!!")
  41. }
  42. if bigpartlaidByte != nil {
  43. data := make(map[string]interface{})
  44. err := json.Unmarshal(bigpartlaidByte, &data)
  45. if err != nil {
  46. log.Error(err)
  47. return errors.New("入库信息转码出错!!!")
  48. }
  49. bp.ID, _ = strconv.Atoi(data["id"].(string))
  50. bp.PurchaseID, _ = data["purchaseId"].(string)
  51. bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
  52. bp.ProofCode, _ = data["ProofCode"].(string)
  53. }
  54. if len(bp.ProofCode) > 1 {
  55. return errors.New(fmt.Sprintf("errors"))
  56. }
  57. partlaidByte, err := GetDataList(tx, `select * from partlaid where bigid = ? `, []interface{}{bp.ID})
  58. if err != nil {
  59. log.Error(err)
  60. return errors.New("无入库详情信息!!!")
  61. }
  62. if partlaidByte != nil {
  63. err := json.Unmarshal(partlaidByte, &parts)
  64. if err != nil {
  65. log.Error(err)
  66. return errors.New("入库信息转码出错!!!")
  67. }
  68. }
  69. bigbuydetailByte, err := MapStr(tx, `select * from bigbuydetail where buyeCode = ? `, bp.PurchaseID)
  70. if err != nil {
  71. log.Error(err)
  72. return errors.New("无入库信息!!!")
  73. }
  74. if bigbuydetailByte != nil {
  75. err := json.Unmarshal(bigbuydetailByte, &bbd)
  76. if err != nil {
  77. log.Error(err)
  78. return errors.New("入库信息转码出错!!!")
  79. }
  80. }
  81. if e := s.d.DB.Raw(` select * from pasture where id = ? `, bp.PastureID).First(pa).Error; e != nil {
  82. log.Error(e)
  83. return errors.New("查询牧场详情出错!!!")
  84. }
  85. proofDest(r)
  86. r.Dest.MESSIDOS = pr.LaidCode
  87. r.Dest.BUSSDOCOS = pr.LaidCode
  88. r.Data.EqNumber = pr.LaidCode
  89. r.Data.CreateTime = time.Now().Format("20060102")
  90. if t, e := util.ParseDate(pr.StorageTime[:10]); e != nil {
  91. log.Errorf("parse time error:err=%v,param=%v", e, pr.StorageTime)
  92. } else {
  93. r.Data.PostDate = t.Format("20060102")
  94. }
  95. for i, v := range parts {
  96. if v.StorageAmount == "0" {
  97. continue
  98. }
  99. sdetail := http.ProofDetail{MoveType: "101"}
  100. c := new(model.Contract)
  101. bc := new(model.BigContract)
  102. bd := new(model.BuyDetailStr)
  103. pro := new(model.Provider)
  104. //w := new(model.Warehouse)
  105. contractID, _ := v.ContractID.(float64)
  106. if e := s.d.DB.Raw(` select * from contract where id = ?`, contractID).First(c).Error; e != nil {
  107. log.Errorf("contract query error:%v", e)
  108. //return
  109. }
  110. if e := s.d.DB.Raw(`select * from bigcontract where id = ? `, c.BigID).First(bc).Error; e != nil {
  111. log.Errorf("bigcontract query error:%v", e)
  112. //return
  113. }
  114. //if e := s.d.DB.Where("id = ?", v.LocationID).First(w).Error; e != nil {
  115. // log.Error(e)
  116. // return errors.New("查询库位信息出错!!!")
  117. //}
  118. if e := s.d.DB.Raw(`select * from provider where id = ? `, v.ProviderID).First(pro).Error; e != nil {
  119. log.Error(e)
  120. return errors.New("查询供应商信息出错!!!")
  121. }
  122. if contractID > 0 {
  123. buydetailByte, err := MapStr(tx, `select * from buydetail where bigid = ? and contractId = ? `, bbd.ID, v.ContractID)
  124. if err != nil {
  125. log.Error(err)
  126. //return errors.New("查询供应商信息出错!!!")
  127. }
  128. if buydetailByte != nil {
  129. err := json.Unmarshal(buydetailByte, &bd)
  130. if err != nil {
  131. return errors.New("查询BuyDetail转码出错!!!")
  132. }
  133. }
  134. sdetail.OrderRowNum = bd.RowNumber
  135. } else {
  136. buydetailByte, err := MapStr(tx, `select * from buydetail where bigid = ? and partCode = ? `, bbd.ID, v.PartCode)
  137. if err != nil {
  138. log.Error(err)
  139. //return errors.New("查询供应商信息出错!!!")
  140. }
  141. if buydetailByte != nil {
  142. err := json.Unmarshal(buydetailByte, &bd)
  143. if err != nil {
  144. return errors.New("查询BuyDetail转码出错!!!")
  145. }
  146. }
  147. sdetail.OrderRowNum = bd.RowNumber
  148. }
  149. //rowNumber, _ :=
  150. if v.RowNumber.(float64) > 0 {
  151. sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
  152. } else {
  153. sdetail.RowNumber = fmt.Sprintf("%d", (i + 1))
  154. }
  155. sdetail.Quantity = fmt.Sprintf("%v", v.StorageAmount)
  156. sdetail.Unit = v.Unit.(string)
  157. sdetail.Code = v.PartCode.(string)
  158. sdetail.SaveType = util.ZeroStr(bc.IsZeroStock == 1, "K")
  159. //if dp.Factory == "" {
  160. sdetail.Factory = pa.FactoryCode
  161. //} else {
  162. // sdetail.Factory = dp.Factory
  163. //}
  164. sdetail.Location = "1004"
  165. sdetail.OrderNumber = bbd.SapNumber
  166. sdetail.Provider = pro.SapCode
  167. r.Data.Detail = append(r.Data.Detail, sdetail)
  168. //if e := s.d.DB.Model(&model.PartLaid{}).Where("id=?", v.ID).Update("rowNumber", sdetail.RowNumber).Error; e != nil {
  169. // log.Errorln(e, v.ID)
  170. //}
  171. _, err = tx.Exec(` update partlaid set rowNumber = ? where id = ? `, sdetail.RowNumber, v.ID)
  172. if err != nil {
  173. return err
  174. }
  175. }
  176. ///*
  177. rbyte, _ := json.Marshal(r)
  178. fmt.Println(string(rbyte))
  179. if e := s.SyncSap(r, rp, rbyte); e != nil {
  180. log.Error(e)
  181. fmt.Println(e)
  182. return errors.New(fmt.Sprintf("传输sap errors:%s", r.MessText))
  183. } else {
  184. if rp.Dest.Status == "S" {
  185. log.Printf("laid proof success:%s,%s", rp.Data.EqNumber, rp.Data.SapNumber)
  186. tx.Exec(` update bigpartlaid set ProofCode = ? where laidcode = ? `, rp.Data.SapNumber, rp.Data.EqNumber)
  187. } else {
  188. log.Warnf("%s laid proof failed:causetext=%s", rp.Dest.MessText)
  189. pp.Print(r)
  190. fmt.Println(e)
  191. return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
  192. }
  193. }
  194. //*/
  195. return nil
  196. }
  197. // UseProof 出库单推送sap,包括了报废出库
  198. func (s *Service) UseProof(p interface{}, tx *sqlx.Tx) error {
  199. pr := new(http.ProofPartReq)
  200. r := new(http.ProofReq)
  201. rp := new(http.ProofResp)
  202. parts := make([]*model.PartUseStr, 0)
  203. bp := new(model.BigPartUse)
  204. pa := new(model.Pasture)
  205. dp := new(model.Department)
  206. if e := util.Unmarshal(p, pr); e != nil {
  207. log.Error(e)
  208. return errors.New(fmt.Sprintf("数据转码 errors:%v", e))
  209. }
  210. bigpartUseByte, err := MapStr(tx, `select * from bigpartUse where useForm = ? `, pr.UseForm)
  211. if err != nil {
  212. log.Error(err)
  213. return errors.New(fmt.Sprintf("查询不到出库单 errors:%v", err))
  214. }
  215. if bigpartUseByte != nil {
  216. data := make(map[string]interface{})
  217. err := json.Unmarshal(bigpartUseByte, &data)
  218. if err != nil {
  219. log.Error(err)
  220. return errors.New(fmt.Sprintf("查询出库单 errors:%v", err))
  221. }
  222. bp.ID, _ = strconv.Atoi(data["id"].(string))
  223. bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
  224. bp.ProofCode, _ = data["ProofCode"].(string)
  225. bp.DepartmentID, _ = strconv.Atoi(data["departmentId"].(string))
  226. bp.UseType, _ = strconv.Atoi(data["useType"].(string))
  227. if data["useType"] != "6" {
  228. if _, ok := data["oddCode"]; !ok {
  229. return errors.New(fmt.Sprintf("查询出库单 OddCode 出错!!!"))
  230. }
  231. bp.OddCode = data["oddCode"].(string)
  232. if bp.OddCode == "" {
  233. return errors.New(fmt.Sprintf("查询出库单 OddCode 出错!!!"))
  234. }
  235. }
  236. }
  237. if len(bp.ProofCode) > 1 {
  238. return errors.New("出库单已传输Sap!!!")
  239. }
  240. partusebyte, err := GetDataList(tx, ` select * from partuse where bigid = ?`, []interface{}{bp.ID})
  241. if err != nil {
  242. log.Error(err)
  243. return errors.New("查询入库详情出错!!!")
  244. }
  245. if partusebyte != nil {
  246. err := json.Unmarshal(partusebyte, &parts)
  247. if err != nil {
  248. log.Error(err)
  249. return errors.New("查询入库详情出错!!!")
  250. }
  251. }
  252. pp.Print(bp)
  253. if e := s.d.DB.First(pa, model.Pasture{ID: bp.PastureID}).Error; e != nil {
  254. log.Error(e)
  255. return errors.New(fmt.Sprintf("查询牧场信息 errors:%v", e))
  256. }
  257. //if e := s.d.DB.First(dp, model.big{ID: bp.DepartmentID, PastureID: bp.PastureID}).Error; e != nil {
  258. // log.Error(e)
  259. // return errors.New("查询部门信息出错!!!")
  260. //}
  261. departmentSqlStr := fmt.Sprintf("select * from Department where id = (select departmentId from bigpartapply where applyCode = '%s' )", bp.OddCode)
  262. if bp.UseType == 6 {
  263. departmentSqlStr = fmt.Sprintf("select * from Department where id = %d", bp.DepartmentID)
  264. }
  265. if e := s.d.DB.Raw(departmentSqlStr).First(dp).Error; e != nil {
  266. log.Error(e)
  267. return errors.New("查询部门信息出错!!!")
  268. }
  269. // pp.Println(bp, d)
  270. proofDest(r)
  271. //b, _ := json.Marshal(pr)
  272. //restful.Dbs.DB.Exec(` insert into equipmentlingshi(text)values(?)`, string(b))
  273. r.Dest.MESSIDOS = pr.UseForm
  274. r.Dest.BUSSDOCOS = pr.UseForm
  275. r.Data.EqNumber = pr.UseForm
  276. r.Data.CreateTime = time.Now().Format("20060102")
  277. if t, e := util.ParseDate(pr.ReceiveTime[:10]); e != nil {
  278. log.Error(e, pr.ReceiveTime)
  279. } else {
  280. r.Data.PostDate = t.Format("20060102")
  281. }
  282. for i, v := range parts {
  283. bc := new(model.BigContract)
  284. c := new(model.Contract)
  285. //w := new(model.Warehouse)
  286. pv := new(model.Provider)
  287. eq := new(model.Equipment)
  288. storage := new(model.PartRepertory)
  289. dict := new(model.Dictlist)
  290. contractID, _ := strconv.Atoi(v.ContractID.(string))
  291. if contractID < 0 {
  292. if e := s.d.DB.First(storage, model.PartRepertory{ContractID: contractID}).Error; e != nil {
  293. log.Errorln(e, v.ContractID)
  294. return errors.New(fmt.Sprintf("查询库存信息出错 errors:%v", e))
  295. }
  296. if e := s.d.DB.First(pv, model.Provider{ID: storage.ProviderID}).Error; e != nil {
  297. log.Errorln(e, storage.ProviderID)
  298. return errors.New(fmt.Sprintf("查询供应商信息出错 errors:%v", e))
  299. }
  300. } else {
  301. if e := s.d.DB.Where("id = ? ", v.ContractID).First(c).Error; e != nil {
  302. log.Errorf("contract query error:%v", e)
  303. return errors.New(fmt.Sprintf("查询合同信息 errors:%v", e))
  304. }
  305. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  306. log.Errorf("bigcontract query error:%v", e)
  307. return errors.New(fmt.Sprintf("查询合同信息 errors:%v", e))
  308. }
  309. if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
  310. log.Errorln(e, bc.ProviderID)
  311. return errors.New(fmt.Sprintf("无供应商信息请检查合同%s对应的供应商", bc.ContractCode))
  312. }
  313. }
  314. s.d.DB.First(dict, model.Dictlist{Pid: 21, Value: v.UseTypeV.(string)})
  315. //if e := s.d.DB.First(w, model.Warehouse{ID: v.LocationID}).Error; e != nil {
  316. // log.Errorln(e, v.LocationID)
  317. // return errors.New(fmt.Sprintf("errors:%v", e))
  318. //}
  319. if e := s.d.DB.Where("eqCode = ? and pastureid = ? ", v.EqCode, pr.PastureID).First(eq).Error; e != nil {
  320. log.Errorln(e, v.EqID)
  321. return errors.New(fmt.Sprintf("errors:%v", e))
  322. }
  323. sdetail := http.ProofDetail{}
  324. sdetail.EXT01 = dict.Label
  325. // 报废出库
  326. if pr.UseType == 5 {
  327. sdetail.MoveType = "Z19"
  328. if contractID > 0 && bc.IsZeroStock != 0 {
  329. log.Info("寄售不能报废=======")
  330. return errors.New(fmt.Sprintf("寄售不能报废======= errors"))
  331. }
  332. }
  333. // 领用出库、手动出库
  334. //if pr.UseType == 0 || pr.UseType == 1 {
  335. sdetail.MoveType = "201"
  336. sdetail.CostCenter = dp.CostCenterCode
  337. //if dp.Factory == "" {
  338. sdetail.Factory = pa.FactoryCode
  339. //} else {
  340. // sdetail.Factory = dp.Factory
  341. //}
  342. // 青贮技术
  343. if pr.UseType == 6 {
  344. sdetail.MoveType = "Z69"
  345. sdetail.AUFNR = pr.GreenFodderNumber
  346. }
  347. if sdetail.Factory == "M005" && strings.Contains(dp.Name, "二期") {
  348. sdetail.Factory = "M017"
  349. }
  350. if v.RowNumber.(float64) > 0 {
  351. sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
  352. } else {
  353. sdetail.RowNumber = fmt.Sprintf("%d", (i + 1))
  354. }
  355. sdetail.Quantity = fmt.Sprintf("%v", v.CheckoutNumber)
  356. sdetail.Unit = v.Unit.(string)
  357. sdetail.Code = v.PartCode.(string)
  358. sdetail.AssetCode = eq.SapCode
  359. sdetail.AssetSon = eq.SonCode
  360. sdetail.Location = "1004"
  361. if contractID > 0 && bc.IsZeroStock == 1 {
  362. sdetail.SaveType = "K"
  363. }
  364. if sdetail.SaveType == "K" {
  365. sdetail.Provider = pv.SapCode
  366. }
  367. r.Data.Detail = append(r.Data.Detail, sdetail)
  368. //if e := s.d.DB.Model(&model.PartUse{}).Where("id=?", v.ID).Update("rowNumber", sdetail.RowNumber).Error; e != nil {
  369. // log.Errorln(e, v.ID)
  370. //}
  371. _, err = tx.Exec(` update partuse set rowNumber = ? where id = ? `, sdetail.RowNumber, v.ID)
  372. if err != nil {
  373. return err
  374. }
  375. }
  376. //}
  377. ///*
  378. pp.Print(r)
  379. log.Infof("bp.pastureId:%d,pa.name:%s,pa.companycode:%s", bp.PastureID, pa.Name, pa.CompanyCode)
  380. rbyte, _ := json.Marshal(r)
  381. fmt.Println(string(rbyte))
  382. if e := s.SyncSap(r, rp, rbyte); e != nil {
  383. log.Errorf("laid proof error:%v", e)
  384. return errors.New(fmt.Sprintf("errors:%s", r.MessText))
  385. } else {
  386. if rp.Dest.Status == "S" {
  387. log.Printf("use proof success:eqcode=%s,sapcode=%s", rp.Data.EqNumber, rp.Data.SapNumber)
  388. //if e := s.d.DB.Model(&model.BigPartUse{}).Where("useform = ?", rp.Data.EqNumber).Update("ProofCode", rp.Data.SapNumber).Error; e != nil {
  389. // log.Errorln(e)
  390. //}
  391. tx.Exec(` update bigpartuse set ProofCode = ? where useform = ? `, rp.Data.SapNumber, rp.Data.EqNumber)
  392. } else {
  393. log.Warnf(" use proof :%s", rp.Dest.MessText)
  394. return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
  395. }
  396. }
  397. return nil
  398. }
  399. // 退库单推送sap
  400. func (s *Service) QuitProof(p interface{}, tx *sqlx.Tx) error {
  401. pr := new(http.ProofPartReq)
  402. r := new(http.ProofReq)
  403. rp := new(http.ProofResp)
  404. parts := make([]*model.PartquitStr, 0)
  405. bp := new(model.BigPartquit)
  406. pa := new(model.Pasture)
  407. d := new(model.Department)
  408. if e := util.Unmarshal(p, pr); e != nil {
  409. log.Error(e)
  410. return errors.New(fmt.Sprintf("errors:%v", e))
  411. }
  412. //defer func() {
  413. // if msg := recover(); msg != nil {
  414. // fmt.Println("panic信息:", msg, "---recover恢复---")
  415. // }
  416. //}()
  417. //if e := s.d.DB.First(bp, model.BigPartquit{UseForm: pr.UseForm}).Error; e != nil {
  418. // log.Error(e)
  419. // return errors.New(fmt.Sprintf("errors:%v", e))
  420. //}
  421. bigpartquitByte, err := MapStr(tx, `select * from bigpartquit where useForm = ? `, pr.UseForm)
  422. if err != nil {
  423. log.Error(err)
  424. return errors.New(fmt.Sprintf("无退库单信息 errors:%v", err))
  425. }
  426. if bigpartquitByte != nil {
  427. data := make(map[string]interface{})
  428. err := json.Unmarshal(bigpartquitByte, &data)
  429. if err != nil {
  430. log.Error(err)
  431. return errors.New(fmt.Sprintf("无退库单信息 errors:%v", err))
  432. }
  433. bp.ID, _ = strconv.Atoi(data["id"].(string))
  434. bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
  435. bp.ProofCode, _ = data["ProofCode"].(string)
  436. bp.DeptID, _ = strconv.Atoi(data["deptId"].(string))
  437. }
  438. if len(bp.ProofCode) > 1 {
  439. return errors.New(fmt.Sprintf("errors"))
  440. }
  441. partquitByte, err := GetDataList(tx, `select * from partquit where bigid = ? `, []interface{}{bp.ID})
  442. if err != nil {
  443. log.Error(err)
  444. return errors.New("无退货详情信息!!!")
  445. }
  446. if partquitByte != nil {
  447. err := json.Unmarshal(partquitByte, &parts)
  448. if err != nil {
  449. log.Error(err)
  450. return errors.New("退货详情信息转码出错!!!")
  451. }
  452. }
  453. if e := s.d.DB.First(pa, model.Pasture{ID: bp.PastureID}).Error; e != nil {
  454. log.Error(e)
  455. return errors.New(fmt.Sprintf("无牧场信息 errors:%v", err))
  456. }
  457. if e := s.d.DB.First(d, model.Department{ID: bp.DeptID}).Error; e != nil {
  458. log.Error(e)
  459. return errors.New(fmt.Sprintf("无部门信息 errors:%v", err))
  460. }
  461. var useFormCount int64
  462. if e := s.d.DB.Table("bigpartquit").Where(" useForm = ? ", pr.UseForm).Count(&useFormCount).Error; e != nil {
  463. log.Error(e)
  464. }
  465. useForm := fmt.Sprintf("%stk%d", pr.UseForm, useFormCount+1)
  466. proofDest(r)
  467. r.Dest.MESSIDOS = useForm
  468. r.Dest.BUSSDOCOS = useForm
  469. r.Data.EqNumber = useForm
  470. r.Data.CreateTime = time.Now().Format("20060102")
  471. if t, e := util.ParseDate(pr.QuitDate); e != nil {
  472. log.Error(e, pr.QuitDate)
  473. } else {
  474. r.Data.PostDate = t.Format("20060102")
  475. }
  476. for i, v := range parts {
  477. c := new(model.Contract)
  478. bc := new(model.BigContract)
  479. pv := new(model.Provider)
  480. // w := new(model.Warehouse)
  481. //
  482. /*
  483. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  484. log.Errorf("contract query error:%v", e)
  485. return errors.New(fmt.Sprintf("errors:%v", e))
  486. }
  487. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  488. log.Errorf("bigcontract query error:%v", e)
  489. return errors.New(fmt.Sprintf("errors:%v", e))
  490. }
  491. if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
  492. log.Errorln(e, bc.ProviderID)
  493. return errors.New(fmt.Sprintf("errors:%v", e))
  494. }
  495. */
  496. contractID, _ := strconv.Atoi(v.ContractID.(string))
  497. if contractID > 0 {
  498. if e := s.d.DB.First(c, model.Contract{ID: contractID}).Error; e != nil {
  499. log.Errorf("contract query error:%v", e)
  500. return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
  501. }
  502. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  503. log.Errorf("bigcontract query error:%v", e)
  504. return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
  505. }
  506. if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
  507. log.Errorln(e, bc.ProviderID)
  508. return errors.New(fmt.Sprintf("供应商不存在 errors:%v", err))
  509. }
  510. } else {
  511. if e := s.d.DB.Where("id = ?", v.ProviderID).First(pv).Error; e != nil {
  512. log.Errorf("refund proof provider:id=%d,%v", bc.ProviderID, e)
  513. return errors.New(fmt.Sprintf("供应商不存在 errors:%v", err))
  514. }
  515. }
  516. sdetail := http.ProofDetail{MoveType: "202"}
  517. if v.RowNumber.(float64) > 0 {
  518. sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
  519. } else {
  520. sdetail.RowNumber = fmt.Sprintf("%d", i+1)
  521. }
  522. sdetail.Quantity = fmt.Sprintf("%v", v.QuitNumber)
  523. sdetail.Unit = c.Unit
  524. sdetail.Factory = pa.FactoryCode
  525. sdetail.CostCenter = d.CostCenterCode
  526. sdetail.Location = "1004"
  527. sdetail.Provider = pv.SapCode
  528. sdetail.SaveType = util.ZeroStr(bc.IsZeroStock == 1, "K")
  529. r.Data.Detail = append(r.Data.Detail, sdetail)
  530. _, err = tx.Exec(` update partquit set rowNumber = ? where id = ? `, sdetail.RowNumber, v.ID)
  531. if err != nil {
  532. log.Error(err)
  533. return err
  534. }
  535. }
  536. rbyte, _ := json.Marshal(r)
  537. fmt.Println(string(rbyte))
  538. if e := s.SyncSap(r, rp, rbyte); e != nil {
  539. log.Errorf("laid proof error:%v", e)
  540. return errors.New(fmt.Sprintf("errors:%v", e))
  541. } else {
  542. if rp.Dest.Status == "S" {
  543. log.Printf("quit proof success:eqcode=%s,sapcode=%s", rp.Data.EqNumber, rp.Data.SapNumber)
  544. //if e := s.d.DB.Model(&model.BigPartquit{}).Where("useform = ?", rp.Data.EqNumber).Update("ProofCode", rp.Data.SapNumber).Error; e != nil {
  545. // log.Errorln(e)
  546. // return err
  547. //}
  548. tx.Exec(` update bigpartquit set ProofCode = ? where useform = ? `, rp.Data.SapNumber, rp.Data.EqNumber)
  549. } else {
  550. log.Warnf("%s quit proof failed:causetext=%s", rp.Dest.MessText)
  551. pp.Print(r)
  552. return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
  553. }
  554. }
  555. return nil
  556. }
  557. // 退货单推送sap
  558. func (s *Service) RefundProof(p interface{}, tx *sqlx.Tx) error {
  559. pr := new(model.RefundParam)
  560. r := new(http.ProofReq)
  561. rp := new(http.ProofResp)
  562. parts := make([]*model.PartRefundStr, 0)
  563. bp := new(model.BigPartRefund)
  564. pa := new(model.Pasture)
  565. if e := util.Unmarshal(p, pr); e != nil {
  566. log.Error(e)
  567. log.Info("%v", pr)
  568. return errors.New(fmt.Sprintf("errors:%v", e))
  569. }
  570. pid := pr.ID
  571. bigpartrefundByte, err := MapStr(tx, `select * from bigpartrefund where id = ? `, pid)
  572. if err != nil {
  573. log.Error(err)
  574. return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
  575. }
  576. if bigpartrefundByte != nil {
  577. data := make(map[string]interface{})
  578. err := json.Unmarshal(bigpartrefundByte, &data)
  579. if err != nil {
  580. log.Error(err)
  581. return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
  582. }
  583. bp.ID, _ = strconv.Atoi(data["id"].(string))
  584. bp.PastureID, _ = strconv.Atoi(data["pastureId"].(string))
  585. bp.ProofCode, _ = data["ProofCode"].(string)
  586. bp.UseForm = data["useForm"].(string)
  587. bp.CreateTime, _ = data["createTime"].(time.Time)
  588. t, err := time.Parse("2006-01-02T15:04:05", data["createTime"].(string)[:len("2006-01-02 15:04:05")])
  589. if err != nil {
  590. log.Error(err)
  591. return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
  592. }
  593. fmt.Println(t)
  594. bp.CreateTime = t
  595. bp.ProviderID, _ = strconv.Atoi(data["providerId"].(string))
  596. if _, ok := data["purchaseId"]; ok {
  597. bp.PurchaseId = data["purchaseId"].(string)
  598. }
  599. }
  600. if len(bp.ProofCode) > 1 {
  601. return errors.New(fmt.Sprintf("errors"))
  602. }
  603. //if e := s.d.DB.Find(&parts, model.PartRefund{BigID: bp.ID}).Error; e != nil || len(parts) == 0 {
  604. // log.Error(e)
  605. // return errors.New("无退货详情信息!!!")
  606. //}
  607. partquitByte, err := GetDataList(tx, `select * from partrefund where bigid = ? `, []interface{}{bp.ID})
  608. if err != nil {
  609. log.Error(err)
  610. return errors.New("无退货详情信息!!!")
  611. }
  612. if partquitByte != nil {
  613. err := json.Unmarshal(partquitByte, &parts)
  614. if err != nil {
  615. log.Error(err)
  616. return errors.New("退货详情信息转码出错!!!")
  617. }
  618. }
  619. if e := s.d.DB.First(pa, model.Pasture{ID: bp.PastureID}).Error; e != nil {
  620. log.Error(e)
  621. return errors.New(fmt.Sprintf("查询退货 errors:%v", err))
  622. }
  623. proofDest(r)
  624. r.Dest.MESSIDOS = bp.UseForm
  625. r.Dest.BUSSDOCOS = bp.UseForm
  626. r.Data.EqNumber = bp.UseForm
  627. r.Data.PostDate = bp.CreateTime.Format("20060102")
  628. r.Data.CreateTime = time.Now().Format("20060102")
  629. for i, v := range parts {
  630. sdetail := http.ProofDetail{}
  631. c := new(model.Contract)
  632. bc := new(model.BigContract)
  633. //bd := new(model.BuyDetail)
  634. //bbd := new(model.BigBuyDetail)
  635. pv := new(model.Provider)
  636. /*
  637. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  638. log.Errorf("contract query error:%v", e)
  639. return errors.New(fmt.Sprintf("errors:%v", e))
  640. }
  641. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  642. log.Errorf("bigcontract query error:%v", e)
  643. return errors.New(fmt.Sprintf("errors:%v", e))
  644. }
  645. if e := s.d.DB.Order("id desc").First(bd, model.BuyDetail{ContractID: v.ContractID}).Error; e != nil {
  646. log.Error(e)
  647. return errors.New(fmt.Sprintf("errors:%v", e))
  648. }
  649. if e := s.d.DB.First(bbd, model.BigBuyDetail{ID: bd.BigID}).Error; e != nil {
  650. log.Errorf("refund proof bigbuydetail:id=%d,%v", bd.BigID, e)
  651. return errors.New(fmt.Sprintf("errors:%v", e))
  652. }
  653. if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
  654. log.Errorf("refund proof provider:id=%d,%v", bc.ProviderID, e)
  655. return errors.New(fmt.Sprintf("errors:%v", e))
  656. }
  657. */
  658. contractID, _ := strconv.Atoi(v.ContractID.(string))
  659. if contractID > 0 {
  660. if e := s.d.DB.First(c, model.Contract{ID: contractID}).Error; e != nil {
  661. log.Errorf("contract query error:%v", e)
  662. return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
  663. }
  664. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  665. log.Errorf("bigcontract query error:%v", e)
  666. return errors.New(fmt.Sprintf("合同不存在 errors:%v", err))
  667. }
  668. if e := s.d.DB.First(pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
  669. log.Errorln(e, bc.ProviderID)
  670. return errors.New(fmt.Sprintf("供应商不存在 errors:%v", err))
  671. }
  672. //return nil
  673. } else {
  674. if e := s.d.DB.First(pv, model.Provider{ID: bp.ProviderID}).Error; e != nil {
  675. log.Errorf("refund proof provider:id=%d,%v", bc.ProviderID, e)
  676. return errors.New(fmt.Sprintf("errors:%v", e))
  677. }
  678. }
  679. refunddetail := new(model.BigRefunddetail)
  680. s.d.DB.Raw(` select * from bigrefunddetail where buyeCode = ? `, bp.PurchaseId).First(&refunddetail)
  681. if bc.IsZeroStock == 0 {
  682. sdetail.MoveType = "161"
  683. } else {
  684. sdetail.MoveType = "502"
  685. }
  686. if v.RowNumber.(float64) > 0 {
  687. sdetail.RowNumber = fmt.Sprintf("%v", v.RowNumber)
  688. } else {
  689. sdetail.RowNumber = fmt.Sprintf("%d", (i+1)*10)
  690. }
  691. sdetail.Quantity = fmt.Sprintf("%v", v.RefundNumber)
  692. if v.PartCode == "" {
  693. sdetail.Unit = c.Unit
  694. sdetail.Code = c.PartCode
  695. } else {
  696. sdetail.Unit = v.Unit.(string)
  697. sdetail.Code = v.PartCode.(string)
  698. }
  699. sdetail.SaveType = util.ZeroStr(bc.IsZeroStock == 1, "K")
  700. sdetail.Factory = pa.FactoryCode
  701. sdetail.Location = "1004"
  702. sdetail.OrderNumber = refunddetail.SapNumber
  703. sdetail.OrderRowNum = fmt.Sprintf("%s", sdetail.RowNumber)
  704. sdetail.Provider = pv.SapCode
  705. r.Data.Detail = append(r.Data.Detail, sdetail)
  706. //if e := s.d.DB.Model(&model.PartRefund{}).Where("id=?", v.ID).Update("rowNumber", sdetail.RowNumber).Error; e != nil {
  707. // log.Errorln(e, v.ID)
  708. //}
  709. _, err = tx.Exec(` update partrefund set rowNumber = ? where id = ? `, sdetail.RowNumber, v.ID)
  710. if err != nil {
  711. log.Error(err)
  712. return err
  713. }
  714. }
  715. rbyte, _ := json.Marshal(r)
  716. fmt.Println(string(rbyte))
  717. if e := s.SyncSap(r, rp, rbyte); e != nil {
  718. log.Error(e)
  719. return errors.New(fmt.Sprintf("errors:%v", e))
  720. } else {
  721. if rp.Dest.Status == "S" {
  722. log.Printf("refund proof success:%s,%s", rp.Data.EqNumber, rp.Data.SapNumber)
  723. //if e := s.d.DB.Model(&model.BigPartRefund{}).Where("useform = ?", rp.Data.EqNumber).Update("ProofCode", rp.Data.SapNumber).Error; e != nil {
  724. // log.Errorln(e)
  725. //}
  726. tx.Exec(` update bigpartrefund set ProofCode = ? where useform = ? `, rp.Data.SapNumber, rp.Data.EqNumber)
  727. } else {
  728. log.Warnf("return good fail: %s", rp.Dest.MessText)
  729. return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
  730. }
  731. }
  732. return nil
  733. }
  734. func proofDest(p *http.ProofReq) {
  735. p.Dest.DestID = "EQMAN"
  736. p.Dest.BussTp = "MM001"
  737. //p.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM001/ModifyMblnr"
  738. p.Dest.Url = fmt.Sprintf("%s/Common/MM001/ModifyMblnr", config.Conf.Http.Routing)
  739. //p.Dest.Url = "http://192.168.61.117/SAPQ0/Common/MM001/ModifyMblnr"
  740. }
  741. func MapStr(tx *sqlx.Tx, sql string, param ...interface{}) ([]byte, error) {
  742. m := make(map[string]interface{})
  743. rows, err := tx.Queryx(sql, param...)
  744. if err != nil {
  745. return nil, err
  746. }
  747. col, err := rows.Columns()
  748. if err != nil {
  749. return nil, err
  750. }
  751. if rows.Next() {
  752. rs, err := rows.SliceScan()
  753. if err != nil {
  754. return nil, err
  755. }
  756. for i, r := range rs {
  757. m[col[i]] = r
  758. switch r.(type) {
  759. case []uint8:
  760. m[col[i]] = string(r.([]uint8))
  761. case int64:
  762. m[col[i]] = strconv.FormatInt(r.(int64), 10)
  763. }
  764. }
  765. }
  766. defer func() {
  767. rows.Close()
  768. }()
  769. b, err := json.Marshal(m)
  770. if err != nil {
  771. return nil, err
  772. }
  773. return b, nil
  774. }
  775. func GetDataList(tx *sqlx.Tx, sqlstr string, args []interface{}) ([]byte, error) {
  776. row, err := tx.Queryx(sqlstr, args...)
  777. if err != nil {
  778. return nil, err
  779. }
  780. defer row.Close()
  781. results, err := rows2mapObjects(row)
  782. if err != nil {
  783. return nil, err
  784. }
  785. b, err := json.Marshal(results)
  786. return b, err
  787. }
  788. func rows2mapObjects(rows *sqlx.Rows) (resultsSlice []map[string]interface{}, err error) {
  789. fields, err := rows.Columns()
  790. if err != nil {
  791. return nil, err
  792. }
  793. defer rows.Close()
  794. for rows.Next() {
  795. result, err := rows2mapObject(rows, fields)
  796. if err != nil {
  797. return nil, err
  798. }
  799. resultsSlice = append(resultsSlice, result)
  800. }
  801. return resultsSlice, nil
  802. }
  803. func rows2mapObject(rows *sqlx.Rows, fields []string) (resultsMap map[string]interface{}, err error) {
  804. result := make(map[string]interface{})
  805. scanResultContainers := make([]interface{}, len(fields))
  806. for i := 0; i < len(fields); i++ {
  807. var scanResultContainer interface{}
  808. scanResultContainers[i] = &scanResultContainer
  809. }
  810. if err := rows.Scan(scanResultContainers...); err != nil {
  811. return nil, err
  812. }
  813. for ii, key := range fields {
  814. rawValue := reflect.Indirect(reflect.ValueOf(scanResultContainers[ii]))
  815. //if row is null then ignore
  816. if rawValue.Interface() == nil {
  817. continue
  818. }
  819. if data, err := value2Object(&rawValue); err == nil {
  820. result[key] = data
  821. } else {
  822. return nil, err // !nashtsai! REVIEW, should return err or just error log?
  823. }
  824. }
  825. return result, nil
  826. }
  827. func value2Object(rawValue *reflect.Value) (data interface{}, err error) {
  828. data, err = reflect2object(rawValue)
  829. if err != nil {
  830. return
  831. }
  832. return
  833. }
  834. func reflect2object(rawValue *reflect.Value) (value interface{}, err error) {
  835. aa := reflect.TypeOf((*rawValue).Interface())
  836. vv := reflect.ValueOf((*rawValue).Interface())
  837. switch aa.Kind() {
  838. case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
  839. value = vv.Int()
  840. case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
  841. value = vv.Uint()
  842. case reflect.Float32, reflect.Float64:
  843. value = vv.Float()
  844. case reflect.String:
  845. value = vv.String()
  846. case reflect.Array, reflect.Slice:
  847. switch aa.Elem().Kind() {
  848. case reflect.Uint8:
  849. data := rawValue.Interface().([]byte)
  850. value = string(data)
  851. default:
  852. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  853. }
  854. // time type
  855. case reflect.Struct:
  856. if aa.ConvertibleTo(schemas.TimeType) {
  857. value = vv.Convert(schemas.TimeType).Interface().(time.Time)
  858. } else {
  859. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  860. }
  861. case reflect.Bool:
  862. value = vv.Bool()
  863. case reflect.Complex128, reflect.Complex64:
  864. value = vv.Complex()
  865. /* TODO: unsupported types below
  866. case reflect.Map:
  867. case reflect.Ptr:
  868. case reflect.Uintptr:
  869. case reflect.UnsafePointer:
  870. case reflect.Chan, reflect.Func, reflect.Interface:
  871. */
  872. default:
  873. err = fmt.Errorf("Unsupported struct type %v", vv.Type().Name())
  874. }
  875. return
  876. }