From f3f5a0c0db0b782401a9a0fcf6176312f420d941 Mon Sep 17 00:00:00 2001
From: gaoluyang <2820782392@qq.com>
Date: 星期三, 25 三月 2026 14:01:19 +0800
Subject: [PATCH] 军泰伟业 1.不要树形结构。根据图纸编号为唯一索引添加产品并可以导入 2.要求可以上传图纸 3.产品可以绑定工艺路线 4.工艺路线改成由工序组成,新增编辑是工序可以挪动顺序 5.工序添加报工权限字段,可以多选人员

---
 src/views/basicData/product/index.vue |  180 +++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 files changed, 161 insertions(+), 19 deletions(-)

diff --git a/src/views/basicData/product/index.vue b/src/views/basicData/product/index.vue
index 24a4659..48d2011 100644
--- a/src/views/basicData/product/index.vue
+++ b/src/views/basicData/product/index.vue
@@ -96,19 +96,17 @@
             clearable
           />
         </el-form-item>
-        <el-form-item label="瑙勬牸鍨嬪彿" prop="drawingNumber">
-          <el-input
-            v-model="modelForm.drawingNumber"
-            placeholder="璇疯緭鍏ヨ鏍煎瀷鍙�"
-            clearable
-          />
-        </el-form-item>
         <el-form-item label="鍗曚綅" prop="unit">
-          <el-input
+          <el-select
             v-model="modelForm.unit"
-            placeholder="璇疯緭鍏ュ崟浣�"
+            placeholder="璇烽�夋嫨鍗曚綅"
             clearable
-          />
+            style="width: 100%"
+          >
+            <el-option label="浠�" value="浠�" />
+            <el-option label="濂�" value="濂�" />
+            <el-option label="鍙�" value="鍙�" />
+          </el-select>
         </el-form-item>
         <el-form-item label="浜у搧灞炴��" prop="productType">
           <el-select
@@ -121,6 +119,43 @@
             <el-option label="澶栬喘" :value="2" />
             <el-option label="濮斿" :value="3" />
           </el-select>
+        </el-form-item>
+        <el-form-item label="宸ヨ壓璺嚎" prop="routeId">
+          <el-select
+            v-model="modelForm.routeId"
+            placeholder="璇烽�夋嫨宸ヨ壓璺嚎"
+            clearable
+            style="width: 100%"
+            filterable
+          >
+            <el-option
+              v-for="item in processRouteList"
+              :key="item.id"
+              :label="item.processRouteName"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="涓婁紶鍥剧焊" prop="drawingFile">
+          <el-upload
+            v-model:file-list="drawingFileList"
+            :action="upload.url"
+            :headers="upload.headers"
+            :data="upload.data"
+            :on-success="handleDrawingUploadSuccess"
+            :on-remove="handleDrawingRemove"
+            :before-upload="handleDrawingBeforeUpload"
+            :limit="1"
+            accept=".pdf,.jpg,.jpeg,.png,.dwg"
+            list-type="picture-card"
+          >
+            <el-icon class="avatar-uploader-icon"><Plus /></el-icon>
+            <template #tip>
+              <div class="el-upload__tip">
+                鏀寔 pdf銆乯pg銆乯peg銆乸ng銆乨wg 鏍煎紡锛屽ぇ灏忎笉瓒呰繃 10MB
+              </div>
+            </template>
+          </el-upload>
         </el-form-item>
       </el-form>
     </FormDialog>
@@ -162,10 +197,10 @@
 </template>
 
 <script setup>
-import { ref, reactive } from "vue";
+import { ref, reactive, onMounted } from "vue";
 import { ElMessageBox } from "element-plus";
+import { Plus } from "@element-plus/icons-vue";
 import { getToken } from "@/utils/auth.js";
-import { FileUpload } from "@/components/Upload";
 import FormDialog from "@/components/Dialog/FormDialog.vue";
 import {
   addOrEditProductModel,
@@ -173,6 +208,7 @@
   productListPage,
   downloadTemplate,
 } from "@/api/basicData/product.js";
+import { listPage as getProcessRouteList } from "@/api/productionManagement/processRoute.js";
 import ImportExcel from "./ImportExcel/index.vue";
 
 const { proxy } = getCurrentInstance();
@@ -185,6 +221,14 @@
 const tableLoading = ref(false);
 const selectedRows = ref([]);
 const modelFormRef = ref();
