From 1da082138ce384d17b93169cfe108386603e72d0 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期三, 23 七月 2025 08:49:10 +0800
Subject: [PATCH] 修改
---
src/views/work/onlineEducation/trainPlan/components/trainDialog.vue | 273 +++++++++++++++++++
src/views/work/onlineEducation/groupExams/components/viewExamQuestion.vue | 4
src/views/work/onlineEducation/offlineEducation/components/recordDialog.vue | 114 +++++++
src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue | 26
src/views/work/onlineEducation/offlineEducation/index.vue | 66 ++++
src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue | 2
src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue | 2
src/views/work/onlineEducation/trainPlan/index.vue | 262 ++++++++++++++++++
src/views/work/onlineEducation/courseManage/index.vue | 6
src/api/onlineEducation/trainPlan.js | 36 ++
10 files changed, 764 insertions(+), 27 deletions(-)
diff --git a/src/api/onlineEducation/trainPlan.js b/src/api/onlineEducation/trainPlan.js
new file mode 100644
index 0000000..eccafd5
--- /dev/null
+++ b/src/api/onlineEducation/trainPlan.js
@@ -0,0 +1,36 @@
+import request from '@/utils/request'
+
+
+export function getTrainPlanPage(params) {
+ return request({
+ url: '/course/plan/list',
+ method: 'get',
+ params: params
+ })
+}
+
+
+export function addTrainPlan(data) {
+ return request({
+ url: '/course/plan/insert',
+ method: 'post',
+ data: data
+ })
+}
+
+export function editTrainPlan(params) {
+ return request({
+ url: `/course/plan/update`,
+ method: 'post',
+ data: params
+ })
+}
+
+export function delTrainPlan(data) {
+ return request({
+ url: `/course/plan/deleted?trainPlanId=${data}`,
+ method: 'get'
+ })
+}
+
+
diff --git a/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue b/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue
index 00a20a2..ac0fb6a 100644
--- a/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue
+++ b/src/views/build/conpanyFunctionConsult/orgStructure/dutyDistributeChart/index.vue
@@ -444,4 +444,4 @@
}
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/views/work/onlineEducation/courseManage/index.vue b/src/views/work/onlineEducation/courseManage/index.vue
index b573590..b6a16a9 100644
--- a/src/views/work/onlineEducation/courseManage/index.vue
+++ b/src/views/work/onlineEducation/courseManage/index.vue
@@ -101,7 +101,7 @@
</el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="240">
<template #default="scope">
- <div v-if="data.isAdmin">
+ <div v-if="data.isAdmin || data.userType == 6">
<div v-if="scope.row.state !== 3">
<el-button link type="primary" v-if="scope.row.state == 1" @click="openApprove(scope.row)">审核</el-button>
<el-button link type="primary" @click="openDialog('edit',scope.row)">编辑</el-button>
@@ -228,7 +228,8 @@
id: 3,
name: '审批不通过'
},
- ]
+ ],
+ userType: null
});
const { queryParams, total, dataList } = toRefs(data);
@@ -243,6 +244,7 @@
}
const userInfo = JSON.parse(Cookies.get('userInfo'))
console.log("userInfo",userInfo)
+ data.userType = userInfo.userType
if(userInfo.userType === 0){
data.isAdmin = true;
}else {
diff --git a/src/views/work/onlineEducation/groupExams/components/viewExamQuestion.vue b/src/views/work/onlineEducation/groupExams/components/viewExamQuestion.vue
index 36d6a69..5124e67 100644
--- a/src/views/work/onlineEducation/groupExams/components/viewExamQuestion.vue
+++ b/src/views/work/onlineEducation/groupExams/components/viewExamQuestion.vue
@@ -15,8 +15,8 @@
<div v-for="(item,index) in state.singleList" :key="index" style="margin-left: 15px;margin-top: 10px">
<div style="display: flex;flex-direction: column;">
<div style="margin-top: 10px;display: flex">
- <span style="font-size: 15px">题目{{index+1}}:</span>
- <span style="margin-left: 10px;font-size: 16px">{{item.title}}</span>
+ <span style="font-size: 15px;width: 66px">题目{{index+1}}:</span>
+ <span style="font-size: 16px">{{item.title}}</span>
</div>
<div style="display: flex;margin-left: 10%;margin-top: 15px">
<div v-for="single in item.content.items">
diff --git a/src/views/work/onlineEducation/offlineEducation/components/recordDialog.vue b/src/views/work/onlineEducation/offlineEducation/components/recordDialog.vue
index b887e2a..4b21526 100644
--- a/src/views/work/onlineEducation/offlineEducation/components/recordDialog.vue
+++ b/src/views/work/onlineEducation/offlineEducation/components/recordDialog.vue
@@ -55,7 +55,18 @@
<el-input v-model.trim="state.form.courseName" :disabled="disabled" placeholder="请输入课程名称" ></el-input>
</el-form-item>
<el-form-item label="培训等级:" prop="level" >
- <el-input v-model.trim="state.form.level" :disabled="disabled" placeholder="请输入培训等级" ></el-input>
+ <el-select
+ v-model="state.form.level"
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in state.levelList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+<!-- <el-input v-model.trim="state.form.level" :disabled="disabled" placeholder="请输入培训等级" ></el-input>-->
</el-form-item>
<el-form-item label="要求课时(分):" prop="period" >
<el-input v-model.trim="state.form.period" :disabled="disabled" placeholder="请输入要求课时(分)" ></el-input>
@@ -71,6 +82,14 @@
<el-radio :label="0">不合格</el-radio>
<el-radio :label="1">合格</el-radio>
</el-radio-group>
+ </el-form-item>
+ <el-form-item label="培训记录:" prop="passed" >
+ <el-upload accept=".jpg,.jpeg,.png,.doc,.docx,.pdf,.xls,xlsx,ppt,pptx" style="width: 100%" :action="state.uploadUrl" :headers="state.header" method="post" :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)" :on-exceed="showTip" v-model:file-list="state.fileList" :before-upload="picSize" :on-remove="(file, uploadFiles)=>handleRemove(file, uploadFiles)" >
+ <el-button type="primary">点击上传</el-button>
+<!-- <template #tip>-->
+<!-- <div class="el-upload__tip">尺寸小于5M,最多可上传1份</div>-->
+<!-- </template>-->
+ </el-upload>
</el-form-item>
</el-form>
<template #footer v-if="state.title !='查看'">
@@ -95,6 +114,8 @@
import {addStudent, checkStuIdNo, checkStuPhone, editStudent} from "@/api/onlineEducation/student";
import {addRecord, editRecord} from "@/api/onlineEducation/examRecord";
import {getCompany} from "@/api/onlineEducation/company";
+import {delPic} from "@/api/onlineEducation/banner";
+import {getToken} from "@/utils/auth";
const emit = defineEmits(["getList"]);
const dialogVisible = ref(false)
@@ -121,7 +142,8 @@
passed: 0,
studentName: '',
courseName: '',
- companyId: null
+ companyId: null,
+ files: []
},
formRules:{
@@ -144,6 +166,20 @@
companyPageNum: 1, // 当前页码
companyPageSize: 10, // 每页显示的数量
hasMoreItems: null, // 是否还有更多选项
+ levelList: [
+ {
+ id: 1,
+ name: '公司级'
+ },
+ {
+ id: 2,
+ name: '部门级'
+ },
+ ],
+ uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+ header: {
+ Authorization: getToken()
+ },
})
onMounted(() => {
@@ -173,7 +209,16 @@
if( type === 'view'){
disabled.value = true;
}
- state.form = value
+
+ state.form = JSON.parse(JSON.stringify(value))
+ state.form.studentId = value.student.id
+ state.form.studentName = value.student.name
+ state.fileList = value.files.map(i => {
+ return {
+ name: i.fileName,
+ path: i.filePath
+ }
+ })
// state.form.studentName = value.company.name;
console.log("ba",state.form)
}
@@ -197,8 +242,7 @@
ElMessage.warning(res.message)
}
}else if(state.title == '编辑'){
- const {id, name, phone, sex, companyId, empno, post, duty, idNo} = state.form
- const data = {id, name, phone, sex, companyId, empno, post, duty, idNo}
+ const {...data} = state.form
const res = await editRecord(data)
if(res.code == 200){
ElMessage.success(res.message)
@@ -245,6 +289,7 @@
state.stuPageNum = 1;
state.stuPageSize = 10;
state.studentList = [];
+ state.fileList = []
superRef.value.clearValidate();
superRef.value.resetFields()
dialogVisible.value = false;
@@ -311,7 +356,66 @@
ElMessage.warning(res.message)
}
}
+const handleAvatarSuccess = (response,uploadFile) => {
+ if(response.code == 200){
+ state.form.files = state.fileList.map(item => {
+ return {
+ fileName: item.response ? item.response?.data.originName: item.name,
+ filePath: item.response ? item.response?.data.path: item.path
+ }
+ })
+ }else{
+ // state.fileList = []
+ // state.form.files = []
+ ElMessage({
+ type: 'warning',
+ message: res.message
+ })
+ }
+}
+const showTip =()=>{
+ ElMessage({
+ type: 'warning',
+ message: '超出文件上传数量'
+ });
+}
+const picSize = async (rawFile) => {
+ if(rawFile.size / 1024 / 1024 > 5){
+ ElMessage({
+ type: 'warning',
+ message: '文件大小不能超过5M'
+ });
+ return false
+ }
+};
+const handleRemove = async (file, uploadFiles) => {
+ state.form.files = state.fileList.map(item => {
+ return {
+ fileName: item.response ? item.response?.data.originName: item.name,
+ filePath: item.response ? item.response?.data.path: item.path
+ }
+ })
+ // let path = state.form.filePath;
+ // await delPic({path: path}).then(res => {
+ // if(res.code == 200){
+ // // ElMessage({
+ // // type: 'success',
+ // // message: '文件已删除'
+ // // })
+ // state.form.fileName = ''
+ // state.form.filePath = ''
+ // }else{
+ // ElMessage({
+ // type: 'warning',
+ // message: res.message
+ // })
+ // }
+ // }).catch(() => {
+ // state.form.fileName = ''
+ // state.form.filePath = ''
+ // });
+}
defineExpose({
diff --git a/src/views/work/onlineEducation/offlineEducation/index.vue b/src/views/work/onlineEducation/offlineEducation/index.vue
index 89abc80..2a9bd04 100644
--- a/src/views/work/onlineEducation/offlineEducation/index.vue
+++ b/src/views/work/onlineEducation/offlineEducation/index.vue
@@ -62,7 +62,7 @@
<el-table-column label="课程名称" prop="courseName" align="center"/>
<el-table-column label="培训等级" prop="level" align="center">
<template #default="scope">
- <span>{{scope.row.sex == 1 ? '公司级':scope.row.sex == 2 ? '部门级' : '车间级'}}</span>
+ <span>{{scope.row.level == 1 ? '公司级':scope.row.level == 2 ? '部门级' : '车间级'}}</span>
</template>
</el-table-column>
<el-table-column label="要求课时(分)" prop="period" align="center"/>
@@ -71,6 +71,20 @@
<el-table-column label="是否合格" prop="passed" align="center">
<template #default="scope">
<span>{{scope.row.passed == 0 ? '不合格':'合格'}}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="培训记录" prop="passed" align="center" width="130">
+ <template #default="scope">
+ <div v-for="item in scope.row.files" style="display: flex;flex-direction: column">
+ <el-link type="primary" @click="openFile(item.filePath)">{{item.fileName}}</el-link>
+ </div>
+
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="120">
+ <template #default="scope">
+ <el-button link type="primary" @click="openDialog('edit',scope.row)" >编辑</el-button>
+ <el-button link type="danger" @click="handleDelete(scope.row)" >删除</el-button>
</template>
</el-table-column>
</el-table>
@@ -95,7 +109,8 @@
import {delUser, getUser} from "@/api/onlineEducation/user";
import Cookies from "js-cookie";
import {delStudent, getStudent} from "@/api/onlineEducation/student";
-import {getRecord} from "@/api/onlineEducation/examRecord";
+import {delRecord, getRecord} from "@/api/onlineEducation/examRecord";
+import {renderAsync} from "docx-preview";
const { proxy } = getCurrentInstance();
@@ -103,6 +118,7 @@
const dialogRef = ref();
const data = reactive({
queryParams: {
+ companyId: null,
companyName: '',
courseName: '',
pageNum: 1,
@@ -121,8 +137,10 @@
console.log("userInfo",userInfo)
if(userInfo.userType === 0){
data.isAdmin = true;
+ // data.queryParams.companyId = null
}else {
data.isAdmin = false;
+ // data.queryParams.companyId = userInfo.companyId
}
await getList()
})
@@ -167,7 +185,7 @@
type: 'warning',
})
.then( async() => {
- const res = await delStudent(val.id)
+ const res = await delRecord(val.id)
if(res.code == 200){
ElMessage.success('数据删除成功')
await getList()
@@ -176,5 +194,47 @@
}
})
}
+const openFile = async(path)=>{
+ const ext = path.split('.').pop().toLowerCase();
+ if (ext === 'doc' || ext === 'xls' || ext === 'xlsx') {
+ ElMessageBox.confirm(`暂不支持线上预览.${ext}文件,是否下载查看?`, '提示', { confirmButtonText: '确认', cancelButtonText: '取消', type: 'warning' }).then(() => {
+ window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
+ }).catch(() => {
+ console.log('取消预览')
+ });
+ return
+ }else if(ext === 'pdf' || ext === 'jpg'|| ext === 'jpeg' || ext === 'png' ){
+ window.open(`${import.meta.env.VITE_APP_BASE_API}/${path}`, '_blank');
+ }else{
+ try {
+ // 1. 获取文件
+ const response = await fetch(import.meta.env.VITE_APP_BASE_API + '/' + path);
+ const arrayBuffer = await response.arrayBuffer();
+ // 2. 创建新窗口
+ const win = window.open('', '_blank');
+ win.document.write(`
+ <!DOCTYPE html>
+ <html>
+ <head>
+ <title>预览</title>
+ <style>
+ body { margin: 20px; font-family: Arial; }
+ .docx-container { width: 100%; height: 100%; }
+ </style>
+ </head>
+ <body>
+ <div id="container" class="docx-container"></div>
+ </body>
+ </html>
+ `);
+ // 3. 渲染 DOCX
+ await renderAsync(arrayBuffer, win.document.getElementById('container'));
+
+ } catch (error) {
+ console.error('预览失败:', error);
+ alert(`预览失败: ${error.message}`);
+ }
+ }
+}
</script>
diff --git a/src/views/work/onlineEducation/trainPlan/components/trainDialog.vue b/src/views/work/onlineEducation/trainPlan/components/trainDialog.vue
new file mode 100644
index 0000000..1ba881d
--- /dev/null
+++ b/src/views/work/onlineEducation/trainPlan/components/trainDialog.vue
@@ -0,0 +1,273 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="600px"
+ :before-close="handleClose"
+ :close-on-press-escape="false"
+ :close-on-click-modal="false"
+ >
+ <el-form :model="state.form" size="default" ref="busRef" :rules="state.formRules" label-width="130px" >
+ <el-form-item label="企业名称:" prop="companyId" v-if="state.isAdmin">
+ <el-select
+ v-model="state.form.companyId"
+ filterable
+ clearable
+ style="width: 100%"
+ :disabled="title == '查看' || title == '编辑' || !state.isAdmin"
+ @change="selectValueCom"
+ >
+ <el-option
+ v-for="item in state.companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="时间:" prop="trainTime" >
+ <el-date-picker
+ v-model="state.form.trainTime"
+ type="date"
+ placeholder="请选择"
+ style="width: 100%"
+ value-format="YYYY-MM-DD"
+ :disabled="title == '查看'"
+
+ />
+ </el-form-item>
+ <el-form-item label="课程名称:" prop="trainName" >
+ <el-input v-model="state.form.trainName" placeholder="课程名称" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="组织部门:" prop="deptId" >
+ <el-select
+ v-model="state.form.deptId"
+ placeholder="请选择部门"
+ filterable
+ clearable
+ style="width: 100%"
+ :disabled="title == '查看'"
+ >
+ <el-option
+ v-for="item in state.deptList"
+ :key="item.deptId"
+ :label="item.deptName"
+ :value="item.deptId">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="参训对象:" prop="trainObject" >
+ <el-input v-model="state.form.trainObject" placeholder="参训对象" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="人数:" prop="num" >
+ <el-input v-model="state.form.num" placeholder="人数" @input="state.form.num = state.form.num.replace(/[^0-9]/g,'')" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="课时:" prop="hour" >
+ <el-input v-model="state.form.hour"
+ placeholder="课时"
+ @input="state.form.hour = state.form.hour
+ .replace(/[^0-9.]/g, '')
+ .replace(/(\..*)\./g, '$1')
+ .replace(/^(-?\d+\.?\d*).*/, '$1')"
+ :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="费用预算(元):" prop="money" >
+ <el-input v-model="state.form.money"
+ placeholder="费用预算(元)"
+ @input="state.form.money = state.form.money
+ .replace(/[^0-9.]/g, '')
+ .replace(/(\..*)\./g, '$1')
+ .replace(/^(-?\d+\.?\d*).*/, '$1')"
+ :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="培训形式:" prop="modality" >
+ <el-input v-model="state.form.modality" placeholder="培训形式" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="是否已完成:" prop="status" >
+ <el-radio-group v-model="state.form.status">
+ <el-radio :label="0">是</el-radio>
+ <el-radio :label="1">否</el-radio>
+ </el-radio-group>
+ </el-form-item>
+ </el-form>
+ <template #footer v-if="title !== '查看'">
+ <span class="dialog-footer">
+ <el-button @click="handleClose" size="default">取 消</el-button>
+ <el-button type="primary" @click="onSubmit" size="default" v-preReClick>确认</el-button>
+ </span>
+ </template>
+ </el-dialog>
+ </div>
+</template>
+<script setup>
+import {onMounted, reactive, ref, toRefs} from 'vue'
+import Editor from "@/components/Editor/index.vue";
+import {ElMessage} from "element-plus";
+import {addNotice} from "@/api/backManage/notice";
+import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate";
+import {addCompany, checkName, distributeCompany, editCompany, getCompany} from "@/api/onlineEducation/company";
+import {verifyPhone} from "@/utils/validate";
+import {addBasic, editBasic} from "@/api/companyInfo/basicInfo";
+import Cookies from "js-cookie";
+import {getUser} from "@/api/onlineEducation/user";
+import {addScenario, editScenario} from "@/api/selfProblems/scenario";
+import {addTrainPlan, editTrainPlan} from "@/api/onlineEducation/trainPlan";
+import {getDept} from "@/api/qualityObjectives/object";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const state = reactive({
+ form: {
+ id: '',
+ companyId: null,
+ trainName: "",
+ trainTime: "",
+ deptId: null,
+ trainObject: "",
+ num: "",
+ hour: "",
+ money: "",
+ modality: "",
+ status: 3,
+ },
+ formRules:{
+ companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }],
+ trainName: [{ required: true, message: '请输入课程名称', trigger: 'blur' }],
+ trainTime:[{ required: true, message: '请选择日期', trigger: 'blur' }],
+ },
+ isAdmin: false,
+ companyList: [],
+ deptList: [],
+})
+
+onMounted(() => {
+
+})
+const openDialog = async (type, value,companyList) => {
+
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ state.isAdmin = userInfo.userType === 0;
+ state.form.companyName = userInfo.companyName
+ state.form.companyId = userInfo.companyId
+ if(state.isAdmin){
+ state.companyList = companyList
+ state.form.companyId = value.companyId
+ state.form.companyName = value.companyName
+ }
+ title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+ if(type === 'edit' || type === 'review') {
+ state.form = JSON.parse(JSON.stringify(value));
+ if(state.isAdmin){
+ state.form.companyId = value.companyId
+ state.form.companyName = value.companyName
+ }
+ }
+ await getDeptList()
+ dialogVisible.value = true;
+}
+
+const getDeptList = async () =>{
+ if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){
+ return
+ }
+ const param = {
+ pageNum: 1,
+ pageSize: 999,
+ companyId: state.form.companyId
+ }
+ const res = await getDept(param)
+ if(res.code === 200){
+ state.deptList = res.data
+ }
+}
+const onSubmit = async () => {
+ const valid = await busRef.value.validate();
+ if(!state.isAdmin){
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ state.form.companyId = userInfo.companyId
+ }
+ if(valid){
+ if(title.value === '新增'){
+ const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+ const res = await addTrainPlan(data)
+ if(res.code === 200){
+ ElMessage({
+ type: 'success',
+ message: '新增成功'
+ });
+ }else{
+ ElMessage.warning(res.message)
+ }
+ emit("getList")
+ busRef.value.clearValidate();
+ reset();
+ dialogVisible.value = false;
+ }else if(title.value === '编辑'){
+ const {...data} = JSON.parse(JSON.stringify(state.form))
+ const res = await editTrainPlan(data)
+ if(res.code === 200){
+ ElMessage({
+ type: 'success',
+ message: '编辑成功'
+ });
+ }else{
+ ElMessage.warning(res.message)
+ }
+ emit("getList")
+ busRef.value.clearValidate();
+ reset();
+ dialogVisible.value = false;
+ }
+ }
+}
+
+const handleClose = () => {
+ busRef.value.clearValidate();
+ reset();
+ dialogVisible.value = false;
+ emit("getList")
+
+}
+const selectValueCom = (val) => {
+ state.form.deptId = null
+ getDeptList()
+}
+const reset = () => {
+ state.form = {
+ id: '',
+ companyId: null,
+ trainName: "",
+ trainTime: "",
+ deptId: null,
+ trainObject: "",
+ num: "",
+ hour: "",
+ money: "",
+ modality: "",
+ status: 3,
+ }
+ state.companyList = []
+ state.deptList = []
+}
+defineExpose({
+ openDialog
+});
+
+</script>
+
+<style scoped lang="scss">
+.notice{
+ :deep(.el-form .el-form-item__label) {
+ font-size: 15px;
+ }
+ .file {
+ display: flex;
+ flex-direction: column;
+ align-items: flex-start;
+ }
+}
+</style>
diff --git a/src/views/work/onlineEducation/trainPlan/index.vue b/src/views/work/onlineEducation/trainPlan/index.vue
new file mode 100644
index 0000000..6e43193
--- /dev/null
+++ b/src/views/work/onlineEducation/trainPlan/index.vue
@@ -0,0 +1,262 @@
+<template>
+ <div class="app-container">
+ <div style="margin-bottom: 10px">
+ <el-form style="display: flex;flex-wrap: wrap;">
+ <el-form-item>
+ <el-button
+ type="primary"
+ plain
+ icon="Plus"
+ @click="openDialog('add',{})"
+ >新增</el-button>
+ </el-form-item>
+ <el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
+ <el-select v-model="data.queryParams.companyId" filterable placeholder="请选择" clearable>
+ <el-option
+ v-for="item in data.companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id">
+ </el-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item v-if="data.isAdmin">
+ <el-button type="primary" style="margin-left: 30px" @click="searchClick">查询</el-button>
+ <el-button plain @click="reset">重置</el-button>
+ </el-form-item>
+ <el-form-item style="margin-left: 15px">
+ <vue3-json-excel
+ :json-data="dataList"
+ :fields="data.isAdmin ? fieldsAdmin : fields"
+ name="培训计划表.xlsx"
+ >
+ <el-button type="primary">导出</el-button>
+ </vue3-json-excel>
+<!-- <el-button-->
+<!-- type="primary"-->
+<!-- @click="exportData"-->
+<!-- >导出</el-button>-->
+ </el-form-item>
+
+ </el-form>
+ </div>
+ <!-- 表格数据 -->
+ <el-table v-loading="loading" :data="dataList" :border="true" @selection-change="handleSelectionChange">
+ <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+ <el-table-column label="企业名称" v-if="data.isAdmin" prop="companyName" align="center" />
+ <el-table-column label="时间" prop="trainTime" align="center" />
+ <el-table-column label="课程名称" prop="trainName" align="center" />
+ <el-table-column label="组织部门" prop="deptName" align="center" />
+ <el-table-column label="参训对象" prop="trainObject" align="center" />
+ <el-table-column label="人数" prop="num" align="center" />
+ <el-table-column label="课时" prop="hour" align="center" />
+ <el-table-column label="费用预算(元)" prop="money" align="center" />
+ <el-table-column label="培训形式" prop="modality" align="center" />
+ <el-table-column label="是否已完成" prop="status" align="center">
+ <template #default="scope">
+ <span>{{scope.row.status == 0 ? '是' :scope.row.status == 1 ?'否': ''}}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+ <template #default="scope">
+ <el-button link type="primary" @click="openDialog('edit',scope.row)" >编辑</el-button>
+ <el-button link type="danger" @click="handleDelete(scope.row)" >删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+
+ <div class="pag-container">
+ <el-pagination
+ v-model:current-page="data.queryParams.pageNum"
+ v-model:page-size="data.queryParams.pageSize"
+ :page-sizes="[10,15,20,25]"
+ layout="total, sizes, prev, pager, next, jumper"
+ :total="total"
+ @size-change="handleSizeChange"
+ @current-change="handleCurrentChange"
+ />
+ </div>
+ <trainDialog ref="noticeRef" @getList = "getList"></trainDialog>
+ </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import trainDialog from "./components/trainDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delBasic, getBasic} from "@/api/companyInfo/basicInfo";
+import {delScenario, getScenarioPage} from "@/api/selfProblems/scenario";
+import {delTrainPlan, getTrainPlanPage} from "@/api/onlineEducation/trainPlan";
+
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const choosedData = ref([])
+const data = reactive({
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ companyId: null,
+ },
+ companyList: [],
+ isAdmin: false,
+ expertData: []
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+const fieldsAdmin = ref({
+ '企业名称': 'companyName',
+ '时间':'trainTime',
+ '课程名称':'trainName',
+ '组织部门':'deptName',
+ '参训对象':'trainObject',
+ '人数':'num',
+ '课时':'hour',
+ '费用预算(元)':'money',
+ '培训形式':'modality',
+ '是否已完成':'statusName',
+});
+const fields = ref({
+ '时间':'trainTime',
+ '课程名称':'trainName',
+ '组织部门':'deptName',
+ '参训对象':'trainObject',
+ '人数':'num',
+ '课时':'hour',
+ '费用预算(元)':'money',
+ '培训形式':'modality',
+ '是否已完成':'statusName',
+});
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ console.log("userInfo",userInfo)
+ data.isAdmin = userInfo.userType === 0;
+ if(data.isAdmin){
+ data.queryParams.companyId = null
+ getCompanyList()
+ }else {
+ data.queryParams.companyId = userInfo.companyId
+ }
+ getList();
+});
+const getList = async () => {
+ loading.value = true;
+ const res = await getTrainPlanPage(data.queryParams);
+ if(res.code === 200){
+ dataList.value = res.data.list.map(item => {
+ return {
+ ...item,
+ trainTime: item.trainTime.substring(0,10),
+ statusName: item.status == 0 ? '是' : item.status == 1 ? '否' : ''
+ }
+ })
+ total.value = res.data.total
+ }else{
+ ElMessage.warning(res.message)
+ }
+ loading.value = false;
+
+}
+
+const searchClick = () => {
+ getList();
+}
+const openDialog = (type, value) => {
+ noticeRef.value.openDialog(type, value,data.companyList);
+}
+
+const getCompanyList = async ()=>{
+ const queryParams = {
+ pageNum: 1,
+ pageSize: 999
+ }
+ const res = await getCompany(queryParams)
+ if (res.code == 200) {
+ data.companyList = res.data.list?res.data.list:[]
+ } else {
+ ElMessage.warning(res.message)
+ }
+}
+
+const handleSizeChange = (val) => {
+ data.queryParams.pageSize = val
+ getList()
+}
+const handleCurrentChange = (val) => {
+ data.queryParams.pageNum = val
+ getList()
+}
+
+/** 重置新增的表单以及其他数据 */
+function reset() {
+ data.queryParams = {
+ companyId: '',
+ pageNum: 1,
+ pageSize: 10,
+ }
+ choosedData.value = []
+ data.companyList = [];
+ getList();
+ getCompanyList()
+}
+const exportData = () => {
+ if(choosedData.value && choosedData.value.length === 0){
+ ElMessage.warning('请选择需要导出的数据')
+ }else {
+ startGeneration()
+ }
+}
+const templatePath = '/scenarioExample.docx'
+const startGeneration = async () => {
+ choosedData.value.forEach(item => {
+ try {
+ item.title = item.year+'年度内部审核策划方案'
+ generateWordDocument(templatePath, item, item.companyName+ '_' + item.title +'.docx');
+ } catch (error){
+ ElMessage({
+ type: 'warning',
+ message: '导出失败'
+ });
+ }
+ })
+}
+
+const handleSelectionChange = (val) => {
+ choosedData.value = val
+}
+const handleDelete = (val) => {
+ ElMessageBox.confirm(
+ '确定删除此条数据?',
+ '提示',
+ {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning',
+ })
+ .then( async() => {
+ const res = await delTrainPlan(val.id);
+ if(res.code === 200){
+ ElMessage({
+ type: 'success',
+ message: '删除成功'
+ });
+ getList();
+ }else{
+ ElMessage.warning(res.message)
+ }
+ })
+}
+
+</script>
+<style lang="scss">
+.pag-container{
+ float: right;
+ margin-top: 10px;
+}
+</style>
diff --git a/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue b/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue
index d318110..f39d1ae 100644
--- a/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue
+++ b/src/views/work/qualityInfo/supplierQuality/supplierList/components/supplierDialog.vue
@@ -32,7 +32,7 @@
<el-input v-model="state.form.user" :disabled="title === '查看'"/>
</el-form-item>
<el-form-item label="联系电话:" prop="phone" >
- <el-input v-model="state.form.phone" :disabled="title === '查看'"/>
+ <el-input v-model="state.form.phone" @input="state.form.phone= state.form.phone.replace(/[^0-9-]/g,'')" :disabled="title === '查看'"/>
</el-form-item>
<el-form-item label="备注:" prop="remark" >
<el-input v-model="state.form.remark" :disabled="title === '查看'"/>
@@ -64,17 +64,17 @@
const busRef = ref();
const length = ref()
const emit = defineEmits(["getList"]);
-const validatePhone = (rule, value, callback)=>{
- if(value === ''){
- callback(new Error('请输入手机号'))
- }else{
- if(!verifyPhone(value)){
- callback(new Error('手机号格式有误'))
- }else{
- callback()
- }
- }
-}
+// const validatePhone = (rule, value, callback)=>{
+// if(value === ''){
+// callback(new Error('请输入手机号'))
+// }else{
+// if(!verifyPhone(value)){
+// callback(new Error('手机号格式有误'))
+// }else{
+// callback()
+// }
+// }
+// }
const state = reactive({
form: {
@@ -92,7 +92,7 @@
supplierName: [{ required: true, message: '请输入供应商名称', trigger: 'blur' }],
supplierAddr:[{ required: true, message: '请输入地址', trigger: 'blur' }],
user: [{ required: true, message: '请输入联系人', trigger: 'blur' }],
- phone: [{ required: true, validator: validatePhone, trigger: 'blur' }],
+ phone: [{ required: true, message: '请输入联系电话', trigger: 'blur' }],
merito: [{ required: true, message: '请输入主营产品', trigger: 'blur' }],
},
isAdmin: false,
diff --git a/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue b/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue
index f424f8e..aea8de3 100644
--- a/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue
+++ b/src/views/work/selfProblems/internalAudit/auditorManage/tableList/index.vue
@@ -4,7 +4,7 @@
<el-form style="display: flex;flex-wrap: wrap;">
<el-form-item>
<el-button
- v-if="data.userType ==0 || data.userType == 1"
+ v-if="data.userType ==0 || data.userType == 6"
type="primary"
plain
icon="Plus"
--
Gitblit v1.9.2