|
|
@@ -1,64 +1,52 @@
|
|
|
<template>
|
|
|
<AidopDemoShell :title="pageTitle" subtitle="S0 / Manufacturing / 工序流转卡">
|
|
|
<el-form :inline="true" :model="query" class="mb12" @submit.prevent>
|
|
|
- <el-form-item label="公司">
|
|
|
- <el-select v-model="query.companyRefId" clearable filterable placeholder="全部" style="width: 160px">
|
|
|
- <el-option v-for="item in companyOptions" :key="item.id" :label="item.name || item.code || `${item.id}`" :value="item.id" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="工厂">
|
|
|
- <el-select v-model="query.factoryRefId" clearable filterable placeholder="全部" style="width: 160px">
|
|
|
- <el-option v-for="item in filteredFactoryOptions" :key="item.id" :label="item.name || item.code || `${item.id}`" :value="item.id" />
|
|
|
- </el-select>
|
|
|
+ <el-form-item label="关键字">
|
|
|
+ <el-input v-model="query.keyword" clearable placeholder="工单号 / 物料编码 / 物料描述" style="width: 220px" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="工单">
|
|
|
- <el-input v-model="query.workOrderNo" clearable style="width: 140px" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="流转卡号">
|
|
|
- <el-input v-model="query.flowCardNo" clearable style="width: 140px" />
|
|
|
+ <el-form-item label="工单号">
|
|
|
+ <el-input v-model="query.workOrd" clearable placeholder="工单号模糊" style="width: 160px" />
|
|
|
</el-form-item>
|
|
|
<el-form-item label="物料编码">
|
|
|
- <el-input v-model="query.itemNum" clearable style="width: 140px" />
|
|
|
+ <el-input v-model="query.itemNum" clearable placeholder="物料编码模糊" style="width: 160px" />
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="启用">
|
|
|
- <el-select v-model="query.isActive" clearable placeholder="全部" style="width: 100px">
|
|
|
- <el-option label="是" :value="true" />
|
|
|
- <el-option label="否" :value="false" />
|
|
|
+ <el-form-item label="标签颜色">
|
|
|
+ <el-select v-model="query.labelColor" clearable placeholder="全部" style="width: 120px">
|
|
|
+ <el-option label="LZK" value="LZK" />
|
|
|
</el-select>
|
|
|
</el-form-item>
|
|
|
+ <el-form-item label="状态">
|
|
|
+ <el-input v-model="query.status" clearable placeholder="状态码" style="width: 100px" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="创建时间">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="query.createTimeRange"
|
|
|
+ type="datetimerange"
|
|
|
+ value-format="YYYY-MM-DDTHH:mm:ss"
|
|
|
+ range-separator="-"
|
|
|
+ start-placeholder="开始"
|
|
|
+ end-placeholder="结束"
|
|
|
+ style="width: 360px"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
<el-form-item>
|
|
|
<el-button type="primary" @click="loadList">查询</el-button>
|
|
|
<el-button @click="resetQuery">重置</el-button>
|
|
|
- <el-button type="success" @click="openCreate">新增</el-button>
|
|
|
</el-form-item>
|
|
|
</el-form>
|
|
|
|
|
|
<el-table :data="rows" v-loading="loading" border stripe style="width: 100%" max-height="calc(100vh - 260px)">
|
|
|
- <el-table-column prop="flowCardNo" label="流转卡号" width="140" show-overflow-tooltip />
|
|
|
- <el-table-column prop="workOrderNo" label="工单" width="120" show-overflow-tooltip />
|
|
|
- <el-table-column prop="workOrderBatchNo" label="工单批号" width="120" show-overflow-tooltip />
|
|
|
- <el-table-column prop="nature" label="性质" width="100" show-overflow-tooltip />
|
|
|
- <el-table-column prop="itemNum" label="物料编码" width="120" show-overflow-tooltip />
|
|
|
- <el-table-column prop="itemName" label="物料名称" min-width="140" show-overflow-tooltip />
|
|
|
- <el-table-column prop="drawingNo" label="图号" width="100" show-overflow-tooltip />
|
|
|
- <el-table-column prop="bomVersion" label="BOM版本" width="100" show-overflow-tooltip />
|
|
|
- <el-table-column prop="routingCode" label="工艺路线" width="110" show-overflow-tooltip />
|
|
|
- <el-table-column prop="domainCode" label="工厂域" width="100" show-overflow-tooltip />
|
|
|
- <el-table-column label="启用" width="72" align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-tag :type="row.isActive ? 'success' : 'info'" size="small">{{ row.isActive ? '是' : '否' }}</el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="remarks" label="备注" min-width="120" show-overflow-tooltip />
|
|
|
- <el-table-column label="操作" width="220" fixed="right" align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-button link type="primary" @click="openEdit(row)">编辑</el-button>
|
|
|
- <el-button link :type="row.isActive ? 'warning' : 'success'" @click="toggleActive(row)">
|
|
|
- {{ row.isActive ? '停用' : '启用' }}
|
|
|
- </el-button>
|
|
|
- <el-button link type="danger" @click="onDelete(row)">删除</el-button>
|
|
|
- </template>
|
|
|
+ <el-table-column prop="id" label="记录ID" width="100" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="workOrd" label="工单号" width="140" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="op" label="工序" width="80" align="right" />
|
|
|
+ <el-table-column prop="itemNum" label="物料编码" width="140" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="descr" label="物料描述" min-width="180" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="labelFormat" label="标签格式" width="110" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="labelColor" label="标签颜色" width="90" />
|
|
|
+ <el-table-column label="状态" width="110" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">{{ row.statusDesc || row.status || '' }}</template>
|
|
|
</el-table-column>
|
|
|
+ <el-table-column prop="createTime" label="创建时间" width="170" />
|
|
|
</el-table>
|
|
|
|
|
|
<div class="pager">
|
|
|
@@ -72,140 +60,50 @@
|
|
|
@size-change="loadList"
|
|
|
/>
|
|
|
</div>
|
|
|
-
|
|
|
- <el-dialog v-model="dialogVisible" :title="dialogTitle" width="820px" destroy-on-close @closed="resetForm">
|
|
|
- <el-form ref="formRef" :model="form" :rules="rules" label-width="120px">
|
|
|
- <el-row :gutter="16">
|
|
|
- <el-col :span="12"><el-form-item label="公司" prop="companyRefId">
|
|
|
- <el-select v-model="form.companyRefId" filterable style="width: 100%">
|
|
|
- <el-option v-for="item in companyOptions" :key="item.id" :label="item.name || item.code || `${item.id}`" :value="item.id" />
|
|
|
- </el-select>
|
|
|
- </el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="工厂" prop="factoryRefId">
|
|
|
- <el-select v-model="form.factoryRefId" filterable style="width: 100%" @change="syncDomainCode">
|
|
|
- <el-option v-for="item in formFactoryOptions" :key="item.id" :label="item.name || item.code || `${item.id}`" :value="item.id" />
|
|
|
- </el-select>
|
|
|
- </el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="工厂域"><el-input v-model="form.domainCode" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="流转卡号" prop="flowCardNo"><el-input v-model="form.flowCardNo" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="工单" prop="workOrderNo"><el-input v-model="form.workOrderNo" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="工单批号"><el-input v-model="form.workOrderBatchNo" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="性质"><el-input v-model="form.nature" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="物料编码" prop="itemNum"><el-input v-model="form.itemNum" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="物料名称"><el-input v-model="form.itemName" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="图号"><el-input v-model="form.drawingNo" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="BOM版本"><el-input v-model="form.bomVersion" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="工艺路线"><el-input v-model="form.routingCode" /></el-form-item></el-col>
|
|
|
- <el-col :span="12"><el-form-item label="启用"><el-switch v-model="form.isActive" /></el-form-item></el-col>
|
|
|
- <el-col :span="24"><el-form-item label="备注"><el-input v-model="form.remarks" type="textarea" rows="2" /></el-form-item></el-col>
|
|
|
- </el-row>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
- <el-button @click="dialogVisible = false">取消</el-button>
|
|
|
- <el-button type="primary" :loading="saving" @click="submitForm">保存</el-button>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
</AidopDemoShell>
|
|
|
</template>
|
|
|
|
|
|
<script setup lang="ts" name="aidopS0MfgProcessFlowCard">
|
|
|
-import { computed, onMounted, reactive, ref, watch } from 'vue';
|
|
|
+import { computed, onMounted, reactive, ref } from 'vue';
|
|
|
import { useRoute } from 'vue-router';
|
|
|
-import { ElMessage, ElMessageBox, type FormInstance, type FormRules } from 'element-plus';
|
|
|
import AidopDemoShell from '../../components/AidopDemoShell.vue';
|
|
|
-import { loadOrgList, s0MfgProcessFlowCardsApi, type OrgOption, type S0ProcessFlowCardRow, type S0ProcessFlowCardUpsert } from '../api/s0ManufacturingApi';
|
|
|
+import {
|
|
|
+ s0MfgProcessFlowCardsApi,
|
|
|
+ type S0MfgFlowCardPrintRecordRow,
|
|
|
+} from '../api/s0ManufacturingApi';
|
|
|
|
|
|
const route = useRoute();
|
|
|
const pageTitle = computed(() => (route.meta?.title as string) || '工序流转卡');
|
|
|
|
|
|
const query = reactive({
|
|
|
- companyRefId: undefined as string | undefined,
|
|
|
- factoryRefId: undefined as string | undefined,
|
|
|
- workOrderNo: '',
|
|
|
- flowCardNo: '',
|
|
|
+ keyword: '',
|
|
|
+ workOrd: '',
|
|
|
itemNum: '',
|
|
|
- isActive: undefined as boolean | undefined,
|
|
|
+ labelColor: '',
|
|
|
+ status: '',
|
|
|
+ createTimeRange: [] as string[],
|
|
|
page: 1,
|
|
|
pageSize: 20,
|
|
|
});
|
|
|
|
|
|
const loading = ref(false);
|
|
|
-const rows = ref<S0ProcessFlowCardRow[]>([]);
|
|
|
+const rows = ref<S0MfgFlowCardPrintRecordRow[]>([]);
|
|
|
const total = ref(0);
|
|
|
-const dialogVisible = ref(false);
|
|
|
-const dialogTitle = ref('新增');
|
|
|
-const editingId = ref<number | null>(null);
|
|
|
-const saving = ref(false);
|
|
|
-const formRef = ref<FormInstance>();
|
|
|
-const companyOptions = ref<OrgOption[]>([]);
|
|
|
-const factoryOptions = ref<OrgOption[]>([]);
|
|
|
-
|
|
|
-const filteredFactoryOptions = computed(() => {
|
|
|
- if (!query.companyRefId) return factoryOptions.value;
|
|
|
- return factoryOptions.value.filter((item) => item.pid === query.companyRefId);
|
|
|
-});
|
|
|
-const formFactoryOptions = computed(() => {
|
|
|
- if (!form.companyRefId) return factoryOptions.value;
|
|
|
- return factoryOptions.value.filter((item) => item.pid === form.companyRefId);
|
|
|
-});
|
|
|
-
|
|
|
-const form = reactive<S0ProcessFlowCardUpsert>({
|
|
|
- companyRefId: undefined,
|
|
|
- factoryRefId: undefined,
|
|
|
- domainCode: '',
|
|
|
- workOrderNo: '',
|
|
|
- workOrderBatchNo: '',
|
|
|
- flowCardNo: '',
|
|
|
- nature: '',
|
|
|
- itemNum: '',
|
|
|
- itemName: '',
|
|
|
- drawingNo: '',
|
|
|
- bomVersion: '',
|
|
|
- routingCode: '',
|
|
|
- remarks: '',
|
|
|
- isActive: true,
|
|
|
- createUser: '',
|
|
|
- updateUser: '',
|
|
|
-});
|
|
|
-
|
|
|
-const rules: FormRules = {
|
|
|
- companyRefId: [{ required: true, message: '请选择公司', trigger: 'change' }],
|
|
|
- factoryRefId: [{ required: true, message: '请选择工厂', trigger: 'change' }],
|
|
|
- flowCardNo: [{ required: true, message: '请填写流转卡号', trigger: 'blur' }],
|
|
|
- workOrderNo: [{ required: true, message: '请填写工单', trigger: 'blur' }],
|
|
|
- itemNum: [{ required: true, message: '请填写物料编码', trigger: 'blur' }],
|
|
|
-};
|
|
|
-
|
|
|
-watch(() => query.companyRefId, () => {
|
|
|
- if (!filteredFactoryOptions.value.some((item) => item.id === query.factoryRefId)) query.factoryRefId = undefined;
|
|
|
-});
|
|
|
-watch(() => form.companyRefId, () => {
|
|
|
- if (!formFactoryOptions.value.some((item) => item.id === form.factoryRefId)) form.factoryRefId = undefined;
|
|
|
-});
|
|
|
-
|
|
|
-function syncDomainCode() {
|
|
|
- const f = factoryOptions.value.find((item) => item.id === form.factoryRefId);
|
|
|
- form.domainCode = f?.code ?? '';
|
|
|
-}
|
|
|
-
|
|
|
-async function loadOptions() {
|
|
|
- const [companies, factories] = await Promise.all([loadOrgList('201'), loadOrgList('501')]);
|
|
|
- companyOptions.value = companies;
|
|
|
- factoryOptions.value = factories;
|
|
|
-}
|
|
|
|
|
|
async function loadList() {
|
|
|
loading.value = true;
|
|
|
try {
|
|
|
+ const [from, to] = query.createTimeRange || [];
|
|
|
const data = await s0MfgProcessFlowCardsApi.list({
|
|
|
page: query.page,
|
|
|
pageSize: query.pageSize,
|
|
|
- companyRefId: query.companyRefId,
|
|
|
- factoryRefId: query.factoryRefId,
|
|
|
- workOrderNo: query.workOrderNo || undefined,
|
|
|
- flowCardNo: query.flowCardNo || undefined,
|
|
|
+ keyword: query.keyword || undefined,
|
|
|
+ workOrd: query.workOrd || undefined,
|
|
|
itemNum: query.itemNum || undefined,
|
|
|
- isActive: query.isActive,
|
|
|
+ labelColor: query.labelColor || undefined,
|
|
|
+ status: query.status || undefined,
|
|
|
+ createTimeFrom: from || undefined,
|
|
|
+ createTimeTo: to || undefined,
|
|
|
});
|
|
|
rows.value = data.list;
|
|
|
total.value = data.total;
|
|
|
@@ -218,96 +116,29 @@ async function loadList() {
|
|
|
}
|
|
|
|
|
|
function resetQuery() {
|
|
|
- Object.assign(query, {
|
|
|
- companyRefId: undefined,
|
|
|
- factoryRefId: undefined,
|
|
|
- workOrderNo: '',
|
|
|
- flowCardNo: '',
|
|
|
- itemNum: '',
|
|
|
- isActive: undefined,
|
|
|
- page: 1,
|
|
|
- });
|
|
|
+ query.keyword = '';
|
|
|
+ query.workOrd = '';
|
|
|
+ query.itemNum = '';
|
|
|
+ query.labelColor = '';
|
|
|
+ query.status = '';
|
|
|
+ query.createTimeRange = [];
|
|
|
+ query.page = 1;
|
|
|
void loadList();
|
|
|
}
|
|
|
|
|
|
-function resetForm() {
|
|
|
- editingId.value = null;
|
|
|
- Object.assign(form, {
|
|
|
- companyRefId: undefined, factoryRefId: undefined, domainCode: '', workOrderNo: '', workOrderBatchNo: '',
|
|
|
- flowCardNo: '', nature: '', itemNum: '', itemName: '', drawingNo: '', bomVersion: '',
|
|
|
- routingCode: '', remarks: '', isActive: true, createUser: '', updateUser: '',
|
|
|
- });
|
|
|
- formRef.value?.clearValidate();
|
|
|
-}
|
|
|
-
|
|
|
-function openCreate() {
|
|
|
- resetForm();
|
|
|
- dialogTitle.value = '新增工序流转卡';
|
|
|
- dialogVisible.value = true;
|
|
|
-}
|
|
|
-
|
|
|
-function openEdit(row: S0ProcessFlowCardRow) {
|
|
|
- resetForm();
|
|
|
- editingId.value = row.id;
|
|
|
- dialogTitle.value = `编辑 ${row.flowCardNo}`;
|
|
|
- Object.assign(form, {
|
|
|
- companyRefId: row.companyRefId, factoryRefId: row.factoryRefId, domainCode: row.domainCode ?? '',
|
|
|
- workOrderNo: row.workOrderNo, workOrderBatchNo: row.workOrderBatchNo ?? '', flowCardNo: row.flowCardNo,
|
|
|
- nature: row.nature ?? '', itemNum: row.itemNum, itemName: row.itemName ?? '', drawingNo: row.drawingNo ?? '',
|
|
|
- bomVersion: row.bomVersion ?? '', routingCode: row.routingCode ?? '', remarks: row.remarks ?? '', isActive: row.isActive,
|
|
|
- createUser: row.createUser ?? '', updateUser: row.updateUser ?? '',
|
|
|
- });
|
|
|
- dialogVisible.value = true;
|
|
|
-}
|
|
|
-
|
|
|
-async function submitForm() {
|
|
|
- await formRef.value?.validate();
|
|
|
- saving.value = true;
|
|
|
- try {
|
|
|
- const payload: S0ProcessFlowCardUpsert = { ...form };
|
|
|
- if (editingId.value) {
|
|
|
- await s0MfgProcessFlowCardsApi.update(editingId.value, payload);
|
|
|
- ElMessage.success('已保存');
|
|
|
- } else {
|
|
|
- await s0MfgProcessFlowCardsApi.create(payload);
|
|
|
- ElMessage.success('已创建');
|
|
|
- }
|
|
|
- dialogVisible.value = false;
|
|
|
- await loadList();
|
|
|
- } finally {
|
|
|
- saving.value = false;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
-function onDelete(row: S0ProcessFlowCardRow) {
|
|
|
- ElMessageBox.confirm(`确定删除流转卡「${row.flowCardNo}」?`, '确认', { type: 'warning' })
|
|
|
- .then(async () => {
|
|
|
- await s0MfgProcessFlowCardsApi.delete(row.id);
|
|
|
- ElMessage.success('已删除');
|
|
|
- await loadList();
|
|
|
- })
|
|
|
- .catch(() => {});
|
|
|
-}
|
|
|
-
|
|
|
-function toggleActive(row: S0ProcessFlowCardRow) {
|
|
|
- const next = !row.isActive;
|
|
|
- ElMessageBox.confirm(`确定${next ? '启用' : '停用'}流转卡「${row.flowCardNo}」?`, '确认', { type: 'warning' })
|
|
|
- .then(async () => {
|
|
|
- await s0MfgProcessFlowCardsApi.toggleEnabled(row.id, { isEnabled: next });
|
|
|
- ElMessage.success('操作成功');
|
|
|
- await loadList();
|
|
|
- })
|
|
|
- .catch(() => {});
|
|
|
-}
|
|
|
-
|
|
|
-onMounted(async () => {
|
|
|
- await loadOptions();
|
|
|
- await loadList();
|
|
|
+onMounted(() => {
|
|
|
+ void loadList();
|
|
|
});
|
|
|
</script>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
|
@import '/@/views/aidop/styles/aidop-demo.scss';
|
|
|
-.mb12 { margin-bottom: 12px; }
|
|
|
-.pager { margin-top: 12px; display: flex; justify-content: flex-end; }
|
|
|
+.mb12 {
|
|
|
+ margin-bottom: 12px;
|
|
|
+}
|
|
|
+.pager {
|
|
|
+ margin-top: 12px;
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+}
|
|
|
</style>
|