| src/api/safeProduction/safetyTrainingAssessment.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/equipmentManagement/measurementEquipment/components/formDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/productStructure/Detail/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/safeProduction/safetyTrainingAssessment/detail.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/safeProduction/safetyTrainingAssessment/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/safeProduction/safetyTrainingAssessment.js
@@ -67,4 +67,46 @@ method: 'delete', data: ids }) } } // ç¾å° export function safeTrainingSign(query) { return request({ url: '/safeTraining/sign', method: 'post', data: query }) } // æ¥è¯¢è¯¦æ export function safeTrainingGet(query) { return request({ url: '/safeTraining/getSafeTraining', method: 'get', params: query }) } // æäº¤ export function safeTrainingSave(query) { return request({ url: '/safeTraining/saveSafeTraining', method: 'post', data: query }) } export function safeTrainingDetailListPage(query) { return request({ url: "/safeTrainingDetails/page", method: "get", params: query, }); } // å¯¼åº export function safeTrainingDetailExport(query) { return request({ url: '/safeTrainingDetails/export', method: 'post', data: query, responseType: 'blob' }) } src/views/equipmentManagement/measurementEquipment/components/calibrationDia.vue
@@ -51,11 +51,14 @@ </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æææï¼" prop="valid"> <el-form-item label="æææ¥æ(天)ï¼" prop="valid"> <el-input v-model="form.valid" placeholder="请è¾å ¥" type="number" placeholder="请è¾å ¥æææå¤©æ°" clearable :min="1" @input="handleValidInput" > <template #append>æ¥</template> </el-input> @@ -152,7 +155,32 @@ rules: { code: [{required: true, message: "请è¾å ¥", trigger: "blur"}], name: [{required: true, message: "请è¾å ¥", trigger: "blur"}], valid: [{required: true, message: "请è¾å ¥", trigger: "blur"}], valid: [ {required: true, message: "请è¾å ¥", trigger: "blur"}, { validator: (rule, value, callback) => { if (value === '' || value === null || value === undefined) { callback(); return; } const numValue = Number(value); if (isNaN(numValue)) { callback(new Error('请è¾å ¥ææçæ°å')); return; } if (numValue <= 0) { callback(new Error('åªè½è¾å ¥æ£æ°')); return; } if (!Number.isInteger(numValue)) { callback(new Error('请è¾å ¥æ´æ°')); return; } callback(); }, trigger: 'blur' } ], recordDate: [{required: true, message: "è¯·éæ©", trigger: "change"}], userId: [{required: true, message: "è¯·éæ©", trigger: "change"}], entryDate: [{required: true, message: "è¯·éæ©", trigger: "change"}], @@ -233,6 +261,27 @@ } } // å¤çæææ¥æè¾å ¥ï¼åªå è®¸æ£æ´æ° const handleValidInput = (value) => { if (value === '' || value === null || value === undefined) { form.value.valid = ''; return; } // 转æ¢ä¸ºåç¬¦ä¸²å¹¶ç§»é¤ææéæ°åå符ï¼å æ¬è´å·ãå°æ°ç¹çï¼ const numStr = String(value).replace(/[^0-9]/g, ''); if (numStr === '') { form.value.valid = ''; return; } const numValue = parseInt(numStr, 10); // ç¡®ä¿æ¯æ£æ´æ°ï¼å¤§äº0ï¼ if (numValue > 0 && !isNaN(numValue)) { form.value.valid = numValue; } else { form.value.valid = ''; } } const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { src/views/equipmentManagement/measurementEquipment/components/formDia.vue
@@ -74,8 +74,11 @@ <el-form-item label="æææ¥æ(天)ï¼" prop="valid"> <el-input v-model="form.valid" type="number" placeholder="请è¾å ¥æææå¤©æ°" clearable :min="1" @input="handleValidInput" > <template #append>æ¥</template> </el-input> @@ -192,7 +195,32 @@ instationLocation: [{required: true, message: "请è¾å ¥", trigger: "blur"}], mostDate: [{required: true, message: "è¯·éæ©", trigger: "change"}], cycle: [{required: true, message: "è¯·éæ©", trigger: "blur"}], valid: [{required: true, message: "请è¾å ¥", trigger: "blur"}], valid: [ {required: true, message: "请è¾å ¥", trigger: "blur"}, { validator: (rule, value, callback) => { if (value === '' || value === null || value === undefined) { callback(); return; } const numValue = Number(value); if (isNaN(numValue)) { callback(new Error('请è¾å ¥ææçæ°å')); return; } if (numValue <= 0) { callback(new Error('åªè½è¾å ¥æ£æ°')); return; } if (!Number.isInteger(numValue)) { callback(new Error('请è¾å ¥æ´æ°')); return; } callback(); }, trigger: 'blur' } ], unit: [{required: true, message: "请è¾å ¥", trigger: "blur"}], } }) @@ -254,6 +282,27 @@ } } // å¤çæææ¥æè¾å ¥ï¼åªå è®¸æ£æ´æ° const handleValidInput = (value) => { if (value === '' || value === null || value === undefined) { form.value.valid = ''; return; } // 转æ¢ä¸ºåç¬¦ä¸²å¹¶ç§»é¤ææéæ°åå符ï¼å æ¬è´å·ãå°æ°ç¹çï¼ const numStr = String(value).replace(/[^0-9]/g, ''); if (numStr === '') { form.value.valid = ''; return; } const numValue = parseInt(numStr, 10); // ç¡®ä¿æ¯æ£æ´æ°ï¼å¤§äº0ï¼ if (numValue > 0 && !isNaN(numValue)) { form.value.valid = numValue; } else { form.value.valid = ''; } } const submitForm = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { src/views/productionManagement/productStructure/Detail/index.vue
@@ -115,7 +115,7 @@ <el-input v-model="row.unit" placeholder="请è¾å ¥åä½" clearable :disabled="!dataValue.isEdit || dataValue.dataList.some(item => (item as any).tempId === row.tempId)" /> :disabled="!dataValue.isEdit || dataValue.dataList.some(item => (item as any).tempId === row.tempId)" /> </el-form-item> </template> </el-table-column> @@ -264,15 +264,20 @@ const productData = row[0]; // æå¤å±ç»ä»¶ä¸ï¼ä¸å½å产åç¸åç产ååªè½æä¸ä¸ª const isTopLevel = dataValue.dataList.some(item => (item as any).tempId === dataValue.currentRowName); const isTopLevel = dataValue.dataList.some( item => (item as any).tempId === dataValue.currentRowName ); if (isTopLevel) { if (productData.productName === tableData[0].productName && productData.model === tableData[0].model) { if ( productData.productName === tableData[0].productName && productData.model === tableData[0].model ) { // æ¥æ¾æ¯å¦å·²ç»æå ¶ä»é¡¶å±è¡å·²ç»æ¯è¿ä¸ªäº§å const hasOther = dataValue.dataList.some(item => (item as any).tempId !== dataValue.currentRowName && (item as any).productName === tableData[0].productName && (item as any).model === tableData[0].model const hasOther = dataValue.dataList.some( item => (item as any).tempId !== dataValue.currentRowName && (item as any).productName === tableData[0].productName && (item as any).model === tableData[0].model ); if (hasOther) { ElMessage.warning("æå¤å±åå½å产å䏿 ·çä¸çº§åªè½æä¸ä¸ª"); @@ -390,7 +395,7 @@ } }; const removeItem = (tempId:string) => { const removeItem = (tempId: string) => { // å å°è¯ä»é¡¶å±å é¤ const topIndex = dataValue.dataList.findIndex(item => item.tempId === tempId); if (topIndex !== -1) { src/views/safeProduction/safetyTrainingAssessment/detail.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,325 @@ <template> <div class="app-container"> <PageHeader content="å¹è®è®°å½"> </PageHeader> <div class="search_form"> <div class="search_item"> <span class="search_title">人ååç§°ï¼</span> <el-input v-model="searchForm.searchText" style="width: 240px" placeholder="è¾å ¥å®¢æ·åç§°æç´¢" @change="searchName" clearable prefix-icon="Search" /> <el-button type="primary" @click="searchName" style="margin-left: 10px">æç´¢</el-button> </div> <div class="search_item"> <span class="search_title">年份ï¼</span> <el-date-picker v-model="searchForm.invoiceDate" type="year" @change="searchDate" placeholder="鿩年"> </el-date-picker> <el-button type="primary" @click="searchDate" style="margin-left: 10px">æç´¢</el-button> <el-button type="primary" @click="exportData" style="margin-left: 20px;margin-right: 20px">导åº</el-button> </div> </div> <div style="display: flex"> <div class="table_list"> <el-table :data="tableData" border v-loading="tableLoading" :row-key="(row) => row.id" @row-click="rowClickMethod" height="calc(100vh - 18.5em)"> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="åç§°" prop="nickName" show-overflow-tooltip width="200" /> <el-table-column label="æå±é¨é¨" prop="deptNames" show-overflow-tooltip width="200" /> <el-table-column label="èç³»æ¹å¼" prop="phonenumber" show-overflow-tooltip width="200" /> <!-- <el-table-column label="email" prop="email" show-overflow-tooltip width="200" /> --> <!-- <el-table-column label="åºæ¶éé¢(å )" prop="unReceiptPaymentAmount" show-overflow-tooltip width="200"> <template #default="{ row, column }"> <el-text type="danger"> {{ formattedNumber(row, column, row.unReceiptPaymentAmount) }} </el-text> </template> </el-table-column> --> </el-table> <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" :limit="page.size" @pagination="paginationChange" /> </div> <div class="table_list"> <el-table :data="receiptRecord" border :row-key="(row) => row.id" height="calc(100vh - 18.5em)"> <el-table-column align="center" label="åºå·" type="index" width="60" /> <el-table-column label="å¹è®æ¥æ" prop="trainingDate" show-overflow-tooltip /> <el-table-column label="å¹è®å 容" prop="trainingContent" show-overflow-tooltip /> <el-table-column label="å¹è®è¯¾æ¶" prop="classHour" show-overflow-tooltip /> <el-table-column label="èæ ¸ç»æ" prop="examinationResults" show-overflow-tooltip> <template #default="{ row }"> <el-tag :type="row.examinationResults === 'åæ ¼' ? 'success' : 'danger'"> {{ row.examinationResults }} </el-tag> </template> </el-table-column> </el-table> </div> </div> </div> </template> <script setup> import { onMounted, ref } from "vue"; import { invoiceLedgerSalesAccount } from "@/api/salesManagement/invoiceLedger.js"; import { customerInteractions } from "@/api/salesManagement/receiptPayment.js"; import Pagination from "@/components/PIMTable/Pagination.vue"; import { safeTrainingDetailListPage, safeTrainingDetailExport, } from "@/api/safeProduction/safetyTrainingAssessment.js"; import { userListNoPage } from "@/api/system/user.js"; const { proxy } = getCurrentInstance(); const tableData = ref([]); const receiptRecord = ref([]); const tableLoading = ref(false); const page = reactive({ current: 1, size: 100, }); const recordPage = reactive({ current: 1, size: 100, }); const total = ref(0); const recordTotal = ref(0); const data = reactive({ searchForm: { searchText: "", invoiceDate: "", }, }); const customerId = ref(""); const { searchForm } = toRefs(data); const originReceiptRecord = ref([]); // æ¥è¯¢å表 /** æç´¢æé®æä½ */ const handleQuery = () => { page.current = 1; getList(); }; const paginationChange = obj => { page.current = obj.page; page.size = obj.limit; getList(); }; const tableDataCopy = ref([]); const getList = () => { tableLoading.value = true; userListNoPage({}).then(res => { console.log("res", res.data); tableData.value = res.data; tableDataCopy.value = res.data; if (tableData.value.length > 0) { customerId.value = tableData.value[0].userId; receiptPaymentList(customerId.value); tableLoading.value = false; } }); }; const exportData = () => { safeTrainingDetailExport({ userId: customerId.value, }) .then(res => { // å建Blob对象 const blob = new Blob([res], { type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", }); // å建ä¸è½½é¾æ¥ const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = `è®°å½è¯¦æ _${tableData.value[0].nickName}.docx`; // 模æç¹å»ä¸è½½ document.body.appendChild(link); link.click(); // æ¸ ç临æ¶å¯¹è±¡ setTimeout(() => { document.body.removeChild(link); window.URL.revokeObjectURL(url); }, 100); ElMessage.success("å¯¼åºæå"); }) .catch(err => { console.error("导åºå¤±è´¥:", err); ElMessage.error("导åºå¤±è´¥ï¼è¯·éè¯"); }); }; const formattedNumber = (row, column, cellValue) => { return parseFloat(cellValue).toFixed(2); }; // 主表åè®¡æ¹æ³ const summarizeMainTable = param => { return proxy.summarizeTable( param, ["invoiceTotal", "receiptPaymentAmount", "unReceiptPaymentAmount"], { ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° } ); }; // å表åè®¡æ¹æ³ const summarizeMainTable1 = param => { var summarizeTable = proxy.summarizeTable( param, ["invoiceAmount", "receiptAmount", "unReceiptAmount"], { ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° } ); // åæåä¸è¡æ°æ®; if (receiptRecord.value?.length > 0) { const index = tableData.value.findIndex( item => item.id == customerId.value ); summarizeTable[summarizeTable.length - 1] = tableData.value[index].unReceiptPaymentAmount.toFixed(2); } else { summarizeTable[summarizeTable.length - 1] = 0.0; } return summarizeTable; }; const goBack = () => { proxy.$router.push({ path: "/safeProduction/safetyTrainingAssessment", }); }; const searchName = () => { tableData.value = tableDataCopy.value; if (searchForm.value.searchText) { tableData.value = tableData.value.filter(item => item.nickName.includes(searchForm.value.searchText) ); customerId.value = tableData.value[0].userId; } receiptPaymentList(customerId.value); }; const dateFormat = (date, format = "yyyy-MM-dd") => { const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, "0"); const day = String(date.getDate()).padStart(2, "0"); return format.replace("yyyy", year).replace("MM", month).replace("dd", day); }; const searchDate = () => { receiptRecord.value = originReceiptRecordCopy.value; console.log("searchForm.value.invoiceDate", searchForm.value.invoiceDate); if (searchForm.value.invoiceDate) { const year = dateFormat(searchForm.value.invoiceDate, "yyyy"); receiptRecord.value = receiptRecord.value.filter(item => { console.log("item.trainingDate", item.trainingDate); return item.trainingDate.includes(year); }); } }; const originReceiptRecordCopy = ref([]); const receiptPaymentList = id => { const param = { userId: id, }; console.log("param", param); safeTrainingDetailListPage(param).then(res => { originReceiptRecord.value = res.data.records; handlePagination({ page: 1, limit: recordPage.size }); recordTotal.value = res.data.length; }); }; // æ±æ¬¾è®°å½å表å页 const recordPaginationChange = pagination => { handlePagination(pagination); }; const rowClickMethod = row => { customerId.value = row.userId; receiptPaymentList(customerId.value); }; const handlePagination = ({ page, limit }) => { recordPage.current = page; recordPage.size = limit; const start = (page - 1) * limit; const end = start + limit; receiptRecord.value = originReceiptRecord.value.slice(start, end); originReceiptRecordCopy.value = originReceiptRecord.value.slice(start, end); }; onMounted(() => { getList(); }); </script> <style scoped lang="scss"> .table_list { width: 50%; } .search_back { cursor: pointer; color: #0f497e; } .search_item { width: 50%; display: flex; align-items: center; justify-content: flex-start; margin-right: 20px; } </style> src/views/safeProduction/safetyTrainingAssessment/index.vue
@@ -2,23 +2,14 @@ <div class="app-container"> <div class="search_form"> <div> <span class="search_title">å¹è®åç§°ï¼</span> <el-input v-model="searchForm.name" style="width: 240px" placeholder="请è¾å ¥å¹è®åç§°æç´¢" @change="handleQuery" clearable :prefix-icon="Search" /> <span class="search_title ml10">å¹è®ç±»åï¼</span> <el-select v-model="searchForm.type" clearable @change="handleQuery" style="width: 240px"> <el-option v-for="item in knowledgeTypeOptions" :key="item.value" :label="item.label" :value="item.value" /> </el-select> <span class="search_title">å¹è®æ¥æï¼</span> <el-date-picker v-model="searchForm.trainingDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" @change="handleQuery" type="date" placeholder="è¯·éæ©" clearable /> <el-button type="primary" @click="handleQuery" style="margin-left: 10px"> @@ -28,12 +19,24 @@ <div> <el-button type="primary" @click="openForm('add')">æ°å¢å¹è®</el-button> <el-button type="primary" @click="opendetail">å¹è®è®°å½</el-button> <el-button type="danger" plain @click="handleDelete">å é¤</el-button> </div> </div> <div class="table_list"> <el-tabs v-model="searchForm.state" @tab-click="tabhandleQuery"> <el-tab-pane label="æªå¼å§" :name="0"></el-tab-pane> <el-tab-pane label="è¿è¡ä¸" :name="1"></el-tab-pane> <el-tab-pane label="å·²ç»æ" :name="2"></el-tab-pane> </el-tabs> <!-- state ç¶æ(0ï¼æªå¼å§1ï¼è¿è¡ä¸ï¼2ï¼å·²ç»æ) --> <PIMTable rowKey="id" :column="tableColumn" :tableData="tableData" @@ -135,6 +138,8 @@ <el-form-item label="课ç¨å¦å" prop="projectCredits"> <el-input v-model="form.projectCredits" type="number" min="0" placeholder="请è¾å ¥è¯¾ç¨å¦å" /> </el-form-item> </el-col> @@ -181,51 +186,164 @@ </el-dialog> <!-- æ¥çç¥è¯è¯¦æ å¼¹çª --> <el-dialog v-model="viewDialogVisible" title="å¹è®è¯¦æ " title="ç»ææç»" width="900px" :close-on-click-modal="false"> <div class="knowledge-detail"> <el-descriptions :column="2" border> <el-descriptions-item label="å¹è®åç§°" :span="2"> <span class="detail-title">{{ currentKnowledge.name }}</span> </el-descriptions-item> <el-descriptions-item label="å¹è®ç¼ç "> {{ currentKnowledge.code }} </el-descriptions-item> <el-descriptions-item label="å¹è®ç±»å"> <el-tag type="info"> <!-- {{ getTypeLabel(currentKnowledge.type) }} --> <el-descriptions size="mini" style="margin-left: 60px;" :column="3"> <el-descriptions-item label="课ç¨ç¼å·:">{{ currentKnowledge.courseCode }}</el-descriptions-item> <el-descriptions-item label="å¹è®å 容:">{{ currentKnowledge.trainingContent }}</el-descriptions-item> <el-descriptions-item label="ç¶æ:"> <el-tag :type="currentKnowledge.status === 0 ? 'success' : (currentKnowledge.status === 1 ? 'success' : 'info')"> {{ currentKnowledge.status === 0 ? 'æªå¼å§' : (currentKnowledge.status === 1 ? 'è¿è¡ä¸' : 'å·²ç»æ') }} </el-tag> </el-descriptions-item> <el-descriptions-item label="æå¨ä½ç½®"> {{ currentKnowledge.location }} <el-descriptions-item label="å¹è®è®²å¸:"> {{ currentKnowledge.trainingLecturer }} </el-descriptions-item> <el-descriptions-item label="ç®¡æ§æªæ½"> {{ currentKnowledge.controlMeasures }} <el-descriptions-item label="å¹è®å¼å§æ¶é´:"> {{ currentKnowledge.trainingDate + ' ' + currentKnowledge.openingTime }} </el-descriptions-item> <el-descriptions-item label="åºåæ°é"> {{ currentKnowledge.stockQty }} <el-descriptions-item label="å¹è®ç»ææ¶é´:"> {{ currentKnowledge.trainingDate + ' ' + currentKnowledge.endTime }} </el-descriptions-item> <el-descriptions-item label="管æ§è´£ä»»äºº"> {{ currentKnowledge.principalUserId }} <el-descriptions-item label="å¹è®ç®æ :"> {{ currentKnowledge.trainingObjectives }} </el-descriptions-item> <el-descriptions-item label="责任人èç³»çµè¯"> {{ currentKnowledge.principalMobile }} <el-descriptions-item label="åå 对象:"> {{ currentKnowledge.participants }} </el-descriptions-item> <el-descriptions-item label="é£é©ç级"> <el-tag :type="getTypeTagType(currentKnowledge.riskLevel)"> {{ currentKnowledge.riskLevel }} <el-descriptions-item label="å¹è®æ¹å¼:"> <el-tag type="primary"> {{ getTrainingModeLabel(currentKnowledge.trainingMode) }} </el-tag> </el-descriptions-item> <el-descriptions-item label="è§æ ¼ / é£é©æè¿°"> {{ currentKnowledge.specInfo }} <el-descriptions-item label="å¹è®å°ç¹:"> {{ currentKnowledge.placeTraining }} </el-descriptions-item> <el-descriptions-item label="课æ¶:"> {{ currentKnowledge.classHour }} </el-descriptions-item> <el-descriptions-item label="课ç¨å¦å:"> {{ currentKnowledge.projectCredits }} </el-descriptions-item> <el-descriptions-item label="æ¥å人æ°:"> {{ currentKnowledge.nums }} </el-descriptions-item> <el-descriptions-item label="éä»¶å表:"> <el-button type="primary" size="small" @click="downLoadFile(endform)">éä»¶å表</el-button> </el-descriptions-item> </el-descriptions> <el-divider style="margin: 20px 0;" /> <el-form ref="formRef" :model="form" :rules="rules" label-width="130px"> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="è¯ä»·äºº:" prop="courseCode"> <el-input v-model="endform.assessmentUserName" disabled placeholder="è¯·éæ©è¯ä»·äºº" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="è¯ä»·æ¶é´:" prop="trainingDate"> <el-date-picker style="width: 100%" disabled v-model="endform.assessmentDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="date" placeholder="è¯·éæ©" clearable /> </el-form-item> </el-col> </el-row> <el-row :gutter="20"> <el-col :span="12"> <el-form-item label="èæ ¸æ¹å¼:" prop="assessmentMethod"> <el-input v-model="endform.assessmentMethod" placeholder="è¯·éæ©èæ ¸æ¹å¼" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æ¬æ¬¡è¯¾ç¨ç»¼åè¯ä»·:" prop="comprehensiveAssessment"> <el-input v-model="endform.comprehensiveAssessment" placeholder="请è¾å ¥æ¬æ¬¡è¯¾ç¨ç»¼åè¯ä»·" /> </el-form-item> </el-col> </el-row> <el-form-item label="å¹è®æè¦:" prop="trainingAbstract"> <el-input v-model="endform.trainingAbstract" type="textarea" :rows="2" placeholder="请è¾å ¥å¹è®æè¦" /> </el-form-item> <!-- <el-row :gutter="30"> <el-col :span="24"> <el-form-item label="éä»¶ææï¼" prop="remark"> <el-upload v-model:file-list="fileList" :action="upload.url" multiple ref="fileUpload" auto-upload :headers="upload.headers" :before-upload="handleBeforeUpload" :on-error="handleUploadError" :on-success="handleUploadSuccess" :on-remove="handleRemove"> <el-button type="primary" v-if="operationType !== 'view'">ä¸ä¼ </el-button> <template #tip v-if="operationType !== 'view'"> <div class="el-upload__tip"> æä»¶æ ¼å¼æ¯æ docï¼docxï¼xlsï¼xlsxï¼pptï¼pptxï¼pdfï¼txtï¼xmlï¼jpgï¼jpegï¼pngï¼gifï¼bmpï¼rarï¼zipï¼7z </div> </template> </el-upload> </el-form-item> </el-col> </el-row> --> </el-form> <el-table style="margin-top: 20px;" :data="endform.safeTrainingDetailsDtoList" border fit highlight-current-row> <el-table-column prop="nickName" label="å§å" /> <el-table-column prop="phonenumber" label="çµè¯å·ç " /> <el-table-column prop="examinationResults" label="èæ ¸ç»æ"> <template #default="scope"> <el-select v-model="scope.row.examinationResults" placeholder="è¯·éæ©èæ ¸ç»æ"> <el-option label="åæ ¼" value="åæ ¼" /> <el-option label="ä¸åæ ¼" value="ä¸åæ ¼" /> </el-select> </template> </el-table-column> </el-table> </div> <template #footer> <span class="dialog-footer"> <el-button type="primary" @click="submitForm2">æäº¤</el-button> <el-button @click="viewDialogVisible = false">å ³é</el-button> </span> </template> @@ -265,7 +383,13 @@ safeTrainingFileListPage, safeTrainingFileAdd, safeTrainingFileDel, safeTrainingSign, safeTrainingGet, safeTrainingSave, } from "@/api/safeProduction/safetyTrainingAssessment.js"; import useUserStore from "@/store/modules/user"; import dayjs from "dayjs"; const userStore = useUserStore(); // 表åéªè¯è§å const rules = { @@ -284,12 +408,17 @@ ], classHour: [{ required: true, message: "请è¾å ¥è¯¾æ¶", trigger: "blur" }], }; const upload = reactive({ // ä¸ä¼ çå°å url: import.meta.env.VITE_APP_BASE_API + "/file/upload", // 设置ä¸ä¼ ç请æ±å¤´é¨ headers: { Authorization: "Bearer " + getToken() }, }); // ååºå¼æ°æ® const data = reactive({ searchForm: { name: "", type: "", trainingDate: "", state: 0, }, tableLoading: false, page: { @@ -342,6 +471,13 @@ ); return item ? item.label : val; }; // 忢tabæ¥è¯¢ const tabhandleQuery = val => { searchForm.value.state = val.paneName; console.log(searchForm.value.state, "searchForm.value.state"); handleQuery(); }; // 表åå¼ç¨ const formRef = ref(); const riskLevelOptions = ref([ @@ -351,56 +487,69 @@ { value: "é大é£é©", label: "é大é£é©" }, ]); const fileList = ref([]); // è¡¨æ ¼åé ç½® const tableColumn = ref([ { label: "课ç¨ç¼å·", prop: "courseCode", width: 150, showOverflowTooltip: true, }, { label: "å¹è®æ¥æ", prop: "trainingDate", width: 120, showOverflowTooltip: true, }, { label: "å¼å§æ¶é´", prop: "openingTime", width: 120, showOverflowTooltip: true, }, { label: "ç»ææ¶é´", prop: "endTime", width: 120, showOverflowTooltip: true, }, { label: "å¹è®ç®æ ", prop: "trainingObjectives", width: 200, showOverflowTooltip: true, }, { label: "åå 对象", prop: "participants", width: 200, showOverflowTooltip: true, }, { label: "å¹è®å 容", prop: "trainingContent", width: 200, showOverflowTooltip: true, }, { label: "å¹è®è®²å¸", prop: "trainingLecturer", width: 200, showOverflowTooltip: true, }, { label: "项ç®å¦å", prop: "projectCredits", width: 120, showOverflowTooltip: true, }, { label: "å¹è®æ¹å¼", prop: "trainingMode", width: 120, showOverflowTooltip: true, formatData: params => { return getTrainingModeLabel(params); @@ -409,11 +558,19 @@ { label: "å¹è®å°ç¹", prop: "placeTraining", width: 200, showOverflowTooltip: true, }, { label: "课æ¶", prop: "classHour", width: 120, showOverflowTooltip: true, }, { label: "æ¥å人æ°", prop: "nums", width: 120, showOverflowTooltip: true, }, { @@ -421,27 +578,47 @@ label: "æä½", align: "center", fixed: "right", width: 200, width: 300, operation: [ { name: "ç¾å°", type: "text", disabled: row => row.state !== 1, clickFun: row => { signIn(row); }, }, { name: "ç¼è¾", type: "text", disabled: row => row.state !== 0, clickFun: row => { openForm("edit", row); }, }, { name: "导åº", type: "danger", type: "text", clickFun: row => { exportKnowledge(row); }, color: "#C49000", }, { name: "éä»¶", type: "danger", type: "text", clickFun: row => { downLoadFile(row); }, color: "#007AFF", }, { name: "ç»ææç»", type: "text", // disabled: row => row.state !== 2, clickFun: row => { viewResultDetail(row); }, }, // { @@ -457,12 +634,133 @@ const userList = ref([]); // çå½å¨æ onMounted(() => { getCurrentFactoryName(); getList(); startAutoRefresh(); userListNoPage().then(res => { userList.value = res.data; }); }); const endform = ref({ assessmentUserId: "", //è¯ä»·äºº assessmentUserName: "", //è¯ä»·äººå§å assessmentMethod: "", //èæ ¸æ¹å¼ assessmentDate: "", //è¯ä»·æ¶é´ comprehensiveAssessment: "", //综åè¯ä»· trainingAbstract: "", //å¹è®æè¦ safeTrainingFileList: [], //å¹è®éä»¶ safeTrainingDetailsDtoList: [], //èæ ¸ç»æè¯¦æ }); const operationType = ref("edit"); const viewResultDetail = row => { // fileList.value = []; operationType.value = "edit"; safeTrainingGet({ id: row.id }).then(res => { if (res.code === 200) { console.log(res.data, "res.data"); currentKnowledge.value = JSON.parse(JSON.stringify(res.data)); currentKnowledge.value.nums = row.nums; viewDialogVisible.value = true; endform.value = { ...res.data }; endform.value.assessmentUserName = endform.value.assessmentUserName ? endform.value.assessmentUserName : currentUserName.value; endform.value.assessmentUserId = endform.value.assessmentUserId ? endform.value.assessmentUserId : currentUserId.value; endform.value.assessmentDate = dayjs().format("YYYY-MM-DD"); } else { proxy.$modal.msgError(res.msg || "æ¥è¯¢è¯¦æ 失败"); } }); }; // ä¸ä¼ åæ ¡æ£ function handleBeforeUpload(file) { proxy.$modal.loading("æ£å¨ä¸ä¼ æä»¶ï¼è¯·ç¨å..."); return true; } // ä¸ä¼ 失败 function handleUploadError(err) { proxy.$modal.msgError("ä¸ä¼ æä»¶å¤±è´¥"); proxy.$modal.closeLoading(); } // ä¸ä¼ æååè° function handleUploadSuccess(res, file, uploadFiles) { proxy.$modal.closeLoading(); if (res.code === 200) { // ç¡®ä¿ tempFileIds åå¨ä¸ä¸ºæ°ç» if (!endform.value.safeTrainingFileList) { endform.value.safeTrainingFileList = []; } endform.value.safeTrainingFileList.push({ id: res.data.tempId, fileName: res.data.originalName, url: res.data.tempPath, safeTrainingId: currentKnowledge.value.id, }); proxy.$modal.msgSuccess("ä¸ä¼ æå"); } else { proxy.$modal.msgError(res.msg); proxy.$refs.fileUpload.handleRemove(file); } } // ç§»é¤æä»¶ function handleRemove(file) { if (operationType.value === "edit") { let index = endform.value.safeTrainingFileList.findIndex( item => item.fileName === file.name ); if (index !== -1) { endform.value.safeTrainingFileList.splice(index, 1); } } } const submitForm2 = () => { endform.value.safeTrainingDetailsDtoList.forEach((item, index) => { if (!item.examinationResults) { proxy.$modal.msgError(`è¯·éæ©${item.nickName}çèæ ¸ç»æ`); return; } }); console.log(endform.value, "endform.value"); proxy.$modal.loading("æ£å¨æäº¤ï¼è¯·ç¨å..."); safeTrainingSave(endform.value).then(res => { proxy.$modal.closeLoading(); if (res.code === 200) { proxy.$modal.msgSuccess("æäº¤æå"); getList(); viewDialogVisible.value = false; } else { proxy.$modal.msgError(res.msg || "æäº¤å¤±è´¥"); } }); }; const opendetail = row => { proxy.$router.push({ path: "/safeProduction/safetyTrainingAssessmentDetail", }); }; const signIn = row => { ElMessageBox.confirm("确认ç¾å°åï¼", "æç¤º", { confirmButtonText: "ç¡®å®", cancelButtonText: "åæ¶", type: "warning", }).then(() => { safeTrainingSign({ safeTrainingId: row.id, userId: currentUserId.value, }).then(res => { if (res.code === 200) { proxy.$modal.msgSuccess("ç¾å°æå"); getList(); } else { proxy.$modal.msgError(res.msg || "ç¾å°å¤±è´¥"); } }); }); }; // å¤çç¨æ·éæ©åå const handleUserChange = userId => { @@ -627,7 +925,7 @@ const url = window.URL.createObjectURL(blob); const link = document.createElement("a"); link.href = url; link.download = `å¹è®è®°å½_${row.courseCode}.xlsx`; link.download = `å¹è®è®°å½_${row.courseCode}.docx`; // 模æç¹å»ä¸è½½ document.body.appendChild(link); @@ -670,6 +968,13 @@ const handleSelectionChange = selection => { selectedIds.value = selection.map(item => item.id); }; const currentUserId = ref(""); const currentUserName = ref(""); const getCurrentFactoryName = async () => { let res = await userStore.getInfo(); currentUserId.value = res.user.userId; currentUserName.value = res.user.nickName; }; // æå¼è¡¨å const openForm = (type, row = null) => { @@ -710,12 +1015,6 @@ }); } dialogVisible.value = true; }; // æ¥çå¹è®è¯¦æ const viewKnowledge = row => { currentKnowledge.value = { ...row }; viewDialogVisible.value = true; }; // è·åç±»åæ ç¾ç±»å