Prechádzať zdrojové kódy

feature(遵义人民):平台入室预约功能开发

yanglingling 10 mesiacov pred
rodič
commit
eeb9f23dd6

+ 3 - 2
public/config.js

@@ -11,10 +11,11 @@ const $GlobalConfig = {
   VUE_APP_MicroSrvProxy_API: 'http://192.168.0.219:9983/',
   // 登录验证微服务名称
   VUE_APP_AdminPath: 'dashoo.labsop.admin',
-  VUE_APP_SETTING_PATH: 'dashoo.labsop.finance-zzh',
+  VUE_APP_SETTING_PATH: 'dashoo.labsop.website',
   VUE_APP_FINANCE_PATH: 'dashoo.labsop.finance',
   VUE_APP_INSTR_PATH: 'dashoo.labsop.apparatus',
-  VUE_APP_SCIENTIFIC_PATH: 'dashoo.labsop.scientific-yll',
+  VUE_APP_SCIENTIFIC_PATH: 'dashoo.labsop.scientific',
+  VUE_APP_PLATFORM_PATH: 'dashoo.labsop.platform',
   // 租户码
   VUE_APP_TENANT: 'default'
 }

+ 13 - 0
src/api/platform/index.js

@@ -0,0 +1,13 @@
+import request from "@/utils/micro_request";
+
+const platformPath = $GlobalConfig.VUE_APP_PLATFORM_PATH;
+
+// 平台管理
+export function getPlatFormList(data) {
+    return request.postRequest(platformPath,'PlatPlatform','GetPlatFormList', data)
+}
+
+// 平台预约
+export function create(data) {
+    return request.postRequest(platformPath,'PlatPlatformAppoint','Create', data)
+}

+ 341 - 138
src/views/technical-plat/components/edit.vue

@@ -1,133 +1,239 @@
 <template>
   <div>
     <el-dialog
-      :title="title"
-      :visible.sync="state.isShowDialog"
-      :close-on-click-modal="false"
-      width="1200px"
+        :title="title"
+        :visible.sync="state.isShowDialog"
+        :close-on-click-modal="false"
+        width="1200px"
     >
       <el-form
-        ref="editFormRef"
-        :model="form"
-        label-width="100px"
-        size="mini"
-        label-position="top"
-        :rules="rules"
-        closeable
+          ref="editFormRef"
+          :model="form"
+          label-width="100px"
+          size="mini"
+          label-position="top"
+          :rules="rules"
+          closeable
       >
         <div class="form-group">
+          <h3>申请人</h3>
           <el-row :gutter="20" class="form-row-wrap">
             <el-col :span="12">
-              <el-form-item label="预约项目" prop="userContact">
+              <el-form-item label="姓名" prop="memberName">
                 <div class="flex">
-                  <!-- <el-input
-                        placeholder="请输入"
-                        class="w100"
-                        maxlength="11"
-                        v-model="form.field1"
-                      />
-                      <el-button type="primary">选择</el-button> -->
                   <el-select
-                    style="width: 100%"
-                    placeholder="请选择"
-                    v-model="form.field1"
-                    value-key=""
-                    clearable
-                    filterable
+                      v-model="form.memberName"
+                      @change="memberChange"
+                      value-key="id"
+                      class="w100"
+                      placeholder="请选择"
+                      filterable
+                      clearable
                   >
-                    <el-option
-                      label="肿瘤研究课题"
-                      value="肿瘤研究课题"
-                    ></el-option>
+                    <el-option :label="v.nickName" :value="v" :key="v.id" v-for="v in userList" />
                   </el-select>
                 </div>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="预约费用" prop="userContact">
+              <el-form-item label="手机号" prop="memberPhone">
                 <div class="flex">
                   <el-input
-                    placeholder="请输入"
-                    class="w100"
-                    maxlength="11"
-                    v-model="form.field2"
+                      placeholder="请输入"
+                      class="w100"
+                      maxlength="11"
+                      v-model="form.memberPhone"
                   />
                 </div>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="人员姓名" prop="userContact">
