소스 검색

三自惯系统

hh 1 년 전
커밋
027725d5ff
100개의 변경된 파일4046개의 추가작업 그리고 0개의 파일을 삭제
  1. 10 0
      AppScope/app.json5
  2. 8 0
      AppScope/resources/base/element/string.json
  3. BIN
      AppScope/resources/base/media/app_icon.png
  4. 49 0
      build-profile.json5
  5. 6 0
      entry/.gitignore
  6. 14 0
      entry/build-profile.json5
  7. 6 0
      entry/hvigorfile.ts
  8. 10 0
      entry/oh-package.json5
  9. 51 0
      entry/src/main/ets/common/component/BottomOperateComp.ets
  10. 74 0
      entry/src/main/ets/common/component/TitleStateComp.ets
  11. 20 0
      entry/src/main/ets/common/constants/CommonConstants.ets
  12. 221 0
      entry/src/main/ets/common/util/RobotControlUtil.js
  13. 24 0
      entry/src/main/ets/common/util/TimeUtil.ets
  14. 75 0
      entry/src/main/ets/entryability/EntryAbility.ets
  15. 79 0
      entry/src/main/ets/model/NumberDataSource.ets
  16. 27 0
      entry/src/main/ets/model/RobotInfo.ets
  17. 15 0
      entry/src/main/ets/model/RobotSelfCheck.ets
  18. 15 0
      entry/src/main/ets/model/StorageInfo.ets
  19. 26 0
      entry/src/main/ets/model/StorageSpace.ets
  20. 115 0
      entry/src/main/ets/model/database/RobotSelfCheckModel.ets
  21. 127 0
      entry/src/main/ets/model/database/StorageModel.ets
  22. 135 0
      entry/src/main/ets/model/database/StorageSpaceModel.ets
  23. 399 0
      entry/src/main/ets/pages/CarPage.ets
  24. 704 0
      entry/src/main/ets/pages/Form.ets
  25. 1071 0
      entry/src/main/ets/pages/ManagePage.ets
  26. 250 0
      entry/src/main/ets/pages/PointSelect.ets
  27. 55 0
      entry/src/main/ets/view/header.ets
  28. 42 0
      entry/src/main/module.json5
  29. 64 0
      entry/src/main/resources/base/element/color.json
  30. 124 0
      entry/src/main/resources/base/element/float.json
  31. 40 0
      entry/src/main/resources/base/element/string.json
  32. BIN
      entry/src/main/resources/base/media/BG.png
  33. BIN
      entry/src/main/resources/base/media/BeiJing1.png
  34. BIN
      entry/src/main/resources/base/media/KAPIAN.png
  35. BIN
      entry/src/main/resources/base/media/KaPian2.png
  36. BIN
      entry/src/main/resources/base/media/baobiao.png
  37. 4 0
      entry/src/main/resources/base/media/battery_level.svg
  38. BIN
      entry/src/main/resources/base/media/blacktriangles.png
  39. 3 0
      entry/src/main/resources/base/media/bluetooth_open.svg
  40. 3 0
      entry/src/main/resources/base/media/camera.svg
  41. BIN
      entry/src/main/resources/base/media/cangchu.png
  42. BIN
      entry/src/main/resources/base/media/car_preview.png
  43. 1 0
      entry/src/main/resources/base/media/contacts.svg
  44. 3 0
      entry/src/main/resources/base/media/coordinate.svg
  45. 3 0
      entry/src/main/resources/base/media/downblue.svg
  46. 3 0
      entry/src/main/resources/base/media/downgrey.svg
  47. BIN
      entry/src/main/resources/base/media/gongxu.png
  48. BIN
      entry/src/main/resources/base/media/head.webp
  49. 13 0
      entry/src/main/resources/base/media/home.svg
  50. 3 0
      entry/src/main/resources/base/media/home_page.svg
  51. 3 0
      entry/src/main/resources/base/media/huiseanniuR.svg
  52. 3 0
      entry/src/main/resources/base/media/huiseanniul.svg
  53. BIN
      entry/src/main/resources/base/media/ic_widget.png
  54. BIN
      entry/src/main/resources/base/media/icon.png
  55. 3 0
      entry/src/main/resources/base/media/jiaobiao.svg
  56. 3 0
      entry/src/main/resources/base/media/jinribaogu.svg
  57. 3 0
      entry/src/main/resources/base/media/jinrijihua.svg
  58. 3 0
      entry/src/main/resources/base/media/jinriwancheng.svg
  59. BIN
      entry/src/main/resources/base/media/jiqiren.png
  60. 3 0
      entry/src/main/resources/base/media/lanseanniuR.svg
  61. 3 0
      entry/src/main/resources/base/media/lanseanniul.svg
  62. 3 0
      entry/src/main/resources/base/media/leftblue.svg
  63. 3 0
      entry/src/main/resources/base/media/leftgrey.svg
  64. 10 0
      entry/src/main/resources/base/media/log_on_user.svg
  65. BIN
      entry/src/main/resources/base/media/main_background_image.png
  66. BIN
      entry/src/main/resources/base/media/nansheng.png
  67. 3 0
      entry/src/main/resources/base/media/notice.svg
  68. BIN
      entry/src/main/resources/base/media/nvsheng.png
  69. 3 0
      entry/src/main/resources/base/media/page_flow.svg
  70. 3 0
      entry/src/main/resources/base/media/rightblue.svg
  71. 3 0
      entry/src/main/resources/base/media/rightgrey.svg
  72. 11 0
      entry/src/main/resources/base/media/robot_auto_mode.svg
  73. BIN
      entry/src/main/resources/base/media/robot_toward_x_forward.png
  74. BIN
      entry/src/main/resources/base/media/robot_toward_x_negative.png
  75. BIN
      entry/src/main/resources/base/media/robot_toward_y_forward.png
  76. BIN
      entry/src/main/resources/base/media/robot_toward_y_negative.png
  77. 5 0
      entry/src/main/resources/base/media/set_robot.svg
  78. BIN
      entry/src/main/resources/base/media/set_robot_unity_background.png
  79. 3 0
      entry/src/main/resources/base/media/set_service_card.svg
  80. 5 0
      entry/src/main/resources/base/media/set_storage.svg
  81. 5 0
      entry/src/main/resources/base/media/set_user_info.svg
  82. 4 0
      entry/src/main/resources/base/media/set_voice_assistant.svg
  83. 3 0
      entry/src/main/resources/base/media/shaoma.svg
  84. BIN
      entry/src/main/resources/base/media/shezhi.png
  85. BIN
      entry/src/main/resources/base/media/start.png
  86. BIN
      entry/src/main/resources/base/media/startIcon.png
  87. BIN
      entry/src/main/resources/base/media/storage_space.png
  88. BIN
      entry/src/main/resources/base/media/storage_space_disable.png
  89. BIN
      entry/src/main/resources/base/media/storage_space_no_type.png
  90. BIN
      entry/src/main/resources/base/media/storage_space_select.gif
  91. 3 0
      entry/src/main/resources/base/media/subscript.svg
  92. 3 0
      entry/src/main/resources/base/media/upblue.svg
  93. 3 0
      entry/src/main/resources/base/media/upgrey.svg
  94. 3 0
      entry/src/main/resources/base/media/volume.svg
  95. 3 0
      entry/src/main/resources/base/media/wlan_open.svg
  96. BIN
      entry/src/main/resources/base/media/wuchunchu.png
  97. 3 0
      entry/src/main/resources/base/media/zhuliaoqitao.svg
  98. 8 0
      entry/src/main/resources/base/profile/main_pages.json
  99. 40 0
      entry/src/main/resources/en_US/element/string.json
  100. 0 0
      entry/src/main/resources/zh_CN/element/string.json

+ 10 - 0
AppScope/app.json5

@@ -0,0 +1,10 @@
+{
+  "app": {
+    "bundleName": "com.example.presentationdemo",
+    "vendor": "example",
+    "versionCode": 1000000,
+    "versionName": "1.0.0",
+    "icon": "$media:app_icon",
+    "label": "$string:app_name"
+  }
+}

+ 8 - 0
AppScope/resources/base/element/string.json

@@ -0,0 +1,8 @@
+{
+  "string": [
+    {
+      "name": "app_name",
+      "value": "PresentationDemo"
+    }
+  ]
+}

BIN
AppScope/resources/base/media/app_icon.png


+ 49 - 0
build-profile.json5

@@ -0,0 +1,49 @@
+{
+  "app": {
+    "signingConfigs": [
+      {
+        "name": "default",
+        "type": "HarmonyOS",
+        "material": {
+          "certpath": "C:\\Users\\Administrator\\.ohos\\config\\auto_debug_PresentationDemo_com.example.presentationdemo_80086000143711705.cer",
+          "storePassword": "0000001B3F97189751A1C42CD93BC0F1046B4E7EC077A114CA80BAE784878BC60AFD76B7A4356E169EFDF7",
+          "keyAlias": "debugKey",
+          "keyPassword": "0000001B05BC1E0531A45069934F2F1D9A986351B30D4679A0B35B54331EC6EB3A8B9D23624B539F4F75D8",
+          "profile": "C:\\Users\\Administrator\\.ohos\\config\\auto_debug_PresentationDemo_com.example.presentationdemo_80086000143711705.p7b",
+          "signAlg": "SHA256withECDSA",
+          "storeFile": "C:\\Users\\Administrator\\.ohos\\config\\auto_debug_PresentationDemo_com.example.presentationdemo_80086000143711705.p12"
+        }
+      }
+    ],
+    "compileSdkVersion": 9,
+    "compatibleSdkVersion": 9,
+    "products": [
+      {
+        "name": "default",
+        "signingConfig": "default",
+      }
+    ],
+    "buildModeSet": [
+      {
+        "name": "debug",
+      },
+      {
+        "name": "release"
+      }
+    ]
+  },
+  "modules": [
+    {
+      "name": "entry",
+      "srcPath": "./entry",
+      "targets": [
+        {
+          "name": "default",
+          "applyToProducts": [
+            "default"
+          ]
+        }
+      ]
+    }
+  ]
+}

+ 6 - 0
entry/.gitignore

@@ -0,0 +1,6 @@
+/node_modules
+/oh_modules
+/.preview
+/build
+/.cxx
+/.test

+ 14 - 0
entry/build-profile.json5

@@ -0,0 +1,14 @@
+{
+  "apiType": "stageMode",
+  "buildOption": {
+  },
+  "targets": [
+    {
+      "name": "default",
+      "runtimeOS": "HarmonyOS"
+    },
+    {
+      "name": "ohosTest",
+    }
+  ]
+}

+ 6 - 0
entry/hvigorfile.ts

@@ -0,0 +1,6 @@
+import { hapTasks } from '@ohos/hvigor-ohos-plugin';
+
+export default {
+    system: hapTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */
+    plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */
+}

+ 10 - 0
entry/oh-package.json5

@@ -0,0 +1,10 @@
+{
+  "license": "",
+  "devDependencies": {},
+  "author": "",
+  "name": "entry",
+  "description": "Please describe the basic information.",
+  "main": "",
+  "version": "1.0.0",
+  "dependencies": {}
+}

+ 51 - 0
entry/src/main/ets/common/component/BottomOperateComp.ets

@@ -0,0 +1,51 @@
+import router from '@ohos.router'
+/*
+ * 底部操作栏
+ * */
+@Component
+export struct BottomOperateComp {
+  private isHomePage: boolean
+
+  build() {
+    Stack() {
+      Text()
+        .width('100%')
+        .height('100%')
+        .backgroundColor($r('app.color.bottom_bar_background'))
+        .opacity(this.isHomePage ? $r('app.float.bottom_bar_home_page_opacity') : $r('app.float.bottom_bar_general_opacity'))
+        .backdropBlur(this.isHomePage ? 13 : 0)
+
+      Row() {
+        Image($r('app.media.home_page'))
+          .height($r('app.float.general_icon_size'))
+          .width($r('app.float.general_icon_size'))
+          .onClick(()=>{
+            router.pushUrl({
+              url:'pages/Index'
+            })
+          })
+
+        Image($r('app.media.notice'))
+          .height($r('app.float.general_icon_size'))
+          .width($r('app.float.general_icon_size'))
+
+        Image($r('app.media.page_flow'))
+          .height($r('app.float.general_icon_size'))
+          .width($r('app.float.general_icon_size'))
+
+        Image($r('app.media.camera'))
+          .height($r('app.float.general_icon_size'))
+          .width($r('app.float.general_icon_size'))
+
+        Image($r('app.media.volume'))
+          .height($r('app.float.general_icon_size'))
+          .width($r('app.float.general_icon_size'))
+      }
+      .width('36%')
+      .height('100%')
+      .justifyContent(FlexAlign.SpaceEvenly)
+    }
+    .width('100%')
+    .height('8%')
+  }
+}

