jeremy пре 9 месеци
родитељ
комит
dcfc0e97fa

+ 22 - 0
src/router/userRouter.js

@@ -592,6 +592,28 @@ const userRoutes = [
 			type: "menu",
 			permission: 'SBGL'
 		},
+		children: [
+			{
+				path: "/deviceManagement",
+				name: "deviceManagement",
+				meta: {
+					title: "健康一体机",
+					icon: "el-icon-ice-cream-round",
+					type: "menu"
+				},
+				component: "deviceManagement"
+			},
+			{
+				path: "/device/ecgManage",
+				name: "ecgManage",
+				meta: {
+					title: "心电图仪",
+					icon: "el-icon-tools",
+					type: "menu"
+				},
+				component: "device/ecgManage"
+			}
+		],
 		component: "deviceManagement",
 	},
 	{

+ 163 - 0
src/views/device/ecgManage/components/deviceFrom.vue

@@ -0,0 +1,163 @@
+
+<template>
+  <el-form
+    :model="formInline"
+    class="demo-form-inline"
+    label-position="right"
+    label-width="150px"
+  >
+    <el-form-item label="物理唯一码" required>
+      <el-col :span="21">
+        <el-input
+          v-model="formInline.serialNumber"
+          placeholder="请输入设备物理唯一码"
+          clearable
+        />
+      </el-col>
+    </el-form-item>
+    <el-form-item label="型号">
+      <el-col :span="21">
+        <el-input
+          v-model="formInline.model"
+          placeholder="请输入设备型号"
+          clearable
+        />
+      </el-col>
+    </el-form-item>
+    <el-form-item label="软件版本">
+      <el-col :span="21">
+        <el-input
+          v-model="formInline.softwareVersion"
+          placeholder="请输入软件版本"
+          clearable
+        />
+      </el-col>
+    </el-form-item>
+    <el-form-item label="系统版本">
+      <el-col :span="21">
+        <el-input
+          v-model="formInline.oSVersion"
+          placeholder="请输入系统版本"
+          clearable
+        />
+      </el-col>
+    </el-form-item>
+    <el-form-item label="描述">
+      <el-col :span="21">
+        <el-input
+          type="textarea"
+          placeholder="请输入描述内容"
+          v-model="formInline.description"
+          :autosize="{ minRows: 4 }"
+          clearable
+          resize="none"
+          style="width: 100%"
+        />
+      </el-col>
+    </el-form-item>
+    <el-form-item label="所属机构">
+      <el-col :span="21">
+        <el-select
+          v-model="formInline.organizationCode"
+          placeholder="请选择"
+          :disabled="isShowMode"
+          filterable
+          clearable
+          style="width: 100%"
+          @change="organizationSelectChange"
+        >
+          <el-option
+            v-for="option in formInline.orgList"
+            :key="option.code"
+            :label="option.organizationName"
+            :value="option.code"
+          ></el-option>
+        </el-select>
+      </el-col>
+    </el-form-item>
+    <el-form-item label="所属团队">
+      <el-col :span="21">
+        <el-select
+          v-model="formInline.teamCode"
+          placeholder="请选择"
+          :disabled="isShowMode"
+          filterable
+          clearable
+          style="width: 100%"
+          @change="teamnSelectChange"
+        >
+          <el-option
+            v-for="option in formInline.teamList"
+            :key="option.code"
+            :label="option.teamName"
+            :value="option.code"
+          ></el-option>
+        </el-select>
+      </el-col>
+    </el-form-item>
+  </el-form>
+</template> <script>
+import { Plus } from "@element-plus/icons-vue";
+import { GetTeamPageByOrganizationRequest } from "@/jsonrpc/services/team.m";
+import { UserPageRequest } from "@/jsonrpc/services/user.m";
+import store from "@/store";
+import { PageRequest } from "@/jsonrpc/services/authentication.m";
+export default {
+  components() {
+    Plus;
+  },
+  props: {
+    formInline: Object,
+  },
+  methods: {
+    async organizationSelectChange(value) {
+      this.formInline.organizationCode = value;
+      this.formInline.teamCode = "";
+      await this.getTeamPageAsync(value);
+    },
+    async teamnSelectChange(value) {      
+      this.formInline.teamCode = value;
+    },
+    async getTeamPageAsync(code) {
+      const request = new GetTeamPageByOrganizationRequest({
+        organizationCode: code,
+        token: store.state.userInfo.token,
+        pageIndex: 1,
+        pageSize: 100,
+      }).toJson();
+
+      var result = await this.$rpc.team.getTeamPageByOrganizationAsync(request);
+      this.formInline.teamList = result.pageData;
+    },
+    async getOrgList() {
+      const request = new PageRequest({
+        pageIndex: 1,
+        pageSize: 2000,
+        token: store.state.userInfo.token,
+      }).toJson();
+      const tableData = await this.$rpc.organization.getOrganizationPageAsync(
+        request
+      );
+      this.formInline.orgList = tableData.pageData;
+    }
+  },
+  async mounted() {
+    await this.getOrgList();
+    await this.getTeamPageAsync(this.formInline.organizationCode);
+    if (this.formInline.teamCode && this.formInline.teamList) {
+      var isHadTeam = this.formInline.teamList.some(
+        (item) => item.code == this.formInline.teamCode
+      );
+      if (!isHadTeam) {
+        this.formInline.teamCode = "";
+        this.formInline.userCode = "";
+      }
+    }
+  },
+};
+</script>
+<style scoped>
+.demo-form-inline {
+  margin-top: 20px;
+}
+</style>

+ 310 - 0
src/views/device/ecgManage/index.vue

@@ -0,0 +1,310 @@
+<template>
+  <div>
+    <el-container>
+      <el-header>
+        <div class="left-panel">
+          <el-button
+            type="primary"
+            icon="el-icon-plus"
+            @click="add"
+          ></el-button>
+        </div>
+        <div class="right-pannel">
+          <div class="right-panel-search">
+            <el-input
+              v-model="keyword"
+              clearable
+              placeholder="请输入设备唯一码"
+              @keyup.enter="search"
+            ></el-input>
+            <el-button
+              type="primary"
+              icon="el-icon-search"
+              @click="search"
+              title="查询"
+            ></el-button>
+          </div>
+        </div>
+      </el-header>
+      <el-main class="nopadding">
+        <scTable
+          ref="table"
+          :data="tableData"
+          row-key="code"
+          stripe
+          :tableTotal="total"
+          :pageSize="pageSize"
+          :pageIndex="currentPage"
+          :currentPage="currentPage"
+          @update:page-size="pageSizeChange"
+          :getTableData="(i) => paginationChange(i)"
+          higlight-current-row
+        >
+          <el-table-column
+            label="序号"
+            type="index"
+            width="50"
+            align="center"
+          ></el-table-column>
+          <!-- <el-table-column type="selection" width="50" fixed   align="center"/> -->
+          <el-table-column
+            label="云唯一码"
+            prop="uniqueCode"
+            width="100"
+            align="center"
+          />
+          <el-table-column
+            label="物理唯一码"
+            prop="serialNumber"
+            align="center"
+            width="150"
+          />
+          <el-table-column
+            label="型号"
+            prop="model"
+            width="120"
+            align="center"
+          />
+          <el-table-column
+            label="软件版本"
+            prop="softwareVersion"
+            width="150"
+            align="center"
+          />
+          <el-table-column
+            label="系统版本"
+            prop="oSVersion"
+            width="180"
+            align="center"
+          />
+          <el-table-column
+            label="机构名称"
+            prop="organizationName"
+            align="center"
+            showOverflowTooltip="true"
+          />
+          <el-table-column
+            label="团队名称"
+            prop="teamName"
+            align="center"
+            showOverflowTooltip="true"
+          />
+          <el-table-column
+            label="创建日期"
+            prop="createTime"
+            width="150"
+            align="center"
+          >
+            <template #default="scope">
+              <span>{{
+                this.$TOOL.dateFormat(
+                  new Date(scope.row.createTime),
+                  "yyyy-MM-dd hh:mm:ss"
+                )
+              }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column
+            fixed="right"
+            label="操作"
+            width="150"
+            align="center"
+          >
+            <template #default="scope">
+              <div>
+                <el-button
+                  link
+                  type="primary"
+                  size="small"
+                  @click="table_edit(scope.row)"
+                  >编辑</el-button
+                >
+                <el-button
+                  link
+                  type="primary"
+                  size="small"
+                  @click="table_del(scope.row)"
+                  >删除</el-button
+                >
+              </div>
+            </template>
+          </el-table-column>
+        </scTable>
+      </el-main>
+    </el-container>
+    <el-dialog
+      :title="titleMap[mode]"
+      v-model="saveDialogVisible"
+      width="850"
+      destroy-on-close
+    >
+      <template #footer>
+        <div>
+          <el-button @click="saveDialogVisible = false">取 消</el-button>
+          <el-button
+            v-if="mode !== 'show'"
+            type="primary"
+            @click="doDevice(mode)"
+            >保 存</el-button
+          >
+        </div>
+      </template>
+      <template #default>
+        <deviceFrom :formInline="formInline"></deviceFrom>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  CreateDeviceRequest,
+  GetDeviceRequest,
+  GetDeviceByUniqueCodeRequest,
+  SetDeviceOrganizationRequest,
+  DevicePageRequest,
+  RemoveDeviceRequest,
+  UpdateDeviceRequest,
+} from "@/jsonrpc/services/device.m";
+import store from "@/store";
+
+import deviceFrom from "./components/deviceFrom.vue";
+export default {
+  components: {
+    deviceFrom,
+  },
+  data() {
+    return {
+      keyword: "", // 搜索关键词
+      tableData: [], // 表格数据
+      saveDialogVisible: false,
+      mode: "add",
+      titleMap: { add: "新增设备", edit: "编辑设备" },
+      formInline: {},
+      pageSize: 10,
+      currentPage: 1,
+      total: 0,
+    };
+  },
+  methods: {
+    add() {
+      this.saveDialogVisible = true;
+      this.formInline = {};
+    },
+
+    async doDevice(mode) {
+      if (mode == "add") {
+        await this.addDevice();
+      } else if (mode == "edit") {
+        await this.updateDevice();
+      }
+    },
+    //创建
+    async addDevice() {
+      var request = new CreateDeviceRequest({
+        serialNumber: this.formInline.serialNumber,
+        model: this.formInline.model,
+        softwareVersion: this.formInline.softwareVersion,
+        oSVersion: this.formInline.oSVersion,
+        description: this.formInline.description,
+        organizationCode: this.formInline.organizationCode,
+        teamCode: this.formInline.teamCode,
+        deviceType: 1,
+        token: store.state.userInfo.token,
+      }).toJson();
+      const result = await this.$rpc.device.createDeviceAsync(request);
+      if (result) {
+        this.saveDialogVisible = false;
+        await this.paginationChange();
+      }
+    },
+    //更新
+    async updateDevice() {
+      debugger;
+      const request = new UpdateDeviceRequest({
+        code: this.formInline.code,
+        model: this.formInline.model,
+        softwareVersion: this.formInline.softwareVersion,
+        oSVersion: this.formInline.oSVersion,
+        description: this.formInline.description,
+        organizationCode: this.formInline.organizationCode,
+        teamCode: this.formInline.teamCode,
+        token: store.state.userInfo.token,
+      }).toJson();
+      const result = await this.$rpc.device.updateDeviceAsync(request);
+      if (result) {
+        this.saveDialogVisible = false;
+        await this.paginationChange();
+      }
+    },
+    async search() {
+      await this.paginationChange();
+    },
+    async paginationChange(i) {
+      this.currentPage = i || 1;
+      await this.getList();
+    },
+    //编辑
+    async table_edit(row) {
+      this.mode = "edit";
+      this.formInline = await this.getDataDetailAsync(row);
+      this.saveDialogVisible = true;
+    },
+    //删除
+    async table_del(row) {
+      this.$confirm(`确定删除设备${row.uniqueCode}吗?`, "提示", {
+        type: "warning",
+        confirmButtonText: "确 认",
+        cancelButtonText: "取 消",
+        confirmButtonClass: "el-button--danger",
+      })
+        .then(async () => {
+          const request = new RemoveDeviceRequest({
+            code: row.code,
+            token: store.state.userInfo.token,
+          }).toJson();
+          var result = await this.$rpc.device.removeDeviceAsync(request);
+          if (result) {
+            this.$message.success("删除成功");
+            await this.paginationChange();
+          }
+        })
+        .catch(() => {
+          console.log("RemoveDeviceRequest method exception");
+        });
+    },
+    //获取详细信息
+    async getDataDetailAsync(row) {
+      const request = new GetDeviceRequest({
+        token: store.state.userInfo.token,
+        code: row.code,
+      }).toJson();
+      const result = await this.$rpc.device.getDeviceDetailAsync(request);
+      return result;
+    },
+
+    //获取分页信息
+    async getList() {
+      const pageRequest = new DevicePageRequest({
+        pageIndex: this.currentPage,
+        pageSize: this.pageSize,
+        token: store.state.userInfo.token,
+        keyword: this.keyword,
+        deviceType: 1,
+      }).toJson();
+      const tableData = await this.$rpc.device.getDevicePageAsync(pageRequest);
+      this.total = tableData.dataCount;
+      this.tableData = tableData.pageData;
+    },
+  },
+};
+</script>
+
+<style scoped>
+.ellipsis {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+</style>
+

+ 3 - 6
src/views/deviceManagement/index.vue

@@ -57,6 +57,7 @@
             label="物理唯一码"
             prop="serialNumber"
             align="center"
+            width="150"
           />
           <el-table-column
             label="型号"
@@ -88,12 +89,6 @@
             align="center"
             showOverflowTooltip="true"
           />
-          <el-table-column
-            label="描述"
-            prop="description"
-            align="center"
-            showOverflowTooltip="true"
-          />
           <el-table-column
             label="创建日期"
             prop="createTime"
@@ -214,6 +209,7 @@ export default {
         description: this.formInline.description,
         organizationCode: this.formInline.organizationCode,
         teamCode: this.formInline.teamCode,
+        deviceType: 0,
         token: store.state.userInfo.token,
       }).toJson();
       const result = await this.$rpc.device.createDeviceAsync(request);
@@ -294,6 +290,7 @@ export default {
         pageSize: this.pageSize,
         token: store.state.userInfo.token,
         keyword: this.keyword,
+        deviceType: 0,
       }).toJson();
       const tableData = await this.$rpc.device.getDevicePageAsync(pageRequest);
       this.total = tableData.dataCount;

