Procházet zdrojové kódy

齐套选择料箱出库

huhao@jgai.com před 3 týdny
rodič
revize
aee9366784
27 změnil soubory, kde provedl 2381 přidání a 168 odebrání
  1. 2 10
      entry/src/main/ets/common/constants/CommonConstants.ets
  2. 151 0
      entry/src/main/ets/common/util/AssistantSetModel.ets
  3. 158 0
      entry/src/main/ets/common/util/UserAuthModel.ets
  4. 4 4
      entry/src/main/ets/common/util/mqtt.ets
  5. 37 0
      entry/src/main/ets/common/util/request/RequestInstance.ets
  6. 3 1
      entry/src/main/ets/common/util/request/WmsRequest.ets
  7. 59 7
      entry/src/main/ets/component/InBoundView.ets
  8. 102 2
      entry/src/main/ets/component/NavigationBar.ets
  9. 118 65
      entry/src/main/ets/component/OrderMaterialsStorageView.ets
  10. 22 21
      entry/src/main/ets/component/RgvControlView.ets
  11. 816 0
      entry/src/main/ets/component/WarehousingStaticsView.ets
  12. 203 0
      entry/src/main/ets/pages/IntelligentWarehousingStatics.ets
  13. 2 3
      entry/src/main/ets/pages/LittleMaterialsStorage.ets
  14. 98 29
      entry/src/main/ets/pages/RgvControl.ets
  15. 6 0
      entry/src/main/ets/params/LogParam.ets
  16. 12 5
      entry/src/main/ets/params/OrderMaterialsStorageParams.ets
  17. 2 0
      entry/src/main/ets/params/RobotsParam.ets
  18. 263 0
      entry/src/main/ets/view/wms/CallMaterialNotification.ets
  19. 12 1
      entry/src/main/ets/view/wms/OrderMaterialStorageFirstStep.ets
  20. 119 17
      entry/src/main/ets/view/wms/OrderMaterialStorageSecondStep.ets
  21. 23 2
      entry/src/main/ets/view/wms/OrderMaterialStorageThirdStep.ets
  22. 79 0
      entry/src/main/ets/view/wms/WarehousingLog.ets
  23. 29 0
      entry/src/main/ets/viewmodel/wms/InBoundOrderInfo.ets
  24. 51 0
      entry/src/main/ets/viewmodel/wms/UserInfo.ets
  25. 4 0
      entry/src/main/resources/base/element/color.json
  26. 4 0
      entry/src/main/resources/base/element/font_size.json
  27. 2 1
      entry/src/main/resources/base/profile/main_pages.json

+ 2 - 10
entry/src/main/ets/common/constants/CommonConstants.ets

@@ -18,6 +18,8 @@ export default class CommonConstants {
   static STATION_CODE: string = 'GW0002'
   static STATION_IP: string = ''
   static stationDictValue: string = ''
+
+  static MATERIAL_BOX_ID: string = ''
   // 是否是退出登陆
   static LOGIN_OUT: boolean = false
   static readonly STORAGE_TYPE: string[] = ['电子元器件', '电路板', '结构件', '辅助材料']
@@ -54,16 +56,6 @@ export default class CommonConstants {
       y: 1,
       lastSelfCheck: '2024/02/16 11:11:34'
     } as RobotInfo,
-    {
-      id: 2,
-      robotCode: 'rgv2',
-      storageId: 1,
-      robotType: 2,
-      robotToward: 2,
-      x: 1,
-      y: 1,
-      lastSelfCheck: '2024/02/16 11:11:34'
-    } as RobotInfo,
   ]
 
   static DICT_DATA: HashMap<string, DictValue[]> = new HashMap<string, DictValue[]>()

+ 151 - 0
entry/src/main/ets/common/util/AssistantSetModel.ets

@@ -0,0 +1,151 @@
+// import relationalStore from '@ohos.data.relationalStore';
+// import CommonConstants from '../../common/constants/CommonConstants';
+// import AssistantSet from '../AssistantSet';
+//
+// class AssistantSetModel {
+//
+//   private rdbStore: relationalStore.RdbStore | undefined=undefined
+//   private tableName: string = 'ASSISTANT_SET'
+//
+//   /**
+//    * 初始化表
+//    */
+//   async initTaskDB(context:Context){
+//     // 1.rdb配置
+//     const config = {
+//       name: CommonConstants.RDB_NAME,
+//       securityLevel: relationalStore.SecurityLevel.S1
+//     }as relationalStore.StoreConfig
+//     try {
+//       // 获取数据库存储对象
+//       this.rdbStore = await relationalStore.getRdbStore(context,config);
+//     } catch (err) {
+//       console.info(`getRdbStore err ${JSON.stringify(err)}`);
+//     }
+//     // 2.初始化SQL语句
+//     const sql = `CREATE TABLE IF NOT EXISTS ASSISTANT_SET (
+//                   ID INTEGER PRIMARY KEY AUTOINCREMENT,
+//                   USER_ID INTEGER NOT NULL,
+//                   VOICE_WAKE_UP INTEGER NOT NULL,
+//                   TIMBRE INTEGER NOT NULL,
+//                   WAKE_FREE INTEGER NOT NULL,
+//                   PROMPT_BROADCAST INTEGER NOT NULL,
+//                   VOICE_VOLUME INTEGER NOT NULL
+//                  )`
+//     // 3.获取rdb
+//     relationalStore.getRdbStore(context, config, (err, rdbStore) => {
+//       if(err){
+//         console.log('testTag', '获取rdbStore失败!')
+//         return
+//       }
+//       // 执行Sql
+//       rdbStore.executeSql(sql).then(()=>{
+//         console.log('testTag', '创建智汇助手表成功!')
+//       }).catch((err: object)=>{
+//         console.log('testTag', '创建失败')
+//       })
+//       // 保存rdbStore
+//       this.rdbStore = rdbStore
+//     })
+//   }
+//
+//   // 根据用户查询对应的智汇助手设置信息
+//   async getByUserId(userId: number): Promise<AssistantSet | undefined> {
+//     if (!userId) {
+//       return
+//     }
+//     // 1.构建查询条件
+//     let predicates = new relationalStore.RdbPredicates(this.tableName)
+//     predicates.equalTo('USER_ID', userId)
+//     predicates.limitAs(1)
+//     // 2.查询
+//     let result = await this.rdbStore?.query(predicates, ['ID', 'USER_ID', 'VOICE_WAKE_UP', 'TIMBRE', 'WAKE_FREE', 'PROMPT_BROADCAST', 'VOICE_VOLUME'])
+//     // 3.2.遍历封装 只取第一条
+//     while(result && !result?.isAtLastRow){
+//       // 3.3.指针移动到下一行
+//       result.goToNextRow()
+//       // 3.4.获取数据
+//       let id = result.getLong(result.getColumnIndex('ID'))
+//       let userId = result.getLong(result.getColumnIndex('USER_ID'))
+//       let voiceWakeUp = result.getLong(result.getColumnIndex('VOICE_WAKE_UP'))
+//       let timbre = result.getLong(result.getColumnIndex('TIMBRE'))
+//       let wakeFree = result.getLong(result.getColumnIndex('WAKE_FREE'))
+//       let promptBroadcast = result.getLong(result.getColumnIndex('PROMPT_BROADCAST'))
+//       let voiceVolume = result.getLong(result.getColumnIndex('VOICE_VOLUME'))
+//       return {id: id, userId: userId, voiceWakeUp: voiceWakeUp, timbre: timbre, wakeFree: wakeFree, promptBroadcast: promptBroadcast, voiceVolume: voiceVolume}
+//     }
+//     return
+//   }
+//
+//   /**
+//    * 查询智汇助手列表
+//    */
+//   async getAssistantSetList(){
+//     // 1.构建查询条件
+//     let predicates = new relationalStore.RdbPredicates(this.tableName)
+//     // 2.查询
+//     let result = await this.rdbStore?.query(predicates, ['ID', 'USER_ID', 'VOICE_WAKE_UP', 'TIMBRE', 'WAKE_FREE', 'PROMPT_BROADCAST', 'VOICE_VOLUME'])
+//     // 3.解析查询结果
+//     // 3.1.定义一个数组,组装最终的查询结果
+//     let AssistantSets: AssistantSet[] = []
+//     // 3.2.遍历封装
+//     while(result && !result?.isAtLastRow){
+//       // 3.3.指针移动到下一行
+//       result.goToNextRow()
+//       // 3.4.获取数据
+//       let id = result.getLong(result.getColumnIndex('ID'))
+//       let userId = result.getLong(result.getColumnIndex('USER_ID'))
+//       let voiceWakeUp = result.getLong(result.getColumnIndex('VOICE_WAKE_UP'))
+//       let timbre = result.getLong(result.getColumnIndex('TIMBRE'))
+//       let wakeFree = result.getLong(result.getColumnIndex('WAKE_FREE'))
+//       let promptBroadcast = result.getLong(result.getColumnIndex('PROMPT_BROADCAST'))
+//       let voiceVolume = result.getLong(result.getColumnIndex('VOICE_VOLUME'))
+//       // 3.5.封装到数组
+//       AssistantSets.push({id, userId, voiceWakeUp, timbre, wakeFree, promptBroadcast, voiceVolume})
+//     }
+//     return AssistantSets
+//   }
+//
+//   /**
+//    * 添加智汇助手
+//    * @param set 智汇助手设置信息
+//    * @returns 智汇助手id
+//    */
+//   addAssistantSet(set: AssistantSet): Promise<number> | undefined{
+//     return this.rdbStore?.insert(this.tableName, {USER_ID: set.userId, VOICE_WAKE_UP: set.voiceWakeUp, TIMBRE: set.timbre,
+//       WAKE_FREE: set.wakeFree, PROMPT_BROADCAST: set.promptBroadcast, VOICE_VOLUME: set.voiceVolume} as relationalStore.ValuesBucket)
+//   }
+//
+//   /**
+//    * 根据id更新智汇助手状态
+//    * @param set 智汇助手设置信息
+//    */
+//   updateAssistantSet(set: AssistantSet) {
+//       if (!set || !set.id) {
+//         return
+//       }
+//     // 1.要更新的数据
+//     let data:relationalStore.ValuesBucket | undefined = {VOICE_WAKE_UP: set.voiceWakeUp as number, TIMBRE: set.timbre as number, WAKE_FREE: set.wakeFree as number, PROMPT_BROADCAST: set.promptBroadcast as number, VOICE_VOLUME: set.voiceVolume as number}
+//     // 2.更新的条件
+//     let predicates = new relationalStore.RdbPredicates(this.tableName)
+//     predicates.equalTo('ID', set.id)
+//     // 3.更新操作
+//     return this.rdbStore?.update(data, predicates)
+//   }
+//
+//   /**
+//    * 根据id删除任务
+//    * @param id 任务id
+//    */
+//   deleteAssistantSetById(id: number){
+//     // 1.删除的条件
+//     let predicates = new relationalStore.RdbPredicates(this.tableName)
+//     predicates.equalTo('ID', id)
+//     // 2.删除操作
+//     return this.rdbStore?.delete(predicates)
+//   }
+// }
+//
+// let assistantSetModel = new AssistantSetModel();
+//
+// export default assistantSetModel as AssistantSetModel;

+ 158 - 0
entry/src/main/ets/common/util/UserAuthModel.ets

