From b682247f969a322949ed59ca698d5162e6dfdfa7 Mon Sep 17 00:00:00 2001
From: 祖安之光 <11848914+light-of-zuan@user.noreply.gitee.com>
Date: Tue, 28 Apr 2026 16:07:40 +0800
Subject: [PATCH] 新增数据复制
---
src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue | 569 +++++++++++++++++++++++++++++++++-----------------------
1 files changed, 337 insertions(+), 232 deletions(-)
diff --git a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
index befb6c8..d10b04a 100644
--- a/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
+++ b/src/views/build/conpanyFunctionConsult/qualityObjectives/objective/index.vue
@@ -1,347 +1,452 @@
<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',{})"
- v-hasPermi="['qualityGoal:list: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" placeholder="请选择" filterable 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 label="年份:" style="margin-left: 20px">
-<!-- <el-input v-model="data.queryParams.year" placeholder="请输入年份"></el-input>-->
- <el-select
- v-model="data.queryParams.year"
- placeholder="请选择年份"
- style="width: 240px"
- filterable
- allow-create
- default-first-option
- :reserve-keyword="false"
- @change="handleChangeNum"
+ <el-form style="display: flex; flex-wrap: wrap">
+ <el-form-item>
+ <el-button
+ type="primary"
+ plain
+ icon="Plus"
+ @click="openDialog('add', {})"
+ v-hasPermi="['qualityGoal:list: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"
+ placeholder="请选择"
+ filterable
+ clearable
+ >
+ <el-option
+ v-for="item in data.companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
>
- <el-option
- v-for="item in data.yearList"
- :key="item.value"
- :label="item.label"
- :value="item.label"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="目标级别:" style="margin-left: 20px">
- <el-select
- v-model="data.queryParams.type"
- 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>
- <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-option>
+ </el-select>
+ </el-form-item>
+ <el-form-item label="年份:" style="margin-left: 20px">
+ <!-- <el-input v-model="data.queryParams.year" placeholder="请输入年份"></el-input>-->
+ <el-date-picker
+ v-model="data.queryParams.year"
+ type="year"
+ value-format="YYYY"
+ placeholder="请选择年份"
+ style="width: 240px"
+ />
+ </el-form-item>
+ <el-form-item label="目标级别:" style="margin-left: 20px">
+ <el-select
+ v-model="data.queryParams.type"
+ 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>
+ <el-button
+ type="primary"
+ style="margin-left: 30px"
+ @click="searchClick"
+ >查询</el-button
+ >
+ <el-button plain @click="reset">重置</el-button>
+ <el-button type="primary" plain @click="copyMenu"
+ >复制</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
+ 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="type" align="center" >
+ <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="type" align="center">
<template #default="scope">
- {{scope.row.type == 1 ? '公司级' : '部门级'}}
+ {{ scope.row.type == 1 ? "公司级" : "部门级" }}
</template>
</el-table-column>
- <el-table-column label="部门名称" prop="name" align="center" >
+ <el-table-column label="部门名称" prop="name" align="center">
<template #default="scope">
- <div v-if="scope.row.type == 1">{{scope.row.companyName}}</div>
- <div v-else>{{scope.row.departName}}</div>
+ <div v-if="scope.row.type == 1">{{ scope.row.companyName }}</div>
+ <div v-else>{{ scope.row.departName }}</div>
</template>
</el-table-column>
<el-table-column label="质量目标" prop="name" align="center">
<template #default="scope">
- <div v-for="(item,index) in scope.row.qualityTargets">
- <span>{{index + 1}}、{{item.message}}</span>
+ <div v-for="(item, index) in scope.row.qualityTargets">
+ <span>{{ index + 1 }}、{{ item.message }}</span>
</div>
</template>
</el-table-column>
- <el-table-column label="目标测量方法" prop="method" align="center" />
- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160" >
+ <el-table-column label="目标测量方法" prop="method" align="center" />
+ <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)" v-hasPermi="['qualityGoal:list:edit']">编辑</el-button>
- <el-button link type="danger" @click="handleDelete(scope.row)" v-hasPermi="['qualityGoal:list:del']">删除</el-button>
+ <el-button
+ link
+ type="primary"
+ @click="openDialog('review', scope.row)"
+ >查看</el-button
+ >
+ <el-button
+ link
+ type="primary"
+ @click="openDialog('edit', scope.row)"
+ v-hasPermi="['qualityGoal:list:edit']"
+ >编辑</el-button
+ >
+ <el-button
+ link
+ type="danger"
+ @click="handleDelete(scope.row)"
+ v-hasPermi="['qualityGoal:list:del']"
+ >删除</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"
+ 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>
+ <objectiveDialog ref="noticeRef" @getList="getList"></objectiveDialog>
+ <el-dialog
+ v-model="copyVisible"
+ width="500px"
+ :before-close="handleClose"
+ :close-on-press-escape="false"
+ :close-on-click-modal="false"
+ >
+ <span v-if="isAdmin" style="display: block; margin-bottom: 8px">单位名称:</span>
+ <el-select
+ v-model="chooseCompanyId"
+ v-if="isAdmin"
+ placeholder="请选择单位"
+ filterable
+ clearable
+ style="width: 100%; margin-bottom: 15px"
+ >
+ <el-option
+ v-for="item in companyList"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ >
+ </el-option>
+ </el-select>
+ <span style="display: block; margin-bottom: 8px">将以下年份数据</span>
+ <el-date-picker
+ v-model="queryParams.year"
+ type="year"
+ value-format="YYYY"
+ placeholder="请选择年份"
+ style="width: 100%; margin-bottom: 15px"
+ disabled
+ />
+ <span style="display: block; margin-bottom: 8px">复制到:</span>
+ <el-date-picker
+ v-model="chooseYear"
+ type="year"
+ value-format="YYYY"
+ placeholder="请选择年份"
+ style="width: 100%; margin-bottom: 15px"
+ />
+
+ <div class="dialog-footer" style="display: flex; justify-content: right">
+ <el-button @click="handleClose" size="default">取 消</el-button>
+ <el-button
+ type="primary"
+ @click="onSubmitCopy"
+ size="default"
+ v-preReClick
+ >确认</el-button
+ >
+ </div>
+ </el-dialog>
</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 { 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";
-import {delObject, getObjectPage} from "@/api/qualityObjectives/object";
+import { generateWordDocument } from "@/utils/exportWord";
+import { delObject, getObjectPage, copyObject } from "@/api/qualityObjectives/object";
const { proxy } = getCurrentInstance();
const loading = ref(false);
const noticeRef = ref();
-const loadingCompany = ref(false)
-const choosedData = ref([])
+const loadingCompany = ref(false);
+const choosedData = ref([]);
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 10,
companyId: null,
- year: '',
- type: ''
+ year: "",
+ type: "",
},
companyList: [],
isAdmin: false,
- yearList: [
- {
- value: 1,
- label: '2025'
- },
- {
- value: 2,
- label: '2024'
- },
- {
- value: 3,
- label: '2023'
- },
- {
- value: 4,
- label: '2022'
- },
- {
- value: 5,
- label: '2021'
- },
- ],
levelList: [
{
value: 1,
- label: '公司级'
+ label: "公司级",
},
{
value: 2,
- label: '部门级'
+ label: "部门级",
},
- ]
+ ],
+ copyVisible: false,
+ chooseCompanyId: null,
+ chooseYear: null,
});
const dataList = ref([]);
const total = ref(0);
-const { queryParams } = toRefs(data);
+const { queryParams, isAdmin, copyVisible, chooseCompanyId, chooseYear, companyList } = toRefs(data);
onMounted(() => {
- const userInfo = JSON.parse(Cookies.get('userInfo'))
- console.log("userInfo",userInfo)
+ const userInfo = JSON.parse(Cookies.get("userInfo"));
data.isAdmin = userInfo.userType === 0;
- if(data.isAdmin){
+ if (data.isAdmin) {
data.queryParams.companyId = null
- }else {
+ } else {
data.queryParams.companyId = userInfo.companyId
+ data.chooseCompanyId = userInfo.companyId
}
getList();
- if(data.isAdmin){
- getCompanyList()
+ if (data.isAdmin) {
+ getCompanyList();
}
});
+
+const copyMenu = () => {
+ if (!data.queryParams.year) {
+ ElMessage.warning("请先选择要复制的年份");
+ return;
+ }
+ data.copyVisible = true;
+};
+
+const handleClose = () => {
+ data.chooseCompanyId = null
+ data.chooseYear = null
+ data.copyVisible = false
+};
+
+const onSubmitCopy = async () => {
+ if (data.isAdmin && !data.chooseCompanyId) {
+ ElMessage.warning("请先选择单位");
+ return;
+ }
+ if (!data.chooseYear) {
+ ElMessage.warning("请选择目标年份");
+ return;
+ }
+ ElMessageBox.confirm("该操作将覆盖目标年份的数据,是否继续?", "提示", {
+ confirmButtonText: "确定",
+ cancelButtonText: "取消",
+ type: "warning",
+ })
+ .then(async () => {
+ const p = {
+ companyId: data.chooseCompanyId,
+ sourceYear: data.queryParams.year,
+ targetYear: data.chooseYear
+ };
+ const r = await copyObject(p);
+ if (r.code === 200) {
+ ElMessage.success(r.message);
+ await handleClose();
+ await getList();
+ } else {
+ ElMessage.warning(r.message);
+ }
+ })
+ .catch((err) => {});
+};
+
const getList = async () => {
loading.value = true;
const res = await getObjectPage(data.queryParams);
- if(res.code === 200){
- dataList.value = res.data.list
- total.value = res.data.total
- }else{
- ElMessage.warning(res.message)
+ 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,data.companyList);
-}
+ noticeRef.value.openDialog(type, value, data.companyList);
+};
const selectValue = (val) => {
- data.companyList.forEach(item => {
- if(item.name === val){
- data.queryParams.companyId = item.id
+ data.companyList.forEach((item) => {
+ if (item.name === val) {
+ data.queryParams.companyId = item.id;
}
- })
-}
+ });
+};
-const getCompanyList = async ()=>{
+const getCompanyList = async () => {
const queryParams = {
pageNum: 1,
- pageSize: 999
- }
- const res = await getCompany(queryParams)
+ pageSize: 999,
+ };
+ const res = await getCompany(queryParams);
if (res.code == 200) {
- data.companyList = res.data.list?res.data.list:[]
+ data.companyList = res.data.list ? res.data.list : [];
// data.queryParams.companyId = data.companyList[0].id
} else {
- ElMessage.warning(res.message)
+ ElMessage.warning(res.message);
}
-}
+};
const handleSizeChange = (val) => {
- data.queryParams.pageSize = val
- getList()
-}
+ data.queryParams.pageSize = val;
+ getList();
+};
const handleCurrentChange = (val) => {
- data.queryParams.pageNum = val
- getList()
-}
+ data.queryParams.pageNum = val;
+ getList();
+};
/** 重置新增的表单以及其他数据 */
function reset() {
- if(data.isAdmin){
+ if (data.isAdmin) {
data.queryParams = {
- companyId: '',
+ companyId: "",
pageNum: 1,
pageSize: 10,
- year: '',
- type: ''
- }
- choosedData.value = []
+ year: "",
+ type: "",
+ };
+ choosedData.value = [];
data.companyList = [];
- getCompanyList()
- }else {
+ getCompanyList();
+ } else {
data.queryParams = {
companyId: data.queryParams.companyId,
pageNum: 1,
pageSize: 10,
- year: '',
- type: ''
- }
+ year: "",
+ type: "",
+ };
}
getList();
-
}
const exportData = () => {
- if(choosedData.value && choosedData.value.length === 0){
- ElMessage.warning('请选择需要导出的数据')
- }else {
- startGeneration()
+ if (choosedData.value && choosedData.value.length === 0) {
+ ElMessage.warning("请选择需要导出的数据");
+ } else {
+ startGeneration();
}
-}
-const templatePath = ref('')
+};
+const templatePath = ref("");
const startGeneration = async () => {
- let name = ''
- choosedData.value.forEach(item => {
- console.log('111',item)
- name = ''
- item.message = ''
- if(item.type == 1){
- templatePath.value = '/objectCompanyExample.docx'
- name = item.companyName
- }else {
- templatePath.value = '/objectDeptExample.docx'
- name = item.departName
+ let name = "";
+ choosedData.value.forEach((item) => {
+ console.log("111", item);
+ name = "";
+ item.message = "";
+ if (item.type == 1) {
+ templatePath.value = "/objectCompanyExample.docx";
+ name = item.companyName;
+ } else {
+ templatePath.value = "/objectDeptExample.docx";
+ name = item.departName;
}
- const now = new Date()
- const year = now.getFullYear()
- const month = (now.getMonth() +1).toString().padStart(2, '0');
- item.nowDate = year + '-' + month
- item.qualityTargets.forEach((i,index) => {
- item.message += index+1 +'、' + i.message + '\n'
- })
+ const now = new Date();
+ const year = now.getFullYear();
+ const month = (now.getMonth() + 1).toString().padStart(2, "0");
+ item.nowDate = year + "-" + month;
+ item.qualityTargets.forEach((i, index) => {
+ item.message += index + 1 + "、" + i.message + "\n";
+ });
try {
- generateWordDocument(templatePath.value, item, name+'_质量目标.docx');
- } catch (error){
+ generateWordDocument(templatePath.value, item, name + "_质量目标.docx");
+ } catch (error) {
ElMessage({
- type: 'warning',
- message: '导出失败'
+ type: "warning",
+ message: "导出失败",
});
}
- })
-}
+ });
+};
const handleSelectionChange = (val) => {
- choosedData.value = val
-}
+ choosedData.value = val;
+};
const handleDelete = (val) => {
- ElMessageBox.confirm(
- '确定删除此条数据?',
- '提示',
- {
- confirmButtonText: '确定',
- cancelButtonText: '取消',
- type: 'warning',
- })
- .then( async() => {
- const res = await delObject(val.id);
- if(res.code === 200){
- ElMessage({
- type: 'success',
- message: '删除成功'
- });
- getList();
- }else{
- ElMessage.warning(res.message)
- }
- })
-}
-const handleChangeNum = (value) => {
- if (!/^\d+$/.test(value)) { // 验证是否为数字
- ElMessage.warning('只能输入数字')
- data.queryParams.year = '' // 重置选择,避免非法值被添加到options中
- } else if (!data.yearList.some(option => option.label == value)) { // 确保不是已存在的选项
- data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同)
- }
-}
+ ElMessageBox.confirm("确定删除此条数据?", "提示", {
+ confirmButtonText: "确定",
+ cancelButtonText: "取消",
+ type: "warning",
+ }).then(async () => {
+ const res = await delObject(val.id);
+ if (res.code === 200) {
+ ElMessage({
+ type: "success",
+ message: "删除成功",
+ });
+ getList();
+ } else {
+ ElMessage.warning(res.message);
+ }
+ });
+};
+
</script>
<style lang="scss">
-.pag-container{
+.pag-container {
float: right;
margin-top: 10px;
}
--
Gitblit v1.9.2