+              <el-form-item label="性别" prop="memberSex">
                 <div class="flex">
-                  <el-select
-                    style="width: 100%"
-                    placeholder="请选择"
-                    v-model="form.field3"
-                    value-key=""
-                    clearable
-                    filterable
-                    @change=""
-                  >
-                    <el-option label="省自然" value="省自然"></el-option>
-                    <el-option label="国自然" value="国自然"></el-option>
-                  </el-select>
+                  <el-radio-group v-model="form.memberSex">
+                    <el-radio label="10" value="10">男</el-radio>
+                    <el-radio label="20" value="20">女</el-radio>
+                  </el-radio-group>
+                </div>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="实验开始时间" prop="startDate">
+                <div class="flex">
+                  <el-date-picker
+                      v-model="form.startDate"
+                      type="date"
+                      class="w100"
+                      placeholder="选择实验开始时间">
+                  </el-date-picker>
+                </div>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="实验结束时间" prop="endDate">
+                <div class="flex">
+                  <el-date-picker
+                      v-model="form.endDate"
+                      type="date"
+                      class="w100"
+                      placeholder="选择实验结束时间">
+                  </el-date-picker>
                 </div>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="联系方式" prop="userContact">
+              <el-form-item label="工号/学号" prop="memberNo">
                 <div class="flex">
                   <el-input
-                    placeholder="请输入"
-                    class="w100"
-                    maxlength="11"
-                    v-model="form.field4"
+                      placeholder="请输入"
+                      class="w100"
+                      maxlength="11"
+                      v-model="form.memberNo"
                   />
                 </div>
               </el-form-item>
             </el-col>
             <el-col :span="12">
-              <el-form-item label="预约时间" prop="userContact">
+              <el-form-item label="人员类型" prop="memberType">
+                <el-radio-group v-model="form.memberType">
+                  <el-radio label="10" value="10">本院</el-radio>
+                  <el-radio label="20" value="20">外院</el-radio>
+                  <el-radio label="30" value="30">学生</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="科室" prop="deptId">
+                <div class="flex">
+                  <el-cascader ref="memberDept"
+                               :options="deptData"
+                               @change="memberDeptChange"
+                               :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'deptName' }"
+                               placeholder="请选择科室"
+                               clearable
+                               class="w100"
+                               v-model="form.deptId">
+                    <template #default="{ node, data }">
+                      <span>{{ data.deptName }}</span>
+                      <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                    </template>
+                  </el-cascader>
+                </div>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="工作单位" prop="workPlace">
+                <div class="flex">
+                  <el-input
+                      placeholder="请输入"
+                      class="w100"
+                      maxlength="100"
+                      v-model="form.workPlace"
+                  />
+                </div>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12" v-if="form.memberType === '20'">
+              <el-form-item label="身份证号码" prop="memberIden">
+                <div class="flex">
+                  <el-input
+                      placeholder="请输入"
+                      class="w100"
+                      maxlength="11"
+                      v-model="form.memberIden"
+                  />
+                </div>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12" v-if="form.memberType === '30'">
+              <el-form-item label="导师姓名" prop="mentorName">
+                <div class="flex">
+                  <el-select
+                      v-model="form.mentorName"
+                      @change="mentorChange"
+                      value-key="id"
+                      class="w100"
+                      placeholder="请选择"
+                      filterable
+                      clearable
+                  >
+                    <el-option :label="v.nickName" :value="v" :key="v.id" v-for="v in userList" />
+                  </el-select>
+                </div>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12" v-if="form.memberType === '30'">
+              <el-form-item label="导师电话" prop="mentorPhone">
                 <div class="flex">
                   <el-input
-                    placeholder="请输入"
-                    class="w100"
-                    maxlength="11"
-                    v-model="form.field5"
+                      placeholder="请输入"
+                      class="w100"
+                      maxlength="11"
+                      v-model="form.mentorPhone"
                   />
                 </div>
               </el-form-item>
             </el-col>
