Browse Source

拖拽排序等

master
han\hanst 1 month ago
parent
commit
91ad0398d9
  1. 10
      src/api/erf/erf.js
  2. 30
      src/views/modules/erf/components/erfAttachmentManager.vue
  3. 128
      src/views/modules/erf/components/expProjectDetail.vue
  4. 244
      src/views/modules/erf/components/expTriConfirm.vue
  5. 1413
      src/views/modules/erf/expApplyApproval.vue
  6. 269
      src/views/modules/erf/expApplyList.vue
  7. 79
      src/views/modules/sys/user-add-or-update.vue

10
src/api/erf/erf.js

@ -35,6 +35,11 @@ export const getSubmitApprovers = data => createAPI(`/erf/expApply/getSubmitAppr
*/ */
export const approveExpApply = data => createAPI(`/erf/expApply/approveExpApply`, 'post', data) export const approveExpApply = data => createAPI(`/erf/expApply/approveExpApply`, 'post', data)
/**
* 获取当前流程节点编码
*/
export const getCurrentNodeCode = data => createAPI(`/erf/expApply/getCurrentNodeCode`, 'post', data)
/** /**
* 撤回申请单 * 撤回申请单
*/ */
@ -101,3 +106,8 @@ export const saveTriConfirmProcess = data => createAPI(`/erf/triConfirm/saveTriC
* 删除三方确认工序 * 删除三方确认工序
*/ */
export const deleteTriConfirmProcess = data => createAPI(`/erf/triConfirm/deleteTriConfirmProcess`, 'post', data) export const deleteTriConfirmProcess = data => createAPI(`/erf/triConfirm/deleteTriConfirmProcess`, 'post', data)
/**
* 批量更新工序顺序用于拖拽排序
*/
export const updateProcessSequence = data => createAPI(`/erf/triConfirm/updateProcessSequence`, 'post', data)

30
src/views/modules/erf/components/erfAttachmentManager.vue

@ -4,14 +4,14 @@
<div style="margin-bottom: 10px"> <div style="margin-bottom: 10px">
<el-button <el-button
type="primary" type="primary"
size="small"
size="small" class="add-btn"
v-if="!disabled" v-if="!disabled"
@click="handleUpload"> @click="handleUpload">
上传附件 上传附件
</el-button> </el-button>
<el-button <el-button
type="primary" type="primary"
size="small"
size="small" class="reset-btn"
@click="handleDownload"> @click="handleDownload">
下载 下载
</el-button> </el-button>
@ -534,4 +534,30 @@ export default {
.el-table >>> .el-table__row td { .el-table >>> .el-table__row td {
padding: 8px 0; padding: 8px 0;
} }
/* 重置按钮 - 灰色扁平 */
.erf-attachment-manager .reset-btn {
background-color: #F5F7FA;
border-color: #D3D4D6;
color: #606266;
}
.erf-attachment-manager .reset-btn:hover {
background-color: #909399;
border-color: #909399;
color: #FFFFFF;
}
/* 新增按钮 - 绿色扁平 */
.erf-attachment-manager .add-btn {
background-color: #F0F9FF;
border-color: #C0E6C7;
color: #67C23A;
}
.erf-attachment-manager .add-btn:hover {
background-color: #67C23A;
border-color: #67C23A;
color: #FFFFFF;
}
</style> </style>

128
src/views/modules/erf/components/expProjectDetail.vue

@ -3,9 +3,8 @@
<!-- 顶部操作按钮 --> <!-- 顶部操作按钮 -->
<div class="toolbar"> <div class="toolbar">
<el-button <el-button
v-if="!editing && (status==='草稿' || status==='已驳回')"
@click="handleEdit" @click="handleEdit"
type="primary"
type="primary" class="add-btn"
size="small"> size="small">
编辑 编辑
</el-button> </el-button>
@ -13,12 +12,12 @@
v-if="editing" v-if="editing"
@click="handleSave" @click="handleSave"
type="primary" type="primary"
size="small"
size="small" class="add-btn"
:loading="saving"> :loading="saving">
保存 保存
</el-button> </el-button>
<el-button <el-button
v-if="editing"
v-if="editing" class="reset-btn"
@click="handleCancel" @click="handleCancel"
size="small"> size="small">
取消 取消
@ -91,12 +90,12 @@
placeholder="请输入试验申请数量"> placeholder="请输入试验申请数量">
</el-input> </el-input>
</el-form-item> </el-form-item>
<el-form-item style="margin-top: 35px" label="工艺、取样、测试要求(PartIII Process,Sampling,and Test Requirement)">
<el-form-item style="margin-top: 32px" label="工艺、取样、测试要求(PartIII Process,Sampling,and Test Requirement)">
<el-input <el-input
v-model="formData.processRequirement" v-model="formData.processRequirement"
type="textarea" type="textarea"
:readonly="!editing" :readonly="!editing"
:rows="9"
:rows="10"
placeholder="请输入工艺、取样、测试要求"> placeholder="请输入工艺、取样、测试要求">
</el-input> </el-input>
</el-form-item> </el-form-item>
@ -301,44 +300,131 @@ export default {
} }
.toolbar { .toolbar {
margin-bottom: 5px;
padding-bottom: 5px;
border-bottom: 1px solid #EBEEF5;
margin-bottom: 2px;
padding-bottom: 2px;
text-align: left; text-align: left;
} }
/* 表单容器增加卡片效果 */
.el-form {
background-color: #fff;
padding: 10px;
border-radius: 4px;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
}
.el-form-item { .el-form-item {
margin-bottom: 15px;
margin-bottom: 16px;
} }
/* 只读状态的input样式 */
/* 增强label样式 - 更明显的视觉层次 */
.el-form-item >>> .el-form-item__label {
font-size: 13px;
color: #303133;
font-weight: 600;
padding-bottom: 8px;
line-height: 1.5;
display: block;
}
/* 编辑状态的input样式 - 清晰的边框 */
.el-input >>> input {
border: 1px solid #DCDFE6;
border-radius: 4px;
padding: 10px 12px;
font-size: 13px;
transition: all 0.3s;
}
.el-input >>> input:focus {
border-color: #409EFF;
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
.el-input >>> textarea {
border: 1px solid #DCDFE6;
border-radius: 4px;
padding: 10px 12px;
font-size: 13px;
line-height: 1.6;
transition: all 0.3s;
}
.el-input >>> textarea:focus {
border-color: #409EFF;
box-shadow: 0 0 0 2px rgba(64, 158, 255, 0.1);
}
/* 只读状态的input样式 - 更明显的区分 */
.el-input >>> input[readonly] { .el-input >>> input[readonly] {
background-color: #F5F7FA;
border-color: #DCDFE6;
background-color: #FAFAFA;
border: 1px solid #E4E7ED;
color: #606266; color: #606266;
cursor: default; cursor: default;
font-size: 13px;
} }
.el-input >>> textarea[readonly] { .el-input >>> textarea[readonly] {
background-color: #F5F7FA;
border-color: #DCDFE6;
background-color: #FAFAFA;
border: 1px solid #E4E7ED;
color: #606266; color: #606266;
cursor: default; cursor: default;
font-size: 13px;
line-height: 1.6;
} }
/* 禁用状态的日期选择器样式 */ /* 禁用状态的日期选择器样式 */
.el-date-editor.is-disabled >>> .el-input__inner { .el-date-editor.is-disabled >>> .el-input__inner {
background-color: #F5F7FA;
border-color: #DCDFE6;
background-color: #FAFAFA;
border: 1px solid #E4E7ED;
color: #606266; color: #606266;
cursor: default; cursor: default;
font-size: 13px;
} }
/* 调整label样式 */
.el-form-item >>> .el-form-item__label {
.el-date-editor >>> .el-input__inner {
padding: 10px 12px;
font-size: 13px; font-size: 13px;
}
/* 重置按钮 - 灰色扁平 */
.exp-project-detail .reset-btn {
background-color: #F5F7FA;
border-color: #D3D4D6;
color: #606266; color: #606266;
font-weight: normal;
padding-bottom: 5px;
padding: 9px 15px;
font-size: 13px;
}
.exp-project-detail .reset-btn:hover {
background-color: #909399;
border-color: #909399;
color: #FFFFFF;
}
/* 新增按钮 - 绿色扁平 */
.exp-project-detail .add-btn {
background-color: #F0F9FF;
border-color: #C0E6C7;
color: #67C23A;
padding: 9px 15px;
font-size: 13px;
}
.exp-project-detail .add-btn:hover {
background-color: #67C23A;
border-color: #67C23A;
color: #FFFFFF;
}
/* 增加行间距,让布局更舒适 */
.el-row {
margin-bottom: 0;
}
/* 调整列间距 */
.el-col {
padding-left: 10px;
padding-right: 10px;
} }
</style> </style>

244
src/views/modules/erf/components/expTriConfirm.vue

@ -2,15 +2,18 @@
<div class="exp-tri-confirm"> <div class="exp-tri-confirm">
<!-- 操作按钮 --> <!-- 操作按钮 -->
<div class="toolbar"> <div class="toolbar">
<el-button @click="openAddDialog" type="primary" size="small">新增</el-button>
<el-button @click="openAddDialog" type="primary" class="add-btn" size="small">新增</el-button>
</div> </div>
<!-- 三方确认表格 --> <!-- 三方确认表格 -->
<el-table <el-table
ref="processTable"
:key="tableKey"
:data="processList" :data="processList"
v-loading="loading" v-loading="loading"
border border
:height="height" :height="height"
class="tri-confirm-table"
style="width: 100%;"> style="width: 100%;">
<el-table-column <el-table-column
@ -20,7 +23,8 @@
header-align="center"> header-align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<el-tag :type="getSeqTagType(scope.row)" size="small"> <el-tag :type="getSeqTagType(scope.row)" size="small">
{{ scope.row.processSeq }}
<i class="el-icon-rank" style="margin-right: 4px; cursor: move;"></i>
{{ scope.row.processSeq }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
@ -262,7 +266,8 @@
</template> </template>
<script> <script>
import { getTriConfirmList, saveTriConfirmProcess, deleteTriConfirmProcess, confirmTriApproval } from '@/api/erf/erf'
import { getTriConfirmList, saveTriConfirmProcess, deleteTriConfirmProcess, confirmTriApproval, updateProcessSequence } from '@/api/erf/erf'
import Sortable from 'sortablejs'
export default { export default {
name: 'ExpTriConfirm', name: 'ExpTriConfirm',
@ -282,6 +287,7 @@ export default {
return { return {
processList: [], processList: [],
loading: false, loading: false,
tableKey: 0, //
// / // /
processDialogVisible: false, processDialogVisible: false,
@ -304,7 +310,11 @@ export default {
confirmLoading: false, confirmLoading: false,
currentProcess: null, currentProcess: null,
currentRoleType: '', currentRoleType: '',
currentTime: ''
currentTime: '',
//
sortableInstance: null, // Sortable
isDragging: false //
} }
}, },
@ -319,18 +329,65 @@ export default {
} }
}, },
mounted() {
//
this.$nextTick(() => {
this.initTableRowDrag()
})
},
beforeDestroy() {
// Sortable
if (this.sortableInstance) {
this.sortableInstance.destroy()
this.sortableInstance = null
}
},
methods: { methods: {
/** /**
* 加载工序列表 * 加载工序列表
*/ */
loadProcessList() { loadProcessList() {
console.log('📥 === 开始加载工序列表 === applyNo:', this.applyNo)
// Sortable
if (this.sortableInstance) {
console.log('🗑️ 销毁旧的 Sortable 实例')
this.sortableInstance.destroy()
this.sortableInstance = null
}
this.loading = true this.loading = true
getTriConfirmList({ applyNo: this.applyNo }).then(({data}) => { getTriConfirmList({ applyNo: this.applyNo }).then(({data}) => {
this.loading = false this.loading = false
if (data && data.code === 0) { if (data && data.code === 0) {
console.log('📦 原始数据 (排序前):', data.list.map(item =>
`${item.processStep}(序号${item.processSeq})`
).join(', '))
// //
this.processList = (data.list || []).sort((a, b) => { this.processList = (data.list || []).sort((a, b) => {
return (a.processSeq || 0) - (b.processSeq || 0)
const result = (a.processSeq || 0) - (b.processSeq || 0)
console.log(` 排序比较: ${a.processStep}(${a.processSeq}) vs ${b.processStep}(${b.processSeq}) = ${result}`)
return result
})
console.log('✅ 工序列表加载完成 (排序后):', this.processList.map(item =>
`${item.processStep}(序号${item.processSeq})`
).join(', '))
//
this.tableKey++
console.log('🔄 强制刷新表格,tableKey:', this.tableKey)
//
this.$nextTick(() => {
console.log('⏳ 等待 DOM 更新完成...')
setTimeout(() => {
console.log('🎯 开始重新初始化拖拽功能')
this.initTableRowDrag()
}, 100) //
}) })
} else { } else {
this.processList = [] this.processList = []
@ -338,6 +395,7 @@ export default {
} }
}).catch(error => { }).catch(error => {
this.loading = false this.loading = false
console.error('❌ 加载工序列表异常:', error)
this.$message.error('加载三方确认列表异常') this.$message.error('加载三方确认列表异常')
}) })
}, },
@ -537,6 +595,138 @@ export default {
const minutes = String(date.getMinutes()).padStart(2, '0') const minutes = String(date.getMinutes()).padStart(2, '0')
const seconds = String(date.getSeconds()).padStart(2, '0') const seconds = String(date.getSeconds()).padStart(2, '0')
return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}` return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
},
/**
* 初始化表格行拖拽排序功能
* 拖拽后自动重新计算序号并保存到数据库
*/
initTableRowDrag() {
console.log('🎯 开始初始化表格拖拽排序功能')
//
if (this.isDragging) {
console.log('⚠️ 正在拖拽中,跳过初始化')
return
}
// Sortable
if (this.sortableInstance) {
console.log('🗑️ 销毁旧的 Sortable 实例')
this.sortableInstance.destroy()
this.sortableInstance = null
}
// 使 ref
const tableEl = this.$refs.processTable
if (!tableEl || !tableEl.$el) {
console.warn('⚠️ 表格 ref 不存在,拖拽功能初始化失败')
return
}
const el = tableEl.$el.querySelector('.el-table__body-wrapper tbody')
if (!el) {
console.warn('⚠️ 未找到表格 tbody 元素,拖拽功能初始化失败')
return
}
console.log('✅ 找到表格 tbody,当前有', el.children.length, '行')
// Sortable
this.sortableInstance = Sortable.create(el, {
animation: 150,
handle: 'tr', //
ghostClass: 'sortable-ghost',
chosenClass: 'sortable-chosen',
dragClass: 'sortable-drag',
onStart: () => {
console.log('🖱️ 开始拖拽')
this.isDragging = true
},
onEnd: (evt) => {
const { oldIndex, newIndex } = evt
console.log(`🎬 拖拽结束: oldIndex=${oldIndex}, newIndex=${newIndex}`)
this.isDragging = false
if (oldIndex === newIndex) {
console.log('位置未变化,无需更新')
return
}
console.log(`🔄 拖拽: 从位置 ${oldIndex} (${this.processList[oldIndex].processStep},序号${this.processList[oldIndex].processSeq}) 移动到位置 ${newIndex}`)
// 1.
const movedItem = this.processList.splice(oldIndex, 1)[0]
this.processList.splice(newIndex, 0, movedItem)
// 2. 1- 使 Vue.set
this.processList.forEach((item, index) => {
this.$set(item, 'processSeq', index + 1)
})
console.log('📝 拖拽后新序号:', this.processList.map((item, idx) =>
`位置${idx}: ${item.processStep} (序号${item.processSeq})`
).join(', '))
// 4. 使 nextTick DOM
this.$nextTick(() => {
// 5.
this.saveProcessSequence()
})
}
})
},
/**
* 保存工序顺序到数据库
*/
saveProcessSequence() {
if (this.processList.length === 0) {
return
}
console.log('💾 === 拖拽排序保存开始 ===')
console.log('准备保存的工序顺序:')
this.processList.forEach((item, index) => {
console.log(` 位置${index}: ${item.processStep} → 新序号 ${item.processSeq}`)
})
//
const processSteps = this.processList.map(item => item.processStep)
// loading
const loadingInstance = this.$loading({
lock: true,
text: '正在保存排序...',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.7)'
})
// API
updateProcessSequence({
applyNo: this.applyNo,
processSteps: processSteps
}).then(({data}) => {
loadingInstance.close()
if (data && data.code === 0) {
this.$message.success('排序保存成功')
console.log('✅ === 拖拽排序保存完成 ===')
//
setTimeout(() => {
this.loadProcessList()
}, 300)
} else {
this.$message.error(data.msg || '排序保存失败')
//
this.loadProcessList()
}
}).catch(error => {
loadingInstance.close()
this.$message.error('排序保存异常')
console.error('保存排序异常:', error)
//
this.loadProcessList()
})
} }
} }
} }
@ -566,4 +756,48 @@ export default {
.el-table >>> .el-table__row td { .el-table >>> .el-table__row td {
padding: 8px 0; padding: 8px 0;
} }
/* 新增按钮 - 绿色扁平 */
.exp-tri-confirm .add-btn {
background-color: #F0F9FF;
border-color: #C0E6C7;
color: #67C23A;
}
.exp-tri-confirm .add-btn:hover {
background-color: #67C23A;
border-color: #67C23A;
color: #FFFFFF;
}
/* 拖拽排序样式 */
.tri-confirm-table >>> tbody tr {
cursor: move;
}
.tri-confirm-table >>> tbody tr:hover {
background-color: #f5f7fa !important;
}
/* 拖拽时的样式 */
.sortable-ghost {
opacity: 0.4;
background-color: #e3f2fd !important;
}
.sortable-chosen {
background-color: #e3f2fd !important;
}
.sortable-drag {
background-color: #ffffff;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.3);
opacity: 0.9;
}
/* 拖拽图标提示 */
.tri-confirm-table >>> .el-tag .el-icon-rank {
font-size: 12px;
vertical-align: middle;
}
</style> </style>

1413
src/views/modules/erf/expApplyApproval.vue
File diff suppressed because it is too large
View File

269
src/views/modules/erf/expApplyList.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="mod-config">
<div class="mod-config exp-apply-page">
<!-- 查询条件表单 --> <!-- 查询条件表单 -->
<el-form :inline="true" label-position="top">
<el-form :inline="true" label-position="top" class="query-form">
<el-form-item label="申请单号"> <el-form-item label="申请单号">
<el-input v-model="queryHeaderData.applyNo" placeholder="请输入申请单号" clearable style="width: 150px"></el-input> <el-input v-model="queryHeaderData.applyNo" placeholder="请输入申请单号" clearable style="width: 150px"></el-input>
</el-form-item> </el-form-item>
@ -72,10 +72,10 @@
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label=" ">
<el-button @click="getDataList('Y')" type="primary">查询</el-button>
<el-button @click="resetQuery()" type="default">重置</el-button>
<el-button @click="openCreateDialog()" type="primary">新增申请单</el-button>
<el-form-item label=" " style="margin-top: -11px">
<el-button @click="getDataList('Y')" type="primary" plain class="search-btn">查询</el-button>
<el-button @click="resetQuery()" plain class="reset-btn">重置</el-button>
<el-button @click="openCreateDialog()" type="success" plain class="add-btn">新增申请单</el-button>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -87,47 +87,33 @@
:data="dataList" :data="dataList"
v-loading="dataListLoading" v-loading="dataListLoading"
border border
stripe
class="data-table"
style="width: 100%;" style="width: 100%;"
:height="tableHeight"> :height="tableHeight">
<el-table-column <el-table-column
label="操作" label="操作"
width="180"
width="120"
align="center" align="center"
header-align="center"
fixed="left">
header-align="center">
<template slot-scope="scope"> <template slot-scope="scope">
<a type="text" size="small" @click="viewDetail(scope.row)">查看</a>
<a <a
v-if="scope.row.status === '草稿' || scope.row.status === '已驳回'"
type="text"
size="small"
@click="editApply(scope.row)">修改</a> @click="editApply(scope.row)">修改</a>
<a <a
v-if="scope.row.status === '草稿' || scope.row.status === '已驳回'" v-if="scope.row.status === '草稿' || scope.row.status === '已驳回'"
type="text"
size="small"
style="color: green"
@click="submitApply(scope.row)">{{ scope.row.status === '已驳回' ? '重新下达' : '下达' }}</a> @click="submitApply(scope.row)">{{ scope.row.status === '已驳回' ? '重新下达' : '下达' }}</a>
<a <a
v-if="scope.row.status === '草稿'" v-if="scope.row.status === '草稿'"
type="text"
size="small"
style="color: red"
@click="deleteApply(scope.row)">删除</a> @click="deleteApply(scope.row)">删除</a>
<a <a
v-if="scope.row.status !== '草稿' && scope.row.status !== '已完成' && scope.row.status !== '已驳回'" v-if="scope.row.status !== '草稿' && scope.row.status !== '已完成' && scope.row.status !== '已驳回'"
type="text"
size="small"
style="color: orange"
@click="withdrawApply(scope.row)">撤回</a> @click="withdrawApply(scope.row)">撤回</a>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="buDesc" prop="buDesc"
label="事业部" label="事业部"
width="80"
width="70"
align="center" align="center"
header-align="center"> header-align="center">
</el-table-column> </el-table-column>
@ -151,14 +137,14 @@
prop="experimentType" prop="experimentType"
label="试验类型" label="试验类型"
width="100" width="100"
align="center"
align="center" show-overflow-tooltip
header-align="center"> header-align="center">
</el-table-column> </el-table-column>
<el-table-column <el-table-column
prop="title" prop="title"
label="试验名称" label="试验名称"
min-width="200"
min-width="120"
align="left" align="left"
header-align="center" header-align="center"
show-overflow-tooltip> show-overflow-tooltip>
@ -167,7 +153,7 @@
<el-table-column <el-table-column
prop="projectNo" prop="projectNo"
label="项目编号" label="项目编号"
width="120"
width="100"
align="center" align="center"
header-align="center" header-align="center"
show-overflow-tooltip> show-overflow-tooltip>
@ -176,7 +162,7 @@
<el-table-column <el-table-column
prop="productType" prop="productType"
label="产品型号" label="产品型号"
min-width="200"
min-width="220"
align="center" align="center"
header-align="center" header-align="center"
show-overflow-tooltip> show-overflow-tooltip>
@ -201,8 +187,8 @@
<el-table-column <el-table-column
prop="createTime" prop="createTime"
label="创建时间" label="创建时间"
width="120"
align="center"
min-width="100"
align="center" show-overflow-tooltip
header-align="center"> header-align="center">
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -227,7 +213,7 @@
@tab-click="handleTabClick"> @tab-click="handleTabClick">
<!-- Tab 1: 项目详情 --> <!-- Tab 1: 项目详情 -->
<el-tab-pane :label="getProjectDetailLabel()" name="projectDetail">
<!-- <el-tab-pane :label="getProjectDetailLabel()" name="projectDetail">
<exp-project-detail <exp-project-detail
v-if="currentRow.applyNo" v-if="currentRow.applyNo"
ref="projectDetail" ref="projectDetail"
@ -239,8 +225,19 @@
<div v-else class="empty-tip"> <div v-else class="empty-tip">
请在上方表格中选择一条申请单记录 请在上方表格中选择一条申请单记录
</div> </div>
</el-tab-pane>-->
<el-tab-pane label="附件上传" name="attachment">
<erf-attachment-manager
v-if="currentRow.applyNo"
ref="attachmentManager"
:apply-no="currentRow.applyNo"
:disabled="false"
:height="detailHeight">
</erf-attachment-manager>
<div v-else class="empty-tip">
请在上方表格中选择一条申请单记录
</div>
</el-tab-pane> </el-tab-pane>
<!-- Tab 2: 三方确认 --> <!-- Tab 2: 三方确认 -->
<el-tab-pane label="三方确认" v-if="currentRow.experimentType==='High Risk'" name="triConfirm"> <el-tab-pane label="三方确认" v-if="currentRow.experimentType==='High Risk'" name="triConfirm">
<exp-tri-confirm <exp-tri-confirm
@ -254,19 +251,8 @@
</div> </div>
</el-tab-pane> </el-tab-pane>
<!-- Tab 3: 附件图纸上传 -->
<el-tab-pane label="附件图纸上传" name="attachment">
<erf-attachment-manager
v-if="currentRow.applyNo"
ref="attachmentManager"
:apply-no="currentRow.applyNo"
:disabled="false"
:height="detailHeight">
</erf-attachment-manager>
<div v-else class="empty-tip">
请在上方表格中选择一条申请单记录
</div>
</el-tab-pane>
<!-- Tab 3: 附件上传 -->
<!-- Tab 4: 审批状态和日志 --> <!-- Tab 4: 审批状态和日志 -->
<el-tab-pane label="审批状态和日志" name="approvalStatus"> <el-tab-pane label="审批状态和日志" name="approvalStatus">
@ -506,10 +492,10 @@ export default {
currentRow: {}, currentRow: {},
// Tab // Tab
activeName: 'projectDetail',
activeName: 'attachment',
// //
tableHeight: (window.innerHeight - 250)/2,
tableHeight: (window.innerHeight - 260)/2,
detailHeight: '35vh', detailHeight: '35vh',
// //
@ -796,7 +782,7 @@ export default {
if (app.checkApprovalNotifications) { if (app.checkApprovalNotifications) {
// 1 // 1
setTimeout(() => { setTimeout(() => {
app.checkApprovalNotifications()
//app.checkApprovalNotifications()
console.log('[审批通知] 已触发手动检查') console.log('[审批通知] 已触发手动检查')
}, 1000) }, 1000)
} }
@ -904,7 +890,7 @@ export default {
this.loadFlowStatus() this.loadFlowStatus()
} else { } else {
// tab // tab
this.activeName = 'projectDetail'
this.activeName = 'attachment'
} }
}, },
@ -1072,6 +1058,191 @@ export default {
font-size: 14px; font-size: 14px;
} }
/* ==================== 页面专属样式 - 不影响全局 ==================== */
/* 查询表单样式 */
.exp-apply-page .query-form {
background-color: #FFFFFF;
padding: 15px 15px 5px 15px;
border-radius: 4px;
}
.exp-apply-page .query-form >>> .el-form-item__label {
color: #333333;
font-size: 13px;
padding-bottom: 5px;
}
.exp-apply-page .query-form >>> .el-input__inner {
height: 32px;
line-height: 32px;
border-radius: 4px;
border: 1px solid #DCDFE6;
font-size: 13px;
}
.exp-apply-page .query-form >>> .el-input__inner::placeholder {
color: #C0C4CC;
font-size: 13px;
}
.exp-apply-page .query-form >>> .el-select .el-input__inner {
border-radius: 4px;
}
.exp-apply-page .query-form >>> .el-date-editor .el-input__inner {
border-radius: 4px;
}
/* 按钮样式 - 扁平化风格 */
.exp-apply-page >>> .el-button {
height: 32px;
padding: 0 15px;
font-size: 13px;
border-radius: 4px;
}
/* 查询按钮 - 蓝色扁平 */
.exp-apply-page .search-btn {
background-color: #ECF5FF;
border-color: #B3D8FF;
color: #409EFF;
}
.exp-apply-page .search-btn:hover {
background-color: #409EFF;
border-color: #409EFF;
color: #FFFFFF;
}
/* 重置按钮 - 灰色扁平 */
.exp-apply-page .reset-btn {
background-color: #F5F7FA;
border-color: #D3D4D6;
color: #606266;
}
.exp-apply-page .reset-btn:hover {
background-color: #909399;
border-color: #909399;
color: #FFFFFF;
}
/* 新增按钮 - 绿色扁平 */
.exp-apply-page .add-btn {
background-color: #F0F9FF;
border-color: #C0E6C7;
color: #67C23A;
}
.exp-apply-page .add-btn:hover {
background-color: #67C23A;
border-color: #67C23A;
color: #FFFFFF;
}
/* 数据表格样式 */
.exp-apply-page .data-table {
background-color: #FFFFFF;
border-radius: 4px;
}
.exp-apply-page .data-table >>> .el-table__header-wrapper th {
background-color: #F5F7FA !important;
color: #333333;
font-weight: 600;
font-size: 16px;
border-color: #EBEEF5;
padding: 10px 0;
height: auto;
}
/* 固定列表头也使用相同背景色 */
.exp-apply-page .data-table >>> .el-table__fixed-header-wrapper th {
background-color: #F5F7FA !important;
color: #333333;
font-weight: 600;
font-size: 16px;
border-color: #EBEEF5;
padding: 12px 0;
height: auto;
}
.exp-apply-page .data-table >>> .el-table__header-wrapper .cell {
text-align: center;
padding: 0 10px;
//line-height: 2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 13px !important;
}
.exp-apply-page .data-table >>> .el-table__fixed-header-wrapper .cell {
text-align: center;
padding: 0 10px;
//line-height: 2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.exp-apply-page .data-table >>> .el-table__body-wrapper td {
border-color: #EBEEF5;
padding: 12px 0;
font-size: 16px;
color: #606266;
height: auto;
}
/* 固定列数据行也使用相同样式 */
.exp-apply-page .data-table >>> .el-table__fixed-body-wrapper td {
border-color: #EBEEF5;
padding: 12px 0;
font-size: 16px;
color: #606266;
height: auto;
}
.exp-apply-page .data-table >>> .el-table__body-wrapper .cell {
padding: 0 10px;
//line-height: 2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
font-size: 13px !important;
}
.exp-apply-page .data-table >>> .el-table__fixed-body-wrapper .cell {
padding: 0 10px;
//line-height: 2;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
/* 操作列链接样式 - 统一蓝色样式 */
.exp-apply-page .data-table >>> .el-table__body-wrapper a {
text-decoration: none;
cursor: pointer;
font-size: 13px;
color: #409EFF !important;
white-space: nowrap;
}
.exp-apply-page .data-table >>> .el-table__body-wrapper a:hover {
color: #66B1FF !important;
text-decoration: underline;
}
.exp-apply-page .data-table >>> .el-table__body tr:hover > td {
background-color: #F5F7FA !important;
}
.exp-apply-page .data-table >>> .el-table__body tr.current-row > td {
background-color: #ECF5FF !important;
}
/* Tab样式优化 - 两栏布局 */ /* Tab样式优化 - 两栏布局 */
/* 两栏布局容器 */ /* 两栏布局容器 */

79
src/views/modules/sys/user-add-or-update.vue

@ -1,7 +1,7 @@
<template> <template>
<div class="user-add-or-update"> <div class="user-add-or-update">
<el-dialog <el-dialog
width="530px"
width="700px"
@close="closeDialog" @close="closeDialog"
:title="!dataForm.id ? buttons.add :buttons.edit" :title="!dataForm.id ? buttons.add :buttons.edit"
:close-on-click-modal="false" :close-on-click-modal="false"
@ -18,25 +18,23 @@
<el-form-item :label="buttons.comfirmPassword||'确认密码'" prop="comfirmPassword" :class="{ 'is-required': !dataForm.id }"> <el-form-item :label="buttons.comfirmPassword||'确认密码'" prop="comfirmPassword" :class="{ 'is-required': !dataForm.id }">
<el-input v-model="dataForm.comfirmPassword" style="width: 150px;" type="password"></el-input> <el-input v-model="dataForm.comfirmPassword" style="width: 150px;" type="password"></el-input>
</el-form-item> </el-form-item>
</el-form>
<el-form>
<el-form-item :label="buttons.userDisplay||'用户名'" prop="email"> <el-form-item :label="buttons.userDisplay||'用户名'" prop="email">
<el-input v-model="dataForm.userDisplay" style="width: 150px;" ></el-input> <el-input v-model="dataForm.userDisplay" style="width: 150px;" ></el-input>
</el-form-item> </el-form-item>
</el-form>
<el-form>
<el-form-item :label="buttons.email||'邮箱'" prop="email"> <el-form-item :label="buttons.email||'邮箱'" prop="email">
<el-input v-model="dataForm.email" style="width: 150px;" ></el-input> <el-input v-model="dataForm.email" style="width: 150px;" ></el-input>
</el-form-item> </el-form-item>
<el-form-item :label="buttons.mobile||'手机号'" prop="mobile"> <el-form-item :label="buttons.mobile||'手机号'" prop="mobile">
<el-input v-model="dataForm.mobile" style="width: 150px;" placeholder="手机号"></el-input> <el-input v-model="dataForm.mobile" style="width: 150px;" placeholder="手机号"></el-input>
</el-form-item> </el-form-item>
</el-form>
<el-form>
<el-form-item> <el-form-item>
<span slot="label" style="" @click="getBaseList(93)"><a herf="#">{{buttons.site||'工厂'}}</a></span> <span slot="label" style="" @click="getBaseList(93)"><a herf="#">{{buttons.site||'工厂'}}</a></span>
<el-input v-model="dataForm.site" style="width: 150px;" placeholder="工厂"></el-input> <el-input v-model="dataForm.site" style="width: 150px;" placeholder="工厂"></el-input>
</el-form-item> </el-form-item>
<el-form-item label="车间"> <el-form-item label="车间">
<el-select v-model="dataForm.workShopId" placeholder="请选择" clearable>
<el-select style="width: 150px;" v-model="dataForm.workShopId" placeholder="请选择" clearable>
<el-option <el-option
v-for = "i in workShopList" v-for = "i in workShopList"
:key = "i.workShopId" :key = "i.workShopId"
@ -49,11 +47,25 @@
<el-form> <el-form>
<el-form-item label="角色" size="mini" prop="roleIdList"> <el-form-item label="角色" size="mini" prop="roleIdList">
<el-checkbox-group v-model="dataForm.roleIdList"> <el-checkbox-group v-model="dataForm.roleIdList">
<el-checkbox
v-for="role in roleList"
:key="role.roleId"
:label="role.roleId">{{role.roleName}}
</el-checkbox>
<!-- 其他角色组 -->
<div v-if="otherRoleList.length > 0">
<el-checkbox
v-for="role in otherRoleList"
:key="role.roleId"
:label="role.roleId">{{role.roleName}}
</el-checkbox>
</div>
<!-- 工程实验申请角色组 -->
<div v-if="erfRoleList.length > 0" style="margin-bottom: 15px;">
<div style="font-weight: bold; color: #409EFF; margin-bottom: 8px; font-size: 13px;">
工程实验申请专用角色
</div>
<el-checkbox
v-for="role in erfRoleList"
:key="role.roleId"
:label="role.roleId">{{role.roleName}}
</el-checkbox>
</div>
</el-checkbox-group> </el-checkbox-group>
</el-form-item> </el-form-item>
</el-form> </el-form>
@ -130,6 +142,26 @@ export default {
workShopList:[], workShopList:[],
} }
}, },
computed: {
/**
* 工程实验申请相关角色列表
* 根据remark字段包含"工程实验申请"进行过滤
*/
erfRoleList() {
return this.roleList.filter(role => {
return role.remark && role.remark.includes('工程实验申请')
})
},
/**
* 其他角色列表
* 不包含"工程实验申请"的角色
*/
otherRoleList() {
return this.roleList.filter(role => {
return !role.remark || !role.remark.includes('工程实验申请')
})
}
},
methods: { methods: {
getFunctionButtonList() { getFunctionButtonList() {
let queryButton = { let queryButton = {
@ -263,5 +295,30 @@ export default {
} }
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
//
::v-deep .el-checkbox-group {
display: block;
.el-checkbox {
margin-right: 15px;
margin-bottom: 8px;
}
}
//
.el-form-item ::v-deep .el-checkbox-group > div {
padding: 10px;
background-color: #f5f7fa;
border-radius: 4px;
&:first-child {
background-color: #ecf5ff;
border: 1px solid #d9ecff;
}
&:last-child {
background-color: #f5f7fa;
border: 1px solid #e4e7ed;
}
}
</style> </style>
Loading…
Cancel
Save