228acb8ce885cde11a568db459ae075c7bce53b8.svn-base 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  1. package util
  2. import (
  3. "../../pkg/logging"
  4. "../../routers/restful"
  5. "errors"
  6. "fmt"
  7. )
  8. // @Summary 现代牧业EAS对接 备件,出入库
  9. type BillLaid struct { // 销售出库&其它出库 &采购入库 & 其他入库
  10. BizType BillNumber `json:"bizType"` //业务类型
  11. BizDate string `json:"bizDate"` //业务日期
  12. Description string `json:"description"` //摘要
  13. PaymentType BillNumber `json:"paymentType"` // 付款方式
  14. TransactionType BillNumber `json:"transactionType"` // 事务类型
  15. Number string `json:"number"` // 单据编号
  16. Entry []BillEntry `json:"entry"` //
  17. StorageOrgUnit BillNumber `json:"storageOrgUnit"` //库存组织
  18. Supplier BillNumber `json:"supplier"` //供应商
  19. Currency BillNumber `json:"currency"` // 币别
  20. Creator BillNumber `json:"creator"` //创建者
  21. }
  22. type BillNumber struct {
  23. Number string `json:"number"`
  24. }
  25. type BillEntry struct {
  26. ActualPrice string `json:"actualPrice"` //实际单价
  27. ActualTaxPrice string `json:"actualTaxPrice"` //实际含税单价
  28. UnitActualCost string `json:"unitActualCost"` //单位实际成本
  29. UnitPurchaseCost string `json:"unitPurchaseCost"` //单位采购成本
  30. TaxPrice string `json:"taxPrice"` //含税单价
  31. BalanceSupplier BillNumber `json:"balanceSupplier"` //结算供应商
  32. Price string `json:"price"` //单价
  33. ActualCost string `json:"actualCost"` //实际成本
  34. PurchaseCost string `json:"purchaseCost"` //采购成本
  35. Amount string `json:"amount"` // 金额
  36. TaxAmount string `json:"taxAmount"` // 价税合计
  37. ContractNumber string `json:"contractNumber"` // 合同号
  38. Warehouse BillNumber `json:"warehouse"` // 仓库
  39. Unit BillNumber `json:"unit"` // 单位
  40. Material BillNumber `json:"material"` //物料
  41. Qty string `json:"qty"` //数量
  42. StoreType BillNumber`json:"storeType"`//库存类型
  43. StoreStatus BillNumber`json:"storeStatus"`//库存状态
  44. }
  45. type BillUse struct { //领料出库&生产入库
  46. Head BillUseHead `json:"head"`
  47. Entrys []BillUseEntrys `json:"entrys"`
  48. }
  49. type BillUseHead struct {
  50. BillNumber string `json:"billNumber"` //单据编号
  51. BizDate string `json:"bizDate"` //业务日期
  52. BizTypeNumber string `json:"bizTypeNumber"` //业务类型
  53. TransactionType string `json:"transactionType"` //事务类型
  54. Department string `json:"department"` //部门
  55. SupplyStorageOrg string `json:"supplyStorageOrg"` //供方库存组织
  56. StorageOrg string `json:"storageOrg"` //需方库存组织
  57. CostCenter string `json:"costCenter"` //成本中心
  58. Remark string `json:"remark"` //摘要
  59. Creator string `json:"creator"` //创建者
  60. }
  61. type BillUseEntrys struct {
  62. MaterielNumber string `json:"materielNumber"` // 物料
  63. Lot string `json:"lot"` //批次
  64. Amount string `json:"amount"` //数量
  65. MeteredUnit string `json:"meteredUnit"` //单位
  66. WareHouse string `json:"wareHouse"` //需方仓库
  67. Location string `json:"location"` //需方库位
  68. Picker string `json:"picker"` // 领料员
  69. EntryRemark string `json:"entryRemark"` //备注
  70. MasterDepartment string `json:"masterDepartment"` //主制部门
  71. EntryCostCenter string `json:"entryCostCenter"` //成本中心
  72. }
  73. type Parts struct { // 备件
  74. MaterialNumber string `json:"materialNumber"`
  75. MaterialName string `json:"materialName"`
  76. MaterialGroup string `json:"materialGroup"`
  77. Model string `json:"model"`
  78. BaseUnit string `json:"baseUnit"`
  79. Status int `json:"status"`
  80. //kaClass int32 `json:"kaClass"`
  81. //planningMode int32 `json:"planningMode"`
  82. }
  83. func EASBillSync(typeIN int, billCode interface{}, statue string) error {
  84. defer func() {
  85. if err := recover(); err != nil {
  86. logging.Error("EASBillSync recover err :", err)
  87. }
  88. }()
  89. fmt.Println("++++++++++++++++", typeIN, billCode)
  90. var err error
  91. schema := ""
  92. id := ""
  93. switch typeIN {
  94. case 1: // 入库
  95. schema = "bigpartlaid"
  96. err, id = BigpartLaid(billCode, "syncEASPpartlaid", "006")
  97. case 2: // 出库
  98. schema = "bigpartUse"
  99. err = BigpartUse(billCode, "syncEASPpartuse", "100")
  100. case 3: //退库
  101. schema = "bigpartquit"
  102. err = BigpartUse(billCode, "syncEASPpartquit", "100")
  103. case 4: //退货
  104. schema = "bigpartrefund"
  105. err, id = BigpartLaid(billCode, "syncEASPpartrefund", "006")
  106. case 5: //备件
  107. schema = "parts"
  108. err = CheckEASWebServiceParts(statue, billCode.(string))
  109. case 6: //调拨
  110. schema = "bigparttransfer"
  111. err, id = BigpartLaid(billCode, "syncEASPpartlaid", "008")
  112. default:
  113. return errors.New("未知处理类型")
  114. }
  115. if err != nil {
  116. logging.Info("EASBillSync err", err)
  117. fmt.Println("EASBillSync err", err)
  118. return err
  119. }
  120. tx := restful.Engine.NewSession()
  121. err = tx.Begin()
  122. if err != nil {
  123. logging.Error("tx.Begin 事务启动失败__error:", err)
  124. }
  125. defer func() {
  126. switch {
  127. case err != nil:
  128. fmt.Println("__error:", err)
  129. if tx != nil {
  130. tx.Rollback()
  131. }
  132. default:
  133. if tx != nil {
  134. err = tx.Commit()
  135. }
  136. }
  137. if tx != nil {
  138. tx.Close()
  139. }
  140. }()
  141. tx.SQL("update "+schema+"set issync = 1 where id =?", id)
  142. fmt.Println("update "+schema+"set issync = 1 where id =?", id)
  143. return nil
  144. }
  145. func CheckEASWebServiceParts(statue, id string) error {
  146. if statue == "1" {
  147. ress, err := restful.Engine.SQL(`SELECT partCode materialNumber,NAME materialName,
  148. (SELECT VALUE FROM dictlist WHERE pid = 44 AND label = parts.unit) baseUnit,
  149. LEFT(partCode,11) materialGroup,specification model
  150. FROM parts WHERE id = ?`, id).QueryString()
  151. if len(ress) == 0 {
  152. logging.Error("CheckEASWebServiceParts select len is 0", len(ress))
  153. return errors.New("查询结果为空")
  154. }
  155. if err != nil {
  156. logging.Error("CheckEASWebServiceParts select err", err)
  157. return err
  158. }
  159. var parts = Parts{}
  160. parts.BaseUnit = ress[0]["baseUnit"]
  161. parts.MaterialGroup = ress[0]["materialGroup"]
  162. parts.MaterialName = ress[0]["materialName"]
  163. parts.MaterialNumber = ress[0]["materialNumber"]
  164. parts.Model = ress[0]["model"]
  165. parts.Status = 1
  166. sessionid, err := EASWebServiceLogin()
  167. if err != nil {
  168. logging.Error("EASWebServiceLogin", err)
  169. return err
  170. }
  171. err = EASWebServicInsertParts(sessionid, parts)
  172. if err != nil {
  173. logging.Error("EASWebServicInsertParts", err)
  174. return err
  175. }
  176. err = EASWebServiceLogout()
  177. if err != nil {
  178. logging.Error("EASWebServiceLogout", err)
  179. }
  180. }
  181. return nil
  182. //}
  183. }
  184. func BigpartUse(billCode interface{}, sqlname, billType string) error {
  185. valuesMap, err := restful.Engine.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? limit 1", sqlname).QueryString()
  186. sqls := ""
  187. if err == nil && len(valuesMap) > 0 {
  188. sqls = valuesMap[0]["sqlstr"]
  189. }
  190. ress, err := restful.Engine.SQL(sqls, billCode).QueryString()
  191. if len(ress) == 0 {
  192. logging.Error("BigpartUse select len is 0", len(ress))
  193. return errors.New("查询结果为空")
  194. }
  195. if err != nil {
  196. logging.Error("BigpartUse select err", err)
  197. return err
  198. }
  199. pu := BillUse{}
  200. pu.Head.BillNumber = ress[0]["BillNumber"]
  201. pu.Head.BizDate = ress[0]["BizDate"]
  202. pu.Head.BizTypeNumber = ress[0]["BizTypeNumber"]
  203. pu.Head.TransactionType = ress[0]["TransactionType"]
  204. pu.Head.Department = ress[0]["Department"]
  205. pu.Head.SupplyStorageOrg = ress[0]["SupplyStorageOrg"]
  206. pu.Head.StorageOrg = ress[0]["StorageOrg"]
  207. pu.Head.Creator = ress[0]["Creator"]
  208. pu.Head.Remark = ress[0]["Remark"]
  209. pu.Head.CostCenter = ress[0]["Department"]
  210. //pu.Head.entryCostCenter
  211. isZeroStock := false //是否零库存
  212. en := make([]BillUseEntrys, len(ress))
  213. for key, res := range ress {
  214. if res["isZeroStock"] == "1" {
  215. isZeroStock = true
  216. }
  217. en[key].Amount = res["Amount"]
  218. en[key].EntryRemark = res["EntryRemark"]
  219. en[key].Lot = res["Lot"]
  220. en[key].MaterielNumber = res["MaterielNumber"]
  221. en[key].MeteredUnit = res["MeteredUnit"]
  222. en[key].Picker = res["Picker"]
  223. en[key].WareHouse = res["WareHouse"]
  224. en[key].Location = res["Location"]
  225. en[key].MasterDepartment = ress[0]["Department"]
  226. en[key].EntryCostCenter = ress[0]["Department"]
  227. //en[key].Location="0202001"
  228. //en[key].WareHouse ="0202001"
  229. }
  230. pu.Entrys = en
  231. pujson, _ := json.Marshal(pu)
  232. println(string(pujson))
  233. sessionid, err := EASWebServiceLogin()
  234. if err != nil {
  235. logging.Error("EASWebServiceLogin", err)
  236. return err
  237. }
  238. if isZeroStock {
  239. pls := make([]BillLaid, 0)
  240. pl := BillLaid{}
  241. pl.Number = ress[0]["BillNumber"] + "-RK"
  242. pl.TransactionType = BillNumber{
  243. Number: "001",
  244. }
  245. pl.BizDate = ress[0]["BizDate1"]
  246. pl.BizType = BillNumber{
  247. Number: "110",
  248. }
  249. pl.Currency = BillNumber{
  250. Number: "BB01",
  251. }
  252. pl.PaymentType = BillNumber{
  253. Number: "004",
  254. }
  255. pl.StorageOrgUnit = BillNumber{
  256. Number: ress[0]["SupplyStorageOrg"],
  257. }
  258. pl.Supplier = BillNumber{
  259. Number: ress[0]["BalanceSupplier"],
  260. }
  261. pl.Creator = BillNumber{
  262. Number: ress[0]["Creator"],
  263. }
  264. en := make([]BillEntry, len(ress))
  265. for key, res := range ress {
  266. if res["isZeroStock"] == "0" {
  267. continue
  268. }
  269. en[key].Amount = res["SumPrice"]
  270. en[key].Qty = res["Amount"]
  271. en[key].ActualCost = res["SumPrice"]
  272. en[key].ActualPrice = res["Price"]
  273. en[key].ActualTaxPrice = res["Price"]
  274. en[key].BalanceSupplier = BillNumber{
  275. Number: res["BalanceSupplier"],
  276. }
  277. en[key].ContractNumber = res["ContractNumber"]
  278. en[key].Material = BillNumber{
  279. Number: res["MaterielNumber"],
  280. }
  281. en[key].Price = res["Price"]
  282. en[key].PurchaseCost = res["SumPrice"]
  283. en[key].TaxAmount = res["SumPrice"]
  284. en[key].TaxPrice = res["Price"]
  285. en[key].Unit = BillNumber{
  286. Number: res["MeteredUnit"],
  287. }
  288. en[key].UnitActualCost = res["SumPrice"]
  289. en[key].UnitPurchaseCost = res["Price"]
  290. en[key].Warehouse = BillNumber{
  291. Number: res["WareHouse"],
  292. }
  293. }
  294. pl.Entry = en
  295. pls = append(pls, pl)
  296. pljson, _ := json.Marshal(pls)
  297. println(string(pljson))
  298. err = EASWebServicInsertPartsuselaid(sessionid, string(pljson), "006")
  299. if err != nil {
  300. logging.Error("EASWebServicInsertPartsuselaid", err)
  301. }
  302. }
  303. err = EASWebServicInsertPartsuselaid(sessionid, string(pujson), billType)
  304. if err != nil {
  305. logging.Error("EASWebServicInsertPartsuselaid", err)
  306. return err
  307. }
  308. EASWebServiceLogout()
  309. return nil
  310. }
  311. func BigpartUseTransfer(billCode interface{}, sqlname, billType string) error {
  312. valuesMap, err := restful.Engine.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? limit 1", sqlname).QueryString()
  313. sqls := ""
  314. if err == nil && len(valuesMap) > 0 {
  315. sqls = valuesMap[0]["sqlstr"]
  316. }
  317. ress, err := restful.Engine.SQL(sqls, billCode).QueryString()
  318. if len(ress) == 0 {
  319. logging.Error("BigpartUse select len is 0", len(ress))
  320. return errors.New("查询结果为空")
  321. }
  322. if err != nil {
  323. logging.Error("BigpartUse select err", err)
  324. return err
  325. }
  326. //id := ress[0]["id"]
  327. pus := make([]BillLaid, 0)
  328. pu := BillLaid{}
  329. pu.Number = ress[0]["BillNumber"]
  330. pu.TransactionType = BillNumber{
  331. Number: ress[0]["TransactionType"],
  332. }
  333. pu.BizDate = ress[0]["BizDate1"]
  334. pu.BizType = BillNumber{
  335. Number: ress[0]["BizTypeNumber"],
  336. }
  337. pu.Currency = BillNumber{
  338. Number: "BB01",
  339. }
  340. pu.PaymentType = BillNumber{
  341. Number: ress[0]["PaymentType"],
  342. }
  343. pu.StorageOrgUnit = BillNumber{
  344. Number: ress[0]["SupplyStorageOrg"],
  345. }
  346. pu.Supplier = BillNumber{
  347. Number: ress[0]["BalanceSupplier"],
  348. }
  349. pu.Description = ress[0]["Description"]
  350. pu.Creator = BillNumber{
  351. Number: ress[0]["Creator"],
  352. }
  353. en := make([]BillEntry, len(ress))
  354. isZeroStock := false
  355. for key, res := range ress {
  356. if res["isZeroStock"] == "1" {
  357. continue
  358. } else {
  359. isZeroStock = true
  360. }
  361. en[key].Amount = res["SumPrice"]
  362. en[key].Qty = res["Amount"]
  363. en[key].ActualCost = res["SumPrice"]
  364. en[key].ActualPrice = res["Price"]
  365. en[key].ActualTaxPrice = res["Price"]
  366. en[key].BalanceSupplier = BillNumber{
  367. Number: res["BalanceSupplier"],
  368. }
  369. en[key].ContractNumber = res["ContractNumber"]
  370. en[key].Material = BillNumber{
  371. Number: res["MaterielNumber"],
  372. }
  373. en[key].Price = res["Price"]
  374. en[key].PurchaseCost = res["SumPrice"]
  375. en[key].TaxAmount = res["SumPrice"]
  376. en[key].TaxPrice = res["Price"]
  377. en[key].Unit = BillNumber{
  378. Number: res["MeteredUnit"],
  379. }
  380. en[key].UnitActualCost = res["SumPrice"]
  381. en[key].UnitPurchaseCost = res["Price"]
  382. en[key].Warehouse = BillNumber{
  383. Number: res["WareHouse"],
  384. }
  385. en[key].StoreType= BillNumber{
  386. Number: "G",
  387. }
  388. en[key].StoreStatus= BillNumber{
  389. Number: "1",
  390. }
  391. }
  392. if isZeroStock {
  393. pu.Entry = en
  394. pus = append(pus, pu)
  395. pujson, _ := json.Marshal(pus)
  396. println(string(pujson))
  397. sessionid, err := EASWebServiceLogin()
  398. if err != nil {
  399. logging.Error("EASWebServiceLogin", err)
  400. return err
  401. }
  402. err = EASWebServicInsertPartsuselaid(sessionid, string(pujson), billType)
  403. if err != nil {
  404. logging.Error("EASWebServicInsertPartsuselaid", err)
  405. return err
  406. }
  407. EASWebServiceLogout()
  408. }
  409. return nil
  410. }
  411. func BigpartLaid(billCode interface{}, sqlname, billtype string) (error, string) {
  412. valuesMap, err := restful.Engine.SQL("SELECT sqlstr,params FROM apisql WHERE sqlname = ? limit 1", sqlname).QueryString() //"syncEASPpartlaid"
  413. sqls := ""
  414. if err == nil && len(valuesMap) > 0 {
  415. sqls = valuesMap[0]["sqlstr"]
  416. }
  417. ress, err := restful.Engine.SQL(sqls, billCode).QueryString()
  418. if len(ress) == 0 {
  419. logging.Error("BigpartLaid select len is 0", len(ress))
  420. return errors.New("查询结果为空"), ""
  421. }
  422. if err != nil {
  423. logging.Error("BigpartLaid select err", err)
  424. return err, ""
  425. }
  426. id := ress[0]["id"]
  427. pls := make([]BillLaid, 0)
  428. pl := BillLaid{}
  429. pl.Number = ress[0]["BillNumber"]
  430. pl.TransactionType = BillNumber{
  431. Number: ress[0]["TransactionType"],
  432. }
  433. pl.BizDate = ress[0]["BizDate"]
  434. pl.BizType = BillNumber{
  435. Number: ress[0]["BizType"],
  436. }
  437. pl.Currency = BillNumber{
  438. Number: ress[0]["Currency"],
  439. }
  440. pl.PaymentType = BillNumber{
  441. Number: ress[0]["PaymentType"],
  442. }
  443. pl.StorageOrgUnit = BillNumber{
  444. Number: ress[0]["StorageOrgUnit"],
  445. }
  446. pl.Supplier = BillNumber{
  447. Number: ress[0]["BalanceSupplier"],
  448. }
  449. pl.Description = ress[0]["Description"]
  450. pl.Creator = BillNumber{
  451. Number: ress[0]["Creator"],
  452. }
  453. en := make([]BillEntry, len(ress))
  454. isZeroStock := false
  455. for key, res := range ress {
  456. if res["isZeroStock"] == "1" {
  457. continue
  458. } else {
  459. isZeroStock = true
  460. }
  461. en[key].Amount = res["Amount"]
  462. en[key].Qty = res["Qty"]
  463. en[key].ActualCost = res["ActualCost"]
  464. en[key].ActualPrice = res["ActualPrice"]
  465. en[key].ActualTaxPrice = res["ActualTaxPrice"]
  466. en[key].BalanceSupplier = BillNumber{
  467. Number: res["BalanceSupplier"],
  468. }
  469. en[key].ContractNumber = res["ContractNumber"]
  470. en[key].Material = BillNumber{
  471. Number: res["Material"],
  472. }
  473. en[key].Price = res["Price"]
  474. en[key].PurchaseCost = res["PurchaseCost"]
  475. en[key].TaxAmount = res["TaxAmount"]
  476. en[key].TaxPrice = res["TaxPrice"]
  477. en[key].Unit = BillNumber{
  478. Number: res["Unit"],
  479. }
  480. en[key].UnitActualCost = res["UnitActualCost"]
  481. en[key].UnitPurchaseCost = res["UnitPurchaseCost"]
  482. en[key].Warehouse = BillNumber{
  483. Number: res["Warehouse"],
  484. }
  485. }
  486. if isZeroStock {
  487. pl.Entry = en
  488. pls = append(pls, pl)
  489. pujson, _ := json.Marshal(pls)
  490. println(string(pujson))
  491. sessionid, err := EASWebServiceLogin()
  492. if err != nil {
  493. logging.Error("EASWebServiceLogin", err)
  494. return err, ""
  495. }
  496. err = EASWebServicInsertPartsuselaid(sessionid, string(pujson), billtype)
  497. if err != nil {
  498. logging.Error("EASWebServicInsertPartsuselaid", err)
  499. return err, ""
  500. }
  501. if billtype == "008" { // 为调拨入库时
  502. BigpartUseTransfer(ress[0]["useCode"], "syncEASPpartuse", "009")
  503. }
  504. EASWebServiceLogout()
  505. }
  506. return nil, id
  507. }