+            <el-col :span="12" v-if="form.memberType === '30'">
+              <el-form-item label="导师科室" prop="mentorDeptId">
+                <div class="flex">
+                  <el-cascader ref="mentorDept"
+                               :options="deptData"
+                               @change="mentorDeptChange"
+                               :props="{ checkStrictly: true, emitPath: false, value: 'id', label: 'deptName' }"
+                               placeholder="请选择科室"
+                               clearable
+                               class="w100"
+                               v-model="form.mentorDeptId">
+                    <template #default="{ node, data }">
+                      <span>{{ data.deptName }}</span>
+                      <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                    </template>
+                  </el-cascader>
+                </div>
+              </el-form-item>
+            </el-col>
+            <!-- END -->
+          </el-row>
+          <h3>申请入室平台</h3>
+          <el-row :gutter="20" class="form-row-wrap">
             <el-col :span="12">
-              <el-form-item label="所属课题组" prop="userContact">
+              <el-form-item label="平台" prop="platformName">
                 <div class="flex">
                   <el-input
-                    placeholder="请输入"
-                    class="w100"
-                    maxlength="11"
-                    v-model="form.field6"
+                      disabled
+                      placeholder="请输入"
+                      class="w100"
+                      maxlength="11"
+                      v-model="form.platformName"
                   />
                 </div>
               </el-form-item>
             </el-col>
+            <el-col :span="12">
+              <el-form-item label="时间(月)" prop="platformTime">
+                <div class="flex">
+                  <el-input-number class="w100" v-model.number="form.platformTime" controls-position="right" :min="0" :step="0.1" step-strictly></el-input-number>
+                </div>
+              </el-form-item>
+            </el-col>
             <el-col :span="24">
-              <el-form-item label="预约说明" prop="userContact">
+              <el-form-item label="其它" prop="other">
                 <div class="flex">
                   <el-input
-                    type="textarea"
-                    :rows="3"
-                    placeholder="请输入"
-                    class="w100"
-                    maxlength="11"
-                    v-model="form.field14"
+                      type="textarea"
+                      placeholder="请输入"
+                      class="w100"
+                      maxlength="255"
+                      v-model="form.other"
                   />
                 </div>
               </el-form-item>
             </el-col>
-            <!-- END -->
           </el-row>
         </div>
         <div>
-          <el-checkbox v-model="checked3">
+          <el-checkbox v-model="checked">
             <el-button type="text">
               我已完整阅读并同意 《预约须知》的内容
             </el-button>
@@ -145,86 +251,183 @@
       </template>
     </el-dialog>
     <disclaimer
-      ref="disclaimerRef"
-      @agreeDisclaimer="handleAgreeDisclaimer"
+        ref="disclaimerRef"
+        @agreeDisclaimer="handleAgreeDisclaimer"
     ></disclaimer>
   </div>
 </template>
 
 <script lang="ts">