+ 155 - 0
src/views/user/components/selectDeviceList.vue

@@ -0,0 +1,155 @@
+<template>
+  <el-dialog
+    title="绑定心电图仪"
+    v-model="visible"
+    width="850"
+    destroy-on-close
+  >
+    <template #footer>
+      <el-button @click="visible = false">取消</el-button>
+      <el-button type="primary" @click="bindEcg">保存</el-button>
+    </template>
+    <div>
+      <el-container>
+        <el-header>
+          <div class="left-panel"></div>
+          <div class="right-panel">
+            <div class="right-panel-search">
+              <el-input
+                v-model="keyword"
+                clearable
+                placeholder="请输入设备唯一码"
+                @keyup.enter="search"
+              ></el-input>
+              <el-button
+                type="primary"
+                icon="el-icon-search"
+                @click="search"
+                title="查询"
+              ></el-button>
+            </div>
+          </div>
+        </el-header>
+        <el-main class="nopadding">
+          <scTable
+            ref="deviceTable"
+            :data="tableData"
+            row-key="code"
+            stripe
+            :tableTotal="total"
+            :pageSize="pageSize"
+            :pageIndex="currentPage"
+            :currentPage="currentPage"
+            @update:page-size="pageSizeChange"
+            :getTableData="(i) => paginationChange(i)"
+            higlight-current-row
+          >
+            <el-table-column prop="code" :width="34">
+              <template #default="scope">
+                <el-radio
+                  v-model="selectCode"
+                  :label="scope.row.code"
+                  @click="selectCode = scope.row.code"
+                  >{{&nbsp;}}</el-radio
+                >
+              </template>
+            </el-table-column>
+            <el-table-column
+              label="云唯一码"
+              prop="uniqueCode"
+              width="100"
+              align="center"
+            />
+            <el-table-column
+              label="物理唯一码"
+              prop="serialNumber"
+              align="center"
+              width="150"
+            />
+            <el-table-column
+              label="机构名称"
+              prop="organizationName"
+              align="center"
+              showOverflowTooltip="true"
+            />
+            <el-table-column
+              label="团队名称"
+              prop="teamName"
+              align="center"
+              showOverflowTooltip="true"
+            />
+          </scTable>
+        </el-main>
+      </el-container>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import { DevicePageRequest } from "@/jsonrpc/services/device.m";
+import store from "@/store";
+export default {
+  components: {},
+  data() {
+    return {
+      keyword: "", // 搜索关键词
+      tableData: [], // 表格数据
+      visible: false,
+      formInline: {},
+      pageSize: 10,
+      currentPage: 1,
+      total: 0,
+      selectCode: "",
+      userCode: "",
+    };
+  },
+  methods: {
+    async open(row) {
+      this.visible = true;
+      this.userCode = row.code;
+      this.selectCode = row.ecgCode;
+    },
+    async search() {
+      await this.paginationChange();
+    },
+    async paginationChange(i) {
+      this.currentPage = i || 1;
+      await this.getList();
+    },
+    //获取分页信息
+    async getList() {
+      const pageRequest = new DevicePageRequest({
+        pageIndex: this.currentPage,
+        pageSize: this.pageSize,
+        token: store.state.userInfo.token,
+        keyword: this.keyword,
+        deviceType: 1,
+      }).toJson();
+      const tableData = await this.$rpc.device.getDevicePageAsync(pageRequest);
+      this.total = tableData.dataCount;
+      this.tableData = tableData.pageData;
+    },
+    async bindEcg(row) {
+      var res = await this.$rpc.user.bindEcgCodeAsync({
+        UserCode: this.userCode,
+        EcgCode: this.selectCode,
+        Token: store.state.userInfo.token,
+      });
+      if (res) {
+        this.$message.success("操作成功");
+        this.visible = false;
+        this.$emit("success");
+      }
+    },
+  },
+};
+</script>
+
+<style scoped>
+.ellipsis {
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+</style>
+

+ 27 - 9
src/views/user/index.vue

@@ -136,7 +136,7 @@
             <el-table-column
               fixed="right"
               label="操作"
-              width="240"
+              width="280"
               align="center"
             >
               <template #default="props">
@@ -152,25 +152,33 @@
                     link
                     type="primary"
                     size="small"
-                    @click="setArea(props.row)"
-                    >设置区域</el-button
+                    @click="updatePassword(props.row)"
                   >
+                    修改密码
+                  </el-button>
                   <el-button
                     link
                     type="primary"
                     size="small"
-                    @click="updatePassword(props.row)"
+                    @click="resetUserName(props.row)"
                   >
-                    修改密码
+                    修改用户名
                   </el-button>
                   <el-button
                     link
                     type="primary"
                     size="small"
-                    @click="resetUserName(props.row)"
+                    @click="removeUser(props.row)"
                   >
-                    修改用户名
+                    删除
                   </el-button>
+                  <el-button
+                    link
+                    type="primary"
+                    size="small"
+                    @click="setArea(props.row)"
+                    >设置区域</el-button
+                  >
                   <el-button
                     link
                     type="primary"
@@ -183,9 +191,9 @@
                     link
                     type="primary"
                     size="small"
-                    @click="removeUser(props.row)"
+                    @click="bindECGCode(props.row)"
                   >
-                    删除
+                    绑定心电图仪
                   </el-button>
                 </div>
               </template></el-table-column
@@ -323,12 +331,15 @@
         </div>
       </template>
     </el-dialog>
+
+    <select-device-list ref="selectDeviceDialog" @success="search"></select-device-list>
   </div>
 </template>
 <script>
 import { ElNotification } from "element-plus";
 import userFrom from "./components/userFrom.vue";
 import areaFrom from "./components/areaFrom.vue";
+import selectDeviceList from "./components/selectDeviceList.vue";
 import { PageRequest } from "@/jsonrpc/services/authentication.m";
 import {
   CreateUserRequest,
@@ -351,6 +362,7 @@ export default {
   components: {
     userFrom,
     areaFrom,
+    selectDeviceList,
     orgMenu,
   },
   data() {
@@ -563,6 +575,12 @@ export default {
       }
       this.bindUSCodeVisible = true;
     },
+    async bindECGCode(row) {
+      this.$nextTick(() => {
+        this.$refs.selectDeviceDialog.open(row);
+      });
+    },
+    async saveAdmin() {},
     async searchUS(usCode) {
       if (usCode && usCode.length == 6) {
         var info = await this.$rpc.device.getUltrasoundByShortCodeAsync({