+const processRouteList = ref([]);
+const drawingFileList = ref([]);
+
+const upload = reactive({
+  url: import.meta.env.VITE_APP_BASE_API + "/file/upload",
+  headers: { Authorization: "Bearer " + getToken() },
+  data: { type: 13 },
+});
 
 const queryForm = reactive({
   productName: "",
@@ -210,8 +254,8 @@
     minWidth: 150,
   },
   {
-    label: "瑙勬牸鍨嬪彿",
-    prop: "drawingNumber",
+    label: "宸ヨ壓璺嚎",
+    prop: "routeName",
     minWidth: 150,
   },
   {
@@ -252,8 +296,11 @@
     productName: "",
     model: "",
     unit: "",
-    drawingNumber: "",
     productType: null,
+    routeId: null,
+    drawingFile: "",
+    tempFileIds: [],
+    salesLedgerFiles: [],
   },
   modelRules: {
     productName: [
@@ -261,8 +308,7 @@
       { max: 50, message: "浜у搧鍚嶇О涓嶈兘瓒呰繃50涓瓧绗�", trigger: "blur" },
     ],
     model: [{ required: true, message: "璇疯緭鍏ュ浘绾哥紪鍙�", trigger: "blur" }],
-    unit: [{ required: true, message: "璇疯緭鍏ュ崟浣�", trigger: "blur" }],
-    drawingNumber: [],
+    unit: [{ required: true, message: "璇烽�夋嫨鍗曚綅", trigger: "change" }],
     productType: [{ required: true, message: "璇烽�夋嫨浜у搧灞炴��", trigger: "change" }],
   },
 });
@@ -334,10 +380,27 @@
   modelForm.value.model = "";
   modelForm.value.id = "";
   modelForm.value.unit = "";
-  modelForm.value.drawingNumber = "";
   modelForm.value.productType = null;
+  modelForm.value.routeId = null;
+  modelForm.value.drawingFile = "";
+  modelForm.value.tempFileIds = [];
+  modelForm.value.salesLedgerFiles = [];
+  drawingFileList.value = [];
   if (type === "edit") {
     modelForm.value = { ...data };
+    modelForm.value.tempFileIds = data.tempFileIds || [];
+    modelForm.value.salesLedgerFiles = data.salesLedgerFiles || [];
+    if (data.salesLedgerFiles && data.salesLedgerFiles.length > 0) {
+      drawingFileList.value = data.salesLedgerFiles.map(file => ({
+        name: file.name,
+        url: file.url
+      }));
+    } else if (data.drawingFile) {
+      drawingFileList.value = [{
+        name: data.drawingFile.split('/').pop(),
+        url: data.drawingFile
+      }];
+    }
   }
 };
 
@@ -429,7 +492,61 @@
   proxy.download("/basic/product/downloadTemplate", {}, "浜у搧瀵煎叆妯℃澘.xlsx");
 };
 
-getModelList();
+const getProcessRouteListData = () => {
+  getProcessRouteList({ current: 1, size: 1000 }).then((res) => {
+    processRouteList.value = res.data.records || [];
+  }).catch(() => {
+    processRouteList.value = [];
+  });
+};
+
+const handleDrawingBeforeUpload = (file) => {
+  const isAllowed = [
+    'application/pdf',
+    'image/jpeg',
+    'image/jpg',
+    'image/png',
+    'application/dwg'
+  ].includes(file.type) || file.name.endsWith('.dwg');
+  const isLt10M = file.size / 1024 / 1024 < 10;
+  
+  if (!isAllowed) {
+    proxy.$modal.msgError("鍙兘涓婁紶 pdf銆乯pg銆乯peg銆乸ng銆乨wg 鏍煎紡鐨勬枃浠讹紒");
+    return false;
+  }
+  if (!isLt10M) {
+    proxy.$modal.msgError("涓婁紶鏂囦欢澶у皬涓嶈兘瓒呰繃 10MB锛�");
+    return false;
+  }
+  return true;
+};
+
+const handleDrawingUploadSuccess = (response, file, fileList) => {
+  console.log('涓婁紶鎴愬姛鍝嶅簲', response);
+  console.log('response.data', response.data);
+  if (response.code === 200) {
+    modelForm.value.tempFileIds = [response.data?.tempId];
+    modelForm.value.salesLedgerFiles = [{
+      tempId: response.data?.tempId,
+      originalName: response.data?.originalName || file.name,
+      tempPath: response.data?.tempPath,
+      type: response.data?.type || 13
+    }];
+    proxy.$modal.msgSuccess("涓婁紶鎴愬姛");
+  } else {
+    proxy.$modal.msgError(response.msg || "涓婁紶澶辫触");
+  }
+};
+
+const handleDrawingRemove = (file) => {
+  modelForm.value.tempFileIds = [];
+  modelForm.value.salesLedgerFiles = [];
+};
+
+onMounted(() => {
+  getModelList();
+  getProcessRouteListData();
+});
 </script>
 
 <style scoped>
@@ -469,6 +586,31 @@
   margin-top: 16px;
 }
 
+.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 148px;
+  height: 148px;
+  text-align: center;
+  line-height: 148px;
+}
+
+:deep(.el-upload--picture-card) {
+  width: 148px;
+  height: 148px;
+}
+
+:deep(.el-upload-list__item) {
+  width: 148px;
+  height: 148px;
+}
+
+:deep(.el-upload__tip) {
+  font-size: 12px;
+  color: #909399;
+  margin-top: 8px;
+}
+
 :deep(.el-dialog__body) {
   padding: 20px 24px;
 }

--
Gitblit v1.9.3