Merge remote-tracking branch 'origin/0.8.X' into 0.8.X

This commit is contained in:
2026-05-18 15:18:09 +08:00
4 changed files with 166 additions and 162 deletions

View File

@@ -64,6 +64,14 @@
<el-input v-model="form.taskCode" placeholder="请输入任务编号" style="width: 280px;" />
</el-form-item>
</el-form>
<el-form :model="form" ref="taskForm" label-width="80px" size="small">
<el-form-item label="任务类型" prop="taskType" :rules="[{ required: true, message: '请选择任务类型', trigger: 'blur' }]">
<el-select v-model="form.taskType" placeholder="请选择任务类型" style="width: 280px;">
<el-option label="内控检验" value="内控检验" />
<el-option label="产品检验" value="产品检验" />
</el-select>
</el-form-item>
</el-form>
<div style="margin-bottom: 8px;">
<CoilSelector use-trigger multiple @confirm="handleCoilConfirm">
<el-button type="primary" plain icon="el-icon-plus" size="small">选择钢卷</el-button>
@@ -207,6 +215,7 @@ export default {
},
handleSchemeClick(row) {
this.selectedTemplate = row;
this.form.belongCompany = row.templateUnit || undefined;
this.loadCheckItems(row);
},
loadCheckItems(template) {
@@ -236,6 +245,8 @@ export default {
this.$emit("confirm", {
template: this.selectedTemplate,
taskCode: this.form.taskCode,
taskType: this.form.taskType,
belongCompany: this.form.belongCompany || undefined,
coilIds: coilIds || undefined
});
this.dialogVisible = false;

View File

@@ -48,6 +48,8 @@
<el-button size="mini" type="text" icon="el-icon-printer" @click="handlePrintLabel(scope.row)">
打印标签
</el-button>
<el-button size="mini" type="text" icon="el-icon-search"
@click="handleDigitalCoilNo(scope.row)">数字钢卷</el-button>
<el-button size="mini" type="text" icon="el-icon-search" @click="handleTrace(scope.row)">追溯</el-button>
</template>
</el-table-column>
@@ -168,6 +170,12 @@ export default {
this.$refs.labelRender.printLabel();
})
},
/** 数字钢卷按钮操作 */
handleDigitalCoilNo(row) {
this.$router.push({
path: '/wms/coil/' + row.coilId,
});
},
/** 追溯按钮操作 */
handleTrace(row) {
this.trace.open = true;

View File

@@ -1,37 +1,43 @@
<template>
<div class="app-container">
<el-form :model="taskQueryParams" ref="taskQueryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<div style="margin-bottom: 16px;">
<div style="display: flex; align-items: center; margin-bottom: 6px;">
<span
style="font-size: 13px; color: #909399; white-space: nowrap; margin-right: 12px; width: 68px; text-align: right;">所属单位</span>
<el-radio-group v-model="selectedCompany" @change="handleCompanyChange" size="small">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button v-for="company in companyOptions" :key="company" :label="company">{{ company }}</el-radio-button>
</el-radio-group>
</div>
<div v-if="selectedCompany" style="display: flex; align-items: center;">
<span
style="font-size: 13px; color: #909399; white-space: nowrap; margin-right: 12px; width: 68px; text-align: right;">方案名称</span>
<el-radio-group v-model="selectedScheme" @change="handleSchemeChange" size="small">
<el-radio-button label="">全部</el-radio-button>
<el-radio-button v-for="scheme in schemeOptions" :key="scheme" :label="scheme">{{ scheme }}</el-radio-button>
</el-radio-group>
</div>
</div>
<el-form :model="taskQueryParams" ref="taskQueryForm" size="small" :inline="true" v-show="showSearch"
label-width="68px">
<el-form-item label="任务编号" prop="taskCode">
<el-input
v-model="taskQueryParams.taskCode"
placeholder="请输入任务编号"
clearable
@keyup.enter.native="handleTaskQuery"
/>
<el-input v-model="taskQueryParams.taskCode" placeholder="请输入任务编号" clearable
@keyup.enter.native="handleTaskQuery" />
</el-form-item>
<el-form-item label="方案名称" prop="schemeName">
<el-input
v-model="taskQueryParams.schemeName"
placeholder="请输入检验方案名称"
clearable
@keyup.enter.native="handleTaskQuery"
/>
<el-form-item label="任务类型" prop="taskType">
<el-select v-model="taskQueryParams.taskType" placeholder="请选择任务类型" clearable filterable allow-create>
<el-option label="内控检验" value="内控检验" />
<el-option label="产品检验" value="产品检验" />
</el-select>
</el-form-item>
<el-form-item label="检验人" prop="inspectUser">
<el-input
v-model="taskQueryParams.inspectUser"
placeholder="请输入检验人"
clearable
@keyup.enter.native="handleTaskQuery"
/>
<el-input v-model="taskQueryParams.inspectUser" placeholder="请输入检验人" clearable
@keyup.enter.native="handleTaskQuery" />
</el-form-item>
<el-form-item label="审核人" prop="auditUser">
<el-input
v-model="taskQueryParams.auditUser"
placeholder="请输入审核人"
clearable
@keyup.enter.native="handleTaskQuery"
/>
<el-input v-model="taskQueryParams.auditUser" placeholder="请输入审核人" clearable
@keyup.enter.native="handleTaskQuery" />
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleTaskQuery">搜索</el-button>
@@ -41,91 +47,62 @@
<el-row :gutter="10" class="mb8">
<el-col :span="1.5" v-if="!readonly">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleTaskAdd"
>新增</el-button>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleTaskAdd">新增</el-button>
</el-col>
<el-col :span="1.5" v-if="!readonly">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="taskSingle"
@click="handleTaskUpdate"
>修改</el-button>
<el-button type="primary" plain icon="el-icon-circle-plus-outline" size="mini"
@click="handleQuickCreate">快捷创建</el-button>
</el-col>
<el-col :span="1.5" v-if="!readonly">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="taskMultiple"
@click="handleTaskDelete"
>删除</el-button>
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="taskSingle"
@click="handleTaskUpdate">修改</el-button>
</el-col>
<el-col :span="1.5" v-if="!readonly">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleTaskExport"
>导出</el-button>
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="taskMultiple"
@click="handleTaskDelete">删除</el-button>
</el-col>
<el-col :span="1.5" v-if="!readonly">
<el-button
type="primary"
plain
icon="el-icon-circle-plus-outline"
size="mini"
@click="handleQuickCreate"
>快捷创建</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleTaskExport">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getTaskList"></right-toolbar>
</el-row>
<el-table
v-loading="taskLoading"
:data="inspectionTaskList"
@selection-change="handleTaskSelectionChange"
highlight-current-row
@row-click="handleRowClick"
>
<el-table v-loading="taskLoading" :data="inspectionTaskList" @selection-change="handleTaskSelectionChange"
highlight-current-row @row-click="handleRowClick">
<el-table-column type="selection" width="55" align="center" v-if="!readonly" />
<el-table-column label="任务ID" align="center" prop="taskId" v-if="false"/>
<el-table-column label="任务ID" align="center" prop="taskId" v-if="false" />
<el-table-column label="任务编号" align="center" prop="taskCode" />
<el-table-column label="任务类型" align="center" prop="taskType" />
<el-table-column label="检验方案名称" align="center" prop="schemeName" />
<el-table-column label="所属单位" align="center" prop="belongCompany" />
<el-table-column label="方案名称" align="center" prop="schemeName" />
<el-table-column label="状态" align="center" prop="status" width="90">
<template slot-scope="scope">
<el-tag v-if="scope.row.status === 0 || scope.row.status === '0'" type="info" size="small">待检验</el-tag>
<el-tag v-else-if="scope.row.status === 1 || scope.row.status === '1'" type="warning" size="small">已检验</el-tag>
<el-tag v-else-if="scope.row.status === 2 || scope.row.status === '2'" type="success" size="small">已审核</el-tag>
<el-tag v-else-if="scope.row.status === 1 || scope.row.status === '1'" type="warning"
size="small">已检验</el-tag>
<el-tag v-else-if="scope.row.status === 2 || scope.row.status === '2'" type="success"
size="small">已审核</el-tag>
<span v-else>{{ scope.row.status }}</span>
</template>
</el-table-column>
<el-table-column label="检验" align="center" prop="inspectUser" />
<el-table-column label="检验时间" align="center" prop="inspectTime" width="180">
<el-table-column label="检验情况" align="center" prop="inspectTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.inspectTime, '{y}-{m}-{d}') }}</span>
<div v-if="scope.row.inspectUser">检验人{{ scope.row.inspectUser }}</div>
<div>{{ parseTime(scope.row.inspectTime, '{y}-{m}-{d}') }}</div>
</template>
</el-table-column>
<el-table-column label="审核" align="center" prop="auditUser" />
<el-table-column label="审核时间" align="center" prop="auditTime" width="180">
<el-table-column label="审核情况" align="center" prop="auditTime" width="160">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</span>
<div v-if="scope.row.auditUser">审核人{{ scope.row.auditUser }}</div>
<div>{{ parseTime(scope.row.auditTime, '{y}-{m}-{d}') }}</div>
</template>
</el-table-column>
<el-table-column label="最终结果" align="center" prop="result" />
<el-table-column label="关联钢卷" align="center" width="200">
<el-table-column label="关联钢卷" align="center" width="140">
<template slot-scope="scope">
<div v-if="scope.row.coilList && scope.row.coilList.length > 0" style="display: flex; flex-wrap: wrap; gap: 4px;">
<div v-if="scope.row.coilList && scope.row.coilList.length > 0"
style="display: flex; flex-wrap: wrap; gap: 4px;">
<div v-for="(coil, index) in scope.row.coilList" :key="coil.coilId || index">
<CurrentCoilNo :currentCoilNo="coil.currentCoilNo || coil.coilNo || ''" />
</div>
@@ -136,74 +113,50 @@
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="180">
<template slot-scope="scope">
<el-button v-if="!readonly" size="mini" type="text" icon="el-icon-edit" @click="handleTaskUpdate(scope.row)">修改</el-button>
<el-button v-if="!readonly" size="mini" type="text" icon="el-icon-delete" @click="handleTaskDelete(scope.row)">删除</el-button>
<el-button v-if="!readonly" size="mini" type="text" icon="el-icon-edit"
@click="handleTaskUpdate(scope.row)">修改</el-button>
<el-button v-if="!readonly" size="mini" type="text" icon="el-icon-delete"
@click="handleTaskDelete(scope.row)">删除</el-button>
<div>
<el-button v-if="scope.row.status === '0' || scope.row.status === 0" size="mini" type="text" icon="el-icon-check" @click="handleInspect(scope.row)" style="color: #67c23a;">检验</el-button>
<el-button v-if="scope.row.status === '1' || scope.row.status === 1" size="mini" type="text" icon="el-icon-s-flag" @click="handleAudit(scope.row)" style="color: #409eff;">审核</el-button>
<el-button v-if="scope.row.status === '0' || scope.row.status === 0" size="mini" type="text"
icon="el-icon-check" @click="handleInspect(scope.row)" style="color: #67c23a;">检验</el-button>
<el-button v-if="scope.row.status === '1' || scope.row.status === 1" size="mini" type="text"
icon="el-icon-s-flag" @click="handleAudit(scope.row)" style="color: #409eff;">审核</el-button>
</div>
</template>
</el-table-column>
</el-table>
<pagination
v-show="taskTotal>0"
:total="taskTotal"
:page.sync="taskQueryParams.pageNum"
:limit.sync="taskQueryParams.pageSize"
@pagination="getTaskList"
/>
<pagination v-show="taskTotal > 0" :total="taskTotal" :page.sync="taskQueryParams.pageNum"
:limit.sync="taskQueryParams.pageSize" @pagination="getTaskList" />
<div v-if="currentTask" style="margin: 16px 0; padding: 10px 16px; background: #f0f9eb; border-left: 4px solid #67c23a; border-radius: 4px; font-size: 14px;">
<div v-if="currentTask"
style="margin: 16px 0; padding: 10px 16px; background: #f0f9eb; border-left: 4px solid #67c23a; border-radius: 4px; font-size: 14px;">
<span>当前选中任务<strong>{{ currentTask.taskCode }}</strong> - {{ currentTask.schemeName }}</span>
</div>
<div v-if="currentTask">
<el-row :gutter="10" class="mb8">
<el-col :span="1.5" v-if="!itemReadonly">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleItemAdd"
>新增</el-button>
<el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleItemAdd">新增</el-button>
</el-col>
<el-col :span="1.5" v-if="!itemReadonly">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="itemSingle"
@click="handleItemUpdate"
>修改</el-button>
<el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="itemSingle"
@click="handleItemUpdate">修改</el-button>
</el-col>
<el-col :span="1.5" v-if="!itemReadonly">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="itemMultiple"
@click="handleItemDelete"
>删除</el-button>
<el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="itemMultiple"
@click="handleItemDelete">删除</el-button>
</el-col>
<el-col :span="1.5" v-if="!itemReadonly">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleItemExport"
>导出</el-button>
<el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleItemExport">导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getItemList"></right-toolbar>
</el-row>
<el-table v-loading="itemLoading" :data="inspectionItemList" @selection-change="handleItemSelectionChange" border>
<el-table-column type="selection" width="45" align="center" v-if="!itemReadonly" />
<el-table-column label="明细ID" align="center" prop="itemId" v-if="false"/>
<el-table-column label="明细ID" align="center" prop="itemId" v-if="false" />
<el-table-column label="检验项目名称" align="center" prop="itemName" min-width="100" />
<el-table-column label="标准值" align="center" prop="standardValue" width="80">
<template slot-scope="scope">
@@ -260,7 +213,8 @@
<el-table-column label="检验时间" align="center" prop="inspectTime" width="170">
<template slot-scope="scope">
<span v-if="itemReadonly">{{ parseTime(scope.row.inspectTime, '{y}-{m}-{d}') }}</span>
<el-date-picker v-else v-model="scope.row.inspectTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" size="mini" style="width: 100%;" />
<el-date-picker v-else v-model="scope.row.inspectTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
size="mini" style="width: 100%;" />
</template>
</el-table-column>
<el-table-column label="备注" align="center" prop="remark" min-width="100">
@@ -277,13 +231,8 @@
</el-table-column>
</el-table>
<pagination
v-show="itemTotal>0"
:total="itemTotal"
:page.sync="itemQueryParams.pageNum"
:limit.sync="itemQueryParams.pageSize"
@pagination="getItemList"
/>
<pagination v-show="itemTotal > 0" :total="itemTotal" :page.sync="itemQueryParams.pageNum"
:limit.sync="itemQueryParams.pageSize" @pagination="getItemList" />
</div>
<div v-else style="text-align: center; padding: 40px 0; color: #999; font-size: 14px;">
<i class="el-icon-inbox" style="font-size: 48px; display: block; margin-bottom: 12px; color: #ddd;"></i>
@@ -295,30 +244,17 @@
<el-form-item label="任务编号" prop="taskCode">
<el-input v-model="taskForm.taskCode" placeholder="请输入任务编号" />
</el-form-item>
<el-form-item label="检验方案名称" prop="schemeName">
<el-input v-model="taskForm.schemeName" placeholder="请输入检验方案名称" />
<el-form-item label="任务类型" prop="taskType">
<el-select v-model="taskForm.taskType" placeholder="请选择任务类型" clearable filterable allow-create>
<el-option label="内控检验" value="内控检验" />
<el-option label="产品检验" value="产品检验" />
</el-select>
</el-form-item>
<el-form-item label="检验人" prop="inspectUser">
<el-input v-model="taskForm.inspectUser" placeholder="请输入检验人" />
<el-form-item label="所属单位" prop="belongCompany">
<el-input v-model="taskForm.belongCompany" placeholder="请输入所属单位" />
</el-form-item>
<el-form-item label="检验时间" prop="inspectTime">
<el-date-picker clearable
v-model="taskForm.inspectTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择检验时间">
</el-date-picker>
</el-form-item>
<el-form-item label="审核人" prop="auditUser">
<el-input v-model="taskForm.auditUser" placeholder="请输入审核人" />
</el-form-item>
<el-form-item label="审核时间" prop="auditTime">
<el-date-picker clearable
v-model="taskForm.auditTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择审核时间">
</el-date-picker>
<el-form-item label="方案名称" prop="schemeName">
<el-input v-model="taskForm.schemeName" placeholder="请输入方案名称" />
</el-form-item>
<el-form-item label="最终结果" prop="result">
<el-input v-model="taskForm.result" placeholder="请输入最终结果" />
@@ -334,10 +270,12 @@
<span v-if="taskCoilList.length > 0" style="margin-left: 8px; font-size: 13px; color: #67c23a;">
已选 {{ taskCoilList.length }}
</span>
<el-button v-if="taskCoilList.length > 0" type="text" size="small" style="margin-left: 4px; color: #f56c6c;" @click="taskCoilList = []">清除</el-button>
<el-button v-if="taskCoilList.length > 0" type="text" size="small" style="margin-left: 4px; color: #f56c6c;"
@click="taskCoilList = []">清除</el-button>
</div>
<div v-if="taskCoilList.length > 0" style="display: flex; flex-wrap: wrap; gap: 8px; margin: 0 0 12px 80px;">
<div v-for="(coil, index) in taskCoilList" :key="coil.coilId || index" style="display: flex; align-items: center; gap: 4px;">
<div v-for="(coil, index) in taskCoilList" :key="coil.coilId || index"
style="display: flex; align-items: center; gap: 4px;">
<CurrentCoilNo :currentCoilNo="coil.currentCoilNo || coil.coilNo || ''" />
<el-button type="text" icon="el-icon-close" size="mini" @click="taskCoilList.splice(index, 1)"></el-button>
</div>
@@ -378,10 +316,7 @@
<el-input v-model="itemForm.inspectUser" placeholder="请输入检验人" />
</el-form-item>
<el-form-item label="检验时间" prop="inspectTime">
<el-date-picker clearable
v-model="itemForm.inspectTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
<el-date-picker clearable v-model="itemForm.inspectTime" type="datetime" value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择检验时间">
</el-date-picker>
</el-form-item>
@@ -414,6 +349,7 @@
<script>
import { listInspectionTask, getInspectionTask, delInspectionTask, addInspectionTask, updateInspectionTask, addInspectionTaskWithItems } from "@/api/mes/qc/inspectionTask";
import { listInspectionItem, getInspectionItem, delInspectionItem, addInspectionItem, updateInspectionItem } from "@/api/mes/qc/inspectionItem";
import { listInspectionItemTemplate } from "@/api/mes/qc/inspectionItemTemplate";
import { SchemeSelect } from "@/components/KLPService";
import CoilSelector from "@/components/CoilSelector/index.vue";
import CurrentCoilNo from "@/components/KLPService/Renderer/CurrentCoilNo.vue";
@@ -450,6 +386,7 @@ export default {
pageSize: 10,
taskCode: undefined,
taskType: undefined,
belongCompany: undefined,
schemeName: undefined,
status: undefined,
inspectUser: undefined,
@@ -496,6 +433,11 @@ export default {
resultForm: { result: undefined },
resultAction: null,
resultTaskRow: null,
cascadeData: {},
companyOptions: [],
schemeOptions: [],
selectedCompany: '',
selectedScheme: '',
};
},
computed: {
@@ -507,6 +449,7 @@ export default {
},
created() {
this.getTaskList();
this.loadCascadeData();
},
methods: {
getTaskList() {
@@ -540,6 +483,9 @@ export default {
},
resetTaskQuery() {
this.resetForm("taskQueryForm");
this.selectedCompany = '';
this.selectedScheme = '';
this.schemeOptions = [];
this.handleTaskQuery();
},
handleTaskSelectionChange(selection) {
@@ -620,12 +566,14 @@ export default {
handleQuickCreate() {
this.schemeVisible = true;
},
handleSchemeConfirm({ template, taskCode, coilIds }) {
handleSchemeConfirm({ template, taskCode, taskType, belongCompany, coilIds }) {
this.taskLoading = true;
addInspectionTaskWithItems({
taskCode: taskCode,
schemeId: template.templateId,
schemeName: template.templateName,
belongCompany: belongCompany,
taskType: taskType,
coilIds: coilIds
}).then(() => {
this.$modal.msgSuccess("快捷创建成功");
@@ -675,6 +623,38 @@ export default {
this.resultLoading = false;
});
},
loadCascadeData() {
listInspectionItemTemplate({ pageNum: 1, pageSize: 9999 }).then(response => {
const templates = response.rows || response.data || [];
const cascade = {};
templates.forEach(t => {
const company = t.templateUnit || '未分类';
if (!cascade[company]) {
cascade[company] = [];
}
if (t.templateName && !cascade[company].includes(t.templateName)) {
cascade[company].push(t.templateName);
}
});
this.cascadeData = cascade;
this.companyOptions = Object.keys(cascade).sort();
});
},
handleCompanyChange() {
this.selectedScheme = '';
if (this.selectedCompany) {
this.schemeOptions = this.cascadeData[this.selectedCompany] || [];
} else {
this.schemeOptions = [];
}
this.taskQueryParams.belongCompany = this.selectedCompany || undefined;
this.taskQueryParams.schemeName = undefined;
this.handleTaskQuery();
},
handleSchemeChange() {
this.taskQueryParams.schemeName = this.selectedScheme || undefined;
this.handleTaskQuery();
},
cancelTask() {
this.taskOpen = false;
this.resetTaskForm();

View File

@@ -6,6 +6,9 @@
<el-tab-pane label="检验任务" name="third" v-hasPermi="['qc:inspection:task']">
<InspectionTask readonly />
</el-tab-pane>
<el-tab-pane label="质保书审批" name="fourth" v-hasPermi="['qc:certificate:approve']">
<CertificateBook />
</el-tab-pane>
<el-tab-pane label="其他代办" name="second">
<el-empty description="暂无其他代办事项" />
</el-tab-pane>
@@ -15,12 +18,14 @@
<script>
import TranferCoilTable from '@/views/wms/coil/views/base/tranfer.vue'
import InspectionTask from '@/views/mes/qc/inspection/task.vue'
import CertificateBook from '@/views/mes/qc/certificate/book.vue'
export default {
name: 'TodoIndex',
components: {
TranferCoilTable,
InspectionTask,
CertificateBook,
},
data() {
return {