+ 74 - 0
entry/src/main/ets/common/component/TitleStateComp.ets

@@ -0,0 +1,74 @@
+import TimeUtil from '../util/TimeUtil'
+/*
+ * 顶部状态栏
+ * */
+@Component
+export struct TitleStateComp {
+  private isHomePage: boolean
+
+  controller: TextClockController = new TextClockController()
+  build() {
+    Stack() {
+      Text()
+        .width('100%')
+        .height('100%')
+        .backgroundColor($r('app.color.title_bar_background'))
+        .opacity(this.isHomePage ? $r('app.float.title_bar_home_page_opacity') : $r('app.float.title_bar_general_opacity'))
+
+      Row() {
+        Row() {
+          Image($r('app.media.home'))
+            .objectFit(ImageFit.Contain)
+        }
+        .width('12%')
+        .height('90%')
+        .alignItems(VerticalAlign.Center)
+        .justifyContent(FlexAlign.Center)
+        .margin({left: 10 , top: 5})
+        Blank()
+        Column() {
+          Text(TimeUtil.getCurrentDate())
+            .fontColor($r('app.color.general_font_color'))
+            .fontSize($r('app.float.title_date_font_size'))
+            .fontWeight(FontWeight.Regular)
+          TextClock({ timeZoneOffset: -8, controller: this.controller })
+            .format('HH:mm:ss')
+            .fontSize($r('app.float.title_time_font_size'))
+            .fontWeight(FontWeight.Bold)
+        }
+        .height('100%')
+        .width('6%')
+        .alignItems(HorizontalAlign.Center)
+        .justifyContent(FlexAlign.Center)
+        Blank()
+        Row() {
+          Image($r('app.media.bluetooth_open'))
+            .width($r('app.float.title_icon_size'))
+            .height($r('app.float.title_icon_size'))
+
+          Image($r('app.media.battery_level'))
+            .width($r('app.float.title_icon_size'))
+            .height($r('app.float.title_icon_size'))
+
+          Image($r('app.media.wlan_open'))
+            .width($r('app.float.title_icon_size'))
+            .height($r('app.float.title_icon_size'))
+
+          Image($r('app.media.log_on_user'))
+            .width($r('app.float.title_icon_size'))
+            .height($r('app.float.title_icon_size'))
+        }
+        .width('16%')
+        .height('90%')
+        .alignItems(VerticalAlign.Center)
+        .justifyContent(FlexAlign.SpaceEvenly)
+      }
+      .width('100%')
+      .height('100%')
+      .alignItems(VerticalAlign.Center)
+      .justifyContent(FlexAlign.Center)
+    }
+    .width('100%')
+    .height('8%')
+  }
+}

+ 20 - 0
entry/src/main/ets/common/constants/CommonConstants.ets

@@ -0,0 +1,20 @@
+import RobotInfo from '../../model/RobotInfo'
+import StorageInfo from '../../model/StorageInfo'
+
+export default class CommonConstants {
+
+  static readonly RDB_NAME : string = 'Presentation.db'
+
+  static readonly STORAGE_TYPE: string[] =  ['电子元器件', '电路板', '结构件', '辅助材料']
+  static readonly PARK_TYPE: string[] =  ['出入库位置', '充电位置', '工作台', '其他']
+
+  static readonly ROBOTS: RobotInfo[] = [
+    {id:1, robotCode:'JGRR1135554213', storageId:1, robotToward: 2, x:3, y:2, lastSelfCheck: '2024/02/16 11:11:34'},
+    {id:2, robotCode:'JGRR1123554233', storageId:1, robotToward: 1, x:1, y:2, lastSelfCheck: '2024/02/16 10:56:34'},
+    {id:3, robotCode:'JGRR1147006978', storageId:1, robotToward: 3, x:6, y:2, lastSelfCheck: '2024/02/16 14:23:34'},
+  ]
+
+  static readonly STORAGES: StorageInfo[] = [
+    {id:1, storageName:'晶格智能仓储1', xSize:7, ySize: 5, defaultLayer:5},
+  ]
+}

+ 221 - 0
entry/src/main/ets/common/util/RobotControlUtil.js

