ME 1 week ago
parent
commit
e0621fbe1f

+ 73 - 8
src/views/emergency/archive-add-or-update.vue

@@ -9,9 +9,18 @@
           <el-option :label="item.dictLabel" :value="item.dictValue" v-for="item in state.getDictByKey('archiveType')"></el-option>
         </el-select>
       </el-form-item>
-          <el-form-item label="文件存储路径" prop="filePath">
-        <el-input v-model="dataForm.filePath" placeholder="文件存储路径"></el-input>
-        
+      <el-form-item label="上传文件" prop="filePath">
+            <el-upload
+              class="avatar-uploader"
+              :action="action"
+              :headers="headers"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :before-upload="beforeAvatarUpload"
+            >
+              <img v-if="imageUrl" :src="imageUrl" class="avatar" />
+              <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
+            </el-upload>
       </el-form-item>
           <el-form-item label="档案描述" prop="description">
         <el-input v-model="dataForm.description" placeholder="档案描述"></el-input>
@@ -28,13 +37,20 @@
 </template>
 
 <script lang="ts" setup>
+import app from "@/constants/app";
+import { getToken } from "@/utils/cache";
 import { reactive, ref } from "vue";
 import baseService from "@/service/baseService";
 import { ElMessage } from "element-plus";
+import { Plus } from '@element-plus/icons-vue'
+import type { UploadProps } from 'element-plus'
 const emit = defineEmits(["refreshDataList"]);
 import useView from "@/hooks/useView";
 const state = reactive({ ...useView({}) });
 
+const action = `${app.api}/sys/oss/upload`;
+const headers = {token:  getToken() }
+const imageUrl = ref('');
 const visible = ref(false);
 const dataFormRef = ref();
 
@@ -47,14 +63,10 @@ const rules = ref({
     ],
           archiveType: [
       { required: true, message: '必填项不能为空', trigger: 'blur' }
-    ],
-          filePath: [
-      { required: true, message: '必填项不能为空', trigger: 'blur' }
     ],
           description: [
       { required: true, message: '必填项不能为空', trigger: 'blur' }
-    ],
-          remark: []
+    ]
     
   });
 
@@ -65,6 +77,7 @@ const init = (id?: number) => {
   // 重置表单数据
   if (dataFormRef.value) {
     dataFormRef.value.resetFields();
+    imageUrl.value = '';
   }
 
   if (id) {
@@ -72,10 +85,30 @@ const init = (id?: number) => {
   }
 };
 
+const handleAvatarSuccess: UploadProps['onSuccess'] = (
+  response,
+  uploadFile
+) => {
+  if(response.code!==0) return ElMessage.error(response.msg);
+  imageUrl.value = response?.data?.src;
+}
+
+const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
+  if (!['image/jpeg','image/png','image/jpp'].includes(rawFile.type)) {
+    ElMessage.error('请上传jpg/png格式的图片!')
+    return false
+  } else if (rawFile.size / 1024 / 1024 > 10) {
+    ElMessage.error('图片大小不能超过10MB!')
+    return false
+  }
+  return true
+}
 // 获取信息
 const getInfo = (id: number) => {
   baseService.get("/emergency/archive/" + id).then((res) => {
     Object.assign(dataForm, res.data);
+    dataForm.archiveType = dataForm.archiveType + '';
+    imageUrl.value = dataForm.filePath;
   });
 };
 