-  import disclaimer from "./disclaimer.vue";
-  export default {
-    name: "FrontendWebTest",
-    components: {
-      disclaimer,
-    },
-    data() {
-      return {
-        title: "技术平台-预约申请",
-        form: {
-          field1: "",
-          field2: "",
-          field3: "",
-          field4: "",
-          field5: "",
-          field6: "",
-          field7: "",
-          field8: "",
-          field9: "",
-          field10: "",
-          field11: "",
-          field12: "",
-          field13: "",
-          field14: "",
-        },
-        checked3: false,
-        state: {
-          isShowDialog: false,
-          loading: false,
-        },
-        rules: {
-          startTime: [{ required: true, message: "不能为空", trigger: "blur" }],
-        },
-      };
-    },
-    methods: {
-      async openDialog() {
-        this.state.isShowDialog = true;
-      },
-      onCancel() {
-        this.$refs.editFormRef.clearValidate();
-        this.$refs.editFormRef.resetFields();
-        this.state.isShowDialog = false;
+import disclaimer from "./disclaimer.vue";
+import { getToken } from "@/utils/auth";
+import { getDeptTree } from "@/api/dict";
+import { getUserList } from "@/api/instr";
+import { create } from "@/api/platform"
+import to from "await-to-js";
+import { mapGetters } from "vuex";
+export default {
+  name: "FrontendWebTest",
+  components: {
+    disclaimer,
+  },
+  computed: {
+    ...mapGetters(["userInfo"]),
+  },
+  data() {
+    return {
+      title: "技术平台-入室申请",
+      type: '',
+      form: {
+        id: 0,
+        memberId: 0,
+        memberName: "",
+        memberPhone: "",
+        memberSex: "",
+        memberNo: "",
+        memberIden: "",
+        startDate: "",
+        endDate: "",
+        memberType: "",
+        deptId: 0,
+        deptName: "",
+        workPlace: "",
+        mentorId: 0,
+        mentorName: "",
+        mentorPhone: "",
+        mentorDeptId: 0,
+        mentorDeptName: "",
+        platformId: 0,
+        platformName: "",
+        platformType: "",
+        platformTime: 0,
+        other: "",
       },
-      subAdd() {
-        this.$refs.disclaimerRef.openDialog();
+      checked: false,
+      state: {
+        isShowDialog: false,
+        loading: false,
       },
-      handleAgreeDisclaimer() {
-        this.$message.success("提交成功");
-        this.state.isShowDialog = false;
+      rules: {
+        memberName: [{ required: true, message: "不能为空", trigger: "blur" }],
+        memberType: [{ required: true, message: "不能为空", trigger: "change" }],
+        deptId: [{ required: true, message: "不能为空", trigger: "change" }],
+        platformName: [{ required: true, message: "不能为空", trigger: "blur" }],
+        platformTime: [{ required: true, message: "不能为空", trigger: "blur" }],
+        startDate: [{ required: true, message: "不能为空", trigger: "change" }],
+        endDate: [{ required: true, message: "不能为空", trigger: "change" }],
+        mentorName: [{ required: true, message: "不能为空", trigger: "blur" }],
       },
+      deptData: [], // 部门树
+      userList: [], // 用户列表
+    };
+  },
+  methods: {
+    getDicts() {
+      Promise.all([
+        getDeptTree(),
+        getUserList({ noPage: true }),
+      ]).then(([dept, user]) => {
+        this.deptData = dept.data || [];
+        this.userList = user.data.list || [];
+      });
+    },
+    async openDialog(type, row) {
+      // 校验token
+      const token = getToken();
+      if (!token) {
+        return this.$router.push("/login?redirect=/technical-plat/index");
+      }
+
+      this.form = {}
+      this.checked = false
+
+      this.type = type;
+      this.getDicts()
+      if (type === 'add') {
+        this.form.platformId = row.id
+        this.form.platformName = row.platformName
+        this.form.platformType = row.platformType
+      }
+      this.state.isShowDialog = true;
+    },
+    memberDeptChange() {
+      const nodes = this.$refs.memberDept.getCheckedNodes();
+      this.form.deptName = nodes[0].label;
+    },
+    mentorDeptChange() {
+      const nodes = this.$refs.mentorDept.getCheckedNodes();
+      this.form.mentorDeptName = nodes[0].label;
+    },
+    memberChange(user) {
+      this.form.memberId = user.id || null;
+      this.form.memberName = user.nickName || null;
+      this.form.memberPhone = user.phone || '';
+      this.form.memberSex = user.sex || '';
+      this.form.memberNo = user.userName || '';
+      this.form.memberIden = user.idCode || '';
+      this.form.deptId = user.deptId || null;
+      this.form.deptName = user.deptName || '';
     },
-  };
+    mentorChange(user) {
+      this.form.mentorId = user.id || null;
+      this.form.mentorName = user.nickName || null;
+      this.form.mentorPhone = user.phone || '';
+      this.form.mentorDeptId = user.deptId || null;
+      this.form.mentorDeptName = user.deptName || '';
+    },
+    onCancel() {
+      this.$refs.editFormRef.clearValidate();
+      this.$refs.editFormRef.resetFields();
+      this.state.isShowDialog = false;
+    },
+    subAdd() {
+      this.$refs.editFormRef.validate(async valid => {
+        if(valid) {
+          if (!this.checked) {
+            this.$refs.disclaimerRef.openDialog();
+          } else {
+            // 提交申请
+            if (this.type === 'add') {
+              this.form.isTemporary = '20'
+              const [err] = await to(create(this.form));
+              if(err) {
+                this.$message.warning('操作失败')
+                return
+              }
+              this.$message.success("操作成功");
+            }
+            this.state.isShowDialog = false;
+          }
+        }
+      })
+    },
+    handleAgreeDisclaimer() {
+      this.checked = true
+      // this.$message.success("提交成功");
+      // this.state.isShowDialog = false;
+    },
+  },
+};
 </script>
 
 <style lang="scss" scoped>
-  :deep(.el-dialog__body) {
-    padding-top: 10px;
-  }
-  .appoint-section {
-    min-height: 450px;
-  }
-  .exper-info-list {
-    h3 {
-      color: #2c405e;
-      font-weight: bold;
-    }
-    .label {
-      width: 100px;
-    }
-  }
-  .step-tit {
+:deep(.el-dialog__body) {
+  padding-top: 10px;
+}
+.appoint-section {
+  min-height: 450px;
+}
+.exper-info-list {
+  h3 {
     color: #2c405e;
     font-weight: bold;
   }
+  .label {
+    width: 100px;
+  }
+}
+.step-tit {
+  color: #2c405e;
+  font-weight: bold;
+}
 </style>

+ 32 - 83
src/views/technical-plat/index.vue

@@ -3,38 +3,6 @@
     <div class="search-wrap"></div>
     <div class="common-container">
       <section class="section-container">
-        <div class="filter-wrap">
-          <div class="filter-item dept-wrap">
-            <!-- 实验室管理的实验室 -->
-            <div class="left-tit">技术平台</div>
-            <div class="right-filter-content">
-              <div
-                class="more-item"
-                @click="handleExpandFilter()"
-                v-if="laboratoryNameOptions.length > 8"
-              >
-                <span>{{ platFilterExpand ? "收起" : "更多" }}</span>
-                <i v-if="!platFilterExpand" class="el-icon-caret-top"></i>
-                <i v-else class="el-icon-caret-bottom"></i>
-              </div>
-              <div class="list">
-                <div
-                  @click="selectFilterItem(v)"
-                  class="name"
-                  :class="{ avtive: searchForm.laboratoryName == v.name }"
-                  v-for="(v, i) in laboratoryNameOptions"
-                  v-show="!platFilterExpand ? i < 8 : i > -1"
-                  :key="i"
-                >
-                  {{ `${v}` }}
-                </div>
-                <!-- <div class="dragger-container" v-if="platFilterExpand">
-                  <div class="dragger-bar"></div>
-                </div> -->
-              </div>
-            </div>
-          </div>
-        </div>
         <div class="service-list">
           <div class="service-list-header">
             <h4 class="title">技术平台</h4>
@@ -53,15 +21,17 @@
                 />
               </div>
               <div class="text-item">
-                <p class="name mb20">{{ v.name }}</p>
-                <p class="mb20">说明{{ v.content }}</p>
-                <p class="mb20">负责人:{{ v.user }}</p>
-                <p class="mb20">地点:{{ v.place }}</p>
+                <p class="name mb20">{{ v.platformName }}</p>
+                <div class="mb20">
+                  <p>说明:</p>
+                  <div v-html="v.platformDesc"></div>
+                </div>
+                <p class="mb20">负责人:{{ v.platformManagerName }}</p>
                 <div class="info">
                   <div class="info-txt">
                     <div class="btns flex">
                       <div class="btn btn1">详情</div>
-                      <div class="btn btn2" @click="handleAppoint(v)">预约</div>
+                      <div class="btn btn2" @click="handleAppoint(v)">入室</div>
                     </div>
                   </div>
                 </div>
@@ -92,6 +62,7 @@
   import { getToken } from "@/utils/auth";
   import { Loading } from "element-ui";
   import { getInstrList, getInstNameEnCount } from "@/api/instr/index";
+  import { getPlatFormList } from "@/api/platform";
   import appointEdit from "./components/edit.vue";
   export default {
     name: "equipment",
@@ -110,32 +81,7 @@
         },
         needList: [],
         total: 3,
-        serviceDataList: [
-          {
-            id: 1,
-            name: "分子生物平台(全平台)",
-            content:
-              "包含基础实验台、细胞培养和观察设备、细胞分析和操作设备、冷冻冷藏设备、基础试剂等;",
-            place: "遵义医科大学公共实验室7栋6层-细胞平台中心-12室",
-            user: "张老师",
-          },
-          {
-            id: 2,
-            name: "分子生物平台(基础操作设备)",
-            content:
-              "包含基础实验台、细胞培养和观察设备、细胞分析和操作设备、冷冻冷藏设备、基础试剂等;",
-            place: "遵义医科大学公共实验室7栋6层-细胞平台中心-12室",
-            user: "张老师",
-          },
-          {
-            id: 3,
-            name: "分子生物平台(细胞分析设备)",
-            content:
-              "包含基础实验台、细胞培养和观察设备、细胞分析和操作设备、冷冻冷藏设备、基础试剂等;",
-            place: "遵义医科大学公共实验室7栋6层-细胞平台中心-12室",
-            user: "张老师",
-          },
-        ],
+        serviceDataList: [],
         laboratoryNameOptions: [
           "细胞平台",
           "分子生物学平台",
@@ -155,12 +101,21 @@
     created() {},
 
     mounted() {
-      // this.getInstrData();
+      this.getInstrData();
+    },
+
+    computed: {
+      escapedPlatformDesc() {
+        const div = document.createElement('div');
+        return (value) => {
+          return value.replace(/&/g, '&amp;').replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;').replace(/'/g, '&#039;')
+        };
+      }
     },
 
     methods: {
-      handleAppoint() {
-        this.$refs.appointRef.openDialog();
+      handleAppoint(value) {
+        this.$refs.appointRef.openDialog('add', value);
       },
       // 获取型号数量
       async getInstNameEnCountData() {
@@ -184,23 +139,17 @@
         this.getInstrData();
       },
       async getInstrData() {
-        // Loading.service(this.loadingOption);
-        // const [err, res] = await to(getInstrList(this.searchForm));
-        // setTimeout(() => {
-        //   Loading.service(this.loadingOption).close();
-        // });
-        // if (err) return;
-        // if (res.code == 200) {
-        //   this.serviceDataList = res.data.list;
-        //   this.total = res.data.total;
-        //   this.laboratoryNameOptions = this.objTransforArr(
-        //     res.data.count.laboratoryName
-        //   );
-        //   this.instClassDescOptions = this.objTransforArr(
-        //     res.data.count.instClassDesc
-        //   );
-        //   this.getInstNameEnCountData();
-        // }
+        Loading.service(this.loadingOption);
+        const [err, res] = await to(getPlatFormList(this.searchForm));
+        setTimeout(() => {
+          Loading.service(this.loadingOption).close();
+        });
+        if (err) return;
+        if (res.code == 200) {
+          this.serviceDataList = res.data.list;
+          this.total = res.data.total;
+          // this.getInstNameEnCountData();
+        }
       },
       // 对象转数组
       objTransforArr(obj) {