Menu.ets 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372
  1. import {TimeAndTitle} from "../component/TimeAndTitle"
  2. import {NavigationBar} from '../component/NavigationBar'
  3. import {StorageList} from '../component/MenuView'
  4. import { BoundOrder} from "../viewmodel/wms/OrderMaterialsStorageParams"
  5. import RequestParamModel from '../viewmodel/wms/RequestParamModel'
  6. import WmsRequest from '../common/util/request/WmsRequest'
  7. import PageRes from "../viewmodel/wms/InBoundOrderInfo"
  8. import router from '@ohos.router';
  9. import MqttManager from '../common/util/mqtt';
  10. import { MqttClientOptions, MqttConnectOptions } from '@ohos/mqtt';
  11. import CommonConstants from '../common/constants/CommonConstants'
  12. import { getToken, getUserInfo } from '../common/util/request/RequestInstance'
  13. import {UserInfo} from '../viewmodel/wms/UserInfo'
  14. import UserAuthModel from '../common/util/UserAuthModel';
  15. import DictInfo from '../viewmodel/DictInfo'
  16. import connection from '@ohos.net.connection';
  17. import { ConfirmDialogParams } from '../viewmodel/wms/ConfirmDialogParam'
  18. import { CommonConfirmDialog } from '../component/OrderMaterialsStorageView'
  19. const TAG: string = 'MENU'
  20. @Entry
  21. @Component
  22. struct menu {
  23. @State pages: PageRes = {}
  24. @State inBoundOrders: BoundOrder[]=[]
  25. @State outBoundOrders: BoundOrder[]=[]
  26. @State loginName: string = 'admin'
  27. @State password: string = '123456'
  28. @State isConnected:boolean=false
  29. commonDialogController: CustomDialogController | null = null;
  30. private showConfirmDialog(params: ConfirmDialogParams) {
  31. if (this.commonDialogController) {
  32. this.commonDialogController.close()
  33. }
  34. this.commonDialogController = new CustomDialogController({
  35. builder: CommonConfirmDialog({
  36. title: params.title || '提示',
  37. message: params.message,
  38. confirmText: params.confirmText || '确定',
  39. cancelText: params.cancelText || '取消',
  40. onConfirm: params.onConfirm
  41. }),
  42. cancel: () => console.log('用户取消操作'),
  43. customStyle: true,
  44. autoCancel:false,
  45. maskColor: 'rgba(0,0,0,0.6)'
  46. });
  47. this.commonDialogController.open();
  48. }
  49. loadOrders = async (type: number, targetArray: BoundOrder[]) => {
  50. const pages = await WmsRequest.post('/api/v1/wmsOrder/page', { type } as RequestParamModel) as PageRes;
  51. if (pages?.records) {
  52. for (const record of pages.records) {
  53. targetArray.push({
  54. batchCode: record.batchCode,
  55. materialName: record.materialName,
  56. materialNo: record.materialNo || '',
  57. num: record.num,
  58. created: record.created
  59. });
  60. }
  61. }
  62. }
  63. connectMQTT=async ()=>{
  64. const clientOptions: MqttClientOptions = {
  65. url: 'mqtt://192.168.1.3:1883', // 替换实际IP
  66. clientId: `ohos_client_${Date.now()}`,
  67. persistenceType: 1, // 使用英文逗号 // 建议开启自动重连
  68. };
  69. // MQTT连接配置
  70. const connectOptions: MqttConnectOptions = {
  71. cleanSession: true,
  72. connectTimeout: 30,
  73. keepAliveInterval: 60,
  74. userName: 'optional_username',
  75. password: 'optional_password'
  76. };
  77. try {
  78. MqttManager.init(clientOptions);
  79. this.isConnected = await MqttManager.connect(connectOptions);
  80. if (this.isConnected ) {
  81. console.info(TAG, 'MQTT connected successfully');
  82. await MqttManager.subscribe('station100/data/devices');
  83. } else {
  84. console.error(TAG, 'MQTT connection failed');
  85. }
  86. } catch (err) {
  87. console.error(TAG, `MQTT error: ${JSON.stringify(err)}`);
  88. }
  89. }
  90. loginWms=async()=> {
  91. if (this.loginName && this.loginName.length > 0 && this.password && this.password.length > 0) {
  92. await getToken(this.loginName, this.password, 17, '66')
  93. .then(token => {
  94. if (token && token.length > 0) {
  95. CommonConstants.AUTH_TOKEN = token
  96. }
  97. })
  98. if (CommonConstants.AUTH_TOKEN.length <= 0) {
  99. return
  100. }
  101. console.log("tesTag1 ssssss" )
  102. let userInfo = await getUserInfo() as UserInfo
  103. console.log("tesTag1" + JSON.stringify(userInfo))
  104. CommonConstants.USER_ID = userInfo.id!
  105. CommonConstants.USER_NAME = userInfo.userName!
  106. CommonConstants.USER_AVATAR = userInfo.avatar!
  107. CommonConstants.STATION_CODE = userInfo.stationCode!
  108. CommonConstants.STATION_IP = userInfo.stationIp!
  109. CommonConstants.STATION_NANE = '出入库工位'
  110. CommonConstants.STATION_ID = 66
  111. let user = await UserAuthModel.getByUserId(userInfo.id ? userInfo.id : 0)
  112. console.log("tesTag1" + JSON.stringify(user))
  113. if (!user || !user.id) {
  114. // 将后端数据库id作为userId, 默认是保持登录
  115. user = {
  116. userId: userInfo.id,
  117. userName: this.loginName,
  118. password: this.password,
  119. orgId: 17,
  120. stationId: 66,
  121. stationName:'出入库工位',
  122. stationDictValue: '6',
  123. avatar: userInfo.avatar,
  124. maintainLoginStatus: 1,
  125. updateTime: new Date().getTime(),
  126. isLogin: true,
  127. }
  128. let res = await UserAuthModel.addUser(user)
  129. }
  130. CommonConstants.LOGIN_OUT = false
  131. }
  132. this.loadOrders(1, this.inBoundOrders)
  133. this.loadOrders(2, this.outBoundOrders)
  134. }
  135. async aboutToAppear() {
  136. //this.connectMQTT();
  137. //this.loginWms();
  138. const checkInterval = setInterval(() => {
  139. if (CommonConstants.AUTH_TOKEN!='') {
  140. clearInterval(checkInterval); // 停止轮询
  141. setTimeout(() => {
  142. this.connectMQTT();
  143. }, 1000);
  144. return
  145. }
  146. this.loginWms();
  147. }, 2000); // 每500毫秒检查一次
  148. // this.loginWms();
  149. // 查询数据字典放到CommonConstants的DICT_DATA变量中
  150. // let res: DictInfo[] = await WmsRequest.post('/api/v1/sys/dictData/all',)
  151. // if (res && res.length > 0) {
  152. // for (const dict of res) {
  153. // CommonConstants.DICT_DATA.set(dict.dictCode, dict.list)
  154. // }
  155. // }
  156. // try {
  157. // const netHandle = connection.getDefaultNetSync();
  158. // if (netHandle) {
  159. // let connectionProperties = await connection.getConnectionProperties(netHandle)
  160. // if (connectionProperties && connectionProperties.linkAddresses) {
  161. // connectionProperties.linkAddresses.forEach((address: connection.LinkAddress, index: number) => {
  162. // console.info('hhtest', "get address info: " + JSON.stringify(address));
  163. // })
  164. // }
  165. // }
  166. // } catch (err) {
  167. // console.log('hhtest', err);
  168. // }
  169. }
  170. build() {
  171. Row() {
  172. Column() {
  173. //时间和导航标
  174. Row(){
  175. TimeAndTitle()
  176. }.width('100%')
  177. .height('3.4%')
  178. .alignItems(VerticalAlign.Bottom)
  179. .justifyContent(FlexAlign.End)
  180. Row(){
  181. Image($r('app.media.general_return'))
  182. .height($r('app.float.virtualSize_56'))
  183. .width($r('app.float.virtualSize_56'))
  184. .fillColor($r('app.color.FFFFFF'))
  185. Text('智能仓储')
  186. .fontColor($r('app.color.FFFFFF'))
  187. .fontSize($r('app.float.fontSize_38'))
  188. }
  189. .height('4%')
  190. .width('100%')
  191. .justifyContent(FlexAlign.Start)
  192. .margin({left:'2%'})
  193. .onClick(()=> {
  194. this.showConfirmDialog({
  195. title: '退出',
  196. message: `确定退出到桌面吗?`,
  197. onConfirm: ()=> {
  198. router.back()
  199. }
  200. });
  201. })
  202. Row(){
  203. NavigationBar().width('20%')
  204. }
  205. .width('100%')
  206. .height('4%')
  207. .justifyContent(FlexAlign.End)
  208. Row(){
  209. Column(){
  210. Text("入库")
  211. .fontColor($r('app.color.FFFFFF'))
  212. .fontSize($r('app.float.fontSize_38'))
  213. Column() {
  214. Text('空箱入库')
  215. .fontSize($r('app.float.fontSize_38'))
  216. .fontColor($r('app.color.FFFFFF'))
  217. .fontWeight(FontWeight.Medium)
  218. Text('料箱编码打印和写入磁卡')
  219. .fontSize($r('app.float.fontSize_16'))
  220. .fontColor($r('app.color.FFFFFF'))
  221. .fontWeight(FontWeight.Lighter)
  222. }
  223. .justifyContent(FlexAlign.Center)
  224. .width('100%')
  225. .height('23%')
  226. .borderRadius($r('app.float.virtualSize_16'))
  227. .backgroundImage($r("app.media.empty_material_inbound"))
  228. .backgroundImageSize(ImageSize.Cover)
  229. .onClick(()=>{
  230. router.pushUrl({
  231. url: 'pages/EmptyBoxStorage'
  232. })
  233. })
  234. Column() {
  235. Text('订单物料入库')
  236. .fontSize($r('app.float.fontSize_38'))
  237. .fontColor($r('app.color.FFFFFF'))
  238. .fontWeight(FontWeight.Medium)
  239. Text('物料绑定料箱和订单')
  240. .fontSize($r('app.float.fontSize_16'))
  241. .fontColor($r('app.color.FFFFFF'))
  242. .fontWeight(FontWeight.Lighter)
  243. }
  244. .justifyContent(FlexAlign.Center)
  245. .width('100%')
  246. .height('46%')
  247. .borderRadius($r('app.float.virtualSize_16'))
  248. .backgroundImage($r("app.media.order_material_inbound"))
  249. .backgroundImageSize(ImageSize.Cover)
  250. .onClick(()=>{
  251. router.pushUrl({
  252. url: 'pages/OrderMaterialsStorage'
  253. })
  254. })
  255. Column() {
  256. Text('零星物料入库')
  257. .fontSize($r('app.float.fontSize_38'))
  258. .fontColor($r('app.color.FFFFFF'))
  259. .fontWeight(FontWeight.Medium)
  260. Text('物料绑定料箱')
  261. .fontSize($r('app.float.fontSize_16'))
  262. .fontColor($r('app.color.FFFFFF'))
  263. .fontWeight(FontWeight.Lighter)
  264. }
  265. .justifyContent(FlexAlign.Center)
  266. .width('100%')
  267. .height('23%')
  268. .borderRadius($r('app.float.virtualSize_16'))
  269. .backgroundImage($r("app.media.little_material_inbound"))
  270. .backgroundImageSize(ImageSize.Cover)
  271. .onClick(()=>{
  272. router.pushUrl({
  273. url: 'pages/LittleMaterialsStorage'
  274. })
  275. })
  276. }.justifyContent(FlexAlign.SpaceAround)
  277. .height('95%')
  278. .width('30%')
  279. .alignItems(HorizontalAlign.Start)
  280. Divider()
  281. .vertical(true)
  282. .strokeWidth(1)
  283. .color($r('app.color.15FFFFFF'))
  284. .height('95%')
  285. Column(){
  286. Text("齐套/出库")
  287. .fontColor($r('app.color.FFFFFF'))
  288. .fontSize($r('app.float.fontSize_38'))
  289. Column() {
  290. Text('工序齐套')
  291. .fontSize($r('app.float.fontSize_38'))
  292. .fontColor($r('app.color.FFFFFF'))
  293. .fontWeight(FontWeight.Medium)
  294. Text('物料绑定料箱和工序')
  295. .fontSize($r('app.float.fontSize_16'))
  296. .fontColor($r('app.color.FFFFFF'))
  297. .fontWeight(FontWeight.Lighter)
  298. }
  299. .justifyContent(FlexAlign.Center)
  300. .width('100%')
  301. .height('70%')
  302. .borderRadius($r('app.float.virtualSize_16'))
  303. .backgroundImage($r("app.media.process_material_kits"))
  304. .backgroundImageSize(ImageSize.Cover)
  305. .onClick(()=>{
  306. router.pushUrl({
  307. url: 'pages/OperationMaterialKit'
  308. })
  309. })
  310. Column() {
  311. Text('零星物料出库')
  312. .fontSize($r('app.float.fontSize_38'))
  313. .fontColor($r('app.color.FFFFFF'))
  314. .fontWeight(FontWeight.Medium)
  315. Text('物料查询并调取')
  316. .fontSize($r('app.float.fontSize_16'))
  317. .fontColor($r('app.color.FFFFFF'))
  318. .fontWeight(FontWeight.Lighter)
  319. }
  320. .justifyContent(FlexAlign.Center)
  321. .width('100%')
  322. .height('23%')
  323. .borderRadius($r('app.float.virtualSize_16'))
  324. .backgroundImage($r("app.media.little_material_outbound"))
  325. .backgroundImageSize(ImageSize.Cover)
  326. .onClick(()=>{
  327. router.pushUrl({
  328. url: 'pages/LittleMaterialOutBound'
  329. })
  330. })
  331. } .alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.SpaceAround).height('95%').width('30%')
  332. Divider()
  333. .vertical(true)
  334. .strokeWidth(1)
  335. .color($r('app.color.15FFFFFF'))
  336. .height('95%')
  337. Column(){
  338. Text(" ")
  339. .fontColor($r('app.color.FFFFFF'))
  340. .fontSize($r('app.float.fontSize_38'))
  341. StorageList({title:"入库单",storageData: this.inBoundOrders }).height('46%')
  342. StorageList({title:"出库单",storageData: this.outBoundOrders }).height('46%');
  343. }.alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.SpaceAround).height('95%').width('30%')
  344. }
  345. .height('88.6%')
  346. .width('100%')
  347. .alignItems(VerticalAlign.Top)
  348. .justifyContent(FlexAlign.SpaceAround)
  349. }
  350. .width('100%')
  351. }
  352. .height('100%')
  353. .backgroundColor($r('app.color.000000'))
  354. }
  355. }