@@ -0,0 +1,158 @@
+import relationalStore from '@ohos.data.relationalStore';
+import CommonConstants from '../../common/constants/CommonConstants';
+import {UserAuthInfo } from '../../viewmodel/wms/UserInfo';
+
+class UserModel {
+
+  private rdbStore: relationalStore.RdbStore |undefined=undefined
+  private tableName: string = 'USER'
+
+  /**
+   * 初始化表
+   */
+  async initTaskDB(context:Context){
+    // 1.rdb配置
+    const config = {
+      name: CommonConstants.RDB_NAME,
+      securityLevel: relationalStore.SecurityLevel.S1
+    }as relationalStore.StoreConfig
+    try {
+      // 获取数据库存储对象
+      this.rdbStore = await relationalStore.getRdbStore(context,config);
+    } catch (err) {
+      console.info(`getRdbStore err ${JSON.stringify(err)}`);
+    }
+    // 2.初始化SQL语句
+    const sql = `CREATE TABLE IF NOT EXISTS USER (
+                  ID INTEGER PRIMARY KEY AUTOINCREMENT,
+                  USER_ID INTEGER NOT NULL,
+                  USER_NAME VARCHAR NOT NULL,
+                  PASSWORD VARCHAR NOT NULL,
+                  ORG_ID INTEGER NOT NULL,
+                  STATION_ID INTEGER NOT NULL,
+                  STATION_NAME VARCHAR NULL,
+                  STATION_DICE_VALUE VARCHAR NULL,
+                  AVATAR VARCHAR NULL,
+                  MAINTAIN_LOGIN_STATUS INTEGER NOT NULL,
+                  UPDATE_TIME INTEGER NOT NULL
+                 )`
+    // 3.获取rdb
+    relationalStore.getRdbStore(context, config, (err, rdbStore) => {
+      if(err){
+        console.log('testTag', '获取rdbStore失败!')
+        return
+      }
+      // 执行Sql
+      rdbStore.executeSql(sql).then(()=>{
+        console.log('testTag', '创建用户设置表成功!')
+      }).catch((err: object)=>{
+        console.log('testTag', '创建失败')
+      })
+      // 保存rdbStore
+      this.rdbStore = rdbStore
+    })
+  }
+
+  // 查询最后一次用户登录的数据
+  async getLast(): Promise<UserAuthInfo | undefined> {
+    // 1.构建查询条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.orderByDesc('UPDATE_TIME')
+    predicates.limitAs(1)
+    // 2.查询
+    let result = await this.rdbStore?.query(predicates, ['ID', 'USER_ID', 'USER_NAME', 'PASSWORD', 'ORG_ID', 'STATION_ID', 'STATION_NAME', 'STATION_DICE_VALUE', 'AVATAR', 'MAINTAIN_LOGIN_STATUS', 'UPDATE_TIME'])
+    // 3.2.遍历封装 只取第一条
+    while(!result?.isAtLastRow){
+      // 3.3.指针移动到下一行
+      result?.goToNextRow()
+      // 3.4.获取数据
+      let id = result?.getLong(result?.getColumnIndex('ID'))
+      let userId = result?.getLong(result?.getColumnIndex('USER_ID'))
+      let userName = result?.getString(result?.getColumnIndex('USER_NAME'))
+      let password = result?.getString(result?.getColumnIndex('PASSWORD'))
+      let orgId = result?.getLong(result?.getColumnIndex('ORG_ID'))
+      let stationId = result?.getLong(result?.getColumnIndex('STATION_ID'))
+      let stationName = result?.getString(result?.getColumnIndex('STATION_NAME'))
+      let stationDictValue = result?.getString(result?.getColumnIndex('STATION_DICE_VALUE'))
+      let avatar = result?.getString(result?.getColumnIndex('AVATAR'))
+      let maintainLoginStatus = result?.getLong(result?.getColumnIndex('MAINTAIN_LOGIN_STATUS'))
+      let updateTime = result?.getLong(result?.getColumnIndex('UPDATE_TIME'))
+      return {id: id, userId: userId, userName: userName, password: password, orgId: orgId, stationId: stationId, stationName: stationName, stationDictValue: stationDictValue, avatar: avatar, maintainLoginStatus: maintainLoginStatus, updateTime: updateTime}
+    }
+    return
+  }
+
+  // 查询最后一次用户登录的数据
+  async getByUserId(userId: number): Promise<UserAuthInfo | undefined> {
+    if (!userId) {
+      return
+    }
+    // 1.构建查询条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('USER_ID', userId)
+    predicates.orderByDesc('UPDATE_TIME')
+    predicates.limitAs(1)
+    // 2.查询
+    let result: relationalStore.ResultSet | undefined = await this.rdbStore?.query(predicates, ['ID', 'USER_ID', 'USER_NAME', 'PASSWORD', 'ORG_ID', 'STATION_ID', 'STATION_NAME', 'STATION_DICE_VALUE', 'AVATAR', 'MAINTAIN_LOGIN_STATUS', 'UPDATE_TIME'])
+    // 3.2.遍历封装 只取第一条
+    while(result && !result?.isAtLastRow){
+      // 3.3.指针移动到下一行
+      result.goToNextRow()
+      // 3.4.获取数据
+      let id = result.getLong(result.getColumnIndex('ID'))
+      let userId = result.getLong(result.getColumnIndex('USER_ID'))
+      let userName = result.getString(result.getColumnIndex('USER_NAME'))
+      let password = result.getString(result.getColumnIndex('PASSWORD'))
+      let orgId = result.getLong(result.getColumnIndex('ORG_ID'))
+      let stationId = result.getLong(result.getColumnIndex('STATION_ID'))
+      let stationName = result?.getString(result?.getColumnIndex('STATION_NAME'))
+      let stationDictValue = result?.getString(result?.getColumnIndex('STATION_DICE_VALUE'))
+      let avatar = result.getString(result.getColumnIndex('AVATAR'))
+      let maintainLoginStatus = result.getLong(result.getColumnIndex('MAINTAIN_LOGIN_STATUS'))
+      let updateTime = result.getLong(result.getColumnIndex('UPDATE_TIME'))
+      return {id: id, userId: userId, userName: userName, password: password, orgId: orgId, stationId: stationId, stationName: stationName, stationDictValue: stationDictValue, avatar: avatar, maintainLoginStatus: maintainLoginStatus, updateTime: updateTime}
+    }
+    return
+  }
+
+  /**
+   * 添加用户设置
+   * @param user 用户信息
+   * @returns 用户信息id
+   */
+  addUser(user: UserAuthInfo): Promise<number> | undefined {
+    return this.rdbStore?.insert(this.tableName, {USER_ID: user.userId, USER_NAME: user.userName, PASSWORD: user.password, ORG_ID: user.orgId, STATION_ID: user.stationId, STATION_NAME: user.stationName, STATION_DICE_VALUE: user.stationDictValue, AVATAR: user.avatar, MAINTAIN_LOGIN_STATUS: user.maintainLoginStatus, UPDATE_TIME: user.updateTime} as relationalStore.ValuesBucket)
+  }
+
+  /**
+   * 根据id更新用户设置状态
+   * @param id 任务id
+   * @param finished 任务是否完成
+   */
+  updateUser(user: UserAuthInfo) {
+
+    // 1.要更新的数据
+    let data: relationalStore.ValuesBucket = {USER_ID: user.userId as number, USER_NAME: user.userName as string, PASSWORD: user.password as string, ORG_ID: user.orgId as number, STATION_ID: user.stationId as number, STATION_NAME: user.stationName as string, STATION_DICE_VALUE: user.stationDictValue as string, AVATAR: user.avatar as string, MAINTAIN_LOGIN_STATUS: user.maintainLoginStatus as number, UPDATE_TIME: user.updateTime as number}
+    // 2.更新的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', user.id)
+    // 3.更新操作
+    return this.rdbStore?.update(data, predicates)
+  }
+
+  /**
+   * 根据id删除任务
+   * @param id 任务id
+   */
+  deleteUserById(id: number){
+    // 1.删除的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', id)
+    // 2.删除操作
+    return this.rdbStore?.delete(predicates)
+  }
+}
+
+let userModel = new UserModel();
+
+export default userModel as UserModel;

+ 4 - 4
entry/src/main/ets/common/util/mqtt.ets