@@ -0,0 +1,221 @@
+class RobotControlUtil {
+
+    /**
+     * 查询机器人当前模式
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果(1:成功 2:失败)
+     * 		    Array[1]: 失败原因
+     * 		    Array[2]: 机器人模式(???? 1:调试模式 2:自动模式)
+     */
+    static queryMode (robotId){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 查询机器人当前坐标
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果(1:成功 2:失败)
+     * 		    Array[1]: 失败原因
+     * 		    Array[2]: x坐标
+     * 		    Array[3]: y坐标
+     * 		    Array[4]: 仓储机器人的朝向(1:+x 2:-x 3:+y 4:-y)
+     */
+    static queryCoordinate (robotId){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 查询机器人当前状态
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果(1:成功 2:失败)
+     * 		    Array[1]: 失败原因
+     * 		    Array[2]: 状态(????? 1:充电中 2:未充电)
+     */
+    static queryState (robotId){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 查询机器人电量
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果(1:成功 2:失败)
+     * 		    Array[1]: 失败原因
+     * 		    Array[2]: 电量(?????百分比 80/80%)
+     */
+    static queryBatteryLevel (robotId){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 查询机器人电压
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果(1:成功 2:失败)
+     * 		    Array[1]: 失败原因
+     * 		    Array[2]: 电压值
+     * 		    Array[3]: 电压值
+     */
+    static queryVoltage (robotId){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 查询机器人电流
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果(1:成功 2:失败)
+     * 		    Array[1]: 失败原因
+     * 		    Array[2]: 电流值
+     * 		    Array[3]: 电流值
+     */
+    static queryCurrent (robotId){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 移动指定坐标
+     * @param   robotId: 机器人id
+     *          x: x坐标
+     *          y: y坐标
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static moveTo (robotId, x, y){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 修改模式
+     * @param   robotId: 机器人id
+     *          modeType: 机器人模式(???? 1:调试模式 2:自动模式)
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static editMode (robotId, modeType){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 电机控制(通电/断电)
+     * @param   robotId: 机器人id
+     *          motorSet: 电机控制(1:通电 2:断电)
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static motorControl (robotId, motorSet){
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 修改机器人坐标
+     * @param   robotId: 机器人id
+     *          x: x坐标
+     *          y: y坐标
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static editCoordinate (robotId, x, y) {
+        var array = new Array();
+        array.push("1");
+        array.push("2");
+        return array;
+    }
+
+    /**
+     * 机器人移动一格
+     * @param   robotId: 机器人id
+     *          direction:(1:+x 2:-x 3:+y 4:-y)
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static moveOneGrid (robotId, direction) { }
+
+    /**
+     * 机器人中止
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static breakOff (robotId) { }
+
+    /**
+     * 机器人急停
+     * @param   robotId: 机器人id
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static emergencyStop (robotId) { }
+
+    /**
+     * 车轮控制
+     * @param   robotId: 机器人id
+     *          wheelSet: 设置车轮(1:置顶 2:置中 3:置底)
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static wheelControl (robotId, wheelSet) { }
+
+    /**
+     * 吊篮控制
+     * @param   robotId: 机器人id
+     *          basketSet: 吊篮设置(1:提起 2:放下 3:急停)
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static basketControl (robotId, basketSet) { }
+
+    /**
+     * 爪夹控制
+     * @param   robotId: 机器人id
+     *          clawSet: 爪夹控制(1:张开 2:闭合)
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static clawControl (robotId, clawSet) { }
+
+    /**
+     * 充电控制
+     * @param   robotId: 机器人id
+     *          chargeSet: 充电控制(1:张开 2:闭合)
+     * @return  Array[0]: 执行结果
+     * 		    Array[1]: 失败信息
+     * 		    Array[2]: …………
+     */
+    static chargeControl (robotId, chargeSet) { }
+}

+ 24 - 0
entry/src/main/ets/common/util/TimeUtil.ets

@@ -0,0 +1,24 @@
+class TimeUtil {
+
+  getCurrentDate(): string {
+    let dateTime = new Date()
+    let month: string = JSON.stringify(dateTime.getMonth() + 1)
+    let time = dateTime.getFullYear() + '-' + (dateTime.getMonth() + 1).toString().padStart(2, '0')
+      + '-' + (dateTime.getDate().toString().padStart(2, '0'))
+    return time
+  }
+
+  getCurrentTime(): string {
+    let dateTime = new Date()
+    let time = dateTime.getFullYear() + '-' + (dateTime.getMonth() + 1).toString().padStart(2, '0')
+      + '-' + (dateTime.getDate().toString().padStart(2, '0')) + ' ' +
+      (dateTime.getHours().toString().length == 1 ? '0' + dateTime.getHours() : dateTime.getHours()) + ':'
+      + (dateTime.getMinutes().toString().length == 1 ? '0' + dateTime.getMinutes() : dateTime.getMinutes()) + ':'
+      + (dateTime.getSeconds().toString().length == 1 ? '0'+ dateTime.getSeconds(): dateTime.getSeconds())
+    return time
+  }
+}
+
+let timeUtil = new TimeUtil();
+
+export default timeUtil as TimeUtil;

+ 75 - 0
entry/src/main/ets/entryability/EntryAbility.ets

@@ -0,0 +1,75 @@
+import AbilityConstant from '@ohos.app.ability.AbilityConstant';
+import hilog from '@ohos.hilog';
+import UIAbility from '@ohos.app.ability.UIAbility';
+import Want from '@ohos.app.ability.Want';
+import window from '@ohos.window';
+import RobotSelfCheckModel from '../model/database/RobotSelfCheckModel';
+import StorageModel from '../model/database/StorageModel';
+import StorageSpaceModel from '../model/database/StorageSpaceModel';
+
+export default class EntryAbility extends UIAbility {
+  onCreate(want: Want, launchParam: AbilityConstant.LaunchParam): void {
+    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onCreate');
+    // 初始化表
+    RobotSelfCheckModel.initTaskDB(this.context)
+    StorageSpaceModel.initTaskDB(this.context)
+    StorageModel.initTaskDB(this.context)
+  }
+
+  onDestroy(): void {
+    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onDestroy');
+  }
+
+  onWindowStageCreate(windowStage: window.WindowStage): void {
+    // Main window is created, set main page for this ability
+    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageCreate');
+    // 1.获取应用主窗口。
+    let windowClass = null;
+    windowStage.getMainWindow((err, data) => {
+
+      if (err.code) {
+        console.error('Failed to obtain the main window. Cause: ' + JSON.stringify(err));
+        return;
+      }
+
+      windowClass = data;
+      console.info('Succeeded in obtaining the main window. Data: ' + JSON.stringify(data));
+
+
+      // 2.实现沉浸式效果:设置导航栏、状态栏不显示。
+      let names = [];
+      windowClass.setWindowSystemBarEnable(names, (err) => {
+        if (err.code) {
+          console.error('Failed to set the system bar to be visible. Cause:' + JSON.stringify(err));
+          return;
+        }
+        console.info('Succeeded in setting the system bar to be visible.');
+      });
+
+      windowClass.setWindowLayoutFullScreen(true)
+    })
+
+    windowStage.loadContent('pages/Index', (err, data) => {
+      if (err.code) {
+        hilog.error(0x0000, 'testTag', 'Failed to load the content. Cause: %{public}s', JSON.stringify(err) ?? '');
+        return;
+      }
+      hilog.info(0x0000, 'testTag', 'Succeeded in loading the content. Data: %{public}s', JSON.stringify(data) ?? '');
+    });
+  }
+
+  onWindowStageDestroy(): void {
+    // Main window is destroyed, release UI related resources
+    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onWindowStageDestroy');
+  }
+
+  onForeground(): void {
+    // Ability has brought to foreground
+    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onForeground');
+  }
+
+  onBackground(): void {
+    // Ability has back to background
+    hilog.info(0x0000, 'testTag', '%{public}s', 'Ability onBackground');
+  }
+}

+ 79 - 0
entry/src/main/ets/model/NumberDataSource.ets

@@ -0,0 +1,79 @@
+class BasicDataSource implements IDataSource {
+  private listeners: DataChangeListener[] = [];
+  private originDataArray: number[] = [];
+
+  public totalCount(): number {
+    return 0;
+  }
+
+  public getData(index: number): number {
+    return this.originDataArray[index];
+  }
+
+  // 该方法为框架侧调用,为LazyForEach组件向其数据源处添加listener监听
+  registerDataChangeListener(listener: DataChangeListener): void {
+    if (this.listeners.indexOf(listener) < 0) {
+      console.info('add listener');
+      this.listeners.push(listener);
+    }
+  }
+
+  // 该方法为框架侧调用,为对应的LazyForEach组件在数据源处去除listener监听
+  unregisterDataChangeListener(listener: DataChangeListener): void {
+    const pos = this.listeners.indexOf(listener);
+    if (pos >= 0) {
+      console.info('remove listener');
+      this.listeners.splice(pos, 1);
+    }
+  }
+
+  // 通知LazyForEach组件需要重载所有子组件
+  notifyDataReload(): void {
+    this.listeners.forEach(listener => {
+      listener.onDataReloaded();
+    })
+  }
+
+  // 通知LazyForEach组件需要在index对应索引处添加子组件
+  notifyDataAdd(index: number): void {
+    this.listeners.forEach(listener => {
+      listener.onDataAdd(index);
+    })
+  }
+
+  // 通知LazyForEach组件在index对应索引处数据有变化,需要重建该子组件
+  notifyDataChange(index: number): void {
+    this.listeners.forEach(listener => {
+      listener.onDataChange(index);
+    })
+  }
+
+  // 通知LazyForEach组件需要在index对应索引处删除该子组件
+  notifyDataDelete(index: number): void {
+    this.listeners.forEach(listener => {
+      listener.onDataDelete(index);
+    })
+  }
+}
+
+export default class NumberDataSource extends BasicDataSource {
+  private dataArray: number[] = [];
+
+  public totalCount(): number {
+    return this.dataArray.length;
+  }
+
+  public getData(index: number): number {
+    return this.dataArray[index];
+  }
+
+  public addData(index: number, data: number): void {
+    this.dataArray.splice(index, 0, data);
+    this.notifyDataAdd(index);
+  }
+
+  public pushData(data: number): void {
+    this.dataArray.push(data);
+    this.notifyDataAdd(this.dataArray.length - 1);
+  }
+}

+ 27 - 0
entry/src/main/ets/model/RobotInfo.ets

@@ -0,0 +1,27 @@
+export default class RobotInfo {
+  // id
+  id: number;
+  // 机器人编码
+  robotCode: string = '';
+  // 所属仓库id
+  storageId: number;
+  // 机器人位置x坐标
+  x: number = 0
+  // 机器人位置y坐标
+  y: number = 0
+  //机器人的朝向(1:x+ 2:x- 3:y+ 4:y-)
+  robotToward: number = 0
+  // 上次自检日期
+  lastSelfCheck : string
+  //车类型(1:轨道 2:仓储)
+  // carType: number = 2
+  // //车状态(1:异常 2:空闲 3:运行)
+  // carState: number = 0
+  // // 仓储车悬臂x坐标
+  // armX: number
+  // // 仓储车悬臂y坐标
+  // armY: number
+  //
+  // //异常信息
+  // errorMsg?: string
+}

+ 15 - 0
entry/src/main/ets/model/RobotSelfCheck.ets

@@ -0,0 +1,15 @@
+@Observed
+export default class RobotSelfCheck {
+  // id
+  id: number
+  // 机器人id
+  robotId : number
+  // 检查项名称
+  checkName: string
+  // 检查时间
+  checkTime: string
+  // 检查状态(1:正常 2:故障)
+  checkStatus?: number
+  // 故障原因
+  faultCause?: string
+}

+ 15 - 0
entry/src/main/ets/model/StorageInfo.ets

@@ -0,0 +1,15 @@
+/*
+ * 仓储信息表
+ * */
+export default class StorageInfo {
+  // id
+  id: number;
+  // 仓库名称
+  storageName: string = '';
+  // x大小
+  xSize: number;
+  // y大小
+  ySize: number;
+  //默认层数
+  defaultLayer: number
+}

+ 26 - 0
entry/src/main/ets/model/StorageSpace.ets

@@ -0,0 +1,26 @@
+/*
+ * 仓储储位表
+ * */
+@Observed
+export default class StorageSpace {
+  // id
+  id: number;
+  // 仓储id
+  storageId: number;
+  // x坐标
+  x: number;
+  // y坐标
+  y: number;
+  // 启用状态(1:启用 2:禁用)
+  enableState: number
+  // 仓储类型(多个用逗号隔开)(1:电子元器件 2:电路板 3:结构件 4:辅助材料)
+  storageType: string
+  // 容量(单位:层)
+  capacity: number
+  // 能否途经(1:启用 2:禁用)
+  canWay: number
+  // 是否为停靠点(1:是 2:否)
+  canPark: number
+  // 停靠点类型(1:出入库位置 2:充电位置 3:工作台 4:其他)
+  parkType: number
+}

+ 115 - 0
entry/src/main/ets/model/database/RobotSelfCheckModel.ets

@@ -0,0 +1,115 @@
+import relationalStore from '@ohos.data.relationalStore';
+import CommonConstants from '../../common/constants/CommonConstants';
+import RobotSelfCheck from '../RobotSelfCheck';
+
+class RobotSelfCheckModel {
+
+  private rdbStore: relationalStore.RdbStore
+  private tableName: string = 'ROBOT_SELF_CHECK'
+
+  /**
+   * 初始化表
+   */
+  initTaskDB(context){
+    // 1.rdb配置
+    const config = {
+      name: CommonConstants.RDB_NAME,
+      securityLevel: relationalStore.SecurityLevel.S1
+    }
+    // 2.初始化SQL语句
+    const sql = `CREATE TABLE IF NOT EXISTS ROBOT_SELF_CHECK (
+                  ID INTEGER PRIMARY KEY AUTOINCREMENT,
+                  ROBOT_ID INTEGER NOT NULL,
+                  CHECK_NAME TEXT NOT NULL,
+                  CHECK_TIME TEXT NULL,
+                  CHECK_STATUS INTEGER NULL,
+                  FAULT_CAUSE TEXT 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=>{
+        console.log('testTag', '创建失败')
+      })
+
+      // 保存rdbStore
+      this.rdbStore = rdbStore
+    })
+  }
+
+  /**
+   * 查询自检列表
+   */
+  async getListByRobotId(robotId: number){
+    // 1.构建查询条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ROBOT_ID', robotId)
+    // 2.查询
+    let result = await this.rdbStore.query(predicates, ['ID', 'ROBOT_ID', 'CHECK_NAME', 'CHECK_TIME', 'CHECK_STATUS'])
+    // 3.解析查询结果
+    // 3.1.定义一个数组,组装最终的查询结果
+    let checks: RobotSelfCheck[] = []
+    // 3.2.遍历封装
+    while(!result.isAtLastRow){
+      // 3.3.指针移动到下一行
+      result.goToNextRow()
+      // 3.4.获取数据
+      let id = result.getLong(result.getColumnIndex('ID'))
+      let robotId = result.getLong(result.getColumnIndex('ROBOT_ID'))
+      let checkName = result.getString(result.getColumnIndex('CHECK_NAME'))
+      let checkTime = result.getString(result.getColumnIndex('CHECK_TIME'))
+      let checkStatus = result.getLong(result.getColumnIndex('CHECK_STATUS'))
+      // 3.5.封装到数组
+      checks.push({id, robotId, checkName, checkTime, checkStatus})
+    }
+    console.log('testTag', '查询到数据:', JSON.stringify(checks))
+    return checks
+  }
+
+  /**
+   * 添加一个新的机器人自检
+   * @param robotId 机器人id
+   * @param checkName 自检项名称
+   * @param checkTime 自检时间
+   * @returns 自检id
+   */
+  addRobotSelfCheck(robotId: number, checkName: string, checkTime: string): Promise<number>{
+      return this.rdbStore.insert(this.tableName, {ROBOT_ID: robotId, CHECK_NAME: checkName, CHECK_TIME: checkTime})
+  }
+
+  /**
+   * 根据id更新自检状态
+   * @param id 任务id
+   * @param finished 任务是否完成
+   */
+  updateStatus(id: number, checkStatus: number, faultCause: string) {
+    // 1.要更新的数据
+    let data = {CHECK_STATUS: checkStatus, FAULT_CAUSE: faultCause}
+    // 2.更新的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', id)
+    // 3.更新操作
+    return this.rdbStore.update(data, predicates)
+  }
+  /**
+   * 根据id删除自检
+   * @param id 任务id
+   */
+  deleteRobotSelfCheckById(id: number){
+    // 1.删除的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', id)
+    // 2.删除操作
+    return this.rdbStore.delete(predicates)
+  }
+}
+
+let robotSelfCheckModel = new RobotSelfCheckModel();
+
+export default robotSelfCheckModel as RobotSelfCheckModel;

+ 127 - 0
entry/src/main/ets/model/database/StorageModel.ets

@@ -0,0 +1,127 @@
+import relationalStore from '@ohos.data.relationalStore';
+import CommonConstants from '../../common/constants/CommonConstants';
+import StorageInfo from '../StorageInfo';
+import StorageSpaceModel from './StorageSpaceModel';
+
+class StorageModel {
+
+  private rdbStore: relationalStore.RdbStore
+  private tableName: string = 'STORAGE'
+
+  private storages: StorageInfo[] = CommonConstants.STORAGES
+
+  /**
+   * 初始化表
+   */
+  initTaskDB(context){
+    // 1.rdb配置
+    const config = {
+      name: CommonConstants.RDB_NAME,
+      securityLevel: relationalStore.SecurityLevel.S1
+    }
+    // 2.初始化SQL语句
+    const sql = `CREATE TABLE IF NOT EXISTS STORAGE (
+                  ID INTEGER PRIMARY KEY AUTOINCREMENT,
+                  STORAGE_NAME TEXT NOT NULL,
+                  X_SIZE INTEGER NULL,
+                  Y_SIZE INTEGER NULL,
+                  DEFAULT_LAYER INTEGER 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=>{
+        console.log('testTag', '创建失败')
+      })
+      // 保存rdbStore
+      this.rdbStore = rdbStore
+      for (const storage of this.storages) {
+        this.addStorage(storage.storageName, storage.xSize, storage.ySize, storage.defaultLayer).then((id)=>{
+          if (storage.xSize && storage.xSize > 0 && storage.ySize && storage.ySize > 0) {
+            for (let y = 1; y <= storage.ySize; y++) {
+              for (let x = 1; x <= storage.xSize; x++) {
+                StorageSpaceModel.addStorageSpace(id, x, y, 1, '1,2,3,4', storage.defaultLayer, 1, 2)
+              }
+            }
+          }
+        })
+      }
+    })
+  }
+
+  /**
+   * 查询仓储列表
+   */
+  async getStorageList(){
+    // 1.构建查询条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    // 2.查询
+    let result = await this.rdbStore.query(predicates, ['ID', 'STORAGE_NAME', 'X_SIZE', 'Y_SIZE', 'DEFAULT_LAYER'])
+    // 3.解析查询结果
+    // 3.1.定义一个数组,组装最终的查询结果
+    let storages: StorageInfo[] = []
+    // 3.2.遍历封装
+    while(!result.isAtLastRow){
+      // 3.3.指针移动到下一行
+      result.goToNextRow()
+      // 3.4.获取数据
+      let id = result.getLong(result.getColumnIndex('ID'))
+      let storageName = result.getString(result.getColumnIndex('STORAGE_NAME'))
+      let xSize = result.getLong(result.getColumnIndex('X_SIZE'))
+      let ySize = result.getLong(result.getColumnIndex('Y_SIZE'))
+      let defaultLayer = result.getLong(result.getColumnIndex('DEFAULT_LAYER'))
+      // 3.5.封装到数组
+      storages.push({id, storageName, xSize, ySize, defaultLayer})
+    }
+    console.log('testTag', '查询到数据:', JSON.stringify(storages))
+    return storages
+  }
+
+  /**
+   * 添加仓储
+   * @param storageName 仓储名称
+   * @param xSize x尺寸
+   * @param ySize y尺寸
+   * @param defaultLayer 默认尺寸
+   * @returns 仓储id
+   */
+  addStorage(storageName: string, xSize: number, ySize: number, defaultLayer: number): Promise<number>{
+      return this.rdbStore.insert(this.tableName, {STORAGE_NAME: storageName, X_SIZE: xSize, Y_SIZE: ySize, DEFAULT_LAYER: defaultLayer})
+  }
+
+  /**
+   * 根据id更新仓储状态
+   * @param id 任务id
+   * @param finished 任务是否完成
+   */
+  updateStorage(id: number, storageName: string, xSize: number, ySize: number, defaultLayer: number) {
+    // 1.要更新的数据
+    let data = {STORAGE_NAME: storageName, X_SIZE: xSize, Y_SIZE: ySize, DEFAULT_LAYER: defaultLayer}
+    // 2.更新的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', id)
+    // 3.更新操作
+    return this.rdbStore.update(data, predicates)
+  }
+  /**
+   * 根据id删除任务
+   * @param id 任务id
+   */
+  deleteStorageById(id: number){
+    // 1.删除的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', id)
+    // 2.删除操作
+    return this.rdbStore.delete(predicates)
+  }
+}
+
+let storageModel = new StorageModel();
+
+export default storageModel as StorageModel;

+ 135 - 0
entry/src/main/ets/model/database/StorageSpaceModel.ets

@@ -0,0 +1,135 @@
+import relationalStore from '@ohos.data.relationalStore';
+import CommonConstants from '../../common/constants/CommonConstants';
+import StorageSpace from '../StorageSpace';
+
+class StorageSpaceModel {
+
+  private rdbStore: relationalStore.RdbStore
+  private tableName: string = 'STORAGE_SPACE'
+
+  /**
+   * 初始化表
+   */
+  initTaskDB(context){
+    // 1.rdb配置
+    const config = {
+      name: CommonConstants.RDB_NAME,
+      securityLevel: relationalStore.SecurityLevel.S1
+    }
+    // 2.初始化SQL语句
+    const sql = `CREATE TABLE IF NOT EXISTS STORAGE_SPACE (
+                  ID INTEGER PRIMARY KEY AUTOINCREMENT,
+                  STORAGE_ID INTEGER NOT NULL,
+                  X INTEGER NULL,
+                  Y INTEGER NULL,
+                  ENABLE_STATE INTEGER NULL,
+                  STORAGE_TYPE TEXT NULL,
+                  CAPACITY INTEGER NULL,
+                  CAN_WAY INTEGER NULL,
+                  CAN_PARK INTEGER NULL,
+                  PARK_TYPE INTEGER 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=>{
+        console.log('testTag', '创建失败')
+      })
+      // 保存rdbStore
+      this.rdbStore = rdbStore
+    })
+  }
+
+  /**
+   * 查询储位列表
+   */
+  async getListByStorageId(storageId: number){
+    // 1.构建查询条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('STORAGE_ID', storageId)
+    predicates.orderByAsc('Y')
+    predicates.orderByAsc('X')
+
+    // 2.查询
+    let result = await this.rdbStore.query(predicates, ['ID', 'STORAGE_ID', 'X', 'Y', 'ENABLE_STATE', 'STORAGE_TYPE', 'CAPACITY', 'CAN_WAY', 'CAN_PARK', 'PARK_TYPE'])
+    // 3.解析查询结果
+    // 3.1.定义一个数组,组装最终的查询结果
+    let spaces: StorageSpace[] = []
+    // 3.2.遍历封装
+    while(!result.isAtLastRow){
+      // 3.3.指针移动到下一行
+      result.goToNextRow()
+      // 3.4.获取数据
+      let id = result.getLong(result.getColumnIndex('ID'))
+      let storageId = result.getLong(result.getColumnIndex('STORAGE_ID'))
+      let x = result.getLong(result.getColumnIndex('X'))
+      let y = result.getLong(result.getColumnIndex('Y'))
+      let enableState = result.getLong(result.getColumnIndex('ENABLE_STATE'))
+      let storageType = result.getString(result.getColumnIndex('STORAGE_TYPE'))
+      let capacity = result.getLong(result.getColumnIndex('CAPACITY'))
+      let canWay = result.getLong(result.getColumnIndex('CAN_WAY'))
+      let canPark = result.getLong(result.getColumnIndex('CAN_PARK'))
+      let parkType = result.getLong(result.getColumnIndex('PARK_TYPE'))
+      // 3.5.封装到数组
+      spaces.push({id, storageId, x, y, enableState, storageType, capacity, canWay, canPark, parkType})
+    }
+    console.log('testTag', '查询到数据:', JSON.stringify(spaces))
+    return spaces
+  }
+
+  /**
+   * 添加储位
+   * @param storageId 储位id
+   * @param x x坐标
+   * @param y y坐标
+   * @param ySize y尺寸
+   * @param enableState 启用状态
+   * @param storageType 仓储类型
+   * @param capacity 容量
+   * @param canWay 能否途经
+   * @param canPark 是否为停靠点
+   * @param parkType 停靠点类型
+   * @returns 储位id
+   */
+  addStorageSpace(storageId: number, x: number, y: number, enableState: number, storageType: string, capacity: number, canWay: number, canPark: number, parkType?: number): Promise<number>{
+      return this.rdbStore.insert(this.tableName, {STORAGE_ID: storageId, X: x, Y: y, ENABLE_STATE: enableState, STORAGE_TYPE: storageType, CAPACITY: capacity,
+        CAN_WAY: canWay, CAN_PARK: canPark, PARK_TYPE: parkType})
+  }
+
+  /**
+   * 根据id更新储位
+   * @param id 任务id
+   * @param finished 任务是否完成
+   */
+  updateStorageSpace(id: number, enableState: number, storageType: string, capacity: number, canWay: number, canPark: number, parkType: number) {
+    // 1.要更新的数据
+    let data = {ENABLE_STATE: enableState, STORAGE_TYPE: storageType, CAPACITY: capacity, CAN_WAY: canWay, CAN_PARK: canPark, PARK_TYPE: parkType}
+    // 2.更新的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', id)
+    // 3.更新操作
+    return this.rdbStore.update(data, predicates)
+  }
+
+  /**
+   * 根据id删除储位
+   * @param id 任务id
+   */
+  deleteStorageSpaceById(id: number){
+    // 1.删除的条件
+    let predicates = new relationalStore.RdbPredicates(this.tableName)
+    predicates.equalTo('ID', id)
+    // 2.删除操作
+    return this.rdbStore.delete(predicates)
+  }
+}
+
+let storageSpaceModel = new StorageSpaceModel();
+
+export default storageSpaceModel as StorageSpaceModel;

+ 399 - 0
entry/src/main/ets/pages/CarPage.ets

@@ -0,0 +1,399 @@
+import { header } from '../view/header'
+import router from '@ohos.router'
+/*底盘异常状态信息类*/
+export class ErrorType{
+  type1:boolean
+  type2:boolean
+  type3:boolean
+  type4:boolean
+
+  constructor(type1:boolean, type2:boolean, type3:boolean, type4:boolean) {
+    this.type1=type1
+    this.type3=type3
+    this.type2=type2
+    this.type4=type4
+  }
+}
+
+/*任务信息卡片内容类*/
+export class task_information {
+  id: string
+  time: string
+  leader: string
+
+  constructor(id: string, time: string, leader: string) {
+    this.id = id
+    this.time = time
+    this.leader = leader
+  }
+}
+@Entry
+@Component
+export struct carPage{
+
+  /*底盘异常状态信息*/
+  @State errorType:ErrorType=new ErrorType(false,true,false,true)
+  /*自动模式*/
+  @State isAutomode: boolean = true
+  /*底盘移速档位*/
+  @State dipanSpeed: number = 1
+  /*Z轴移速档位*/
+  @State zzhouSpeed: number = 1
+  /*转动方向,正转true反转false*/
+  @State turnDirection: boolean = true
+  /*底盘移速自定义输入框输入内容*/
+  @State inputSpeed: string = ''
+  /*Z轴升降控制方向上升true下降false*/
+  @State verticalDirection:boolean=true
+  /*水平移动方向后退true,前进false*/
+  @State horizontalDirection:boolean=true
+  /*任务信息卡片内容*/
+  private taskItem:any =  router.getParams()
+
+  build(){
+    Column() {
+      header({index:1})
+      Row() {
+        Text('装卸车监控')
+          .margin('5%')
+          .height('100%')
+          .fontSize(8)
+          .margin(24)
+          .fontColor('#696969')
+      }.width('100%').height('3%').backgroundColor(Color.White)
+      Divider()
+      Row() {
+        Column() {
+          Column({ space: 20 }) {
+            Text("任务信息")
+              .textAlign(TextAlign.Center)
+              .width('100%')
+              .height('10%')
+              .fontSize(15)
+              .margin(10)
+            Row() {
+              Column({ space: 5 }) {
+                Text("使用温箱:")
+                  .textAlign(TextAlign.Center)
+                  .fontSize(10)
+                Text("开始时间:")
+                  .textAlign(TextAlign.Center)
+                  .fontSize(10)
+                Text("负责人:")
+                  .textAlign(TextAlign.Center)
+                  .fontSize(10)
+              }
+              .height('50%')
+              .alignItems(HorizontalAlign.End)
+              .justifyContent(FlexAlign.SpaceBetween)
+
+              Column() {
+                Text(this.taskItem.id)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(10)
+                  .fontColor(Color.Blue)
+                  .margin({ left: 10 })
+                Text(this.taskItem.time)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(10)
+                  .fontColor(Color.Blue)
+                  .margin({ left: 10 })
+                Text(this.taskItem.leader)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(10)
+                  .fontColor(Color.Blue)
+                  .margin({ left: 10 })
+              }
+              .height('50%')
+              .alignItems(HorizontalAlign.Start)
+              .justifyContent(FlexAlign.SpaceBetween)
+            }
+          }
+          .justifyContent(FlexAlign.Start)
+          .width('100%')
+          .height('65%')
+          .borderWidth(0.2)
+
+          Text('底盘异常状态').width('100%').margin({ top: '5%', bottom: '5%' })
+          Column() {
+            Row() {
+              Text('底盘受阻')
+                .width('46%')
+                .height('47%')
+                .textAlign(TextAlign.Center)
+                .backgroundColor(this.errorType.type1?Color.Red:Color.Gray)
+                .fontColor(Color.White)
+              Text('Z轴故障')
+                .width('46%')
+                .height('47%')
+                .textAlign(TextAlign.Center)
+                .backgroundColor(this.errorType.type2?Color.Red:Color.Gray)
+                .fontColor(Color.White)
+            }.width('100%').justifyContent(FlexAlign.SpaceBetween)
+
+            Row() {
+              Text('工件不稳')
+                .width('46%')
+                .height('47%')
+                .textAlign(TextAlign.Center)
+                .backgroundColor(this.errorType.type3?Color.Red:Color.Gray)
+                .fontColor(Color.White)
+              Text('异常停止')
+                .width('46%')
+                .height('47%')
+                .textAlign(TextAlign.Center)
+                .backgroundColor(this.errorType.type4?Color.Red:Color.Gray)
+                .fontColor(Color.White)
+            }.width('100%').justifyContent(FlexAlign.SpaceBetween)
+          }
+          .width('100%')
+          .height('25%')
+          .justifyContent(FlexAlign.SpaceBetween)
+
+        }.width('25%').height('100%').padding({ left: '2%', right: '2%', top: '1%', bottom: '2%' })
+
+        Divider().vertical(true)
+        Column() {
+          RelativeContainer() {
+            Column() {
+              Text('底盘移速挡位').width('100%').textAlign(TextAlign.Center)
+              Column() {
+                Button('3档').width('60%').height('15%')
+                  .backgroundColor(this.isAutomode && this.dipanSpeed == 3 ? Color.Blue : Color.Grey)
+                  .stateEffect(this.isAutomode)
+                  .onClick(() => {
+                    if(this.isAutomode){
+                      this.dipanSpeed = 3
+                    }
+                  })
+                Button('2档').width('60%').height('15%')
+                  .backgroundColor(this.isAutomode && this.dipanSpeed == 2 ? Color.Blue : Color.Grey)
+                  .stateEffect(this.isAutomode)
+                  .onClick(() => {
+                    if(this.isAutomode){
+                      this.dipanSpeed = 2
+                    }
+                  })
+                Button('1档').width('60%').height('15%')
+                  .backgroundColor(this.isAutomode && this.dipanSpeed == 1 ? Color.Blue : Color.Grey)
+                  .stateEffect(this.isAutomode)
+                  .onClick(() => {
+                    if(this.isAutomode){
+                      this.dipanSpeed = 1
+                    }
+
+                  })
+              }.width('100%').height('80%')
+              .justifyContent(FlexAlign.SpaceEvenly)
+            }
+            .width('30%').height('80%').id('column1').alignRules({
+              top: { anchor: '__container__', align: VerticalAlign.Top },
+              left: { anchor: '__container__', align: HorizontalAlign.Start }
+            })
+
+            Column() {
+              Text('Z轴移速挡位').width('100%').textAlign(TextAlign.Center)
+              Column() {
+                Button('3档').width('60%').height('15%')
+                  .stateEffect(this.isAutomode)
+                  .backgroundColor(this.isAutomode && this.zzhouSpeed == 3 ? Color.Blue : Color.Grey)
+                  .onClick(() => {
+                    if(this.isAutomode){
+                      this.zzhouSpeed = 3
+                    }
+
+                  })
+                Button('2档').width('60%').height('15%')
+                  .backgroundColor(this.isAutomode && this.zzhouSpeed == 2 ? Color.Blue : Color.Grey)
+                  .stateEffect(this.isAutomode)
+                  .onClick(() => {
+                    if(this.isAutomode){
+                      this.zzhouSpeed = 2
+                    }
+                  })
+                Button('1档').width('60%').height('15%')
+                  .backgroundColor(this.isAutomode && this.zzhouSpeed == 1 ? Color.Blue : Color.Grey)
+                  .stateEffect(this.isAutomode)
+                  .onClick(() => {
+                    if(this.isAutomode){
+                      this.zzhouSpeed = 1
+                    }
+                  })
+              }.width('100%').height('80%')
+              .justifyContent(FlexAlign.SpaceEvenly)
+            }.width('30%').height('80%').id('column2').alignRules({
+              top: { anchor: '__container__', align: VerticalAlign.Top },
+              middle: { anchor: '__container__', align: HorizontalAlign.Center }
+            })
+
+            Column() {
+              Text('Z轴升降控制').width('100%').textAlign(TextAlign.Center)
+              Column() {
+                Stack(){
+                  Image($r('app.media.upblue')).width(50)
+                    .fillColor(this.isAutomode&&this.verticalDirection?Color.Blue:Color.Grey)
+                    .onClick(()=>{
+                      if(this.isAutomode){
+                        this.verticalDirection=true
+                      }
+
+                    })
+                  Text('上升').fontColor(Color.White)
+                    .onClick(()=>{
+                      if(this.isAutomode){
+                        this.verticalDirection=true
+                      }
+                    })
+                }
+
+                Text('1M').width('100%').textAlign(TextAlign.Center).fontColor(this.isAutomode?Color.Blue:Color.Grey)
+                Stack(){
+                  Image($r('app.media.downgrey')).width(50)
+                    .fillColor(!this.isAutomode||this.verticalDirection?Color.Grey:Color.Blue)
+                    .onClick(()=>{
+                      this.verticalDirection=false
+                    })
+                  Text('下降').fontColor(Color.White)
+                    .onClick(()=>{
+                      this.verticalDirection=false
+                    })
+                }
+
+              }.width('100%').height('80%')
+              .justifyContent(FlexAlign.SpaceEvenly)
+            }.width('30%').height('90%').id('column3').alignRules({
+              top: { anchor: '__container__', align: VerticalAlign.Top },
+              right: { anchor: '__container__', align: HorizontalAlign.End }
+            })
+
+            Column() {
+              Text('底盘移速自定义').width('80%')
+              Row() {
+                TextInput({ placeholder: '请输入' })
+                  .borderWidth(0.2)
+                  .borderRadius(0)
+                  .enabled(this.isAutomode)
+                  .width('80%')
+                  .padding(1)
+                  .height('90%')
+                  .placeholderFont({ size: 10 })
+                  .fontSize(10)
+                  .onChange((value) => {
+                    if (this.isAutomode) {
+                      this.inputSpeed = value
+                    }
+                  })
+                Text('确定')
+                  .fontColor(Color.White)
+                  .margin({ left: '5%' })
+                  .height('90%')
+                  .borderRadius(3)
+                  .fontSize(12)
+                  .width('20%')
+                  .textAlign(TextAlign.Center)
+                  .backgroundColor(this.isAutomode? this.inputSpeed?Color.Blue:Color.Grey:Color.Grey )
+              }.width('100%').height('60%').margin({ left: '32%' })
+            }
+            .width('40%').height('20%').id('column4').alignRules({
+              bottom: { anchor: '__container__', align: VerticalAlign.Bottom },
+              left: { anchor: '__container__', align: HorizontalAlign.Start }
+            })
+          }.width('100%').height('65%')
+
+          Row() {
+            Row() {
+              Stack(){
+                Image($r('app.media.leftgrey')).height(40).fillColor(this.isAutomode&&this.horizontalDirection?Color.Blue:Color.Grey)
+                  .onClick(()=>{
+                    if(this.isAutomode){
+                      this.horizontalDirection=true
+                    }
+
+                  })
+                Text('后退').fontColor(Color.White)
+                  .onClick(()=>{
+                    if(this.isAutomode){
+                      this.horizontalDirection=true
+                    }
+
+                  })
+              }
+
+              Stack(){
+                Image($r('app.media.rightblue')).height(40).fillColor(!this.isAutomode||this.horizontalDirection?Color.Grey:Color.Blue)
+                  .onClick(()=>{
+                    this.horizontalDirection=false
+                  })
+                Text('前进').fontColor(Color.White)
+                  .onClick(()=>{
+                    if(this.isAutomode){
+                      this.horizontalDirection=false
+                    }
+                  })
+              }
+            }.height('100%').width('60%').justifyContent(FlexAlign.SpaceEvenly)
+
+            Column() {
+              Button('正转').width('50%')
+                .backgroundColor(this.isAutomode ? this.turnDirection ? Color.Blue : Color.Gray : Color.Grey)
+                .stateEffect(this.isAutomode)
+                .onClick(() => {
+                  if(this.isAutomode){
+                    this.turnDirection = true
+                  }
+                })
+              Button('反转').width('50%')
+                .backgroundColor(this.isAutomode ? this.turnDirection ? Color.Gray : Color.Blue : Color.Grey)
+                .stateEffect(this.isAutomode)
+                .onClick(() => {
+                  if(this.isAutomode){
+                    this.turnDirection = false
+                  }
+                })
+            }.height('100%').width('40%').justifyContent(FlexAlign.SpaceBetween)
+          }.height('35%').width('100%')
+        }.width('50%').height('100%').padding({ left: '2%', right: '2%', top: '1%', bottom: '2%' })
+
+        Divider().vertical(true)
+        Column() {
+          Column() {
+            Button('自动模式').width('70%').height('35%')
+              .backgroundColor(this.isAutomode ? Color.Blue : Color.Gray)
+              .onClick(() => {
+                this.isAutomode = true
+              })
+            Blank()
+            Button('手动模式').width('70%').height('35%')
+              .backgroundColor(this.isAutomode ? Color.Gray : Color.Blue)
+              .onClick(() => {
+                this.isAutomode = false
+              })
+          }
+          .justifyContent(FlexAlign.Start)
+          .width('100%')
+          .height('50%')
+
+          Blank().height('10%')
+          Row() {
+            Text('底盘使能/锁止')
+            Toggle({ type: ToggleType.Switch })
+          }
+
+          Row() {
+            Text('手柄启用/禁止')
+            Toggle({ type: ToggleType.Switch })
+          }
+
+          Blank().height('5%')
+          Button('系统时间写入RFID').backgroundColor(Color.Blue)
+        }.width('25%').height('100%').padding({ left: '2%', right: '2%', top: '1%', bottom: '2%' })
+      }
+      .width('100%')
+      .height('85%')
+      .borderWidth(0.2)
+      .padding({ top: '3%', bottom: '5%' })
+    }
+    .width('100%')
+    .height('100%')
+  }
+}

+ 704 - 0
entry/src/main/ets/pages/Form.ets

@@ -0,0 +1,704 @@
+import { header } from '../view/header'
+import router from '@ohos.router';
+import http from '@ohos.net.http';
+
+class incubator {
+  //序号
+  ID: number
+  //实验状态
+  state: number
+  //责任人
+  personResponsible: string
+  //温箱编号
+  RID: string
+  //试验名
+  experimentalName: string
+  //品名
+  productName: string
+  //SN号
+  SN: string
+  //工装编号
+  toolNumber: string
+  //交付日期,交期
+  deliveryTime: string
+  //试验时长,时长
+  duration: string
+  //开始时间
+  timeOn?: string
+  //结束时间
+  timeOut?: string
+  //入箱视频
+  video?: string
+
+  constructor(
+    //序号
+    ID: number,
+    //实验状态
+    state: number
+    //责任人
+    , personResponsible: string
+    //温箱编号
+    , RID: string
+    //试验名
+    , experimentalName: string
+    //品名
+    , productName: string
+    //SN号
+    , SN: string
+    //工装编号
+    , toolNumber: string
+    //交付日期,交期
+    , deliveryTime: string
+    //试验时长,时长
+    , duration: string
+    //开始时间
+    , timeOn?: string
+    //结束时间
+    , timeOut?: string
+    , video?: string
+  ) {
+    //序号
+    this.ID = ID
+    //实验状态
+    this.state = state
+    //责任人
+    this.personResponsible = personResponsible
+    //温箱编号
+    this.RID = RID
+    //试验名
+    this.experimentalName = experimentalName
+    //品名
+    this.productName = productName
+    //SN号
+    this.SN = SN
+    //工装编号
+    this.toolNumber = toolNumber
+    //交付日期,交期
+    this.deliveryTime = deliveryTime
+    //试验时长,时长
+    this.duration = duration
+    //开始时间
+    this.timeOn = timeOn
+    //结束时间
+    this.timeOut = timeOut
+    //视频
+    this.video = video
+  }
+}
+
+@Entry
+@Component
+export default struct ListView {
+  chinese:string='张三'
+  @State dataList: incubator[] = []
+  @State brr: number[] = []
+  params: any = router.getParams()
+  @State restateName: string = ''
+  @State reRIDName: string = this.params['RID']
+  @State reDurationName: string = ''
+  @State reSNName: string = ''
+  @State rePersonResponsibleName: string =''
+  @State @Watch('getHttpData') reDate: string = ''
+  @State @Watch('getHttpData') restate: number = 0 //试验状态
+  @State @Watch('getHttpData') reRID: string = this.params['RID'] //温箱编号
+  @State @Watch('getHttpData') reDuration: string = '' //试验时长
+  @State @Watch('getHttpData') reSN: string = '' //SN号
+  @State @Watch('getHttpData') rePersonResponsible: string = '' //责任人
+  ID: number = 1
+  @State @Watch('getHttpData') currentPage: number = 1
+  totalPage: number = 0
+  scroller: Scroller = new Scroller()
+
+  async getHttpData() {
+    let httpRequest = http.createHttp();
+    var tempArr: incubator[] = []
+    var url = `http://192.168.101.4:8048/task/page?page=${this.currentPage}&pageSize=10`
+    if (this.reRID != '') url = url + `&boxNumber=%23${this.reRID.slice(1, this.reRID.length)}`
+    if (this.reSN != '') url = url + `&sn=${this.reSN}`
+    if(this.reDate!='')url=url+`&deliverTime=${this.reDate}`
+    if(this.reDuration!='')url=url+`&testTime=${this.reDuration}`
+    if(this.rePersonResponsible!='')url=url+`&person=${this.rePersonResponsible}`
+    if(this.restate!=0)url=url+`&status=${this.restate}`
+    var promise = httpRequest.request(// 请求url地址
+      url,
+      {
+        // 请求方式
+        method: http.RequestMethod.GET,
+        // 可选,默认为60s
+        connectTimeout: 60000,
+        // 可选,默认为60s
+        readTimeout: 60000,
+        // 开发者根据自身业务需要添加header字段
+        header: {
+          'Content-Type': 'application/json'
+        }
+      })
+    await promise.then((data) => {
+      if (data.responseCode === http.ResponseCode.OK) {
+        this.totalPage = Math.ceil(JSON.parse(data.result + '').data.total / 10)
+        var res = JSON.parse(data.result + '').data.records
+        this.initBrr()
+        for (let i = 0; i < res.length; i++) {
+          tempArr.push(new incubator(
+            res[i].id,
+            res[i].status,
+            res[i].person,
+            res[i].boxNumber,
+            res[i].testName,
+            res[i].productName,
+            res[i].sn,
+            res[i].no,
+            res[i].deliverTime,
+            res[i].testTime,
+            res[i].startTime,
+            res[i].finishTime,
+            res[i].video))
+        }
+      }
+    }).catch((err) => {
+      console.log('error:' + JSON.stringify(err))
+    })
+    this.dataList = tempArr
+  }
+
+  initBrr() {
+    this.brr = []
+    for (let index = 1; index <= this.totalPage; index++) {
+      this.brr.push(index)
+      //console.log(`${this.totalPage}`);
+    }
+  }
+
+  onPageShow() {
+    this.getHttpData()
+  }
+
+  onChange() {
+    this.currentPage = 1
+    this.scroller.scrollEdge(Edge.Start)
+  }
+
+  build() {
+    Column() {
+      header({})
+      Row() {
+        Text("试验任务记录")
+          .height('100%')
+          .fontSize(8)
+          .margin(60)
+          .fontColor('#696969')
+      }
+      .width('100%')
+      .height('3%')
+
+      Divider()
+      Row() {
+        RelativeContainer() {
+          Row() {
+            Select([{ value: '未开始' }, { value: '进行中' }, { value: '已完成' }])
+              .value(this.restateName != '' ? this.restateName : '试验状态')
+              .borderColor('#808080')
+              .borderWidth(1)
+              .borderRadius(px2vp(10))
+              .font({ size: px2fp(20) })
+              .height(12)
+              .width(70)
+              .opacity(0.6)
+              .onSelect((index: number, value: string) => {
+                this.restate = index === 0?-1:index
+                this.restateName = value
+                this.onChange()
+              })
+            Select([{ value: '#1' }, { value: '#2' }, { value: '#3' }, { value: '#4' }])
+              .value(this.reRIDName != '' ? this.reRIDName : '温箱编号')
+              .borderColor('#808080')
+              .borderWidth(1)
+              .borderRadius(px2vp(10))
+              .font({ size: px2fp(20) })
+              .height(12)
+              .width(70)
+              .opacity(0.6)
+              .onSelect((index: number, value: string) => {
+                this.reRID = value
+                this.reRIDName = value
+                this.onChange()
+              })
+            Row() {
+              Text(this.reDate === '' ? '日期' : this.reDate)
+                .fontSize(px2fp(20))
+                .opacity(1)
+              Image($r('app.media.blacktriangles'))
+                .height(7)
+                .opacity(0.9)
+                .padding({ top: 0.7 })
+            }
+            .justifyContent(FlexAlign.SpaceEvenly)
+            .width(60)
+            .height(12)
+            .opacity(0.6)
+            .borderColor('#808080')
+            .borderWidth(1)
+            .borderRadius(px2vp(10))
+            .onClick(() => {
+              DatePickerDialog.show({
+                start: new Date("2002-1-1"),
+                end: new Date("2100-12-31"),
+                onAccept: (value: DatePickerResult) => {
+                  this.reDate = (value.year + '-' + (value.month < 10 ? '0' + (value.month + 1) : value.month + 1) + '-' + (value.day < 10 ? '0' + value.day : value.day))
+                  this.onChange()
+                },
+                onCancel: () => {
+                },
+
+              })
+            })
+
+            Select([{ value: '24h' }, { value: '28h' }, { value: '48h' }, { value: '72h' }])
+              .value(this.reDurationName != '' ? this.reDurationName : '试验时长')
+              .borderColor('#808080')
+              .borderWidth(1)
+              .borderRadius(px2vp(10))
+              .font({ size: px2fp(20) })
+              .height(12)
+              .width(70)
+              .opacity(0.6)
+              .onSelect((index: number, value: string) => {
+                this.reDuration = value
+                this.reDurationName = value
+                this.onChange()
+              })
+            Row() {
+              Text('责任人')
+                .fontSize(px2fp(20))
+                .fontColor('#000000')
+                .opacity(0.6)
+              TextInput({ placeholder: '请输入', text: this.rePersonResponsibleName })
+                .height(12)
+                .width(70)
+                .fontSize(px2fp(20))
+                .opacity(0.6)
+                .borderRadius(px2vp(0))
+                .borderColor('#808080')
+                .borderWidth(1)
+                .backgroundColor(Color.White)
+                .placeholderFont({ size: px2fp(20) })
+                .padding({ top: 1, bottom: 1, left: 1 })
+                .onChange((value: string) => {
+                  this.rePersonResponsible = value
+                  this.rePersonResponsibleName = value
+                  this.onChange()
+                })
+            }
+
+            Row() {
+              Text('SN号')
+                .fontSize(px2fp(20))
+                .fontColor('#000000')
+                .opacity(0.6)
+              TextInput({ placeholder: '请输入', text: this.reSNName })
+                .height(12)
+                .width(70)
+                .fontSize(px2fp(20))
+                .opacity(0.6)
+                .borderRadius(px2vp(0))
+                .borderColor('#808080')
+                .borderWidth(1)
+                .backgroundColor(Color.White)
+                .placeholderFont({ size: px2fp(20) })
+                .padding({ top: 1, bottom: 1, left: 1 })
+                .onChange((value: string) => {
+                  this.reSN = value
+                  this.reSNName = value
+                  this.onChange()
+                })
+            }
+
+            Button({ type: ButtonType.Normal }) {
+              Text('刷新')
+                .fontColor(Color.White)
+                .fontSize(px2fp(20))
+            }
+            .onClick(() => {
+              this.restate = 0
+              this.reRID = ''
+              this.reDuration = ''
+              this.reSN = ''
+              this.rePersonResponsible = ''
+              this.restateName = ''
+              this.reRIDName = ''
+              this.reDurationName = ''
+              this.reSNName = ''
+              this.rePersonResponsibleName = ''
+              this.reDate = ''
+              this.onChange()
+            })
+            .borderRadius(px2vp(10))
+            .width(30)
+            .height(15)
+            .backgroundColor(Color.Blue)
+          }
+          .width('100%')
+          .id('1')
+          .height('10%')
+          .justifyContent(FlexAlign.SpaceBetween)
+          .alignRules({
+            top: { anchor: "__container__", align: VerticalAlign.Top },
+            middle: { anchor: "__container__", align: HorizontalAlign.Center }
+          })
+
+          Row() {
+            Button({ type: ButtonType.Normal }) {
+              Text('返回')
+                .fontColor(Color.White)
+                .fontSize(px2fp(20))
+            }
+            .onClick(() => router.pushUrl({ url: 'pages/ManagePage',
+            }))
+            .borderRadius(px2vp(10))
+            .width(30)
+            .height(15)
+            .backgroundColor(Color.Blue)
+
+            Button({ type: ButtonType.Normal }) {
+              Text('导出')
+                .fontColor(Color.White)
+                .fontSize(px2fp(20))
+            }
+            .borderRadius(px2vp(10)).width(30).height(15).backgroundColor(Color.Blue)
+          }.id('2')
+          .justifyContent(FlexAlign.SpaceBetween)
+          .width('100%')
+          .alignRules({
+            top: { anchor: "1", align: VerticalAlign.Bottom },
+            middle: { anchor: "__container__", align: HorizontalAlign.Center }
+          })
+
+          List() {
+            ListItem() {
+              Row() {
+                Text('序号')
+                  .width('4%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('试验状态')
+                  .width('6%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('责任人')
+                  .width('6%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('温箱编号')
+                  .width('6%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('试验名')
+                  .width('9%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('品名')
+                  .width('6%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('SN号')
+                  .width('6%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('工装编号')
+                  .width('6%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('交付日期')
+                  .width('8%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('试验时长')
+                  .width('6%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('开始时间')
+                  .width('14%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('结束时间')
+                  .width('14%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+                Text('入箱视频')
+                  .width('9%')
+                  .height('6%')
+                  .borderColor('#808080')
+                  .borderWidth(0.7)
+                  .textAlign(TextAlign.Center)
+                  .fontSize(px2fp(22))
+                  .fontColor(Color.Black)
+                  .backgroundColor('#F2F2F2')
+              }
+              .width('100%')
+            }
+
+            ForEach(this.dataList, (item,index)=> {
+              ListItem() {
+                Row() {
+                  Text(`${item.ID}`)
+                    .width('4%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(`${item.state}`)
+                    .width('6%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.personResponsible)
+                    .width('6%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.RID)
+                    .width('6%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.experimentalName)
+                    .width('9%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.productName)
+                    .width('6%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.SN)
+                    .width('6%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.toolNumber)
+                    .width('6%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.deliveryTime)
+                    .width('8%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.duration)
+                    .width('6%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.timeOn)
+                    .width('14%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.timeOut)
+                    .width('14%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                  Text(item.video)
+                    .width('9%')
+                    .height('7%')
+                    .borderColor('#808080')
+                    .borderWidth(0.7)
+                    .textAlign(TextAlign.Center)
+                    .fontSize(px2fp(20))
+                    .backgroundColor((index+1+this.currentPage * 10 - 10) % 2 === 0 ? '#F2F2F2' : Color.White)
+                }
+              }
+            })
+          }.id('3')
+          .alignRules({
+            top: { anchor: "2", align: VerticalAlign.Bottom },
+            middle: { anchor: "__container__", align: HorizontalAlign.Center }
+          })
+          .padding({ top: px2vp(10) })
+
+          Row({ space: 6 }) {
+            Row() {
+              Button('<', { type: ButtonType.Normal })
+                .backgroundColor(Color.White)
+                .borderRadius(px2vp(7))
+                .borderWidth(1)
+                .borderColor('#808080')
+                .fontColor(Color.Black)
+                .opacity(0.6)
+                .fontSize(px2fp(30))
+                .padding({ top: 1, bottom: 1, left: 1 })
+                .width(15)
+                .height(20)
+                .onClick(() => {
+                  this.scroller.scrollBy(-20.5, 0)
+                  this.currentPage === 1 ? this.currentPage = this.currentPage : this.currentPage--
+                })
+            }
+
+            Row() {
+              List({ space: 6, scroller: this.scroller }) {
+                ForEach(this.brr, (item) => {
+                  ListItem() {
+                    Button(`${item}`, { type: ButtonType.Normal })
+                      .backgroundColor(Color.White)
+                      .borderRadius(px2vp(7))
+                      .borderWidth(1)
+                      .borderColor(this.currentPage === item ? Color.Blue : '#808080')
+                      .fontColor(Color.Black)
+                      .opacity(0.6)
+                      .fontSize(px2fp(20))
+                      .padding({ top: 1, bottom: 1, left: 1 })
+                      .width(15)
+                      .height(20)
+                      .onClick(() => {
+                        this.currentPage = item
+                      })
+                  }
+                })
+              }
+              .listDirection(Axis.Horizontal).margin({ top: 8.3 })
+            }
+            .constraintSize({ maxWidth: 100 })
+            .clip(true)
+
+            Row() {
+              Button('>', { type: ButtonType.Normal })
+                .backgroundColor(Color.White)
+                .borderRadius(px2vp(7))
+                .borderWidth(1)
+                .borderColor('#808080')
+                .fontColor(Color.Black)
+                .opacity(0.6)
+                .fontSize(px2fp(30))
+                .padding({ top: 1, bottom: 1, left: 1 })
+                .width(15)
+                .height(20)
+                .onClick(() => {
+                  this.scroller.scrollBy(20.5, 0)
+                  this.currentPage === this.totalPage ? this.currentPage = this.currentPage : this.currentPage++
+                })
+            }
+
+          }
+          .id('4')
+          .margin({ top: px2vp(760), left: px2vp(1800) })
+          .height('10%')
+          .alignRules({
+            bottom: { anchor: "__container__", align: VerticalAlign.Bottom },
+            right: { anchor: "__container__", align: HorizontalAlign.End }
+          })
+          .width(150)
+          .justifyContent(FlexAlign.End)
+          .clip(true)
+        }
+        .width('90%')
+        .height('85%')
+
+        //.justifyContent(FlexAlign.Center)
+      }
+      .justifyContent(FlexAlign.Center)
+      .alignItems(VerticalAlign.Top)
+      .width('100%')
+      .height('100%')
+    }
+  }
+}
+

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1071 - 0
entry/src/main/ets/pages/ManagePage.ets


+ 250 - 0
entry/src/main/ets/pages/PointSelect.ets

@@ -0,0 +1,250 @@
+import router from '@ohos.router'
+import { header } from '../view/header'
+import http from '@ohos.net.http';
+
+class taskInformation{
+  id:string
+  time:string
+  leader:string
+
+  constructor(id:string,time:string,leader:string) {
+    this.id=id
+    this.time=time
+    this.leader=leader
+  }
+}
+
+class taskList{
+  name:string
+  index:number
+
+
+  constructor(name:string,index:number) {
+    this.name=name
+    this.index=index
+  }
+}
+
+@Entry
+@Component
+struct Head {
+  @State searchText:string=''
+  @State index:number=0
+  @State isAutomode:boolean=false
+  @State taskItem:taskInformation=
+    new taskInformation('#1温箱','2024.01.28 10:00:00','张四')
+  @State taskCardname:taskList[]=[
+    new taskList("驶往装配工作站",0),
+    new taskList("驶往装配工作站",1),
+    new taskList("驶往装配工作站",2),
+    new taskList("驶往装配工作站",3),
+    new taskList("驶往装配工作站",4),
+    new taskList("驶往装配工作站",5),
+    new taskList("驶往装配工作站",6),
+]
+
+ build(){
+   Column(){
+     header({index:1})//头部
+     Row(){
+      Text("试验装卸管理主页")
+        .height('100%')
+        .fontSize(10)
+        .margin(60)
+        .fontColor('#696969')
+     }
+     .width('100%')
+     .height('3%')
+     Row(){//body
+       Column({space:20}){//左侧框
+         Column({space:20}){//任务信息框
+           Text("任务信息")
+             .textAlign(TextAlign.Center)
+             .width('100%')
+             .height('10%')
+             .fontSize(15)
+             .margin(10)
+           Row(){
+             Column({space:5}){
+               Text("使用温箱:")
+                 .textAlign(TextAlign.Center)
+                 .fontSize(10)
+               Text("开始时间:")
+                 .textAlign(TextAlign.Center)
+                 .fontSize(10)
+               Text("负责人:")
+                 .textAlign(TextAlign.Center)
+                 .fontSize(10)
+             }
+             .height('50%')
+             .alignItems(HorizontalAlign.End)
+             .justifyContent(FlexAlign.SpaceBetween)
+             Column(){
+               Text(this.taskItem.id)
+                   .textAlign(TextAlign.Center)
+                   .fontSize(10)
+                   .fontColor(Color.Blue)
+                 .margin({left:10})
+               Text(this.taskItem.time)
+                 .textAlign(TextAlign.Center)
+                 .fontSize(10)
+                 .fontColor(Color.Blue)
+                 .margin({left:10})
+               Text(this.taskItem.leader)
+                 .textAlign(TextAlign.Center)
+                 .fontSize(10)
+                 .fontColor(Color.Blue)
+                 .margin({left:10})
+             }
+             .height('50%')
+             .alignItems(HorizontalAlign.Start)
+             .justifyContent(FlexAlign.SpaceBetween)
+           }
+         }
+         .justifyContent(FlexAlign.Start)
+         .width('100%')
+         .height('65%')
+         .borderWidth(0.2)
+        Column({space:10}){//注册点位框
+          Text("驶往其他注册点位:")
+            .width("80%")
+            .height('25%')
+            .fontSize(10)
+            .margin({left:10})
+            .fontWeight(FontWeight.Bold)
+          TextInput({placeholder:'请输入'})
+            .type(InputType.Normal)
+            .placeholderColor(Color.Grey)
+            .placeholderFont({size:10})
+            .fontSize(10)
+            .width('70%')
+            .height('30%')
+            .borderRadius(0)
+            .borderWidth(0.2)
+            .margin({left:10})
+            .onChange((value:string)=>{
+              this.searchText=value
+            })
+           Row(){
+             Button(){
+               Text("确定")
+                 .textAlign(TextAlign.Center)
+                 .fontSize(8)
+                 .width("20%")
+                 .margin(3)
+                 .fontColor(Color.White)
+                 .onClick(()=>{
+                   if (this.searchText==='') {
+                     console.log("添加失败")
+                   }
+                 else {
+                   this.taskCardname.push(new taskList(this.searchText,this.taskCardname.length))
+                 }
+                 })
+             }
+             .borderRadius(3)
+             .type(ButtonType.Normal)
+           }
+           .justifyContent(FlexAlign.End)
+           .padding({right: '4.5%'})
+           .width('100%')
+        }
+        .alignItems(HorizontalAlign.Start)
+        .width('100%')
+        .height('35%')
+        .borderWidth(0.2)
+       }.width('25%').height('100%').padding({left:'2%',right:'2%',top:'1%',bottom:'2%'})
+       Divider().vertical(true)//分割线
+       Scroll(){//中间框
+         Column(){
+           Grid(){//网格渲染
+             ForEach(this.taskCardname,(tasklist)=>{
+              GridItem(){
+                   this.taskcard({taskname0:tasklist.name,cardindex0:tasklist.index})
+               }
+             })
+           }
+           .scrollBar(BarState.Auto)
+           .columnsTemplate('5fr 5fr')
+           .columnsGap(90)
+           .rowsGap(40)
+           .margin({left:10})
+           .width('100%')
+           .backgroundColor(Color.White)
+           .height(300)
+         }
+       }
+       .width('50%')
+
+       Divider().vertical(true)//分割线
+       Column(){//右边框
+         Column() {//模式选择框
+           Button('自动模式').width('70%').height('35%')
+             .backgroundColor(this.isAutomode ? Color.Blue : Color.Gray)
+             .onClick(() => {
+               this.isAutomode = true
+             })
+           Blank()
+           Button('手动模式').width('70%').height('35%')
+             .backgroundColor(this.isAutomode ? Color.Gray : Color.Blue)
+             .onClick(() => {
+               this.isAutomode = false
+             })
+         }
+         .justifyContent(FlexAlign.Start)
+         .width('100%')
+         .height('50%')
+         Row(){//运行按钮
+           Image($r('app.media.start'))
+             .objectFit(ImageFit.ScaleDown)
+             .height("40%")
+             .width('40%')
+         }
+         .onClick(()=>{
+           if(this.isAutomode===true){
+             console.log("开始运行")
+             router.replaceUrl({
+               url: 'pages/CarPage',
+               params:this.taskItem
+             }, router.RouterMode.Single)
+           } else {
+             console.log('运行失败');
+           }
+
+         })
+         .layoutWeight(1)
+         .alignItems(VerticalAlign.Center)
+         .justifyContent(FlexAlign.Center)
+
+       }.width('25%').height('100%')
+     }
+     .width('100%')
+     .height('80%')
+     .borderWidth(0.2)
+     .padding({top :'3%',bottom:'5%'})
+   }
+
+
+  }
+  @Builder
+  taskcard($$:{taskname0:string,cardindex0:number}) {
+    Row(){
+      Text($$.taskname0)
+        .fontColor(this.isAutomode?Color.Blue:Color.Black)
+        .textAlign(TextAlign.Center)
+        .fontSize(15)
+        .borderWidth(3)
+        .width('80%')
+        .height('100%')
+        .borderColor(this.index===$$.cardindex0&&this.isAutomode===true?Color.Blue:Color.Black)
+        .onClick(()=>{
+          this.index=$$.cardindex0
+          console.log("已经选择"+$$.taskname0)
+        })
+    }
+    .width("100%")
+    .height("30%")
+  }
+}
+
+

+ 55 - 0
entry/src/main/ets/view/header.ets

@@ -0,0 +1,55 @@
+import router from '@ohos.router'
+
+@Component
+export struct header{
+  @State index:number=0
+  build() {
+      Row(){
+        Row(){
+          Text("三自惯组移动定位系统")
+            .textAlign(TextAlign.Center)
+          Text("v1.0")
+            .fontSize(10)
+        }
+        .margin(10)
+        .width('25%')
+        .height('100%')
+
+        Row(){
+        }.width("43%")
+        Row(){
+          Button("试验任务管理",{type:ButtonType.Normal})
+            .width('50%')
+            .height('100%')
+            .backgroundColor(this.index?'#FFFFF':"#696969")
+            .onClick(()=>{
+              router.pushUrl({
+                url:'pages/ManagePage'
+              })
+            })
+          Button("试验装卸管理",{type:ButtonType.Normal})
+            .width('50%')
+            .height('100%')
+            .backgroundColor(this.index?'#696969':"#FFFFF")
+            .onClick(()=>{
+              router.pushUrl({
+                url:'pages/PointSelect'
+              })
+            })
+        }.width('25%')
+        Image($r('app.media.contacts'))
+          .objectFit(ImageFit.ScaleDown)
+          .layoutWeight(1)
+          .height('50%')
+          .margin({left:6})
+          .onClick(()=>{
+
+          })
+
+
+      }
+      .height('7%')
+      .width('100%')
+      .backgroundColor(Color.Gray)
+  }
+}

+ 42 - 0
entry/src/main/module.json5

@@ -0,0 +1,42 @@
+{
+  "module": {
+    "requestPermissions":[
+      {
+        "name": "ohos.permission.INTERNET"
+      }
+    ],
+    "name": "entry",
+    "type": "entry",
+    "description": "$string:module_desc",
+    "mainElement": "EntryAbility",
+    "deviceTypes": [
+      "phone",
+      "tablet"
+    ],
+    "deliveryWithInstall": true,
+    "installationFree": false,
+    "pages": "$profile:main_pages",
+    "abilities": [
+      {
+        "name": "EntryAbility",
+        "srcEntry": "./ets/entryability/EntryAbility.ets",
+        "description": "$string:EntryAbility_desc",
+        "icon": "$media:icon",
+        "label": "$string:EntryAbility_label",
+        "startWindowIcon": "$media:startIcon",
+        "startWindowBackground": "$color:start_window_background",
+        "exported": true,
+        "skills": [
+          {
+            "entities": [
+              "entity.system.home"
+            ],
+            "actions": [
+              "action.system.home"
+            ]
+          }
+        ]
+      }
+    ]
+  }
+}

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

@@ -0,0 +1,64 @@
+{
+  "color": [
+    {
+      "name": "start_window_background",
+      "value": "#FFFFFF"
+    },
+    {
+      "name": "page_general_background",
+      "value": "#F1F3F5"
+    },
+    {
+      "name": "title_bar_background",
+      "value": "#F1F3F5"
+    },
+    {
+      "name": "bottom_bar_background",
+      "value": "#F1F3F5"
+    },
+    {
+      "name": "general_font_color",
+      "value": "#000000"
+    },
+    {
+      "name": "general_card_background_color",
+      "value": "#FFFFFF"
+    },
+    {
+      "name": "robot_button_background_color",
+      "value": "#000000"
+    },
+    {
+      "name": "robot_toward_set_card_background",
+      "value": "#D9DBDD"
+    },
+    {
+      "name": "robot_set_card_blue",
+      "value": "#0A59F7"
+    },
+    {
+      "name": "robot_set_card_white",
+      "value": "#FFFFFF"
+    },
+    {
+      "name": "robot_set_coord_card_grey",
+      "value": "#E3E5E7"
+    },
+    {
+      "name": "robot_set_coord_card_red",
+      "value": "#E84026"
+    },
+    {
+      "name": "general_font_white_color",
+      "value": "#FFFFFF"
+    },
+    {
+      "name": "text_input_placeholder_font_color",
+      "value": "#CCCCCC"
+    },
+    {
+      "name": "general_border_color",
+      "value": "#CCCCCC"
+    }
+  ]
+}

+ 124 - 0
entry/src/main/resources/base/element/float.json

@@ -0,0 +1,124 @@
+{
+  "float": [
+    {
+      "name": "title_date_font_size",
+      "value": "19px"
+    },
+    {
+      "name": "title_time_font_size",
+      "value": "21px"
+    },
+    {
+      "name": "title_icon_size",
+      "value": "43px"
+    },
+    {
+      "name": "title_bar_home_page_opacity",
+      "value": "0"
+    },
+    {
+      "name": "title_bar_general_opacity",
+      "value": "1"
+    },
+    {
+      "name": "bottom_bar_home_page_opacity",
+      "value": "0.5"
+    },
+    {
+      "name": "bottom_bar_general_opacity",
+      "value": "1"
+    },
+    {
+      "name": "title_font_size",
+      "value": "51px"
+    },
+    {
+      "name": "general_icon_size",
+      "value": "64px"
+    },
+    {
+      "name": "set_card_font_size",
+      "value": "32px"
+    },
+    {
+      "name": "set_card_font_select_opacity",
+      "value": "0.9"
+    },
+    {
+      "name": "card_font_default_opacity",
+      "value": "0.6"
+    },
+    {
+      "name": "general_border_radius",
+      "value": "21px"
+    },
+    {
+      "name": "general_border_width",
+      "value": "1px"
+    },
+    {
+      "name": "robot_image_select_size",
+      "value": "96px"
+    },
+    {
+      "name": "robot_image_default_size",
+      "value": "80px"
+    },
+    {
+      "name": "robot_image_list_size",
+      "value": "256px"
+    },
+    {
+      "name": "robot_image_select_opacity",
+      "value": "1"
+    },
+    {
+      "name": "robot_image_default_opacity",
+      "value": "0.3"
+    },
+    {
+      "name": "robot_state_font_size",
+      "value": "27px"
+    },
+    {
+      "name": "robot_state_image_size",
+      "value": "43px"
+    },
+    {
+      "name": "general_font_opacity",
+      "value": "0.9"
+    },
+    {
+      "name": "robot_card_title_font_size",
+      "value": "32px"
+    },
+    {
+      "name": "robot_card_info_font_size",
+      "value": "27px"
+    },
+    {
+      "name": "card_subscript_size",
+      "value": "27px"
+    },
+    {
+      "name": "robot_set_font_size",
+      "value": "32px"
+    },
+    {
+      "name": "robot_set_radius",
+      "value": "101px"
+    },
+    {
+      "name": "storage_space_set_size",
+      "value": "131px"
+    },
+    {
+      "name": "storage_set_image_effect_width",
+      "value": "246px"
+    },
+    {
+      "name": "storage_set_image_effect_height",
+      "value": "107px"
+    }
+  ]
+}

+ 40 - 0
entry/src/main/resources/base/element/string.json

@@ -0,0 +1,40 @@
+{
+  "string": [
+    {
+      "name": "module_desc",
+      "value": "module description"
+    },
+    {
+      "name": "EntryAbility_desc",
+      "value": "description"
+    },
+    {
+      "name": "EntryAbility_label",
+      "value": "label"
+    },
+    {
+      "name": "title_set",
+      "value": "set"
+    },
+    {
+      "name": "set_card_storage",
+      "value": "storage"
+    },
+    {
+      "name": "set_card_robot",
+      "value": "robot"
+    },
+    {
+      "name": "set_card_ai",
+      "value": "intelligent assistant"
+    },
+    {
+      "name": "set_card_service_card",
+      "value": "service card"
+    },
+    {
+      "name": "set_card_user_info",
+      "value": "my info"
+    }
+  ]
+}

BIN
entry/src/main/resources/base/media/BG.png


BIN
entry/src/main/resources/base/media/BeiJing1.png


BIN
entry/src/main/resources/base/media/KAPIAN.png


BIN
entry/src/main/resources/base/media/KaPian2.png


BIN
entry/src/main/resources/base/media/baobiao.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 4 - 0
entry/src/main/resources/base/media/battery_level.svg


BIN
entry/src/main/resources/base/media/blacktriangles.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/bluetooth_open.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/camera.svg


BIN
entry/src/main/resources/base/media/cangchu.png


BIN
entry/src/main/resources/base/media/car_preview.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 1 - 0
entry/src/main/resources/base/media/contacts.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/coordinate.svg


+ 3 - 0
entry/src/main/resources/base/media/downblue.svg

@@ -0,0 +1,3 @@
+<svg width="100" height="87" viewBox="0 0 100 87" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M100 0L100 71.5169L50 87L-5.51029e-06 71.5169L-2.38419e-06 -4.37114e-06L100 0Z" fill="#0F40F5"/>
+</svg>

+ 3 - 0
entry/src/main/resources/base/media/downgrey.svg

@@ -0,0 +1,3 @@
+<svg width="100" height="87" viewBox="0 0 100 87" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M100 0L100 71.5169L50 87L-5.51029e-06 71.5169L-2.38419e-06 -4.37114e-06L100 0Z" fill="#D9D9D9"/>
+</svg>

BIN
entry/src/main/resources/base/media/gongxu.png


BIN
entry/src/main/resources/base/media/head.webp


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 13 - 0
entry/src/main/resources/base/media/home.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/home_page.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/huiseanniuR.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/huiseanniul.svg


BIN
entry/src/main/resources/base/media/ic_widget.png


BIN
entry/src/main/resources/base/media/icon.png


+ 3 - 0
entry/src/main/resources/base/media/jiaobiao.svg

@@ -0,0 +1,3 @@
+<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18 16V2.82843C18 1.04662 15.8457 0.154282 14.5858 1.41421L1.41421 14.5858C0.154284 15.8457 1.04662 18 2.82843 18H16C17.1046 18 18 17.1046 18 16Z" fill="black" fill-opacity="0.1"/>
+</svg>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/jinribaogu.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/jinrijihua.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/jinriwancheng.svg


BIN
entry/src/main/resources/base/media/jiqiren.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/lanseanniuR.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/lanseanniul.svg


+ 3 - 0
entry/src/main/resources/base/media/leftblue.svg

@@ -0,0 +1,3 @@
+<svg width="118" height="70" viewBox="0 0 118 70" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M118 70L21 70L3.0598e-06 35L21 -8.48001e-06L118 0L118 70Z" fill="#0F40F5"/>
+</svg>

+ 3 - 0
entry/src/main/resources/base/media/leftgrey.svg

@@ -0,0 +1,3 @@
+<svg width="118" height="70" viewBox="0 0 118 70" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M118 70L21 70L3.0598e-06 35L21 -8.48001e-06L118 0L118 70Z" fill="#D9D9D9"/>
+</svg>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 10 - 0
entry/src/main/resources/base/media/log_on_user.svg


BIN
entry/src/main/resources/base/media/main_background_image.png


BIN
entry/src/main/resources/base/media/nansheng.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/notice.svg


BIN
entry/src/main/resources/base/media/nvsheng.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/page_flow.svg


+ 3 - 0
entry/src/main/resources/base/media/rightblue.svg

@@ -0,0 +1,3 @@
+<svg width="118" height="70" viewBox="0 0 118 70" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 0H97L118 35L97 70H0V0Z" fill="#0F40F5"/>
+</svg>

+ 3 - 0
entry/src/main/resources/base/media/rightgrey.svg

@@ -0,0 +1,3 @@
+<svg width="118" height="70" viewBox="0 0 118 70" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 0H97L118 35L97 70H0V0Z" fill="#D9D9D9"/>
+</svg>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 11 - 0
entry/src/main/resources/base/media/robot_auto_mode.svg


BIN
entry/src/main/resources/base/media/robot_toward_x_forward.png


BIN
entry/src/main/resources/base/media/robot_toward_x_negative.png


BIN
entry/src/main/resources/base/media/robot_toward_y_forward.png


BIN
entry/src/main/resources/base/media/robot_toward_y_negative.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 5 - 0
entry/src/main/resources/base/media/set_robot.svg


BIN
entry/src/main/resources/base/media/set_robot_unity_background.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/set_service_card.svg


+ 5 - 0
entry/src/main/resources/base/media/set_storage.svg

@@ -0,0 +1,5 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18.8558 24.8238C19.3862 24.8238 19.8949 24.6131 20.27 24.238L24.2379 20.2701C24.613 19.895 24.8237 19.3863 24.8237 18.8559V7C24.8237 5.89543 23.9282 5 22.8237 5H10.8867C10.35 5 9.83585 5.21569 9.4598 5.59859L5.5731 9.55599C5.2058 9.92997 5 10.4332 5 10.9574V22.8238C5 23.9284 5.89543 24.8238 7 24.8238H18.8558Z" fill="black" fill-opacity="0.6"/>
+<path d="M37.0322 43.0002C37.5626 43.0002 38.0713 42.7895 38.4464 42.4144L42.4143 38.4465C42.7893 38.0714 43.0001 37.5627 43.0001 37.0323V25.1764C43.0001 24.0718 42.1046 23.1764 41.0001 23.1764H29.0631C28.5264 23.1764 28.0122 23.3921 27.6362 23.775L23.7495 27.7324C23.3822 28.1063 23.1764 28.6096 23.1764 29.1338V41.0002C23.1764 42.1048 24.0718 43.0002 25.1764 43.0002H37.0322Z" fill="black" fill-opacity="0.6"/>
+<path d="M20.27 26.1381C19.8949 26.5131 19.3862 26.7239 18.8558 26.7239H7C6.80811 26.7239 6.62254 26.6968 6.44688 26.6464L5.5731 27.5361C5.2058 27.91 5 28.4133 5 28.9375V40.8039C5 41.9085 5.89543 42.8039 7 42.8039H18.8558C19.3862 42.8039 19.8949 42.5932 20.27 42.2181L21.2864 41.2017C21.2798 41.1354 21.2764 41.0682 21.2764 41.0002V29.1338C21.2764 28.6096 21.4822 28.1063 21.8495 27.7323L24.807 24.721C24.7031 23.917 24.1216 23.2627 23.3563 23.0518L20.27 26.1381Z" fill="black" fill-opacity="0.6"/>
+</svg>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 5 - 0
entry/src/main/resources/base/media/set_user_info.svg


+ 4 - 0
entry/src/main/resources/base/media/set_voice_assistant.svg

@@ -0,0 +1,4 @@
+<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M37.5 20.5C38.6046 20.5 39.5 21.3954 39.5 22.5C39.5 30.383 33.6153 36.8915 25.9992 37.8723L26 42C26 43.1046 25.1046 44 24 44C22.9289 44 22.0545 43.158 22.0024 42.0998L21.9981 37.8719C14.3833 36.89 8.5 30.3821 8.5 22.5C8.5 21.3954 9.39543 20.5 10.5 20.5C11.6046 20.5 12.5 21.3954 12.5 22.5C12.5 28.8513 17.6487 34 24 34C30.0972 34 35.0862 29.2549 35.4755 23.2561L35.5 22.5C35.5 21.3954 36.3954 20.5 37.5 20.5Z" fill="black" fill-opacity="0.6"/>
+<path d="M24 4C28.2605 4 31.7431 7.33045 31.9864 11.5299L32 12V22.5C32 26.9183 28.4183 30.5 24 30.5C19.7395 30.5 16.2569 27.1695 16.0136 22.9701L16 22.5V12C16 7.58172 19.5817 4 24 4Z" fill="black" fill-opacity="0.6"/>
+</svg>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/shaoma.svg


BIN
entry/src/main/resources/base/media/shezhi.png


BIN
entry/src/main/resources/base/media/start.png


BIN
entry/src/main/resources/base/media/startIcon.png


BIN
entry/src/main/resources/base/media/storage_space.png


BIN
entry/src/main/resources/base/media/storage_space_disable.png


BIN
entry/src/main/resources/base/media/storage_space_no_type.png


BIN
entry/src/main/resources/base/media/storage_space_select.gif


+ 3 - 0
entry/src/main/resources/base/media/subscript.svg

@@ -0,0 +1,3 @@
+<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M18 16V2.82843C18 1.04662 15.8457 0.154282 14.5858 1.41421L1.41421 14.5858C0.154284 15.8457 1.04662 18 2.82843 18H16C17.1046 18 18 17.1046 18 16Z" fill="black" fill-opacity="0.1"/>
+</svg>

+ 3 - 0
entry/src/main/resources/base/media/upblue.svg

@@ -0,0 +1,3 @@
+<svg width="100" height="87" viewBox="0 0 100 87" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 87L-3.1261e-06 15.4831L50 6.99355e-06L100 15.4831L100 87L0 87Z" fill="#0F40F5"/>
+</svg>

+ 3 - 0
entry/src/main/resources/base/media/upgrey.svg

@@ -0,0 +1,3 @@
+<svg width="100" height="87" viewBox="0 0 100 87" fill="none" xmlns="http://www.w3.org/2000/svg">
+<path d="M0 87L-3.1261e-06 15.4831L50 6.99355e-06L100 15.4831L100 87L0 87Z" fill="#D9D9D9"/>
+</svg>

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/volume.svg


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/wlan_open.svg


BIN
entry/src/main/resources/base/media/wuchunchu.png


파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 3 - 0
entry/src/main/resources/base/media/zhuliaoqitao.svg


+ 8 - 0
entry/src/main/resources/base/profile/main_pages.json

@@ -0,0 +1,8 @@
+{
+  "src": [
+    "pages/PointSelect",
+    "pages/CarPage",
+    "pages/Form",
+    "pages/ManagePage"
+  ]
+}

+ 40 - 0
entry/src/main/resources/en_US/element/string.json

@@ -0,0 +1,40 @@
+{
+  "string": [
+    {
+      "name": "module_desc",
+      "value": "module description"
+    },
+    {
+      "name": "EntryAbility_desc",
+      "value": "description"
+    },
+    {
+      "name": "EntryAbility_label",
+      "value": "label"
+    },
+    {
+      "name": "title_set",
+      "value": "SET"
+    },
+    {
+      "name": "set_card_storage",
+      "value": "storage"
+    },
+    {
+      "name": "set_card_robot",
+      "value": "robot"
+    },
+    {
+      "name": "set_card_ai",
+      "value": "intelligent assistant"
+    },
+    {
+      "name": "set_card_service_card",
+      "value": "service card"
+    },
+    {
+      "name": "set_card_user_info",
+      "value": "my info"
+    }
+  ]
+}

+ 0 - 0
entry/src/main/resources/zh_CN/element/string.json


이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.