charge_off.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448
  1. package service
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. _ "github.com/go-sql-driver/mysql"
  6. "github.com/k0kubun/pp/v3"
  7. log "github.com/sirupsen/logrus"
  8. "gorm.io/gorm"
  9. "kpt.xdmy/apiserver/config"
  10. "kpt.xdmy/apiserver/model"
  11. "kpt.xdmy/apiserver/model/http"
  12. "kpt.xdmy/pkg/util"
  13. )
  14. // 凭证冲销
  15. func (s *Service) ProofOff(p *model.ProofReq) (hrp *http.Response) {
  16. r := new(http.ChargeOffReq)
  17. rp := new(http.SapResp)
  18. hrp = new(http.Response)
  19. hrp.Code = 200
  20. hrp.Msg = "fail"
  21. r.Dest.DestID = "EQMAN"
  22. r.Dest.BussTp = "MM015"
  23. //r.Dest.Url = "https://app.modernfarming.cn:7443/sap/Common/MM015/CancelMblnr"
  24. //r.Dest.Url = "http://192.168.61.117/SAPP0/Common/MM015/CancelMblnr"
  25. r.Dest.Url = fmt.Sprintf("%s/Common/MM015/CancelMblnr", config.Conf.Http.Routing)
  26. r.Data.ProofCode = p.ProofCode
  27. r.Data.ProofYear = p.ProofYear
  28. r.Data.ChargeDate = p.ChargeDate
  29. r.Data.OrderNumber = p.OrderNumber
  30. r.Data.HasTicket = util.ZeroStr(p.HasTicket == 1, "X")
  31. log.Infof("proofcode: %s", r.Data.ProofCode)
  32. sl := r.Data.RowsNumber
  33. for i := range p.RowsNumber {
  34. sl = append(sl, http.ChargeOffDetail{RowNumber: p.RowsNumber[i]})
  35. }
  36. tx := s.d.DB.Begin()
  37. err := UpdateProof(p, tx)
  38. if err != nil {
  39. hrp.Message += fmt.Sprintf("%s . bigid = %d ,rows=%v", err.Error(), p.OrderNumberId, p.RowsNumber)
  40. tx.Rollback()
  41. }
  42. r.Data.RowsNumber = sl
  43. rbyte, _ := json.Marshal(r)
  44. //rbyte, _ := json.Marshal(r)
  45. fmt.Println(string(rbyte))
  46. e := s.SyncSap(r, rp, rbyte)
  47. pp.Print(r)
  48. if e == nil {
  49. if rp.Data.Status == "S" {
  50. hrp.Message = fmt.Sprintf("sap物料冲销成功:%d %s %s", p.NumberType, rp.Data.ProofNumber, rp.Data.EqNumber)
  51. log.Info(hrp.Message)
  52. } else {
  53. hrp.Message = fmt.Sprintf("sap凭证冲销失败:%s", rp.Dest.MessText)
  54. log.Infoln(hrp.Message, r, p)
  55. tx.Rollback()
  56. return
  57. }
  58. } else {
  59. hrp.Message = fmt.Sprintf("sap冲销接口报错:error:%s", e)
  60. log.Infoln(hrp.Message, r, p)
  61. tx.Rollback()
  62. return
  63. }
  64. tx.Commit()
  65. hrp.Msg = "ok"
  66. return
  67. }
  68. //凭证冲销后状态更新
  69. func UpdateProof(p *model.ProofReq, tx *gorm.DB) error {
  70. var tname string
  71. switch p.NumberType {
  72. case 1: // 入库
  73. tname = "partlaid"
  74. case 2: // 退货
  75. tname = "partrefund"
  76. case 3: // 出库
  77. tname = "partuse"
  78. case 4: // 退库
  79. tname = "partquit"
  80. }
  81. if p.NumberType != 2 && p.NumberType != 1 {
  82. //for _, item := range p.ProofPart {
  83. if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).Update("dflag", 1).Error; e != nil {
  84. log.Errorln(e, p.OrderNumberId, p.RowsNumber)
  85. tx.Rollback()
  86. return e
  87. }
  88. //}
  89. if e := tx.Exec(fmt.Sprintf(` update big%s set sterilisation = 1 where id = ? `, tname), p.OrderNumberId).Error; e != nil {
  90. log.Errorln(e, p.OrderNumberId, p.RowsNumber)
  91. }
  92. } else {
  93. if e := tx.Table(tname).Where("bigid=? ", p.OrderNumberId).
  94. Update("dflag", 1).Update("hasTicket", p.HasTicket).Error; e != nil {
  95. log.Errorln(e, p.OrderNumberId, p.RowsNumber)
  96. }
  97. if e := tx.Exec(fmt.Sprintf(` update big%s set sterilisation = 1 where id = ? `, tname), p.OrderNumberId).Error; e != nil {
  98. log.Errorln(e, p.OrderNumberId, p.RowsNumber)
  99. }
  100. }
  101. if p.NumberType == 1 {
  102. partlaidList := make([]*model.PartLaid, 0)
  103. err := tx.Raw(`select * from partlaid where bigid = ? `, p.OrderNumberId).Find(&partlaidList).Error
  104. if err != nil {
  105. log.Error(err)
  106. return err
  107. }
  108. for _, part := range partlaidList {
  109. err := tx.Exec(` update part_repertory pr set pr.reportery = pr.reportery - ?
  110. where pr.partCode = ? and pr.contractId = ? and
  111. (select pastureid from warehouse where id = pr.locationId and status = 1 limit 1 ) = (select pastureid from bigpartlaid where id = ? ) `,
  112. part.StorageAmount, part.PartCode, part.ContractID, p.OrderNumberId).Error
  113. if err != nil {
  114. log.Error(err)
  115. return err
  116. }
  117. }
  118. } else if p.NumberType == 3 {
  119. partUseList := make([]*model.PartUse, 0)
  120. err := tx.Raw(`select * from partuse where bigid = ? `, p.OrderNumberId).Find(&partUseList).Error
  121. if err != nil {
  122. log.Error(err)
  123. return err
  124. }
  125. for _, part := range partUseList {
  126. err := tx.Exec(` update part_repertory pr set pr.reportery = pr.reportery + ?
  127. where pr.partCode = ? and pr.contractId = ?
  128. and (select pastureid from warehouse where id = pr.locationId and status = 1 limit 1 ) = (select pastureid from bigpartuse where id = ? ) `,
  129. part.CheckoutNumber, part.PartCode, part.ContractID, p.OrderNumberId).Error
  130. if err != nil {
  131. log.Error(err)
  132. return err
  133. }
  134. }
  135. }
  136. return nil
  137. }
  138. // 查询 单据 对应备件明细
  139. func ProofList(p *model.ProofReq) (hrp *http.Response) {
  140. switch p.NumberType {
  141. case 1: // 入库
  142. return s.laidProofList(p)
  143. case 2: // 退货
  144. return s.returnProofList(p)
  145. case 3: // 出库
  146. return s.useProofList(p)
  147. case 4: // 退库
  148. return s.quitProofList(p)
  149. }
  150. return
  151. }
  152. // 入库冲销
  153. func (s *Service) laidProofList(p *model.ProofReq) (hrp *http.Response) {
  154. bp := new(model.BigPartLaid)
  155. proofs := make([]model.ProofPart, 0)
  156. var e error
  157. hrp = new(http.Response)
  158. hrp.Code = 200
  159. hrp.Msg = "fail"
  160. if e = s.d.DB.First(bp, model.BigPartLaid{LaidCode: p.OrderNumber}).Error; e != nil {
  161. hrp.Message = fmt.Sprintf("%s ,error=%v,", p.OrderNumber, e)
  162. return
  163. }
  164. p.OrderNumberId = bp.ID
  165. p.ProofCode = bp.ProofCode
  166. p.ChargeDate = bp.CreatDate.Format("2006-01-02")
  167. p.ProofYear = bp.CreatDate.Format("2006")
  168. parts := make([]model.PartLaid, 0)
  169. if e = s.d.DB.Raw(` select * from partlaid where bigid = ? order by rowNumber,id desc `, bp.ID).Order("rowNumber,id desc ").
  170. Find(&parts).Error; e != nil || len(parts) == 0 {
  171. hrp.Message = fmt.Sprintf("入库单明细查询报错或结果为空:bigid=%v error=%v,", bp.ID, e)
  172. hrp.Msg = "fail"
  173. return
  174. }
  175. for i, v := range parts {
  176. mp := new(model.ProofPart)
  177. br := new(model.Brand)
  178. w := new(model.Warehouse)
  179. pv := new(model.Provider)
  180. if e := s.d.DB.First(&pv, model.Provider{ID: v.ProviderID}).Error; e != nil {
  181. log.Errorln(v.ProviderID, e)
  182. //continue
  183. }
  184. if e := s.d.DB.First(&br, model.Brand{ID: v.BrandID}).Error; e != nil {
  185. log.Errorln(e, v.BrandID)
  186. //continue
  187. }
  188. if e := s.d.DB.First(&w, model.Warehouse{ID: v.LocationID}).Error; e != nil {
  189. log.Errorln(v.LocationID, e)
  190. //continue
  191. }
  192. if v.RowNumber > 0 {
  193. mp.RowNumber = v.RowNumber
  194. } else {
  195. mp.RowNumber = len(parts) - i
  196. }
  197. mp.PartCode = v.PartCode
  198. mp.PartName = v.PartName
  199. mp.Specification = v.Specification
  200. mp.ChangeCount = v.StorageAmount
  201. mp.UnitPrice = v.Price
  202. mp.TotalPrice = v.SumPrice
  203. mp.PartBrand = br.BrandName
  204. mp.Supplier = pv.SapCode
  205. mp.Warehouse = w.SapCode
  206. if v.Dflag == 0 {
  207. proofs = append(proofs, *mp)
  208. }
  209. }
  210. p.ProofPart = proofs
  211. hrp.Msg = "ok"
  212. hrp.Data = p
  213. hrp.Message = fmt.Sprintf("success :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
  214. return
  215. }
  216. // 退货冲销
  217. func (s *Service) returnProofList(p *model.ProofReq) (hrp *http.Response) {
  218. hrp = new(http.Response)
  219. bp := new(model.BigPartRefund)
  220. proofs := make([]model.ProofPart, 0)
  221. hrp.Code = 200
  222. var e error
  223. if e = s.d.DB.First(bp, model.BigPartRefund{UseForm: p.OrderNumber}).Error; e != nil {
  224. hrp.Message = fmt.Sprintf("bigpartrefund : %d,%s", p.NumberType, p.OrderNumber)
  225. hrp.Msg = "fail"
  226. return
  227. }
  228. p.OrderNumberId = bp.ID
  229. p.ProofCode = bp.ProofCode
  230. p.ChargeDate = bp.CreateTime.Format("2006-01-02")
  231. p.ProofYear = bp.CreateTime.Format("2006")
  232. funds := []model.PartRefund{}
  233. if e = s.d.DB.Order("rowNumber,id desc ").Find(&funds, model.PartRefund{BigID: bp.ID}).Error; e != nil || len(funds) == 0 {
  234. hrp.Message = fmt.Sprintf("PartRefund query error . bigid=%v error=%v,", bp.ID, e)
  235. hrp.Msg = "fail"
  236. return
  237. }
  238. for i, v := range funds {
  239. mp := new(model.ProofPart)
  240. pv := new(model.Provider)
  241. if e := s.d.DB.First(&pv, model.Provider{ID: bp.ProviderID}).Error; e != nil {
  242. log.Errorln(bp.ProviderID, e)
  243. continue
  244. }
  245. if v.RowNumber > 0 {
  246. mp.RowNumber = v.RowNumber
  247. } else {
  248. mp.RowNumber = len(funds) - i
  249. }
  250. mp.Supplier = pv.SapCode
  251. mp.PartBrand = v.Brand
  252. mp.Warehouse = "1004"
  253. mp.PartCode = v.PartCode
  254. mp.PartName = v.PartName
  255. mp.Specification = v.Specification
  256. mp.ChangeCount = v.RefundNumber
  257. mp.UnitPrice = v.Price
  258. mp.TotalPrice = v.SumPrice
  259. proofs = append(proofs, *mp)
  260. }
  261. p.ProofPart = proofs
  262. hrp.Msg = "ok"
  263. hrp.Data = p
  264. hrp.Message = fmt.Sprintf("success :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
  265. return
  266. }
  267. // 出库冲销
  268. func (s *Service) useProofList(p *model.ProofReq) (hrp *http.Response) {
  269. hrp = new(http.Response)
  270. bp := new(model.BigPartUse)
  271. proofs := make([]model.ProofPart, 0)
  272. hrp.Code = 200
  273. hrp.Msg = "fail"
  274. var e error
  275. if e = s.d.DB.First(bp, model.BigPartUse{UseForm: p.OrderNumber}).Error; e != nil {
  276. log.Error(e)
  277. hrp.Message = fmt.Sprintf("bigpartuse useform=%s", p.OrderNumber)
  278. return
  279. }
  280. p.OrderNumberId = bp.ID
  281. p.ProofCode = bp.ProofCode
  282. p.ChargeDate = bp.ReceiveTime.Format("2006-01-02")
  283. p.ProofYear = bp.ReceiveTime.Format("2006")
  284. uses := make([]model.PartUse, 0)
  285. if e = s.d.DB.Order("rowNumber,id desc ").Find(&uses, model.PartUse{BigID: bp.ID}).Error; e != nil || len(uses) == 0 {
  286. log.Error(e)
  287. hrp.Message = fmt.Sprintf("PartUse bigid = %v ", bp.ID)
  288. return
  289. }
  290. for i, v := range uses {
  291. mp := new(model.ProofPart)
  292. br := new(model.Brand)
  293. w := new(model.Warehouse)
  294. c := new(model.Contract)
  295. bc := new(model.BigContract)
  296. pv := new(model.Provider)
  297. pa := new(model.PartRepertory)
  298. if v.ContractID > 0 {
  299. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  300. log.Error(e)
  301. hrp.Message = fmt.Sprintf("contract id =%d", v.ContractID)
  302. //return
  303. }
  304. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  305. log.Error(e)
  306. hrp.Message = fmt.Sprintf("bigcontract id =%d", v.BigID)
  307. //return
  308. }
  309. if e := s.d.DB.First(&pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
  310. log.Errorln(bc.ProviderID, e)
  311. //continue
  312. }
  313. } else {
  314. if e := s.d.DB.First(pa, model.PartRepertory{ContractID: v.ContractID, PartCode: v.PartCode, LocationID: v.LocationID}).Error; e != nil {
  315. log.Error(e)
  316. hrp.Message = fmt.Sprintf("bigcontract id =%d", v.BigID)
  317. //return
  318. }
  319. if e := s.d.DB.First(&pv, model.Provider{ID: pa.ProviderID}).Error; e != nil {
  320. log.Errorln(pa.ProviderID, e)
  321. //continue
  322. }
  323. }
  324. if e := s.d.DB.First(&br, model.Brand{ID: v.BrandID}).Error; e != nil {
  325. log.Error(e)
  326. hrp.Message = fmt.Sprintf("brand id =%d", v.BrandID)
  327. return
  328. }
  329. if e := s.d.DB.First(&w, model.Warehouse{ID: v.LocationID}).Error; e != nil {
  330. log.Errorln(v.LocationID, e)
  331. return
  332. }
  333. mp.PartBrand = br.BrandName
  334. mp.Warehouse = w.SapCode
  335. mp.Supplier = pv.SapCode
  336. if v.RowNumber > 0 {
  337. mp.RowNumber = v.RowNumber
  338. } else {
  339. mp.RowNumber = len(uses) - i
  340. }
  341. mp.PartCode = v.PartCode
  342. mp.PartName = v.PartName
  343. mp.Specification = v.Specification
  344. mp.ChangeCount = v.CheckoutNumber
  345. mp.UnitPrice = v.Price
  346. mp.TotalPrice = v.SumPrice
  347. proofs = append(proofs, *mp)
  348. }
  349. p.ProofPart = proofs
  350. hrp.Msg = "ok"
  351. hrp.Data = p
  352. hrp.Message = fmt.Sprintf("success :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
  353. return
  354. }
  355. // 退库冲销
  356. func (s *Service) quitProofList(p *model.ProofReq) (hrp *http.Response) {
  357. hrp = new(http.Response)
  358. bp := new(model.BigPartquit)
  359. proofs := make([]model.ProofPart, 0)
  360. hrp.Code = 200
  361. var e error
  362. if e = s.d.DB.First(bp, model.BigPartquit{UseForm: p.OrderNumber}).Error; e != nil {
  363. log.Error(e)
  364. hrp.Message = fmt.Sprintf("bigpartquit %d,%s", p.NumberType, p.OrderNumber)
  365. hrp.Msg = "fail"
  366. return
  367. }
  368. p.OrderNumberId = bp.ID
  369. p.ProofCode = bp.ProofCode
  370. p.ChargeDate = bp.QuitDate.Format("2006-01-02")
  371. p.ProofYear = bp.QuitDate.Format("2006")
  372. parts := make([]model.Partquit, 0)
  373. if e = s.d.DB.Order("rowNumber,id desc ").Find(&parts, model.Partquit{BigID: bp.ID}).Error; e != nil || len(parts) == 0 {
  374. hrp.Message = fmt.Sprintf("partquit bigid = %d ", bp.ID)
  375. hrp.Msg = "fail"
  376. return
  377. }
  378. for i, v := range parts {
  379. mp := new(model.ProofPart)
  380. c := new(model.Contract)
  381. bc := new(model.BigContract)
  382. pv := new(model.Provider)
  383. if e := s.d.DB.First(c, model.Contract{ID: v.ContractID}).Error; e != nil {
  384. log.Error(e)
  385. hrp.Message = fmt.Sprintf("contract id =%d", v.ContractID)
  386. return
  387. }
  388. if e := s.d.DB.First(bc, model.BigContract{ID: c.BigID}).Error; e != nil {
  389. log.Error(e)
  390. hrp.Message = fmt.Sprintf("bigcontract id =%d", v.BigID)
  391. return
  392. }
  393. if e := s.d.DB.First(&pv, model.Provider{ID: bc.ProviderID}).Error; e != nil {
  394. log.Errorln(bc.ProviderID, e)
  395. continue
  396. }
  397. mp.Supplier = pv.SapCode
  398. mp.PartBrand = v.Brand
  399. mp.Warehouse = "1004"
  400. if v.RowNumber > 0 {
  401. mp.RowNumber = v.RowNumber
  402. } else {
  403. mp.RowNumber = len(parts) - i
  404. }
  405. mp.PartCode = v.PartCode
  406. mp.PartName = v.PartName
  407. mp.Specification = v.Specification
  408. mp.ChangeCount = v.QuitNumber
  409. mp.UnitPrice = v.Price
  410. mp.TotalPrice = v.SumPrice
  411. proofs = append(proofs, *mp)
  412. }
  413. p.ProofPart = proofs
  414. hrp.Msg = "ok"
  415. hrp.Data = p
  416. hrp.Message = fmt.Sprintf("success :type = %v OrderNumber = %s", p.NumberType, p.OrderNumber)
  417. return
  418. }