@@ -75,10 +75,10 @@ class MqttManager {
       const station2Set = valueJson?.d?.find(item => item.tag === 'Station2Set')?.value;
       const station2Weight = decodeWeight(valueJson?.d?.find(item => item.tag === 'Station2Weight')?.value);
       const rfidString = decodeRfidString(
-        valueJson?.d?.find(item => item.tag === 'RFID3Data1')?.value as number,
-        valueJson?.d?.find(item => item.tag === 'RFID3Data2')?.value as number,
-        valueJson?.d?.find(item => item.tag === 'RFID3Data3')?.value as number,
-        valueJson?.d?.find(item => item.tag === 'RFID3Data4')?.value as number
+        valueJson?.d?.find(item => item.tag === 'RFID2Data1')?.value as number,
+        valueJson?.d?.find(item => item.tag === 'RFID2Data2')?.value as number,
+        valueJson?.d?.find(item => item.tag === 'RFID2Data3')?.value as number,
+        valueJson?.d?.find(item => item.tag === 'RFID2Data4')?.value as number
       );
       console.info("sssssss"+rfidString)
       emitter.emit({

+ 37 - 0
entry/src/main/ets/common/util/request/RequestInstance.ets

@@ -0,0 +1,37 @@
+// import UserInfo from '../../../model/UserInfo'
+// import RequestParamModel from '../../../viewmodel/RequestParamModel'
+// import JGRequest from './Request'
+//
+// const getToken = async (loginName: string, password: string, orgId: number, stationId: number): Promise<string> => {
+//   return await JGRequest.post("/api/auth/aioLogin", {
+//     userName: loginName,
+//     password: password,
+//     orgId: orgId,
+//     stationId: stationId,
+//   }as RequestParamModel)
+// }
+//
+// const getUserInfo = async (): Promise<UserInfo> => {
+//   return await JGRequest.get("/api/auth", {})
+// }
+//
+// export{getToken, getUserInfo}
+import {UserInfo} from '../../../viewmodel/wms/UserInfo'
+import RequestParamModel from '../../../viewmodel/wms/RequestParamModel'
+import WmsRequest from './WmsRequest'
+
+const getToken = async (loginName: string, password: string, orgId: number, stationId: string): Promise<string> => {
+  return await WmsRequest.post("/api/auth/aioLogin", {
+    userName: loginName,
+    password: password,
+    orgId: orgId,
+    stationId: stationId,
+  }as RequestParamModel)
+}
+
+const getUserInfo = async (): Promise<UserInfo> => {
+  return await WmsRequest.get("/api/auth", {})
+}
+
+export{getToken, getUserInfo}
+

+ 3 - 1
entry/src/main/ets/common/util/request/WmsRequest.ets

@@ -6,12 +6,14 @@ import axios, {
   CreateAxiosDefaults,
   InternalAxiosRequestConfig
 } from '@ohos/axios';
+import CommonConstants from '../../constants/CommonConstants';
 import { printError, printRequest, printResponse, handleRes } from './Helps';
 
 
 // jiaxiaoqiang:这里要改
 //const baseUrl = "http://192.168.1.3:11010/" //chuangke
 const baseUrl = "http://192.168.1.174:8079"//huajing
+//const baseUrl = "http://192.168.1.3:8079"//huajing
 // const baseUrl = "http://192.168.1.4:8079/" //chuangke
 const DEBUG = true //
 
@@ -31,7 +33,7 @@ const WmsRequest = axios.create(
 WmsRequest.interceptors.request.use((config: InternalAxiosRequestConfig) => {
 
   // 以后登录之后可以在这里传
-  // config.headers.Authorization = CommonConstants.AUTH_TOKEN
+   config.headers.Authorization = CommonConstants.AUTH_TOKEN
   // config.headers.Authorization ="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOnsiaWQiOjM3LCJsb2dpblR5cGUiOiJhaW8ifSwiZGV2aWNlIjoiYWlvIiwiZWZmIjoxNzE3NTExMjYwODI4LCJyblN0ciI6InRSenNBTGdlZ3lqS0FHeDZTSkdYZTNLbFY3eWh1OG1PIn0.FVAeESiz_PH1NtBFDmGZr0IwtXzubV2d8JTQdGdJnxc"
   printRequest(config)
   return config;

+ 59 - 7
entry/src/main/ets/component/InBoundView.ets

@@ -7,6 +7,9 @@ import CommonConstants from '../common/constants/CommonConstants'
 import {MaterialListInformation,MaterialBoxInfo,outBoxClass} from '../params/MaterialInformationParam'
 import WorkOrderInfo from '../viewmodel/wms/WorkOrderInfo'
 import WmsRequest from '../common/util/request/WmsRequest'
+import {detailsListClass} from '../viewmodel/wms/InBoundOrderInfo'
+import {CommonConfirmDialog}from "../component/OrderMaterialsStorageView"
+import {ConfirmDialogParams} from "../params/OrderMaterialsStorageParams"
 @Component
 export struct InBoundView {
   @Prop messages: string[] = []
@@ -15,14 +18,39 @@ export struct InBoundView {
   @State putOutButtonClick :number = 1
   @State putInButtonClick :number = 1
   @State InboundButtonClick :number = 1
+  @State private boxMaterials: Array<detailsListClass> = []
   //料箱重量
   @State materialBoxWeight: number = 0
 
+  commonDialogController: CustomDialogController | null = null;
+  private showConfirmDialog(params: ConfirmDialogParams) {
+    if (this.commonDialogController) {
+      this.commonDialogController.close()
+    }
+
+    this.commonDialogController = new CustomDialogController({
+      builder: CommonConfirmDialog({
+        title: params.title || '提示',
+        message: params.message,
+        confirmText: params.confirmText || '确定',
+        cancelText: params.cancelText || '取消',
+        onConfirm: params.onConfirm
+      }),
+      cancel: () => console.log('用户取消操作'),
+      customStyle: true,
+      maskColor: 'rgba(0,0,0,0.6)'
+    });
+
+    this.commonDialogController.open();
+  }
+
   Warehousing = async () => {
+    console.info("sssss"+this.materialBoxID)
     let res: MaterialBoxInfo[] = await WmsRequest.post("/api/v1/wmsOrder/inBox", {
       houseNo:'1',
       stanCode:CommonConstants.STATION_CODE,
-      vehicleNo:this.materialBoxID
+      vehicleCode:this.materialBoxID,
+      detailsList:this.boxMaterials
     } as RequestParamModel)
     console.log('testTag', 'aaaaaaaa1' + JSON.stringify(res));
 
@@ -38,11 +66,9 @@ export struct InBoundView {
     emitter.on({
       eventId: EventId.MQTT_MESSAGE
       }, (eventData: emitter.EventData) => {
-      this.materialBoxID = eventData?.data?.['rfid1']
-      console.info("ssssa+"+this.materialBoxID)
+      //this.materialBoxID = eventData?.data?.['rfid']
       this.drawerPositionStatus = Number(eventData?.data?.['station2Set'])
       this.materialBoxWeight = Number(eventData?.data?.['station2Weight'])
-      console.info(`ssssss${this.materialBoxID}`)
     })
   }
   //抽屉推出
@@ -72,7 +98,15 @@ export struct InBoundView {
   }
   aboutToAppear(): void {
     this.refreshTag()
+    this.materialBoxID = CommonConstants.MATERIAL_BOX_ID
+    console.info("sssss"+this.materialBoxID)
   }
+
+  aboutToDisappear(): void
+  {
+    emitter.off(EventId.MQTT_MESSAGE)
+  }
+
   build() {
     Column() {
       Text('出入库料口操作')
@@ -171,8 +205,14 @@ export struct InBoundView {
           this.putOutButtonClick = 0.9; // 点击时缩小
           setTimeout(() => {
             this.putOutButtonClick = 1; // 0.2秒后恢复
+            this.showConfirmDialog({
+              title: '抽屉伸出',
+              message: `确定要抽屉伸出吗?`,
+              onConfirm: ()=> {
+                this.pushOut();
+              }
+            });
           }, 200);
-          this.pushOut()
         })
 
         Button({ type: ButtonType.Normal }) {
@@ -193,8 +233,14 @@ export struct InBoundView {
           this.putInButtonClick = 0.9; // 点击时缩小
           setTimeout(() => {
             this.putInButtonClick = 1; // 0.2秒后恢复
+            this.showConfirmDialog({
+              title: '抽屉缩回',
+              message: `确定要抽屉缩回吗?`,
+              onConfirm: () => {
+                this.pushIn();
+              }
+            })
           }, 200);
-          this.pushIn()
         })
       }
       .width('95%')
@@ -222,9 +268,15 @@ export struct InBoundView {
         this.InboundButtonClick = 0.9; // 点击时缩小
         setTimeout(() => {
           this.InboundButtonClick = 1; // 0.2秒后恢复
+          this.showConfirmDialog({
+            title: '入库确认',
+            message: `确定要${this.materialBoxID}料箱入库吗?`,
+            onConfirm: () => {
+              this.Warehousing();
+            }
+          })
         }, 200);
         // 按钮点击事件处理\
-        this.Warehousing();
       })
     }
     .width('100%')

+ 102 - 2
entry/src/main/ets/component/NavigationBar.ets

@@ -1,7 +1,97 @@
 import router from '@ohos.router';
+import WorkOrderInfo from '../viewmodel/wms/WorkOrderInfo'
+import {MaterialNotificationDialog,MaterialRequestDialog} from '../view/wms/CallMaterialNotification'
+import {WarehousingLogDialog} from '../view/wms/WarehousingLog'
 @Component
 export struct NavigationBar {
-  @Prop notificationNumber: number = 0;
+  @Prop notificationNumber: number = 2;
+  @State selectWorkOrder:WorkOrderInfo = {}
+  @State rgvInfoInterval : number = 0
+  @State workOrders: WorkOrderInfo[] = [
+    {
+      orderName: "生产订单",
+      orderCode: "PO-20240501-001",
+      workOrderCode: "WC-001",
+      planStartWhen: "工序A",
+      inventoryNum: "50",
+      planNum: "100",
+      workOrderState:"完成"
+    },
+    {
+      orderName: "维修订单",
+      orderCode: "MO-20240501-002",
+      workOrderCode: "WC-002",
+      planStartWhen: "工序B",
+      inventoryNum: "30",
+      planNum: "60",
+      workOrderState:"完成"
+    },
+    {
+      orderName: "测试订单",
+      orderCode: "TO-20240501-003",
+      workOrderCode: "WC-003",
+      planStartWhen: "工序C",
+      inventoryNum: "80",
+      planNum: "120",
+      workOrderState:"完成"
+    },
+    {
+      orderName: "紧急订单",
+      orderCode: "EO-20240501-004",
+      workOrderCode: "WC-004",
+      planStartWhen: "工序D",
+      inventoryNum: "10",
+      planNum: "20",
+      workOrderState:"完成"
+    }
+  ];
+
+  getCompletedCount(): number {
+    return this.workOrders.filter(item =>
+    item.workOrderState === "完成" ).length;
+  }
+
+  aboutToAppear(): void {
+    this.rgvInfoInterval = setInterval(() => {
+      this.notificationNumber = this.getCompletedCount();
+    }, 1000);
+  }
+
+  aboutToDisappear(): void {
+    clearInterval(this.rgvInfoInterval);
+  }
+
+  MaterialRequestController: CustomDialogController = new CustomDialogController({
+    builder: MaterialRequestDialog(),
+    autoCancel: true, // 点击遮罩关闭
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.8)',  // 黑色遮罩
+  })
+
+  WarehousingLogController: CustomDialogController = new CustomDialogController({
+    builder: WarehousingLogDialog(),
+    autoCancel: true, // 点击遮罩关闭
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.8)',  // 黑色遮罩
+  })
+
+
+  searchRequestMaterial= () => {
+    this.MaterialRequestController.open()
+  }
+  NotificationDialogController: CustomDialogController = new CustomDialogController({
+    builder: MaterialNotificationDialog({
+      selectWorkOrder:this.selectWorkOrder,
+      searchRequestMaterial:()=>{ this.searchRequestMaterial()},
+      workOrders:this.workOrders
+    }),
+    autoCancel: true, // 点击遮罩关闭
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.8)',  // 黑色遮罩
+  })
+
+
+
   build() {
     Row() {
       // 带数字标记的通知图标
@@ -9,6 +99,11 @@ export struct NavigationBar {
         .width($r('app.float.virtualSize_23'))
         .height($r('app.float.virtualSize_23'))
         .fillColor($r('app.color.FFFFFF'))
+        .onClick(()=>{
+          router.pushUrl({
+            url: 'pages/IntelligentWarehousingStatics'
+          })
+        })
       Badge({
         count: this.notificationNumber, // 动态传入的通知数量
         position: BadgePosition.RightTop, // 右上角显示
@@ -21,11 +116,16 @@ export struct NavigationBar {
           .width($r('app.float.virtualSize_23'))
           .height($r('app.float.virtualSize_23'))
           .fillColor($r('app.color.FFFFFF'))
-      }
+      }.onClick(()=>{
+        this.NotificationDialogController.open()
+      })
       Image($r('app.media.navigation_logs'))
         .width($r('app.float.virtualSize_23'))
         .height($r('app.float.virtualSize_23'))
         .fillColor($r('app.color.FFFFFF'))
+        .onClick(()=>{
+          this.WarehousingLogController.open()
+        })
       Image($r('app.media.navigation_rgv_control'))
         .width($r('app.float.virtualSize_23'))
         .height($r('app.float.virtualSize_23'))

+ 118 - 65
entry/src/main/ets/component/OrderMaterialsStorageView.ets

@@ -1,6 +1,6 @@
 import {DemandMaterial,OrderParams,MaterialItem,MaterialBox,EmptyBox} from "../params/OrderMaterialsStorageParams"
 import WorkOrderInfo from '../viewmodel/wms/WorkOrderInfo'
-import {MaterialListInformation,MaterialBoxInfo} from '../params/MaterialInformationParam'
+import {MaterialBoxInfo} from '../params/MaterialInformationParam'
 @Component
 export struct ProcessFlow {
   @Prop currentStep:number =0
@@ -119,20 +119,23 @@ export struct OrderListComponent {
                 Text(`工单编号: ${item.workOrderCode}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
+                  .fontWeight(FontWeight.Lighter)
 
                 Text(`下发时间: ${item.planStartWhen}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
+                  .fontWeight(FontWeight.Lighter)
 
                 Row() {
                   Text('入库比例:')
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
-
+                    .fontWeight(FontWeight.Lighter)
                   Text(`${(Number(item.inventoryNum) / Number(item.planNum) * 100).toFixed(0)}%`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
                     .margin({ left: 4 })
+                    .fontWeight(FontWeight.Lighter)
                 }
                 .width('100%')
                 .justifyContent(FlexAlign.Start)
@@ -158,67 +161,6 @@ export struct OrderListComponent {
 }
 
 @Component
-export struct MaterialGrid {
-  @Prop materials: MaterialItem[] = [];
-
-  build() {
-    Grid() {
-      ForEach(this.materials, (item:MaterialItem) => {
-        GridItem() {
-          Column() {
-            // 物料名称
-            Text(item.name)
-              .fontSize(16)
-              .fontWeight(FontWeight.Bold)
-              .margin({ bottom: 8 })
-              .width('100%')
-              .textAlign(TextAlign.Start)
-
-            // 产品型号
-            Text(item.model)
-              .fontSize(14)
-              .fontColor('#666666')
-              .margin({ bottom: 12 })
-              .width('100%')
-              .textAlign(TextAlign.Start)
-
-            // 数量进度
-            Row() {
-              Text(`已入库: ${item.completed}`)
-                .fontSize(14)
-
-              Text('/')
-                .margin({ left: 4, right: 4 })
-
-              Text(`计划: ${item.planned}`)
-                .fontSize(14)
-                .fontColor('#1890FF')
-            }
-            .width('100%')
-            .justifyContent(FlexAlign.SpaceBetween)
-          }
-          .padding(12)
-          .backgroundColor('#FFFFFF')
-          .borderRadius(4)
-          .border({
-            width: 1,
-            color: '#F0F0F0'
-          })
-        }
-      })
-    }
-    .columnsTemplate('1fr 1fr 1fr')
-    .columnsGap(10)  // 移除网格内部列间距
-    .rowsGap(0)     // 移除网格内部行间距
-
-    .width('100%')  // 确保填满父容器
-    .height('100%')
-    .padding(10)
-    .backgroundColor('#F5F5F5')     // 背景色与图片一致
-  }
-}
-
-@Component
 export struct SingleOrder {
 
   @Prop selectWorkOrder: WorkOrderInfo = {}
@@ -236,20 +178,25 @@ export struct SingleOrder {
         Text(`工单编号: ${this.selectWorkOrder.workOrderCode}`)
           .fontColor($r('app.color.FFFFFF'))
           .fontSize($r('app.float.fontSize_8'))
+          .fontWeight(FontWeight.Lighter)
+
 
         Text(`下发时间: ${this.selectWorkOrder.planStartWhen}`)
           .fontColor($r('app.color.FFFFFF'))
           .fontSize($r('app.float.fontSize_8'))
+          .fontWeight(FontWeight.Lighter)
 
         Row() {
           Text('入库比例:')
             .fontColor($r('app.color.FFFFFF'))
             .fontSize($r('app.float.fontSize_8'))
+            .fontWeight(FontWeight.Lighter)
 
           Text(`${(Number(this.selectWorkOrder.inventoryNum) / Number(this.selectWorkOrder.planNum) * 100).toFixed(0)}%`)
             .fontColor($r('app.color.FFFFFF'))
             .fontSize($r('app.float.fontSize_8'))
             .margin({ left: 4 })
+            .fontWeight(FontWeight.Lighter)
         }
         .width('100%')
         .justifyContent(FlexAlign.Start)
@@ -292,8 +239,8 @@ export struct BoxGrid {
     this.selectedMaterialIndex = -1
   }
 
-  @Prop materialBoxes: MaterialBoxInfo[] = [];
-  @Prop emptyBoxes: MaterialBoxInfo[] = [];
+  @Link materialBoxes: MaterialBoxInfo[] ;
+  @Link emptyBoxes: MaterialBoxInfo[]
   build() {
     Column() {
       if(this.isQueryMaterial){
@@ -313,23 +260,28 @@ export struct BoxGrid {
                   Text(`料箱编号: ${box.id}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text(`料箱类型: ${box.boxType}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text(`所属订单: ${box.order}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text(`数量: ${box.boxNumber}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text(`位置: ${box.position}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
                     .textAlign(TextAlign.Start)
+                    .fontWeight(FontWeight.Lighter)
                 }
                 .width('100%')
                 .margin({left:'2%'})
@@ -383,17 +335,20 @@ export struct BoxGrid {
                 Text(`料箱编号: ${box.vehicleCode}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
+                  .fontWeight(FontWeight.Lighter)
                   .textAlign(TextAlign.Start)
                   .margin({ top: '40%',left:'2%' })
                 Text(`层数: ${box.position}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
+                  .fontWeight(FontWeight.Lighter)
                   .textAlign(TextAlign.Start)
                   .margin({ left:'2%' })
                 Text(`坐标: ${box.coordinate}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
                   .textAlign(TextAlign.Start)
+                  .fontWeight(FontWeight.Lighter)
                   .margin({ left:'2%' })
               }.width('40%').alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.Start)
               Row(){
@@ -464,24 +419,29 @@ export struct MaterialBoxGrid {
               Column({ space: 3 }) {
                 Text(`料箱编号: ${box.id}`)
                   .fontColor($r('app.color.FFFFFF'))
+                  .fontWeight(FontWeight.Lighter)
                   .fontSize($r('app.float.fontSize_8'))
                   .textAlign(TextAlign.Start)
                 Text(`料箱类型: ${box.boxType}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
+                  .fontWeight(FontWeight.Lighter)
                   .textAlign(TextAlign.Start)
                 Text(`所属订单: ${box.order}`)
                   .fontColor($r('app.color.FFFFFF'))
+                  .fontWeight(FontWeight.Lighter)
                   .fontSize($r('app.float.fontSize_8'))
                   .textAlign(TextAlign.Start)
                 Text(`数量: ${box.boxNumber}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
+                  .fontWeight(FontWeight.Lighter)
                   .textAlign(TextAlign.Start)
                 Text(`位置: ${box.position}`)
                   .fontColor($r('app.color.FFFFFF'))
                   .fontSize($r('app.float.fontSize_8'))
                   .textAlign(TextAlign.Start)
+                  .fontWeight(FontWeight.Lighter)
               }
               .width('100%')
               .margin({left:'2%'})
@@ -544,12 +504,14 @@ export struct MaterialList {
                     .fontSize($r('app.float.fontSize_8'))
                     .fontColor($r('app.color.FFFFFF'))
                     .width('90%')
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text('入库/计划数量')
                     .fontSize($r('app.float.fontSize_7'))
                     .fontColor($r('app.color.60FFFFFF'))
                     .width('10%')
                     .textAlign(TextAlign.End)
+                    .fontWeight(FontWeight.Lighter)
                 }.margin({bottom:'1%'})
               }.width('100%').alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.SpaceEvenly).height('12%')
           }
@@ -597,21 +559,25 @@ export struct MaterialListComponent {
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
                     .width('100%')
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text(`序列号: ${item.date}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
                     .width('100%')
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text(`所属订单: ${item.date}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
                     .width('100%')
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                   Text(`数量: ${item.date}`)
                     .fontColor($r('app.color.FFFFFF'))
                     .fontSize($r('app.float.fontSize_8'))
                     .width('100%')
+                    .fontWeight(FontWeight.Lighter)
                     .textAlign(TextAlign.Start)
                 }
                 .margin({ top: 4 })
@@ -677,4 +643,91 @@ export struct MaterialButton {
       })
     }
   }
+}
+
+@CustomDialog
+export struct RemindDialog {
+  controller: CustomDialogController
+  @Link remind: string
+  build() {
+    Column() {
+      Text(this.remind)
+        .fontColor($r('app.color.FFFFFF'))
+        .fontSize($r('app.float.fontSize_12'))
+    }
+    .backgroundColor($r('app.color.2A2A2A'))
+    .borderRadius($r('app.float.virtualSize_11_6'))
+    .justifyContent(FlexAlign.Center)
+    .width(300)
+    .height(50)
+  }
+}
+
+
+@CustomDialog
+export struct CommonConfirmDialog {
+  @State title: string = '提示'
+  @State message: string = '确定要执行此操作吗?'
+  @State confirmText: string = '确定'
+  @State cancelText: string = '取消'
+
+  controller: CustomDialogController
+  onConfirm: () => void = () => {}
+
+  build() {
+    Column() {
+      // 标题
+      Column(){
+        Text(this.title)
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_15_2'))
+      }.height('30%')
+      .justifyContent(FlexAlign.Center)
+      Column(){
+        Text(this.message)
+          .fontColor($r('app.color.30FFFFFF'))
+          .fontSize($r('app.float.fontSize_12'))
+      }.height('30%')
+      .justifyContent(FlexAlign.Center)
+
+      Column(){
+        Divider()
+          .vertical(false)
+          .strokeWidth(1)
+          .color($r('app.color.20FFFFFF'))
+        Row(){
+          Row(){
+            Text('取消')
+              .fontColor($r('app.color.60FFFFFF'))
+              .fontSize($r('app.float.fontSize_12'))
+          }
+          .justifyContent(FlexAlign.Center)
+          .width('50%')
+          .onClick(() => this.controller.close())
+          Divider()
+            .vertical(true)
+            .strokeWidth(1)
+            .color($r('app.color.20FFFFFF'))
+          Row(){
+            Text('确认')
+              .fontColor($r('app.color.007AFF'))
+              .fontSize($r('app.float.fontSize_12'))
+          }
+          .justifyContent(FlexAlign.Center)
+          .width('50%')
+          .onClick(() => {
+            this.onConfirm();
+            this.controller.close();
+          })
+        }
+      }
+      .width('100%')
+      .height('30%')
+    }
+    .height(200)
+    .width(400)
+    .backgroundColor($r('app.color.2A2A2A'))
+    .justifyContent(FlexAlign.End)
+    .borderRadius(16)
+  }
 }

+ 22 - 21
entry/src/main/ets/component/RgvControlView.ets

@@ -236,25 +236,6 @@ export struct CommonConfirmDialog {
       }
       .width('100%')
       .height('30%')
-      // // 按钮区域
-      // Flex({ justifyContent: FlexAlign.SpaceAround }) {
-      //   Button(this.cancelText, { type: ButtonType.Normal })
-      //     .width('45%')
-      //     .backgroundColor('#0A84FF')
-      //     .fontColor($r('app.color.FFFFFF'))
-      //     .onClick(() => this.controller.close())
-      //
-      //   Button(this.confirmText, { type: ButtonType.Normal })
-      //     .width('45%')
-      //     .backgroundColor($r('app.color.0A84FF'))
-      //     .fontColor($r('app.color.FFFFFF'))
-      //     .onClick(() => {
-      //       this.onConfirm();
-      //       this.controller.close();
-      //     })
-      // }
-      // .width('100%')
-      // .margin({ bottom: 20 })
     }
     .height(200)
     .width(400)
@@ -269,19 +250,21 @@ export struct CommonConfirmDialog {
 export struct MoveDialog {
   @Link rgvEndX: number
   @Link rgvEndY: number
+  @Prop title : string = ''
+  @Prop info : string = ''
   controller: CustomDialogController
   onConfirm: () => void = () => {}
 
   build() {
     Column() {
       Column(){
-        Text('终点移动')
+        Text(this.title)
           .fontColor($r('app.color.FFFFFF'))
           .fontSize($r('app.float.fontSize_15_2'))
       }.height('30%')
       .justifyContent(FlexAlign.Center)
 
-      Text('设置终点坐标')
+      Text(this.info)
         .fontColor($r('app.color.FFFFFF'))
         .fontSize($r('app.float.fontSize_8'))
         .width('70%')
@@ -403,3 +386,21 @@ export struct MoveDialog {
     .borderRadius($r('app.float.virtualSize_11_6'))
   }
 }
+
+@CustomDialog
+export struct RemindDialog {
+  controller: CustomDialogController
+  @Link remind: string
+  build() {
+    Column() {
+      Text(this.remind)
+        .fontColor($r('app.color.FFFFFF'))
+        .fontSize($r('app.float.fontSize_12'))
+    }
+    .backgroundColor($r('app.color.2A2A2A'))
+    .borderRadius($r('app.float.virtualSize_11_6'))
+    .justifyContent(FlexAlign.Center)
+    .width(300)
+    .height(50)
+  }
+}

+ 816 - 0
entry/src/main/ets/component/WarehousingStaticsView.ets

@@ -0,0 +1,816 @@
+import WorkOrderInfo from '../viewmodel/wms/WorkOrderInfo'
+import {DemandMaterial,MaterialBox,EmptyBox} from "../params/OrderMaterialsStorageParams"
+@Component
+export struct StaticOrderList {
+  private scrollerForList: Scroller = new Scroller()
+  @Prop workOrders: WorkOrderInfo[] = []
+  @State selectedIndex: number = -1
+  @State scaleValue : number = 1
+  build() {
+    Column() { // 订单列表
+      List({ space: 8,scroller:this.scrollerForList }) {
+        ForEach(this.workOrders, (item: WorkOrderInfo, index) => {
+          ListItem() {
+            StaticOrderItem({
+              item: item,
+              index:index,
+              workOrders:this.workOrders
+            })
+          }
+        })
+      }
+      .width('100%')
+      .flexGrow(1)
+    }
+    .width('100%')
+    .height('100%')
+  }
+}
+
+@Component
+struct StaticOrderItem{
+  @Prop item: WorkOrderInfo
+  @Prop index: number
+  @Prop workOrders:WorkOrderInfo[]
+  @State scaleValue : number = 1
+  @State selectedOrder : WorkOrderInfo = {}
+  private onSelect(index: number): void {
+    this.selectedOrder = this.workOrders[index]
+  }
+  OrderMaterialController: CustomDialogController = new CustomDialogController({
+    builder: OrderMaterialDialog({
+      selectedOrder:this.selectedOrder
+    }),
+    autoCancel: true, // 点击遮罩关闭
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.8)',  // 黑色遮罩
+  })
+  build() {
+    Column() {
+      // 订单标题(带订单号)
+      Text(`${this.item.orderName}${this.item.orderCode}`)
+        .fontSize($r('app.float.fontSize_12'))
+        .fontColor($r('app.color.FFFFFF'))
+        .width('100%')
+        .textAlign(TextAlign.Start)
+
+      // 订单详情
+      Column({ space: 3 }) {
+        Text(`工单编号: ${this.item.workOrderCode}`)
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_8'))
+          .fontWeight(FontWeight.Lighter)
+
+        Text(`下发时间: ${this.item.planStartWhen}`)
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_8'))
+          .fontWeight(FontWeight.Lighter)
+
+        Row() {
+          Text('齐套比例:')
+            .fontColor($r('app.color.FFFFFF'))
+            .fontSize($r('app.float.fontSize_8'))
+            .fontWeight(FontWeight.Lighter)
+
+          Text(`${this.item.inventoryNum}`)
+            .fontColor($r('app.color.FFFFFF'))
+            .fontSize($r('app.float.fontSize_8'))
+            .margin({ left: 4 })
+            .fontWeight(FontWeight.Lighter)
+        }
+        .width('100%')
+        .justifyContent(FlexAlign.Start)
+      }
+      .margin({ top: 6 })
+      .alignItems(HorizontalAlign.Start)
+    }.backgroundColor(this.scaleValue===0.9 ? $r('app.color.2030D158') : $r('app.color.20FFFFFF'))
+    .borderRadius($r('app.float.virtualSize_9_6'))
+    .padding(13)
+    //.border({width:2,color:$r('app.color.20FFFFFF')})
+    .scale({ x: this.scaleValue, y: this.scaleValue })
+    .animation({
+      duration: 200,
+      curve: Curve.Linear  // 弹性曲线更生动
+    })
+    .onClick(() => {
+      this.scaleValue = 0.9;  // 点击时缩小
+      setTimeout(() => {
+        this.scaleValue = 1; // 0.2秒后恢复
+        this.onSelect(this.index)
+        this.OrderMaterialController.open()
+      }, 200);
+    })
+
+  }
+}
+
+@CustomDialog
+struct OrderMaterialDialog {
+  private scrollerForList: Scroller = new Scroller()
+  @Prop workOrders:WorkOrderInfo[] = []
+  @Prop inBoundRation:number = 10
+  @Prop outBoundRation:number = 79
+  @Link selectedOrder: WorkOrderInfo
+  @State materialData: DemandMaterial[] = [
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+  ];
+
+  controller: CustomDialogController
+  searchRequestMaterial: () => void = () => {}
+
+  build() {
+    Column() {
+      Column(){
+        Text('订单物流状况详情')
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_15_2'))
+      }.height('8%')
+      .justifyContent(FlexAlign.Center)
+
+      Column() {
+        // 订单标题(带订单号)
+        Text(`${this.selectedOrder.orderName}${this.selectedOrder.orderCode}`)
+          .fontSize($r('app.float.fontSize_12'))
+          .fontColor($r('app.color.FFFFFF'))
+          .width('100%')
+          .textAlign(TextAlign.Start)
+
+
+        Row(){
+          Column({ space: 3 }) {
+            Text(`工单编号: ${this.selectedOrder.workOrderCode}`)
+              .fontColor($r('app.color.FFFFFF'))
+              .fontSize($r('app.float.fontSize_8'))
+            Text(`下发时间: ${this.selectedOrder.planStartWhen}`)
+              .fontColor($r('app.color.FFFFFF'))
+              .fontSize($r('app.float.fontSize_8'))
+            Text(`预计完成时间: ${this.selectedOrder.planStartWhen}`)
+              .fontColor($r('app.color.FFFFFF'))
+              .fontSize($r('app.float.fontSize_8'))
+            Text(`生产数量: ${this.selectedOrder.inventoryNum}`)
+              .fontColor($r('app.color.FFFFFF'))
+              .fontSize($r('app.float.fontSize_8'))
+          }
+          .margin({ top: 6 })
+          .alignItems(HorizontalAlign.Start)
+          .width('80%')
+          Column({ space: 3 }){
+            Row(){
+              Text('物料入库比例')
+                .width('80%')
+                .fontColor($r('app.color.60FFFFFF'))
+                .fontSize($r('app.float.fontSize_7'))
+              Text(`${this.inBoundRation}%`)
+                .width('20%')
+                .fontColor($r('app.color.FFFFFF'))
+                .fontSize($r('app.float.fontSize_8'))
+                .textAlign(TextAlign.End)
+            }
+            Row() {
+              Row()
+                .width(`${this.inBoundRation}%`)
+                .height('100%')
+                .borderRadius($r('app.float.virtualSize_9_6'))
+                .linearGradient({
+                  angle: 90,
+                  colors: [[$r('app.color.1050FF'), 0.0], [$r('app.color.73C3FF'), 1]]
+                })
+            }.height('10%').width('100%').backgroundColor($r('app.color.10FFFFFF'))
+            .borderRadius($r('app.float.virtualSize_9_6'))
+            Row(){
+              Text('物料出库比例')
+                .width('80%')
+                .fontColor($r('app.color.60FFFFFF'))
+                .fontSize($r('app.float.fontSize_7'))
+              Text(`${this.outBoundRation}%`)
+                .width('20%')
+                .fontColor($r('app.color.FFFFFF'))
+                .fontSize($r('app.float.fontSize_8'))
+                .textAlign(TextAlign.End)
+            }.margin({ top: '2%' })
+            Row() {
+              Row()
+                .width(`${this.outBoundRation}%`)
+                .height('100%')
+                .borderRadius($r('app.float.virtualSize_9_6'))
+                .linearGradient({
+                  angle: 90,
+                  colors: [[$r('app.color.1050FF'), 0.0], [$r('app.color.73C3FF'), 1]]
+                })
+            }
+            .height('10%')
+            .width('100%')
+            .backgroundColor($r('app.color.10FFFFFF'))
+            .borderRadius($r('app.float.virtualSize_9_6'))
+          }
+          .width('20%')
+          .alignItems(HorizontalAlign.Start)
+        }.width('100%')
+      }.backgroundColor( $r('app.color.20FFFFFF'))
+      .borderRadius($r('app.float.virtualSize_9_6'))
+      .padding({left:30,right:10,top:10,bottom:5})
+      .height('14%')
+      .width('95%')
+     Column(){
+       List({scroller:this.scrollerForList}) {
+         ForEach(this.materialData, (item:DemandMaterial) => {
+           ListItem() {
+             Column() {
+               Column(){
+                 Text(item.materialName)
+                   .fontSize($r('app.float.fontSize_8'))
+                   .fontColor($r('app.color.FFFFFF'))
+                   .width('100%')
+                   .textAlign(TextAlign.Start)
+                 Text(`型号: ${item.materialType}`)
+                   .fontSize($r('app.float.fontSize_8'))
+                   .fontColor($r('app.color.60FFFFFF'))
+                   .width('100%')
+                   .fontWeight(FontWeight.Lighter)
+                   .textAlign(TextAlign.Start)
+               }
+               Row(){
+                 Text(`入库数量:${item.planNum}`)
+                   .fontSize($r('app.float.fontSize_8'))
+                   .fontColor($r('app.color.FFFFFF'))
+                   .width('20%')
+                   .fontWeight(FontWeight.Lighter)
+                   .textAlign(TextAlign.Start)
+                 Text(`出库数量:${item.planNum}`)
+                   .fontSize($r('app.float.fontSize_8'))
+                   .fontColor($r('app.color.FFFFFF'))
+                   .fontWeight(FontWeight.Lighter)
+                   .width('20%')
+                   .textAlign(TextAlign.Start)
+                 Text(`缺料数量:${item.planNum}`)
+                   .fontSize($r('app.float.fontSize_8'))
+                   .fontColor($r('app.color.FFFFFF'))
+                   .fontWeight(FontWeight.Lighter)
+                   .width('20%')
+                   .textAlign(TextAlign.Start)
+                 Text(`需求数量:${item.planNum}`)
+                   .fontSize($r('app.float.fontSize_8'))
+                   .fontColor($r('app.color.FFFFFF'))
+                   .width('20%')
+                   .fontWeight(FontWeight.Lighter)
+                   .textAlign(TextAlign.Start)
+               }.justifyContent(FlexAlign.Start).width('100%').margin({top:'1%'})
+             }.width('100%').justifyContent(FlexAlign.SpaceEvenly).padding(10)
+           }
+         })
+       }
+       .width('100%')
+       .height('100%')
+       .divider({
+         strokeWidth: 1,
+         color: $r('app.color.20FFFFFF')
+       })
+     }.height('57%').width('95%').margin({top:'2%',bottom:'2%'})
+
+      Divider()
+        .vertical(false)
+        .strokeWidth(1)
+        .color($r('app.color.20FFFFFF'))
+      Column(){
+        Text('关闭')
+          .fontColor($r('app.color.60FFFFFF'))
+          .fontSize($r('app.float.fontSize_12'))
+      }
+      .height('8%')
+      .justifyContent(FlexAlign.Center)
+      .width('100%')
+      .onClick(
+        () => this.controller.close()
+      )
+    }
+    .height('90%')
+    .width('80%')
+    .backgroundColor($r('app.color.2A2A2A'))
+    .justifyContent(FlexAlign.End)
+    .borderColor($r('app.color.000000'))
+    .borderWidth(1)
+    .borderRadius($r('app.float.virtualSize_11_6'))
+  }
+}
+
+
+
+
+@Component
+export struct StaticMaterialList {
+  private scrollerForList: Scroller = new Scroller()
+  @Prop boundMaterial: DemandMaterial[] = [
+    {materialName: 'PCBA电路板SADD12312', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+  ]
+  @State scaleValue : number = 1
+  build() {
+    Column() { // 订单列表
+      List({ space: 8,scroller:this.scrollerForList }) {
+        ForEach(this.boundMaterial, (item: DemandMaterial, index) => {
+          ListItem() {
+            StaticMaterialItem({
+              item: item,
+              index:index,
+              boundMaterial:this.boundMaterial
+            })
+          }
+        })
+      }
+      .width('100%')
+      .flexGrow(1)
+    }
+    .width('100%')
+    .height('100%')
+  }
+}
+
+@Component
+struct StaticMaterialItem{
+  @Prop item: DemandMaterial
+  @Prop index: number
+  @Prop boundMaterial:DemandMaterial[]
+  @State scaleValue : number = 1
+  @State selectedMaterial :DemandMaterial={}
+  private onSelect(index: number): void {
+    this.selectedMaterial = this.boundMaterial[index]
+  }
+  MaterialBoxController: CustomDialogController = new CustomDialogController({
+    builder: MaterialBoxDialog({
+      selectedMaterial:this.selectedMaterial
+    }),
+    autoCancel: true, // 点击遮罩关闭
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.8)',  // 黑色遮罩
+  })
+  build() {
+    Column() {
+      // 订单标题(带订单号)
+      Text(`${this.item.materialName}`)
+        .fontSize($r('app.float.fontSize_12'))
+        .fontColor($r('app.color.FFFFFF'))
+        .width('100%')
+        .textAlign(TextAlign.Start)
+        .maxLines(1) // 限制单行显示
+       // .textOverflow({ overflow: TextOverflow.Ellipsis }) // 超出显示...
+
+
+
+      // 订单详情
+      Column({ space: 3 }) {
+        Text(`型号: ${this.item.materialType}`)
+          .fontColor($r('app.color.FFFFFF'))
+          .textAlign(TextAlign.Start)
+          .width('100%')
+          .fontWeight(FontWeight.Lighter)
+          .fontSize($r('app.float.fontSize_8'))
+
+        Text(`总数量: ${this.item.inBoundNum}`)
+          .fontColor($r('app.color.FFFFFF'))
+          .width('100%')
+          .fontWeight(FontWeight.Lighter)
+          .fontSize($r('app.float.fontSize_8'))
+          .textAlign(TextAlign.Start)
+      }
+      .margin({ top: 6 })
+      .alignItems(HorizontalAlign.Start)
+    }.backgroundColor(this.scaleValue===0.9 ? $r('app.color.2030D158') : $r('app.color.20FFFFFF'))
+    .borderRadius($r('app.float.virtualSize_9_6'))
+    .padding(13)
+    //.border({width:2,color:$r('app.color.20FFFFFF')})
+    .scale({ x: this.scaleValue, y: this.scaleValue })
+    .animation({
+      duration: 200,
+      curve: Curve.Linear  // 弹性曲线更生动
+    })
+    .onClick(() => {
+      this.scaleValue = 0.9;  // 点击时缩小
+      setTimeout(() => {
+        this.scaleValue = 1; // 0.2秒后恢复
+        this.onSelect(this.index)
+        this.MaterialBoxController.open()
+      }, 200);
+    })
+
+  }
+}
+
+
+
+
+@CustomDialog
+struct MaterialBoxDialog {
+  @Prop workOrders:WorkOrderInfo[] = []
+  @Prop inBoundRation:number = 10
+  @Prop outBoundRation:number = 79
+  @Link selectedMaterial: DemandMaterial
+  private scrollerMaterial: Scroller = new Scroller()
+  @State selectedMaterialIndex: number = -1  // 物料箱选中索引
+  private onSelectMaterial(index: number) {
+    this.selectedMaterialIndex = index
+  }
+
+  @State materialBoxes: MaterialBox[] = [
+  // 第一行物料箱
+    {
+      id: '1',
+      type: 'material',
+      name: '物料名称XXXXX',
+      boxNumber: 'LX-12345',
+      boxType: '通用类型',
+      order: 'XXXXX订单',
+      quantity: 10,
+      position: 'X-1 Y-2'
+    },
+    // 其他2个物料箱...
+
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    },
+    {
+      id: '1',
+      type: 'material',
+      name: '物料名称XXXXX',
+      boxNumber: 'LX-12345',
+      boxType: '通用类型',
+      order: 'XXXXX订单',
+      quantity: 10,
+      position: 'X-1 Y-2'
+    },
+    // 其他2个物料箱...
+
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    },
+    {
+      id: '1',
+      type: 'material',
+      name: '物料名称XXXXX',
+      boxNumber: 'LX-12345',
+      boxType: '通用类型',
+      order: 'XXXXX订单',
+      quantity: 10,
+      position: 'X-1 Y-2'
+    },
+    // 其他2个物料箱...
+
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    },
+    {
+      id: '1',
+      type: 'material',
+      name: '物料名称XXXXX',
+      boxNumber: 'LX-12345',
+      boxType: '通用类型',
+      order: 'XXXXX订单',
+      quantity: 10,
+      position: 'X-1 Y-2'
+    },
+    // 其他2个物料箱...
+
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    },
+    {
+      id: '1',
+      type: 'material',
+      name: '物料名称XXXXX',
+      boxNumber: 'LX-12345',
+      boxType: '通用类型',
+      order: 'XXXXX订单',
+      quantity: 10,
+      position: 'X-1 Y-2'
+    },
+    // 其他2个物料箱...
+
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    },
+    {
+      id: '1',
+      type: 'material',
+      name: '物料名称XXXXX',
+      boxNumber: 'LX-12345',
+      boxType: '通用类型',
+      order: 'XXXXX订单',
+      quantity: 10,
+      position: 'X-1 Y-2'
+    },
+    // 其他2个物料箱...
+    {
+      id: '1',
+      type: 'material',
+      name: '物料名称XXXXX',
+      boxNumber: 'LX-12345',
+      boxType: '通用类型',
+      order: 'XXXXX订单',
+      quantity: 10,
+      position: 'X-1 Y-2'
+    },
+    // 其他2个物料箱...
+
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    }, {
+    id: '1',
+    type: 'material',
+    name: '物料名称XXXXX',
+    boxNumber: 'LX-12345',
+    boxType: '通用类型',
+    order: 'XXXXX订单',
+    quantity: 10,
+    position: 'X-1 Y-2'
+  },
+
+    // 其他2个物料箱...
+
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    },
+    // 第二行空箱
+    {
+      id: '4',
+      type: 'empty',
+      name: '空箱',
+      boxNumber: 'LX-67890',
+      boxType: '通用类型',
+      position: 'X-3 Y-1'
+    },
+  // 其他2个空箱...
+  ];
+  @Prop emptyBoxes: EmptyBox[] = [];
+  controller: CustomDialogController
+  searchRequestMaterial: () => void = () => {}
+
+  build() {
+    Column() {
+      Column(){
+        Text('物料库存')
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_15_2'))
+      }.height('8%')
+      .justifyContent(FlexAlign.Center)
+
+      Column() {
+        Grid(this.scrollerMaterial) {
+          ForEach(this.materialBoxes, (box: MaterialBox, index) => {
+            GridItem() {
+              Column() {
+                // 订单标题(带订单号)
+                Text(`${box.name}`)
+                  .fontSize($r('app.float.fontSize_12'))
+                  .fontColor($r('app.color.FFFFFF'))
+                  .width('100%')
+                  .textAlign(TextAlign.Start)
+                  .margin({ bottom: '2%',left:'2%' })
+                // 订单详情
+                Column({ space: 3 }) {
+                  Text(`料箱编号: ${box.id}`)
+                    .fontColor($r('app.color.FFFFFF'))
+                    .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
+                    .textAlign(TextAlign.Start)
+                  Text(`料箱类型: ${box.boxType}`)
+                    .fontColor($r('app.color.FFFFFF'))
+                    .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
+                    .textAlign(TextAlign.Start)
+                  Text(`所属订单: ${box.order}`)
+                    .fontColor($r('app.color.FFFFFF'))
+                    .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
+                    .textAlign(TextAlign.Start)
+                  Text(`数量: ${box.boxNumber}`)
+                    .fontColor($r('app.color.FFFFFF'))
+                    .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
+                    .textAlign(TextAlign.Start)
+                  Text(`位置: ${box.position}`)
+                    .fontColor($r('app.color.FFFFFF'))
+                    .fontSize($r('app.float.fontSize_8'))
+                    .fontWeight(FontWeight.Lighter)
+                    .textAlign(TextAlign.Start)
+                }
+                .width('100%')
+                .margin({left:'2%'})
+                .justifyContent(FlexAlign.Start)
+                .alignItems(HorizontalAlign.Start)
+              }
+              //.margin({ top: 6 })
+              .alignItems(HorizontalAlign.Start)
+            }
+            .backgroundColor(index === this.selectedMaterialIndex ? $r('app.color.2030D158') : $r('app.color.20FFFFFF')) // 选中状态加深
+            .borderRadius($r('app.float.virtualSize_9_6'))
+            .padding(8)
+            .border({
+              width: 2,
+              color: index === this.selectedMaterialIndex ? $r('app.color.2030D158') : $r('app.color.20FFFFFF')
+            })
+            .onClick(() => {
+              this.onSelectMaterial(index)
+            })
+
+          })
+        }
+        .columnsTemplate('1fr 1fr 1fr')
+        // .rowsTemplate('1fr 1fr')
+        .columnsGap(10) // 移除网格内部列间距
+        .rowsGap(10) // 移除网格内部行间距
+        .width('100%') // 确保填满父容器
+        .height('97%')
+        .padding(10)
+      }.height('82%')
+
+      Divider()
+        .vertical(false)
+        .strokeWidth(1)
+        .color($r('app.color.20FFFFFF'))
+      Column(){
+        Text('关闭')
+          .fontColor($r('app.color.60FFFFFF'))
+          .fontSize($r('app.float.fontSize_12'))
+      }
+      .height('8%')
+      .justifyContent(FlexAlign.Center)
+      .width('100%')
+      .onClick(
+        () => this.controller.close()
+      )
+    }
+    .height('90%')
+    .width('80%')
+    .backgroundColor($r('app.color.2A2A2A'))
+    .justifyContent(FlexAlign.End)
+    .borderColor($r('app.color.000000'))
+    .borderWidth(1)
+    .borderRadius($r('app.float.virtualSize_11_6'))
+  }
+}
+@Component
+export struct LineChart {
+  private settings: RenderingContextSettings = new RenderingContextSettings(true)
+  private context: CanvasRenderingContext2D = new CanvasRenderingContext2D(this.settings)
+
+  // 图表数据
+  private readonly data: number[] = [400, 380, 400, 450, 430, 450, 440, 450, 430, 440, 420, 450]
+  private readonly months: string[] = ['1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月']
+
+  // 图表尺寸和边距
+  private readonly chartWidth: number = 400
+  private readonly chartHeight: number = 250
+  private readonly chartPadding: number = 30
+
+  aboutToAppear() {
+    // 初始化设置
+  }
+
+  build() {
+    Column() {
+      Canvas(this.context)
+        .width(this.chartWidth)
+        .height(this.chartHeight)
+        .backgroundColor('#2c2c2c')
+        .onReady(() => this.drawChart())
+    }
+    .width('100%')
+    .height('100%')
+  }
+
+  private drawChart() {
+    // 清空画布
+    this.context.clearRect(0, 0, this.chartWidth, this.chartHeight)
+
+    // 绘制坐标轴
+    this.drawAxis()
+
+    // 绘制折线
+    this.drawLine()
+
+    // 绘制数据点
+    this.drawPoints()
+  }
+
+  private drawAxis() {
+    this.context.beginPath()
+    this.context.strokeStyle = '#666666'
+    this.context.lineWidth = 1
+
+    // Y轴
+    this.context.moveTo(this.chartPadding, this.chartPadding)
+    this.context.lineTo(this.chartPadding, this.chartHeight - this.chartPadding)
+
+    // X轴
+    this.context.moveTo(this.chartPadding, this.chartHeight - this.chartPadding)
+    this.context.lineTo(this.chartWidth - this.chartPadding, this.chartHeight - this.chartPadding)
+
+    // 绘制刻度和标签
+    this.drawLabels()
+
+    this.context.stroke()
+  }
+
+  private drawLabels() {
+    this.context.fillStyle = '#ffffff'
+    this.context.font = '14px sans-serif'
+
+    // Y轴刻度
+    for (let i = 0; i <= 5; i++) {
+      const y = this.chartHeight - this.chartPadding - (i * (this.chartHeight - 2 * this.chartPadding) / 5)
+      const value = i * 100
+      this.context.fillText(value.toString(), 5, y + 4)
+    }
+
+    // X轴标签
+    this.months.forEach((month, i) => {
+      const x = this.chartPadding + (i * (this.chartWidth - 2 * this.chartPadding) / (this.months.length - 1))
+      this.context.fillText(month, x - 15, this.chartHeight - 10)
+    })
+  }
+
+  private drawLine() {
+    this.context.beginPath()
+    this.context.strokeStyle = '#2196F3'
+    this.context.lineWidth = 2
+
+    this.data.forEach((value, i) => {
+      const x = this.chartPadding + (i * (this.chartWidth - 2 * this.chartPadding) / (this.data.length - 1))
+      const y = this.chartHeight - this.chartPadding - ((value / 500) * (this.chartHeight - 2 * this.chartPadding))
+
+      if (i === 0) {
+        this.context.moveTo(x, y)
+      } else {
+        this.context.lineTo(x, y)
+      }
+    })
+
+    this.context.stroke()
+  }
+
+  private drawPoints() {
+    this.data.forEach((value, i) => {
+      const x = this.chartPadding + (i * (this.chartWidth - 2 * this.chartPadding) / (this.data.length - 1))
+      const y = this.chartHeight - this.chartPadding - ((value / 500) * (this.chartHeight - 2 * this.chartPadding))
+
+      this.context.beginPath()
+      this.context.fillStyle = '#2196F3'
+      this.context.arc(x, y, 4, 0, Math.PI * 2)
+      this.context.fill()
+    })
+  }
+}

+ 203 - 0
entry/src/main/ets/pages/IntelligentWarehousingStatics.ets

@@ -0,0 +1,203 @@
+/*
+ * 智能仓储统计
+ * */
+import router from '@ohos.router';
+import WorkOrderInfo from '../viewmodel/wms/WorkOrderInfo'
+import {StaticOrderList,StaticMaterialList,LineChart} from '../component/WarehousingStaticsView'
+
+
+@Entry
+@Component
+struct IntelligentWarehousingStatics {
+  @State workOrderArray: WorkOrderInfo[] = [
+    { orderName: '订单名称1XXXXX', workOrderCode: '123123213', planStartWhen: '2025/11/11', inventoryNum: '50%' },
+    { orderName: '订单名称2XXXXX', workOrderCode: '123123213', planStartWhen: '2025/11/11', inventoryNum: '50%' },
+    { orderName: '订单名称3XXXXX', workOrderCode: '123123213', planStartWhen: '2025/11/11', inventoryNum: '50%' },
+    { orderName: '订单名称4XXXXX', workOrderCode: '123123213', planStartWhen: '2025/11/11', inventoryNum: '50%' },
+    { orderName: '订单名称5XXXXX', workOrderCode: '123123213', planStartWhen: '2025/11/11', inventoryNum: '50%' },
+  ]
+
+
+  build() {
+    Row() {
+      Column() {
+        Row() {
+
+        }.width('100%')
+        .height('3.4%')
+        Row(){
+          Row() {
+            Image($r('app.media.general_return'))
+              .height($r('app.float.virtualSize_22_4'))
+              .width($r('app.float.virtualSize_22_4'))
+              .fillColor($r('app.color.FFFFFF'))
+            Text('智能仓储统计')
+              .fontColor($r('app.color.FFFFFF'))
+              .fontSize($r('app.float.fontSize_15_2'))
+          }
+          .width('85%')
+          .justifyContent(FlexAlign.Start)
+          .margin({ left: '3%' })
+          .onClick(() => {
+            router.back()
+          })
+        } .height('4%').width('100%').justifyContent(FlexAlign.Start)
+
+        Row(){
+          Column(){
+              Row(){
+                Column(){
+                  Stack({ alignContent: Alignment.Center }) {
+                    Progress({
+                      value: 75,
+                      total: 100,
+                      type: ProgressType.Ring
+                    })
+                      .width('100%')
+                      .style({ strokeWidth: $r('app.float.virtualSize_9_6') })
+                      .backgroundColor($r('app.color.20FFFFFF'))
+
+                    Column() {
+                      Text("75%")
+                        .fontSize($r('app.float.fontSize_30')) // 大号数字
+                        .fontColor($r('app.color.FFFFFF'))
+                        //.margin({ bottom: $r('app.float.virtualSize_4_8') })
+                    }
+                    .alignItems(HorizontalAlign.Center)
+                  }
+                  .width('70%')
+                  .aspectRatio(1) // 保持圆形比例
+
+                  Text("仓储占用率")
+                    .fontColor($r('app.color.FFFFFF'))
+                     .fontSize($r('app.float.fontSize_10'))
+                     .fontWeight(FontWeight.Lighter)
+                     .margin({top:'4%'})
+                }
+                .width('65%')
+                .justifyContent(FlexAlign.Center)
+                Column(){
+                  Column(){
+                    Text("20")
+                      .fontColor($r('app.color.FFFFFF'))
+                      .fontSize($r('app.float.fontSize_19_2'))
+                    Text("空箱")
+                      .fontColor($r('app.color.FFFFFF'))
+                      .fontSize($r('app.float.fontSize_10'))
+                      .fontWeight(FontWeight.Lighter)
+                  }
+                  Column(){
+                    Text("100")
+                      .fontColor($r('app.color.FFFFFF'))
+                      .fontSize($r('app.float.fontSize_19_2'))
+                    Text("当前箱数")
+                      .fontColor($r('app.color.FFFFFF'))
+                      .fontSize($r('app.float.fontSize_10'))
+                      .fontWeight(FontWeight.Lighter)
+                  }
+                  Column(){
+                    Text("182")
+                      .fontColor($r('app.color.FFFFFF'))
+                      .fontSize($r('app.float.fontSize_19_2'))
+                    Text("总储位")
+                      .fontColor($r('app.color.FFFFFF'))
+                      .fontSize($r('app.float.fontSize_10'))
+                      .fontWeight(FontWeight.Lighter)
+                  }
+                }
+                .width('30%')
+                .height('90%')
+                .backgroundColor($r('app.color.20000000'))
+                .justifyContent(FlexAlign.SpaceAround)
+              }
+              .alignItems(VerticalAlign.Center)
+              .height('45%')
+              .width('90%')
+              .backgroundColor($r('app.color.10FFFFFF'))
+              .borderRadius($r('app.float.virtualSize_9_6'))
+              Column(){
+                Column(){
+                  Text("存取频率")
+                    .fontColor($r('app.color.FFFFFF'))
+                    .fontSize($r('app.float.fontSize_15_2'))
+                  }
+                .height('15%')
+                .justifyContent(FlexAlign.Center)
+
+                LineChart()
+                  .width('80%')
+                  .height('80%')
+
+              }
+              .height('45%')
+              .width('90%')
+              .backgroundColor($r('app.color.10FFFFFF'))
+              .borderRadius($r('app.float.virtualSize_9_6'))
+          }.justifyContent(FlexAlign.SpaceEvenly).margin({top:'5%'})
+          .height('100%')
+          .width('30%')
+          .backgroundColor($r('app.color.10FFFFFF'))
+
+          Column(){
+            Column(){
+              Text("订单物料状况")
+                .fontColor($r('app.color.FFFFFF'))
+                .fontSize($r('app.float.fontSize_15_2'))
+            }.height('10%').justifyContent(FlexAlign.Center)
+            StaticOrderList({
+              workOrders:this.workOrderArray,
+            }).width('90%').height('86%')
+          }.justifyContent(FlexAlign.Start).margin({top:'5%'})
+          .height('100%')
+          .width('30%')
+          .backgroundColor($r('app.color.10FFFFFF'))
+
+
+          Column(){
+            Column(){
+              Text("当前库存")
+                .fontColor($r('app.color.FFFFFF'))
+                .fontSize($r('app.float.fontSize_15_2'))
+            }.height('10%').justifyContent(FlexAlign.Center)
+
+            Row() {
+              // 左侧二维码图标
+              Image($r('app.media.material_qr_code'))// 请替换为您的二维码图片资源
+                .width($r('app.float.virtualSize_16_8'))
+                .height($r('app.float.virtualSize_16_8'))
+                .fillColor($r('app.color.FFFFFF'))
+                .margin({ left: '2%' })
+              // 扫码输入框
+              TextInput({ placeholder: '请扫描物料编码' })
+                .type(InputType.Normal)
+                .placeholderFont({ size: $r('app.float.fontSize_12') })
+                .placeholderColor($r('app.color.30FFFFFF'))
+                .fontSize($r('app.float.fontSize_12'))
+                .fontColor($r('app.color.FFFFFF'))
+                .enableKeyboardOnFocus(false)
+            }
+            .height('8%')
+            .width('80%')
+            .borderRadius($r('app.float.virtualSize_7_2'))
+            .backgroundColor($r('app.color.000000'))
+
+            StaticMaterialList().width('90%').height('76%').margin({top:'3%'})
+
+          }.justifyContent(FlexAlign.Start).margin({top:'5%'})
+          .height('100%')
+          .width('30%')
+          .backgroundColor($r('app.color.10FFFFFF'))
+
+        }.height('80%').width('100%').justifyContent(FlexAlign.SpaceAround)
+      }
+      .width('100%')
+      .height('100%')
+      .backgroundColor($r('app.color.000000'))
+    }
+    .height('100%')
+  }
+}
+
+
+
+

+ 2 - 3
entry/src/main/ets/pages/LittleMaterialsStorage.ets

@@ -104,6 +104,7 @@ struct LittleMaterialsStorage{
                       .placeholderColor($r('app.color.30FFFFFF'))
                       .fontSize($r('app.float.fontSize_12'))
                       .fontColor($r('app.color.FFFFFF'))
+                      .enableKeyboardOnFocus(false)
                   }
                   .margin({top:'3%'})
                   .height('8%')
@@ -251,9 +252,6 @@ struct LittleMaterialsStorage{
                     Text("扫码录入")
                       .fontColor($r('app.color.FFFFFF'))
                       .fontSize($r('app.float.fontSize_15_2'))
-                    Text('电机生产订单DWS123331223332(电路板-SDASDASFSADASD)')
-                      .fontColor($r('app.color.FFFFFF'))
-                      .fontSize($r('app.float.fontSize_8'))
                   }.height('100%').width('65%').alignItems(HorizontalAlign.Start).justifyContent(FlexAlign.Center)
                   Row() {
                     // 左侧二维码图标
@@ -269,6 +267,7 @@ struct LittleMaterialsStorage{
                       .placeholderColor($r('app.color.30FFFFFF'))
                       .fontSize($r('app.float.fontSize_12'))
                       .fontColor($r('app.color.FFFFFF'))
+                      .enableKeyboardOnFocus(false)
                   }.width('35%')
                   .borderRadius($r('app.float.virtualSize_7_2'))
                   .backgroundColor($r('app.color.000000'))

+ 98 - 29
entry/src/main/ets/pages/RgvControl.ets

@@ -5,7 +5,7 @@ import router from '@ohos.router';
 import {InfoRow} from '../component/RgvControlView'
 import RobotErrorHandleRequest from '../common/util/request/RobotErrorHandleRequest'
 import WorkOrderInfo from '../viewmodel/wms/WorkOrderInfo'
-import {RgvButton,RobotSelector,MoveControllerButton,CommonConfirmDialog,MoveDialog}from "../component/RgvControlView"
+import {RgvButton,RemindDialog,MoveControllerButton,CommonConfirmDialog,MoveDialog}from "../component/RgvControlView"
 import {RobotInfo,RgvInfo,ErrorMessage,RequestParam,ConfirmDialogParams,RobotSingleMovePost} from "../params/RobotsParam"
 import CommonConstants from '../common/constants/CommonConstants'
 const TAG: string = 'RGV'
@@ -30,36 +30,69 @@ struct RgvControl {
   @State rgvPosition : string = ""
   @State rgvBatteryLevel  : string = ""
   @State rgvCurrentStatus: string = ""
-  @State rgvInfoInterval: number | null = null;
+  @State rgvInfoInterval: number = 0;
+  @State reminds:string='1'
 
   commonDialogController: CustomDialogController | null = null;
+  remindController: CustomDialogController = new CustomDialogController({
+    builder: RemindDialog({
+      remind: this.reminds,}
+    ),
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.6)',
+    autoCancel:false
+  })
   // rgv开机
   executePowerOn = async()=>{
     try {
+      this.reminds = '机器人开机中,请稍后....'
+      this.remindController.open()
       // 第一步:开启电机
       let res: object= await RobotErrorHandleRequest.post('/api/v1/wcs/rgv/rgvPowerOn', {
         rgvNo: this.robotsList[this.selectRobotIndex].robotCode,
-        option: 'motor'
+        option: 'mcu'
       } as RequestParam);
       console.log(TAG,'电机启动:' + res.toString());
 
-      // 第二步:延迟 5 秒后开启主电源
       await delayExecution(async () => {
-        res = await RobotErrorHandleRequest.post('/api/v1/wcs/rgv/rgvPowerOn', {
-          rgvNo: this.robotsList[this.selectRobotIndex].robotCode,
-          option: 'mainPower'
-        } as RequestParam);
-        console.log(TAG,'主电源启动:' + res.toString());
-      }, 5000);
+        this.remindController.close()
+        let res: RgvInfo = await RobotErrorHandleRequest.get('/api/v1/wcs/rgv/' + this.robotsList[this.selectRobotIndex].robotCode, {}) as RgvInfo
+        console.log('小车开机http:' + JSON.stringify(res))
+        if(res) {
+          if(res.x != res.rx || res.y != res.ry)
+          {
+            this.reminds = "小车位置错误,请重新设置!"
+            AlertDialog.show({
+              title: "小车异常",
+              message: this.reminds,
+              confirm: {
+                value: "确定",
+                action: () => {
+
+                }
+              }
+            });
+          }
+        }
+      }, 3000);
+
+      // 第二步:延迟 5 秒后开启主电源
+      // await delayExecution(async () => {
+      //   res = await RobotErrorHandleRequest.post('/api/v1/wcs/rgv/rgvPowerOn', {
+      //     rgvNo: this.robotsList[this.selectRobotIndex].robotCode,
+      //     option: 'mainPower'
+      //   } as RequestParam);
+      //   console.log(TAG,'主电源启动:' + res.toString());
+      // }, 5000);
 
       // 第三步:再延迟 5 秒后开启 MCU
-      await delayExecution(async () => {
-        res = await RobotErrorHandleRequest.post('/api/v1/wcs/rgv/rgvPowerOn', {
-          rgvNo: this.robotsList[this.selectRobotIndex].robotCode,
-          option: 'mcu'
-        } as RequestParam);
-        console.log(TAG,'MCU 启动:' + res.toString());
-      }, 5000);
+      // await delayExecution(async () => {
+      //   res = await RobotErrorHandleRequest.post('/api/v1/wcs/rgv/rgvPowerOn', {
+      //     rgvNo: this.robotsList[this.selectRobotIndex].robotCode,
+      //     option: 'mcu'
+      //   } as RequestParam);
+      //   console.log(TAG,'MCU 启动:' + res.toString());
+      // }, 5000);
 
     } catch (error) {
       console.error(TAG,'开机流程失败:', error);
@@ -68,6 +101,8 @@ struct RgvControl {
   // rgv关机
   executeShutdown=async()=>{
     try {
+      this.reminds = '机器人关机中,请稍后....'
+      this.remindController.open()
       let res: object = await RobotErrorHandleRequest.post('/api/v1/wcs/rgv/TurnChargingSwitch', {
         rgvNo: this.robotsList[this.selectRobotIndex].robotCode,
         option: 'off'
@@ -99,7 +134,7 @@ struct RgvControl {
         } as RequestParam);
         console.log(TAG,'MCU 关闭:' + res.toString());
       }, 5000);
-
+      this.remindController.close()
     } catch (error) {
       console.error(TAG,'关机流程失败:', error);
     }
@@ -195,6 +230,19 @@ struct RgvControl {
     }
   }
 
+  //设置小车位置
+  executeSetPosition = async()=>{
+    try {
+      let res: object = await RobotErrorHandleRequest.post('/api/v1/wcs/rgv/newposition', {
+        rgvNo: this.robotsList[this.selectRobotIndex].robotCode,
+        x: this.rgvEndX.toString(),
+        y: this.rgvEndY.toString()
+      } as RequestParam)
+    } catch (error) {
+      console.error(TAG,'终点移动位置:', error);
+    }
+  }
+
   //位移移动
   executeAxisMove = async () => {
     try {
@@ -263,10 +311,12 @@ struct RgvControl {
     this.commonDialogController.open();
   }
 
-  dialogController: CustomDialogController = new CustomDialogController({
+  endMoveDialog: CustomDialogController = new CustomDialogController({
     builder: MoveDialog({
       rgvEndX:this.rgvEndX,
       rgvEndY:this.rgvEndY,
+      title:"终点移动",
+      info:"设置终点坐标",
       onConfirm: () => { this.executeEndMove()}
     }),
     cancel: () => console.log('弹窗关闭'),
@@ -275,6 +325,20 @@ struct RgvControl {
     maskColor: 'rgba(0,0,0,0.8)',  // 黑色遮罩
   })
 
+  settingPositionDialog: CustomDialogController = new CustomDialogController({
+    builder: MoveDialog({
+      title:"当前位置",
+      info:"设置当前坐标",
+      rgvEndX:this.rgvEndX,
+      rgvEndY:this.rgvEndY,
+      onConfirm: () => { this.executeSetPosition()}
+    }),
+    cancel: () => console.log('弹窗关闭'),
+    autoCancel: true, // 点击遮罩关闭
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.8)',  // 黑色遮罩
+  })
+
   loadRgvSelection=()=>{
     if (this.robotsList && this.robotsList.length > 0) {
       for (const robot of this.robotsList ) {
@@ -302,11 +366,8 @@ struct RgvControl {
     }, 1000);
   }
 
-  boutToDisappear(): void {
-    if (this.rgvInfoInterval) {
-      clearInterval(this.rgvInfoInterval);
-      this.rgvInfoInterval = null;
-    }
+  aboutToDisappear(): void {
+    clearInterval(this.rgvInfoInterval);
   }
 
   build() {
@@ -376,10 +437,18 @@ struct RgvControl {
                 .objectFit(ImageFit.Contain)
                 .interpolation(ImageInterpolation.High)
               //.fillColor($r('app.color.0A84FF'))
-              Image($r('app.media.rgv_set_position'))
-                .height($r('app.float.virtualSize_22_4'))
-                .width($r('app.float.virtualSize_22_4'))
-                .fillColor($r('app.color.FFFFFF'))
+              Column(){
+                Image($r('app.media.rgv_set_position'))
+                  .height($r('app.float.virtualSize_22_4'))
+                  .width($r('app.float.virtualSize_22_4'))
+                  .fillColor($r('app.color.FFFFFF'))
+                  .onClick(()=>{
+                    this.settingPositionDialog.open();
+                  })
+                Text('设置小车位置')
+                  .fontColor($r('app.color.FFFFFF'))
+                  .fontSize($r('app.float.fontSize_8'))
+              }
             }
             .height('40%')
             .width('100%')
@@ -631,7 +700,7 @@ struct RgvControl {
                 text:"终点移动",
                 icon:$r('app.media.rgv_end_position'),
                 onButtonClick: () => {
-                  this.dialogController.open()
+                  this.endMoveDialog.open()
                 }
               }).height('16%').width('80%')
             }.height('48%')

+ 6 - 0
entry/src/main/ets/params/LogParam.ets

@@ -0,0 +1,6 @@
+export  class LogInfo {
+  // 日志数据
+  logData?: string
+  // 日期
+  date?: string
+}

+ 12 - 5
entry/src/main/ets/params/OrderMaterialsStorageParams.ets

@@ -5,11 +5,11 @@ export interface OrderParams {
   progress: string
 }
 
-export interface DemandMaterial {
-  materialName: string,
-  materialType: string,
-  inBoundNum: number,
-  planNum: number
+export class DemandMaterial{
+  materialName?: string
+  materialType?: string
+  inBoundNum?: number
+  planNum?: number
 }
 
 export interface MaterialItem {
@@ -42,4 +42,11 @@ export interface EmptyBox {
   position: string
 }
 
+export interface ConfirmDialogParams {
+  title?: string
+  message: string
+  confirmText?: string
+  cancelText?: string
+  onConfirm: () => void
+}
 

+ 2 - 0
entry/src/main/ets/params/RobotsParam.ets

@@ -26,6 +26,8 @@ export  class RgvInfo{
   id?:string
   x?:string
   y?:string
+  rx?:string
+  ry?:string
   status?:string
   auto?:string
   dx?:string

+ 263 - 0
entry/src/main/ets/view/wms/CallMaterialNotification.ets

@@ -0,0 +1,263 @@
+//叫料通知
+import WorkOrderInfo from '../../viewmodel/wms/WorkOrderInfo'
+import {OrderParams,DemandMaterial} from "../../params/OrderMaterialsStorageParams"
+
+@Component
+struct MaterialNotificationItem{
+  @Prop item:WorkOrderInfo
+  @Prop index:number
+  @State scaleValue:number = 1
+  @Link workOrders: WorkOrderInfo[]
+  searchRequestMaterial: () => void = () => {}
+  build() {
+    Row(){
+      Column() {
+        // 订单标题(带订单号)
+        Text(`${this.item.orderName}${this.item.orderCode}`)
+          .fontSize($r('app.float.fontSize_12'))
+          .fontColor(this.item.workOrderState=="完成"?$r('app.color.FFFFFF'):$r('app.color.30FFFFFF'))
+          .width('100%')
+          .textAlign(TextAlign.Start)
+
+        // 订单详情
+        Column({ space: 3 }) {
+          Text(`工位: ${this.item.workOrderCode}`)
+            .fontColor(this.item.workOrderState=="完成"?$r('app.color.FFFFFF'):$r('app.color.30FFFFFF'))
+            .fontSize($r('app.float.fontSize_8'))
+            .fontWeight(FontWeight.Lighter)
+
+          Text(`工序: ${this.item.planStartWhen}`)
+            .fontColor(this.item.workOrderState=="完成"?$r('app.color.FFFFFF'):$r('app.color.30FFFFFF'))
+            .fontSize($r('app.float.fontSize_8'))
+            .fontWeight(FontWeight.Lighter)
+
+          Row() {
+            Text('通知时间:')
+              .fontColor(this.item.workOrderState=="完成"?$r('app.color.FFFFFF'):$r('app.color.30FFFFFF'))
+              .fontSize($r('app.float.fontSize_8'))
+              .fontWeight(FontWeight.Lighter)
+
+            Text(`${(Number(this.item.inventoryNum) / Number(this.item.planNum) * 100).toFixed(0)}%`)
+              .fontColor(this.item.workOrderState=="完成"?$r('app.color.FFFFFF'):$r('app.color.30FFFFFF'))
+              .fontSize($r('app.float.fontSize_8'))
+              .margin({ left: 4 })
+              .fontWeight(FontWeight.Lighter)
+          }
+          .width('100%')
+          .justifyContent(FlexAlign.Start)
+        }
+        .margin({ top: 6 })
+        .alignItems(HorizontalAlign.Start)
+      }.width('85%')
+      Row(){
+        //Text(index === this.selectedIndex ?item.workOrderState:item.workOrderState)
+        Text(this.item.workOrderState)
+          .fontSize($r('app.float.fontSize_12'))
+          .fontColor(this.item.workOrderState=="完成"?$r('app.color.30D158'):$r('app.color.30FFFFFF'))
+      }.width('15%')
+    }
+    .backgroundColor(this.scaleValue===0.9 ? $r('app.color.2030D158') : $r('app.color.20FFFFFF')) // 选中状态加深
+    .borderRadius($r('app.float.virtualSize_9_6'))
+    .padding(10)
+    .scale({ x: this.scaleValue, y: this.scaleValue })
+    .animation({
+      duration: 200,
+      curve: Curve.Linear  // 弹性曲线更生动
+    })
+    //.border({width:2,color:this.scaleValue===0.9 ? $r('app.color.2030D158'):$r('app.color.20FFFFFF')})
+    .onClick(() => {
+      this.scaleValue = 0.9;  // 点击时缩小
+      setTimeout(() => {
+        this.scaleValue = 1; // 0.2秒后恢复
+        this.searchRequestMaterial()
+        const changed = this.workOrders[this.index].workOrderState !== "已完成";
+        this.workOrders[this.index].workOrderState = "已完成";
+        // 只有状态确实变化时才重新排序
+        if (changed) {
+          this.workOrders = this.workOrders.slice().sort((a) =>
+          a.workOrderState === "已完成" ? 1 : -1
+          );
+        }
+      }, 200);
+    })
+  }
+
+}
+
+@CustomDialog
+export struct MaterialNotificationDialog {
+  private scrollerForList: Scroller = new Scroller()
+  @Link selectWorkOrder:WorkOrderInfo
+  @Link workOrders: WorkOrderInfo[]
+  //@Link selectWorkOrder: WorkOrderInfo
+  // 选中回调函数
+  controller: CustomDialogController
+  searchRequestMaterial: () => void = () => {}
+
+  aboutToAppear() {
+    this.workOrders = this.workOrders
+      .slice()
+      .sort((a) => a.workOrderState === "已完成" ? 1 : -1);
+  }
+
+  build() {
+    Column() {
+      Column(){
+        Text('叫料通知')
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_15_2'))
+      }.height('6%')
+      .justifyContent(FlexAlign.Center)
+
+      Column() { // 订单列表
+        List({ space: 8,scroller:this.scrollerForList }) {
+          ForEach(this.workOrders, (item: WorkOrderInfo, index) => {
+            ListItem() {
+              MaterialNotificationItem({
+                item:item,
+                index:index,
+                workOrders:this.workOrders,
+                searchRequestMaterial:this.searchRequestMaterial
+              })
+            }
+          })
+        }
+        .width('90%')
+        .flexGrow(1)
+      }
+      .width('100%')
+      .height('80%')
+      .margin({bottom:'2%',top:'1%'})
+
+      Divider()
+        .vertical(false)
+        .strokeWidth(1)
+        .color($r('app.color.20FFFFFF'))
+      Column(){
+        Text('关闭')
+          .fontColor($r('app.color.60FFFFFF'))
+          .fontSize($r('app.float.fontSize_12'))
+      }
+      .height('8%')
+      .justifyContent(FlexAlign.Center)
+      .width('100%')
+      .onClick(
+        () => this.controller.close()
+      )
+    }
+    .height('80%')
+    .width('60%')
+    .backgroundColor($r('app.color.2A2A2A'))
+    .justifyContent(FlexAlign.End)
+    .borderColor($r('app.color.000000'))
+    .borderWidth(1)
+    .borderRadius($r('app.float.virtualSize_11_6'))
+  }
+}
+
+
+
+@CustomDialog
+export struct MaterialRequestDialog {
+  private scrollerForList: Scroller = new Scroller()
+  @State materialData: DemandMaterial[] = [
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+    {materialName: 'PCBA电路板-SADD1231241142324233231233234', materialType: '12322221232321222332211233', inBoundNum: 11, planNum: 20 },
+  ];
+
+
+  //@Link selectWorkOrder: WorkOrderInfo
+  @State selectedIndex: number = -1  // 添加选中索引状态
+  // 选中回调函数
+  private onSelect(index: number): void {
+    this.selectedIndex = index
+    //this.selectWorkOrder = this.workOrders[index]
+  }
+  controller: CustomDialogController
+  onConfirm: () => void = () => {}
+
+  build() {
+    Column() {
+      Column(){
+        Text('物料需求')
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_15_2'))
+      }.height('6%')
+      .justifyContent(FlexAlign.Center)
+
+      Column() {
+        List({scroller:this.scrollerForList}) {
+          ForEach(this.materialData, (item:DemandMaterial) => {
+            ListItem() {
+              Row() {
+                Column(){
+                  Text(item.materialName)
+                    .fontSize($r('app.float.fontSize_8'))
+                    .fontColor($r('app.color.FFFFFF'))
+                    .width('90%')
+                    .textAlign(TextAlign.Start)
+                  Text(`型号: ${item.materialType}`)
+                    .fontSize($r('app.float.fontSize_8'))
+                    .fontColor($r('app.color.FFFFFF'))
+                    .width('90%')
+                    .textAlign(TextAlign.Start)
+                    .margin({top:'1%'})
+                    .fontWeight(FontWeight.Lighter)
+                }
+                Row(){
+                  Text(`${item.planNum}`)
+                    .fontSize($r('app.float.fontSize_15_2'))
+                    .fontColor($r('app.color.FFFFFF'))
+                    .width('10%')
+                    .textAlign(TextAlign.Start)
+                }
+              }.width('100%').justifyContent(FlexAlign.SpaceEvenly).height('12%')
+            }
+          })
+        }
+        .width('90%')
+        .height('100%')
+        .divider({
+          strokeWidth: 1,
+          color: $r('app.color.20FFFFFF')
+        })
+      }
+      .width('100%')
+      .height('80%')
+      .margin({bottom:'2%',top:'1%'})
+
+      Divider()
+        .vertical(false)
+        .strokeWidth(1)
+        .color($r('app.color.20FFFFFF'))
+      Column(){
+        Text('关闭')
+          .fontColor($r('app.color.60FFFFFF'))
+          .fontSize($r('app.float.fontSize_12'))
+      }
+      .width('100%')
+      .height('8%')
+      .justifyContent(FlexAlign.Center)
+      .onClick(
+        () => this.controller.close()
+      )
+
+    }
+    .height('80%')
+    .width('30%')
+    .backgroundColor($r('app.color.2A2A2A'))
+    .justifyContent(FlexAlign.End)
+    .borderColor($r('app.color.000000'))
+    .borderWidth(1)
+    .borderRadius($r('app.float.virtualSize_11_6'))
+  }
+}

+ 12 - 1
entry/src/main/ets/view/wms/OrderMaterialStorageFirstStep.ets

@@ -33,6 +33,7 @@ export struct OrderMaterialStorageFirstStep {
   @Link selectWorkOrder: WorkOrderInfo
 
   @State workOrderArray: WorkOrderInfo[] = []
+  @State nextStepButtonClick:number =1
 
   loadWorkOrders = async () => {
     this.workOrderArray = await WmsRequest.post('/api/v1/plan/workOrder/list', {
@@ -41,6 +42,7 @@ export struct OrderMaterialStorageFirstStep {
   }
   aboutToAppear(): void {
     this.loadWorkOrders();
+    this.selectWorkOrder = {}
   }
 
 
@@ -93,8 +95,17 @@ export struct OrderMaterialStorageFirstStep {
       .backgroundColor(this.selectWorkOrder.orderCode ?$r('app.color.20FFFFFF'):$r('app.color.10FFFFFF'))
       .borderRadius($r('app.float.virtualSize_6_4'))
       .enabled(!!this.selectWorkOrder.orderCode ) // 只有选中订单时才启用按钮
+      .scale({ x: this.nextStepButtonClick, y: this.nextStepButtonClick })
+      .animation({
+        duration: 200,
+        curve: Curve.Linear  // 弹性曲线更生动
+      })
       .onClick(() => {
-        this.currentStep = 2;
+        this.nextStepButtonClick = 0.9;
+        setTimeout(() => {
+          this.nextStepButtonClick = 1;
+          this.currentStep = 2;
+        }, 200);
       })
     }.height('83.6%').margin({top:'3%'}).width('100%')
     .justifyContent(FlexAlign.SpaceAround)

+ 119 - 17
entry/src/main/ets/view/wms/OrderMaterialStorageSecondStep.ets

@@ -1,11 +1,16 @@
-import {SingleOrder,BoxGrid} from "../../component/OrderMaterialsStorageView"
+import {SingleOrder,BoxGrid,RemindDialog} from "../../component/OrderMaterialsStorageView"
 import WorkOrderInfo from '../../viewmodel/wms/WorkOrderInfo'
 import WmsRequest from '../../common/util/request/WmsRequest'
 import {MaterialListInformation,MaterialBoxInfo,outBoxClass} from '../../params/MaterialInformationParam'
 import RequestParamModel from '../../viewmodel/wms/RequestParamModel'
 import CommonConstants from '../../common/constants/CommonConstants'
 import promptAction from '@ohos.promptAction'
-
+import emitter from '@ohos.events.emitter';
+import {EventId} from '../../common/util/mqtt';
+import {RgvInfo} from "../../params/RobotsParam"
+import {CommonConfirmDialog}from "../../component/OrderMaterialsStorageView"
+import {ConfirmDialogParams} from "../../params/OrderMaterialsStorageParams"
+import RobotErrorHandleRequest from '../../common/util/request/RobotErrorHandleRequest'
 
 @Component
 export struct OrderMaterialStorageSecondStep {
@@ -14,9 +19,33 @@ export struct OrderMaterialStorageSecondStep {
   @State scanCodeValue:string = ''
   @State selectedMaterialBox: MaterialBoxInfo = {};
   @State outBoundButtonClick :number = 1
+  @State nextStepButtonClick:number = 1
+  @State preStepButtonClick:number = 1
   @State isQueryMaterial: boolean = false
   @State emptyBoxes: MaterialBoxInfo[] = []
   @State materialBoxes: MaterialBoxInfo[] = []
+  @State materialBoxWeight: number = 0
+  @State reminds:string='1'
+  @State drawerPositionStatus: number = 1
+
+  refreshTag=()=>{
+    emitter.on({
+      eventId: EventId.MQTT_MESSAGE
+    }, (eventData: emitter.EventData) => {
+      //this.materialBoxID = eventData?.data?.['rfid']
+      this.drawerPositionStatus = Number(eventData?.data?.['station2Set'])
+      this.materialBoxWeight = Number(eventData?.data?.['station2Weight'])
+    })
+  }
+
+  remindController: CustomDialogController = new CustomDialogController({
+    builder: RemindDialog({
+      remind: this.reminds,}
+    ),
+    customStyle: true,
+    maskColor: 'rgba(0,0,0,0.6)',
+    autoCancel:false
+  })
   getStoreList = async () => {
     let res: MaterialListInformation[] = await WmsRequest.post("/api/v1/stock/mergeList", {
       houseType: "1",
@@ -40,23 +69,69 @@ export struct OrderMaterialStorageSecondStep {
     this.emptyBoxes = res;
     console.info( "qqqqq"+JSON.stringify(res))
   }
+  commonDialogController: CustomDialogController | null = null;
+  private showConfirmDialog(params: ConfirmDialogParams) {
+    if (this.commonDialogController) {
+      this.commonDialogController.close()
+    }
+
+    this.commonDialogController = new CustomDialogController({
+      builder: CommonConfirmDialog({
+        title: params.title || '提示',
+        message: params.message,
+        confirmText: params.confirmText || '确定',
+        cancelText: params.cancelText || '取消',
+        onConfirm: params.onConfirm
+      }),
+      cancel: () => console.log('用户取消操作'),
+      customStyle: true,
+      maskColor: 'rgba(0,0,0,0.6)'
+    });
+
+    this.commonDialogController.open();
+  }
 
   boxOutBound = async () => {
-    let res: outBoxClass = await WmsRequest.post("/api/v1/wmsOrder/outBox", {
-      houseNo:this.selectedMaterialBox?.houseNo,
-      vehicleNo:this.selectedMaterialBox?.vehicleCode,
-      stanCode:CommonConstants.STATION_CODE
-    } as RequestParamModel)
-   promptAction.showToast({
-      message: "任务进行中,请等待....",
-      duration: 1800,
-      bottom: '50%'
-    })
+    try {
+      const res: outBoxClass = await WmsRequest.post("/api/v1/wmsOrder/outBox", {
+        houseNo: this.selectedMaterialBox?.houseNo,
+        vehicleNo: this.selectedMaterialBox?.vehicleCode,
+        stanCode: CommonConstants.STATION_CODE
+      } as RequestParamModel);
+      this.reminds="正在出库中,请稍等..."
+      this.remindController.open()
+      const checkInterval = setInterval(() => {
+        if (this.materialBoxWeight > 0) {
+          clearInterval(checkInterval);  // 停止轮询
+          this.getEmptyBox();
+          this.remindController.close(); // 关闭弹窗
+        }
+      }, 500); // 每500毫秒检查一次
+      // 成功后的刷新逻辑
+    } catch (error) {
+      console.error("出库操作失败:", error);
+      promptAction.showToast({
+        message: "出库失败,请重试",
+        duration: 1800,
+        bottom: '5%'
+      });
+    }
   }
 
+  async queryRgvInfo(): Promise<boolean> {
+    let res: RgvInfo = await RobotErrorHandleRequest.get('/api/v1/wcs/rgv/rgv1', {}) as RgvInfo;
+    if (res) {
+      if (res.status != '0' || res.x != res.rx || res.y != res.ry) {
+        return false;
+      }
+      return true; // 如果条件不满足,返回 true
+    }
+    return false; // 如果 res 为 null 或 undefined,返回 false
+  }
 
   aboutToAppear(): void {
      this.getEmptyBox()
+    this.refreshTag();
   }
   build() {
     Column(){
@@ -84,6 +159,7 @@ export struct OrderMaterialStorageSecondStep {
                 .placeholderColor($r('app.color.30FFFFFF'))
                 .fontSize($r('app.float.fontSize_12'))
                 .fontColor($r('app.color.FFFFFF'))
+                .enableKeyboardOnFocus(false)
             }
             .margin({top:'3%'})
             .height('8%')
@@ -182,8 +258,17 @@ export struct OrderMaterialStorageSecondStep {
         .backgroundColor($r('app.color.20FFFFFF'))
         .borderRadius($r('app.float.virtualSize_6_4'))
         // .enabled(!!this.selectedOrderNo) // 只有选中订单时才启用按钮
+        .scale({ x: this.preStepButtonClick, y: this.preStepButtonClick })
+        .animation({
+          duration: 200,
+          curve: Curve.Linear  // 弹性曲线更生动
+        })
         .onClick(() => {
-          this.currentStep = 1;
+          this.preStepButtonClick = 0.9;
+          setTimeout(() => {
+            this.preStepButtonClick = 1;
+            this.currentStep = 1;
+          }, 200);
         })
         Button({type:ButtonType.Normal}) {
           Text("料箱出库")
@@ -202,11 +287,19 @@ export struct OrderMaterialStorageSecondStep {
           curve: Curve.Linear  // 弹性曲线更生动
         })
         .onClick(() => {
-          this.outBoundButtonClick = 0.9; // 点击时缩小
+          this.outBoundButtonClick = 0.9;
           setTimeout(() => {
-            this.outBoundButtonClick = 1; // 0.2秒后恢复
+            this.outBoundButtonClick = 1;
+            this.showConfirmDialog({
+              title: '料箱出库',
+              message: `确定要${this.selectedMaterialBox.vehicleCode}料箱出库吗?`,
+              onConfirm: ()=> {
+                this.boxOutBound();
+              }
+            });
+            CommonConstants.MATERIAL_BOX_ID = this.selectedMaterialBox.vehicleCode?this.selectedMaterialBox.vehicleCode:""
+            console.info("rgvs"+CommonConstants.MATERIAL_BOX_ID)
           }, 200);
-         this.boxOutBound();
         })
         Button({type:ButtonType.Normal}) {
           Text("下一步")
@@ -218,8 +311,17 @@ export struct OrderMaterialStorageSecondStep {
         .backgroundColor($r('app.color.20FFFFFF'))
         .borderRadius($r('app.float.virtualSize_6_4'))
         // .enabled(!!this.selectedOrderNo) // 只有选中订单时才启用按钮
+        .scale({ x: this.nextStepButtonClick, y: this.nextStepButtonClick })
+        .animation({
+          duration: 200,
+          curve: Curve.Linear  // 弹性曲线更生动
+        })
         .onClick(() => {
-          this.currentStep = 3;
+          this.nextStepButtonClick = 0.9;
+          setTimeout(() => {
+            this.nextStepButtonClick = 1;
+            this.currentStep = 3;
+          }, 200);
         })
 
       }.width('100%').height('6%').justifyContent(FlexAlign.End).margin({bottom:'3%',right:'5%'})

+ 23 - 2
entry/src/main/ets/view/wms/OrderMaterialStorageThirdStep.ets

@@ -14,6 +14,8 @@ export struct OrderMaterialStorageThirdStep {
     // { orderName: '订单名称XXXX', orderNo: '123123213', date: '2025/11/11', progress: '75%' },
     // { orderName: '特殊订单', orderNo: 'SH2024001', date: '2024/03/01', progress: '100%' }
   ]
+  @State firstStepButtonClick:number = 1
+  @State preStepButtonClick:number = 1
   build() {
     Column(){
       Row(){
@@ -41,6 +43,7 @@ export struct OrderMaterialStorageThirdStep {
                 .placeholderColor($r('app.color.30FFFFFF'))
                 .fontSize($r('app.float.fontSize_12'))
                 .fontColor($r('app.color.FFFFFF'))
+                .enableKeyboardOnFocus(false)
             }.width('35%')
             .borderRadius($r('app.float.virtualSize_7_2'))
             .backgroundColor($r('app.color.000000'))
@@ -77,8 +80,17 @@ export struct OrderMaterialStorageThirdStep {
         .backgroundColor($r('app.color.20FFFFFF'))
         .borderRadius($r('app.float.virtualSize_6_4'))
         // .enabled(!!this.selectedOrderNo) // 只有选中订单时才启用按钮
+        .scale({ x: this.firstStepButtonClick, y: this.firstStepButtonClick })
+        .animation({
+          duration: 200,
+          curve: Curve.Linear  // 弹性曲线更生动
+        })
         .onClick(() => {
-          this.currentStep = 1;
+          this.firstStepButtonClick = 0.9;
+          setTimeout(() => {
+            this.firstStepButtonClick = 1;
+            this.currentStep = 1;
+          }, 200);
         })
         Button({type:ButtonType.Normal}) {
           Text("上一步")
@@ -90,8 +102,17 @@ export struct OrderMaterialStorageThirdStep {
         .backgroundColor($r('app.color.20FFFFFF'))
         .borderRadius($r('app.float.virtualSize_6_4'))
         // .enabled(!!this.selectedOrderNo) // 只有选中订单时才启用按钮
+        .scale({ x: this.preStepButtonClick, y: this.preStepButtonClick })
+        .animation({
+          duration: 200,
+          curve: Curve.Linear  // 弹性曲线更生动
+        })
         .onClick(() => {
-          this.currentStep = 2;
+          this.preStepButtonClick = 0.9;
+          setTimeout(() => {
+            this.preStepButtonClick = 1;
+            this.currentStep = 2;
+          }, 200);
         })
       }.width('100%').height('6%').justifyContent(FlexAlign.Start).margin({bottom:'3%',left:'5%'})
     }.height('83.6%').margin({top:'3%'}).width('100%')

+ 79 - 0
entry/src/main/ets/view/wms/WarehousingLog.ets

@@ -0,0 +1,79 @@
+import {LogInfo} from '../../params/LogParam'
+@CustomDialog
+export struct WarehousingLogDialog {
+  private scrollerForList: Scroller = new Scroller()
+  @State warehousingLogs: LogInfo[] = [
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+    {logData: '1#抽屉收回', date: '2025/11/11 11:11:1'},
+  ];
+
+  controller: CustomDialogController
+  onConfirm: () => void = () => {}
+
+  build() {
+    Column() {
+      Column(){
+        Text('仓储日志')
+          .fontColor($r('app.color.FFFFFF'))
+          .fontSize($r('app.float.fontSize_15_2'))
+      }.height('6%')
+      .justifyContent(FlexAlign.Center)
+
+      Column() {
+        List({scroller:this.scrollerForList}) {
+          ForEach(this.warehousingLogs, (item:LogInfo) => {
+            ListItem() {
+                Column(){
+                  Text(item.logData)
+                    .fontSize($r('app.float.fontSize_10'))
+                    .fontColor($r('app.color.FFFFFF'))
+                    .width('100%')
+                    .textAlign(TextAlign.Start)
+                  Text(`${item.date}`)
+                    .fontSize($r('app.float.fontSize_10'))
+                    .fontColor($r('app.color.60FFFFFF'))
+                    .width('100%')
+                    .textAlign(TextAlign.Start)
+              }.width('100%').justifyContent(FlexAlign.Center).height('10%')
+            }
+          })
+        }
+        .width('95%')
+        .height('100%')
+      }
+      .width('100%')
+      .height('80%')
+      .margin({bottom:'2%',top:'1%'})
+
+      Divider()
+        .vertical(false)
+        .strokeWidth(1)
+        .color($r('app.color.20FFFFFF'))
+      Column(){
+        Text('关闭')
+          .fontColor($r('app.color.60FFFFFF'))
+          .fontSize($r('app.float.fontSize_12'))
+      }
+      .width('100%')
+      .height('8%')
+      .justifyContent(FlexAlign.Center)
+      .onClick(
+        () => this.controller.close()
+      )
+
+    }
+    .height('80%')
+    .width('30%')
+    .backgroundColor($r('app.color.2A2A2A'))
+    .justifyContent(FlexAlign.End)
+    .borderColor($r('app.color.000000'))
+    .borderWidth(1)
+    .borderRadius($r('app.float.virtualSize_11_6'))
+  }
+}

+ 29 - 0
entry/src/main/ets/viewmodel/wms/InBoundOrderInfo.ets

@@ -36,3 +36,32 @@ interface Records{
   updator: string;
   vehicleCode: string;
 }
+
+export interface detailsListClass {
+  index?:number
+  //产品规格
+  spec?:string
+  //	物料名称
+  materialName?:string
+  //物料编码
+  materialNo?: string
+  //	序列号
+  seqNo?: string
+  //储位坐标
+  coordinate?:string
+  //仓库编号
+  houseNo?:string
+  //储位编号
+  locationNo?:string
+  //单位
+  unit?:string
+  //数量
+  num?:number
+  //批次号
+  batchCode?:string
+  //载具编号
+  vehicleCode?:string
+  position?:string
+  housetype?:string
+
+}

+ 51 - 0
entry/src/main/ets/viewmodel/wms/UserInfo.ets

@@ -0,0 +1,51 @@
+// 用户信息
+export  class UserInfo {
+  // id
+  id?: number;
+  // 仓储id
+  userId?: number;
+  // 用户名
+  userName?: string;
+  // 登录密码
+  password?: string;
+  // 组织id
+  orgId?: number;
+  // 工位id
+  stationId?: number;
+  // 用户头像
+  avatar?: string
+  // 保持登录状态(1:是 2:否)
+  maintainLoginStatus?: number;
+  // 更新时间戳
+  updateTime?: number;
+  stationCode?: string
+  stationIp?: string
+}
+
+// 用户登陆信息
+export  class UserAuthInfo {
+  // id
+  id?: number;
+  // 仓储id
+  userId?: number;
+  // 用户名
+  userName?: string;
+  // 登录密码
+  password?: string;
+  // 组织id
+  orgId?: number;
+  // 工位id
+  stationId?: number;
+  // 工位名称
+  stationName?: string;
+  // 维护站类型
+  stationDictValue?: string;
+  // 保持登录状态(1:是 2:否)
+  maintainLoginStatus?: number;
+  // 更新时间戳
+  updateTime?: number;
+  // 用户头像
+  avatar?: string;
+
+  isLogin?:boolean //是否是登录的状态
+}

+ 4 - 0
entry/src/main/resources/base/element/color.json

@@ -33,6 +33,10 @@
       "value": "#66000000"
     },
     {
+      "name":"20000000",
+      "value": "#33000000"
+    },
+    {
       "name": "30D158",
       "value": "#30D158"
     },

+ 4 - 0
entry/src/main/resources/base/element/font_size.json

@@ -9,6 +9,10 @@
       "value": "21fp"
     },
     {
+      "name": "fontSize_30",
+      "value": "45fp"
+    },
+    {
       "name": "fontSize_12",
       "value": "18fp"
     },

+ 2 - 1
entry/src/main/resources/base/profile/main_pages.json

@@ -7,6 +7,7 @@
     "pages/Menu",
     "pages/LittleMaterialsStorage",
     "pages/LittleMaterialOutBound",
-    "pages/RgvControl"
+    "pages/RgvControl",
+    "pages/IntelligentWarehousingStatics"
   ]
 }