广汽安道拓Acura项目MES后台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

347 lines
11 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. package main
  2. import (
  3. dalBase "LAPP_ACURA_MOM_BACKEND/dao/base"
  4. dalJit "LAPP_ACURA_MOM_BACKEND/dao/jit"
  5. omDal "LAPP_ACURA_MOM_BACKEND/dao/om"
  6. "LAPP_ACURA_MOM_BACKEND/etl_task/model"
  7. "LAPP_ACURA_MOM_BACKEND/grmi"
  8. meta "LAPP_ACURA_MOM_BACKEND/meta/base"
  9. metaJit "LAPP_ACURA_MOM_BACKEND/meta/jit"
  10. omMeta "LAPP_ACURA_MOM_BACKEND/meta/om"
  11. modelJit "LAPP_ACURA_MOM_BACKEND/models/jit"
  12. "LAPP_ACURA_MOM_BACKEND/utils"
  13. "fmt"
  14. _ "github.com/denisenkom/go-mssqldb"
  15. _ "github.com/go-sql-driver/mysql"
  16. "github.com/go-xorm/xorm"
  17. "golang.org/x/text/encoding/simplifiedchinese"
  18. "golang.org/x/text/transform"
  19. "io/ioutil"
  20. "os"
  21. "path"
  22. "strconv"
  23. "strings"
  24. "time"
  25. )
  26. //BackFlushPackOrder.exe "server=101.201.121.115;database=LAPP_ACURA_MES;user id=sa;password=Leit2020;port=1433;encrypt=disable" "LAPP_ACURA_MES" "server=101.201.121.115;database=LAPP_ETL2;user id=sa;password=Leit2020;port=1433;encrypt=disable" "LAPP_ETL2" "97"
  27. func main() {
  28. var err error
  29. var plantNr = 100
  30. var userId = "backFlush"
  31. now := time.Now()
  32. year, month, day := now.Date()
  33. hour := now.Hour()
  34. minute := now.Minute()
  35. second := now.Second()
  36. // init global location time zone
  37. utils.TimezoneLocation, err = time.LoadLocation("Asia/Shanghai")
  38. if err != nil {
  39. fmt.Println("初始化时区错误:" + err.Error())
  40. return
  41. }
  42. if len(os.Args) < 5 {
  43. fmt.Println("参数长度错误!")
  44. return
  45. }
  46. var acuraDsn = os.Args[1]
  47. var etlDsn = os.Args[3]
  48. taskId, err := strconv.Atoi(os.Args[5])
  49. if err != nil {
  50. fmt.Println("接收到的taskId错误, taskId:" + os.Args[5])
  51. return
  52. }
  53. // 初始化数据库连接
  54. etlDB, err := xorm.NewEngine("mssql", etlDsn)
  55. if err != nil {
  56. fmt.Println("初始化etl数据库引擎错误:" + err.Error())
  57. return
  58. }
  59. err = etlDB.Ping()
  60. if err != nil {
  61. fmt.Println("连接ETL数据库失败, error:" + err.Error())
  62. return
  63. }
  64. acraDB, err := xorm.NewEngine("mssql", acuraDsn)
  65. if err != nil {
  66. fmt.Println("初始化讴歌数据库引擎错误:" + err.Error())
  67. return
  68. }
  69. err = acraDB.Ping()
  70. if err != nil {
  71. fmt.Println("连接讴歌数据库失败, error:" + err.Error())
  72. return
  73. }
  74. //acraDB.ShowSQL(true)
  75. // 从etl数据库中获取参数
  76. var index4, index5, index6, index7, index8 string
  77. var dir string
  78. etlSession := etlDB.NewSession()
  79. shellParamLi := make([]model.ShellParam, 0)
  80. err = etlSession.Table("ShellParam").Where("TaskId = ?", taskId).Find(&shellParamLi)
  81. if err != nil {
  82. fmt.Println("查询任务需要参数失败, error:" + err.Error())
  83. return
  84. }
  85. for _, param := range shellParamLi {
  86. switch param.ParamName {
  87. case "index4":
  88. index4 = param.ParamValue
  89. case "index5":
  90. index5 = param.ParamValue
  91. case "index6":
  92. index6 = param.ParamValue
  93. case "index7":
  94. index7 = param.ParamValue
  95. case "index8":
  96. index8 = param.ParamValue
  97. case "path":
  98. dir = param.ParamValue
  99. }
  100. }
  101. // index4编码转换
  102. tempReader := transform.NewReader(strings.NewReader(index4), simplifiedchinese.GBK.NewEncoder())
  103. tempBytes, err := ioutil.ReadAll(tempReader)
  104. if err != nil {
  105. fmt.Println("转码失败, 错误:" + err.Error())
  106. return
  107. }
  108. index4 = string(tempBytes)
  109. // index5编码转换
  110. tempReader = transform.NewReader(strings.NewReader(index5), simplifiedchinese.GBK.NewEncoder())
  111. tempBytes, err = ioutil.ReadAll(tempReader)
  112. if err != nil {
  113. fmt.Println("转码失败, 错误:" + err.Error())
  114. return
  115. }
  116. index5 = string(tempBytes)
  117. // index6 编码转换
  118. tempReader = transform.NewReader(strings.NewReader(index6), simplifiedchinese.GBK.NewEncoder())
  119. tempBytes, err = ioutil.ReadAll(tempReader)
  120. if err != nil {
  121. fmt.Println("转码失败, 错误:" + err.Error())
  122. return
  123. }
  124. index6 = string(tempBytes)
  125. // index7 编码转换
  126. tempReader = transform.NewReader(strings.NewReader(index7), simplifiedchinese.GBK.NewEncoder())
  127. tempBytes, err = ioutil.ReadAll(tempReader)
  128. if err != nil {
  129. fmt.Println("转码失败, 错误:" + err.Error())
  130. return
  131. }
  132. index7 = string(tempBytes)
  133. // index8 编码转换
  134. tempReader = transform.NewReader(strings.NewReader(index8), simplifiedchinese.GBK.NewEncoder())
  135. tempBytes, err = ioutil.ReadAll(tempReader)
  136. if err != nil {
  137. fmt.Println("转码失败, 错误:" + err.Error())
  138. return
  139. }
  140. index8 = string(tempBytes)
  141. filename := "lctr" + fmt.Sprintf("%d%02d%02d%d", year, int(month), day, 3600*hour+60*minute+second) + "ACURA.dat"
  142. filepath := path.Join(dir, filename)
  143. acuraSession := acraDB.NewSession()
  144. daoShipOrderStatus := dalJit.NewShipOrderStatusDAO(acuraSession, plantNr, userId)
  145. daoShipOrderDataItem := dalJit.NewShipOrderDataLstDAO(acuraSession, plantNr, userId)
  146. daoPackOrderItem := dalJit.NewPackOrderItemLstDAO(acuraSession, plantNr, userId)
  147. daoArticle := dalBase.NewArticleDAO(acuraSession, plantNr, userId)
  148. serialOrderDao := omDal.NewSerialOrderDAO(acuraSession, plantNr, userId)
  149. //OpDetailDao := omDal.NewSerialOrderOPDetailDAO(acuraSession, plantNr, userId)
  150. daoSerialOrderDao := omDal.NewSerialOrderDAO(acuraSession, plantNr, userId)
  151. // 查询正式发运单 关单 且 未回冲的所有发运单数据
  152. shipOrderDataLi, err := daoShipOrderStatus.SelectUnBackFlushedShipOrder()
  153. if err != nil {
  154. fmt.Println("查询未回冲的发运单失败, error:" + err.Error())
  155. return
  156. }
  157. // 如果没有数据 则完成本次任务
  158. if len(shipOrderDataLi) == 0 {
  159. fmt.Println("OK")
  160. return
  161. }
  162. shipOrderIdLi := make([]interface{}, len(shipOrderDataLi))
  163. waitWriteLi := make([]string, 0)
  164. var pos = 1
  165. serialOrderIdLi := make([]string, 0)
  166. for _, shipOrderData := range shipOrderDataLi {
  167. artQtyMap := make(map[string]int)
  168. artErpQtyMap := make(map[string]int, len(artQtyMap))
  169. // 查询发运单下的发运数据项 获取到包装单id
  170. shipOrderId := shipOrderData.ShipOrder.ShipOrderId
  171. shipOrderIdLi = append(shipOrderIdLi, shipOrderId)
  172. packOrderDataLi, err := daoShipOrderDataItem.SelectCols([]grmi.Predicate{metaJit.ShipOrderDataLst_ShipOrderId.NewPredicate(grmi.Equal, shipOrderId)}, nil, []string{metaJit.ShipOrderDataLst_PackOrderId.Name})
  173. if err != nil {
  174. fmt.Println("查询发运单数据项失败, error:" + err.Error())
  175. return
  176. }
  177. packOrderIdLi := make([]interface{}, 0, len(packOrderDataLi))
  178. for _, packOrderData := range packOrderDataLi {
  179. packOrderId, exist := packOrderData[metaJit.ShipOrderDataLst_PackOrderId.Name]
  180. if exist {
  181. packOrderIdLi = append(packOrderIdLi, packOrderId)
  182. } else {
  183. fmt.Println("查询发运单子项未查询到包装单ID字段")
  184. return
  185. }
  186. }
  187. packOrderItemLi, err := daoPackOrderItem.Select([]grmi.Predicate{
  188. metaJit.PackOrderItemLst_PackOrderId.NewPredicate(grmi.Include, packOrderIdLi...),
  189. metaJit.PackOrderItemLst_Status.NewPredicate(grmi.Equal, modelJit.PACK_STATUS_CLOSED),
  190. }, nil)
  191. if err != nil {
  192. fmt.Println("查询包装单子项失败, error:" + err.Error())
  193. return
  194. }
  195. for _, packOrderItem := range packOrderItemLi {
  196. _, exist := artQtyMap[packOrderItem.PartId]
  197. if !exist {
  198. artQtyMap[packOrderItem.PartId] = 1
  199. } else {
  200. artQtyMap[packOrderItem.PartId] += 1
  201. }
  202. serialOrderIdLi = append(serialOrderIdLi, packOrderItem.SerialOrderId)
  203. }
  204. for artId, qty := range artQtyMap {
  205. //article, err := daoArticle.SelectOne(artId)
  206. articleLi, err := daoArticle.Select([]grmi.Predicate{meta.Article_ArtId.NewPredicate(grmi.Equal, artId)}, nil)
  207. if err != nil {
  208. fmt.Println("查询物料数据失败, error:" + err.Error())
  209. return
  210. }
  211. if len(articleLi) == 0 {
  212. _ = acuraSession.Rollback()
  213. fmt.Println("物料不存在, 物料ID:" + artId)
  214. return
  215. }
  216. article := articleLi[0]
  217. if !article.BackFlushItemToggle {
  218. continue
  219. }
  220. if article.ArtSpec3 == "" {
  221. fmt.Println("物料的ERP零件号为空, 物料ID:" + artId)
  222. return
  223. }
  224. artErpQtyMap[article.ArtSpec3] = qty
  225. }
  226. if len(shipOrderId) < 15 {
  227. fmt.Println("发运单号格式错误, 发运单号:" + shipOrderId)
  228. return
  229. }
  230. writeOrderId := shipOrderId[:15]
  231. for artId, qty := range artErpQtyMap {
  232. index1 := artId
  233. index2 := strconv.Itoa(qty)
  234. index3 := now.Format("01/02/06")
  235. str := fmt.Sprintf(`"%s",%s,%s,"%s","%s","%s","%s","%s","%s",%s`,
  236. index1,
  237. index2,
  238. index3,
  239. index4,
  240. index5,
  241. index6,
  242. index7,
  243. index8,
  244. writeOrderId,
  245. strconv.Itoa(pos),
  246. )
  247. //str := []string{index1, index2, index3, index4, index5, index6, index7, index8, shipOrderId, strconv.Itoa(pos), "\n"} //需要写入csv的数据,切片类型
  248. pos++
  249. waitWriteLi = append(waitWriteLi, str)
  250. }
  251. }
  252. updateSerialOrderIdLi := make([]string, 0)
  253. for _, serialOrderId := range serialOrderIdLi {
  254. serialOrder, err := serialOrderDao.SelectOne(serialOrderId)
  255. if err != nil {
  256. fmt.Println("查询工单失败, 错误:" + err.Error())
  257. return
  258. }
  259. if serialOrder == nil {
  260. fmt.Printf("工单%s不存在", serialOrderId)
  261. return
  262. }
  263. originSerialOrderLi, err := serialOrderDao.Select([]grmi.Predicate{
  264. omMeta.SerialOrder_OriginSerialOrderId.NewPredicate(grmi.Equal, serialOrderId),
  265. }, nil)
  266. if err != nil {
  267. fmt.Println("查询工单失败, 错误:" + err.Error())
  268. return
  269. }
  270. for _, order := range originSerialOrderLi {
  271. updateSerialOrderIdLi = append(updateSerialOrderIdLi, order.SerialOrderId)
  272. }
  273. }
  274. if err = acuraSession.Begin(); err != nil {
  275. fmt.Println("开启事务失败, error:" + err.Error())
  276. return
  277. }
  278. updateData := modelJit.ShipOrderStatus{BackFlushedToggle: true}
  279. err = daoShipOrderStatus.UpdateWhere([]grmi.Predicate{metaJit.ShipOrderStatus_ShipOrderId.NewPredicate(grmi.Include, shipOrderIdLi...)}, &updateData, metaJit.ShipOrderStatus_BackFlushedToggle.Name)
  280. if err != nil {
  281. _ = acuraSession.Rollback()
  282. fmt.Println("更新发运单回冲状态失败, error:" + err.Error())
  283. return
  284. }
  285. _, err = daoSerialOrderDao.UpdateShipBackFlushFlag(updateSerialOrderIdLi)
  286. if err != nil {
  287. _ = acuraSession.Rollback()
  288. fmt.Println("更新工单回冲状态失败, error:" + err.Error())
  289. return
  290. }
  291. //if int(count) != len(serialOrderIdLi) {
  292. // _ = acuraSession.Rollback()
  293. // fmt.Println("更新工单回冲状态数量和查询的数量不一致, 更新数量:" + strconv.Itoa(int(count)) + ", 查询数量:" + strconv.Itoa(len(serialOrderIdLi)))
  294. // return
  295. //}
  296. //OpenFile读取文件,不存在时则创建,使用追加模式
  297. File, err := os.OpenFile(filepath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0777)
  298. if err != nil {
  299. fmt.Println("创建csv文件失败, error:" + err.Error())
  300. return
  301. }
  302. //WriterCsv := csv.NewWriter(File)
  303. //for _, writeItem := range waitWriteLi {
  304. // //写入一条数据,传入数据为切片(追加模式)
  305. // err = WriterCsv.Write(writeItem)
  306. // if err != nil {
  307. // fmt.Println("写入csv文件失败, error:" + err.Error())
  308. // return
  309. // }
  310. //}
  311. //WriterCsv.Flush() //刷新,不刷新是无法写入的
  312. _, err = File.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM
  313. if err != nil {
  314. _ = acuraSession.Rollback()
  315. fmt.Println("写入csv文件失败, error:" + err.Error())
  316. return
  317. }
  318. for _, item := range waitWriteLi {
  319. _, err = File.WriteString(item)
  320. if err != nil {
  321. _ = acuraSession.Rollback()
  322. fmt.Println("写入csv文件失败, error:" + err.Error())
  323. return
  324. }
  325. _, err = File.Write([]byte{'\r', '\n'})
  326. if err != nil {
  327. _ = acuraSession.Rollback()
  328. fmt.Println("写入csv文件失败, error:" + err.Error())
  329. return
  330. }
  331. }
  332. _ = File.Close()
  333. err = acuraSession.Commit()
  334. if err != nil {
  335. fmt.Println("事务提交失败, error:" + err.Error())
  336. return
  337. }
  338. fmt.Println("OK")
  339. return
  340. }