@@ -85,6 +118,8 @@ const dataFormSubmitHandle = () => {
     if (!valid) {
       return false;
     }
+    if(!imageUrl.value) return ElMessage.error('请上传图片');
+    dataForm.filePath = imageUrl.value;
     (!dataForm.id ? baseService.post : baseService.put)("/emergency/archive", dataForm).then((res) => {
       ElMessage.success({
         message: '成功',
@@ -102,3 +137,33 @@ defineExpose({
   init
 });
 </script>
+<style scoped>
+.avatar-uploader .avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed var(--el-border-color);
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  transition: var(--el-transition-duration-fast);
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: var(--el-color-primary);
+}
+
+.el-icon.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  text-align: center;
+}
+</style>

+ 6 - 3
src/views/emergency/archive.vue

@@ -5,7 +5,7 @@
         <el-input v-model="state.dataForm.archiveName" placeholder="档案名称" clearable></el-input>
       </el-form-item>
       <el-form-item>
-        <ren-select v-model="state.dataForm.archiveType" dict-type="archiveType" placeholder="档案类型"></ren-select>
+        <ren-select v-model="state.dataForm.archiveType" dict-type="archiveType" placeholder="档案类型" clearable></ren-select>
       </el-form-item>
       <el-form-item>
         <el-button @click="state.getDataList()">查询</el-button>
@@ -22,14 +22,17 @@
     </el-form>
     <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
       <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-              <el-table-column prop="id" label="档案ID" header-align="center" align="center"></el-table-column>
+      <el-table-column prop="id" label="序号" header-align="center" align="center" width="70">
+        <template v-slot="scope">{{ scope.$index+1 }}</template>
+      </el-table-column>
+              <!-- <el-table-column prop="id" label="档案ID" header-align="center" align="center"></el-table-column> -->
               <el-table-column prop="archiveName" label="档案名称" header-align="center" align="center"></el-table-column>
               <el-table-column prop="archiveType" label="档案类型" header-align="center" align="center">
                 <template v-slot="scope">
                   {{ state.getDictLabel("archiveType", scope.row.archiveType) }}
                 </template>
               </el-table-column>
-              <el-table-column prop="filePath" label="文件存储路径" header-align="center" align="center"></el-table-column>
+              <!-- <el-table-column prop="filePath" label="文件存储路径" header-align="center" align="center"></el-table-column> -->
               <el-table-column prop="description" label="档案描述" header-align="center" align="center"></el-table-column>
               <el-table-column prop="creator" label="创建人" header-align="center" align="center"></el-table-column>
               <el-table-column prop="createDate" label="创建时间" header-align="center" align="center"></el-table-column>

+ 2 - 0
src/views/emergency/attendance-add-or-update.vue

@@ -130,6 +130,8 @@ const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
 const getInfo = (id: number) => {
   baseService.get("/emergency/attendance/" + id).then((res) => {
     Object.assign(dataForm, res.data);
+    dataForm.status = dataForm.status + '';
+    imageUrl.value = dataForm.photoPath;
   });
 };
 // 表单提交

+ 5 - 2
src/views/emergency/attendance.vue

@@ -26,7 +26,10 @@
     </el-form>
     <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
       <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-              <el-table-column prop="id" label="记录ID" header-align="center" align="center"></el-table-column>
+              <!-- <el-table-column prop="id" label="记录ID" header-align="center" align="center"></el-table-column> -->
+              <el-table-column prop="id" label="序号" header-align="center" align="center" width="70">
+                <template v-slot="scope">{{ scope.$index+1 }}</template>
+              </el-table-column>
               <el-table-column prop="date" label="考勤日期" header-align="center" align="center"></el-table-column>
               <el-table-column prop="checkInTime" label="签到时间" header-align="center" align="center"></el-table-column>
               <el-table-column prop="checkOutTime" label="签退时间" header-align="center" align="center"></el-table-column>
@@ -35,7 +38,7 @@
                   {{ state.getDictLabel("attendanceStatus", scope.row.status) }}
                 </template>
               </el-table-column>
-              <el-table-column prop="photoPath" label="照片存储路径" header-align="center" align="center"></el-table-column>
+              <!-- <el-table-column prop="photoPath" label="照片存储路径" header-align="center" align="center"></el-table-column> -->
               <el-table-column prop="creator" label="创建人" header-align="center" align="center"></el-table-column>
               <el-table-column prop="createDate" label="创建时间" header-align="center" align="center"></el-table-column>
               <el-table-column prop="updater" label="更新人" header-align="center" align="center"></el-table-column>

+ 3 - 0
src/views/emergency/contacts.vue

@@ -16,6 +16,9 @@
       <el-form-item>
         <el-button v-if="state.hasPermission('emergency:contacts:delete')" type="danger" @click="state.deleteHandle()">删除</el-button>
       </el-form-item>
+      <el-form-item>
+        <el-button v-if="state.hasPermission('emergency:contacts:export')" type="info" @click="state.exportHandle()">导出</el-button>
+      </el-form-item>
     </el-form>
     <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
       <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>

+ 1 - 1
src/views/emergency/inspection.vue

@@ -50,7 +50,7 @@
         <template v-slot="scope">
           <el-button v-if="state.hasPermission('emergency:inspection:update')" type="primary" link @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
           <el-button v-if="state.hasPermission('emergency:inspection:delete')" type="primary" link @click="state.deleteHandle(scope.row.id)">删除</el-button>
-          <el-button v-if="state.hasPermission('emergency:leaveapplication:review')" type="primary" link @click="reviewHandle(scope.row.id)">审阅</el-button>
+          <el-button v-if="state.hasPermission('emergency:inspection:review')" type="primary" link @click="reviewHandle(scope.row.id)">审阅</el-button>
         </template>
       </el-table-column>
     </el-table>

+ 97 - 19
src/views/emergency/schedule-add-or-update.vue

@@ -4,22 +4,41 @@
           <el-form-item label="排班表名称" prop="scheduleName">
         <el-input v-model="dataForm.scheduleName" placeholder="排班表名称"></el-input>
       </el-form-item>
-          <el-form-item label="排班周期开始日期" prop="periodStart">
-        <el-input v-model="dataForm.periodStart" placeholder="排班周期开始日期"></el-input>
+          <el-form-item label="排班开始日期" prop="periodStart">
+            <el-date-picker
+            v-model="dataForm.periodStart"
+            type="date"        
+            placeholder="选择开始日期"
+            value-format="YYYY-MM-DD" 
+            style="width: 100%;"
+          ></el-date-picker>
       </el-form-item>
-          <el-form-item label="排班周期结束日期" prop="periodEnd">
-        <el-input v-model="dataForm.periodEnd" placeholder="排班周期结束日期"></el-input>
+          <el-form-item label="排班结束日期" prop="periodEnd">
+            <el-date-picker
+            v-model="dataForm.periodEnd"
+            type="date"        
+            placeholder="选择开始日期"
+            value-format="YYYY-MM-DD" 
+            style="width: 100%;"
+          ></el-date-picker>
       </el-form-item>
-          <el-form-item label="用户上传的文件路径" prop="filePath">
-        <el-input v-model="dataForm.filePath" placeholder="用户上传的文件路径"></el-input>
+      <el-form-item label="上传文件" prop="filePath">
+            <el-upload
+              class="avatar-uploader"
+              :action="action"
+              :headers="headers"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :before-upload="beforeAvatarUpload"
+            >
+              <img v-if="imageUrl" :src="imageUrl" class="avatar" />
+              <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
+            </el-upload>
       </el-form-item>
           <el-form-item label="是否确认" prop="status">
-        <!-- <el-input v-model="dataForm.status" placeholder="0-待确认 1-已确认"></el-input> -->
-         <el-radio-group v-model="dataForm.status">
-          <el-radio label="0">待确认</el-radio>
-          <el-radio label="1">已确认</el-radio>
-        </el-radio-group>
-
+            <el-select v-model="dataForm.status" placeholder="是否确认">
+              <el-option :label="item.dictLabel" :value="item.dictValue" v-for="item in state.getDictByKey('scheduleStatus')"></el-option>
+          </el-select>
       </el-form-item>
                   <el-form-item label="备注" prop="remark">
         <el-input v-model="dataForm.remark" placeholder="备注"></el-input>
@@ -33,11 +52,20 @@
 </template>
 
 <script lang="ts" setup>
+import app from "@/constants/app";
+import { getToken } from "@/utils/cache";
 import { reactive, ref } from "vue";
 import baseService from "@/service/baseService";
 import { ElMessage } from "element-plus";
+import { Plus } from '@element-plus/icons-vue'
+import { parseTime } from '@/utils/ruoyi'
+import type { UploadProps } from 'element-plus'
 const emit = defineEmits(["refreshDataList"]);
-
+import useView from "@/hooks/useView";
+const state = reactive({ ...useView({}) });
+const action = `${app.api}/sys/oss/upload`;
+const headers = {token:  getToken() }
+const imageUrl = ref('');
 const visible = ref(false);
 const dataFormRef = ref();
 
@@ -53,15 +81,9 @@ const rules = ref({
     ],
           periodEnd: [
       { required: true, message: '必填项不能为空', trigger: 'blur' }
-    ],
-          filePath: [
-      { required: true, message: '必填项不能为空', trigger: 'blur' }
     ],
           status: [
       { required: true, message: '必填项不能为空', trigger: 'blur' }
-    ],
-                  remark: [
-      { required: true, message: '必填项不能为空', trigger: 'blur' }
     ]
   });
 
@@ -72,6 +94,7 @@ const init = (id?: number) => {
   // 重置表单数据
   if (dataFormRef.value) {
     dataFormRef.value.resetFields();
+    imageUrl.value = '';
   }
 
   if (id) {
@@ -79,10 +102,31 @@ const init = (id?: number) => {
   }
 };
 
+const handleAvatarSuccess: UploadProps['onSuccess'] = (
+  response,
+  uploadFile
+) => {
+  if(response.code!==0) return ElMessage.error(response.msg);
+  imageUrl.value = response?.data?.src;
+}
+
+const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
+  if (!['image/jpeg','image/png','image/jpp'].includes(rawFile.type)) {
+    ElMessage.error('请上传jpg/png格式的图片!')
+    return false
+  } else if (rawFile.size / 1024 / 1024 > 10) {
+    ElMessage.error('图片大小不能超过10MB!')
+    return false
+  }
+  return true
+}
+
 // 获取信息
 const getInfo = (id: number) => {
   baseService.get("/emergency/schedule/" + id).then((res) => {
     Object.assign(dataForm, res.data);
+    dataForm.status = dataForm.status + '';
+    imageUrl.value = dataForm.filePath;
   });
 };
 
@@ -92,6 +136,10 @@ const dataFormSubmitHandle = () => {
     if (!valid) {
       return false;
     }
+    if(!imageUrl.value) return ElMessage.error('请上传图片');
+    dataForm.periodStart = dataForm.periodStart ? parseTime(new Date(dataForm.periodStart), '{yy}-{mm}-{dd}') : null;
+    dataForm.periodEnd = dataForm.periodEnd ? parseTime(new Date(dataForm.periodEnd), '{yy}-{mm}-{dd} ') : null;
+    dataForm.filePath = imageUrl.value;
     (!dataForm.id ? baseService.post : baseService.put)("/emergency/schedule", dataForm).then((res) => {
       ElMessage.success({
         message: '成功',
@@ -109,3 +157,33 @@ defineExpose({
   init
 });
 </script>
+<style scoped>
+.avatar-uploader .avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed var(--el-border-color);
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  transition: var(--el-transition-duration-fast);
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: var(--el-color-primary);
+}
+
+.el-icon.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  text-align: center;
+}
+</style>

+ 19 - 34
src/views/emergency/schedule.vue

@@ -1,6 +1,12 @@
 <template>
   <div class="mod-demo__schedule">
     <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
+      <el-form-item>
+        <el-input v-model="state.dataForm.scheduleName" placeholder="排班表名称" clearable></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="state.getDataList()">查询</el-button>
+      </el-form-item>
       <el-form-item>
         <el-button v-if="state.hasPermission('emergency:schedule:save')" type="primary" @click="addOrUpdateHandle()">新增</el-button>
       </el-form-item>
@@ -14,18 +20,25 @@
     </el-form>
     <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
       <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-              <el-table-column prop="id" label="排班ID" header-align="center" align="center"></el-table-column>
+              <!-- <el-table-column prop="id" label="排班ID" header-align="center" align="center"></el-table-column> -->
+              <el-table-column prop="id" label="序号" header-align="center" align="center" width="70">
+                <template v-slot="scope">{{ scope.$index+1 }}</template>
+              </el-table-column>
               <el-table-column prop="scheduleName" label="排班表名称" header-align="center" align="center"></el-table-column>
               <el-table-column prop="periodStart" label="排班周期开始日期" header-align="center" align="center"></el-table-column>
               <el-table-column prop="periodEnd" label="排班周期结束日期" header-align="center" align="center"></el-table-column>
-              <el-table-column prop="filePath" label="用户上传的文件路径" header-align="center" align="center"></el-table-column>
-              <el-table-column prop="status" label="是否确认" header-align="center" align="center"></el-table-column>
+              <!-- <el-table-column prop="filePath" label="用户上传文件路径" header-align="center" align="center"></el-table-column> -->
+              <el-table-column prop="status" label="是否确认" header-align="center" align="center">
+                <template v-slot="scope">
+                  {{ state.getDictLabel("scheduleStatus", scope.row.status) }}
+                </template>
+              </el-table-column>
               <el-table-column prop="creator" label="创建人" header-align="center" align="center"></el-table-column>
               <el-table-column prop="createDate" label="创建时间" header-align="center" align="center"></el-table-column>
               <el-table-column prop="updater" label="更新人" header-align="center" align="center"></el-table-column>
               <el-table-column prop="updateDate" label="更新时间" header-align="center" align="center"></el-table-column>
               <el-table-column prop="remark" label="备注" header-align="center" align="center"></el-table-column>
-            <el-table-column label="操作" fixed="right" header-align="center" align="center" width="150">
+            <el-table-column label="操作" fixed="right" header-align="center" align="center" width="180">
         <template v-slot="scope">
           <el-button v-if="state.hasPermission('emergency:schedule:update')" type="primary" link @click="addOrUpdateHandle(scope.row.id)">修改</el-button>
           <el-button v-if="state.hasPermission('emergency:schedule:delete')" type="primary" link @click="state.deleteHandle(scope.row.id)">删除</el-button>
@@ -72,8 +85,8 @@ const reviewHandle = (id?: string) => {
     });
   }
   const reviewData = id 
-    ? { id: Number(id)} 
-    : (state.dataListSelections || []).map((item: IObject) => {return { id: item.id};});
+    ? [Number(id)] 
+    : (state.dataListSelections || []).map((item: IObject) => {return item.id});
 
   ElMessageBox.confirm("确定进行[审阅]操作?", "提示", {
     confirmButtonText: "确定",
@@ -95,32 +108,4 @@ const reviewHandle = (id?: string) => {
       //
     });
 };
-// const reviewHandle = (id?: string) => {
-//   if (!id && state.dataListSelections && state.dataListSelections.length <= 0) {
-//     return ElMessage({
-//       message: "请选择操作项",
-//       type: "warning",
-//       duration: 500
-//     });
-//   }
-//   ElMessageBox.confirm("确定进行[审阅]操作?", "提示", {
-//     confirmButtonText: "确定",
-//     cancelButtonText: "取消",
-//     type: "warning"
-//   })
-//     .then(() => {
-//       baseService.put("/emergency/schedule/review", id ? [id] : state.dataListSelections && state.dataListSelections.map((item: IObject) => item.id)).then((res) => {
-//         ElMessage.success({
-//           message: "成功",
-//           duration: 500,
-//           onClose: () => {
-//             state.getDataList();
-//           }
-//         });
-//       });
-//     })
-//     .catch(() => {
-//       //
-//     });
-// };
 </script>