From 6a136d606c4ab31b7c75a1571ddda278ccd34f03 Mon Sep 17 00:00:00 2001
From: zhouwx <1175765986@qq.com>
Date: 星期五, 13 六月 2025 13:46:08 +0800
Subject: [PATCH] 修改
---
src/views/system/role/index.vue | 6
src/views/homePage.vue | 2
src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue | 74 -
src/api/companyInfo/qualifications.js | 35
src/views/build/conpanyFunctionConsult/companyInfo/overview/index.vue | 56
src/views/build/conpanyFunctionConsult/companyInfo/qualifications/index.vue | 262 ++++++
src/views/build/conpanyFunctionConsult/companyInfo/basicInfo/index.vue | 230 +++++
src/api/companyInfo/policy.js | 35
src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue | 11
src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue | 378 +++++++++
src/api/companyInfo/overview.js | 35
src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue | 235 +++++
src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue | 11
src/views/build/conpanyFunctionConsult/companyInfo/policy/index.vue | 197 ++++
src/utils/exportWord.js | 55 +
src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue | 319 +++++++
package.json | 3
src/views/build/conpanyFunctionConsult/companyInfo/basicInfo/components/basicInfoDialog.vue | 166 ++++
src/views/build/conpanyFunctionConsult/companyInfo/qualifications/components/qualificationsDialog.vue | 232 +++++
src/api/companyInfo/basicInfo.js | 35
20 files changed, 2,303 insertions(+), 74 deletions(-)
diff --git a/package.json b/package.json
index 5c845dd..bc40b46 100644
--- a/package.json
+++ b/package.json
@@ -23,6 +23,7 @@
"@wangeditor/editor-for-vue": "^5.1.12",
"@wangeditor/plugin-upload-attachment": "^1.1.0",
"axios": "0.27.2",
+ "docxtemplater": "^3.63.2",
"echarts": "5.4.0",
"element-plus": "2.2.27",
"file-saver": "2.0.5",
@@ -30,9 +31,11 @@
"js-base64": "^3.7.5",
"js-cookie": "3.0.1",
"jsencrypt": "3.3.1",
+ "jszip-utils": "^0.1.0",
"moment": "^2.30.1",
"nprogress": "0.2.0",
"pinia": "2.0.22",
+ "pizzip": "^3.2.0",
"quill": "^2.0.0-dev.3",
"spark-md5": "^3.0.2",
"tinymce": "^5.10.2",
diff --git a/src/api/companyInfo/basicInfo.js b/src/api/companyInfo/basicInfo.js
new file mode 100644
index 0000000..253fe4e
--- /dev/null
+++ b/src/api/companyInfo/basicInfo.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+
+export function getBasic(params) {
+ return request({
+ url: '/company/basic/list',
+ method: 'get',
+ params: params
+ })
+}
+
+export function addBasic(data) {
+ return request({
+ url: '/company/basic/insert',
+ method: 'post',
+ data: data
+ })
+}
+
+export function editBasic(params) {
+ return request({
+ url: `/company/basic/update`,
+ method: 'post',
+ data: params
+ })
+}
+
+export function delBasic(data) {
+ return request({
+ url: `/company/basic/deleted?companyBasicId=${data}`,
+ method: 'get'
+ })
+}
+
+
diff --git a/src/api/companyInfo/overview.js b/src/api/companyInfo/overview.js
new file mode 100644
index 0000000..f672594
--- /dev/null
+++ b/src/api/companyInfo/overview.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+
+export function getCom(params) {
+ return request({
+ url: '/company/summary/list',
+ method: 'get',
+ params: params
+ })
+}
+
+export function addCom(data) {
+ return request({
+ url: '/company/summary/insert',
+ method: 'post',
+ data: data
+ })
+}
+
+export function editCom(params) {
+ return request({
+ url: `/company/summary/update`,
+ method: 'post',
+ data: params
+ })
+}
+
+export function delCom(data) {
+ return request({
+ url: `/company/summary/deleted?companySummaryId=${data}`,
+ method: 'get'
+ })
+}
+
+
diff --git a/src/api/companyInfo/policy.js b/src/api/companyInfo/policy.js
new file mode 100644
index 0000000..3b7ebdf
--- /dev/null
+++ b/src/api/companyInfo/policy.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+
+export function getPolicy(params) {
+ return request({
+ url: '/company/policy/list',
+ method: 'get',
+ params: params
+ })
+}
+
+export function addPolicy(data) {
+ return request({
+ url: '/company/policy/insert',
+ method: 'post',
+ data: data
+ })
+}
+
+export function editPolicy(params) {
+ return request({
+ url: `/company/policy/update`,
+ method: 'post',
+ data: params
+ })
+}
+
+export function delPolicy(data) {
+ return request({
+ url: `/company/policy/deleted?qualityPolicyId=${data}`,
+ method: 'get'
+ })
+}
+
+
diff --git a/src/api/companyInfo/qualifications.js b/src/api/companyInfo/qualifications.js
new file mode 100644
index 0000000..c916975
--- /dev/null
+++ b/src/api/companyInfo/qualifications.js
@@ -0,0 +1,35 @@
+import request from '@/utils/request'
+
+
+export function getQualification(params) {
+ return request({
+ url: '/company/certificate/list',
+ method: 'get',
+ params: params
+ })
+}
+
+export function addQualification(data) {
+ return request({
+ url: '/company/certificate/insert',
+ method: 'post',
+ data: data
+ })
+}
+
+export function editQualification(params) {
+ return request({
+ url: `/company/certificate/update`,
+ method: 'post',
+ data: params
+ })
+}
+
+export function delQualification(data) {
+ return request({
+ url: `/company/certificate/deleted?companyCertificateId=${data}`,
+ method: 'get'
+ })
+}
+
+
diff --git a/src/utils/exportWord.js b/src/utils/exportWord.js
new file mode 100644
index 0000000..3ba3d7b
--- /dev/null
+++ b/src/utils/exportWord.js
@@ -0,0 +1,55 @@
+//引入工具
+import PizZip from 'pizzip';
+import Docxtemplater from 'docxtemplater';
+import JSZipUtils from 'jszip-utils';
+import { saveAs } from 'file-saver';
+
+// 加载 .docx 模板文件
+function loadFile(url, callback) {
+ JSZipUtils.getBinaryContent(url, callback);
+}
+
+// 下载生成的文档
+export function download(file, name) {
+
+}
+
+// 生成并下载 Word 文档(templatePath是word文档模版地址,data是对应的数据)
+export function generateWordDocument(templatePath, data, name) {
+ loadFile(templatePath, function (error, content) {
+ if (error) {
+ throw error
+ return;
+ }
+
+ try {
+ // 加载模板文件内容到 PizZip
+ const zip = new PizZip(content);
+ const doc = new Docxtemplater(zip, {
+ paragraphLoop: true,
+ linebreaks: true,
+ });
+
+ // 设置模板中的占位符数据
+ doc.setData(data);
+
+ // 渲染文档
+ doc.render();
+
+ // 生成最终的文档 Blob
+ const fileWord = doc.getZip().generate({
+ type: 'blob',
+ mimeType: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+ });
+
+ saveAs(fileWord, name);
+
+ // // 返回生成的文档 Blob
+ // resolve(fileWord);
+ } catch (error) {
+ console.error('Error rendering document:', error);
+ throw error
+ }
+ });
+
+}
diff --git a/src/views/build/conpanyFunctionConsult/companyInfo/basicInfo/components/basicInfoDialog.vue b/src/views/build/conpanyFunctionConsult/companyInfo/basicInfo/components/basicInfoDialog.vue
new file mode 100644
index 0000000..84bbb10
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/basicInfo/components/basicInfoDialog.vue
@@ -0,0 +1,166 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="50%"
+ :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-position="top" label-width="150px" >
+ <el-form-item label="1.企业的基本情况,主要包括:法人证书编号,所属部门、法人代表姓名、身份证号、职务、人员总数、技术人员数、不良情况记录、保密等资质。" prop="basic" >
+ <el-input v-model="state.form.basic" :rows="4" type="textarea" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="2.企业简介、行业特点、资源和能力情况。特别是上次审核以来领导层、组织机构(包括分场所)及体系变动情况。" prop="introduce" >
+ <el-input v-model="state.form.introduce" :rows="4" type="textarea" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="3.最高管理者对体系的重视程度,员工的质量意识,企业的经营宗旨和质量方针的确定,质量方针与经营宗旨是否相适宜,质量目标的适宜性及实现情况,及上年度目标的实现情况,本年度目标的阶段性实现情况,当目标没有实现时,采取的措施。" prop="target" >
+ <el-input v-model="state.form.target" :rows="4" type="textarea" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="4.自上次审核以来签订了多少份合同(军)、交付情况,以及取得的绩效(顾客满意度情况、订货及销售收入、利润及增加情况;产值/利润递增情况;质量损失减少情况;产品一次交验合格率提升情况;取得的专利和奖励成果情况;顾客表扬方面的内容),按照年度统计数据或年递增率。" prop="quality">
+ <el-input v-model="state.form.quality" :rows="4" type="textarea" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="5.总结自上次审核以来开展了哪些质量管理专项活动,特别是有效提高质量管理意识和质量管理技能、产品实物质量方面的管理改进活动,效果如何,以及纠正/预防措施落实情况。" prop="activity">
+ <el-input v-model="state.form.activity" :rows="4" type="textarea" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="6.本年度内审时间、开出不符合项数量及整改验收;管理评审时间、改进事项及完成情况。" prop="audit">
+ <el-input v-model="state.form.audit" :rows="4" type="textarea" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="7.公司的外包过程有哪些?如何控制以及风险管理的应用情况。" prop="epiboly">
+ <el-input v-model="state.form.epiboly" :rows="4" type="textarea" :disabled="title === '查看'"/>
+ </el-form-item>
+ <el-form-item label="8.自上次审核以来资源投入情况(人员、环境、生产/检测设备等配置增加或者变动的数据),教育培训实施次数/人次等。" prop="resource">
+ <el-input v-model="state.form.resource" :disabled="title === '查看'" :rows="4" type="textarea" />
+ </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 {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} from "@/api/onlineEducation/company";
+import {verifyPhone} from "@/utils/validate";
+import {addBasic, editBasic} from "@/api/companyInfo/basicInfo";
+import Cookies from "js-cookie";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const state = reactive({
+ form: {
+ id: '',
+ companyId: null,
+ companyName: '',
+ basic: '',
+ introduce: '',
+ target: '',
+ quality: '',
+ activity: '',
+ audit: '',
+ epiboly: '',
+ resource: '',
+ },
+ formRules:{
+ basic: [{ required: true, message: '请输入', trigger: 'blur' }],
+ introduce:[{ required: true, message: '请输入', trigger: 'blur' }],
+ target: [{ required: true, message: '请输入', trigger: 'blur' }],
+ quality: [{ required: true, message: '请输入', trigger: 'blur' }],
+ activity: [{ required: true, message: '请输入', trigger: 'blur' }],
+ audit: [{ required: true, message: '请输入', trigger: 'blur' }],
+ epiboly: [{ required: true, message: '请输入', trigger: 'blur' }],
+ resource: [{ required: true, message: '请输入', trigger: 'blur' }],
+ },
+})
+
+
+const openDialog = async (type, value) => {
+ title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+ if(type === 'edit' || type === 'review') {
+ state.form = JSON.parse(JSON.stringify(value));
+ }
+ dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+ const valid = await busRef.value.validate();
+ 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 addBasic(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 editBasic(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 reset = () => {
+ state.form = {
+ id: '',
+
+ }
+}
+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/build/conpanyFunctionConsult/companyInfo/basicInfo/index.vue b/src/views/build/conpanyFunctionConsult/companyInfo/basicInfo/index.vue
new file mode 100644
index 0000000..e7b9096
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/basicInfo/index.vue
@@ -0,0 +1,230 @@
+<template>
+ <div class="app-container">
+ <div style="margin-bottom: 10px">
+ <el-form style="display: flex;flex-wrap: wrap;">
+ <el-form-item v-if="!data.isAdmin">
+ <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.companyName"
+ filterable
+ remote
+ @change="selectValue"
+ reserve-keyword
+ placeholder="请输入企业名称"
+ remote-show-suffix
+ :remote-method="getCompanyList"
+ :loading="loadingCompany"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in data.companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </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">
+ <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="selection" width="55" />
+ <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+ <el-table-column label="企业名称" prop="companyName" align="center" />
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+ <template #default="scope">
+ <el-button link type="primary" @click="openDialog('review',scope.row)" >查看</el-button>
+ <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>
+ <basicInfoDialog ref="noticeRef" @getList = "getList"></basicInfoDialog>
+ </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import basicInfoDialog from "./components/basicInfoDialog.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";
+
+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
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ console.log("userInfo",userInfo)
+ data.isAdmin = userInfo.userType === 0;
+ data.queryParams.companyId = userInfo.companyId ? userInfo.companyId : null
+ getList();
+});
+const getList = async () => {
+ loading.value = true;
+ const res = await getBasic(data.queryParams);
+ if(res.code === 200){
+ dataList.value = res.data.list
+ 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);
+}
+const selectValue = (val) => {
+ data.companyList.forEach(item => {
+ if(item.name === val){
+ data.queryParams.companyId = item.id
+ }
+ })
+}
+
+const getCompanyList = async (val)=>{
+ if(val != ""){
+ loadingCompany.value = true;
+ const queryParams = {
+ name: val
+ }
+ const res = await getCompany(queryParams)
+ if (res.code == 200) {
+ loadingCompany.value = false;
+ data.companyList = 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();
+}
+const exportData = () => {
+ if(choosedData.value && choosedData.value.length === 0){
+ ElMessage.warning('请选择需要导出的数据')
+ }else {
+ startGeneration()
+ }
+}
+const templatePath = '/infoExample.docx'
+const startGeneration = async () => {
+ choosedData.value.forEach(item => {
+ try {
+ generateWordDocument(templatePath, item, item.companyName+'_基本情况.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 delBasic(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/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue b/src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue
index a521f1e..28a213c 100644
--- a/src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/overview/components/overviewDialog.vue
@@ -8,12 +8,12 @@
>
<el-form :model="state.noticeForm" size="default" ref="noticeRef" :rules="title === '新增' || title === '编辑' ? state.formRules : {}" label-width="110px" >
<el-form-item label="企业概括:" v-if="showEditor" required>
- <t-editor style="width: 800px" ref="myEditor" :value="state.noticeForm.noticeContent" ></t-editor>
+ <t-editor style="width: 800px" ref="myEditor" :value="state.noticeForm.companySummary" ></t-editor>
</el-form-item>
- <el-form-item label="公告内容:" v-else>
+ <el-form-item label="企业概括:" v-else>
<div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" >
<div class="ql-editor">
- <div class="reviewTable" v-html="state.noticeForm.noticeContent" @click="showFile($event)"></div>
+ <div class="reviewTable" v-html="state.noticeForm.companySummary" @click="showFile($event)"></div>
</div>
</div>
</el-form-item>
@@ -28,7 +28,7 @@
</div>
</template>
<script setup>
-import {nextTick, reactive, ref, toRefs, watch} from 'vue'
+import {nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
import WeEditor from "@/components/WeEditor/index.vue";
import TEditor from "@/components/Tinymce/Tinymce.vue"
import {ElMessage} from "element-plus";
@@ -37,6 +37,8 @@
import {getToken} from "@/utils/auth";
import {handleThemeStyle} from "@/utils/theme";
import useSettingsStore from "@/store/modules/settings";
+import {addCom, editCom} from "@/api/companyInfo/overview";
+import Cookies from "js-cookie";
const emit = defineEmits(["getList"]);
@@ -51,34 +53,27 @@
const state = reactive({
noticeForm: {
id: '',
- noticeTitle: '',
- noticeContent: '',
+ companySummary: '',
+ companyId:null,
+ companyName: ''
},
formRules:{
- // noticeContent: [{ required: true, message: '请输入公告内容', trigger: 'blur' }],
+ companySummary: [{ required: true, message: '企业概况', trigger: 'blur' }],
},
})
+onMounted(() => {
+
+});
const openDialog = async (type, value) => {
- dialogVisible.value = true;
- // state.noticeForm.noticeContent = ""
+
isReview.value = false;
showEditor.value = false
title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
if(type === 'edit' || type === 'review') {
- // const param = {
- // noticeId: value.id
- // }
- // const res = await getNoticeDetail(param);
- // if(res.code === 200){
- // state.noticeForm.id = res.data.id
- // state.noticeForm.noticeTitle = res.data.title
- // state.noticeForm.noticeContent = res.data.content
- // }else{
- // ElMessage.warning(res.message)
- // }
-
+ state.noticeForm.companySummary = value.companySummary
+ state.noticeForm.id = value.id
}
if(type === 'review') {
showEditor.value = false
@@ -91,11 +86,10 @@
if(type === 'add'){
reset()
}
-
-
+ dialogVisible.value = true;
}
const getEditorData = (val) =>{
- state.noticeForm.noticeContent = val;
+ state.noticeForm.companySummary = val;
}
const showFile = (e) => {
@@ -133,25 +127,23 @@
}
const onSubmit = async () => {
- state.noticeForm.noticeContent = tinyMCE.activeEditor.getContent();
- console.log("点击提交")
- console.log('data',state.noticeForm.noticeContent)
+ state.noticeForm.companySummary = tinyMCE.activeEditor.getContent();
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ state.noticeForm.companyId = userInfo.companyId
+ state.noticeForm.companyName = userInfo.companyName
// // myEditor.value.submit();
const valid = await noticeRef.value.validate();
if(valid){
-
- if(state.noticeForm.noticeContent == "") {
+ if(state.noticeForm.companySummary == "") {
ElMessage({
type: 'warning',
- message: '请输入公司概况'
+ message: '请输入企业概况'
});
return;
}
if(title.value === '新增'){
- const param = {
- content: state.noticeForm.noticeContent,
- }
- const res = await addNotice(param)
+ const {id,...data} = JSON.parse(JSON.stringify(state.noticeForm))
+ const res = await addCom(data)
if(res.code === 200){
ElMessage({
type: 'success',
@@ -167,11 +159,8 @@
noticeRef.value.clearValidate();
dialogVisible.value = false;
}else if(title.value === '编辑') {
- const param = {
- id: state.noticeForm.id,
- content: state.noticeForm.noticeContent,
- }
- const res = await editNotice(param)
+ const {...data} = JSON.parse(JSON.stringify(state.noticeForm))
+ const res = await editCom(data)
if(res.code === 200){
ElMessage({
type: 'success',
@@ -202,9 +191,10 @@
}
const reset = () => {
state.noticeForm = {
- id: '',
- noticeTitle: '',
- noticeContent: ''
+ id: '',
+ companySummary: '',
+ companyId:null,
+ companyName: ''
}
}
diff --git a/src/views/build/conpanyFunctionConsult/companyInfo/overview/index.vue b/src/views/build/conpanyFunctionConsult/companyInfo/overview/index.vue
index b829ad5..2ac8fc0 100644
--- a/src/views/build/conpanyFunctionConsult/companyInfo/overview/index.vue
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/overview/index.vue
@@ -2,7 +2,7 @@
<div class="app-container">
<div style="margin-bottom: 10px">
<el-form style="display: flex;flex-wrap: wrap">
- <el-form-item>
+ <el-form-item v-if="!data.isAdmin">
<el-button
type="primary"
plain
@@ -12,7 +12,7 @@
</el-form-item>
<el-form-item label="企业名称:" v-if="data.isAdmin" style="margin-left: 20px">
<el-select
- v-model="data.queryParams.companyName"
+ v-model="data.companyName"
filterable
remote
@change="selectValue"
@@ -31,7 +31,7 @@
/>
</el-select>
</el-form-item>
- <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>
@@ -41,7 +41,7 @@
<!-- 表格数据 -->
<el-table v-loading="loading" :data="dataList" :border="true">
<el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
- <el-table-column label="企业名称" prop="conpanyName" align="center" />
+ <el-table-column label="企业名称" prop="companyName" align="center" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
<template #default="scope">
<el-button link type="primary" @click="openDialog('review',scope.row)" >查看</el-button>
@@ -72,6 +72,7 @@
import {ElMessage, ElMessageBox} from "element-plus";
import {getCompany} from "@/api/onlineEducation/company";
import Cookies from "js-cookie";
+import {delCom, getCom} from "@/api/companyInfo/overview";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const noticeRef = ref();
@@ -83,7 +84,8 @@
companyId: null,
},
companyList: [],
- isAdmin: false
+ isAdmin: false,
+ companyName: ''
});
const dataList = ref([]);
const total = ref(0);
@@ -94,22 +96,19 @@
const userInfo = JSON.parse(Cookies.get('userInfo'))
console.log("userInfo",userInfo)
data.isAdmin = userInfo.userType === 0;
+ data.queryParams.companyId = userInfo.companyId ? userInfo.companyId : null
getList();
});
const getList = async () => {
loading.value = true;
- // const res = await getNoticeList(data.queryParams);
- // if(res.code === 200){
- // dataList.value = res.data.list.map(item => {
- // return {
- // ...item,
- // createTime: item.createTime.replace(/T/g," ")
- // }
- // })
- // total.value = res.data.total
- // }else{
- // ElMessage.warning(res.message)
- // }
+ const res = await getCom(data.queryParams);
+ if(res.code === 200){
+ dataList.value = res.data.list
+ total.value = res.data.total
+ }else{
+ ElMessage.warning(res.message)
+ }
+ loading.value = false;
loading.value = false;
}
@@ -157,10 +156,11 @@
/** 重置新增的表单以及其他数据 */
function reset() {
data.queryParams = {
- companyId: '',
+ companyId: null,
pageNum: 1,
pageSize: 10,
}
+ data.companyName = ''
data.companyList = [];
getList();
}
@@ -174,16 +174,16 @@
type: 'warning',
})
.then( async() => {
- // const res = await delNotice(val);
- // if(res.code === 200){
- // ElMessage({
- // type: 'success',
- // message: '删除成功'
- // });
- // getList();
- // }else{
- // ElMessage.warning(res.message)
- // }
+ const res = await delCom(val.id);
+ if(res.code === 200){
+ ElMessage({
+ type: 'success',
+ message: '删除成功'
+ });
+ getList();
+ }else{
+ ElMessage.warning(res.message)
+ }
})
}
diff --git a/src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue b/src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue
new file mode 100644
index 0000000..310c34e
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/policy/components/policyDialog.vue
@@ -0,0 +1,235 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="800px"
+ :before-close="handleClose"
+ >
+ <el-form :model="state.noticeForm" size="default" ref="noticeRef" :rules="title === '新增' || title === '编辑' ? state.formRules : {}" label-width="110px" >
+ <el-form-item label="质量方针:" v-if="showEditor" required>
+ <t-editor style="width: 800px" ref="myEditor" :value="state.noticeForm.policy" ></t-editor>
+ </el-form-item>
+ <el-form-item label="质量方针:" v-else>
+ <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" >
+ <div class="ql-editor">
+ <div class="reviewTable" v-html="state.noticeForm.policy" @click="showFile($event)"></div>
+ </div>
+ </div>
+ </el-form-item>
+ </el-form>
+ <template #footer v-if="!isReview">
+ <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 {nextTick, onMounted, reactive, ref, toRefs, watch} from 'vue'
+import WeEditor from "@/components/WeEditor/index.vue";
+import TEditor from "@/components/Tinymce/Tinymce.vue"
+import {ElMessage} from "element-plus";
+import {addNotice, editNotice, getNoticeDetail} from "@/api/backManage/notice";
+import axios from "axios";
+import {getToken} from "@/utils/auth";
+import {handleThemeStyle} from "@/utils/theme";
+import useSettingsStore from "@/store/modules/settings";
+import {addCom, editCom} from "@/api/companyInfo/overview";
+import Cookies from "js-cookie";
+import {addPolicy, editPolicy} from "@/api/companyInfo/policy";
+
+
+const emit = defineEmits(["getList"]);
+
+const dialogVisible = ref(false);
+const title = ref("");
+const noticeRef = ref();
+const fileList = ref([]);
+const myEditor = ref();
+const isReview = ref(false);
+const showEditor = ref(true);
+const state = reactive({
+ noticeForm: {
+ id: '',
+ policy: '',
+ companyId:null,
+ companyName: ''
+ },
+ formRules:{
+ policy: [{ required: true, message: '质量方针', trigger: 'blur' }],
+ },
+
+})
+
+onMounted(() => {
+
+});
+const openDialog = async (type, value) => {
+
+ isReview.value = false;
+ showEditor.value = false
+ title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+ if(type === 'edit' || type === 'review') {
+ state.noticeForm.policy = value.policy
+ state.noticeForm.id = value.id
+ }
+ if(type === 'review') {
+ showEditor.value = false
+ isReview.value = true;
+ }
+ if(type === 'edit' || type === 'add') {
+ showEditor.value = true;
+ isReview.value = false;
+ }
+ if(type === 'add'){
+ reset()
+ }
+ dialogVisible.value = true;
+}
+const getEditorData = (val) =>{
+ state.noticeForm.policy = val;
+}
+
+const showFile = (e) => {
+ if(e.target.nodeName === 'A'){
+ console.log("e",e)
+ e.preventDefault();
+ const file = {
+ fileUrl: e.target.href,
+ fileName: e.target.innerHTML
+ }
+ axios.get( file.fileUrl,{
+ headers:
+ {
+ 'Content-Type': 'application/json',
+ 'Authorization':getToken(),
+ },
+ responseType: 'blob'
+ }
+ ).then(res=>{
+ if (res) {
+ const link = document.createElement('a')
+ let blob = new Blob([res.data],{type: res.data.type})
+ link.style.display = "none";
+ link.href = URL.createObjectURL(blob); // 创建URL
+ link.setAttribute("download", file.fileName);
+ document.body.appendChild(link);
+ link.click();
+ document.body.removeChild(link);
+ } else {
+ this.$message.error('获取文件失败')
+ }
+ // handleClose();
+ })
+ }
+}
+
+const onSubmit = async () => {
+ state.noticeForm.policy = tinyMCE.activeEditor.getContent();
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ state.noticeForm.companyId = userInfo.companyId
+ state.noticeForm.companyName = userInfo.companyName
+ // // myEditor.value.submit();
+ const valid = await noticeRef.value.validate();
+ if(valid){
+ if(state.noticeForm.policy == "") {
+ ElMessage({
+ type: 'warning',
+ message: '请输入企业概况'
+ });
+ return;
+ }
+ if(title.value === '新增'){
+ const {id,...data} = JSON.parse(JSON.stringify(state.noticeForm))
+ const res = await addPolicy(data)
+ if(res.code === 200){
+ ElMessage({
+ type: 'success',
+ message: '新增成功'
+ });
+ }else{
+ ElMessage.warning(res.message)
+ }
+ emit("getList")
+ reset();
+ showEditor.value=false
+ myEditor.value.clear();
+ noticeRef.value.clearValidate();
+ dialogVisible.value = false;
+ }else if(title.value === '编辑') {
+ const {...data} = JSON.parse(JSON.stringify(state.noticeForm))
+ const res = await editPolicy(data)
+ if(res.code === 200){
+ ElMessage({
+ type: 'success',
+ message: '编辑成功'
+ });
+ }else{
+ ElMessage.warning(res.message)
+ }
+ emit("getList")
+ reset();
+ showEditor.value=false
+ myEditor.value.clear();
+ noticeRef.value.clearValidate();
+ dialogVisible.value = false;
+ }
+ }
+}
+
+const handleClose = () => {
+ if(title.value ==="新增"|| title.value ==='编辑'){
+ myEditor.value.clear();
+ showEditor.value=false
+ }
+
+ // reset()
+ noticeRef.value.clearValidate();
+ dialogVisible.value = false;
+}
+const reset = () => {
+ state.noticeForm = {
+ id: '',
+ policy: '',
+ companyId:null,
+ companyName: ''
+ }
+}
+
+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;
+ }
+}
+.reviewTable {
+ :deep(table){
+ border: 1px solid #ccc;
+ text-align: center;
+ }
+ :deep(table td){
+ border: 1px solid #ccc;
+ text-align: center;
+ padding: 0 5px;
+ }
+ :deep(table th){
+ border: 1px solid #ccc;
+ }
+}
+
+
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/companyInfo/policy/index.vue b/src/views/build/conpanyFunctionConsult/companyInfo/policy/index.vue
new file mode 100644
index 0000000..5f06dd7
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/policy/index.vue
@@ -0,0 +1,197 @@
+<template>
+ <div class="app-container">
+ <div style="margin-bottom: 10px">
+ <el-form style="display: flex;flex-wrap: wrap">
+ <el-form-item v-if="!data.isAdmin">
+ <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.companyName"
+ filterable
+ remote
+ @change="selectValue"
+ reserve-keyword
+ placeholder="请输入企业名称"
+ remote-show-suffix
+ :remote-method="getCompanyList"
+ :loading="loadingCompany"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in data.companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </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>
+ </div>
+ <!-- 表格数据 -->
+ <el-table v-loading="loading" :data="dataList" :border="true">
+ <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+ <el-table-column label="企业名称" prop="companyName" align="center" />
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+ <template #default="scope">
+ <el-button link type="primary" @click="openDialog('review',scope.row)" >查看</el-button>
+ <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>
+ <policyDialog ref="noticeRef" @getList = "getList"></policyDialog>
+ </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import policyDialog from "./components/policyDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {delCom, getCom} from "@/api/companyInfo/overview";
+import {delPolicy, getPolicy} from "@/api/companyInfo/policy";
+const { proxy } = getCurrentInstance();
+const loading = ref(false);
+const noticeRef = ref();
+const loadingCompany = ref(false)
+const data = reactive({
+ queryParams: {
+ pageNum: 1,
+ pageSize: 10,
+ companyId: null,
+ },
+ companyList: [],
+ isAdmin: false,
+ companyName: ''
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ console.log("userInfo",userInfo)
+ data.isAdmin = userInfo.userType === 0;
+ data.queryParams.companyId = userInfo.companyId ? userInfo.companyId : null
+ getList();
+});
+const getList = async () => {
+ loading.value = true;
+ const res = await getPolicy(data.queryParams);
+ if(res.code === 200){
+ dataList.value = res.data.list
+ total.value = res.data.total
+ }else{
+ ElMessage.warning(res.message)
+ }
+ loading.value = false;
+ loading.value = false;
+
+}
+
+const searchClick = () => {
+ getList();
+}
+const openDialog = (type, value) => {
+ noticeRef.value.openDialog(type, value);
+}
+const selectValue = (val) => {
+ data.companyList.forEach(item => {
+ if(item.name === val){
+ data.queryParams.companyId = item.id
+ }
+ })
+}
+
+const getCompanyList = async (val)=>{
+ if(val != ""){
+ loadingCompany.value = true;
+ const queryParams = {
+ name: val
+ }
+ const res = await getCompany(queryParams)
+ if (res.code == 200) {
+ loadingCompany.value = false;
+ data.companyList = 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: null,
+ pageNum: 1,
+ pageSize: 10,
+ }
+ data.companyName = ''
+ data.companyList = [];
+ getList();
+}
+const handleDelete = (val) => {
+ ElMessageBox.confirm(
+ '确定删除此条数据?',
+ '提示',
+ {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning',
+ })
+ .then( async() => {
+ const res = await delPolicy(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/build/conpanyFunctionConsult/companyInfo/qualifications/components/qualificationsDialog.vue b/src/views/build/conpanyFunctionConsult/companyInfo/qualifications/components/qualificationsDialog.vue
new file mode 100644
index 0000000..a519dfd
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/qualifications/components/qualificationsDialog.vue
@@ -0,0 +1,232 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="550px"
+ :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="150px" >
+ <el-form-item label="取得资质证书名称:" prop="certificateName" >
+ <el-input v-model="state.form.certificateName" :disabled="title === '查看'" placeholder="请输入取得资质证书名称"/>
+ </el-form-item>
+ <el-form-item label="证书编号:" prop="certificateNum" >
+ <el-input v-model="state.form.certificateNum" :disabled="title === '查看'" placeholder="请输入证书编号"/>
+ </el-form-item>
+ <el-form-item label="有效期:" prop="effectiveTime" >
+ <el-date-picker
+ :disabled="title === '查看'"
+ v-model="state.form.effectiveTime"
+ type="date"
+ placeholder="请选择截止日期"
+ style="width: 100%"
+ value-format="YYYY-MM-DD"
+ />
+ </el-form-item>
+ <el-form-item label="证书附件:" prop="filePath" >
+ <el-upload
+ :disabled="title === '查看'"
+ style="width: 100%;"
+ accept=".pdf"
+ :action="state.uploadUrl"
+ :headers="state.header"
+ method="post"
+ :on-success="(res, uploadFile)=>handleAvatarSuccess(res, uploadFile)"
+ :on-exceed="showTip"
+ v-model:file-list="state.fileList"
+ :on-remove="handleRemove"
+ :limit='1'
+ :before-upload="picSize"
+ >
+ <el-button type="primary">证书上传</el-button>
+ <template #tip>
+ <div class="el-upload__tip">上传文件尺寸小于15M,最多可上传1份</div>
+ </template>
+ </el-upload>
+ </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 {reactive, ref, toRefs} from 'vue'
+import Editor from "@/components/Editor/index.vue";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {addNotice} from "@/api/backManage/notice";
+import {addDict, editDict, getDictDetail} from "@/api/backManage/evaluate";
+import {addCompany, checkName, distributeCompany, editCompany} from "@/api/onlineEducation/company";
+import {verifyPhone} from "@/utils/validate";
+import {getToken} from "@/utils/auth";
+import {addQualification, editQualification} from "@/api/companyInfo/qualifications";
+import Cookies from "js-cookie";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const state = reactive({
+ form: {
+ id: '',
+ companyId: '',
+ certificateName: '',
+ certificateNum: '',
+ effectiveTime: '',
+ filePath: '',
+ fileName: ''
+ },
+ formRules:{
+ certificateName:[{ required: true, message: '请输入取得资质证书名称', trigger: 'blur' }],
+ certificateNum:[{ required: true, message: '请输入证书编号', trigger: 'blur' }],
+ effectiveTime:[{ required: true, message: '请选择截止日期', trigger: 'blur' }],
+ filePath:[{ required: true, message: '请上传证书', trigger: 'blur' }],
+ },
+ uploadUrl: import.meta.env.VITE_APP_BASE_API + '/system/common/uploadFile',
+ header: {
+ Authorization: getToken()
+ },
+ fileList: [],
+})
+
+
+const openDialog = async (type, value) => {
+ title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+ if(type === 'edit' || type === 'review') {
+ state.form = JSON.parse(JSON.stringify(value));
+ const obj = {
+ path: state.form.filePath,
+ name: state.form.fileName
+ }
+ state.fileList.push(obj)
+ }
+ dialogVisible.value = true;
+}
+
+const onSubmit = async () => {
+ const valid = await busRef.value.validate();
+ 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 addQualification(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 editQualification(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 handleAvatarSuccess = (res,uploadFile) => {
+ if(res.code === 200){
+ state.form.filePath = state.fileList[0].response.data.path
+ state.form.fileName = state.fileList[0].response.data.originName
+ }else {
+ state.fileList = []
+ ElMessage({
+ type: 'warning',
+ message: res.message
+ })
+ }
+}
+// 上传
+const showTip =()=>{
+ ElMessage({
+ type: 'warning',
+ message: '超出文件上传数量'
+ });
+}
+
+const picSize = async (rawFile) => {
+ console.log("111",rawFile.name.length)
+ if(rawFile.name.length >100){
+ ElMessage({
+ type: 'warning',
+ message: '文件名不能超过100字'
+ });
+ return false
+ }
+ if(rawFile.size / 1024 / 1024 > 15){
+ ElMessage({
+ type: 'warning',
+ message: '文件大小不能超过15M'
+ });
+ return false
+ }
+};
+const handleRemove = async (file, uploadFiles) => {
+ state.form.filePath = ''
+ state.form.fileName = ''
+ state.fileList = []
+
+}
+const reset = () => {
+ state.form = {
+ id: '',
+ companyId: '',
+ certificateName: '',
+ certificateNum: '',
+ effectiveTime: '',
+ filePath: '',
+ fileName: ''
+ }
+ state.fileList = [];
+}
+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/build/conpanyFunctionConsult/companyInfo/qualifications/index.vue b/src/views/build/conpanyFunctionConsult/companyInfo/qualifications/index.vue
new file mode 100644
index 0000000..a12e16c
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/companyInfo/qualifications/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 v-if="!data.isAdmin">
+ <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.companyName"
+ filterable
+ remote
+ @change="selectValue"
+ reserve-keyword
+ placeholder="请输入企业名称"
+ remote-show-suffix
+ :remote-method="getCompanyList"
+ :loading="loadingCompany"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in data.companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </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">
+ <el-button
+ type="primary"
+ @click="exportData"
+ >导出</el-button>
+ </el-form-item>
+
+ </el-form>
+ </div>
+ <!-- 表格数据 -->
+ <el-table v-loading="loading" :data="dataList" :border="true" >
+ <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+ <el-table-column label="企业名称" prop="companyName" align="center" />
+ <el-table-column label="取得资质证书名称" prop="certificateName" align="center" width="130"/>
+ <el-table-column label="证书编号" prop="certificateNum" align="center" />
+ <el-table-column label="有效期" prop="effectiveTime" align="center" />
+ <el-table-column label="证书附件" align="center" >
+ <template #default="scope">
+ <el-link type="primary" @click="showFile(scope.row)">{{scope.row.fileName}}</el-link>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
+ <template #default="scope">
+ <el-button link type="primary" @click="openDialog('review',scope.row)" >查看</el-button>
+ <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>
+ <qualificationsDialog ref="noticeRef" @getList = "getList"></qualificationsDialog>
+ </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import qualificationsDialog from "./components/qualificationsDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+import {delQualification, getQualification} from "@/api/companyInfo/qualifications";
+import axios from "axios";
+import {getToken} from "@/utils/auth";
+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
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ console.log("userInfo",userInfo)
+ data.isAdmin = userInfo.userType === 0;
+ data.queryParams.companyId = userInfo.companyId
+ getList();
+});
+const getList = async () => {
+ loading.value = true;
+ const res = await getQualification(data.queryParams);
+ if(res.code === 200){
+ dataList.value = res.data.list.map(item => {
+ return{
+ ...item,
+ effectiveTime: item.effectiveTime.substring(0,10),
+ }
+ })
+ 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);
+}
+const selectValue = (val) => {
+ data.companyList.forEach(item => {
+ if(item.name === val){
+ data.queryParams.companyId = item.id
+ }
+ })
+}
+
+const getCompanyList = async (val)=>{
+ if(val != ""){
+ loadingCompany.value = true;
+ const queryParams = {
+ name: val
+ }
+ const res = await getCompany(queryParams)
+ if (res.code == 200) {
+ loadingCompany.value = false;
+ data.companyList = 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();
+}
+const exportData = () => {
+ if(data.isAdmin && !data.queryParams.companyId){
+ ElMessage.warning('管理员请先选择企业')
+ }else {
+ startGeneration()
+ }
+}
+const templatePath = '/certificateExample.docx'
+const startGeneration = async () => {
+ const data = {}
+ data.name = dataList.value[0].companyName
+ data.tableData = dataList.value
+ try {
+ generateWordDocument(templatePath, data, data.name+'_证书.docx');
+ } catch (error){
+ ElMessage({
+ type: 'warning',
+ message: '导出失败'
+ });
+ }
+
+}
+const showFile = (e) => {
+ axios.get(import.meta.env.VITE_APP_BASE_API + '/' +e.filePath,{headers:{'Content-Type': 'application/json','Authorization': `${getToken()}`},responseType: 'blob'}).then(res=>{
+ if (res) {
+ const link = document.createElement('a')
+ let blob = new Blob([res.data],{type: res.data.type})
+ link.style.display = "none";
+ link.href = URL.createObjectURL(blob); // 创建URL
+ window.open(link.href)
+ } else {
+ ElMessage({
+ type: 'warning',
+ message: '文件读取失败'
+ });
+ }
+ })
+
+}
+
+const handleSelectionChange = (val) => {
+ choosedData.value = val
+}
+const handleDelete = (val) => {
+ ElMessageBox.confirm(
+ '确定删除此条数据?',
+ '提示',
+ {
+ confirmButtonText: '确定',
+ cancelButtonText: '取消',
+ type: 'warning',
+ })
+ .then( async() => {
+ const res = await delQualification(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/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
new file mode 100644
index 0000000..e8d2b7d
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/components/objectiveDialog.vue
@@ -0,0 +1,378 @@
+<template>
+ <div class="notice">
+ <el-dialog
+ v-model="dialogVisible"
+ :title="title"
+ width="50%"
+ :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="120px" >
+ <el-row :gutter="24">
+ <el-col :span="12">
+ <el-form-item label="年份:" prop="creditCode" >
+ <el-select
+ v-model="state.form.year"
+ placeholder="请选择年份"
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in state.yearList"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="序号:" prop="creditCode" >
+ <el-input v-model="state.form.code" placeholder="请输入序号" style="width: 100%"></el-input>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="12">
+ <el-form-item label="质量目标级别:" prop="creditCode" >
+ <el-select
+ v-model="state.form.level"
+ placeholder="请选择质量目标级别"
+ style="width: 100%"
+ >
+ <el-option
+ v-for="item in state.levelList"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="公司名称:" prop="creditCode" v-if="state.form.level == 1">
+ <el-input v-model="state.form.companyName" disabled></el-input>
+ </el-form-item>
+ <el-form-item label="部门名称:" prop="creditCode" v-else-if="state.form.level == 2">
+ <el-select
+ v-model="state.form.dept"
+ placeholder="请选择部门"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in state.deptList"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item :label= "state.form.level==1 ? '公司质量目标' :state.form.level==2 ?'部门质量目标':'质量目标'" >
+ <div style="display: flex;width: 100%">
+ <el-table :data="state.form.objectList" :border="true">
+ <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+ <el-table-column label="目标" align="center" >
+ <template #default="{row,$index}">
+ <el-form-item :prop="'objectList.' + '[' + $index + ']' + '.objName'" :rules="state.rules.objName">
+ <el-input v-model.number="row.objName" placeholder="请输入质量目标"></el-input>
+ </el-form-item>
+ </template>
+ </el-table-column>
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+ <template #default="scope" >
+ <el-button link type="danger" @click="handleDelete(scope.row)" >删除</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <el-button
+ style="margin-left: 20px"
+ type="primary"
+ @click="addObject"
+ >新增</el-button>
+ </div>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="24">
+ <el-form-item label="目标测量方法:" prop="method" >
+ <el-input v-model="state.form.method" :rows="4" type="textarea" placeholder="请输入目标测量方法"/>
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24" v-if="state.form.level == 2">
+ <el-col :span="12">
+ <el-form-item label="编制:" prop="creditCode" >
+ <el-select
+ v-model="state.form.peopleName"
+ filterable
+ remote
+ @change="selectValue"
+ reserve-keyword
+ placeholder="请输入人员名称"
+ remote-show-suffix
+ :remote-method="getPeopleList"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in state.peopleList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="日期:" prop="creditCode" >
+ <el-date-picker
+ v-model="value1"
+ type="date"
+ placeholder="请选择日期"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24" >
+ <el-col :span="12">
+ <el-form-item label="质量管理部:" prop="creditCode" >
+ <el-select
+ v-model="state.form.peopleName2"
+ filterable
+ remote
+ @change="selectValue"
+ reserve-keyword
+ placeholder="请输入人员名称"
+ remote-show-suffix
+ :remote-method="getPeopleList"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in state.peopleList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="日期:" prop="creditCode" >
+ <el-date-picker
+ v-model="value1"
+ type="date"
+ placeholder="请选择日期"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ <el-row :gutter="24">
+ <el-col :span="12">
+ <el-form-item label="公司分管领导:" prop="creditCode" >
+ <el-select
+ v-model="state.form.peopleName3"
+ filterable
+ remote
+ @change="selectValue"
+ reserve-keyword
+ placeholder="请输入人员名称"
+ remote-show-suffix
+ :remote-method="getPeopleList"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in state.peopleList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+ <el-col :span="12">
+ <el-form-item label="日期:" prop="creditCode" >
+ <el-date-picker
+ v-model="value1"
+ type="date"
+ placeholder="请选择日期"
+ />
+ </el-form-item>
+ </el-col>
+ </el-row>
+ </el-form>
+ <template #footer>
+ <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 Cookies from "js-cookie";
+import {getCompany} from "@/api/onlineEducation/company";
+import {ElMessage} from "element-plus";
+import {getUser} from "@/api/onlineEducation/user";
+
+const dialogVisible = ref(false);
+const title = ref("");
+const busRef = ref();
+const length = ref()
+const emit = defineEmits(["getList"]);
+const dataRef = ref();
+const state = reactive({
+ form: {
+ id: '',
+ objectList:[],
+
+ },
+ rules: {
+ objName: [
+ {required: true, message: "质量目标不能为空", trigger: "blur"}
+ ],
+ },
+ deptList: [],
+ peopleList: [],
+ yearList: [
+ {
+ value: 1,
+ label: '2025年'
+ },
+ {
+ value: 2,
+ label: '2024年'
+ },
+ {
+ value: 3,
+ label: '2023年'
+ },
+ ],
+ levelList: [
+ {
+ value: 1,
+ label: '公司级'
+ },
+ {
+ value: 2,
+ label: '部门级'
+ },
+ ]
+})
+
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ state.form.companyName = userInfo.companyName
+ state.form.companyId = userInfo.companyId
+
+});
+const openDialog = async (type, value) => {
+ title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ;
+ if(type === 'edit' || type === 'view') {
+ state.form = JSON.parse(JSON.stringify(value));
+ }
+ dialogVisible.value = true;
+}
+const addObject = () => {
+ state.form.objectList.push({})
+}
+const onSubmit = async () => {
+ const valid = await busRef.value.validate();
+ if(valid){
+ if(title.value === '新增'){
+ console.log('sta',state.form)
+ // const {id, ...data} = JSON.parse(JSON.stringify(state.form))
+ // const res = await addCompany(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 editCompany(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 reset = () => {
+ state.form = {
+ id: '',
+
+ }
+ state.form.objectList=[]
+}
+const handleDelete = (val) => {
+ state.form.objectList = state.form.objectList.filter(item=> item != val)
+}
+const getPeopleList = async (val)=>{
+ if(val != ""){
+ const queryParams = {
+ name: val
+ }
+ const res = await getUser(queryParams)
+ if (res.code == 200) {
+ state.peopleList = res.data.list
+
+ } else {
+ ElMessage.warning(res.message)
+ }
+ }
+}
+const selectValue = (val) => {
+ state.peopleList.forEach(item => {
+ if(item.name === val){
+ state.form.peopleId = item.id
+ }
+ })
+}
+
+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/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
new file mode 100644
index 0000000..a4f69ec
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
@@ -0,0 +1,319 @@
+<template>
+ <div class="app-container">
+ <div style="margin-bottom: 10px">
+ <el-form style="display: flex;flex-wrap: wrap;">
+<!-- v-if="!data.isAdmin"-->
+ <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.companyName"
+ filterable
+ remote
+ @change="selectValue"
+ reserve-keyword
+ placeholder="请输入企业名称"
+ remote-show-suffix
+ :remote-method="getCompanyList"
+ :loading="loadingCompany"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in data.companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.name"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="年份:" style="margin-left: 20px">
+ <el-select
+ v-model="data.queryParams.year"
+ placeholder="请选择年份"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in data.yearList"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </el-select>
+ </el-form-item>
+ <el-form-item label="目标级别:" style="margin-left: 20px">
+ <el-select
+ v-model="data.queryParams.level"
+ placeholder="请选择目标级别"
+ style="width: 240px"
+ >
+ <el-option
+ v-for="item in data.levelList"
+ :key="item.value"
+ :label="item.label"
+ :value="item.value"
+ />
+ </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">
+ <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="selection" width="55" />
+ <el-table-column type="index" label="序号" width="80" align="center"></el-table-column>
+ <el-table-column label="企业名称" prop="companyName" align="center" />
+ <el-table-column label="年份" prop="year" align="center" />
+ <el-table-column label="质量目标级别" prop="level" align="center" />
+ <el-table-column label="部门名称" prop="name" align="center" />
+ <el-table-column label="质量目标" prop="name" align="center" />
+ <el-table-column label="目标测量方法" prop="name" align="center" />
+ <el-table-column label="操作" align="center" class-name="small-padding fixed-width" >
+ <template #default="scope">
+ <el-button link type="primary" @click="openDialog('review',scope.row)" >查看</el-button>
+ <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>
+ <objectiveDialog ref="noticeRef" @getList = "getList"></objectiveDialog>
+ </div>
+</template>
+
+<script setup>
+import {getCurrentInstance, onMounted, reactive, ref, toRefs} from "vue";
+import objectiveDialog from "./components/objectiveDialog.vue"
+import {ElMessage, ElMessageBox} from "element-plus";
+import {getCompany} from "@/api/onlineEducation/company";
+import Cookies from "js-cookie";
+import {generateWordDocument} from "@/utils/exportWord";
+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,
+ year: '',
+ level: ''
+ },
+ companyList: [],
+ isAdmin: false,
+ yearList: [
+ {
+ value: 1,
+ label: '2025年'
+ },
+ {
+ value: 2,
+ label: '2024年'
+ },
+ {
+ value: 3,
+ label: '2023年'
+ },
+ ],
+ levelList: [
+ {
+ value: 1,
+ label: '公司级'
+ },
+ {
+ value: 2,
+ label: '部门级'
+ },
+ ]
+});
+const dataList = ref([]);
+const total = ref(0);
+
+const { queryParams } = toRefs(data);
+
+onMounted(() => {
+ const userInfo = JSON.parse(Cookies.get('userInfo'))
+ console.log("userInfo",userInfo)
+ data.isAdmin = userInfo.userType === 0;
+ getList();
+});
+const getList = async () => {
+ dataList.value = [
+ {
+ id: 1,
+ level: 1,
+ object: 'xxxx',
+ method:'方法',
+ people2: '秦',
+ date2:'2015-8-1',
+ people3: '秦',
+ date3:'2015-8-1'
+ },
+ {
+ id: 2,
+ level: 2,
+ object: 'xxxxfg ',
+ deptName: '质量管理部',
+ method:'方法',
+ people1: '秦',
+ date1:'2015-8-1',
+ people2: '秦',
+ date2:'2015-8-1',
+ people3: '秦',
+ date3:'2015-8-1'
+ },
+ ]
+ // loading.value = true;
+ // const res = await getCom(data.queryParams);
+ // if(res.code === 200){
+ // dataList.value = res.data.list
+ // 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);
+}
+const selectValue = (val) => {
+ data.companyList.forEach(item => {
+ if(item.name === val){
+ data.queryParams.companyId = item.id
+ }
+ })
+}
+
+const getCompanyList = async (val)=>{
+ if(val != ""){
+ loadingCompany.value = true;
+ const queryParams = {
+ name: val
+ }
+ const res = await getCompany(queryParams)
+ if (res.code == 200) {
+ loadingCompany.value = false;
+ data.companyList = 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();
+}
+const exportData = () => {
+ if(choosedData.value && choosedData.value.length === 0){
+ ElMessage.warning('请选择需要导出的数据')
+ }else {
+ startGeneration()
+ }
+}
+const templatePath = ref('')
+const startGeneration = async () => {
+ choosedData.value.forEach(item => {
+ if(item.level == 1){
+ templatePath.value = '/objectCompanyExample.docx'
+ }else {
+ templatePath.value = '/objectDeptExample.docx'
+ }
+ const now = new Date()
+ const year = now.getFullYear()
+ const month = (now.getMonth() +1).toString().padStart(2, '0');
+ item.nowDate = year + '-' + month
+ try {
+ generateWordDocument(templatePath.value, item, '质量目标.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 delNotice(val);
+ // 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/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue
new file mode 100644
index 0000000..762e8b7
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/reportsituation/index.vue
@@ -0,0 +1,11 @@
+<script setup>
+
+</script>
+
+<template>
+
+</template>
+
+<style scoped lang="scss">
+
+</style>
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue
new file mode 100644
index 0000000..762e8b7
--- /dev/null
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/table/index.vue
@@ -0,0 +1,11 @@
+<script setup>
+
+</script>
+
+<template>
+
+</template>
+
+<style scoped lang="scss">
+
+</style>
diff --git a/src/views/homePage.vue b/src/views/homePage.vue
index f70c6c5..d7d488d 100644
--- a/src/views/homePage.vue
+++ b/src/views/homePage.vue
@@ -1,7 +1,7 @@
<template>
<el-row class="login-panel">
<el-col :sm="24" :md="12" class="login-img">
- 多体系<br/>建设信息化条统
+ 多体系<br/>建设信息化系统
</el-col>
<el-col :sm="24" :md="12" class="login-box">
<div class="login-card">
diff --git a/src/views/system/role/index.vue b/src/views/system/role/index.vue
index 7b2decd..d2303c9 100644
--- a/src/views/system/role/index.vue
+++ b/src/views/system/role/index.vue
@@ -124,9 +124,9 @@
<!-- <el-tooltip content="数据权限" placement="top" v-if="scope.row.roleId !== 1">-->
<!-- <el-button link type="primary" icon="CircleCheck" @click="handleDataScope(scope.row)" v-hasPermi="['system:role:edit']"></el-button>-->
<!-- </el-tooltip>-->
- <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">
- <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button>
- </el-tooltip>
+<!-- <el-tooltip content="分配用户" placement="top" v-if="scope.row.roleId !== 1">-->
+<!-- <el-button link type="primary" icon="User" @click="handleAuthUser(scope.row)" v-hasPermi="['system:role:edit']"></el-button>-->
+<!-- </el-tooltip>-->
</template>
</el-table-column>
</el-table>
--
Gitblit v1.9.2