From 0a7e971b4f7ff2ce09a0db0db50ac745ff8747a5 Mon Sep 17 00:00:00 2001
From: 张诺 <zhang_12370@163.com>
Date: 星期一, 27 四月 2026 13:12:30 +0800
Subject: [PATCH] 阳光印刷Web: 新增工艺路线绑定对话框组件
---
src/views/productionManagement/productionOrder/BindRouteDialog.vue | 968 ++++++++++----------
src/views/basicData/product/index.vue | 2
src/views/productionManagement/workOrder/index.vue | 1784 ++++++++++++++++++++------------------
3 files changed, 1,433 insertions(+), 1,321 deletions(-)
diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index 1626123..34ee7a1 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -206,7 +206,7 @@
prop: "model",
},
{
- label: "鍗曚綅",
+ label: "璁¢噺鍗曚綅",
prop: "unit",
},
{
diff --git a/src/views/productionManagement/productionOrder/BindRouteDialog.vue b/src/views/productionManagement/productionOrder/BindRouteDialog.vue
index c09754a..309db44 100644
--- a/src/views/productionManagement/productionOrder/BindRouteDialog.vue
+++ b/src/views/productionManagement/productionOrder/BindRouteDialog.vue
@@ -1,216 +1,218 @@
<template>
<FormDialog
- v-model="visible"
- :title="type === 'add' ? '缁戝畾宸ヨ壓璺嚎' : type === 'detail' ? '鏌ョ湅宸ヨ壓璺嚎' : '缂栬緫宸ヨ壓璺嚎'"
- width="1400px"
- :operation-type="type"
- :column="8"
- @close="handleClose"
- @confirm="handleConfirm"
- @cancel="handleClose"
+ v-model="visible"
+ :title="type === 'add' ? '缁戝畾宸ヨ壓璺嚎' : type === 'detail' ? '鏌ョ湅宸ヨ壓璺嚎' : '缂栬緫宸ヨ壓璺嚎'"
+ width="1400px"
+ :operation-type="type"
+ :column="8"
+ @close="handleClose"
+ @confirm="handleConfirm"
+ @cancel="handleClose"
>
<div :class="{ 'is-detail': isDetail }">
- <!-- ================= 鍩烘湰淇℃伅 ================= -->
- <el-descriptions :column="3">
- <el-descriptions-item label="缂栧彿" align="center" v-if="formData.productOrderList">
- {{ formData.productOrderList.salesContractNo || "鏆傛棤鏁版嵁" }}
- </el-descriptions-item>
+ <!-- ================= 鍩烘湰淇℃伅 ================= -->
+ <el-descriptions :column="3">
+ <el-descriptions-item label="缂栧彿" align="center" v-if="formData.productOrderList">
+ {{ formData.productOrderList.salesContractNo || "鏆傛棤鏁版嵁" }}
+ </el-descriptions-item>
- <el-descriptions-item label="鍒跺崟鏃ユ湡" align="center" v-if="formData.productOrderList">
- {{ formData.productOrderList.entryDate || "鏆傛棤鏁版嵁" }}
- </el-descriptions-item>
+ <el-descriptions-item label="鍒跺崟鏃ユ湡" align="center" v-if="formData.productOrderList">
+ {{ formData.productOrderList.entryDate || "鏆傛棤鏁版嵁" }}
+ </el-descriptions-item>
- <el-descriptions-item label="浜や粯鏃ユ湡" align="center" v-if="formData.productOrderList">
- {{ formData.productOrderList.deliveryDate || "鏆傛棤鏁版嵁" }}
- </el-descriptions-item>
- </el-descriptions>
+ <el-descriptions-item label="浜や粯鏃ユ湡" align="center" v-if="formData.productOrderList">
+ {{ formData.productOrderList.deliveryDate || "鏆傛棤鏁版嵁" }}
+ </el-descriptions-item>
+ </el-descriptions>
- <el-descriptions border :column="4">
- <el-descriptions-item label="濮旀墭鍗曚綅" :span="2" align="center">
- {{formData.clientName || "--"}}
- </el-descriptions-item>
+ <el-descriptions border :column="4">
+ <el-descriptions-item label="濮旀墭鍗曚綅" :span="2" align="center">
+ {{ formData.clientName || "--" }}
+ </el-descriptions-item>
- <el-descriptions-item label="鏁伴噺" :span="1" align="center">
- {{formData.orderQty || "--"}}
- </el-descriptions-item>
+ <el-descriptions-item label="鏁伴噺" :span="1" align="center">
+ {{ formData.orderQty || "--" }}
+ </el-descriptions-item>
- <el-descriptions-item label="鎴愬搧灏哄" :span="1" align="center">
- {{formData.finishedSize || "--"}}
- </el-descriptions-item>
+ <el-descriptions-item label="鎴愬搧灏哄" :span="1" align="center">
+ {{ formData.finishedSize || "--" }}
+ </el-descriptions-item>
- <el-descriptions-item label="浜у搧鍚嶇О" :span="2" align="center">
- {{formData.productName || "--"}}
- </el-descriptions-item>
+ <el-descriptions-item label="浜у搧鍚嶇О" :span="2" align="center">
+ {{ formData.productName || "--" }}
+ </el-descriptions-item>
- <el-descriptions-item label="鍗曟嵁绫诲瀷" :span="2" align="center">
- <el-checkbox-group v-model="introductionLetterList" :disabled="isDetail">
- <el-checkbox label="浠嬬粛淇�" value="浠嬬粛淇�" />
- <el-checkbox label="鍟嗘爣娉ㄥ唽" value="鍟嗘爣娉ㄥ唽" />
- <el-checkbox label="濮斿嵃鍗�" value="濮斿嵃鍗�" />
- <el-checkbox label="涔﹀彿" value="涔﹀彿" />
- </el-checkbox-group>
- </el-descriptions-item>
- </el-descriptions>
+ <el-descriptions-item label="鍗曟嵁绫诲瀷" :span="2" align="center">
+ <el-checkbox-group v-model="introductionLetterList" :disabled="isDetail">
+ <el-checkbox label="浠嬬粛淇�" value="浠嬬粛淇�"/>
+ <el-checkbox label="鍟嗘爣娉ㄥ唽" value="鍟嗘爣娉ㄥ唽"/>
+ <el-checkbox label="濮斿嵃鍗�" value="濮斿嵃鍗�"/>
+ <el-checkbox label="涔﹀彿" value="涔﹀彿"/>
+ </el-checkbox-group>
+ </el-descriptions-item>
+ </el-descriptions>
- <!-- ================= 鏉愭枡琛� ================= -->
- <div class="process-table-header">
- <div class="section-title">鏉愭枡淇℃伅</div>
- <el-button v-if="!isDetail" type="primary" size="small" @click="addMaterialRow">鏂板涓�琛�</el-button>
- </div>
- <el-table border :data="formData.materialInfo" style="width: 100%">
- <el-table-column label="鏉愭枡鍚嶇О">
- <template #default="{ row, $index }" >
- <el-tree-select
- v-if="!isDetail"
- v-model="row.productById"
- placeholder="璇烽�夋嫨"
- clearable
- check-strictly
- @change="(val) => getModels(val, row, $index)"
- :data="productOptions"
- :render-after-expand="false"
- :disabled="isDetail"
- style="width: 100%"
- />
- <span v-else>{{ row.name }}</span>
- </template>
- </el-table-column>
- <el-table-column>
- <template #header>
- <span class="required">*</span>瑙勬牸
- </template>
- <template #default="{ row }">
- <el-select
- v-if="!isDetail"
- v-model="row.productModelId"
- placeholder="璇烽�夋嫨瑙勬牸"
- filterable
- clearable
- @change="(val) => handleMaterialModelChange(val, row)"
- :disabled="isDetail"
- >
- <el-option
- v-for="item in row.modelOptions"
- :key="item.id"
- :label="item.model"
- :value="item.id"
+ <!-- ================= 鏉愭枡琛� ================= -->
+ <div class="process-table-header">
+ <div class="section-title">鏉愭枡淇℃伅</div>
+ <el-button v-if="!isDetail" type="primary" size="small" @click="addMaterialRow">鏂板涓�琛�</el-button>
+ </div>
+ <el-table border :data="formData.materialInfo" style="width: 100%">
+ <el-table-column label="鏉愭枡鍚嶇О">
+ <template #default="{ row, $index }">
+ <el-tree-select
+ v-if="!isDetail"
+ v-model="row.productById"
+ placeholder="璇烽�夋嫨"
+ clearable
+ check-strictly
+ @change="(val) => getModels(val, row, $index)"
+ :data="productOptions"
+ :render-after-expand="false"
+ :disabled="isDetail"
+ style="width: 100%"
/>
- </el-select>
- <span v-else>{{ row.model }}</span>
- </template>
- </el-table-column>
- <el-table-column label="鏁伴噺">
- <template #default="{ row }">
- <el-input v-model="row.num" placeholder="鏁伴噺" :disabled="isDetail">
- </el-input>
- </template>
- </el-table-column>
- <el-table-column label="璁¢噺鍗曚綅">
- <template #default="{ row }">
- <el-input v-model="row.unit" placeholder="璁¢噺鍗曚綅" :disabled="isDetail" />
- </template>
- </el-table-column>
- <el-table-column label="鍗曚环">
- <template #default="{ row }">
- <el-input v-model="row.price" placeholder="鍗曚环" :disabled="isDetail">
- </el-input>
- </template>
- </el-table-column>
- <el-table-column label="閲戦">
- <template #default="{ row }">
- <el-input v-model="row.totalAmount" placeholder="閲戦" :disabled="isDetail" />
- </template>
- </el-table-column>
- <el-table-column v-if="!isDetail" label="鎿嶄綔" width="80">
- <template #default="{ $index }">
- <el-button type="danger" size="small" @click="removeMaterialRow($index)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
- <el-descriptions border :column="2" :span="2">
- <el-descriptions-item
- label="鍒囨枡鍥剧ず閫夋嫨"
- :span="1"
- align="center"
- style="white-space: pre-line; word-break: break-all; min-height: 60px;"
+ <span v-else>{{ row.name }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column>
+ <template #header>
+ <span class="required">*</span>瑙勬牸
+ </template>
+ <template #default="{ row }">
+ <el-select
+ v-if="!isDetail"
+ v-model="row.productModelId"
+ placeholder="璇烽�夋嫨瑙勬牸"
+ filterable
+ clearable
+ @change="(val) => handleMaterialModelChange(val, row)"
+ :disabled="isDetail"
+ >
+ <el-option
+ v-for="item in row.modelOptions"
+ :key="item.id"
+ :label="item.model"
+ :value="item.id"
+ />
+ </el-select>
+ <span v-else>{{ row.model }}</span>
+ </template>
+ </el-table-column>
+ <el-table-column label="鏁伴噺">
+ <template #default="{ row }">
+ <el-input v-model="row.num" placeholder="鏁伴噺" :disabled="isDetail">
+ </el-input>
+ </template>
+ </el-table-column>
+ <el-table-column label="璁¢噺鍗曚綅">
+ <template #default="{ row }">
+ <el-input v-model="row.unit" placeholder="璁¢噺鍗曚綅" :disabled="isDetail"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍗曚环">
+ <template #default="{ row }">
+ <el-input v-model="row.price" placeholder="鍗曚环" :disabled="isDetail">
+ </el-input>
+ </template>
+ </el-table-column>
+ <el-table-column label="閲戦">
+ <template #default="{ row }">
+ <el-input v-model="row.totalAmount" placeholder="閲戦" :disabled="isDetail"/>
+ </template>
+ </el-table-column>
+ <el-table-column v-if="!isDetail" label="鎿嶄綔" width="80">
+ <template #default="{ $index }">
+ <el-button type="danger" size="small" @click="removeMaterialRow($index)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
+ <el-descriptions border :column="2" :span="2">
+ <el-descriptions-item
+ label="鍒囨枡鍥剧ず閫夋嫨"
+ :span="1"
+ align="center"
+ style="white-space: pre-line; word-break: break-all; min-height: 60px;"
+ >
+ <el-radio-group v-model="formData.cuttingDiagramCheckout">
+ <el-radio value="骞冲紶">骞冲紶</el-radio>
+ <el-radio value="鍗风瓛">鍗风瓛</el-radio>
+ </el-radio-group>
+ </el-descriptions-item>
+ <el-descriptions-item
+ label="鍒囨枡娉ㄦ剰浜嬮」"
+ :span="1"
+ align="center"
+ style="white-space: pre-line; word-break: break-all; min-height: 60px;"
+ >
+ <el-input
+ v-model="formData.productDescription"
+ :autosize="{ minRows: 2, maxRows: 4 }"
+ type="textarea"
+ placeholder="璇疯緭鍏ユ敞鎰忎簨椤�"
+ :disabled="isDetail"
+ />
+ </el-descriptions-item>
+ </el-descriptions>
+ <!-- ================= 鍒囨枡鍥剧ず ================= -->
+ <div class="section-title" v-if="type === 'add' || (type === 'detail' && formData.cuttingFileVo.length > 0)">
+ 鍒囨枡鍥剧ず
+ </div>
+ <ActionFileUpload
+ v-if="type === 'add' || (type === 'detail' && formData.cuttingFileVo.length > 0)"
+ style="width: 50%;float: left;"
+ v-model:file-list="formData.cuttingFileVo"
+ :action="upload.url"
+ :headers="upload.headers"
+ :multiple="false"
+ :limit="1"
+ :replaceOnExceed="true"
+ :disabled="isDetail"
+ :name="'files'"
+ :onSuccess="onSuccess"
+ :onDownload="onDownload"
+ :onRemove="onRemove"
+ :onPreview="onPreview"
+ :onView="type!=='detail'"
+ :tip-text="type === 'detail' ? '' : '鏀寔鍥剧墖锛坖pg, jpeg, png锛夋牸寮�'"
+ />
+ <el-image
+ v-if="formData.cuttingFileVo.length > 0"
+ style="width: 100px; height: 100px"
+ :src="resolveFileUrl(getUploadFileUrl(formData.cuttingFileVo[0]))"
+ fit="cover"
+ />
+ <!-- ================= 鍒囨枡淇℃伅 ================= -->
+ <el-descriptions
+ border
+ :column="6"
+ direction="vertical"
+ style="width: 100%"
+ class="fixed-desc"
>
- <el-radio-group v-model="formData.cuttingDiagramCheckout">
- <el-radio value="骞冲紶">骞冲紶</el-radio>
- <el-radio value="鍗风瓛">鍗风瓛</el-radio>
- </el-radio-group>
- </el-descriptions-item>
- <el-descriptions-item
- label="鍒囨枡娉ㄦ剰浜嬮」"
- :span="1"
- align="center"
- style="white-space: pre-line; word-break: break-all; min-height: 60px;"
- >
- <el-input
- v-model="formData.productDescription"
- :autosize="{ minRows: 2, maxRows: 4 }"
- type="textarea"
- placeholder="璇疯緭鍏ユ敞鎰忎簨椤�"
- :disabled="isDetail"
- />
- </el-descriptions-item>
- </el-descriptions>
- <!-- ================= 鍒囨枡鍥剧ず ================= -->
- <div class="section-title" v-if="type === 'add' || (type === 'detail' && formData.cuttingFileVo.length > 0)">鍒囨枡鍥剧ず</div>
- <ActionFileUpload
- v-if="type === 'add' || (type === 'detail' && formData.cuttingFileVo.length > 0)"
- style="width: 50%;float: left;"
- v-model:file-list="formData.cuttingFileVo"
- :action="upload.url"
- :headers="upload.headers"
- :multiple="false"
- :limit="1"
- :replaceOnExceed="true"
- :disabled="isDetail"
- :name="'files'"
- :onSuccess="onSuccess"
- :onDownload="onDownload"
- :onRemove="onRemove"
- :onPreview="onPreview"
- :onView="type!=='detail'"
- :tip-text="type === 'detail' ? '' : '鏀寔鍥剧墖锛坖pg, jpeg, png锛夋牸寮�'"
- />
- <el-image
- v-if="formData.cuttingFileVo.length > 0"
- style="width: 100px; height: 100px"
- :src="resolveFileUrl(getUploadFileUrl(formData.cuttingFileVo[0]))"
- fit="cover"
- />
- <!-- ================= 鍒囨枡淇℃伅 ================= -->
- <el-descriptions
- border
- :column="6"
- direction="vertical"
- style="width: 100%"
- class="fixed-desc"
- >
- <el-descriptions-item label="鍒囨枡灏哄" align="center">
- <el-input v-model="formData.cutNum" placeholder="鍒囨枡灏哄" :disabled="isDetail" />
- </el-descriptions-item>
- <el-descriptions-item label="鍒囨枡鏁伴噺" align="center">
- <el-input v-model="formData.cutSize" placeholder="鍒囨枡鏁伴噺" :disabled="isDetail" />
- </el-descriptions-item>
- <el-descriptions-item label="涓洅鏁伴噺" align="center">
- <el-input v-model="formData.mediumBoxQty" placeholder="涓洅鏁伴噺" :disabled="isDetail" />
- </el-descriptions-item>
- <el-descriptions-item label="灏忕洅鏁伴噺" align="center">
- <el-input v-model="formData.smallBoxQty" placeholder="灏忕洅鏁伴噺" :disabled="isDetail" />
- </el-descriptions-item>
- <el-descriptions-item label="姝f暟" align="center">
- <el-input v-model="formData.positiveQty" placeholder="姝f暟" :disabled="isDetail" />
- </el-descriptions-item>
- <el-descriptions-item label="鍔犳斁鏁�" align="center">
- <el-input v-model="formData.allowanceQty" placeholder="鍔犳斁鏁�" :disabled="isDetail" />
- </el-descriptions-item>
- </el-descriptions>
+ <el-descriptions-item label="鍒囨枡灏哄" align="center">
+ <el-input v-model="formData.cutNum" placeholder="鍒囨枡灏哄" :disabled="isDetail"/>
+ </el-descriptions-item>
+ <el-descriptions-item label="鍒囨枡鏁伴噺" align="center">
+ <el-input v-model="formData.cutSize" placeholder="鍒囨枡鏁伴噺" :disabled="isDetail"/>
+ </el-descriptions-item>
+ <el-descriptions-item label="涓洅鏁伴噺" align="center">
+ <el-input v-model="formData.mediumBoxQty" placeholder="涓洅鏁伴噺" :disabled="isDetail"/>
+ </el-descriptions-item>
+ <el-descriptions-item label="灏忕洅鏁伴噺" align="center">
+ <el-input v-model="formData.smallBoxQty" placeholder="灏忕洅鏁伴噺" :disabled="isDetail"/>
+ </el-descriptions-item>
+ <el-descriptions-item label="姝f暟" align="center">
+ <el-input v-model="formData.positiveQty" placeholder="姝f暟" :disabled="isDetail"/>
+ </el-descriptions-item>
+ <el-descriptions-item label="鍔犳斁鏁�" align="center">
+ <el-input v-model="formData.allowanceQty" placeholder="鍔犳斁鏁�" :disabled="isDetail"/>
+ </el-descriptions-item>
+ </el-descriptions>
- <div class="middle-sheet-table">
- <table class="middle-sheet-table__inner">
- <tbody>
+ <div class="middle-sheet-table">
+ <table class="middle-sheet-table__inner">
+ <tbody>
<tr>
<th>杞墖鐗�:</th>
<th colspan="2">寮�寮犺壊</th>
@@ -231,172 +233,172 @@
</tr>
<tr v-for="(plate, index) in formData.plateMaking" :key="index">
<td>
- <el-input v-model="plate.designProductionFee" placeholder="璇疯緭鍏ヨ璁″埗浣滆垂" :disabled="isDetail" />
+ <el-input v-model="plate.designProductionFee" placeholder="璇疯緭鍏ヨ璁″埗浣滆垂" :disabled="isDetail"/>
</td>
<td>
- <el-input v-model="plate.impositionFee" placeholder="璇疯緭鍏ユ嫾鐗堣垂" :disabled="isDetail" />
+ <el-input v-model="plate.impositionFee" placeholder="璇疯緭鍏ユ嫾鐗堣垂" :disabled="isDetail"/>
</td>
<td>
- <el-input v-model="plate.filmOutputFee" placeholder="璇疯緭鍏ュ嚭鐗囪垂" :disabled="isDetail" />
+ <el-input v-model="plate.filmOutputFee" placeholder="璇疯緭鍏ュ嚭鐗囪垂" :disabled="isDetail"/>
</td>
<td>
- <el-input v-model="plate.proofingFee" placeholder="璇疯緭鍏ユ墦鏍疯垂" :disabled="isDetail" />
+ <el-input v-model="plate.proofingFee" placeholder="璇疯緭鍏ユ墦鏍疯垂" :disabled="isDetail"/>
</td>
<td>
- <el-input v-model="plate.doctorBladePlateFee" placeholder="璇疯緭鍏ュ埆鍒�鐗堣垂" :disabled="isDetail" />
+ <el-input v-model="plate.doctorBladePlateFee" placeholder="璇疯緭鍏ュ埆鍒�鐗堣垂" :disabled="isDetail"/>
</td>
<td>
- <el-input v-model="plate.hotEmbossingPlateFee" placeholder="璇疯緭鍏ョ儷/鍑哥増璐�" :disabled="isDetail" />
+ <el-input v-model="plate.hotEmbossingPlateFee" placeholder="璇疯緭鍏ョ儷/鍑哥増璐�" :disabled="isDetail"/>
</td>
<td>
- <el-input v-model="plate.subtotalFee" placeholder="璇疯緭鍏ュ皬璁�" :disabled="isDetail" />
+ <el-input v-model="plate.subtotalFee" placeholder="璇疯緭鍏ュ皬璁�" :disabled="isDetail"/>
</td>
</tr>
- </tbody>
- </table>
- </div>
-<!-- class="section-title" -->
- <!-- ================= 宸ヨ壓鍔犲伐 ================= -->
- <div class="process-table-header">
- <div class="section-title">宸ヨ壓鍔犲伐</div>
- <el-button v-if="!isDetail" type="primary" size="small" @click="addProcessRow">鏂板涓�琛�</el-button>
- </div>
- <el-table border :data="formData.processContent" style="width: 100%" :span-method="objectSpanMethod">
- <el-table-column label="宸ュ簭" width="140">
- <template #default="{ row }">
- <el-select
- v-model="row.processId"
- placeholder="璇烽�夋嫨宸ュ簭"
- @change="(val) => onProcessChange(val, row)"
- :disabled="isDetail"
- >
- <el-option
- v-for="item in processOptions"
- :key="item.id"
- :label="item.name"
- :value="item.id"
- />
- </el-select>
- </template>
- </el-table-column>
- <el-table-column label="寮�鏁�">
- <template #default="{ row }">
- <el-input v-model="row.openCount" placeholder="璇疯緭鍏ュ紑鏁�" :disabled="isDetail" />
- </template>
- </el-table-column>
- <el-table-column label="宸ヨ壓姝f暟">
- <template #default="{ row }">
- <el-input v-model="row.processPositive" placeholder="璇疯緭鍏ュ伐鑹烘鏁�" :disabled="isDetail" />
- </template>
- </el-table-column>
- <el-table-column label="鍔犳斁鏁�">
- <template #default="{ row }">
- <el-input v-model="row.allowanceQty" placeholder="璇疯緭鍏ュ姞鏀炬暟" :disabled="isDetail" />
- </template>
- </el-table-column>
- <el-table-column width="180">
- <template #header>
- <span class="required">*</span>鏈哄彴
- </template>
- <template #default="{ row }">
- <el-select
- v-model="row.deviceId"
- placeholder="璇烽�夋嫨鏈哄彴"
- filterable
- clearable
- @change="(val) => handleDeviceChange(val, row)"
- :disabled="isDetail"
- >
- <el-option
- v-for="item in deviceOptions"
- :key="item.id"
- :label="item.deviceName"
- :value="item.id"
+ </tbody>
+ </table>
+ </div>
+ <!-- class="section-title" -->
+ <!-- ================= 宸ヨ壓鍔犲伐 ================= -->
+ <div class="process-table-header">
+ <div class="section-title">宸ヨ壓鍔犲伐</div>
+ <el-button v-if="!isDetail" type="primary" size="small" @click="addProcessRow">鏂板涓�琛�</el-button>
+ </div>
+ <el-table border :data="formData.processContent" style="width: 100%" :span-method="objectSpanMethod">
+ <el-table-column label="宸ュ簭" width="140">
+ <template #default="{ row }">
+ <el-select
+ v-model="row.processId"
+ placeholder="璇烽�夋嫨宸ュ簭"
+ @change="(val) => onProcessChange(val, row)"
+ :disabled="isDetail"
+ >
+ <el-option
+ v-for="item in processOptions"
+ :key="item.id"
+ :label="item.name"
+ :value="item.id"
+ />
+ </el-select>
+ </template>
+ </el-table-column>
+ <el-table-column label="寮�鏁�">
+ <template #default="{ row }">
+ <el-input v-model="row.openCount" placeholder="璇疯緭鍏ュ紑鏁�" :disabled="isDetail"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="宸ヨ壓姝f暟">
+ <template #default="{ row }">
+ <el-input v-model="row.processPositive" placeholder="璇疯緭鍏ュ伐鑹烘鏁�" :disabled="isDetail"/>
+ </template>
+ </el-table-column>
+ <el-table-column label="鍔犳斁鏁�">
+ <template #default="{ row }">
+ <el-input v-model="row.allowanceQty" placeholder="璇疯緭鍏ュ姞鏀炬暟" :disabled="isDetail"/>
+ </template>
+ </el-table-column>
+ <!-- <el-table-column width="180">-->
+ <!-- <template #header>-->
+ <!-- <span class="required">*</span>鏈哄彴-->
+ <!-- </template>-->
+ <!-- <template #default="{ row }">-->
+ <!-- <el-select-->
+ <!-- v-model="row.deviceId"-->
+ <!-- placeholder="璇烽�夋嫨鏈哄彴"-->
+ <!-- filterable-->
+ <!-- clearable-->
+ <!-- @change="(val) => handleDeviceChange(val, row)"-->
+ <!-- :disabled="isDetail"-->
+ <!-- >-->
+ <!-- <el-option-->
+ <!-- v-for="item in deviceOptions"-->
+ <!-- :key="item.id"-->
+ <!-- :label="item.deviceName"-->
+ <!-- :value="item.id"-->
+ <!-- />-->
+ <!-- </el-select>-->
+ <!-- </template>-->
+ <!-- </el-table-column>-->
+ <!-- <el-table-column width="220">-->
+ <!-- <template #header>-->
+ <!-- <span class="required">*</span>鎶ュ伐浜�-->
+ <!-- </template>-->
+ <!-- <template #default="{ row }">-->
+ <!-- <el-select-->
+ <!-- v-if="!isDetail"-->
+ <!-- v-model="row.reportUserIds"-->
+ <!-- placeholder="璇烽�夋嫨鎶ュ伐浜�"-->
+ <!-- filterable-->
+ <!-- clearable-->
+ <!-- multiple-->
+ <!-- collapse-tags-->
+ <!-- collapse-tags-tooltip-->
+ <!-- @change="(val) => handleReportUsersChange(val, row)"-->
+ <!-- :disabled="isDetail"-->
+ <!-- >-->
+ <!-- <el-option-->
+ <!-- v-for="item in userOptions"-->
+ <!-- :key="item.userId"-->
+ <!-- :label="item.nickName"-->
+ <!-- :value="item.userId"-->
+ <!-- />-->
+ <!-- </el-select>-->
+ <!-- <el-tag-->
+ <!-- v-else-->
+ <!-- v-for="item in row.reportWorkerList"-->
+ <!-- -->
+ <!-- :key="item.id"-->
+ <!-- >-->
+ <!-- {{ item.userName }}-->
+ <!-- </el-tag>-->
+ <!-- </template>-->
+ <!-- </el-table-column>-->
+ <el-table-column label="宸ヨ壓瑕佹眰">
+ <template #default="{ rowIndex }">
+ <el-input
+ v-model="formData.processRequirement"
+ type="textarea"
+ :rows="6"
+ placeholder="璇疯緭鍏ュ伐鑹鸿姹�"
+ :disabled="isDetail"
/>
- </el-select>
- </template>
- </el-table-column>
- <el-table-column width="220">
- <template #header>
- <span class="required">*</span>鎶ュ伐浜�
- </template>
- <template #default="{ row }">
- <el-select
- v-if="!isDetail"
- v-model="row.reportUserIds"
- placeholder="璇烽�夋嫨鎶ュ伐浜�"
- filterable
- clearable
- multiple
- collapse-tags
- collapse-tags-tooltip
- @change="(val) => handleReportUsersChange(val, row)"
- :disabled="isDetail"
- >
- <el-option
- v-for="item in userOptions"
- :key="item.userId"
- :label="item.nickName"
- :value="item.userId"
- />
- </el-select>
- <el-tag
- v-else
- v-for="item in row.reportWorkerList"
-
- :key="item.id"
- >
- {{ item.userName }}
- </el-tag>
- </template>
- </el-table-column>
- <el-table-column label="宸ヨ壓瑕佹眰">
- <template #default="{ rowIndex }">
- <el-input
- v-model="formData.processRequirement"
- type="textarea"
- :rows="6"
- placeholder="璇疯緭鍏ュ伐鑹鸿姹�"
- :disabled="isDetail"
- />
- </template>
- </el-table-column>
- <el-table-column v-if="!isDetail" label="鎿嶄綔" width="80">
- <template #default="{ $index }">
- <el-button type="danger" size="small" @click="removeProcessRow($index)">鍒犻櫎</el-button>
- </template>
- </el-table-column>
- </el-table>
+ </template>
+ </el-table-column>
+ <el-table-column v-if="!isDetail" label="鎿嶄綔" width="80">
+ <template #default="{ $index }">
+ <el-button type="danger" size="small" @click="removeProcessRow($index)">鍒犻櫎</el-button>
+ </template>
+ </el-table-column>
+ </el-table>
- <!-- ================= 鍖呰淇℃伅 ================= -->
- <el-descriptions border :column="3" class="mt">
- <el-descriptions-item label="閫佽揣鍦扮偣" align="center">
- <el-input v-model="formData.deliveryAddress" placeholder="閫佽揣鍦扮偣" :disabled="isDetail" />
- </el-descriptions-item>
+ <!-- ================= 鍖呰淇℃伅 ================= -->
+ <el-descriptions border :column="3" class="mt">
+ <el-descriptions-item label="閫佽揣鍦扮偣" align="center">
+ <el-input v-model="formData.deliveryAddress" placeholder="閫佽揣鍦扮偣" :disabled="isDetail"/>
+ </el-descriptions-item>
- <el-descriptions-item label="鑱旂郴浜�" align="center">
- <el-input v-model="formData.contactName" placeholder="鑱旂郴浜�" :disabled="isDetail" />
- </el-descriptions-item>
+ <el-descriptions-item label="鑱旂郴浜�" align="center">
+ <el-input v-model="formData.contactName" placeholder="鑱旂郴浜�" :disabled="isDetail"/>
+ </el-descriptions-item>
- <el-descriptions-item label="鍖呰瑕佹眰" align="center">
- <el-input v-model="formData.packagingRequirement" placeholder="鍖呰瑕佹眰" :disabled="isDetail" />
- </el-descriptions-item>
+ <el-descriptions-item label="鍖呰瑕佹眰" align="center">
+ <el-input v-model="formData.packagingRequirement" placeholder="鍖呰瑕佹眰" :disabled="isDetail"/>
+ </el-descriptions-item>
- <el-descriptions-item label="灏哄" align="center">
- <el-input v-model="formData.postProcessSize" placeholder="灏哄" :disabled="isDetail" />
- </el-descriptions-item>
+ <el-descriptions-item label="灏哄" align="center">
+ <el-input v-model="formData.postProcessSize" placeholder="灏哄" :disabled="isDetail"/>
+ </el-descriptions-item>
- <el-descriptions-item label="瀹氳揣鏁伴噺" align="center">
- {{formData.orderQty || "--"}}
- </el-descriptions-item>
+ <el-descriptions-item label="瀹氳揣鏁伴噺" align="center">
+ {{ formData.orderQty || "--" }}
+ </el-descriptions-item>
- <el-descriptions-item label="瀹炰氦鏁伴噺" :span="3" align="center">
- <el-input v-model="formData.actualDeliveryQty" placeholder="瀹炰氦鏁伴噺" :disabled="isDetail" />
- </el-descriptions-item>
- </el-descriptions>
+ <el-descriptions-item label="瀹炰氦鏁伴噺" :span="3" align="center">
+ <el-input v-model="formData.actualDeliveryQty" placeholder="瀹炰氦鏁伴噺" :disabled="isDetail"/>
+ </el-descriptions-item>
+ </el-descriptions>
</div>
</FormDialog>
- <filePreview ref="filePreviewRef" />
+ <filePreview ref="filePreviewRef"/>
</template>
<script setup>
@@ -433,7 +435,7 @@
})
const emit = defineEmits(['update:modelValue', 'confirm'])
-const { proxy } = getCurrentInstance()
+const {proxy} = getCurrentInstance()
const visible = computed({
get: () => props.modelValue,
@@ -448,7 +450,7 @@
const introductionLetterList = ref([])
const upload = reactive({
url: import.meta.env.VITE_APP_BASE_API + '/basic/customer-follow/upload',
- headers: { Authorization: 'Bearer ' + getToken() }
+ headers: {Authorization: 'Bearer ' + getToken()}
})
const showCuttingFile = computed(() => {
@@ -457,101 +459,6 @@
const filePreviewRef = ref()
const formData = reactive({
- productOrderList:null,
- salesLedgerId: null,
- productOrderId: null,
- printOrderTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
- cuttingFileVo:[],
- finishTime: "",
- no: "",
- productName: "",
- productDescription: "",
- cuttingDiagramCheckout:"",
- clientName: "",
- finishedSize: "",
- cutNum: "",
- cutSize:"",
- mediumBoxQty: "",
- smallBoxQty: "",
- positiveQty: "",
- allowanceQty: "",
- introductionLetter: "",
- plateMaking: [
- {
- designProductionFee: "",
- impositionFee: "",
- filmOutputFee: "",
- proofingFee: "",
- doctorBladePlateFee: "",
- hotEmbossingPlateFee: "",
- subtotalFee: ""
- }
- ],
- processContent: [
- {
- processId: "",
- processName: "",
- mediumBoxQty: "",
- smallBoxQty: "",
- openCount: "",
- processPositive: "",
- allowanceQty: "",
- deviceId: "",
- deviceName: "",
- reportUserIds: [],
- reportWorkerList: []
- }
- ],
- materialInfo: [
- {
- productId: "",
- name: "",
- productModelId: "",
- model: "",
- modelOptions: [],
- num: "",
- numSuffix: "寮�",
- unitSuffix: "鍏�/kg",
- unit: "",
- price: "",
- totalAmount: ""
- }
- ],
- processRequirement: "",
- deliveryAddress: "",
- contactName: "",
- packagingRequirement: "",
- postProcessSize: "",
- orderQty: "",
- actualDeliveryQty: "",
- productionDept: "",
- technicalDept: "",
- warehouseDept: "",
- productModelId: "",
- specificationModel:"",
-})
-
-const getUploadFileUrl = (file) => {
- const response = file?.response
- const data = response?.data
- if (Array.isArray(data) && data.length) {
- return data[0]?.fileUrl || data[0]?.url || data[0]?.tempPath || ""
- }
-
- return file?.url || file?.fileUrl || data?.tempPath || data?.url || data?.fileUrl || ""
-}
-
-// 鐩戝惉 checkbox group 鍙樺寲骞跺悓姝ュ埌 introductionLetter 瀛楃涓�
-watch(introductionLetterList, (val) => {
- formData.introductionLetter = val.join(',')
-})
-const onProcessChange = (processId, row) => {
- const selected = processOptions.value.find(item => item.id === processId)
- row.processName = selected?.name || ''
-}
-const cloneDeep = (val) => JSON.parse(JSON.stringify(val))
-
-const createDefaultFormData = () => ({
productOrderList: null,
salesLedgerId: null,
productOrderId: null,
@@ -561,7 +468,7 @@
no: "",
productName: "",
productDescription: "",
- cuttingDiagramCheckout:"骞冲紶",
+ cuttingDiagramCheckout: "",
clientName: "",
finishedSize: "",
cutNum: "",
@@ -591,10 +498,16 @@
openCount: "",
processPositive: "",
allowanceQty: "",
- deviceId: "",
- deviceName: "",
- reportUserIds: [],
- reportWorkerList: []
+ deviceId: "0",
+ deviceName: "0",
+ reportUserIds: [{
+ userId: "0",
+ userName: "0"
+ }],
+ reportWorkerList: [{
+ userId: "0",
+ userName: "0"
+ }],
}
],
materialInfo: [
@@ -624,7 +537,108 @@
warehouseDept: "",
productModelId: "",
specificationModel: "",
- cuttingFileId:""
+})
+
+const getUploadFileUrl = (file) => {
+ const response = file?.response
+ const data = response?.data
+ if (Array.isArray(data) && data.length) {
+ return data[0]?.fileUrl || data[0]?.url || data[0]?.tempPath || ""
+ }
+
+ return file?.url || file?.fileUrl || data?.tempPath || data?.url || data?.fileUrl || ""
+}
+
+// 鐩戝惉 checkbox group 鍙樺寲骞跺悓姝ュ埌 introductionLetter 瀛楃涓�
+watch(introductionLetterList, (val) => {
+ formData.introductionLetter = val.join(',')
+})
+const onProcessChange = (processId, row) => {
+ const selected = processOptions.value.find(item => item.id === processId)
+ row.processName = selected?.name || ''
+}
+const cloneDeep = (val) => JSON.parse(JSON.stringify(val))
+
+const createDefaultFormData = () => ({
+ productOrderList: null,
+ salesLedgerId: null,
+ productOrderId: null,
+ printOrderTime: dayjs().format('YYYY-MM-DD HH:mm:ss'),
+ cuttingFileVo: [],
+ finishTime: "",
+ no: "",
+ productName: "",
+ productDescription: "",
+ cuttingDiagramCheckout: "骞冲紶",
+ clientName: "",
+ finishedSize: "",
+ cutNum: "",
+ cutSize: "",
+ mediumBoxQty: "",
+ smallBoxQty: "",
+ positiveQty: "",
+ allowanceQty: "",
+ introductionLetter: "",
+ plateMaking: [
+ {
+ designProductionFee: "",
+ impositionFee: "",
+ filmOutputFee: "",
+ proofingFee: "",
+ doctorBladePlateFee: "",
+ hotEmbossingPlateFee: "",
+ subtotalFee: ""
+ }
+ ],
+ processContent: [
+ {
+ processId: "",
+ processName: "",
+ mediumBoxQty: "",
+ smallBoxQty: "",
+ openCount: "",
+ processPositive: "",
+ allowanceQty: "",
+ deviceId: "0",
+ deviceName: "0",
+ reportUserIds: [{
+ userId: "0",
+ userName: "0"
+ }],
+ reportWorkerList: [{
+ userId: "0",
+ userName: "0"
+ }],
+ }
+ ],
+ materialInfo: [
+ {
+ productId: "",
+ name: "",
+ productModelId: "",
+ model: "",
+ modelOptions: [],
+ num: "",
+ numSuffix: "寮�",
+ unitSuffix: "鍏�/kg",
+ unit: "",
+ price: "",
+ totalAmount: ""
+ }
+ ],
+ processRequirement: "",
+ deliveryAddress: "",
+ contactName: "",
+ packagingRequirement: "",
+ postProcessSize: "",
+ orderQty: "",
+ actualDeliveryQty: "",
+ productionDept: "",
+ technicalDept: "",
+ warehouseDept: "",
+ productModelId: "",
+ specificationModel: "",
+ cuttingFileId: ""
})
const resetForm = () => {
@@ -636,7 +650,7 @@
}
const onSuccess = (response, uploadFile, uploadFiles) => {
- const data = response?.data
+ const data = response?.data
if (uploadFile && !uploadFile.url) {
uploadFile.url = (Array.isArray(data) ? data?.[0]?.fileUrl : data?.fileUrl) || data?.tempPath || data?.url || response?.url || ""
@@ -697,12 +711,12 @@
}
if (Array.isArray(formData.cuttingFileVo)) {
formData.cuttingFileVo = formData.cuttingFileVo
- .filter(Boolean)
- .map((f) => ({
- ...f,
- name: f?.name || f?.fileName || "",
- url: f?.url || f?.fileUrl || "",
- }))
+ .filter(Boolean)
+ .map((f) => ({
+ ...f,
+ name: f?.name || f?.fileName || "",
+ url: f?.url || f?.fileUrl || "",
+ }))
}
// 鍏煎 index.vue 閲屽父鐢ㄥ瓧娈靛悕涓庡脊绐楀瓧娈靛悕涓嶄竴鑷寸殑鎯呭喌
@@ -723,19 +737,19 @@
}
introductionLetterList.value = String(formData.introductionLetter || "")
- .split(",")
- .map(s => s.trim())
- .filter(Boolean)
+ .split(",")
+ .map(s => s.trim())
+ .filter(Boolean)
}
// 鑾峰彇閿�鍞鍗�
const getProductOrder = () => {
- if(!formData.salesLedgerId) return
+ if (!formData.salesLedgerId) return
getSalesLedgerWithProducts({
type: "1",
id: formData.salesLedgerId
}).then(res => {
- if(res){
+ if (res) {
formData.productOrderList = res
}
})
@@ -744,15 +758,15 @@
watch(() => props.orderData, (val) => {
mergeRowDataToForm(val)
-}, { immediate: true, deep: true })
+}, {immediate: true, deep: true})
watch(
- () => props.rowData,
- (val) => {
- mergeRowDataToForm(val)
- getProductOrder()
- },
- { immediate: true, deep: true }
+ () => props.rowData,
+ (val) => {
+ mergeRowDataToForm(val)
+ getProductOrder()
+ },
+ {immediate: true, deep: true}
)
const getProcessList = () => {
@@ -760,7 +774,6 @@
processOptions.value = res.data
})
}
-
const getDeviceList = () => {
@@ -845,7 +858,7 @@
if (!val) return
- const res = await modelList({ id: val })
+ const res = await modelList({id: val})
formData.materialInfo[index] = {
...targetRow,
modelOptions: Array.isArray(res) ? res :
@@ -899,10 +912,16 @@
openCount: "",
processPositive: "",
allowanceQty: "",
- deviceId: "",
- deviceName: "",
- reportUserIds: [],
- reportWorkerList: []
+ deviceId: "0",
+ deviceName: "0",
+ reportUserIds: [{
+ userId: "0",
+ userName: "0"
+ }],
+ reportWorkerList: [{
+ userId: "0",
+ userName: "0"
+ }],
})
}
@@ -910,7 +929,7 @@
formData.processContent.splice(index, 1)
}
-const objectSpanMethod = ({ column, rowIndex }) => {
+const objectSpanMethod = ({column, rowIndex}) => {
if (column.label === "宸ヨ壓瑕佹眰") {
if (rowIndex === 0) {
return {
@@ -958,7 +977,7 @@
delete payload.productOrderList
if (Array.isArray(payload.materialInfo)) {
payload.materialInfo = payload.materialInfo.map((item) => {
- const { modelOptions, ...rest } = item || {}
+ const {modelOptions, ...rest} = item || {}
return rest
})
}
@@ -988,10 +1007,12 @@
.fixed-desc {
margin-top: 20px;
+
:deep(.el-descriptions__table) {
table-layout: fixed;
width: 100%;
}
+
:deep(.el-descriptions__cell) {
width: 25%;
word-break: break-word;
@@ -1034,6 +1055,7 @@
display: flex;
justify-content: space-between;
align-items: center;
+
span {
font-size: 16px;
font-weight: bold;
@@ -1043,10 +1065,12 @@
.mt {
margin-top: 20px;
}
+
:deep(.required) {
color: #f56c6c;
}
-:deep(.el-textarea__inner){
+
+:deep(.el-textarea__inner) {
box-shadow: none;
}
diff --git a/src/views/productionManagement/workOrder/index.vue b/src/views/productionManagement/workOrder/index.vue
index 3834751..177fc8a 100644
--- a/src/views/productionManagement/workOrder/index.vue
+++ b/src/views/productionManagement/workOrder/index.vue
@@ -9,11 +9,12 @@
placeholder="璇疯緭鍏�"
@change="handleQuery"
clearable
- prefix-icon="Search" />
+ prefix-icon="Search"/>
</div>
<div class="search-item">
<el-button type="primary"
- @click="handleQuery">鎼滅储</el-button>
+ @click="handleQuery">鎼滅储
+ </el-button>
</div>
</div>
</div>
@@ -27,7 +28,7 @@
<template #completionStatus="{ row }">
<el-progress :percentage="toProgressPercentage(row?.completionStatus)"
:color="progressColor(toProgressPercentage(row?.completionStatus))"
- :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''" />
+ :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''"/>
</template>
</PIMTable>
</div>
@@ -41,28 +42,28 @@
type="date"
placeholder="璇烽�夋嫨"
value-format="YYYY-MM-DD"
- style="width: 300px" />
+ style="width: 300px"/>
</el-form-item>
<el-form-item label="璁″垝缁撴潫鏃堕棿">
<el-date-picker v-model="editrow.planEndTime"
type="date"
placeholder="璇烽�夋嫨"
value-format="YYYY-MM-DD"
- style="width: 300px" />
+ style="width: 300px"/>
</el-form-item>
<el-form-item label="瀹為檯寮�濮嬫椂闂�">
<el-date-picker v-model="editrow.actualStartTime"
type="date"
placeholder="璇烽�夋嫨"
value-format="YYYY-MM-DD"
- style="width: 300px" />
+ style="width: 300px"/>
</el-form-item>
<el-form-item label="瀹為檯缁撴潫鏃堕棿">
<el-date-picker v-model="editrow.actualEndTime"
type="date"
placeholder="璇烽�夋嫨"
value-format="YYYY-MM-DD"
- style="width: 300px" />
+ style="width: 300px"/>
</el-form-item>
</el-form>
<template #footer>
@@ -150,7 +151,7 @@
<div class="qr-container">
<img :src="transferCardQrUrl"
alt="娴佽浆鍗′簩缁寸爜"
- style="width: 200px; height: 200px;" />
+ style="width: 200px; height: 200px;"/>
<!-- <div class="qr-tip"
style="margin-top: 10px; text-align: center;">娴佽浆鍗′簩缁寸爜</div> -->
</div>
@@ -161,102 +162,153 @@
margin-bottom: 40px;">
<el-button type="primary"
style="margin-top: 20px;"
- @click="printTransferCard">鎵撳嵃娴佽浆鍗�</el-button>
+ @click="printTransferCard">鎵撳嵃娴佽浆鍗�
+ </el-button>
</div>
</el-dialog>
<el-dialog v-model="reportDialogVisible"
- :title="`鎶ュ伐(鏈哄彴:${currentReportRowData?.deviceName || '-'})`"
- width="500px">
- <el-form ref="reportFormRef"
- :model="reportForm"
- :rules="reportFormRules"
- label-width="120px">
- <el-form-item label="寰呯敓浜ф暟閲�">
- <el-input v-model="reportForm.planQuantity"
- readonly
- style="width: 300px" />
- </el-form-item>
- <el-form-item label="鏈鐢熶骇鏁伴噺"
- prop="quantity">
- <el-input v-model.number="reportForm.quantity"
- type="number"
- min="1"
- step="1"
- style="width: 300px"
- placeholder="璇疯緭鍏ユ湰娆$敓浜ф暟閲�"
- @input="handleQuantityInput" />
- </el-form-item>
- <el-form-item label="琛ヤ骇鏁伴噺"
- prop="replenishQty">
- <el-input v-model.number="reportForm.replenishQty"
- type="number"
- min="0"
- step="1"
- style="width: 300px"
- placeholder="璇疯緭鍏ヨˉ浜ф暟閲�" />
- </el-form-item>
- <el-form-item label="鎶ュ簾鏁伴噺"
- prop="scrapQty">
- <el-input v-model.number="reportForm.scrapQty"
- type="number"
- min="0"
- step="1"
- style="width: 300px"
- placeholder="璇疯緭鍏ユ姤搴熸暟閲�"
- @input="handleScrapQtyInput" />
- </el-form-item>
- <el-form-item label="鐝粍淇℃伅">
- <el-select
- v-model="reportForm.teamList"
- multiple
- filterable
- clearable
- collapse-tags
- value-key="userId"
- placeholder="璇烽�夋嫨鐝粍鎴愬憳"
- style="width: 300px"
- >
- <el-option
- v-for="user in userTeamOptions"
- :key="user.userId"
- :label="user.nickName"
- :value="{ userId: user.userId, userName: user.nickName }"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="寮�濮嬫椂闂�"
- prop="startTime">
- <el-date-picker v-model="reportForm.startTime"
- type="datetime"
- value-format="YYYY-MM-DD HH:mm:ss"
- format="YYYY-MM-DD HH:mm:ss"
- style="width: 300px"
- placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
- clearable />
- </el-form-item>
- <el-form-item label="缁撴潫鏃堕棿"
- prop="endTime">
- <el-date-picker v-model="reportForm.endTime"
- type="datetime"
- value-format="YYYY-MM-DD HH:mm:ss"
- format="YYYY-MM-DD HH:mm:ss"
- style="width: 300px"
- placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
- clearable />
- </el-form-item>
- <el-form-item label="瀹℃牳浜�" prop="auditUserId">
- <el-select v-model="reportForm.auditUserId"
- style="width: 300px"
- placeholder="璇烽�夋嫨瀹℃牳浜�"
- clearable
- filterable
- @change="handleReviewerIdChange">
- <el-option v-for="user in userOptions"
- :key="user.userId"
- :label="user.nickName"
- :value="user.userId" />
- </el-select>
- </el-form-item>
+ :title="`鎶ュ伐(宸ュ崟缂栧彿:${currentReportRowData?.workOrderNo || '-'})`"
+ width="1000px">
+ <el-form
+ ref="reportFormRef"
+ :model="reportForm"
+ :rules="reportFormRules"
+ label-width="120px"
+ >
+ <el-row :gutter="20">
+
+ <el-col :span="12">
+ <el-form-item label="寰呯敓浜ф暟閲�">
+ <el-input v-model="reportForm.planQuantity" readonly disabled/>
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="鏈鐢熶骇鏁伴噺" prop="quantity">
+ <el-input
+ v-model.number="reportForm.quantity"
+ type="number"
+ min="1"
+ step="1"
+ placeholder="璇疯緭鍏ユ湰娆$敓浜ф暟閲�"
+ style="width: 100%"
+ @input="handleQuantityInput"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="琛ヤ骇鏁伴噺" prop="replenishQty">
+ <el-input
+ v-model.number="reportForm.replenishQty"
+ type="number"
+ min="0"
+ step="1"
+ placeholder="璇疯緭鍏ヨˉ浜ф暟閲�"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="鎶ュ簾鏁伴噺" prop="scrapQty">
+ <el-input
+ v-model.number="reportForm.scrapQty"
+ type="number"
+ min="0"
+ step="1"
+ placeholder="璇疯緭鍏ユ姤搴熸暟閲�"
+ @input="handleScrapQtyInput"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="鐝粍淇℃伅" prop="teamList">
+ <el-select
+ v-model="reportForm.teamList"
+ multiple
+ filterable
+ clearable
+ collapse-tags
+ value-key="userId"
+ placeholder="璇烽�夋嫨鐝粍鎴愬憳"
+ >
+ <el-option
+ v-for="user in userTeamOptions"
+ :key="user.userId"
+ :label="user.nickName"
+ :value="{ userId: user.userId, userName: user.nickName }"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="鏈哄彴" prop="machineId">
+ <el-select
+ v-model="reportForm.machineId"
+ placeholder="璇烽�夋嫨鏈哄彴"
+ filterable
+ clearable
+ @change="(val) => handleDeviceChange(val)"
+ :disabled="isDetail"
+ >
+ <el-option
+ v-for="item in deviceOptions"
+ :key="item.id"
+ :label="item.deviceName"
+ :value="item.id"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="寮�濮嬫椂闂�" prop="startTime">
+ <el-date-picker
+ v-model="reportForm.startTime"
+ type="datetime"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ format="YYYY-MM-DD HH:mm:ss"
+ placeholder="璇烽�夋嫨寮�濮嬫椂闂�"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="缁撴潫鏃堕棿" prop="endTime">
+ <el-date-picker
+ v-model="reportForm.endTime"
+ type="datetime"
+ value-format="YYYY-MM-DD HH:mm:ss"
+ format="YYYY-MM-DD HH:mm:ss"
+ placeholder="璇烽�夋嫨缁撴潫鏃堕棿"
+ style="width: 100%"
+ />
+ </el-form-item>
+ </el-col>
+
+ <el-col :span="12">
+ <el-form-item label="瀹℃牳浜�" prop="auditUserId">
+ <el-select
+ v-model="reportForm.auditUserId"
+ placeholder="璇烽�夋嫨瀹℃牳浜�"
+ clearable
+ filterable
+ @change="handleReviewerIdChange"
+ >
+ <el-option
+ v-for="user in userOptions"
+ :key="user.userId"
+ :label="user.nickName"
+ :value="user.userId"
+ />
+ </el-select>
+ </el-form-item>
+ </el-col>
+
+ </el-row>
</el-form>
<template #footer>
<span class="dialog-footer">
@@ -267,29 +319,29 @@
</template>
</el-dialog>
<el-dialog
- v-model="auditDialogVisible"
- title="瀹℃牳"
- width="1000px"
- :close-on-click-modal="false"
+ v-model="auditDialogVisible"
+ title="瀹℃牳"
+ width="1000px"
+ :close-on-click-modal="false"
>
<el-table :data="auditTableData" border style="width: 100%" v-loading="auditLoading">
- <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="140" show-overflow-tooltip />
- <el-table-column label="瑙勬牸" prop="model" min-width="120" show-overflow-tooltip />
- <el-table-column label="鍗曚綅" prop="unit" width="80" />
- <el-table-column label="宸ュ簭鍚嶇О" prop="processName" min-width="120" show-overflow-tooltip />
- <el-table-column label="闇�姹傛暟閲�" prop="planQuantity" width="110" />
- <el-table-column label="瀹屾垚鏁伴噺" prop="completeQuantity" width="110" />
+ <el-table-column label="浜у搧鍚嶇О" prop="productName" min-width="140" show-overflow-tooltip/>
+ <el-table-column label="瑙勬牸" prop="model" min-width="120" show-overflow-tooltip/>
+ <el-table-column label="鍗曚綅" prop="unit" width="80"/>
+ <el-table-column label="宸ュ簭鍚嶇О" prop="processName" min-width="120" show-overflow-tooltip/>
+ <el-table-column label="闇�姹傛暟閲�" prop="planQuantity" width="110"/>
+ <el-table-column label="瀹屾垚鏁伴噺" prop="completeQuantity" width="110"/>
<el-table-column label="瀹屾垚杩涘害" prop="completionStatus" width="140">
<template #default="{ row }">
<el-progress
- :percentage="toProgressPercentage(row?.completionStatus)"
- :color="progressColor(toProgressPercentage(row?.completionStatus))"
- :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''"
+ :percentage="toProgressPercentage(row?.completionStatus)"
+ :color="progressColor(toProgressPercentage(row?.completionStatus))"
+ :status="toProgressPercentage(row?.completionStatus) >= 100 ? 'success' : ''"
/>
</template>
</el-table-column>
- <el-table-column label="璁″垝寮�濮嬫椂闂�" prop="planStartTime" width="140" />
- <el-table-column label="璁″垝缁撴潫鏃堕棿" prop="planEndTime" width="140" />
+ <el-table-column label="璁″垝寮�濮嬫椂闂�" prop="planStartTime" width="140"/>
+ <el-table-column label="璁″垝缁撴潫鏃堕棿" prop="planEndTime" width="140"/>
</el-table>
<template #footer>
<span class="dialog-footer">
@@ -299,460 +351,483 @@
</span>
</template>
</el-dialog>
- <FilesDia ref="workOrderFilesRef" />
+ <FilesDia ref="workOrderFilesRef"/>
</div>
</template>
<script setup>
- import { onMounted, ref, nextTick, computed } from "vue";
- import { deepClone } from "@/utils/index.js"
- import { ElMessageBox, ElMessage } from "element-plus";
- import dayjs from "dayjs";
- import {
- productWorkOrderPage,
- updateProductWorkOrder,
- addProductMain,
- downProductWorkOrder,
- } from "@/api/productionManagement/workOrder.js";
- import { getUserProfile, userListNoPageByTenantId } from "@/api/system/user.js";
- import QRCode from "qrcode";
- import { getCurrentInstance, reactive, toRefs } from "vue";
- import FilesDia from "./components/filesDia.vue";
- const { proxy } = getCurrentInstance();
+import {onMounted, ref, nextTick, computed} from "vue";
+import {deepClone} from "@/utils/index.js"
+import {ElMessageBox, ElMessage} from "element-plus";
+import dayjs from "dayjs";
+import {
+ productWorkOrderPage,
+ updateProductWorkOrder,
+ addProductMain,
+ downProductWorkOrder,
+} from "@/api/productionManagement/workOrder.js";
+import {getUserProfile, userListNoPageByTenantId} from "@/api/system/user.js";
+import QRCode from "qrcode";
+import {getCurrentInstance, reactive, toRefs} from "vue";
+import FilesDia from "./components/filesDia.vue";
+import {getDeviceLedger} from "@/api/equipmentManagement/ledger.js";
- const currentUserId = ref("");
- const currentUserName = ref("");
+const {proxy} = getCurrentInstance();
- const ensureCurrentUser = async () => {
- if (currentUserId.value) return;
- try {
- const res = await getUserProfile();
- if (res?.code === 200) {
- currentUserId.value = String(res?.data?.userId ?? "");
- currentUserName.value = String(res?.data?.nickName ?? "");
- }
- } catch (err) {
- console.error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触", err);
+const currentUserId = ref("");
+const deviceOptions = ref([])
+const currentUserName = ref("");
+
+const ensureCurrentUser = async () => {
+ if (currentUserId.value) return;
+ try {
+ const res = await getUserProfile();
+ if (res?.code === 200) {
+ currentUserId.value = String(res?.data?.userId ?? "");
+ currentUserName.value = String(res?.data?.nickName ?? "");
}
- };
+ } catch (err) {
+ console.error("鑾峰彇鐢ㄦ埛淇℃伅澶辫触", err);
+ }
+};
- const normalizeArray = (val) => {
- if (val === null || val === undefined) return [];
- if (Array.isArray(val)) return val;
- if (typeof val === "string") {
- return val
+// 鏈哄彴鑾峰彇
+const getDeviceList = () => {
+ getDeviceLedger().then(res => {
+ deviceOptions.value = Array.isArray(res?.data) ? res.data : []
+ })
+}
+
+const handleDeviceChange = (val) => {
+ const device = deviceOptions.value.find(item => item.id === val)
+ reportForm.machineName = device?.deviceName || ""
+ reportForm.machineId = val || ""
+}
+
+const normalizeArray = (val) => {
+ if (val === null || val === undefined) return [];
+ if (Array.isArray(val)) return val;
+ if (typeof val === "string") {
+ return val
.split(/[,锛�;锛沑s]+/g)
.map((s) => s.trim())
.filter(Boolean);
- }
- return [val];
- };
+ }
+ return [val];
+};
- const isCurrentUserReportWorker = (row) => {
- const uid = String(currentUserId.value || "");
- if (!uid) return false;
- if (!row) return false;
+const isCurrentUserReportWorker = (row) => {
+ const uid = String(currentUserId.value || "");
+ if (!uid) return false;
+ if (!row) return false;
- const candidateIds = [
- row.reportUserIds,
- row.reportWorkerIds,
- row.userIds,
- row.userIdList,
- row.reportUserId,
- row.userId,
- ]
+ const candidateIds = [
+ row.reportUserIds,
+ row.reportWorkerIds,
+ row.userIds,
+ row.userIdList,
+ row.reportUserId,
+ row.userId,
+ ]
.flatMap((v) => normalizeArray(v))
.map((v) => String(v))
.filter(Boolean);
- if (candidateIds.includes(uid)) return true;
+ if (candidateIds.includes(uid)) return true;
- const candidateNames = [
- row.userNames,
- row.reportUserNames,
- row.reportWorkerNames,
- row.userName,
- ]
+ const candidateNames = [
+ row.userNames,
+ row.reportUserNames,
+ row.reportWorkerNames,
+ row.userName,
+ ]
.flatMap((v) => normalizeArray(v))
.map((v) => String(v))
.filter(Boolean);
- if (currentUserName.value && candidateNames.includes(currentUserName.value)) {
- return true;
- }
+ if (currentUserName.value && candidateNames.includes(currentUserName.value)) {
+ return true;
+ }
- if (Array.isArray(row.reportWorkerList)) {
- const list = row.reportWorkerList
+ if (Array.isArray(row.reportWorkerList)) {
+ const list = row.reportWorkerList
.map((item) => String(item?.userId ?? item?.id ?? ""))
.filter(Boolean);
- if (list.includes(uid)) return true;
- const nameList = row.reportWorkerList
+ if (list.includes(uid)) return true;
+ const nameList = row.reportWorkerList
.map((item) => String(item?.userName ?? item?.nickName ?? ""))
.filter(Boolean);
- if (currentUserName.value && nameList.includes(currentUserName.value)) return true;
- }
+ if (currentUserName.value && nameList.includes(currentUserName.value)) return true;
+ }
- return false;
- };
+ return false;
+};
- const canOperateByReportWorker = computed(() => {
- return (row) => isCurrentUserReportWorker(row);
- });
+const canOperateByReportWorker = computed(() => {
+ return (row) => isCurrentUserReportWorker(row);
+});
- const tableColumn = ref([
- {
- label: "宸ュ崟绫诲瀷",
- prop: "workOrderType",
- width: "80",
- },
- {
- label: "宸ュ崟缂栧彿",
- prop: "workOrderNo",
- width: "140",
- },
- {
- label: "鐢熶骇璁㈠崟鍙�",
- prop: "productOrderNpsNo",
- width: "140",
- },
- {
- label: "浜у搧鍚嶇О",
- prop: "productName",
- width: "140",
- },
- {
- label: "瑙勬牸",
- prop: "model",
- },
- {
- label: "鍗曚綅",
- prop: "unit",
- },
- {
- label: "宸ュ簭鍚嶇О",
- prop: "processName",
- },
- {
- label: "鏈哄彴鍚嶇О",
- prop: "deviceName",
- },
- {
- label: "闇�姹傛暟閲�",
- prop: "planQuantity",
- width: "140",
- },
- {
- label: "瀹屾垚鏁伴噺",
- prop: "completeQuantity",
- width: "140",
- },
- {
- label: "瀹屾垚杩涘害",
- prop: "completionStatus",
- dataType: "slot",
- slot: "completionStatus",
- width: "140",
- },
- {
- label: "鎶ュ伐浜�",
- prop: "userNames",
- width: "140",
- },
- {
- label: "璁″垝寮�濮嬫椂闂�",
- prop: "planStartTime",
- width: "140",
- },
- {
- label: "璁″垝缁撴潫鏃堕棿",
- prop: "planEndTime",
- width: "140",
- },
- {
- label: "瀹為檯寮�濮嬫椂闂�",
- prop: "actualStartTime",
- width: "140",
- },
- {
- label: "瀹為檯缁撴潫鏃堕棿",
- prop: "actualEndTime",
- width: "140",
- },
- {
- label: "鎿嶄綔",
- width: "200",
- align: "center",
- dataType: "action",
- fixed: "right",
- operation: [
- {
- name: "缂栬緫",
- clickFun: row => {
- handleEdit(row);
- },
- // 褰撻渶姹傛暟閲忕瓑浜庡畬鎴愭暟閲忕殑鏃跺�欙紝鎸夐挳涓嶅彲鐐瑰嚮
- disabled: row =>
+const tableColumn = ref([
+ {
+ label: "宸ュ崟绫诲瀷",
+ prop: "workOrderType",
+ width: "80",
+ },
+ {
+ label: "宸ュ崟缂栧彿",
+ prop: "workOrderNo",
+ width: "140",
+ },
+ {
+ label: "鐢熶骇璁㈠崟鍙�",
+ prop: "productOrderNpsNo",
+ width: "140",
+ },
+ {
+ label: "浜у搧鍚嶇О",
+ prop: "productName",
+ width: "140",
+ },
+ {
+ label: "瑙勬牸",
+ prop: "model",
+ },
+ {
+ label: "鍗曚綅",
+ prop: "unit",
+ },
+ {
+ label: "宸ュ簭鍚嶇О",
+ prop: "processName",
+ },
+ // {
+ // label: "鏈哄彴鍚嶇О",
+ // prop: "deviceName",
+ // },
+ {
+ label: "鏈哄彴鍚嶇О",
+ prop: "deviceNames",
+ },
+ {
+ label: "闇�姹傛暟閲�",
+ prop: "planQuantity",
+ width: "140",
+ },
+ {
+ label: "瀹屾垚鏁伴噺",
+ prop: "completeQuantity",
+ width: "140",
+ },
+ {
+ label: "瀹屾垚杩涘害",
+ prop: "completionStatus",
+ dataType: "slot",
+ slot: "completionStatus",
+ width: "140",
+ },
+ {
+ label: "鎶ュ伐浜�",
+ prop: "userNames",
+ width: "140",
+ },
+ {
+ label: "璁″垝寮�濮嬫椂闂�",
+ prop: "planStartTime",
+ width: "140",
+ },
+ {
+ label: "璁″垝缁撴潫鏃堕棿",
+ prop: "planEndTime",
+ width: "140",
+ },
+ {
+ label: "瀹為檯寮�濮嬫椂闂�",
+ prop: "actualStartTime",
+ width: "140",
+ },
+ {
+ label: "瀹為檯缁撴潫鏃堕棿",
+ prop: "actualEndTime",
+ width: "140",
+ },
+ {
+ label: "鎿嶄綔",
+ width: "200",
+ align: "center",
+ dataType: "action",
+ fixed: "right",
+ operation: [
+ {
+ name: "缂栬緫",
+ clickFun: row => {
+ handleEdit(row);
+ },
+ // 褰撻渶姹傛暟閲忕瓑浜庡畬鎴愭暟閲忕殑鏃跺�欙紝鎸夐挳涓嶅彲鐐瑰嚮
+ disabled: row =>
Number(row?.planQuantity) === Number(row?.completeQuantity) ||
!canOperateByReportWorker.value(row),
+ },
+ {
+ name: "娴佽浆鍗�",
+ clickFun: row => {
+ downloadAndPrintWorkOrder(row);
},
- {
- name: "娴佽浆鍗�",
- clickFun: row => {
- downloadAndPrintWorkOrder(row);
- },
+ },
+ {
+ name: "闄勪欢",
+ clickFun: row => {
+ openWorkOrderFiles(row);
},
- {
- name: "闄勪欢",
- clickFun: row => {
- openWorkOrderFiles(row);
- },
+ },
+ {
+ name: "鎶ュ伐",
+ clickFun: row => {
+ showReportDialog(row);
},
- {
- name: "鎶ュ伐",
- clickFun: row => {
- showReportDialog(row);
- },
- disabled: row =>
+ disabled: row =>
Number(row?.planQuantity) <= Number(row?.completeQuantity) ||
row.planQuantity <= 0 ||
!canOperateByReportWorker.value(row),
- },
- // {
- // name:"瀹℃牳",
- // color: "#f56c6c",
- // clickFun: row => {
- // handleAudit(row);
- // },
- // disabled: row => Number(row?.auditStatus) === 1,
- // }
- ],
- },
- ]);
- const tableData = ref([]);
- const tableLoading = ref(false);
- const qrCodeUrl = ref("");
- const qrRowData = ref(null);
- const editDialogVisible = ref(false);
- const transferCardVisible = ref(false);
- const transferCardData = ref([]);
- const transferCardQrUrl = ref("");
- const transferCardRowData = ref(null);
- const reportDialogVisible = ref(false);
- const auditDialogVisible = ref(false);
- const auditRowData = ref(null);
- const auditTableData = ref([]);
- const auditLoading = ref(false);
- const workOrderFilesRef = ref(null);
- const reportFormRef = ref(null);
- const userOptions = ref([]);
- const userTeamOptions = ref([]);
- const reportForm = reactive({
- planQuantity: 0,
- quantity: null,
- scrapQty: null,
- startTime: "",
- endTime: "",
- userName: "",
- workOrderId: "",
- reportWork: "",
- productProcessRouteItemId: "",
- userId: "",
- productMainId: null,
- teamList:[]
- });
+ },
+ // {
+ // name:"瀹℃牳",
+ // color: "#f56c6c",
+ // clickFun: row => {
+ // handleAudit(row);
+ // },
+ // disabled: row => Number(row?.auditStatus) === 1,
+ // }
+ ],
+ },
+]);
+const tableData = ref([]);
+const tableLoading = ref(false);
+const qrCodeUrl = ref("");
+const qrRowData = ref(null);
+const editDialogVisible = ref(false);
+const transferCardVisible = ref(false);
+const transferCardData = ref([]);
+const transferCardQrUrl = ref("");
+const transferCardRowData = ref(null);
+const reportDialogVisible = ref(false);
+const auditDialogVisible = ref(false);
+const auditRowData = ref(null);
+const auditTableData = ref([]);
+const auditLoading = ref(false);
+const workOrderFilesRef = ref(null);
+const reportFormRef = ref(null);
+const userOptions = ref([]);
+const userTeamOptions = ref([]);
+const reportForm = reactive({
+ planQuantity: 0,
+ quantity: null,
+ scrapQty: null,
+ startTime: "",
+ endTime: "",
+ userName: "",
+ workOrderId: "",
+ reportWork: "",
+ productProcessRouteItemId: "",
+ userId: "",
+ productMainId: null,
+ teamList: [],
+ machineId: null,
+});
- // 鏈鐢熶骇鏁伴噺楠岃瘉瑙勫垯
- const validateQuantity = (rule, value, callback) => {
- if (value === null || value === undefined || value === "") {
- callback(new Error("璇疯緭鍏ユ湰娆$敓浜ф暟閲�"));
- return;
- }
- const num = Number(value);
- // 鏁存暟涓斿ぇ浜庣瓑浜�1
- if (isNaN(num) || !Number.isInteger(num) || num < 1) {
- callback(new Error("鏈鐢熶骇鏁伴噺蹇呴』澶т簬绛変簬1"));
- return;
- }
+// 鏈鐢熶骇鏁伴噺楠岃瘉瑙勫垯
+const validateQuantity = (rule, value, callback) => {
+ if (value === null || value === undefined || value === "") {
+ callback(new Error("璇疯緭鍏ユ湰娆$敓浜ф暟閲�"));
+ return;
+ }
+ const num = Number(value);
+ // 鏁存暟涓斿ぇ浜庣瓑浜�1
+ if (isNaN(num) || !Number.isInteger(num) || num < 1) {
+ callback(new Error("鏈鐢熶骇鏁伴噺蹇呴』澶т簬绛変簬1"));
+ return;
+ }
+ callback();
+};
+
+// 鎶ュ簾鏁伴噺楠岃瘉瑙勫垯
+const validateScrapQty = (rule, value, callback) => {
+ if (value === null || value === undefined || value === "") {
callback();
- };
+ return;
+ }
+ const num = Number(value);
+ // 鏁存暟涓斿ぇ浜庣瓑浜�0
+ if (isNaN(num) || !Number.isInteger(num) || num < 0) {
+ callback(new Error("鎶ュ簾鏁伴噺蹇呴』澶т簬绛変簬0"));
+ return;
+ }
+ callback();
+};
- // 鎶ュ簾鏁伴噺楠岃瘉瑙勫垯
- const validateScrapQty = (rule, value, callback) => {
- if (value === null || value === undefined || value === "") {
- callback();
- return;
- }
- const num = Number(value);
- // 鏁存暟涓斿ぇ浜庣瓑浜�0
- if (isNaN(num) || !Number.isInteger(num) || num < 0) {
- callback(new Error("鎶ュ簾鏁伴噺蹇呴』澶т簬绛変簬0"));
- return;
- }
- callback();
- };
-
- // 瀹℃牳
- const handleAudit = (row) => {
- if (Number(row?.auditStatus) === 1) {
- ElMessage.warning("璇ュ伐鍗曞凡瀹℃牳");
- return;
- }
- auditRowData.value = row;
- const workOrderNo = row?.workOrderNo;
- const related = workOrderNo
+// 瀹℃牳
+const handleAudit = (row) => {
+ if (Number(row?.auditStatus) === 1) {
+ ElMessage.warning("璇ュ伐鍗曞凡瀹℃牳");
+ return;
+ }
+ auditRowData.value = row;
+ const workOrderNo = row?.workOrderNo;
+ const related = workOrderNo
? tableData.value.filter(r => r?.workOrderNo === workOrderNo)
: [];
- auditTableData.value = related.length > 0 ? related : [row];
- auditDialogVisible.value = true;
- };
+ auditTableData.value = related.length > 0 ? related : [row];
+ auditDialogVisible.value = true;
+};
- const submitAudit = async (result) => {
- const current = auditRowData.value;
- if (!current) return;
- if (auditLoading.value) return;
+const submitAudit = async (result) => {
+ const current = auditRowData.value;
+ if (!current) return;
+ if (auditLoading.value) return;
- const confirmText = result === 1 ? "纭畾瀹℃牳閫氳繃鍚楋紵" : "纭畾瀹℃牳涓嶉�氳繃鍚楋紵";
- try {
- await ElMessageBox.confirm(confirmText, "鎻愮ず", {
- confirmButtonText: "纭畾",
- cancelButtonText: "鍙栨秷",
- type: "warning",
- });
- } catch {
- return;
- }
-
- auditLoading.value = true;
- try {
- const updates = auditTableData.value.map(item => {
- const id = item?.id;
- if (!id) return Promise.resolve();
- return updateProductWorkOrder({ id, auditStatus: result });
- });
- await Promise.all(updates);
- ElMessage.success("瀹℃牳鎴愬姛");
- auditDialogVisible.value = false;
- getList();
- } finally {
- auditLoading.value = false;
- }
- };
-
- // 鏌ョ湅璇︽儏
- const handleView = (row) => {
- const { workOrderId } = row;
- router.push({
- path: "/productionManagement/workOrderDetail",
- query: { workOrderId },
+ const confirmText = result === 1 ? "纭畾瀹℃牳閫氳繃鍚楋紵" : "纭畾瀹℃牳涓嶉�氳繃鍚楋紵";
+ try {
+ await ElMessageBox.confirm(confirmText, "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ cancelButtonText: "鍙栨秷",
+ type: "warning",
});
+ } catch {
+ return;
}
- // 楠岃瘉瑙勫垯
- const reportFormRules = {
- quantity: [{ required: true, validator: validateQuantity, trigger: "blur" }],
- scrapQty: [{ validator: validateScrapQty, trigger: "blur" }],
- startTime: [{ required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change" }],
- endTime: [{ required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change" }],
- auditUserId: [{ required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change" }],
- };
+ auditLoading.value = true;
+ try {
+ const updates = auditTableData.value.map(item => {
+ const id = item?.id;
+ if (!id) return Promise.resolve();
+ return updateProductWorkOrder({id, auditStatus: result});
+ });
+ await Promise.all(updates);
+ ElMessage.success("瀹℃牳鎴愬姛");
+ auditDialogVisible.value = false;
+ getList();
+ } finally {
+ auditLoading.value = false;
+ }
+};
- // 澶勭悊鏈鐢熶骇鏁伴噺杈撳叆锛岄檺鍒跺繀椤诲ぇ浜庣瓑浜�1
- const handleQuantityInput = value => {
- if (value === "" || value === null || value === undefined) {
+// 鏌ョ湅璇︽儏
+const handleView = (row) => {
+ const {workOrderId} = row;
+ router.push({
+ path: "/productionManagement/workOrderDetail",
+ query: {workOrderId},
+ });
+}
+
+// 楠岃瘉瑙勫垯
+const reportFormRules = {
+ quantity: [{required: true, validator: validateQuantity, trigger: "blur"}],
+ scrapQty: [{validator: validateScrapQty, trigger: "blur"}],
+ startTime: [{required: true, message: "璇烽�夋嫨寮�濮嬫椂闂�", trigger: "change"}],
+ endTime: [{required: true, message: "璇烽�夋嫨缁撴潫鏃堕棿", trigger: "change"}],
+ auditUserId: [{required: true, message: "璇烽�夋嫨瀹℃牳浜�", trigger: "change"}],
+ teamList: [{required: true, message: "璇烽�夋嫨鐝粍", trigger: "change"}],
+ machineId: [{required: true, message: "璇烽�夋嫨璁惧", trigger: "change"}],
+};
+
+// 澶勭悊鏈鐢熶骇鏁伴噺杈撳叆锛岄檺鍒跺繀椤诲ぇ浜庣瓑浜�1
+const handleQuantityInput = value => {
+ if (value === "" || value === null || value === undefined) {
+ reportForm.quantity = null;
+ return;
+ }
+ const num = Number(value);
+ if (isNaN(num)) {
+ return;
+ }
+ // 濡傛灉灏忎簬1锛屾竻闄�
+ if (num < 1) {
+ reportForm.quantity = null;
+ return;
+ }
+ // 濡傛灉鏄皬鏁板彇鏁存暟閮ㄥ垎
+ if (!Number.isInteger(num)) {
+ const intValue = Math.floor(num);
+ // 濡傛灉鍙栨暣鍚庡皬浜�1锛屾竻闄�
+ if (intValue < 1) {
reportForm.quantity = null;
return;
}
- const num = Number(value);
- if (isNaN(num)) {
- return;
- }
- // 濡傛灉灏忎簬1锛屾竻闄�
- if (num < 1) {
- reportForm.quantity = null;
- return;
- }
- // 濡傛灉鏄皬鏁板彇鏁存暟閮ㄥ垎
- if (!Number.isInteger(num)) {
- const intValue = Math.floor(num);
- // 濡傛灉鍙栨暣鍚庡皬浜�1锛屾竻闄�
- if (intValue < 1) {
- reportForm.quantity = null;
- return;
- }
- reportForm.quantity = intValue;
- return;
- }
- reportForm.quantity = num;
- };
+ reportForm.quantity = intValue;
+ return;
+ }
+ reportForm.quantity = num;
+};
- // 澶勭悊鎶ュ簾鏁伴噺
- const handleScrapQtyInput = value => {
- if (value === "" || value === null || value === undefined) {
- reportForm.scrapQty = null;
- return;
- }
- const num = Number(value);
- // 濡傛灉鏄疦aN锛屼繚鎸佸師鍊�
- if (isNaN(num)) {
- return;
- }
- // 濡傛灉鏄礋鏁帮紝娓呴櫎杈撳叆
- if (num < 0) {
- reportForm.scrapQty = null;
- return;
- }
- // 濡傛灉鏄皬鏁帮紝鍙栨暣鏁伴儴鍒�
- if (!Number.isInteger(num)) {
- reportForm.scrapQty = Math.floor(num);
- return;
- }
- // 鏈夋晥鐨勯潪璐熸暣鏁帮紙鍖呮嫭0锛�
- reportForm.scrapQty = num;
- };
- const currentReportRowData = ref(null);
- const page = reactive({
- current: 1,
- size: 100,
- total: 0,
- });
+// 澶勭悊鎶ュ簾鏁伴噺
+const handleScrapQtyInput = value => {
+ if (value === "" || value === null || value === undefined) {
+ reportForm.scrapQty = null;
+ return;
+ }
+ const num = Number(value);
+ // 濡傛灉鏄疦aN锛屼繚鎸佸師鍊�
+ if (isNaN(num)) {
+ return;
+ }
+ // 濡傛灉鏄礋鏁帮紝娓呴櫎杈撳叆
+ if (num < 0) {
+ reportForm.scrapQty = null;
+ return;
+ }
+ // 濡傛灉鏄皬鏁帮紝鍙栨暣鏁伴儴鍒�
+ if (!Number.isInteger(num)) {
+ reportForm.scrapQty = Math.floor(num);
+ return;
+ }
+ // 鏈夋晥鐨勯潪璐熸暣鏁帮紙鍖呮嫭0锛�
+ reportForm.scrapQty = num;
+};
+const currentReportRowData = ref(null);
+const page = reactive({
+ current: 1,
+ size: 100,
+ total: 0,
+});
- const data = reactive({
- searchForm: {
- workOrderNo: "",
- },
- });
- const { searchForm } = toRefs(data);
- const toProgressPercentage = val => {
- const n = Number(val);
- if (!Number.isFinite(n)) return 0;
- if (n <= 0) return 0;
- if (n >= 100) return 100;
- return Math.round(n);
- };
- const progressColor = percentage => {
- const p = toProgressPercentage(percentage);
- if (p < 30) return "#f56c6c";
- if (p < 50) return "#e6a23c";
- if (p < 80) return "#409eff";
- return "#67c23a";
- };
- let editrow = ref(null);
+const data = reactive({
+ searchForm: {
+ workOrderNo: "",
+ },
+});
+const {searchForm} = toRefs(data);
+const toProgressPercentage = val => {
+ const n = Number(val);
+ if (!Number.isFinite(n)) return 0;
+ if (n <= 0) return 0;
+ if (n >= 100) return 100;
+ return Math.round(n);
+};
+const progressColor = percentage => {
+ const p = toProgressPercentage(percentage);
+ if (p < 30) return "#f56c6c";
+ if (p < 50) return "#e6a23c";
+ if (p < 80) return "#409eff";
+ return "#67c23a";
+};
+let editrow = ref(null);
- // 鏌ヨ鍒楄〃
- /** 鎼滅储鎸夐挳鎿嶄綔 */
- const handleQuery = () => {
- page.current = 1;
- getList();
- };
- const pagination = obj => {
- page.current = obj.page;
- page.size = obj.limit;
- getList();
- };
- const getList = () => {
- tableLoading.value = true;
- const params = { ...searchForm.value, ...page };
- productWorkOrderPage(params)
+// 鏌ヨ鍒楄〃
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+const handleQuery = () => {
+ page.current = 1;
+ getList();
+};
+const pagination = obj => {
+ page.current = obj.page;
+ page.size = obj.limit;
+ getList();
+};
+const getList = () => {
+ tableLoading.value = true;
+ const params = {...searchForm.value, ...page};
+ productWorkOrderPage(params)
.then(res => {
tableLoading.value = false;
tableData.value = res.data.records;
@@ -761,83 +836,83 @@
.catch(() => {
tableLoading.value = false;
});
- };
+};
- // 涓嬭浇骞舵墦鍗板伐鍗曟祦杞崱锛堟枃浠舵祦锛�
- const downloadAndPrintWorkOrder = async row => {
- if (!row || !row.id) {
- proxy.$modal.msgError("缂哄皯宸ュ崟ID锛屾棤娉曚笅杞芥祦杞崱");
- return;
- }
- const fileName = row.workOrderNo
+// 涓嬭浇骞舵墦鍗板伐鍗曟祦杞崱锛堟枃浠舵祦锛�
+const downloadAndPrintWorkOrder = async row => {
+ if (!row || !row.id) {
+ proxy.$modal.msgError("缂哄皯宸ュ崟ID锛屾棤娉曚笅杞芥祦杞崱");
+ return;
+ }
+ const fileName = row.workOrderNo
? `宸ュ崟娴佽浆鍗${row.workOrderNo}.xlsx`
: "宸ュ崟娴佽浆鍗�.xlsx";
- try {
- // 璋冪敤鎺ュ彛锛屼互 responseType: 'blob' 鑾峰彇鏂囦欢娴�
- const blob = await downProductWorkOrder(row.id);
+ try {
+ // 璋冪敤鎺ュ彛锛屼互 responseType: 'blob' 鑾峰彇鏂囦欢娴�
+ const blob = await downProductWorkOrder(row.id);
- if (!blob) {
- proxy.$modal.msgError("鏈幏鍙栧埌娴佽浆鍗℃枃浠�");
- return;
- }
-
- // 鍒涘缓 Blob URL
- const fileBlob =
- blob instanceof Blob
- ? blob
- : new Blob([blob], { type: blob.type || "application/octet-stream" });
- const url = window.URL.createObjectURL(fileBlob);
-
- // 鍒涘缓闅愯棌 iframe锛岀敤浜庤Е鍙戞祻瑙堝櫒鎵撳嵃
- const iframe = document.createElement("iframe");
- iframe.style.position = "fixed";
- iframe.style.right = "0";
- iframe.style.bottom = "0";
- iframe.style.width = "0";
- iframe.style.height = "0";
- iframe.style.border = "0";
- iframe.src = url;
- document.body.appendChild(iframe);
-
- iframe.onload = () => {
- try {
- iframe.contentWindow?.focus();
- iframe.contentWindow?.print();
- } catch (e) {
- console.error("鑷姩璋冪敤鎵撳嵃澶辫触", e);
- // 閫�鑰屾眰鍏舵锛屾墦寮�鏂扮獥鍙g敱鐢ㄦ埛鎵嬪姩鎵撳嵃
- window.open(url);
- }
- };
- } catch (e) {
- console.error("涓嬭浇宸ュ崟娴佽浆鍗″け璐�", e);
- proxy.$modal.msgError("涓嬭浇宸ュ崟娴佽浆鍗″け璐�");
- }
- };
-
- const showTransferCard = async row => {
- transferCardRowData.value = row;
- const qrContent = String(row.id);
-
- transferCardQrUrl.value = await QRCode.toDataURL(qrContent);
- transferCardVisible.value = true;
- };
-
- const printTransferCard = () => {
- window.print();
- };
-
- const handleEdit = row => {
- if (!isCurrentUserReportWorker(row)) {
- ElMessage.warning("褰撳墠鐢ㄦ埛涓嶆槸璇ュ伐鍗曠殑鎶ュ伐浜猴紝鏃犳硶缂栬緫");
+ if (!blob) {
+ proxy.$modal.msgError("鏈幏鍙栧埌娴佽浆鍗℃枃浠�");
return;
}
- editrow.value = JSON.parse(JSON.stringify(row));
- editDialogVisible.value = true;
- };
- const handleUpdate = () => {
- updateProductWorkOrder(editrow.value)
+ // 鍒涘缓 Blob URL
+ const fileBlob =
+ blob instanceof Blob
+ ? blob
+ : new Blob([blob], {type: blob.type || "application/octet-stream"});
+ const url = window.URL.createObjectURL(fileBlob);
+
+ // 鍒涘缓闅愯棌 iframe锛岀敤浜庤Е鍙戞祻瑙堝櫒鎵撳嵃
+ const iframe = document.createElement("iframe");
+ iframe.style.position = "fixed";
+ iframe.style.right = "0";
+ iframe.style.bottom = "0";
+ iframe.style.width = "0";
+ iframe.style.height = "0";
+ iframe.style.border = "0";
+ iframe.src = url;
+ document.body.appendChild(iframe);
+
+ iframe.onload = () => {
+ try {
+ iframe.contentWindow?.focus();
+ iframe.contentWindow?.print();
+ } catch (e) {
+ console.error("鑷姩璋冪敤鎵撳嵃澶辫触", e);
+ // 閫�鑰屾眰鍏舵锛屾墦寮�鏂扮獥鍙g敱鐢ㄦ埛鎵嬪姩鎵撳嵃
+ window.open(url);
+ }
+ };
+ } catch (e) {
+ console.error("涓嬭浇宸ュ崟娴佽浆鍗″け璐�", e);
+ proxy.$modal.msgError("涓嬭浇宸ュ崟娴佽浆鍗″け璐�");
+ }
+};
+
+const showTransferCard = async row => {
+ transferCardRowData.value = row;
+ const qrContent = String(row.id);
+
+ transferCardQrUrl.value = await QRCode.toDataURL(qrContent);
+ transferCardVisible.value = true;
+};
+
+const printTransferCard = () => {
+ window.print();
+};
+
+const handleEdit = row => {
+ if (!isCurrentUserReportWorker(row)) {
+ ElMessage.warning("褰撳墠鐢ㄦ埛涓嶆槸璇ュ伐鍗曠殑鎶ュ伐浜猴紝鏃犳硶缂栬緫");
+ return;
+ }
+ editrow.value = JSON.parse(JSON.stringify(row));
+ editDialogVisible.value = true;
+};
+
+const handleUpdate = () => {
+ updateProductWorkOrder(editrow.value)
.then(res => {
proxy.$modal.msgSuccess("鎻愪氦鎴愬姛");
editDialogVisible.value = false;
@@ -848,141 +923,141 @@
confirmButtonText: "纭畾",
});
});
- };
+};
- const showReportDialog = row => {
- if (!isCurrentUserReportWorker(row)) {
- ElMessage.warning("褰撳墠鐢ㄦ埛涓嶆槸璇ュ伐鍗曠殑鎶ュ伐浜猴紝鏃犳硶鎶ュ伐");
+const showReportDialog = row => {
+ if (!isCurrentUserReportWorker(row)) {
+ ElMessage.warning("褰撳墠鐢ㄦ埛涓嶆槸璇ュ伐鍗曠殑鎶ュ伐浜猴紝鏃犳硶鎶ュ伐");
+ return;
+ }
+ currentReportRowData.value = row;
+ reportForm.planQuantity = row.planQuantity - row.completeQuantity;
+ reportForm.quantity =
+ row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
+ reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
+ reportForm.workOrderId = row.id;
+ reportForm.reportWork = row.reportWork;
+ reportForm.productMainId = row.productMainId;
+ reportForm.startTime = "";
+ reportForm.endTime = "";
+ reportForm.replenishQty = 0;
+ reportForm.teamList = [];
+ reportForm.scrapQty = 0;
+
+ nextTick(() => {
+ reportFormRef.value?.clearValidate();
+ });
+ ensureCurrentUser().then(() => {
+ reportForm.userId = currentUserId.value;
+ reportForm.userName = currentUserName.value;
+ });
+
+ reportDialogVisible.value = true;
+};
+
+const openWorkOrderFiles = row => {
+ workOrderFilesRef.value?.openDialog(row);
+};
+
+const handleReport = () => {
+ reportFormRef.value?.validate(valid => {
+ if (!valid) {
+ return false;
+ }
+
+ if (reportForm.planQuantity <= 0) {
+ ElMessageBox.alert("寰呯敓浜ф暟閲忎负0锛屾棤娉曟姤宸�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ });
return;
}
- currentReportRowData.value = row;
- reportForm.planQuantity = row.planQuantity - row.completeQuantity;
- reportForm.quantity =
- row.quantity !== undefined && row.quantity !== null ? row.quantity : null;
- reportForm.productProcessRouteItemId = row.productProcessRouteItemId;
- reportForm.workOrderId = row.id;
- reportForm.reportWork = row.reportWork;
- reportForm.productMainId = row.productMainId;
- reportForm.startTime = "";
- reportForm.endTime = "";
- reportForm.replenishQty = 0;
- reportForm.teamList = [];
- reportForm.scrapQty = 0;
- nextTick(() => {
- reportFormRef.value?.clearValidate();
- });
- ensureCurrentUser().then(() => {
- reportForm.userId = currentUserId.value;
- reportForm.userName = currentUserName.value;
- });
-
- reportDialogVisible.value = true;
- };
-
- const openWorkOrderFiles = row => {
- workOrderFilesRef.value?.openDialog(row);
- };
-
- const handleReport = () => {
- reportFormRef.value?.validate(valid => {
- if (!valid) {
- return false;
- }
-
- if (reportForm.planQuantity <= 0) {
- ElMessageBox.alert("寰呯敓浜ф暟閲忎负0锛屾棤娉曟姤宸�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
-
- // 楠岃瘉鏈鐢熶骇鏁伴噺
- if (
+ // 楠岃瘉鏈鐢熶骇鏁伴噺
+ if (
reportForm.quantity === null ||
reportForm.quantity === undefined ||
reportForm.quantity === ""
- ) {
- ElMessageBox.alert("璇疯緭鍏ユ湰娆$敓浜ф暟閲�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
+ ) {
+ ElMessageBox.alert("璇疯緭鍏ユ湰娆$敓浜ф暟閲�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ });
+ return;
+ }
- const quantity = Number(reportForm.quantity);
- const scrapQty =
+ const quantity = Number(reportForm.quantity);
+ const scrapQty =
reportForm.scrapQty === null ||
reportForm.scrapQty === undefined ||
reportForm.scrapQty === ""
- ? 0
- : Number(reportForm.scrapQty);
+ ? 0
+ : Number(reportForm.scrapQty);
- // 鏈鐢熶骇鏁伴噺
- if (isNaN(quantity) || !Number.isInteger(quantity) || quantity < 1) {
- ElMessageBox.alert("鏈鐢熶骇鏁伴噺蹇呴』澶т簬绛変簬1", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
-
- // 鎶ュ簾鏁伴噺蹇呴』鏄暣鏁颁笖澶т簬绛変簬0
- if (isNaN(scrapQty) || !Number.isInteger(scrapQty) || scrapQty < 0) {
- ElMessageBox.alert("鎶ュ簾鏁伴噺蹇呴』澶т簬绛変簬0", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
-
- if (quantity > reportForm.planQuantity) {
- ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
-
- if (!reportForm.startTime || !reportForm.endTime) {
- ElMessageBox.alert("寮�濮嬫椂闂村拰缁撴潫鏃堕棿涓嶈兘涓虹┖", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
-
- if (dayjs(reportForm.startTime).isSame(dayjs(reportForm.endTime)) || dayjs(reportForm.startTime).isAfter(dayjs(reportForm.endTime))) {
- ElMessageBox.alert("寮�濮嬫椂闂村繀椤诲皬浜庣粨鏉熸椂闂�", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- return;
- }
-
- const submitData = {
- ...reportForm,
- quantity: quantity,
- scrapQty: scrapQty,
- };
-
- // console.log(submitData);
- addProductMain(submitData).then(res => {
- if (res.code === 200) {
- proxy.$modal.msgSuccess("鎶ュ伐鎴愬姛");
- reportDialogVisible.value = false;
- getList();
- } else {
- ElMessageBox.alert(res.msg || "鎶ュ伐澶辫触", "鎻愮ず", {
- confirmButtonText: "纭畾",
- });
- }
+ // 鏈鐢熶骇鏁伴噺
+ if (isNaN(quantity) || !Number.isInteger(quantity) || quantity < 1) {
+ ElMessageBox.alert("鏈鐢熶骇鏁伴噺蹇呴』澶т簬绛変簬1", "鎻愮ず", {
+ confirmButtonText: "纭畾",
});
- });
- };
+ return;
+ }
- // 鑾峰彇鐢ㄦ埛鍒楄〃
- const getUserList = () => {
- userListNoPageByTenantId()
+ // 鎶ュ簾鏁伴噺蹇呴』鏄暣鏁颁笖澶т簬绛変簬0
+ if (isNaN(scrapQty) || !Number.isInteger(scrapQty) || scrapQty < 0) {
+ ElMessageBox.alert("鎶ュ簾鏁伴噺蹇呴』澶т簬绛変簬0", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ });
+ return;
+ }
+
+ if (quantity > reportForm.planQuantity) {
+ ElMessageBox.alert("鏈鐢熶骇鏁伴噺涓嶈兘瓒呰繃寰呯敓浜ф暟閲�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ });
+ return;
+ }
+
+ if (!reportForm.startTime || !reportForm.endTime) {
+ ElMessageBox.alert("寮�濮嬫椂闂村拰缁撴潫鏃堕棿涓嶈兘涓虹┖", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ });
+ return;
+ }
+
+ if (dayjs(reportForm.startTime).isSame(dayjs(reportForm.endTime)) || dayjs(reportForm.startTime).isAfter(dayjs(reportForm.endTime))) {
+ ElMessageBox.alert("寮�濮嬫椂闂村繀椤诲皬浜庣粨鏉熸椂闂�", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ });
+ return;
+ }
+
+ const submitData = {
+ ...reportForm,
+ quantity: quantity,
+ scrapQty: scrapQty,
+ };
+
+ // console.log(submitData);
+ addProductMain(submitData).then(res => {
+ if (res.code === 200) {
+ proxy.$modal.msgSuccess("鎶ュ伐鎴愬姛");
+ reportDialogVisible.value = false;
+ getList();
+ } else {
+ ElMessageBox.alert(res.msg || "鎶ュ伐澶辫触", "鎻愮ず", {
+ confirmButtonText: "纭畾",
+ });
+ }
+ });
+ });
+};
+
+// 鑾峰彇鐢ㄦ埛鍒楄〃
+const getUserList = () => {
+ userListNoPageByTenantId()
.then(res => {
if (res.code === 200) {
const list = Array.isArray(res.data) ? res.data : []
userOptions.value = [
- { nickName: "浠绘剰鐢ㄦ埛", userId: "-1" },
+ {nickName: "浠绘剰鐢ㄦ埛", userId: "-1"},
...deepClone(list)
]
userTeamOptions.value = deepClone(list)
@@ -991,172 +1066,185 @@
.catch(err => {
console.error("鑾峰彇鐢ㄦ埛鍒楄〃澶辫触", err);
});
- };
+};
- // 鐢ㄦ埛閫夋嫨鍙樺寲鏃舵洿鏂� userName
- const handleUserChange = userId => {
- if (userId) {
- const selectedUser = userOptions.value.find(user => user.userId === userId);
- if (selectedUser) {
- reportForm.userName = selectedUser.nickName;
- }
- } else {
- reportForm.userName = "";
+// 鐢ㄦ埛閫夋嫨鍙樺寲鏃舵洿鏂� userName
+const handleUserChange = userId => {
+ if (userId) {
+ const selectedUser = userOptions.value.find(user => user.userId === userId);
+ if (selectedUser) {
+ reportForm.userName = selectedUser.nickName;
}
- };
- // 瀹℃牳浜�
- const handleReviewerIdChange = userId => {
- if (userId) {
- const selectedUser = userOptions.value.find(user => user.userId === userId);
- if (selectedUser) {
- reportForm.auditUserName = selectedUser.nickName;
- }
- } else {
- reportForm.auditUserName = "";
- }
+ } else {
+ reportForm.userName = "";
}
+};
+// 瀹℃牳浜�
+const handleReviewerIdChange = userId => {
+ if (userId) {
+ const selectedUser = userOptions.value.find(user => user.userId === userId);
+ if (selectedUser) {
+ reportForm.auditUserName = selectedUser.nickName;
+ }
+ } else {
+ reportForm.auditUserName = "";
+ }
+}
- onMounted(() => {
- ensureCurrentUser();
- getList();
- getUserList();
- });
+onMounted(() => {
+ ensureCurrentUser();
+ getList();
+ getUserList();
+ getDeviceList();
+});
</script>
<style scoped lang="scss">
- .search_form {
- margin-bottom: 20px;
- .search-row {
- display: flex;
- gap: 20px;
- align-items: center;
- .search-item {
- display: flex;
- align-items: center;
- gap: 10px;
- }
- }
- }
+.search_form {
+ margin-bottom: 20px;
- .transfer-card-title {
- font-size: 24px;
- font-weight: bold;
- text-align: center;
- margin-bottom: 20px;
- }
-
- .transfer-card-container {
+ .search-row {
display: flex;
gap: 20px;
- height: 350px;
- .transfer-card-info {
- flex: 1;
- overflow: auto;
- .info-group {
- width: 50%;
- float: left;
- }
- .info-item {
- display: flex;
- margin-bottom: 15px;
- .info-label {
- width: 120px;
- font-weight: bold;
- margin-right: 20px;
- }
- .info-value {
- flex: 1;
- }
- }
- }
- .transfer-card-qr {
- width: 240px;
+ align-items: center;
+
+ .search-item {
display: flex;
- flex-direction: column;
align-items: center;
- justify-content: flex-start;
+ gap: 10px;
}
}
+}
+
+.transfer-card-title {
+ font-size: 24px;
+ font-weight: bold;
+ text-align: center;
+ margin-bottom: 20px;
+}
+
+.transfer-card-container {
+ display: flex;
+ gap: 20px;
+ height: 350px;
+
+ .transfer-card-info {
+ flex: 1;
+ overflow: auto;
+
+ .info-group {
+ width: 50%;
+ float: left;
+ }
+
+ .info-item {
+ display: flex;
+ margin-bottom: 15px;
+
+ .info-label {
+ width: 120px;
+ font-weight: bold;
+ margin-right: 20px;
+ }
+
+ .info-value {
+ flex: 1;
+ }
+ }
+ }
+
+ .transfer-card-qr {
+ width: 240px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ }
+}
</style>
-<style lang="scss">
- @media print {
- @page {
- size: landscape;
+<style lang="scss">
+@media print {
+ @page {
+ size: landscape;
+ }
+ body * {
+ visibility: hidden;
+ }
+ .el-dialog__wrapper,
+ .el-dialog,
+ .el-dialog__body,
+ .transfer-card-title,
+ .transfer-card-container,
+ .transfer-card-container *,
+ .info-item,
+ .info-label,
+ .info-value {
+ visibility: visible;
+ }
+ .print-button-container {
+ visibility: hidden;
+ }
+ .el-dialog__wrapper {
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ margin: 0;
+ }
+ .el-dialog {
+ width: 100% !important;
+ max-width: 800px;
+ margin: 0 auto !important;
+ }
+ .el-dialog__header,
+ .el-dialog__footer {
+ display: none;
+ }
+ .el-dialog__body {
+ padding: 20px;
+ }
+ .transfer-card-container {
+ height: auto;
+ display: flex;
+ gap: 20px;
+ }
+ .transfer-card-info {
+ flex: 1;
+
+ .info-group {
+ width: 100%;
+ float: none;
+ margin-bottom: 20px;
}
- body * {
- visibility: hidden;
- }
- .el-dialog__wrapper,
- .el-dialog,
- .el-dialog__body,
- .transfer-card-title,
- .transfer-card-container,
- .transfer-card-container *,
- .info-item,
- .info-label,
- .info-value {
- visibility: visible;
- }
- .print-button-container {
- visibility: hidden;
- }
- .el-dialog__wrapper {
- position: absolute;
- top: 0;
- left: 0;
- right: 0;
- margin: 0;
- }
- .el-dialog {
- width: 100% !important;
- max-width: 800px;
- margin: 0 auto !important;
- }
- .el-dialog__header,
- .el-dialog__footer {
- display: none;
- }
- .el-dialog__body {
- padding: 20px;
- }
- .transfer-card-container {
- height: auto;
+
+ .info-item {
display: flex;
- gap: 20px;
- }
- .transfer-card-info {
- flex: 1;
- .info-group {
- width: 100%;
- float: none;
- margin-bottom: 20px;
+ margin-bottom: 10px;
+
+ .info-label {
+ width: 100px;
+ font-weight: bold;
+ margin-right: 15px;
+ white-space: nowrap;
}
- .info-item {
- display: flex;
- margin-bottom: 10px;
- .info-label {
- width: 100px;
- font-weight: bold;
- margin-right: 15px;
- white-space: nowrap;
- }
- .info-value {
- flex: 1;
- word-break: break-word;
- }
+
+ .info-value {
+ flex: 1;
+ word-break: break-word;
}
- }
- .transfer-card-qr {
- width: 160px;
- display: flex;
- flex-direction: column;
- align-items: center;
- justify-content: flex-start;
- }
- .qr-container img {
- width: 140px !important;
- height: 140px !important;
}
}
+ .transfer-card-qr {
+ width: 160px;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-start;
+ }
+ .qr-container img {
+ width: 140px !important;
+ height: 140px !important;
+ }
+}
</style>
--
Gitblit v1.9.3