广汽安道拓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. dalOm "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. "LAPP_ACURA_MOM_BACKEND/utils"
  10. "fmt"
  11. _ "github.com/denisenkom/go-mssqldb"
  12. _ "github.com/go-sql-driver/mysql"
  13. "github.com/go-xorm/xorm"
  14. "golang.org/x/text/encoding/simplifiedchinese"
  15. "golang.org/x/text/transform"
  16. "io/ioutil"
  17. "os"
  18. "path"
  19. "strconv"
  20. "strings"
  21. "time"
  22. )
  23. //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" "98"
  24. func main() {
  25. var err error
  26. var plantNr = 100
  27. var userId = "BackFlush"
  28. now := time.Now()
  29. year, month, day := now.Date()
  30. hour := now.Hour()
  31. minute := now.Minute()
  32. second := now.Second()
  33. // init global location time zone
  34. utils.TimezoneLocation, err = time.LoadLocation("Asia/Shanghai")
  35. if err != nil {
  36. fmt.Println("初始化时区错误:" + err.Error())
  37. return
  38. }
  39. if len(os.Args) < 5 {
  40. fmt.Println("参数长度错误!")
  41. return
  42. }
  43. var acuraDsn = os.Args[1]
  44. var etlDsn = os.Args[3]
  45. taskId, err := strconv.Atoi(os.Args[5])
  46. if err != nil {
  47. fmt.Println("接收到的taskId错误, taskId:" + os.Args[5])
  48. return
  49. }
  50. //etlDsn := "server=101.201.121.115;database=LAPP_ETL;user id=sa;password=Leit2020;port=1433;encrypt=disable"
  51. //acuraDsn := "server=101.201.121.115;database=LAPP_ACURA_MES3;user id=sa;password=Leit2020;port=1433;encrypt=disable"
  52. //taskId := 101
  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. acuraDB, err := xorm.NewEngine("mssql", acuraDsn)
  65. if err != nil {
  66. fmt.Println("初始化讴歌数据库引擎错误:" + err.Error())
  67. return
  68. }
  69. err = acuraDB.Ping()
  70. if err != nil {
  71. fmt.Println("连接讴歌数据库失败, error:" + err.Error())
  72. return
  73. }
  74. acuraDB.ShowSQL(true)
  75. // 从etl数据库中获取参数
  76. var index1 string
  77. var index2 string
  78. var index3 string
  79. var index5 string
  80. var index8 string
  81. var tempIndex9 string
  82. var index12 string
  83. var dir string
  84. etlSession := etlDB.NewSession()
  85. defer etlSession.Close()
  86. shellParamLi := make([]model.ShellParam, 0)
  87. err = etlSession.Table("ShellParam").Where("TaskId = ?", taskId).Find(&shellParamLi)
  88. if err != nil {
  89. fmt.Println("查询任务需要参数失败, error:" + err.Error())
  90. return
  91. }
  92. for _, param := range shellParamLi {
  93. switch param.ParamName {
  94. case "index1":
  95. index1 = param.ParamValue
  96. case "index2":
  97. index2 = param.ParamValue
  98. case "index3":
  99. index3 = param.ParamValue
  100. case "index5":
  101. index5 = param.ParamValue
  102. case "index8":
  103. index8 = param.ParamValue
  104. case "index9":
  105. tempIndex9 = param.ParamValue
  106. case "index12":
  107. index12 = param.ParamValue
  108. case "path":
  109. dir = param.ParamValue
  110. }
  111. }
  112. // index1编码转换
  113. tempReader := transform.NewReader(strings.NewReader(index1), simplifiedchinese.GBK.NewEncoder())
  114. tempBytes, err := ioutil.ReadAll(tempReader)
  115. if err != nil {
  116. fmt.Println("转码失败, 错误:" + err.Error())
  117. return
  118. }
  119. index1 = string(tempBytes)
  120. // index2编码转换
  121. tempReader = transform.NewReader(strings.NewReader(index2), simplifiedchinese.GBK.NewEncoder())
  122. tempBytes, err = ioutil.ReadAll(tempReader)
  123. if err != nil {
  124. fmt.Println("转码失败, 错误:" + err.Error())
  125. return
  126. }
  127. index2 = string(tempBytes)
  128. // index3 编码转换
  129. tempReader = transform.NewReader(strings.NewReader(index3), simplifiedchinese.GBK.NewEncoder())
  130. tempBytes, err = ioutil.ReadAll(tempReader)
  131. if err != nil {
  132. fmt.Println("转码失败, 错误:" + err.Error())
  133. return
  134. }
  135. index3 = string(tempBytes)
  136. // index5 编码转换
  137. tempReader = transform.NewReader(strings.NewReader(index5), simplifiedchinese.GBK.NewEncoder())
  138. tempBytes, err = ioutil.ReadAll(tempReader)
  139. if err != nil {
  140. fmt.Println("转码失败, 错误:" + err.Error())
  141. return
  142. }
  143. index5 = string(tempBytes)
  144. // index8 编码转换
  145. tempReader = transform.NewReader(strings.NewReader(index8), simplifiedchinese.GBK.NewEncoder())
  146. tempBytes, err = ioutil.ReadAll(tempReader)
  147. if err != nil {
  148. fmt.Println("转码失败, 错误:" + err.Error())
  149. return
  150. }
  151. index8 = string(tempBytes)
  152. // index12 编码转换
  153. tempReader = transform.NewReader(strings.NewReader(index12), simplifiedchinese.GBK.NewEncoder())
  154. tempBytes, err = ioutil.ReadAll(tempReader)
  155. if err != nil {
  156. fmt.Println("转码失败, 错误:" + err.Error())
  157. return
  158. }
  159. index12 = string(tempBytes)
  160. filename := "bkfl" + fmt.Sprintf("%d%02d%02d%d", year, int(month), day, 3600*hour+60*minute+second) + "ACURA.csv"
  161. filepath := path.Join(dir, filename)
  162. acuraSession := acuraDB.NewSession()
  163. defer acuraSession.Close()
  164. nowStr := now.Format(grmi.DateTimeOutFormat)
  165. daoPackOrderItem := dalJit.NewPackOrderItemLstDAO(acuraSession, plantNr, userId)
  166. daoPackOrderStatus := dalJit.NewPackOrderStatusDAO(acuraSession, plantNr, userId)
  167. daoArticle := dalBase.NewArticleDAO(acuraSession, plantNr, userId)
  168. daoSerialOrder := dalOm.NewSerialOrderDAO(acuraSession, plantNr, userId)
  169. backFlushLi, err := daoPackOrderItem.GetUnFlushBackData(nowStr)
  170. if err != nil {
  171. fmt.Println("查询和更新包装单状态失败, error:" + err.Error())
  172. return
  173. }
  174. if len(backFlushLi) == 0 {
  175. fmt.Println("OK")
  176. return
  177. }
  178. ArtMap := make(map[string]int)
  179. serialOrderIdLi := make([]string, 0)
  180. packOrderIdLi := make([]string, 0)
  181. //serialOrderStartTime := time.Now()
  182. //serialOrderEndTime := time.Now()
  183. //packOrderStartTime := time.Now()
  184. //packOrderEndTime := time.Now()
  185. var currentPackOrderId string
  186. for index, item := range backFlushLi {
  187. if index == 0 {
  188. currentPackOrderId = item.PackOrderStatus.PackOrderId
  189. packOrderIdLi = append(packOrderIdLi, item.PackOrderStatus.PackOrderId)
  190. }
  191. _, exist := ArtMap[item.SerialOrder.ArtId]
  192. if !exist {
  193. ArtMap[item.SerialOrder.ArtId] = 1
  194. } else {
  195. ArtMap[item.SerialOrder.ArtId] += 1
  196. }
  197. //if index == 0 {
  198. // serialOrderStartTime = item.SerialOrder.CreateTime.Restore()
  199. // serialOrderEndTime = item.SerialOrder.CreateTime.Restore()
  200. // packOrderStartTime = item.PackOrderStatus.CreateTime.Restore()
  201. // packOrderEndTime = item.PackOrderStatus.CreateTime.Restore()
  202. //}
  203. //fmt.Println("item.SerialOrder:", item.SerialOrder.SerialOrderId)
  204. //fmt.Println("item.SerialOrder.CreateTime:", item.SerialOrder.CreateTime.Restore().String())
  205. //fmt.Println("serialOrderStartTime:", serialOrderStartTime.String())
  206. //fmt.Println("serialOrderEndTime:", serialOrderEndTime.String())
  207. //if item.SerialOrder.CreateTime.Restore().Before(serialOrderStartTime) {
  208. // fmt.Println("here1")
  209. // serialOrderStartTime = item.SerialOrder.CreateTime.Restore()
  210. //}
  211. //if serialOrderEndTime.Before(item.SerialOrder.CreateTime.Restore()) {
  212. // fmt.Println("here2")
  213. // serialOrderEndTime = item.SerialOrder.CreateTime.Restore()
  214. //}
  215. //if item.PackOrderStatus.CreateTime.Restore().Before(packOrderStartTime) {
  216. // packOrderStartTime = item.PackOrderStatus.CreateTime.Restore()
  217. //}
  218. //if packOrderEndTime.Before(item.PackOrderStatus.CreateTime.Restore()) {
  219. // packOrderEndTime = item.PackOrderStatus.CreateTime.Restore()
  220. //}
  221. serialOrderIdLi = append(serialOrderIdLi, item.SerialOrder.SerialOrderId)
  222. if currentPackOrderId != item.PackOrderStatus.PackOrderId {
  223. currentPackOrderId = item.PackOrderStatus.PackOrderId
  224. packOrderIdLi = append(packOrderIdLi, item.PackOrderStatus.PackOrderId)
  225. }
  226. }
  227. writeLi := make([]string, 0, len(ArtMap))
  228. for artId, qty := range ArtMap {
  229. //article, err := daoArticle.SelectOne(artId)
  230. articleLi, err := daoArticle.Select([]grmi.Predicate{meta.Article_ArtId.NewPredicate(grmi.Equal, artId)}, nil)
  231. if err != nil {
  232. fmt.Println("查询物料数据失败, error:" + err.Error())
  233. return
  234. }
  235. if len(articleLi) == 0 {
  236. _ = acuraSession.Rollback()
  237. fmt.Println("物料不存在, 物料ID:" + artId)
  238. return
  239. }
  240. article := articleLi[0]
  241. if !article.BackFlushItemToggle {
  242. continue
  243. }
  244. qadArtId := article.ArtSpec3
  245. if qadArtId == "" {
  246. fmt.Println("未获取到ERP零件号, 物料ID:" + artId)
  247. return
  248. }
  249. index6 := fmt.Sprintf("%02d%02d%d", int(month), day, 3600*hour+60*minute+second)
  250. index7 := fmt.Sprintf("%02d%02d%d", int(month), day, 3600*hour+60*minute+second)
  251. index9 := tempIndex9 + fmt.Sprintf("%d%02d%02d%d", year, int(month), day, 3600*hour+60*minute+second)
  252. index11 := now.Format("01/02/06")
  253. writeStr := fmt.Sprintf(`"%s","%s",%s,"%s","%s",%s,%s,"%s","%s",%s,%s,"%s",""`,
  254. index1,
  255. index2,
  256. index3,
  257. qadArtId,
  258. index5,
  259. index6,
  260. index7,
  261. index8,
  262. index9,
  263. strconv.Itoa(qty),
  264. index11,
  265. index12,
  266. )
  267. writeLi = append(writeLi, writeStr)
  268. }
  269. if err = acuraSession.Begin(); err != nil {
  270. fmt.Println("开启事务失败, error:" + err.Error())
  271. return
  272. }
  273. count, err := daoSerialOrder.UpdateBackFlushFlag(serialOrderIdLi)
  274. if err != nil {
  275. _ = acuraSession.Rollback()
  276. fmt.Println("更新工单回冲状态失败, error:" + err.Error())
  277. return
  278. }
  279. if int(count) != len(serialOrderIdLi) {
  280. _ = acuraSession.Rollback()
  281. fmt.Println("更新工单回冲状态数量和查询的数量不一致, 更新数量:" + strconv.Itoa(int(count)) + ", 查询数量:" + strconv.Itoa(len(serialOrderIdLi)))
  282. return
  283. }
  284. count, err = daoPackOrderStatus.UpdateBackFlushFlag(packOrderIdLi)
  285. if err != nil {
  286. _ = acuraSession.Rollback()
  287. fmt.Println("更新包装单回冲状态失败, error:" + err.Error())
  288. return
  289. }
  290. if int(count) != len(packOrderIdLi) {
  291. _ = acuraSession.Rollback()
  292. fmt.Println("更新包装单回冲状态数量和查询的数量不一致, 更新数量:" + strconv.Itoa(int(count)) + ", 查询数量:" + strconv.Itoa(len(packOrderIdLi)))
  293. return
  294. }
  295. //OpenFile读取文件,不存在时则创建,使用追加模式
  296. File, err := os.OpenFile(filepath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666)
  297. if err != nil {
  298. fmt.Println("创建csv文件失败, error:" + err.Error())
  299. return
  300. }
  301. _, err = File.WriteString("\xEF\xBB\xBF") // 写入UTF-8 BOM
  302. if err != nil {
  303. _ = acuraSession.Rollback()
  304. fmt.Println("写入csv文件失败, error:" + err.Error())
  305. return
  306. }
  307. for _, item := range writeLi {
  308. _, err = File.WriteString(item)
  309. if err != nil {
  310. _ = acuraSession.Rollback()
  311. fmt.Println("写入csv文件失败, error:" + err.Error())
  312. return
  313. }
  314. _, err = File.Write([]byte{'\r', '\n'})
  315. if err != nil {
  316. _ = acuraSession.Rollback()
  317. fmt.Println("写入csv文件失败, error:" + err.Error())
  318. return
  319. }
  320. }
  321. File.Close()
  322. //创建写入接口
  323. //WriterCsv := csv.NewWriter(File)
  324. //for _, writeItem := range writeLi {
  325. // //写入一条数据,传入数据为切片(追加模式)
  326. // err = WriterCsv.Write(writeItem)
  327. // if err != nil {
  328. // _ = acuraSession.Rollback()
  329. // fmt.Println("写入csv文件失败, error:" + err.Error())
  330. // return
  331. // }
  332. //}
  333. //WriterCsv.Flush() //刷新,不刷新是无法写入的
  334. err = acuraSession.Commit()
  335. if err != nil {
  336. fmt.Println("事务提交失败, error:" + err.Error())
  337. return
  338. }
  339. fmt.Println("OK")
  340. return
  341. }