浏览代码

工位设备列表。测试下载的page。

jiaxiaoqiang 9 月之前
父节点
当前提交
bd27ffa06c

+ 12 - 3
entry/src/main/ets/pages/Index.ets

@@ -22,6 +22,12 @@ class BridgeModel {
     // return true;
   }
 
+  goToDevicePage(params: string): void {
+    console.info(TAG, `goToDevicePage:`, params);
+    uploadInstance.configUploadParam(params)
+    router.pushUrl({ url: "pages/StationDevicesPage" })
+  }
+
   selectFile(params: string): void {
     console.info(TAG, `selectFile:`, params);
     uploadInstance.configUploadParam(params)
@@ -48,7 +54,7 @@ struct Index {
     // 这个必须要调用刷新才起作用, 而且只能执行一次
     if (!this.hasRegistered) {
       console.info(TAG, `registerJavaScriptProxy:`);
-      this.controller.registerJavaScriptProxy(this.bridgeObj, TAG, ["download", "selectFile", "startCamera"])
+      this.controller.registerJavaScriptProxy(this.bridgeObj, TAG, ["download", "selectFile", "startCamera", "goToDevicePage"])
       this.controller.refresh()
       this.hasRegistered = true
     }
@@ -61,9 +67,12 @@ struct Index {
         // Web({ src: $rawfile('doc_old.html'), controller: this.controller })//测试官方文档 这个是好使的
 
         Web({
-          src: webUrl,
+          src: "http://10.88.20.88:3005",
           controller: this.controller
-        })
+        })// Web({
+          //   src: webUrl,
+          //   controller: this.controller
+          // })
           .mixedMode(MixedMode.All)
           .onlineImageAccess(true)
           .javaScriptAccess(true)

+ 375 - 0
entry/src/main/ets/pages/StationDevicesPage.ets

@@ -0,0 +1,375 @@
+// 工位的设备列表
+import router from '@ohos.router'
+import EquipmentRequest from '../utils/EquipmentRequest'
+
+
+export class HardwareModel {
+  name?: string
+  text?: string
+  type?: Resource
+  open?: Resource
+  colse?: Resource
+  select?: boolean
+  temp?: number
+  manufacturer?: string //: "厂家",
+  brand?: string //"品牌或型号,比如JBC",
+  deviceName?: string //"设备自定义名称或资产编号",
+  deviceType?: string // "类别,比如电络铁",
+  deviceNo?: string // "设备编号,唯一号",
+  devicePic?: string // "图片",
+  state?: number //"状态:0正常,-1:离线,1故障",
+  workshop?: string //"产线",
+  station?: string //"工站/工位",
+  devicePosition?: string // "空间位置,目前暂时不用",
+  data?: HardwareModel[]
+  enable?: boolean | string //是否启用了设备
+  imageSource?: ResourceStr
+}
+
+interface ImageDictModel {
+  sansedeng: ResourceStr
+  saomaqiang: ResourceStr
+  diannengbiao: ResourceStr
+  multimeter: ResourceStr
+  dukaqi: ResourceStr
+  chengkongdianyuan: ResourceStr
+  shukongdian: ResourceStr
+  diandongluosidao: ResourceStr
+  zhaomingdeng: ResourceStr
+}
+
+
+@Entry
+@Component
+struct StationDevicesPage {
+  //注释掉的是假数据,实际更具请求硬件获取
+  @State private items: Array<HardwareModel> = [
+  //   {
+  //   name: '三色灯',
+  //   text: '装配工位001',
+  //   type: $r('app.media.sansedeng'),
+  //   open: $r('app.media.open'),
+  //   colse: $r('app.media.colse'),
+  //   select: true,
+  //   temp: 1,
+  //   deviceName: "三色灯"
+  // }
+  ]
+  imageDict: ImageDictModel = {
+    sansedeng: $r("app.media.sansedeng"),
+    saomaqiang: $r('app.media.saomaqiang'),
+    diannengbiao: $r('app.media.diannengbiao'),
+    multimeter: $r('app.media.multimeter'),
+    dukaqi: $r('app.media.dukaqi'),
+    chengkongdianyuan: $r('app.media.chengkongdianyuan'),
+    shukongdian: $r('app.media.shukongdian'),
+    diandongluosidao: $r('app.media.diandongluosidao'),
+    zhaomingdeng: $r('app.media.zhaomingdeng')
+  }
+  scroller: Scroller = new Scroller()
+  getDeviceList = async () => {
+    let res: HardwareModel = await EquipmentRequest.get('/api/v1/device/list') as HardwareModel
+    this.items = res?.data?.filter((device) => {
+      device.imageSource = Reflect.get(this.imageDict, device.devicePic!)
+      return device.enable! === true || device.enable! === "true"
+    }) ?? []
+  }
+  // 点击选择了设备之后
+  @State currentDevice: HardwareModel = {}
+  openDeviceOperationDialog = (d: HardwareModel) => {
+    this.currentDevice = d
+    if (d.deviceName == "三色灯") {
+      this.lightDController.open()
+    }
+  }
+  // 三色灯dialoag
+  lightDController = new CustomDialogController({
+    builder: ThreeColorsLight({
+      device: this.currentDevice
+    }),
+    alignment: DialogAlignment.Center,
+    customStyle: true,
+  })
+
+  aboutToAppear(): void {
+    this.getDeviceList()
+  }
+
+  build() {
+
+    Column() {
+      Row() {
+        Image($r('app.media.back_white'))
+          .height(px2vp(48))
+          .width(px2vp(48))
+          .onClick(async () => {
+            router.back()
+          })
+      }
+      .width('100%')
+      .height('8%')
+      .alignItems(VerticalAlign.Center)
+      .justifyContent(FlexAlign.Start)
+
+      Column() {
+
+        //  Scroll(this.scroller){
+        Grid(this.scroller) {
+          ForEach(this.items, (item: HardwareModel, index) => {
+            GridItem() {
+
+              Row() {
+                Column() {
+                  Text(item.deviceName)
+                    .fontColor('#FFFFFF')
+                    .fontWeight(FontWeight.Medium)
+                    .fontSize(24)
+                  Text(item.deviceNo)
+                    .fontColor('#FFFFFF')
+                    .opacity(0.6)
+                    .fontWeight(FontWeight.Regular)
+                    .fontSize(20)
+                  Row() {
+                    Image(item.imageSource)
+                      .width(px2vp(120))
+                      .height(px2vp(120))
+                      .margin({ top: 40 })
+                  }.height('50%')
+                  .width('100%')
+                  .padding({ left: 10 })
+                }
+                .width('100%')
+                .padding(10)
+                .borderRadius(10)
+                .alignItems(HorizontalAlign.Start)
+                .height('100%')
+              }
+              .width('100%')
+              .height('30%')
+              .padding({ left: 10 })
+              .borderRadius(10)
+              .backgroundColor('#66ffffff')
+              .onClick(() => {
+                this.openDeviceOperationDialog(item)
+              })
+            }
+          })
+        }
+        .columnsTemplate('1fr 1fr 1fr 1fr 1fr 1fr')
+        .columnsGap(10)
+        .rowsGap(10)
+        .width('100%')
+        .height('100%')
+        .editMode(true) //设置Grid是否进入编辑模式,进入编辑模式可以拖拽Grid组件内部GridItem
+        .supportAnimation(true) //设置Grid是否开启拖拽补位动画
+        .height('80%')
+        .width('100%')
+        .padding({ top: 10 })
+
+      }
+    }
+    .backgroundImage($r('app.media.zhihuigc'))
+    .backgroundImageSize({ width: '100%', height: '100%' })
+    .width('100%')
+    .height('100%')
+    .padding(20)
+
+  }
+}
+
+
+@Extend(Button)
+function DeviceBtnS(color: ResourceColor) {
+  .fontColor(Color.White).width(70).height(30).backgroundColor(color)
+
+}
+
+
+// 三色灯
+interface SSDModel {
+  uiType: "Text" | "Button",
+  textValue: string,
+  key: string
+  value: string
+  btnColor: ResourceColor
+}
+
+interface SSDParamsData {
+  lighting: string
+  buzzer: string
+  flash: string
+}
+
+interface SSDParams {
+  deviceNo: string
+  data: SSDParamsData
+}
+
+@CustomDialog
+struct ThreeColorsLight {
+  controller: CustomDialogController
+  @Prop device: HardwareModel
+  @State operations: SSDModel[][] = [
+    [{
+      uiType: 'Text',
+      textValue: "亮灯",
+      key: "lighting",
+      value: "todo",
+      btnColor: $r("app.color.red_100")
+    },
+      {
+        uiType: 'Button',
+        textValue: "红灯",
+        key: "lighting",
+        value: "red",
+        btnColor: $r("app.color.red_100")
+      },
+      {
+        uiType: 'Button',
+        textValue: "黄灯",
+        key: "lighting",
+        value: "yellow",
+        btnColor: $r("app.color.yellow_1")
+      },
+      {
+        uiType: 'Button',
+        textValue: "绿灯",
+        key: "lighting",
+        value: "green",
+        btnColor: $r("app.color.green_100")
+      },
+      {
+        uiType: 'Button',
+        textValue: "关闭",
+        key: "lighting",
+        value: "off",
+        btnColor: $r("app.color.gray_6666")
+      },
+    ],
+    [{
+      uiType: 'Text',
+      textValue: "蜂鸣",
+      key: "buzzer",
+      value: "todo",
+      btnColor: $r("app.color.red_100")
+    },
+      {
+        uiType: 'Button',
+        textValue: "大声",
+        key: "buzzer",
+        value: "loud",
+        btnColor: $r("app.color.red_100")
+      },
+      {
+        uiType: 'Button',
+        textValue: "小声",
+        key: "buzzer",
+        value: "low",
+        btnColor: $r("app.color.green_100")
+      },
+      {
+        uiType: 'Button',
+        textValue: "关闭",
+        key: "buzzer",
+        value: "off",
+        btnColor: $r("app.color.gray_6666")
+      },
+    ],
+
+
+    [{
+      uiType: 'Text',
+      textValue: "闪光",
+      key: "flash",
+      value: "todo",
+      btnColor: $r("app.color.red_100")
+    },
+      {
+        uiType: 'Button',
+        textValue: "闪光快",
+        key: "flash",
+        value: "fast",
+        btnColor: $r("app.color.red_100")
+      },
+      {
+        uiType: 'Button',
+        textValue: "闪光中",
+        key: "flash",
+        value: "middle",
+        btnColor: $r("app.color.yellow_1")
+      },
+      {
+        uiType: 'Button',
+        textValue: "闪光慢",
+        key: "flash",
+        value: "slow",
+        btnColor: $r("app.color.green_100")
+      },
+      {
+        uiType: 'Button',
+        textValue: "关闭",
+        key: "flash",
+        value: "off",
+        btnColor: $r("app.color.gray_6666")
+      },
+    ],
+  ]
+  toOperation = (m: SSDModel) => {
+    console.log("toOperation", JSON.stringify(m))
+    let data: SSDParamsData = {
+      lighting: '',
+      buzzer: '',
+      flash: ''
+    }
+
+    Reflect.set(data, m.key, m.value)
+
+
+    console.log("toOperation", JSON.stringify(data))
+
+    EquipmentRequest.post("/api/v1/device/setup", {
+      deviceNo: this.device.deviceNo ?? "",
+      data: data
+    } as SSDParams)
+
+  }
+
+  build() {
+    Column() {
+
+      ForEach(this.operations, (ops: SSDModel[], index) => {
+        ListItem() {
+          Row({ space: 10 }) {
+            ForEach(ops, (op: SSDModel) => {
+              if (op.uiType === "Text") {
+                Text(op.textValue)
+              }
+              else {
+                Button({ type: ButtonType.Capsule }) {
+                  Text(op.textValue)
+                }.DeviceBtnS(op.btnColor)
+                .onClick(() => {
+                  this.toOperation(op)
+                })
+              }
+            })
+
+          }
+        }
+      })
+
+
+    }
+    .justifyContent(FlexAlign.SpaceEvenly)
+    .alignItems(HorizontalAlign.Start)
+    .padding({ left: 15 })
+    .width(400)
+    .height(240)
+    .backgroundColor(Color.White)
+    .borderRadius(10)
+
+  }
+}
+
+
+

+ 155 - 0
entry/src/main/ets/pages/TestDownloadPage.ets

@@ -0,0 +1,155 @@
+import request from '@ohos.request';
+import { BusinessError } from '@ohos.base';
+import { GlobalContext } from '../utils/GlobalThis';
+import fs from '@ohos.file.fs';
+import installer from '@ohos.bundle.installer';
+
+import common from '@ohos.app.ability.common';
+import buffer from '@ohos.buffer';
+import JGRequest from '../utils/Request';
+
+
+@Entry
+@Component
+struct TestDownloadPage {
+  @State message: string = '下载1111';
+
+  aboutToAppear(): void {
+
+
+  }
+
+  download = () => {
+    let url = "http://10.88.11.200:10000/openharmony/entry.hap"
+
+    try {
+      // 需要手动将 url 替换为真实服务器的 HTTP 协议地址
+      request.downloadFile(getContext(this), { url: url }).then((data: request.DownloadTask) => {
+        let downloadTask: request.DownloadTask = data;
+        downloadTask.on('progress', (r, t) => {
+          console.log("xxxxxxxxxxxxx", r, t)
+        })
+      }).catch((err: BusinessError) => {
+        console.error(`xxxxxxxxxxxxFailed to request the download. Code: ${err.code}, message: ${err.message}`);
+      })
+    } catch (err) {
+      console.error(`xxxxxxxxxxxxxFailed to request the download. err: ${JSON.stringify(err)}`);
+    }
+
+  }
+
+  downloadApp() {
+
+    let _this = this;
+
+    // 下载路径,示例: /data/storage/el2/base/haps/entry/files/org.ohosdev.deviceinfo-v1.0.0.hap
+    let filePath = getContext(this).filesDir + '/' + 'packageName' + '-' + '1.0.0' + ".hap";
+    console.log("xxxxxxxxxxxx filepath", filePath)
+    // 判断文件是否存在
+    fs.access(filePath).then((res) => {
+
+      // 不存在,下载并安装
+      try {
+        console.log("xxxxxxxxxxx  下载")
+        request.downloadFile(getContext(this), {
+          url: "http://10.88.11.200:10000/openharmony/entry.hap",
+          filePath: filePath,
+          header: {
+            'Content-Type': 'multipart/form-data',
+          }
+        }).then((downloadTask) => {
+
+          console.log("xxxxxxxxxxxxxxx", JSON.stringify(downloadTask))
+
+          // 监听下载完成
+          downloadTask.on('complete', () => {
+            console.info('xxxxxxxxxxxxxxxxxxDownload task completed.');
+            // 安装应用
+            // _this.installApp(filePath);
+          });
+          downloadTask.on('progress', (r, t) => {
+            console.log("xxxxxxxxxxxxx", r, t)
+          })
+          // // 监听下载失败
+          downloadTask.on('fail', (err) => {
+            console.info('xxxxxxxxxxx Download task failed. Cause:' + JSON.stringify(err));
+
+          });
+        }).catch((err: BusinessError) => {
+          console.error('xxxxxxxxxxxxxxxxxxxxxxxxFailed to request the download. Cause: ' + JSON.stringify(err));
+
+        })
+      } catch (err) {
+        // err.message: bad file path   Download File already exists
+        console.error('xxxxxxxxxxx xerr.code : ' + err.code + ', err.message : ' + err.message);
+
+      }
+
+    }).catch((err: BusinessError) => {
+      console.info("xxxxxxxxxxx access failed with error message: " + err.message + ", error code: " + err.code);
+    });
+  }
+
+  downloadAgent = () => {
+    let config: request.agent.Config = {
+      action: request.agent.Action.DOWNLOAD,
+      url: "http://10.88.11.200:10000/openharmony/entry.hap",
+      gauge: true,
+      overwrite: true,
+      // network: request.agent.Network.WIFI,
+    };
+    request.agent.create(getContext(), config).then((task: request.agent.Task) => {
+
+      task.on('progress', async (progress) => {
+        console.warn(`xxxxxxxxxxx   /Request download status ${progress.state}, downloaded ${progress.processed}`);
+      })
+      task.on('completed', async () => {
+        console.warn(`xxxxxxxxxxx  /Request download completed`);
+      })
+    }).catch((err: BusinessError) => {
+      console.info("xxxxxxxxxxx access failed with error message: " + err.message + ", error code: " + err.code);
+    });
+  }
+
+  // 安装应用 或 更新应用
+  installApp(hapPath: string) {
+    let hapFilePaths = [hapPath];
+    try {
+      installer.getBundleInstaller().then(data => {
+        data.install(hapFilePaths, {
+          userId: 100,
+          isKeepData: false,
+          installFlag: 1,
+        }, err => {
+          // if (err) {
+          //   console.error('install failed:' + err.message);
+          // } else {
+          //   console.info('install successfully.');
+          //
+          // }
+        });
+      }).catch(() => {
+        // console.error('getBundleInstaller failed. Cause: ' + error.message);
+
+      });
+    } catch (error) {
+      // console.error('getBundleInstaller failed. Cause: ' + error.message);
+
+    }
+  }
+
+  build() {
+    Row() {
+      Column() {
+        Text(this.message)
+          .fontSize(50)
+          .fontWeight(FontWeight.Bold)
+          .onClick(() => {
+            this.downloadApp()
+          })
+      }
+      .width('100%')
+    }
+    .height('100%')
+  }
+}

+ 17 - 0
entry/src/main/ets/pages/TestHdcInstallPage.ets

@@ -0,0 +1,17 @@
+@Entry
+@Component
+struct TestHdcInstallPage {
+  @State message: string = 'entry hap signed';
+
+  build() {
+    Row() {
+      Column() {
+        Text(this.message)
+          .fontSize(50)
+          .fontWeight(FontWeight.Bold)
+      }
+      .width('100%')
+    }
+    .height('100%')
+  }
+}

+ 65 - 0
entry/src/main/ets/utils/EquipmentRequest.ets

@@ -0,0 +1,65 @@
+import axios, { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from '@ohos/axios';
+
+import { printError, printRequest, printResponse, handleRes } from './Helps';
+import uploadInstance from './UploadUtil';
+
+
+// 创建实例
+const JGRequest = axios.create(
+  {
+    baseURL: uploadInstance.uploadParams.stationIP + ':8000',
+    headers: {
+      'Content-Type': 'application/json;charset=UTF-8'
+    },
+    timeout: 60 * 1000,
+  }
+)
+
+
+// 添加请求拦截器
+JGRequest.interceptors.request.use((config: InternalAxiosRequestConfig) => {
+
+  // 以后登录之后可以在这里传
+  //config.headers.Authorization = CommonConstants.AUTH_TOKEN
+  //  config.headers.Authorization="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJsb2dpblR5cGUiOiJsb2dpbiIsImxvZ2luSWQiOnsiaWQiOjM3LCJsb2dpblR5cGUiOiJhaW8ifSwiZGV2aWNlIjoiYWlvIiwiZWZmIjoxNzE3NTExMjYwODI4LCJyblN0ciI6InRSenNBTGdlZ3lqS0FHeDZTSkdYZTNLbFY3eWh1OG1PIn0.FVAeESiz_PH1NtBFDmGZr0IwtXzubV2d8JTQdGdJnxc"
+  printRequest(config)
+
+  return config;
+}, (error: AxiosError) => {
+  // 对请求错误做些什么
+  printError(error)
+  return Promise.reject(error);
+});
+// 添加响应拦截器
+JGRequest.interceptors.response.use((response: AxiosResponse) => {
+  // 对响应数据做点什么
+  printResponse(response)
+
+  let res = handleRes(response)
+  let success = res[0] as boolean
+  let msg = res[1] as string
+  // console.log('textTag'+"handleRes的返回结果 ", success, msg)
+
+  if (success) {
+    //  console.log('textTag'+"handleRes的返回结果 ", JSON.stringify(response.data))
+    // return response.data.data;
+    return response.data;
+  }
+  else {
+    return Promise.reject<string>(msg)
+
+  }
+
+}, (error: AxiosError) => {
+  // 对响应错误做点什么
+  printError(error)
+
+  return Promise.reject(error);
+});
+
+
+export default JGRequest;
+
+
+
+

+ 1 - 0
entry/src/main/ets/utils/UploadUtil.ets

@@ -17,6 +17,7 @@ interface BridgeParams {
   methodName?: string,
   apiUrlPath?: string //上传完成后调的接口 不包含baseurl
   method?: string
+  stationIP?: string
 }
 
 // 上传文件后,返回一个图片的url,然后再调用其他接口上传url和一些值, 如果有其他接口需要key,在这里添加,然后在下面赋值就行了

+ 1 - 1
entry/src/main/ets/utils/helps.ets

@@ -50,7 +50,7 @@ const printRequest = (config: InternalAxiosRequestConfig) => {
 
 const printResponse = (response: AxiosResponse) => {
   if (pResponse) {
-    console.debug(TAG, 'handleRes response: ', JSON.stringify(response))
+    console.debug(TAG, 'printResponse response: ', JSON.stringify(response))
   }
   if (pData) {
     console.debug(TAG, "printResponse data", JSON.stringify(response.data))

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

@@ -7,6 +7,242 @@
     {
       "name": "gray_bg",
       "value": "#FF928888"
+    },
+    {
+      "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"
+    },
+    {
+      "name": "order_select_background",
+      "value": "#0A59F7"
+    },
+    {
+      "name": "order_producing_state_background",
+      "value": "#0A59F7"
+    },
+    {
+      "name": "order_wait_state_background",
+      "value": "#CCCCCC"
+    },
+    {
+      "name": "order_finished_state_background",
+      "value": "#64BB5C"
+    },
+    {
+      "name": "divider_horizontal_color",
+      "value": "#70777A"
+    },
+    {
+      "name": "process_sort_ring_color",
+      "value": "#303030"
+    },
+    {
+      "name": "OtherStorage_CallMaterials_text_color",
+      "value": "#e6000000"
+    },
+    {
+      "name": "process_card_green_color",
+      "value": "#64BB5C"
+    },
+    {
+      "name": "process_card_blue_color",
+      "value": "#0A59F7"
+    },
+    {
+      "name": "material_collect_border_color",
+      "value": "#b3b3b3"
+    },
+    {
+      "name": "process_card_black_color",
+      "value": "#565656"
+    },
+    {
+      "name": "process_divider_white_color",
+      "value": "#FFFFFF"
+    },
+    {
+      "name": "process_divider_grey_color",
+      "value": "#cccccc"
+    },
+    {
+      "name": "process_card_grey_color",
+      "value": "#f2f2f2"
+    },
+    {
+      "name": "process_card_red_color",
+      "value": "#E84026"
+    },
+    {
+      "name": "process_nameplate_grey_color",
+      "value": "#666666"
+    },
+    {
+      "name": "process_circulation_select_color",
+      "value": "#CEDEFD"
+    },
+    {
+      "name": "process_worker_font_color",
+      "value": "#606162"
+    },
+    {
+      "name": "login_background_color",
+      "value": "#A0A8B2"
+    },
+    {
+      "name": "text_input_placeholder_color",
+      "value": "#B3B3B3"
+    },
+    {
+      "name": "login_text_input_placeholder_color",
+      "value": "#84888D"
+    },
+    {
+      "name": "login_text_input_font_color",
+      "value": "#1A1A1A"
+    },
+    {
+      "name": "general_border_black_color",
+      "value": "#000000"
+    },
+    {
+      "name": "black_100",
+      "value": "#000000"
+    },
+    {
+      "name": "black_10",
+      "value": "#1a000000"
+    },
+    {
+      "name": "black_90",
+      "value": "#e6000000"
+    },
+    {
+      "name": "black_60",
+      "value": "#99000000"
+    },
+    {
+      "name": "grey_100",
+      "value": "#D9DBDD"
+    },
+    {
+      "name": "green_100",
+      "value": "#64BB5C"
+    },
+    {
+      "name": "brown_100",
+      "value": "#E84026"
+    },
+    {
+      "name": "blue_100",
+      "value": "#0A59F7"
+    },
+    {
+      "name": "blue_20",
+      "value": "#330a59f7"
+    },
+    {
+      "name": "white_E3E5E7",
+      "value": "#E3E5E7"
+    },
+    {
+      "name": "white_f1f3f5",
+      "value": "#F1F3F5"
+    },
+    {
+      "name": "Green_64BB5C",
+      "value": "#64BB5C"
+    },
+    {
+      "name": "black_6",
+      "value": "#0f000000"
+    },
+    {
+      "name": "Green_20",
+      "value": "#3364BB5C"
+    },
+    {
+      "name": "pale_blue_background_color",
+      "value": "#D5E7D6"
+    },
+    {
+      "name": "disable_grey_background_color",
+      "value": "#D9DBDD"
+    },
+    {
+      "name": "white_100",
+      "value": "#ffff"
+    },
+    {
+      "name": "gray_6666",
+      "value": "#666666"
+    },
+    {
+      "name": "black_30",
+      "value": "#4D000000"
+    },
+    {
+      "name": "red_100",
+      "value": "#E84026"
+    },
+    {
+      "name": "warn_1",
+      "value": "#E9E98E40"
+    },
+    {
+      "name": "yellow_1",
+      "value": "#E9EEC706"
     }
   ]
 }

二进制
entry/src/main/resources/base/media/chengkongdianyuan.png


二进制
entry/src/main/resources/base/media/diandongluosidao.png


二进制
entry/src/main/resources/base/media/diannengbiao.png


二进制
entry/src/main/resources/base/media/dukaqi.png


二进制
entry/src/main/resources/base/media/multimeter.png


二进制
entry/src/main/resources/base/media/sansedeng.png


二进制
entry/src/main/resources/base/media/saomaqiang.png


二进制
entry/src/main/resources/base/media/shukongdian.png


二进制
entry/src/main/resources/base/media/zhaomingdeng.png


二进制
entry/src/main/resources/base/media/zhihuigc.png


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

@@ -2,6 +2,9 @@
   "src": [
     "pages/Index",
     "pages/CameraPage",
-    "pages/SelectFilePage"
+    "pages/SelectFilePage",
+    "pages/TestHdcInstallPage",
+    "pages/TestDownloadPage",
+    "pages/StationDevicesPage"
   ]
 }