diesel.go 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583
  1. package service
  2. import (
  3. "fmt"
  4. "github.com/360EntSecGroup-Skylar/excelize"
  5. "github.com/astaxie/beego/logs"
  6. "github.com/gin-gonic/gin"
  7. "github.com/goccy/go-json"
  8. "github.com/k0kubun/pp/v3"
  9. "github.com/pkg/errors"
  10. log "github.com/sirupsen/logrus"
  11. "gorm.io/gorm"
  12. "kpt.xdmy/apiserver/model"
  13. "kpt.xdmy/apiserver/model/http"
  14. "kpt.xdmy/pkg/util"
  15. "strconv"
  16. "strings"
  17. "time"
  18. )
  19. func (s *Service) InsertDieselData(req *http.DieselReq) error {
  20. code := new(model.CreateCodeN)
  21. s.d.DB.Raw(`call createCodeN(?,?)`, req.PastureId, "CY").First(code)
  22. return s.d.DB.Transaction(func(tx *gorm.DB) error {
  23. diesel := &model.Diesel{
  24. PastureId: req.PastureId,
  25. DeptId: req.DepartmentId,
  26. EqId: req.EqId,
  27. EqCode: req.EqCode,
  28. OilcardId: req.OilcardId,
  29. CardNumber: req.CardNumber,
  30. OilClass: req.OilClass,
  31. OilAmount: req.OilAmount,
  32. NowPrice: req.NowPrice,
  33. Price: req.Price,
  34. EmpId: req.EmpId,
  35. InputId: req.InputId,
  36. SelTime: req.SelTime,
  37. Note: req.Note,
  38. OilName: req.OilName,
  39. OilType: req.OilType,
  40. DieselCode: code.OrderCode,
  41. }
  42. resp := tx.Create(diesel)
  43. if resp.Error != nil {
  44. logs.Error(resp.Error)
  45. return resp.Error
  46. }
  47. req.Id = diesel.Id
  48. err := tx.Exec(`update oilcard set lastcardAmount=cardAmount,cardAmount =cardAmount -? where id =?`, req.Id, req.NowPrice).Error
  49. if err != nil {
  50. logs.Error(err)
  51. return err
  52. }
  53. dieselList := make([]*model.Diesel, 0)
  54. dieselList = append(dieselList, diesel)
  55. err = s.DieseUseProof(dieselList, tx, strconv.FormatInt(req.PastureId, 10), code.OrderCode, req.SelTime)
  56. if err != nil {
  57. //logs.Error(err)
  58. return err
  59. }
  60. return nil
  61. })
  62. }
  63. func (s *Service) ImportExcel(c *gin.Context) (map[string]interface{}, error) {
  64. inputdata := ""
  65. if err := c.Request.ParseForm(); err != nil {
  66. return nil, err
  67. }
  68. params := c.Request.Form
  69. // file, _, err := c.Request.FormFile("file")
  70. fileHeader, err := c.FormFile("file")
  71. file, err := fileHeader.Open()
  72. if err != nil {
  73. return nil, err
  74. }
  75. if err != nil {
  76. return nil, err
  77. }
  78. pastureId := params.Get("pastureId")
  79. sqlnamestr := params.Get("name")
  80. sheetname := params.Get("sheetname")
  81. importParams := params.Get("importParams")
  82. //sql, _ := restful.GetSqlByNameDB(sqlnamestr)
  83. // 备件编号,备件名称,规格型号,计量单位,品牌,计划量,单价,备注,jwt_username
  84. paramslist := strings.Split(importParams, ",")
  85. if sqlnamestr != "importGasoline" && sqlnamestr != "importCoal" && sqlnamestr != "importBiomass" && sqlnamestr != "importEnergy" {
  86. paramslist = append(paramslist, "jwt_username")
  87. }
  88. queryData := make([]interface{}, 0)
  89. xlsx1, err := excelize.OpenReader(file)
  90. if err != nil {
  91. return nil, err
  92. }
  93. ok := 0
  94. error := 0
  95. rows := xlsx1.GetRows(sheetname)
  96. if len(rows) > 10000 {
  97. rows = rows[:10000]
  98. }
  99. dieselList := make([]*model.Diesel, 0)
  100. errBool := false
  101. //var selTime string
  102. code := new(model.CreateCodeN)
  103. s.d.DB.Raw(`call createCodeN(?,?)`, pastureId, "CY").First(code)
  104. tx := s.d.DB.Begin()
  105. for i, row := range rows {
  106. if i > 0 {
  107. if len(paramslist) > 0 {
  108. s_params := make([]interface{}, 0)
  109. entry := make(map[string]string)
  110. outentry := make(map[string]interface{})
  111. inputdata = ""
  112. for _, value := range paramslist {
  113. if strings.ToLower(strings.Trim(value, " ")) == "jwt_username" {
  114. if tempv, exists := c.Get("jwt_username"); exists {
  115. s_params = append(s_params, tempv.(string))
  116. } else {
  117. s_params = append(s_params, "")
  118. }
  119. } else {
  120. for j, colCell := range rows[0] {
  121. if strings.Trim(value, " ") == colCell {
  122. for k, colCell1 := range row {
  123. if j == k {
  124. outentry[colCell] = colCell1
  125. entry[colCell] = colCell1
  126. //inputdata = inputdata + colCell + ":" + colCell1 + ";"
  127. }
  128. }
  129. }
  130. }
  131. s_params = append(s_params, entry[strings.Trim(value, " ")])
  132. }
  133. }
  134. outentry["input"] = inputdata
  135. diesel := new(model.Diesel)
  136. fmt.Println(entry)
  137. //牧场,油卡编号,设备名称,设备编号,加油日期,加油量(升),单价,录入人,加油人,加油工班,备注,柴油类型,jwt_username
  138. if _, ok := entry["加油量(升)"]; ok {
  139. diesel.OilAmount = entry["加油量(升)"]
  140. }
  141. if _, ok := entry["单价"]; ok {
  142. diesel.Price = entry["单价"]
  143. }
  144. if _, ok := entry["单价"]; ok {
  145. diesel.Price = entry["单价"]
  146. }
  147. if diesel.OilAmount == "" {
  148. outentry["error_msg"] = "加油量必须输入"
  149. error++
  150. queryData = append(queryData, outentry)
  151. errBool = true
  152. continue
  153. }
  154. if diesel.Price == "" {
  155. outentry["error_msg"] = "单价不能为空"
  156. error++
  157. queryData = append(queryData, outentry)
  158. errBool = true
  159. continue
  160. }
  161. if _, ok := entry["牧场"]; !ok {
  162. outentry["error_msg"] = "牧场不能为空"
  163. error++
  164. queryData = append(queryData, outentry)
  165. errBool = true
  166. continue
  167. }
  168. if _, ok := entry["油卡编号"]; !ok {
  169. outentry["error_msg"] = "油卡编号不能为空"
  170. error++
  171. queryData = append(queryData, outentry)
  172. errBool = true
  173. continue
  174. }
  175. jyTime, err := time.Parse("2006-01-02", entry["加油日期"])
  176. if err != nil {
  177. outentry["error_msg"] = err.Error()
  178. error++
  179. queryData = append(queryData, outentry)
  180. errBool = true
  181. continue
  182. }
  183. now, _ := time.Parse("2006-01-02", time.Now().Format("2006-01-02"))
  184. if jyTime.Unix() > now.Unix() {
  185. outentry["error_msg"] = "本次抄表日期不可大于当前日期"
  186. error++
  187. queryData = append(queryData, outentry)
  188. errBool = true
  189. continue
  190. }
  191. pasture := new(model.Pasture)
  192. tx.Where("name = ?", entry["牧场"]).First(pasture)
  193. if pasture.ID == 0 {
  194. outentry["error_msg"] = "牧场不存在"
  195. error++
  196. queryData = append(queryData, outentry)
  197. errBool = true
  198. continue
  199. }
  200. diesel.CardNumber = entry["油卡编号"]
  201. diesel.SelTime = entry["加油日期"]
  202. oilcard := new(model.Oilcard)
  203. tx.Where("cardCode = ? and pastureId = ? ", entry["油卡编号"], pasture.ID).First(oilcard)
  204. if oilcard.Id == "" {
  205. outentry["error_msg"] = entry["油卡编号"] + "油卡不存在"
  206. error++
  207. queryData = append(queryData, outentry)
  208. errBool = true
  209. continue
  210. }
  211. if oilcard.CardType != "外部" {
  212. equipment := new(model.Equipment)
  213. tx.Where("eqCode = ? and pastureId =? ", entry["设备编号"], pasture.ID).First(equipment)
  214. diesel.EqCode = equipment.EqCode
  215. diesel.EqId = int64(equipment.Id)
  216. if equipment.EqCode == "" {
  217. outentry["error_msg"] = entry["设备编号"] + "资产不存在或不在本牧场"
  218. error++
  219. queryData = append(queryData, outentry)
  220. errBool = true
  221. continue
  222. }
  223. }
  224. if _, ok := entry["录入人"]; ok {
  225. emp := new(model.Emp)
  226. tx.Where("empname = ? and pastureId = ?", entry["录入人"], pasture.ID).First(emp)
  227. diesel.InputId = emp.Id
  228. }
  229. diesel.PastureId = int64(pasture.ID)
  230. price, _ := strconv.ParseFloat(diesel.Price, 64)
  231. oilAmount, _ := strconv.ParseFloat(diesel.OilAmount, 64)
  232. diesel.NowPrice = price * oilAmount
  233. if _, ok := entry["备注"]; ok {
  234. diesel.Note = entry["备注"]
  235. }
  236. if _, ok := entry["录入人"]; ok {
  237. emp := new(model.Emp)
  238. tx.Where("empname = ? and pastureId = ?", entry["录入人"], pasture.ID).First(emp)
  239. diesel.EmpId = emp.Empname
  240. }
  241. if _, ok := entry["加油工班"]; ok {
  242. diesel.OilClass = entry["加油工班"]
  243. }
  244. deptId, _ := strconv.ParseInt(oilcard.DepartmentId, 10, 64)
  245. diesel.DeptId = deptId
  246. oilcardId, _ := strconv.ParseInt(oilcard.Id, 10, 64)
  247. diesel.OilcardId = oilcardId
  248. //WHEN '0#' THEN
  249. //1
  250. //WHEN '-10#' THEN
  251. //2
  252. //WHEN '-20#' THEN
  253. //3
  254. //WHEN '-30#' THEN
  255. //4
  256. //WHEN '-35#' THEN
  257. if _, ok := entry["柴油类型"]; ok {
  258. if entry["柴油类型"] == "" {
  259. outentry["error_msg"] = "柴油类型不能为空"
  260. error++
  261. queryData = append(queryData, outentry)
  262. //tx.Rollback()
  263. errBool = true
  264. continue
  265. }
  266. diesel.OilName = entry["柴油类型"]
  267. if entry["柴油类型"] == "0号" {
  268. diesel.OilType = 1
  269. } else if entry["柴油类型"] == "10号" {
  270. //diesel.OilName = "-10#"
  271. diesel.OilType = 2
  272. } else if entry["柴油类型"] == "20号" {
  273. //diesel.OilName = "-20#"
  274. diesel.OilType = 3
  275. } else if entry["柴油类型"] == "30号" {
  276. //diesel.OilName = "-30#"
  277. diesel.OilType = 4
  278. } else if entry["柴油类型"] == "35号" {
  279. //diesel.OilName = "-35#"
  280. diesel.OilType = 5
  281. }
  282. } else {
  283. outentry["error_msg"] = "柴油类型不能为空"
  284. error++
  285. queryData = append(queryData, outentry)
  286. //tx.Rollback()
  287. errBool = true
  288. continue
  289. }
  290. diesel.DieselCode = code.OrderCode
  291. err = tx.Create(diesel).Error
  292. if err != nil {
  293. outentry["error_msg"] = err.Error()
  294. error++
  295. queryData = append(queryData, outentry)
  296. //tx.Rollback()
  297. errBool = true
  298. continue
  299. }
  300. err = tx.Exec(` UPDATE
  301. oilcard
  302. SET
  303. lastcardAmount = cardAmount,
  304. cardAmount = cardAmount-CAST( ?*? as decimal(10,2))
  305. WHERE id = ?;`, oilAmount, price, oilcard.Id).Error
  306. if err != nil {
  307. outentry["error_msg"] = err.Error()
  308. error++
  309. queryData = append(queryData, outentry)
  310. //tx.Rollback()
  311. errBool = true
  312. continue
  313. }
  314. //selTime = diesel.SelTime
  315. dieselList = append(dieselList, diesel)
  316. ok++
  317. }
  318. }
  319. }
  320. if errBool {
  321. tx.Rollback()
  322. data := make(map[string]interface{})
  323. data["result"] = queryData
  324. //data["success"] = ok
  325. data["err_count"] = 1
  326. return data, nil
  327. }
  328. //err = s.DieseUseProof(dieselList, tx, pastureId, code.OrderCode, selTime)
  329. //if err != nil {
  330. // outentry := make(map[string]interface{})
  331. // outentry["error_msg"] = err.Error()
  332. // error++
  333. // queryData = append(queryData, outentry)
  334. //
  335. // data := make(map[string]interface{})
  336. // data["result"] = queryData
  337. // //data["success"] = ok
  338. // data["err_count"] = 1
  339. // tx.Rollback()
  340. // return data, nil
  341. //}
  342. tx.Commit()
  343. data := make(map[string]interface{})
  344. data["result"] = queryData
  345. data["success"] = len(dieselList)
  346. //data["err_count"] = error
  347. return data, nil
  348. }
  349. func (s *Service) DieseUseProof(reqList []*model.Diesel, tx *gorm.DB, pastureId, dieselCode, selTime string) error {
  350. //pr := new(http.ProofPartReq)
  351. r := new(http.ProofReq)
  352. rp := new(http.ProofResp)
  353. //parts := make([]*model.PartUseStr, 0)
  354. //bp := new(model.BigPartUse)
  355. pa := new(model.Pasture)
  356. if e := tx.Where("id = ? ", pastureId).First(pa).Error; e != nil {
  357. log.Error(e)
  358. return errors.New(fmt.Sprintf("查询牧场信息 errors:%v", e))
  359. }
  360. proofDest(r)
  361. //{"DEST":{"DEST_ID":"EQMAN","BUSS_TP":"MM001","MESS_ID":"","STATUS":"","MESS_TEXT":"","STATUS_OS":"",
  362. // "Url":"http://192.168.61.117/SAPP0/Common/MM001/ModifyMblnr"},"DATA":{"BLDAT":"20221105",
  363. // "BUDAT":"20221101","FRBNR":"CK03221105003","MSEG":[{"ZEILE":"1","MATNR":"14.02.15.06.000091",
  364. // "WERKS":"M003","LGORT":"1004","MENGE":"1.000000","MEINS":"桶","EBELN":"","EBPLP":"",
  365. // "BWART":"201","SOBKZ":"K","KOSTL":"1002030505","ANLN1":"50300000007","ANLN2":"","LIFNR":"100869"}]}}
  366. //b, _ := json.Marshal(pr)
  367. //restful.Dbs.DB.Exec(` insert into equipmentlingshi(text)values(?)`, string(b))
  368. r.Dest.MESSIDOS = dieselCode
  369. r.Dest.BUSSDOCOS = dieselCode
  370. r.Data.EqNumber = dieselCode
  371. r.Data.CreateTime = time.Now().Format("20060102")
  372. if t, e := util.ParseDate(selTime[:10]); e != nil {
  373. log.Error(e, selTime)
  374. } else {
  375. r.Data.PostDate = t.Format("20060102")
  376. }
  377. diesePartMap := map[string]string{
  378. "0号": "20.04.01.01.000001",
  379. "10号": "20.04.01.01.000002",
  380. "20号": "20.04.01.01.000003",
  381. "30号": "20.04.01.01.000004",
  382. "35号": "20.04.01.01.000005",
  383. }
  384. //for i, v := range parts {
  385. //bc := new(model.BigContract)
  386. //c := new(model.Contract)
  387. //w := new(model.Warehouse)
  388. //pv := new(model.Provider)
  389. //contractID, _ := strconv.Atoi(v.ContractID.(string))
  390. //if e := s.d.DB.First(storage, model.PartRepertory{ContractID: contractID}).Error; e != nil {
  391. // log.Errorln(e, v.ContractID)
  392. // return errors.New(fmt.Sprintf("查询库存信息出错 errors:%v", e))
  393. //}
  394. //if e := s.d.DB.First(pv, model.Provider{ID: storage.ProviderID}).Error; e != nil {
  395. // log.Errorln(e, storage.ProviderID)
  396. // return errors.New(fmt.Sprintf("查询供应商信息出错 errors:%v", e))
  397. //}
  398. //dict := new(model.Dictlist)
  399. //tx.First(dict, model.Dictlist{Pid: 21, Value: "物耗"})
  400. //if e := s.d.DB.First(w, model.Warehouse{ID: v.LocationID}).Error; e != nil {
  401. // log.Errorln(e, v.LocationID)
  402. // return errors.New(fmt.Sprintf("errors:%v", e))
  403. //}
  404. for i, req := range reqList {
  405. eq := new(model.Equipment)
  406. //storage := new(model.PartRepertory)
  407. dp := new(model.Department)
  408. if e := tx.Where("id = ? ", req.DeptId).First(dp).Error; e != nil {
  409. log.Error(e)
  410. return errors.New(fmt.Sprintf("查询部门信息出错 errors:%v", e))
  411. }
  412. sdetail := http.ProofDetail{}
  413. if req.EqCode != "" {
  414. if e := tx.Where("id = ? and pastureid = ? ", req.EqId, req.PastureId).First(eq).Error; e != nil {
  415. return errors.New(fmt.Sprintf("errors:%v", e))
  416. }
  417. sdetail.AssetCode = eq.SapCode
  418. sdetail.AssetSon = eq.SonCode
  419. }
  420. sdetail.EXT01 = "6601011703"
  421. // 报废出库
  422. // 领用出库、手动出库
  423. //if pr.UseType == 0 || pr.UseType == 1 {
  424. sdetail.MoveType = "201"
  425. sdetail.CostCenter = dp.CostCenterCode
  426. //if dp.Factory == "" {
  427. sdetail.Factory = pa.FactoryCode
  428. //} else {
  429. // sdetail.Factory = dp.Factory
  430. //}
  431. if sdetail.Factory == "M005" && strings.Contains(dp.Name, "二期") {
  432. sdetail.Factory = "M017"
  433. }
  434. sdetail.RowNumber = fmt.Sprintf("%d", i+1)
  435. sdetail.Quantity = fmt.Sprintf("%s", req.OilAmount)
  436. //sdetail.Unit = v.Unit.(string)
  437. sdetail.Code = diesePartMap[req.OilName]
  438. sdetail.Location = "1005"
  439. //if contractID > 0 && bc.IsZeroStock == 1 {
  440. // sdetail.SaveType = "K"
  441. //}
  442. //
  443. //if sdetail.SaveType == "K" {
  444. // sdetail.Provider = pv.SapCode
  445. //}
  446. r.Data.Detail = append(r.Data.Detail, sdetail)
  447. tx.Exec(` update diesel set sort = ? where id = ? `, sdetail.RowNumber, req.Id)
  448. //if e := s.d.DB.Model(&model.PartUse{}).Where("id=?", v.ID).Update("rowNumber", sdetail.RowNumber).Error; e != nil {
  449. // log.Errorln(e, v.ID)
  450. //}
  451. }
  452. //_, err = tx.Exec(` update partuse set rowNumber = ? where id = ? `, sdetail.RowNumber, v.ID)
  453. //if err != nil {
  454. // return err
  455. //}
  456. //}
  457. //}
  458. ///*
  459. pp.Print(r)
  460. //log.Infof("bp.pastureId:%d,pa.name:%s,pa.companycode:%s", bp.PastureID, pa.Name, pa.CompanyCode)
  461. rbyte, _ := json.Marshal(r)
  462. fmt.Println(string(rbyte))
  463. if e := s.SyncSap(r, rp, rbyte); e != nil {
  464. log.Errorf("laid proof error:%v", e)
  465. return errors.New(fmt.Sprintf("errors:%s", r.MessText))
  466. } else {
  467. if rp.Dest.Status == "S" {
  468. log.Printf("use proof success:eqcode=%s,sapcode=%s", rp.Data.EqNumber, rp.Data.SapNumber)
  469. //if e := s.d.DB.Model(&model.BigPartUse{}).Where("useform = ?", rp.Data.EqNumber).Update("ProofCode", rp.Data.SapNumber).Error; e != nil {
  470. // log.Errorln(e)
  471. //}
  472. tx.Exec(` update diesel set ProofCode = ? where dieselCode = ? `, rp.Data.SapNumber, dieselCode)
  473. } else {
  474. log.Warnf(" use proof :%s", rp.Dest.MessText)
  475. return errors.New(fmt.Sprintf("errors:%s", rp.Dest.MessText))
  476. }
  477. }
  478. return nil
  479. }
  480. func (s *Service) zdDieselData(pastureId int, date string) error {
  481. code := new(model.CreateCodeN)
  482. s.d.DB.Raw(`call createCodeN(?,?)`, pastureId, "CY").First(code)
  483. return s.d.DB.Transaction(func(tx *gorm.DB) error {
  484. deselOffList := make([]*model.DieselOff, 0)
  485. err := tx.Where("pastureId = ?", pastureId).Where(" selTime like concat('%',?,'%') ", date).Find(&deselOffList).Error
  486. fmt.Println(err)
  487. if err != nil {
  488. //logs.Error(err)
  489. return err
  490. }
  491. if len(deselOffList) == 0 {
  492. return nil
  493. }
  494. dieselList := make([]*model.Diesel, 0)
  495. for _, item := range deselOffList {
  496. //fmt.Println(item)
  497. var targetTime = ""
  498. t, err := time.Parse(time.RFC3339, item.SelTime)
  499. if err != nil {
  500. fmt.Println("解析错误:", err)
  501. targetTime = item.SelTime
  502. } else {
  503. targetTime = t.Format("2006-01-02 15:04:05")
  504. }
  505. // 转换为指定格式的时间字符串
  506. fmt.Println(targetTime)
  507. diesel := &model.Diesel{
  508. Id: item.Id,
  509. PastureId: item.PastureId,
  510. DeptId: item.DeptId,
  511. EqId: item.EqId,
  512. EqCode: item.EqCode,
  513. OilcardId: item.OilcardId,
  514. CardNumber: item.CardNumber,
  515. OilClass: item.OilClass,
  516. OilAmount: item.OilAmount,
  517. NowPrice: item.NowPrice,
  518. Price: item.Price,
  519. EmpId: item.EmpId,
  520. InputId: item.InputId,
  521. SelTime: targetTime,
  522. Note: item.Note,
  523. OilName: item.OilName,
  524. OilType: item.OilType,
  525. DieselCode: code.OrderCode,
  526. }
  527. tx.Create(diesel)
  528. dieselList = append(dieselList, diesel)
  529. tx.Exec(`delete from diesel_off where id = ?`, item.Id)
  530. }
  531. err = s.DieseUseProof(dieselList, tx, strconv.Itoa(pastureId), code.OrderCode, date)
  532. if err != nil {
  533. //logs.Error(err)
  534. return err
  535. }
  536. return nil
  537. })
  538. }