7 files modified
2 files added
| New file |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | export function getInside(params) { |
| | | return request({ |
| | | url: '/continuous/inside/list', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | |
| | | export function addInside(data) { |
| | | return request({ |
| | | url: '/continuous/inside/insert', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function editInside(params) { |
| | | return request({ |
| | | url: `/continuous/inside/update`, |
| | | method: 'post', |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | export function delInside(data) { |
| | | return request({ |
| | | url: `/continuous/inside/deleted?improveId=${data}`, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| New file |
| | |
| | | import request from "@/utils/request"; |
| | | |
| | | export function getEconomy(params) { |
| | | return request({ |
| | | url: '/quality/economy/list', |
| | | method: 'get', |
| | | params: params |
| | | }) |
| | | } |
| | | |
| | | |
| | | export function addEconomy(data) { |
| | | return request({ |
| | | url: '/quality/economy/insert', |
| | | method: 'post', |
| | | data: data |
| | | }) |
| | | } |
| | | |
| | | export function editEconomy(params) { |
| | | return request({ |
| | | url: `/quality/economy/update`, |
| | | method: 'post', |
| | | data: params |
| | | }) |
| | | } |
| | | |
| | | export function delEconomy(data) { |
| | | return request({ |
| | | url: `/quality/economy/deleted?economyId=${data}`, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | |
| | |
| | | <!-- 表格数据 --> |
| | | <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="companySummary" align="center" > |
| | | <template #default="scope"> |
| | | <div v-html="scope.row.companySummary" ></div> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="营业执照" prop="fileName" align="center" > |
| | | <template #default="scope"> |
| | | <el-link style="" type="primary" @click="openFile(scope.row.filePath,scope.row.fileName)">{{scope.row.fileName}}</el-link> |
| | |
| | | <!-- 表格数据 --> |
| | | <el-table v-loading="loading" :data="dataList" :border="true"> |
| | | <el-table-column label="序号" type="index" align="center" width="80" /> |
| | | <el-table-column label="企业名称" prop="companyName" align="center" /> |
| | | <el-table-column label="员工情况介绍" prop="companyRoster" align="center" > |
| | | <template #default="scope"> |
| | | <div v-html="scope.row.companyRoster" ></div> |
| | | </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('view',scope.row)">查看</el-button> |
| | |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="一 、基本情况:" prop="method" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/> |
| | | <el-form-item label="一 、基本情况:" prop="basic" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.basic" :rows="4" type="textarea" placeholder=""/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="二 、综合分析:" v-if="showEditor" required> |
| | | <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.form.policy" ></t-editor> |
| | | <el-form-item label="二 、综合分析:" v-if="showEditor" required prop="synthesize"> |
| | | <t-editor style="width: 800px" ref="myEditor" :toolbar="toolbar" :value="state.form.synthesize" ></t-editor> |
| | | </el-form-item> |
| | | <el-form-item label="二 、综合分析:" v-else> |
| | | <el-form-item label="二 、综合分析:" v-else prop="synthesize"> |
| | | <div class="ql-container ql-snow" style="height: 500px;width: 100%;margin-top: 10px;" > |
| | | <div class="ql-editor"> |
| | | <div class="reviewTable" v-html="state.form.policy" @click="showFile($event)"></div> |
| | | <div class="reviewTable" :disabled="title === '查看'" v-html="state.form.synthesize" ></div> |
| | | </div> |
| | | </div> |
| | | </el-form-item> |
| | |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="三 、内外部损失:" prop="method" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/> |
| | | <el-form-item label="三 、内外部损失:" prop="damage" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.damage" :rows="4" type="textarea" placeholder=""/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="四 、纠正措施:" prop="method" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/> |
| | | <el-form-item label="四 、纠正措施:" prop="measure" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.measure" :rows="4" type="textarea" placeholder=""/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="五 、分析的结果:" prop="method" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/> |
| | | <el-form-item label="五 、分析的结果:" prop="analysis" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.analysis" :rows="4" type="textarea" placeholder=""/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="六 、改进建议:" prop="method" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.method" :rows="4" type="textarea" placeholder=""/> |
| | | <el-form-item label="六 、改进建议:" prop="suggest" > |
| | | <el-input :disabled="title === '查看'" v-model="state.form.suggest" :rows="4" type="textarea" placeholder=""/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="部门:" prop="leadId" > |
| | | <el-select clearable v-model="state.form.leadId" :disabled="title =='查看'" filterable style="width: 100%"> |
| | | <el-form-item label="部门:" prop="dutyId" > |
| | | <el-select clearable v-model="state.form.dutyId" :disabled="title =='查看'" filterable style="width: 100%"> |
| | | <el-option |
| | | v-for="item in state.userList" |
| | | :key="item.id" |
| | | :label="item.name" |
| | | :value="item.id" |
| | | v-for="item in state.deptList" |
| | | :key="item.deptId" |
| | | :label="item.deptName" |
| | | :value="item.deptId" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="日期:" prop="leadTime" > |
| | | <el-form-item label="日期:" prop="dutyTime" > |
| | | <el-date-picker |
| | | :disabled="title === '查看'" |
| | | v-model="state.form.leadTime" |
| | | v-model="state.form.dutyTime" |
| | | type="date" |
| | | placeholder="请选择日期" |
| | | value-format="YYYY-MM-DD" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | import TEditor from "@/components/Tinymce/Tinymce.vue"; |
| | | import axios from "axios"; |
| | | import {getToken} from "@/utils/auth"; |
| | | import {addEconomy, editEconomy} from "@/api/qualityFinancialAnalysis"; |
| | | |
| | | const dialogVisible = ref(false); |
| | | const title = ref(""); |
| | |
| | | const state = reactive({ |
| | | form: { |
| | | id: '', |
| | | year: '', |
| | | num: '', |
| | | type: '', |
| | | departId: '', |
| | | method: '', |
| | | compilationId:'', |
| | | compilationTime:'', |
| | | qualityId: '', |
| | | qualityTime:'', |
| | | leadId:'', |
| | | leadTime: '', |
| | | qualityTargets:[], |
| | | |
| | | companyId: null, |
| | | year: "", |
| | | basic: "", |
| | | synthesize: "", |
| | | damage: "", |
| | | measure: "", |
| | | analysis: "", |
| | | suggest: "", |
| | | dutyId: null, |
| | | dutyTime: "" |
| | | }, |
| | | rules: { |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | year: [{ required: true, message: '请输入年份', trigger: 'blur' }], |
| | | num: [{ required: true, message: '请输入序号', trigger: 'blur' }], |
| | | type: [{ required: true, message: '请选择级别', trigger: 'blur' }], |
| | | method: [{ required: true, message: '请输入目标测量方法', trigger: 'blur' }], |
| | | compilationId: [{ required: true, message: '请选择编制人员', trigger: 'blur' }], |
| | | compilationTime: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | qualityId: [{ required: true, message: '请选择质量管理部人员', trigger: 'blur' }], |
| | | qualityTime: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | leadId: [{ required: true, message: '请选择公司分管领导', trigger: 'blur' }], |
| | | leadTime: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | departId: [{ required: true, message: '请选择部门', trigger: 'blur' }], |
| | | objName: [{required: true, message: "质量目标不能为空", trigger: "blur"}], |
| | | basic: [{ required: true, message: '请输入基本情况', trigger: 'blur' }], |
| | | synthesize: [{ required: true, message: '请输入综合分析', trigger: 'blur' }], |
| | | damage: [{ required: true, message: '请输入内外部损失', trigger: 'blur' }], |
| | | measure: [{ required: true, message: '请输入纠正措施', trigger: 'blur' }], |
| | | analysis: [{ required: true, message: '请输入分析结果', trigger: 'blur' }], |
| | | suggest: [{ required: true, message: '请输入改进建议', trigger: 'blur' }], |
| | | dutyId: [{ required: true, message: '请选择部门', trigger: 'blur' }], |
| | | dutyTime: [{ required: true, message: '请选择日期', trigger: 'blur' }], |
| | | }, |
| | | isAdmin: false, |
| | | companyList: [], |
| | |
| | | label: '2021' |
| | | }, |
| | | ], |
| | | levelList: [ |
| | | { |
| | | value: 1, |
| | | label: '公司级' |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: '部门级' |
| | | }, |
| | | ] |
| | | }) |
| | | |
| | | const openDialog = async (type, value,companyList) => { |
| | |
| | | title.value = type === 'add' ? '新增' : type ==='edit' ? '编辑' : '查看' ; |
| | | if(type === 'edit' || type === 'review') { |
| | | state.form = JSON.parse(JSON.stringify(value)); |
| | | state.form.compilationBy = state.form.compilationId |
| | | state.form.leadBy = state.form.leadId |
| | | state.form.qualityBy = state.form.qualityId |
| | | |
| | | if(state.isAdmin){ |
| | | state.form.companyId = value.companyId |
| | | state.form.companyName = value.companyName |
| | |
| | | showEditor.value = true; |
| | | } |
| | | await getDeptList() |
| | | await getPeopleList() |
| | | // await getPeopleList() |
| | | dialogVisible.value = true; |
| | | } |
| | | const addObject = () => { |
| | | state.form.qualityTargets.push({}) |
| | | } |
| | | const getDeptList = async () => { |
| | | if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){ |
| | | return |
| | | } |
| | | const param = { |
| | | pageNum: 1, |
| | | pageSize: 999, |
| | |
| | | } |
| | | } |
| | | const onSubmit = async () => { |
| | | state.form.policy = tinyMCE.activeEditor.getContent(); |
| | | console.log('1',state.form.policy) |
| | | state.form.synthesize = tinyMCE.activeEditor.getContent(); |
| | | console.log('1',state.form.synthesize) |
| | | 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 addObjective(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)) |
| | | // if(data.qualityTargets && data.qualityTargets.length == 0){ |
| | | // ElMessage.warning('请填写质量目标') |
| | | // return |
| | | // } |
| | | // const res = await editObject(data) |
| | | // if(res.code === 200){ |
| | | // ElMessage({ |
| | | // type: 'success', |
| | | // message: '编辑成功' |
| | | // }); |
| | | // }else{ |
| | | // ElMessage.warning(res.message) |
| | | // } |
| | | // emit("getList") |
| | | // busRef.value.clearValidate(); |
| | | // reset(); |
| | | // dialogVisible.value = false; |
| | | // } |
| | | if(title.value === '新增'){ |
| | | console.log('sta',state.form) |
| | | const {id, ...data} = JSON.parse(JSON.stringify(state.form)) |
| | | const res = await addEconomy(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 editEconomy(data) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | | message: '编辑成功' |
| | | }); |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | emit("getList") |
| | | busRef.value.clearValidate(); |
| | | reset(); |
| | | dialogVisible.value = false; |
| | | } |
| | | } |
| | | } |
| | | |
| | |
| | | const reset = () => { |
| | | state.form = { |
| | | id: '', |
| | | year: '', |
| | | num: '', |
| | | type: '', |
| | | departId: '', |
| | | method: '', |
| | | compilationBy:'', |
| | | compilationTime:'', |
| | | qualityBy: '', |
| | | qualityTime:'', |
| | | leadBy:'', |
| | | leadTime: '', |
| | | qualityTargets:[], |
| | | companyId: null, |
| | | year: "", |
| | | basic: "", |
| | | synthesize: "", |
| | | damage: "", |
| | | measure: "", |
| | | analysis: "", |
| | | suggest: "", |
| | | dutyId: null, |
| | | dutyTime: "" |
| | | } |
| | | state.peopleList = [] |
| | | state.companyList = [] |
| | | |
| | | } |
| | | const handleDelete = (val) => { |
| | | state.form.qualityTargets = state.form.qualityTargets.filter(item=> item != val) |
| | | } |
| | | |
| | | const getPeopleList = async ()=> { |
| | | if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){ |
| | | return |
| | | } |
| | | const queryParams = { |
| | | pageNum: 1, |
| | | pageSize: 9999, |
| | | companyId: state.form.companyId |
| | | } |
| | | const res = await getUser(queryParams) |
| | | if(res.code == 200){ |
| | | state.userList = res.data.list?res.data.list:[] |
| | | }else{ |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }; |
| | | |
| | | |
| | | const selectValue = (val) => { |
| | | state.peopleList.forEach(item => { |
| | | if(item.name === val){ |
| | | state.form.compilationBy = item.id |
| | | } |
| | | }) |
| | | } |
| | | // const getPeopleList = async ()=> { |
| | | // if(state.isAdmin && (state.form.companyId == 0 || state.form.companyId == null)){ |
| | | // return |
| | | // } |
| | | // const queryParams = { |
| | | // pageNum: 1, |
| | | // pageSize: 9999, |
| | | // companyId: state.form.companyId |
| | | // } |
| | | // const res = await getUser(queryParams) |
| | | // if(res.code == 200){ |
| | | // state.userList = res.data.list?res.data.list:[] |
| | | // }else{ |
| | | // ElMessage.warning(res.message) |
| | | // } |
| | | // }; |
| | | |
| | | const handleChangeNum = (value) => { |
| | | if (!/^\d+$/.test(value)) { // 验证是否为数字 |
| | |
| | | } |
| | | } |
| | | const selectValueCom = (val) => { |
| | | state.form.leadId = null |
| | | state.form.qualityId = null |
| | | state.form.compilationId = null |
| | | state.form.leadName = null |
| | | state.form.qualityName = null |
| | | state.form.compilationName = null |
| | | state.form.departId = null |
| | | state.form.dutyId = null |
| | | state.companyList.forEach(item => { |
| | | if(item.id === val){ |
| | | state.form.companyName = item.name |
| | | } |
| | | }) |
| | | getDeptList() |
| | | getPeopleList() |
| | | // getPeopleList() |
| | | } |
| | | const changeLevel = () => { |
| | | // state.form.companyName = '' |
| | | state.form.departId = null |
| | | } |
| | | const getCompanyList = async (val)=>{ |
| | | if(val){ |
| | | const queryParams = { |
| | | name: val |
| | | } |
| | | const res = await getCompany(queryParams) |
| | | if (res.code == 200) { |
| | | state.companyList = res.data.list |
| | | |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | | }else { |
| | | const queryParams = { |
| | | pageSize: 999, |
| | | pageNum: 1, |
| | | } |
| | | const res = await getCompany(queryParams) |
| | | if (res.code == 200) { |
| | | state.companyList = res.data.list |
| | | } else { |
| | | ElMessage.warning(res.message) |
| | | } |
| | | } |
| | | } |
| | | 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(); |
| | | }) |
| | | } |
| | | } |
| | | |
| | | defineExpose({ |
| | | openDialog |
| | | }); |
| | |
| | | <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" v-if="data.isAdmin" /> |
| | | <el-table-column label="名称" prop="year" align="center" > |
| | | <template #default="scope"> |
| | | <span>年质量经济性分析报告</span> |
| | | <span>{{scope.row.year}}年质量经济性分析报告</span> |
| | | </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" > |
| | | <template #default="scope"> |
| | | <el-button link type="primary" @click="openDialog('review',scope.row)" >查看</el-button> |
| | |
| | | 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 { Document, Paragraph, TextRun, Table, TableRow, TableCell,BorderStyle , Packer, AlignmentType, HeadingLevel } from "docx"; |
| | | import { saveAs } from "file-saver"; |
| | | import {delEconomy, getEconomy} from "@/api/qualityFinancialAnalysis"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const loading = ref(false); |
| | | const noticeRef = ref(); |
| | |
| | | label: '2021' |
| | | }, |
| | | ], |
| | | levelList: [ |
| | | { |
| | | value: 1, |
| | | label: '公司级' |
| | | }, |
| | | { |
| | | value: 2, |
| | | label: '部门级' |
| | | }, |
| | | ] |
| | | }); |
| | | const dataList = ref([]); |
| | | const total = ref(0); |
| | |
| | | } |
| | | }); |
| | | 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) |
| | | // } |
| | | // loading.value = false; |
| | | dataList.value = [{}] |
| | | |
| | | loading.value = true; |
| | | const res = await getEconomy(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 = () => { |
| | |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delObject(val.id); |
| | | const res = await delEconomy(val.id); |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | |
| | | `; |
| | | // 3. 创建完整报告文档 |
| | | async function createQualityEconomicReport(data) { |
| | | data = { |
| | | time: 'xx', |
| | | basicInfo: 'x' |
| | | } |
| | | |
| | | const doc = new Document({ |
| | | sections: [{ |
| | | properties: {}, |
| | |
| | | spacing: { after: 300 } |
| | | }), |
| | | |
| | | // 报告时间范围 |
| | | new Paragraph({ |
| | | text: data.time, |
| | | alignment: AlignmentType.CENTER, |
| | | indent: { left: 3700 }, |
| | | spacing: { after: 500 } |
| | | }), |
| | | // // 报告时间范围 |
| | | // new Paragraph({ |
| | | // text: data.dutyTime, |
| | | // alignment: AlignmentType.CENTER, |
| | | // indent: { left: 3700 }, |
| | | // spacing: { after: 500 } |
| | | // }), |
| | | |
| | | // 1. 基本情况 |
| | | new Paragraph({ |
| | |
| | | new Paragraph({ |
| | | children: [ |
| | | new TextRun({ |
| | | text: data.basicInfo, // 替换为实际内容 |
| | | text: data.basic, // 替换为实际内容 |
| | | font: "宋体", // 与标题一致 |
| | | size: 20, // 小四号(20 half-points) |
| | | bold: false, // 常规 |
| | |
| | | spacing: { after: 100 } |
| | | }), |
| | | // 二、综合分析内容 |
| | | ...convertHtmlToDocx(data.sampleTableHTML), |
| | | ...convertHtmlToDocx(data.synthesize), |
| | | new Paragraph({ |
| | | children: [ |
| | | ], |
| | |
| | | new Paragraph({ |
| | | children: [ |
| | | new TextRun({ |
| | | text: data.lose, // 替换为实际内容 |
| | | text: data.damage, // 替换为实际内容 |
| | | font: "宋体", // 与标题一致 |
| | | size: 20, // 小四号(20 half-points) |
| | | bold: false, // 常规 |
| | |
| | | new Paragraph({ |
| | | children: [ |
| | | new TextRun({ |
| | | text: data.action, // 替换为实际内容 |
| | | text: data.measure, // 替换为实际内容 |
| | | font: "宋体", // 与标题一致 |
| | | size: 20, // 小四号(20 half-points) |
| | | bold: false, // 常规 |
| | | color: "000000" // 纯黑 |
| | | }) |
| | | ], |
| | | alignment: AlignmentType.LEFT, |
| | | spacing: { after: 300 } // 和下一段的间距 |
| | | }), |
| | | //五、分析结果 |
| | | new Paragraph({ |
| | | children: [ |
| | | new TextRun({ |
| | | text: "六、分析结果", |
| | | font: "宋体", |
| | | size: 22, |
| | | bold: true, |
| | | color: "000000" |
| | | }) |
| | | ], |
| | | heading: HeadingLevel.HEADING_1, |
| | | alignment: AlignmentType.LEFT, |
| | | spacing: { after: 100 } |
| | | }), |
| | | //分析结果内容 |
| | | new Paragraph({ |
| | | children: [ |
| | | new TextRun({ |
| | | text: data.suggest, // 替换为实际内容 |
| | | font: "宋体", // 与标题一致 |
| | | size: 20, // 小四号(20 half-points) |
| | | bold: false, // 常规 |
| | |
| | | new Paragraph({ |
| | | children: [ |
| | | new TextRun({ |
| | | text: "五、改进建议", |
| | | text: "六、改进建议", |
| | | font: "宋体", |
| | | size: 22, |
| | | bold: true, |
| | |
| | | |
| | | // 10. 综合部落款 |
| | | new Paragraph({ |
| | | text: data.deptName, |
| | | text: data.dutyName, |
| | | alignment: AlignmentType.RIGHT, |
| | | spacing: { before: 1200 } |
| | | }), |
| | | |
| | | // 11. 日期落款 |
| | | new Paragraph({ |
| | | text: data.lastTime, |
| | | text: data.dutyTime, |
| | | alignment: AlignmentType.RIGHT, |
| | | spacing: { before: 200 } |
| | | }) |
| | |
| | | }); |
| | | // 导出文件 |
| | | const blob = await Packer.toBlob(doc); |
| | | saveAs(blob, "质量经济性分析报告.docx"); |
| | | saveAs(blob, data.companyName + "_质量经济性分析报告.docx"); |
| | | } |
| | | |
| | | |
| | |
| | | <el-dialog |
| | | v-model="dialogVisible" |
| | | :title="title" |
| | | width="900px" |
| | | width="950px" |
| | | :before-close="handleClose" |
| | | :close-on-press-escape="false" |
| | | :close-on-click-modal="false" |
| | |
| | | <el-col :span="24"> |
| | | <el-form-item label="年份:" prop="year" > |
| | | <el-select |
| | | :disabled="title === '查看'" |
| | | :disabled="title === '查看' || title === '编辑'" |
| | | v-model="state.form.year" |
| | | filterable |
| | | allow-create |
| | |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="年度质量体系改进计划:" prop="customerRecordNeeds" > |
| | | <el-form-item label="年度质量体系改进计划:" prop="plans" > |
| | | <el-button |
| | | :disabled="title === '查看'" |
| | | type="primary" |
| | |
| | | style="margin-left: 10px;margin-bottom: 10px" |
| | | >新增</el-button> |
| | | <div style="display: flex;width: 100%;"> |
| | | <el-table :data="state.form.customerRecordNeeds" :border="true" > |
| | | <el-table :data="state.form.plans" :border="true" > |
| | | <el-table-column type="index" label="序号" align="center"></el-table-column> |
| | | <el-table-column label="改 进 项" prop="customerName" align="center" width="120"> |
| | | <el-table-column label="改 进 项" prop="items" align="center" > |
| | | <template #default="{row,$index}"> |
| | | <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.customerName"> |
| | | <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.customerName" placeholder="请输入"></el-input> |
| | | <el-form-item :prop="'plans.' + '[' + $index + ']' + 'items'" :rules="state.rules.items"> |
| | | <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.items" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="具体措施" prop="customerNeed" align="center" width="120"> |
| | | <el-table-column label="具体措施" prop="measure" align="center" > |
| | | <template #default="{row,$index}"> |
| | | |
| | | <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.customerNeed"> |
| | | <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.customerNeed" placeholder="请输入"></el-input> |
| | | <el-form-item :prop="'plans.' + '[' + $index + ']' + 'measure'" :rules="state.rules.measure"> |
| | | <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.measure" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="责任部门" prop="disposeId" align="center" width="120"> |
| | | <el-table-column label="责任部门" prop="dutyId" align="center" width="150"> |
| | | <template #default="{row,$index}"> |
| | | |
| | | <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.disposeId"> |
| | | <el-form-item :prop="'plans.' + '[' + $index + ']' + 'dutyId'" :rules="state.rules.dutyId"> |
| | | <el-select |
| | | :disabled="title === '查看'" |
| | | v-model="row.disposeId" |
| | | v-model="row.dutyId" |
| | | placeholder="请选择部门" |
| | | style="width: 240px;margin-bottom: 5px" |
| | | > |
| | |
| | | :key="item.deptId" |
| | | :label="item.deptName" |
| | | :value="item.deptId" |
| | | />'customerRecordNeeds.' + '[' + $index + ']' + 'customerName' |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="完成时间" prop="disposeMess" align="center" width="120"> |
| | | <el-table-column label="完成时间" prop="finishTime" align="center" width="150"> |
| | | <template #default="{row,$index}"> |
| | | <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.disposeMess"> |
| | | <el-form-item :prop="'plans.' + '[' + $index + ']' + 'finishTime'" :rules="state.rules.finishTime"> |
| | | <el-date-picker |
| | | v-model="row.calibrationTime" |
| | | v-model="row.finishTime" |
| | | type="date" |
| | | value-format="YYYY-MM-DD" |
| | | placeholder="完成时间" |
| | | :disabled="state.title =='查看'" |
| | | :disabled="title =='查看'" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="跟踪验证" prop="remark" align="center" width="120"> |
| | | <el-table-column label="跟踪验证" prop="verify" align="center" > |
| | | <template #default="{row,$index}"> |
| | | <el-form-item :prop="'customerRecordNeeds.' + '[' + $index + ']' + 'customerName'" :rules="state.rules.remark"> |
| | | <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.remark" placeholder="请输入"></el-input> |
| | | <el-form-item :prop="'plans.' + '[' + $index + ']' + 'verify'" :rules="state.rules.verify"> |
| | | <el-input style="margin-top: 10px" :disabled="title === '查看'" type="textarea" :rows="4" v-model="row.verify" placeholder="请输入"></el-input> |
| | | </el-form-item> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="编制:" prop="compilationId" > |
| | | <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable style="width: 200px"> |
| | | <el-form-item label="编制:" prop="fictionId" > |
| | | <el-select clearable v-model="state.form.fictionId" :disabled="title =='查看'" filterable style="width: 200px"> |
| | | <el-option |
| | | v-for="item in state.peopleList" |
| | | :key="item.id" |
| | |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="审核:" prop="compilationId" > |
| | | <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable style="width: 200px"> |
| | | <el-form-item label="审核:" prop="checkId" > |
| | | <el-select clearable v-model="state.form.checkId" :disabled="title =='查看'" filterable style="width: 200px"> |
| | | <el-option |
| | | v-for="item in state.peopleList" |
| | | :key="item.id" |
| | |
| | | </el-row> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="批准:" prop="compilationId" > |
| | | <el-select clearable v-model="state.form.compilationId" :disabled="title =='查看'" filterable style="width: 200px"> |
| | | <el-form-item label="批准:" prop="ratifyId" > |
| | | <el-select clearable v-model="state.form.ratifyId" :disabled="title =='查看'" filterable style="width: 200px"> |
| | | <el-option |
| | | v-for="item in state.peopleList" |
| | | :key="item.id" |
| | |
| | | import {addTable, editTable, getTargetById} from "@/api/qualityObjectives/table"; |
| | | import {addNeedDiscren, editNeedDiscren} from "@/api/need/need"; |
| | | import {addCustomerNeed, editCustomerNeed} from "@/api/customerNeed"; |
| | | import {addInside, editInside} from "@/api/continuousImprovement"; |
| | | |
| | | const dialogVisible = ref(false); |
| | | const title = ref(""); |
| | |
| | | form: { |
| | | id: '', |
| | | companyId: null, |
| | | recordName: null, |
| | | customerRecordNeeds:[], |
| | | year: "", //年份 |
| | | fictionId: null, //编制 |
| | | checkId: null, //审核 |
| | | ratifyId: null, //批准 |
| | | plans:[], |
| | | }, |
| | | rules: { |
| | | companyId: [{ required: true, message: '请选择企业', trigger: 'blur' }], |
| | | recordName: [{ required: true, message: '请输入记录名称', trigger: 'blur' }], |
| | | customerName: [{required: true, message: "", trigger: "blur"}], |
| | | customerNeed: [{required: true, message: "", trigger: "blur"}], |
| | | needSource: [{required: true, message: "", trigger: "blur"}], |
| | | registrantId: [{required: true, message: "", trigger: "blur"}], |
| | | disposeId: [{required: true, message: "", trigger: "blur"}], |
| | | disposeMess: [{required: true, message: "", trigger: "blur"}], |
| | | customerRecordNeeds:[{ required: true, message: '请填写需求登记列表', trigger: 'blur' }], |
| | | year: [{ required: true, message: '请输入年份', trigger: 'blur' }], // |
| | | fictionId: [{ required: true, message: '请选择编制', trigger: 'blur' }], |
| | | checkId: [{ required: true, message: '请选择审核', trigger: 'blur' }], |
| | | ratifyId: [{ required: true, message: '请选择批准', trigger: 'blur' }], |
| | | items: [{required: true, message: "", trigger: "blur"}], |
| | | measure: [{required: true, message: "", trigger: "blur"}], |
| | | dutyId: [{required: true, message: "", trigger: "blur"}], |
| | | finishTime: [{required: true, message: "", trigger: "blur"}], |
| | | // verify: [{required: true, message: "", trigger: "blur"}], |
| | | plans:[{ required: true, message: '请填写年度质量体系改进计划表', trigger: 'blur' }], |
| | | }, |
| | | peopleList: [], |
| | | isAdmin: false, |
| | |
| | | state.form.companyId = value.companyId |
| | | state.form.companyName = value.companyName |
| | | } |
| | | state.form.customerRecordNeeds.forEach(item => { |
| | | item.customerName = item.customerName |
| | | const obj = { |
| | | recordId: state.form.id, |
| | | customerNeed: item.customerNeed, |
| | | disposeId: item.disposeId, |
| | | disposeMess: item.disposeMess, |
| | | needSource: item.needSource?.split(','), |
| | | registrantId: item.registrantId, |
| | | remark: item.remark, |
| | | } |
| | | item.expectContentMesses=[obj] |
| | | }) |
| | | |
| | | console.log('xx',state.form) |
| | | |
| | | } |
| | |
| | | dialogVisible.value = true; |
| | | } |
| | | const onSubmit = async () => { |
| | | let dataDemo = JSON.parse(JSON.stringify(state.form)) |
| | | let flag = false |
| | | for (const i of dataDemo.customerRecordNeeds) { |
| | | if(!i.expectContentMesses[0].needSource || i.expectContentMesses[0].needSource.length ==0){ |
| | | ElMessage.warning('请完善需求来源') |
| | | flag = true |
| | | return |
| | | } |
| | | } |
| | | if(flag) return |
| | | let dataArr = [] |
| | | dataArr = dataDemo.customerRecordNeeds.map(item => { |
| | | return { |
| | | customerName: item.customerName, |
| | | customerNeed: item.expectContentMesses[0].customerNeed, |
| | | disposeId: item.expectContentMesses[0].disposeId, |
| | | disposeMess: item.expectContentMesses[0].disposeMess, |
| | | needSource: item.expectContentMesses[0].needSource?.join(','), |
| | | registrantId: item.expectContentMesses[0].registrantId, |
| | | remark: item.expectContentMesses[0].remark, |
| | | } |
| | | }) |
| | | dataDemo.customerRecordNeeds = dataArr |
| | | const valid = await busRef.value.validate(); |
| | | if(valid){ |
| | | if(title.value === '新增'){ |
| | | const {id, ...data} = dataDemo |
| | | const res = await addCustomerNeed(data) |
| | | const {id, ...data} = JSON.parse(JSON.stringify(state.form)) |
| | | const res = await addInside(data) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | |
| | | reset(); |
| | | dialogVisible.value = false; |
| | | }else if(title.value === '编辑'){ |
| | | const {...data} = dataDemo |
| | | data.customerRecordNeeds.forEach(i => { |
| | | i.recordId = data.id |
| | | }) |
| | | const res = await editCustomerNeed(data) |
| | | const {...data} = JSON.parse(JSON.stringify(state.form)) |
| | | // data.plans.forEach(i => { |
| | | // i.recordId = data.id |
| | | // }) |
| | | const res = await editInside(data) |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | |
| | | state.form = { |
| | | id: '', |
| | | companyId: null, |
| | | recordName: null, |
| | | customerRecordNeeds:[], |
| | | year: "", //年份 |
| | | fictionId: null, //编制 |
| | | checkId: null, //审核 |
| | | ratifyId: null, //批准 |
| | | plans:[], |
| | | } |
| | | state.companyList = [] |
| | | } |
| | | |
| | | const selectValueCom = (val) => { |
| | | state.form.fictionId = null |
| | | state.form.checkId = null |
| | | state.form.ratifyId = null |
| | | state.form.plans.forEach(item => { |
| | | item.dutyId = null |
| | | }) |
| | | state.companyList.forEach(item => { |
| | | if(item.name === val){ |
| | | state.form.companyId = item.id |
| | |
| | | |
| | | |
| | | const addTableData = () => { |
| | | state.form.customerRecordNeeds.push({}) |
| | | state.form.plans.push({}) |
| | | } |
| | | const addObject = (val,itemIndex) => { |
| | | state.form.customerRecordNeeds.forEach((item,index) => { |
| | | state.form.plans.forEach((item,index) => { |
| | | if(index == itemIndex){ |
| | | item.expectContentMesses.push({}) |
| | | } |
| | | }) |
| | | } |
| | | const delObject = (val,itemIndex) => { |
| | | state.form.customerRecordNeeds = state.form.customerRecordNeeds.filter(item=> item != val) |
| | | state.form.plans = state.form.plans.filter(item=> item != val) |
| | | } |
| | | const handleChangeNum = (value) => { |
| | | if (!/^\d+$/.test(value)) { // 验证是否为数字 |
| | |
| | | <el-table-column label="企业名称" prop="companyName" align="center" v-if="data.isAdmin" /> |
| | | <el-table-column label="名称" align="center"> |
| | | <template #default="scope"> |
| | | <span>{{scope.row.recordName}}</span> |
| | | <span>{{scope.row.year}}年度质量体系改进计划</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160"> |
| | |
| | | import {delTable, getTable} from "@/api/qualityObjectives/table"; |
| | | import {delNeedDiscren, getNeedDiscren} from "@/api/need/need"; |
| | | import {delCustomerNeed, getCustomerNeed} from "@/api/customerNeed"; |
| | | import {delInside, getInside} from "@/api/continuousImprovement"; |
| | | const { proxy } = getCurrentInstance(); |
| | | const loading = ref(false); |
| | | const noticeRef = ref(); |
| | |
| | | } |
| | | }); |
| | | const getList = async () => { |
| | | // loading.value = true; |
| | | // const res = await getCustomerNeed(data.queryParams); |
| | | // if(res.code === 200){ |
| | | // dataList.value = res.data.list |
| | | // total.value = res.data.total |
| | | // }else{ |
| | | // ElMessage.warning(res.message) |
| | | // } |
| | | // loading.value = false; |
| | | dataList.value = [{}] |
| | | loading.value = true; |
| | | const res = await getInside(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 = () => { |
| | |
| | | const startGeneration = async () => { |
| | | const data = JSON.parse(JSON.stringify(choosedData.value)) |
| | | data.forEach(item => { |
| | | |
| | | // item.tableData = item.customerRecordNeeds.map((i,index) => { |
| | | // return{ |
| | | // ...i, |
| | | // expectContentMesses: i.expectContentMesses.map((q,qindex) => { |
| | | // return{ |
| | | // ...q, |
| | | // first: qindex == 0, |
| | | // num: index+1, |
| | | // } |
| | | // }) |
| | | // } |
| | | // }) |
| | | item.tableData = item.plans.map((i,index) => { |
| | | return{ |
| | | ...i, |
| | | num: index+1, |
| | | } |
| | | }) |
| | | console.log('xxx',item.tableData) |
| | | try { |
| | | generateWordDocument(templatePath.value, item, item.companyName + `_顾客需求登记表.docx`); |
| | | generateWordDocument(templatePath.value, item, item.companyName + `_${item.year}年度体系改进计划.docx`); |
| | | } catch (error){ |
| | | ElMessage({ |
| | | type: 'warning', |
| | |
| | | type: 'warning', |
| | | }) |
| | | .then( async() => { |
| | | const res = await delCustomerNeed(val.id); |
| | | const res = await delInside(val.id); |
| | | if(res.code === 200){ |
| | | ElMessage({ |
| | | type: 'success', |
| | |
| | | const handleChangeNum = (value) => { |
| | | if (!/^\d+$/.test(value)) { // 验证是否为数字 |
| | | ElMessage.warning('只能输入数字') |
| | | state.form.year = '' // 重置选择,避免非法值被添加到options中 |
| | | } else if (!state.yearList.some(option => option.label === value)) { // 确保不是已存在的选项 |
| | | state.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同) |
| | | data.queryParams.year = '' // 重置选择,避免非法值被添加到options中 |
| | | } else if (!data.yearList.some(option => option.label === value)) { // 确保不是已存在的选项 |
| | | data.yearList.push({ value, label: value }); // 添加新选项(这里简单地将值和标签设为相同) |
| | | } |
| | | } |
| | | </script> |