From 739da1778e71e0fb23cef0a1a2c2a2bc3a7a2cb6 Mon Sep 17 00:00:00 2001
From: bluejay <253316343@qq.com>
Date: 星期二, 15 四月 2025 09:10:00 +0800
Subject: [PATCH] Merge remote-tracking branch 'origin/dev' into dev

---
 src/api/mainPlan/weldSeam/weldSeam.js |   70 +++++
 src/components/HxlhTable/index.vue    |    4 
 src/views/partPlan/index.vue          |    4 
 src/views/ApsPartRouteStat/index.vue  |   24 +
 src/views/mainPlan/weldSeam/index.vue |  722 +++++++++++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 812 insertions(+), 12 deletions(-)

diff --git a/src/api/mainPlan/weldSeam/weldSeam.js b/src/api/mainPlan/weldSeam/weldSeam.js
new file mode 100644
index 0000000..6ae30f0
--- /dev/null
+++ b/src/api/mainPlan/weldSeam/weldSeam.js
@@ -0,0 +1,70 @@
+import request from '@/utils/request'
+
+// 鏌ヨ鐒婄紳鍒楄〃
+export function listWeldSeam(query) {
+  return request({
+    url: '/weldSeam/weldSeam/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ鐒婄紳璇︾粏
+export function getWeldSeam(id) {
+  return request({
+    url: '/weldSeam/weldSeam/' + id,
+    method: 'get'
+  })
+}
+
+// 鏂板鐒婄紳
+export function addWeldSeam(data) {
+  return request({
+    url: '/weldSeam/weldSeam',
+    method: 'post',
+    data: data
+  })
+}
+
+// 淇敼鐒婄紳
+export function updateWeldSeam(data) {
+  return request({
+    url: '/aps/weldSeamStatistics',
+    method: 'put',
+    data: data
+  })
+}
+
+// 鍒犻櫎鐒婄紳
+export function delWeldSeam(id) {
+  return request({
+    url: '/weldSeam/weldSeam/' + id,
+    method: 'delete'
+  })
+}
+
+// 鏌ヨ鐒婄紳璁″垝绠$悊鍒楄〃
+export function examplePlan(query) {
+  return request({
+    url: '/aps/weldSeamTemp/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 鏌ヨ闆朵欢璁″垝绠$悊鍒楄〃
+export function confirmWeldSeam(data) {
+  return request({
+    url: '/aps/weldSeam/confirmWeldSeam',
+    method: 'post',
+    data: data
+  })
+}
+
+// 鏌ヨ闆朵欢缁熻琛ㄥ垪琛�
+export function query() {
+  return request({
+    url: '/aps/weldSeamStatistics/list',
+    method: 'get'
+  })
+}
\ No newline at end of file
diff --git a/src/components/HxlhTable/index.vue b/src/components/HxlhTable/index.vue
index 54ee3f1..8de4a38 100644
--- a/src/components/HxlhTable/index.vue
+++ b/src/components/HxlhTable/index.vue
@@ -32,8 +32,8 @@
             @checkbox-change="checkChange"
             @checkbox-all="checkChangeall"
             >
-            <template v-slot:buttons>
-                <slot />
+            <template v-slot:buttons="row">
+                <slot name="buttons" v-bind="row"/>
             </template>
         </vxe-grid>
     </div>
diff --git a/src/views/ApsPartRouteStat/index.vue b/src/views/ApsPartRouteStat/index.vue
index 850b49a..5ac9332 100644
--- a/src/views/ApsPartRouteStat/index.vue
+++ b/src/views/ApsPartRouteStat/index.vue
@@ -26,7 +26,7 @@
 </template>
 
 <script setup name="apsPartRouteStat">
-import { query,updateStat } from "@/api/apsPartRouteStat/apsPartRouteStat";
+import { query,updateStat } from "@/api/ApsPartRouteStat/ApsPartRouteStat";
 import { ref } from "vue";
 import * as XLSX from 'xlsx';
 
@@ -87,8 +87,9 @@
       colList.push({
           field: 'dateCol',
           title: '鏃ユ湡',
+          fixed: 'left',
           children: [
-            { field: `resourceName`, title: '璧勬簮缁�', width: 100},
+            { field: `resourceName`, title: '璧勬簮缁�', width: 250, type: 'html'},
           ],
           width: 160
         })
@@ -104,9 +105,9 @@
           field: `dateColTime${colKey}`,
           title: item,
           children: [
-          { field: `designTimes${colKey}`, title: '璁捐宸ユ椂', width: 100},
-          { field: `requireTimes${colKey}`, title: '闇�姹傚伐鏃�', width: 100},
-          { field: `capacityLoad${colKey}`, title: '浜ц兘璐熻嵎', width: 100},
+          { field: `designTimes${colKey}`, title: '璁捐宸ユ椂', width: 80},
+          { field: `requireTimes${colKey}`, title: '闇�姹傚伐鏃�', width: 80},
+          { field: `capacityLoad${colKey}`, title: '浜ц兘璐熻嵎', width: 80, type: 'html'},
           ],
           width: 160
         })
@@ -131,17 +132,24 @@
         }
         for (const [key, listValue] of Object.entries(mapItem)) {
           data.push(key);
-          item[`resourceName`] = key;
+          
           let tableKey = 0;
+          let flag = false;
           listValue.forEach(listItem => {
+
             tableKey++
             item[`designTimes${tableKey}`] = listItem.designTimes;
             item[`requireTimes${tableKey}`] = listItem.requireTimes;
-            item[`capacityLoad${tableKey}`] = listItem.capacityLoad;
+            item[`capacityLoad${tableKey}`] = listItem.capacityLoad > 100 ? `<font color="red">${listItem.capacityLoad}%</font>` :listItem.capacityLoad+'%';
             data.push(listItem.designTimes);
             data.push(listItem.requireTimes);
-            data.push(listItem.capacityLoad);
+            data.push(listItem.capacityLoad+'%');
+            if (listItem.capacityLoad > 100) {
+              flag = true;
+            }
           });
+
+          item[`resourceName`] = flag ? `<div class='el-badge'><sup class="el-badge__content is-fixed is-dot"></sup>${key}</div>` : key;
         }
         exportData.value.push(data);
         dataList.push(item);
diff --git a/src/views/mainPlan/weldSeam/index.vue b/src/views/mainPlan/weldSeam/index.vue
new file mode 100644
index 0000000..38a3d5d
--- /dev/null
+++ b/src/views/mainPlan/weldSeam/index.vue
@@ -0,0 +1,722 @@
+<template>
+  <div class="app-container">
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button 
+          type="info" 
+          plain 
+          icon="Upload" 
+          @click="handleImport" 
+          v-hasPermi="['weldSeam:weldSeam:import']"
+          >瀵煎叆</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="Download"
+          @click="handleExport"
+          v-hasPermi="['weldSeam:weldSeam:export']"
+        >瀵煎嚭</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <HxlhTable
+        style="width: 100%"
+        :columns="columns"
+        :data="dataList"
+        :loading="loading"
+        :height="height"
+        @on-checkbox="handleCheckboxChange"
+    >
+      <template #buttons="{row}">
+        <vxe-button mode="text" @click="viewEvent(row)">缂栬緫</vxe-button>
+        <!-- <vxe-button mode="text" @row-click="viewEvent(row.year)">缂栬緫</vxe-button> -->
+      </template>
+    </HxlhTable>
+
+    <!-- 瀵煎叆瀵硅瘽妗� -->
+    <el-dialog :title="upload.title" v-model="upload.open" width="90%" append-to-body @close="dialogCancel">
+      <el-row :gutter="10">
+        <el-col>
+          <div style="border-bottom: 1px solid #ccc;" >
+            <p>涓婁紶Excel鏂囦欢锛屽寘鍚剨缂濆伐鍗曚俊鎭�傜郴缁熷皢瑙f瀽鏁版嵁骞朵繚瀛樺埌鏈湴锛岀敤浜庡叧鑱斿埌鐒婄紳璁″垝涓��</p>
+          </div>
+        </el-col>
+        <el-col >
+          <div></div>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col>
+          <el-upload ref="uploadRef" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="true" drag>
+            <el-icon class="el-icon--upload"><upload-filled /></el-icon>
+            <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
+            <template #tip>
+              <div class="el-upload__tip">
+                <span>浠呭厑璁稿鍏ls銆亁lsx鏍煎紡鏂囦欢銆�</span>
+              </div>
+            </template>
+          </el-upload>
+        </el-col>
+      </el-row>
+      <el-row>
+        <el-col style="margin-top: 20px;">
+          <div v-show="isVisible">
+            <el-alert icon="Check" :show-icon="true" title="鐒婄紳宸ュ崟鏁版嵁宸叉垚鍔熻В鏋�" type="success" :closable="false"/>
+          </div>
+          <div v-show="isError">
+            <el-alert icon="Close" :show-icon="true" title="鐒婄紳宸ュ崟鏁版嵁宸茶В鏋愬け璐�" type="error" :closable="false"/>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row v-show="isVisible">
+        <el-col>
+          <div>
+            <h2>鏁版嵁棰勮</h2>
+          </div>
+          <HxlhTable
+            style="width: 100%"
+            :columns="exampleColumns"
+            :data="exampleList"
+            :loading="loading"
+            :maxHeight="exampleHeight"
+          >
+          </HxlhTable>
+        </el-col>
+        <el-col>
+          <div style="text-align: right;">
+            <h4>鍏变笂浼�<span style="color: blue;">{{ total }}</span>鏉$剨缂濆伐鍗曟暟鎹�</h4>
+          </div>
+        </el-col>
+      </el-row>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button
+              type="success"
+              plain
+              icon="Check"
+              :disabled="planned"
+              @click="uploadParse"
+              v-hasPermi="['weldSeam:weldSeam:confirmPart']"
+            >纭涓婁紶</el-button>
+          <el-button @click="dialogCancel">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
+
+    <!-- 娣诲姞鎴栦慨鏀圭剨缂濆璇濇 -->
+    <el-dialog :title="title" v-model="open" width="700px" append-to-body>
+      <el-form ref="weldSeamRef" :model="form" :rules="rules" label-width="150px">
+        <el-form-item label="骞翠唤" prop="year">
+          <el-input v-model="form.year" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="鏈堜唤" prop="month">
+          <el-input v-model="form.month" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="鐢熶骇鍩哄湴" prop="productionBase">
+          <el-input v-model="form.productionBase" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="绠¤矾璁㈠崟闇�姹�" prop="pipingOrderRequirement">
+          <el-input v-model="form.pipingOrderRequirement" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="姘旀煖璁㈠崟闇�姹�" prop="gasOrderRequirement">
+          <el-input v-model="form.gasOrderRequirement" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="绠¤矾棰勬祴闇�姹�" prop="pipingPredictionRequirement">
+          <el-input v-model="form.pipingPredictionRequirement" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="姘旀煖棰勬祴闇�姹�" prop="gasPredictionRequirement">
+          <el-input v-model="form.gasPredictionRequirement" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="棰勭暀绱ф�ヨ鍗曚骇鍑�" prop="reserveEmergencyOrderOutput">
+          <el-input-number :min="0" v-model="form.reserveEmergencyOrderOutput" placeholder="璇疯緭棰勭暀绱ф�ヨ鍗曚骇鍑�"/>
+        </el-form-item>
+        <el-form-item label="鍚堣" prop="total">
+          <el-input v-model="form.total" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="澶╂暟" prop="days">
+          <el-input-number :min="0" v-model="form.days" placeholder="璇疯緭鍏ュぉ鏁�"/>
+        </el-form-item>
+        <el-form-item label="闇�姹傛棩鐒婄紳" prop="requirementDayWeldSeam">
+          <el-input v-model="form.requirementDayWeldSeam" :disabled="isDisabled"/>
+        </el-form-item>
+        <el-form-item label="鐢熶骇鏃ョ剨缂�" prop="productionDayWeldSeam">
+          <el-input-number :min="0" v-model="form.productionDayWeldSeam" placeholder="璇疯緭鐢熶骇鏃ョ剨缂�"/>
+        </el-form-item>
+        <el-form-item label="鏄惁婊¤冻" prop="isSatisfy">
+          <el-input v-model="form.isSatisfy" :disabled="isDisabled"/>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">纭� 瀹�</el-button>
+          <el-button @click="cancel">鍙� 娑�</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="WeldSeam">
+import { listWeldSeam, getWeldSeam, delWeldSeam, addWeldSeam, updateWeldSeam ,examplePlan ,confirmWeldSeam ,query} from "@/api/mainPlan/weldSeam/weldSeam";
+import { getToken } from "@/utils/auth";
+import HxlhTable from '@/components/HxlhTable'
+import { ref } from "vue";
+import * as XLSX from 'xlsx';
+
+const { proxy } = getCurrentInstance();
+
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+const daterangeThisFeedbackDay = ref([]);
+const daterangeMaterialsRequirementDay = ref([]);
+const isVisible = ref(false);
+const isError = ref(false);
+const planned = ref(true);
+const height = ref(document.documentElement.clientHeight - 210 + "px;")
+const exampleHeight = ref("500px");
+const uploadRef = ref();
+const exampleList = ref([]);
+const batchNumber = ref(null);
+const dataList = ref([]);
+const isDisabled = ref(true);
+const headers = ref([]);
+const exportData = ref([]);
+
+/** 瀵煎叆鍙傛暟 */
+const upload = reactive({
+  // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
+  open: false,
+  // 寮瑰嚭灞傛爣棰橈紙鐢ㄦ埛瀵煎叆锛�
+  title: "",
+  // 鏄惁绂佺敤涓婁紶
+  isUploading: false,
+  // 鏄惁鏇存柊宸茬粡瀛樺湪鐨勭敤鎴锋暟鎹�
+  updateSupport: 0,
+  // 璁剧疆涓婁紶鐨勮姹傚ご閮�
+  headers: { Authorization: "Bearer " + getToken() },
+  // 涓婁紶鐨勫湴鍧�
+  url: import.meta.env.VITE_APP_BASE_API + "/aps/weldSeam/importData"
+});
+
+// 琛ㄦ牸閰嶇疆 
+const columns = ref([
+  { type: 'seq', title: '搴忓彿', width: 60 },
+  {
+    title: '骞翠唤',
+    field: 'year',
+    width: 100,
+  },
+  {
+    title: '鏈堜唤',
+    field: 'month',
+    width: 80,
+  },
+  {
+    title: '鐢熶骇鍩哄湴',
+    field: 'productionBase',
+    width: 150,
+  },
+  {
+    title: '璁㈠崟闇�姹�',
+    field: 'order',
+    children: [
+      { field: 'pipingOrderRequirement', title: '绠¤矾', width: 140 },
+      { field: 'gasOrderRequirement', title: '姘旀煖', width: 120 },
+    ],
+    width: 150,
+  },
+  {
+    title: '棰勬祴闇�姹�',
+    field: 'info',
+    children: [
+      { field: 'pipingPredictionRequirement', title: '绠¤矾', width: 140 },
+      { field: 'gasPredictionRequirement', title: '姘旀煖', width: 120 },
+    ],
+    width: 150,
+  },
+  {
+    title: '棰勭暀绱ф�ヨ鍗曚骇鍑�',
+    field: 'reserveEmergencyOrderOutput',
+    width: 150,
+  },
+  {
+    title: '鍚堣',
+    field: 'total',
+    width: 150,
+  },
+  {
+    title: '澶╂暟',
+    field: 'days',
+    width: 150,
+  },
+  {
+    title: '闇�姹傛棩鐒婄紳',
+    field: 'requirementDayWeldSeam',
+    width: 100,
+  },
+  {
+    title: '鐢熶骇鏃ョ剨缂�',
+    field: 'productionDayWeldSeam',
+    width: 150,
+  },
+  {
+    title: '鏄惁婊¤冻',
+    field: 'isSatisfy',
+    width: 150,
+  },
+  { title: '鎿嶄綔', width: 100, fixed:"right", slots: { default: 'buttons' } }
+]);
+
+// 琛ㄦ牸閰嶇疆 
+const exampleColumns = ref([
+  { type: 'seq', title: '搴忓彿', width: 60 },
+  {
+    title: '宸ュ崟绫诲瀷',
+    field: 'workOrderType',
+    width: 100,
+  },
+  /* {
+    title: '鍛ㄦ棩',
+    field: 'weekDay',
+    width: 100,
+    formatter: (({ cellValue, row, column }) => {
+      if (cellValue) {
+        const weekDay = new Date(cellValue);
+        const year = weekDay.getFullYear();
+        const month = String(weekDay.getMonth() + 1).padStart(2, '0');
+        const day = String(weekDay.getDate()).padStart(2, '0');
+        return `${month}-${day}`;
+      }
+      return '';
+    })
+  }, */
+  {
+    title: '鐗╂枡缂栫爜',
+    field: 'materialCode',
+    width: 80,
+  },
+  {
+    title: '瀹㈡埛鍥惧彿',
+    field: 'customerDrawingNumber',
+    width: 150,
+  },
+  {
+    title: '缁勭粐璐﹀彿',
+    field: 'organizeNumber',
+    width: 150,
+  },
+  {
+    title: '鐢熶骇鍩哄湴',
+    field: 'productionBase',
+    width: 200,
+  },
+  {
+    title: '鍒嗙被(姘旀煖/绠¤矾)',
+    field: 'classification',
+    width: 150,
+  },
+  {
+    title: '鐢熶骇骞翠唤',
+    field: 'produceYear',
+    width: 150,
+  },
+  {
+    title: '鐢熶骇鏈堜唤',
+    field: 'produceMonth',
+    width: 150,
+  },
+  {
+    title: '鐢熸垚鏁伴噺',
+    field: 'productionQuantity',
+    width: 100,
+  },
+  {
+    title: '瀹㈡埛',
+    field: 'customer',
+    width: 150,
+  },
+  {
+    title: '鍗曚欢鐒婄紳',
+    field: 'singleWeldSeam',
+    width: 150,
+  },
+  {
+    title: '鎬荤剨缂�',
+    field: 'totalWeldSeam',
+    width: 100,
+  },
+  {
+    title: '鏈鍙嶉鏃ユ湡',
+    field: 'thisFeedbackDay',
+    width: 100,
+  },
+  {
+    title: '鐗╂枡闇�姹傛棩鏈�',
+    field: 'materialsRequirementDay',
+    width: 100,
+  },
+  {
+    title: '閿�鍞鍗曞彿',
+    field: 'saleOrderNo',
+    width: 150,
+  },
+  {
+    title: '閿�鍞鍗曡',
+    field: 'saleOrderLine',
+    width: 150,
+  },
+  {
+    title: '涓诲伐鍗曞彿',
+    field: 'mainWorkOrderNo',
+    width: 100,
+  },
+  {
+    title: '涓婄骇宸ュ崟鍙�',
+    field: 'superiorWorkOrderNo',
+    width: 100,
+  },
+  {
+    title: '宸ュ崟鍙�',
+    field: 'workOrderNo',
+    width: 100,
+  },
+]);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    workOrderType: null,
+    materialCode: null,
+    customerDrawingNumber: null,
+    organizeNumber: null,
+    productionBase: null,
+    classification: null,
+    produceYear: null,
+    produceMonth: null,
+    productionQuantity: null,
+    customer: null,
+    singleWeldSeam: null,
+    totalWeldSeam: null,
+    thisFeedbackDay: null,
+    materialsRequirementDay: null,
+    saleOrderNo: null,
+    saleOrderLine: null,
+    mainWorkOrderNo: null,
+    superiorWorkOrderNo: null,
+    workOrderNo: null,
+    plant: null,
+    batchNumber: null
+  },
+  rules: {
+    reserveEmergencyOrderOutput: [
+      {
+        required: true,
+        message: '璇疯緭鍏ラ鐣欑揣鎬ヨ鍗曚骇鍑�',
+        trigger: 'blur',
+      },
+    ],
+    days: [
+      {
+        required: true,
+        message: '璇疯緭鍏ュぉ鏁�',
+        trigger: 'blur',
+      },
+    ],
+    productionDayWeldSeam: [
+      {
+        required: true,
+        message: '璇疯緭鍏ラ鐣欑揣鎬ヨ鍗曚骇鍑�',
+        trigger: 'blur',
+      },
+    ],
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 鏌ヨ鐒婄紳鍒楄〃 */
+function getList() {
+  loading.value = true;
+  query(queryParams.value).then(response => {
+    console.log(response);
+    dataList.value = response.rows;
+    // exportData.value = response.rows;
+    dataList.value.forEach(item=>{
+      let data = [];
+      data.push(item.year);
+      data.push(item.month);
+      data.push(item.productionBase);
+      data.push(item.pipingOrderRequirement);
+      data.push(item.gasOrderRequirement);
+      data.push(item.pipingPredictionRequirement);
+      data.push(item.gasPredictionRequirement);
+      data.push(item.reserveEmergencyOrderOutput);
+      data.push(item.total);
+      data.push(item.days);
+      data.push(item.requirementDayWeldSeam);
+      data.push(item.productionDayWeldSeam);
+      data.push(item.isSatisfy);
+      exportData.value.push(data);
+    })
+    console.log(exportData.value);
+    loading.value = false;
+  });
+}
+
+// 鍙栨秷鎸夐挳
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 琛ㄥ崟閲嶇疆
+function reset() {
+  form.value = {
+    workOrderType: null,
+    materialCode: null,
+    customerDrawingNumber: null,
+    organizeNumber: null,
+    productionBase: null,
+    classification: null,
+    produceYear: null,
+    produceMonth: null,
+    productionQuantity: null,
+    customer: null,
+    singleWeldSeam: null,
+    totalWeldSeam: null,
+    thisFeedbackDay: null,
+    materialsRequirementDay: null,
+    saleOrderNo: null,
+    saleOrderLine: null,
+    mainWorkOrderNo: null,
+    superiorWorkOrderNo: null,
+    workOrderNo: null,
+    plant: null
+  };
+  proxy.resetForm("weldSeamRef");
+}
+
+/** 鎼滅储鎸夐挳鎿嶄綔 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 閲嶇疆鎸夐挳鎿嶄綔 */
+function resetQuery() {
+  daterangeThisFeedbackDay.value = [];
+  daterangeMaterialsRequirementDay.value = [];
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 澶氶�夋閫変腑鏁版嵁
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 鏂板鎸夐挳鎿嶄綔 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "娣诲姞鐒婄紳";
+}
+
+/** 淇敼鎸夐挳鎿嶄綔 */
+function handleUpdate(row) {
+  reset();
+  const _id = row.id || ids.value
+  getWeldSeam(_id).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "淇敼鐒婄紳";
+  });
+}
+
+/** 鎻愪氦鎸夐挳 */
+function submitForm() {
+  proxy.$refs["weldSeamRef"].validate(valid => {
+    if (valid) {
+      if (form.value.id != null) {
+        updateWeldSeam(form.value).then(response => {
+          proxy.$modal.msgSuccess("淇敼鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addWeldSeam(form.value).then(response => {
+          proxy.$modal.msgSuccess("鏂板鎴愬姛");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 鍒犻櫎鎸夐挳鎿嶄綔 */
+function handleDelete(row) {
+  const _ids = row.id || ids.value;
+  proxy.$modal.confirm('鏄惁纭鍒犻櫎鐒婄紳缂栧彿涓�"' + _ids + '"鐨勬暟鎹」锛�').then(function() {
+    return delWeldSeam(_ids);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("鍒犻櫎鎴愬姛");
+  }).catch(() => {});
+}
+
+/** 瀵煎叆鎸夐挳鎿嶄綔 */
+function handleImport() {
+  upload.title = "鐒婄紳宸ュ崟鏁版嵁涓婁紶";
+  upload.open = true;
+};
+
+/** 瀵煎嚭鎸夐挳鎿嶄綔 */
+function handleExport() {
+  const headersOne = ["骞翠唤","鏈堜唤","鐢熶骇鍩哄湴","璁㈠崟闇�姹�","","棰勬祴闇�姹�","","棰勭暀绱ф�ヨ鍗曚骇鍑�","鍚堣","澶╂暟","闇�姹傛棩鐒婄紳","鐢熶骇鏃ョ剨缂�","鏄惁婊¤冻"]
+  const headersTwo = ["","","","绠¤矾","姘旀煖","绠¤矾","姘旀煖","","","","","",""]
+  headers.value.push(headersOne);
+  headers.value.push(headersTwo);
+  
+  // 鍚堝苟琛ㄥご鍜屾暟鎹�
+  const finalData = [...headers.value, ...exportData.value];
+
+  // 灏嗘暟鎹浆鎹负 worksheet
+  const ws = XLSX.utils.aoa_to_sheet(finalData);
+
+  // 鍚堝苟鍗曞厓鏍硷紙濡傛灉闇�瑕侊級
+  ws['!merges'] = [
+    { s: { r: 0, c: 0 }, e: { r: 1, c: 0 } },
+    { s: { r: 0, c: 1 }, e: { r: 1, c: 1 } },
+    { s: { r: 0, c: 2 }, e: { r: 1, c: 2 } },
+    { s: { r: 0, c: 3 }, e: { r: 0, c: 4 } },
+    { s: { r: 0, c: 5 }, e: { r: 0, c: 6 } },
+    { s: { r: 0, c: 7 }, e: { r: 1, c: 7 } },
+    { s: { r: 0, c: 8 }, e: { r: 1, c: 8 } },
+    { s: { r: 0, c: 9 }, e: { r: 1, c: 9 } },
+    { s: { r: 0, c: 10 }, e: { r: 1, c: 10 } },
+    { s: { r: 0, c: 11 }, e: { r: 1, c: 11 } },
+    { s: { r: 0, c: 12 }, e: { r: 1, c: 12 } },
+  ];
+
+  // ws['!merges'] = merges;
+
+  // 璁剧疆灞呬腑鏍峰紡
+  const centerStyle = { alignment: { horizontal: 'center', vertical: 'center' } };
+    const range = XLSX.utils.decode_range(ws['!ref']);
+    for (let R = range.s.r; R <= range.e.r; ++R) {
+        for (let C = range.s.c; C <= range.e.c; ++C) {
+            const cellAddress = XLSX.utils.encode_cell({ r: R, c: C });
+            const cell = ws[cellAddress];
+            if (cell) {
+                cell.s = centerStyle;
+            }
+        }
+    }
+  
+  // 鍒涘缓 workbook
+  const wb = XLSX.utils.book_new();
+  // 灏� worksheet 娣诲姞鍒� workbook 涓�
+  XLSX.utils.book_append_sheet(wb, ws, 'Sheet1');
+  // 瀵煎嚭鏂囦欢
+  XLSX.writeFile(wb, `apsPartRouteStat_${new Date().getTime()}.xlsx`);
+}
+
+/** dialog鍙栨秷 */
+function dialogCancel(){
+  if (uploadRef.value) {
+    uploadRef.value.clearFiles();
+  }
+  isVisible.value = false;
+  isError.value = false;
+  planned.value = true;
+  upload.open = false;
+  upload.isUploading = false;
+}
+
+/**鏂囦欢涓婁紶涓鐞� */
+const handleFileUploadProgress = (event, file, fileList) => {
+  upload.isUploading = true;
+};
+
+/** 鏂囦欢涓婁紶鎴愬姛澶勭悊 */
+const handleFileSuccess = (response, file, fileList) => {
+  if(response.code == '200'){
+    batchNumber.value = response.data;
+    isVisible.value = true;
+    planned.value = false;
+    isError.value = false;
+    getExampleList();
+  }else{
+    isError.value = true;
+    proxy.$alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.msg + "</div>", "瀵煎叆缁撴灉", { dangerouslyUseHTMLString: true });
+  }
+  proxy.$refs["uploadRef"].handleRemove(file);
+  upload.isUploading = false;
+};
+
+/** 涓婁紶骞惰В鏋愭寜閽搷浣� */
+function uploadParse() {
+  queryParams.value.params = {};
+  queryParams.value.params["batchNumber"] = batchNumber.value;
+  confirmWeldSeam(queryParams.value).then(response => {
+    exampleList.value = response.rows;
+    loading.value = false;
+    isVisible.value = false;
+    isError.value = false;
+    planned.value = true;
+    upload.open = false;
+    ElMessage({
+      message: '鐒婄紳宸ュ崟鏁版嵁宸叉垚鍔熶笂浼犲拰瑙f瀽',
+      type: 'success',
+    })
+    getList();
+  });
+}
+
+/** 鏌ヨ闆朵欢璁″垝涓存椂绠$悊鍒楄〃 */
+function getExampleList() {
+  loading.value = true;
+  queryParams.value = {};
+  queryParams.value.batchNumber = batchNumber.value;
+  examplePlan(queryParams.value).then(response => {
+    exampleList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+/** 缂栬緫 */
+// const viewEvent = (row, column, event) => {
+//   console.log('鐐瑰嚮鐨勮鏁版嵁');
+//   console.log('鐐瑰嚮鐨勮鏁版嵁锛�', row);
+// };
+function viewEvent(row){
+  console.log(row);
+  open.value = true;
+  title.value = "淇敼鐒婄紳";
+  form.value = row;
+  // const _id = row.id
+  // getWeldSeam(_id).then(response => {
+  //   form.value = response.data;
+  //   open.value = true;
+  //   title.value = "淇敼鐒婄紳";
+  // });
+}
+
+getList();
+</script>
diff --git a/src/views/partPlan/index.vue b/src/views/partPlan/index.vue
index b18cabd..bd69847 100644
--- a/src/views/partPlan/index.vue
+++ b/src/views/partPlan/index.vue
@@ -115,7 +115,7 @@
     >
     </HxlhTable>
 
-    <!-- 鐢ㄦ埛瀵煎叆瀵硅瘽妗� -->
+    <!-- 瀵煎叆瀵硅瘽妗� -->
     <el-dialog :title="upload.title" v-model="upload.open" width="90%" append-to-body @close="dialogCancel">
       <el-row :gutter="10">
         <el-col>
@@ -252,7 +252,7 @@
 const exampleHeight = ref("500px");
 const uploadRef = ref();
 
-/*** 鐢ㄦ埛瀵煎叆鍙傛暟 */
+/** 瀵煎叆鍙傛暟 */
 const upload = reactive({
   // 鏄惁鏄剧ず寮瑰嚭灞傦紙鐢ㄦ埛瀵煎叆锛�
   open: false,

--
Gitblit v1.9.3