chengxiangling
2025-05-13 31a116f666ea52854fee19c253cbd5696570ad88
焊缝统计i18n
已修改4个文件
893 ■■■■■ 文件已修改
.env.development 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/i18n/locales/common/index.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/i18n/locales/plan/index.js 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/mainPlan/weldSeam/index.vue 803 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.env.development
@@ -10,4 +10,4 @@
# 配合后端服务
# VITE_APP_LOCAL = 'int'
# VITE_APP_LOCAL = 'zhl'
VITE_APP_LOCAL = 'sfd'
VITE_APP_LOCAL = 'hjy'
src/utils/i18n/locales/common/index.js
@@ -24,7 +24,8 @@
    operate:"操作",
    batchUpdate:"批量更新",
    close:"关闭",
    require:"需求"
    require:"需求",
    modify:"修改"
  },
};
export const en = {
@@ -53,6 +54,7 @@
    operate:"Operate",
    batchUpdate:"Batch update",
    close:"Close",
    require:"Require"
    require:"Require",
    modify:"Modify"
  },
};
src/utils/i18n/locales/plan/index.js
@@ -5,7 +5,10 @@
    viewAssociatedRequirements:"查看关联需求",
    setMode:"设置模式",
    CustomizePlannedCompletionDate:"自定义计划完工日",
    tipsBugSheetMetal:"将生成的钣金需求的计划开工日和计划完工日赋值给工单"
    tipsBugSheetMetal:"将生成的钣金需求的计划开工日和计划完工日赋值给工单",
    metalWeldWork:"焊缝工单数据",
    parseUpload:"已成功上传和解析",
    weld:"焊缝"
  },
  options: {
    monthlyStatic: "按月统计",
@@ -54,13 +57,17 @@
    selectDateRange: "选择区间",
    requireTraceID: "需求追溯ID",
    itemNumber: "料号",
    pipelineOrderRequire:"管路订单需求",
    gasHolderOrderRequire:"气柜订单需求",
    pipelinePredictionDemand:"管路预测需求",
    gasHolderForecastDemand:"气柜预测需求",
  },
  upload: {
    prevText: "将文件拖到此处,或",
    uploadPartWorkOrderData: "零件工单数据上传",
    uploadSheetMetalPlanData: "钣金计划数据上传",
    uploadGasPipelineData: "气体管路计划数据上传",
    uploadWeldSeamData: "焊缝工单数据上传",
    info: "上传Excel文件,包含零件工单信息。系统将解析数据并保存到本地,用于关联到零件计划中。",
    weldSeamInfo:
      "上传Excel文件,包含焊缝工单信息。系统将解析数据并保存到本地,用于关联到焊缝计划中。",
@@ -69,11 +76,14 @@
    dataPreview: "数据预览",
    totalUpload: "共上传",
    itemUpload: "条零件工单数据",
    itemWeldSeamUpload:"条焊缝工单数据",
    confirmUpload: "确认上传",
    cancel: "取 消",
    errorResult: "导入结果",
    uploadParsePartWorkOrderData: "零件工单数据已成功上传和解析",
    uploadParseGasPipelineData: "气体管路计划数据已成功上传和解析",
    uploadParseWeldSeamData:"焊缝工单数据已成功解析",
    uploadErrorParseWeldSeamData:"焊缝工单数据已解析失败"
  },
  table: {
    mainPartNumber: "主件料号",
@@ -95,11 +105,37 @@
    planworkOrderTime: "工单计划下发时间",
    planEndDay: "系统完工时间",
    seq: "序号",
    year:"年份",
    month:"月份",
    piping:"管路",
    gasHolder:"气柜",
    forecastDemand:"预测需求",
    reserveOrderOutput:"预留紧急订单产出",
    calTotal:"合计",
    days:"天数",
    requirementDayWeldSeam:"需求日焊缝",
    productionDayWeldSeam:"生产日焊缝",
    customerDrawingNumber:"客户图号",
    organizationalAccount:"组织账号",
    isRequirements:"是否满足",
    materialCode: "物料编码",
    classification:"分类(气柜/管路)",
    productionYear:"生产年份",
    productionMonth:"生产月份",
    generateQuantity:"生成数量",
    mainWorkOrderNumber:"主工单号",
    superiorWorkOrderNumber:"上级工单号",
    masterPlanner: "主计划员",
    weekDay: "周日",
    weekCycle: "周度",
    mainPartDrawingNumber: "主件图号",
    customer: "客户名称",
    singleWeldSeam:"单件焊缝",
    totalWeldSeam:"总焊缝",
    dateFeedback:"本次反馈日期",
    materialRequirementDate:"物料需求日期",
    salesOrder:"销售订单号",
    salesOrderLine:"销售订单行",
    goodProductsQuantity: "良品数量",
    processNumber: "工序号",
    factoryCenter: "工作中心",
@@ -142,7 +178,6 @@
    dayProduceUnit: "日产出单位",
    personnelNumber: "人员数量",
    dayProduceAllNum: "日产出总数量",
    days: "天数",
    monthProduceAllNum: "月产出数量",
    remark: "备注",
    // 钣金供应缺口报表
@@ -156,6 +191,7 @@
    requirementDate:"需求日期",
    applicableFactories:"适用工厂",
    productionBase:"生产基地",
    orderRequirements:"订单需求",
    // 钣金冗余工单报表
    subItemPartNumber:"子件料号",
    mismatchedProductionQuantity:"未匹配生产数量",
@@ -181,7 +217,8 @@
    viewAssociatedRequirements:"View associated requirements",
    setMode:"Set Mode",
    CustomizePlannedCompletionDate:"Customize the planned completion date",
    tipsBugSheetMetal:"Assign the planned start date and planned completion date of the generated sheet metal requirements to the work order"
    tipsBugSheetMetal:"Assign the planned start date and planned completion date of the generated sheet metal requirements to the work order",
    weld:"weld seam",
  },
  options: {
    monthlyStatic: "Monthly statistics",
@@ -231,18 +268,27 @@
    selectDateRange: "Select interval",
    requireTraceID: "Require track ID",
    itemNumber: "Item number",
    pipelineOrderRequire:"Pipeline order requirements",
    gasHolderOrderRequire:"Gas cabinet order demand",
    pipelinePredictionDemand:"Pipeline prediction demand",
    gasHolderForecastDemand:"Gas holder forecast demand"
  },
  upload: {
    prevText: "Drag the file here, or",
    uploadPartWorkOrderData: "Upload part work order data",
    uploadSheetMetalPlanData: "Upload sheet metal plan data",
    uploadGasPipelineData: "Upload gas pipeline plan data",
    uploadWeldSeamData: "Upload welding work order data",
    info: "Upload an Excel file containing part work order information. The system will parse the data and save it locally for association with the part plan.",
    weldSeamInfo:
      "Upload an Excel file containing weld work order information. The system will parse the data and save it locally for association with the weld seam plan.",
    uploadText: " Click to upload",
    fileTypeImport:
      "Only xls and xlsx format files are allowed to be imported.",
    dataPreview: "Data Preview",
    totalUpload: "Upload",
    itemUpload: "part work order data in total",
    itemWeldSeamUpload:"weld seam work order data",
    confirmUpload: "Confirm upload",
    cancel: "Cancel",
    errorResult: "Import results",
@@ -250,6 +296,8 @@
      "The part work order data has been successfully uploaded and parsed",
    uploadParseGasPipelineData:
      "The gas pipeline plan data has been successfully uploaded and parsed",
    uploadParseWeldSeamData:"The weld work order data has been successfully parsed",
    uploadErrorParseWeldSeamData:"Failed to parse weld work order data"
  },
  table: {
    mainPartNumber: "Main part number",
@@ -271,11 +319,36 @@
    planworkOrderTime: "Work order plan issuance time",
    planEndDay: "System completion time",
    seq: "Serial Number",
    year:"Year",
    month:"Month",
    piping:"Piping",
    gasHolder:"Gas holder",
    forecastDemand:"Forecast demand",
    reserveOrderOutput:"Reserve emergency order output",
    calTotal:"Total",
    requirementDayWeldSeam:"Requirement day weld seam",
    productionDayWeldSeam:"Production day weld seam",
    customerDrawingNumber:"Customer drawing number",
    organizationalAccount:"Organizational account",
    isRequirements:"Is requirements",
    materialCode:"material code",
    classification:"Classification(Gas holder/pipeline)",
    productionYear:"Production year",
    productionMonth:"Production Month",
    generateQuantity:"Generate quantity",
    mainWorkOrderNumber:"Main work order number",
    superiorWorkOrderNumber:"Superior work order number",
    masterPlanner: "Master scheduler",
    weekDay: "Sunday",
    weekCycle: "Week cycle",
    mainPartDrawingNumber: "Main component drawing number",
    customer: "Customer Name",
    singleWeldSeam:"Single piece weld seam",
    totalWeldSeam:"Total weld seam",
    dateFeedback:"Date of this feedback",
    materialRequirementDate:"Material requirement date",
    salesOrder:"Sales Order No",
    salesOrderLine:"Sales order line",
    goodProductsQuantity: "Quantity of good products",
    processNumber: "Process number",
    factoryCenter: "Work center",
@@ -332,6 +405,7 @@
    requirementDate:"Requirement Date",
    applicableFactories:"Applicable Factories",
    productionBase:"Production Base",
    orderRequirements:"Order requirements",
    // 钣金冗余工单报表
    subItemPartNumber:"Sub Item Part Number",
    mismatchedProductionQuantity:"Mismatched Production Quantity",
src/views/mainPlan/weldSeam/index.vue
@@ -1,15 +1,15 @@
<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"
        <el-button
          type="info"
          plain
          icon="Upload"
          @click="handleImport"
          v-hasPermi="['weldSeam:weldSeam:importData']"
          >{{ $t("common.common.import") }}</el-button>
          >{{ $t("common.common.import") }}</el-button
        >
      </el-col>
      <el-col :span="1.5">
        <el-button
@@ -18,64 +18,99 @@
          icon="Download"
          @click="handleExport"
          v-hasPermi="['weldSeam:weldSeam:export']"
        >{{ $t("common.common.export") }}</el-button>
          >{{ $t("common.common.export") }}</el-button
        >
      </el-col>
      <right-toolbar :search="false" @queryTable="getList"></right-toolbar>
    </el-row>
    <HxlhTable
        style="width: 100%"
        :columns="columns"
        :data="dataList"
        :loading="loading"
        :height="height"
        @on-checkbox="handleCheckboxChange"
      style="width: 100%"
      :columns="columns"
      :data="dataList"
      :loading="loading"
      :height="height"
      @on-checkbox="handleCheckboxChange"
    >
      <template #buttons="{row}">
        <vxe-button mode="text" @click="viewEvent(row)">{{ $t("common.common.edit") }}</vxe-button>
      <template #buttons="{ row }">
        <vxe-button mode="text" @click="viewEvent(row)">{{
          $t("common.common.edit")
        }}</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-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文件,包含焊缝工单信息。系统将解析数据并保存到本地,用于关联到焊缝计划中。</p>
          <div style="border-bottom: 1px solid #ccc">
            <p>{{ $t("plan.upload.weldSeamInfo") }}</p>
          </div>
        </el-col>
        <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-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>
            <div class="el-upload__text">
              {{ $t("plan.upload.prevText")
              }}<em>{{ $t("plan.upload.uploadText") }}</em>
            </div>
            <template #tip>
              <div class="el-upload__tip">
                <span>仅允许导入xls、xlsx格式文件。</span>
                <span>{{ $t("plan.upload.fileTypeImport") }}</span>
              </div>
            </template>
          </el-upload>
        </el-col>
      </el-row>
      <el-row>
        <el-col style="margin-top: 20px;">
        <el-col style="margin-top: 20px">
          <div v-show="isVisible">
            <el-alert icon="Check" :show-icon="true" title="焊缝工单数据已成功解析" type="success" :closable="false"/>
            <el-alert
              icon="Check"
              :show-icon="true"
              :title="$t('plan.upload.uploadParseWeldSeamData')"
              type="success"
              :closable="false"
            />
          </div>
          <div v-show="isError">
            <el-alert icon="Close" :show-icon="true" title="焊缝工单数据已解析失败" type="error" :closable="false"/>
            <el-alert
              icon="Close"
              :show-icon="true"
              :title="$t('plan.upload.uploadErrorParseWeldSeamData')"
              type="error"
              :closable="false"
            />
          </div>
        </el-col>
      </el-row>
      <el-row v-show="isVisible">
        <el-col>
          <div>
            <h2>数据预览</h2>
            <h2>{{ $t("plan.upload.dataPreview") }}</h2>
          </div>
          <HxlhTable
            style="width: 100%"
@@ -87,67 +122,109 @@
          </HxlhTable>
        </el-col>
        <el-col>
          <div style="text-align: right;">
            <h4>共上传<span style="color: blue;">{{ total }}</span>条焊缝工单数据</h4>
          <div style="text-align: right">
            <h4>
              {{ $t("plan.upload.totalUpload")
              }}<span style="color: blue">{{ total }}</span
              >{{ $t("plan.upload.itemWeldSeamUpload") }}
            </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:confirmWeldSeam']"
            >确认上传</el-button>
          <el-button @click="dialogCancel">取 消</el-button>
            type="success"
            plain
            icon="Check"
            :disabled="planned"
            @click="uploadParse"
            v-hasPermi="['weldSeam:weldSeam:confirmWeldSeam']"
            >{{ $t("plan.upload.confirmUpload") }}</el-button
          >
          <el-button @click="dialogCancel">{{
            $t("plan.upload.cancel")
          }}</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
        ref="weldSeamRef"
        :model="form"
        :rules="rules"
        :label-width="locale === 'zh' ? '150px' : '230px'"
      >
        <el-form-item :label="$t('plan.table.year')" 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 :label="$t('plan.table.month')" 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 :label="$t('plan.table.productionBase')" 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 :label="$t('plan.query.pipelineOrderRequire')" 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 :label="$t('plan.query.gasHolderOrderRequire')" 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 :label="$t('plan.query.pipelinePredictionDemand')" 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 :label="$t('plan.query.gasHolderForecastDemand')" 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="请输预留紧急订单产出" style="width: 100%;"/>
        <el-form-item
          label="预留紧急订单产出"
          prop="reserveEmergencyOrderOutput"
        >
          <el-input-number
            :min="0"
            v-model="form.reserveEmergencyOrderOutput"
            placeholder="请输预留紧急订单产出"
            style="width: 100%"
          />
        </el-form-item>
        <el-form-item label="合计" prop="total">
          <el-input v-model="form.total" :disabled="isDisabled"/>
          <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="请输入天数" style="width: 100%;"/>
          <el-input-number
            :min="0"
            v-model="form.days"
            placeholder="请输入天数"
            style="width: 100%"
          />
        </el-form-item>
        <el-form-item label="需求日焊缝" prop="requirementDayWeldSeam">
          <el-input v-model="form.requirementDayWeldSeam" :disabled="isDisabled"/>
          <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="请输生产日焊缝" style="width: 100%;"/>
          <el-input-number
            :min="0"
            v-model="form.productionDayWeldSeam"
            placeholder="请输生产日焊缝"
            style="width: 100%"
          />
        </el-form-item>
        <el-form-item label="是否满足" prop="isSatisfy">
          <el-input v-model="form.isSatisfy" :disabled="isDisabled"/>
          <el-input v-model="form.isSatisfy" :disabled="isDisabled" />
        </el-form-item>
      </el-form>
      <template #footer>
@@ -161,12 +238,22 @@
</template>
<script setup name="WeldSeam">
import { listWeldSeam, getWeldSeam, delWeldSeam, addWeldSeam, updateWeldSeam ,examplePlan ,confirmWeldSeam ,query} from "@/api/mainPlan/weldSeam/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 HxlhTable from "@/components/HxlhTable";
import { ref } from "vue";
import * as XLSX from 'xlsx';
import * as XLSX from "xlsx";
import { useI18n } from "vue-i18n"; //要在js中使用国际化
const { t, locale } = useI18n();
const { proxy } = getCurrentInstance();
const open = ref(false);
@@ -181,7 +268,7 @@
const isVisible = ref(false);
const isError = ref(false);
const planned = ref(true);
const height = ref(document.documentElement.clientHeight - 170 + "px;")
const height = ref(document.documentElement.clientHeight - 170 + "px;");
const exampleHeight = ref("500px");
const uploadRef = ref();
const exampleList = ref([]);
@@ -190,7 +277,11 @@
const isDisabled = ref(true);
const headers = ref([]);
const exportData = ref([]);
// 表格配置
const columns = ref([]);
// 表格配置
const exampleColumns = ref([]);
/** 导入参数 */
const upload = reactive({
  // 是否显示弹出层(用户导入)
@@ -202,200 +293,13 @@
  // 是否更新已经存在的用户数据
  updateSupport: 0,
  // 设置上传的请求头部
  headers: { Authorization: "Bearer " + getToken() ,local: import.meta.env.VITE_APP_LOCAL },
  headers: {
    Authorization: "Bearer " + getToken(),
    local: import.meta.env.VITE_APP_LOCAL,
  },
  // 上传的地址
  url: import.meta.env.VITE_APP_BASE_API + "/aps/weldSeam/importData"
  url: import.meta.env.VITE_APP_BASE_API + "/aps/weldSeam/importData",
});
// 表格配置
const columns = ref([
  { type: 'seq', title: '序号', width: 60, fixed: 'left' },
  {
    title: '年份',
    field: 'year',
    width: 100,
    fixed: 'left'
  },
  {
    title: '月份',
    field: 'month',
    width: 80,
    fixed: 'left'
  },
  {
    title: '生产基地',
    field: 'productionBaseStr',
    width: 150,
    fixed: 'left',
    type: 'html'
  },
  {
    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: 'isSatisfyStr',
    width: 150,
    type: 'html'
  },
  { title: '操作', width: 100, fixed:"right", slots: { default: 'buttons' } }
]);
// 表格配置
const exampleColumns = ref([
  { type: 'seq', title: '序号', width: 60 },
  {
    title: '工单类型',
    field: 'workOrderType',
    width: 80,
  },
  /* {
    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: 160,
  },
  {
    title: '客户图号',
    field: 'customerDrawingNumber',
    width: 100,
  },
  {
    title: '组织账号',
    field: 'organizeNumber',
    width: 200,
  },
  {
    title: '生产基地',
    field: 'productionBase',
    width: 100,
  },
  {
    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: 180,
  },
  {
    title: '上级工单号',
    field: 'superiorWorkOrderNo',
    width: 180,
  },
  {
    title: '工单号',
    field: 'workOrderNo',
    width: 180,
  },
]);
const data = reactive({
  form: {},
  queryParams: {
@@ -421,42 +325,238 @@
    superiorWorkOrderNo: null,
    workOrderNo: null,
    plant: null,
    batchNumber: null
    batchNumber: null,
  },
  rules: {
    reserveEmergencyOrderOutput: [
      {
        required: true,
        message: '请输入预留紧急订单产出',
        trigger: 'blur',
        message: "请输入预留紧急订单产出",
        trigger: "blur",
      },
    ],
    days: [
      {
        required: true,
        message: '请输入天数',
        trigger: 'blur',
        message: "请输入天数",
        trigger: "blur",
      },
    ],
    productionDayWeldSeam: [
      {
        required: true,
        message: '请输入预留紧急订单产出',
        trigger: 'blur',
        message: "请输入预留紧急订单产出",
        trigger: "blur",
      },
    ],
  }
  },
});
const { queryParams, form, rules } = toRefs(data);
watch(
  locale,
  (newLocale) => {
    columns.value = [
      { type: "seq", title: t("plan.table.seq"), width: 60, fixed: "left" },
      {
        title: t("plan.table.year"),
        field: "year",
        width: 100,
        fixed: "left",
      },
      {
        title: t("plan.table.month"),
        field: "month",
        width: 80,
        fixed: "left",
      },
      {
        title: t("plan.table.productionBase"),
        field: "productionBaseStr",
        width: 150,
        fixed: "left",
        type: "html",
      },
      {
        title: t("plan.table.orderRequirements"),
        field: "order",
        children: [
          {
            field: "pipingOrderRequirement",
            title: t("plan.table.piping"),
            width: 140,
          },
          {
            field: "gasOrderRequirement",
            title: t("plan.table.gasHolder"),
            width: 120,
          },
        ],
        width: 150,
      },
      {
        title: t("plan.table.forecastDemand"),
        field: "info",
        children: [
          {
            field: "pipingPredictionRequirement",
            title: t("plan.table.piping"),
            width: 140,
          },
          {
            field: "gasPredictionRequirement",
            title: t("plan.table.gasHolder"),
            width: 120,
          },
        ],
        width: 150,
      },
      {
        title: t("plan.table.reserveOrderOutput"),
        field: "reserveEmergencyOrderOutput",
        width: 150,
      },
      {
        title: t("plan.table.calTotal"),
        field: "total",
        width: 150,
      },
      {
        title: t("plan.table.days"),
        field: "days",
        width: 150,
      },
      {
        title: t("plan.table.requirementDayWeldSeam"),
        field: "requirementDayWeldSeam",
        width: 100,
      },
      {
        title: t("plan.table.productionDayWeldSeam"),
        field: "productionDayWeldSeam",
        width: 150,
      },
      {
        title: t("plan.table.isRequirements"),
        field: "isSatisfyStr",
        width: 150,
        type: "html",
      },
      {
        title: t("common.common.operate"),
        width: 100,
        fixed: "right",
        slots: { default: "buttons" },
      },
    ];
    exampleColumns.value = [
      { type: "seq", title: t("plan.table.seq"), width: 60 },
      {
        title: t("basic.table.workOrderType"),
        field: "workOrderType",
        width: 80,
      },
      {
        title: t("plan.table.materialCode"),
        field: "materialCode",
        width: 160,
      },
      {
        title: t("plan.table.customerDrawingNumber"),
        field: "customerDrawingNumber",
        width: 100,
      },
      {
        title: t("plan.table.organizationalAccount"),
        field: "organizeNumber",
        width: 200,
      },
      {
        title: t("plan.table.productionBase"),
        field: "productionBase",
        width: 100,
      },
      {
        title: t("plan.table.classification"),
        field: "classification",
        width: 150,
      },
      {
        title: t("plan.table.productionYear"),
        field: "produceYear",
        width: 150,
      },
      {
        title: t("plan.table.productionMonth"),
        field: "produceMonth",
        width: 150,
      },
      {
        title: t("plan.table.generateQuantity"),
        field: "productionQuantity",
        width: 100,
      },
      {
        title: t("plan.table.customer"),
        field: "customer",
        width: 150,
      },
      {
        title: t("plan.table.singleWeldSeam"),
        field: "singleWeldSeam",
        width: 150,
      },
      {
        title: t("plan.table.totalWeldSeam"),
        field: "totalWeldSeam",
        width: 100,
      },
      {
        title: t("plan.table.dateFeedback"),
        field: "thisFeedbackDay",
        width: 100,
      },
      {
        title: t("plan.table.materialRequirementDate"),
        field: "materialsRequirementDay",
        width: 100,
      },
      {
        title: t("plan.table.salesOrder"),
        field: "saleOrderNo",
        width: 150,
      },
      {
        title: t("plan.table.salesOrderLine"),
        field: "saleOrderLine",
        width: 150,
      },
      {
        title: t("plan.table.mainWorkOrderNumber"),
        field: "mainWorkOrderNo",
        width: 180,
      },
      {
        title: t("plan.table.superiorWorkOrderNumber"),
        field: "superiorWorkOrderNo",
        width: 180,
      },
      {
        title: t("plan.table.workOrderNo"),
        field: "workOrderNo",
        width: 180,
      },
    ];
  },
  { immediate: true, deep: true }
);
/** 查询焊缝列表 */
function getList() {
  loading.value = true;
  query(queryParams.value).then(response => {
  query(queryParams.value).then((response) => {
    let responseData = response.rows;
    // exportData.value = response.rows;
    responseData.forEach(item=>{
    responseData.forEach((item) => {
      let data = [];
      data.push(item.year);
      data.push(item.month);
@@ -472,10 +572,16 @@
      data.push(item.productionDayWeldSeam);
      data.push(item.isSatisfy);
      item.productionBaseStr = item.isSatisfy === '否' ? `<div class='el-badge'><sup class="el-badge__content is-fixed is-dot" style="right: 2px; top: 2px;"></sup>${item.productionBase}</div>` : item.productionBase
      item.isSatisfyStr = item.isSatisfy === '否' ? `<font color='red'>${item.isSatisfy}</font>` : item.isSatisfy
      item.productionBaseStr =
        item.isSatisfy === "否"
          ? `<div class='el-badge'><sup class="el-badge__content is-fixed is-dot" style="right: 2px; top: 2px;"></sup>${item.productionBase}</div>`
          : item.productionBase;
      item.isSatisfyStr =
        item.isSatisfy === "否"
          ? `<font color='red'>${item.isSatisfy}</font>`
          : item.isSatisfy;
      exportData.value.push(data);
    })
    });
    dataList.value = responseData;
    loading.value = false;
  });
@@ -509,7 +615,7 @@
    mainWorkOrderNo: null,
    superiorWorkOrderNo: null,
    workOrderNo: null,
    plant: null
    plant: null,
  };
  proxy.resetForm("weldSeamRef");
}
@@ -530,41 +636,41 @@
// 多选框选中数据
function handleSelectionChange(selection) {
  ids.value = selection.map(item => item.id);
  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 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 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 => {
  proxy.$refs["weldSeamRef"].validate((valid) => {
    if (valid) {
      if (form.value.id != null) {
        updateWeldSeam(form.value).then(response => {
        updateWeldSeam(form.value).then((response) => {
          proxy.$modal.msgSuccess("修改成功");
          open.value = false;
          getList();
        });
      } else {
        addWeldSeam(form.value).then(response => {
        addWeldSeam(form.value).then((response) => {
          proxy.$modal.msgSuccess("新增成功");
          open.value = false;
          getList();
@@ -577,27 +683,61 @@
/** 删除按钮操作 */
function handleDelete(row) {
  const _ids = row.id || ids.value;
  proxy.$modal.confirm('是否确认删除焊缝编号为"' + _ids + '"的数据项?').then(function() {
    return delWeldSeam(_ids);
  }).then(() => {
    getList();
    proxy.$modal.msgSuccess("删除成功");
  }).catch(() => {});
  proxy.$modal
    .confirm('是否确认删除焊缝编号为"' + _ids + '"的数据项?')
    .then(function () {
      return delWeldSeam(_ids);
    })
    .then(() => {
      getList();
      proxy.$modal.msgSuccess("删除成功");
    })
    .catch(() => {});
}
/** 导入按钮操作 */
function handleImport() {
  upload.title = "焊缝工单数据上传";
  upload.title = t("plan.upload.uploadWeldSeamData");
  upload.open = true;
};
}
/** 导出按钮操作 */
function handleExport() {
  const headersOne = ["年份","月份","生产基地","订单需求","","预测需求","","预留紧急订单产出","合计","天数","需求日焊缝","生产日焊缝","是否满足"]
  const headersTwo = ["","","","管路","气柜","管路","气柜","","","","","",""]
  const headersOne = [
    "年份",
    "月份",
    "生产基地",
    "订单需求",
    "",
    "预测需求",
    "",
    "预留紧急订单产出",
    "合计",
    "天数",
    "需求日焊缝",
    "生产日焊缝",
    "是否满足",
    "分类"
  ];
  const headersTwo = [
    "",
    "",
    "",
    "管路",
    "气柜",
    "管路",
    "气柜",
    "",
    "",
    "",
    "",
    "",
    "",
    "",
  ];
  headers.value.push(headersOne);
  headers.value.push(headersTwo);
  // 合并表头和数据
  const finalData = [...headers.value, ...exportData.value];
@@ -605,7 +745,7 @@
  const ws = XLSX.utils.aoa_to_sheet(finalData);
  // 合并单元格(如果需要)
  ws['!merges'] = [
  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 } },
@@ -622,28 +762,30 @@
  // 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;
            }
        }
  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.utils.book_append_sheet(wb, ws, "Sheet1");
  // 导出文件
  XLSX.writeFile(wb, `apsPartRouteStat_${new Date().getTime()}.xlsx`);
  XLSX.writeFile(wb, `welSeam_${new Date().getTime()}.xlsx`);
}
/** dialog取消 */
function dialogCancel(){
function dialogCancel() {
  if (uploadRef.value) {
    uploadRef.value.clearFiles();
  }
@@ -661,15 +803,24 @@
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
  if(response.code == '200'){
  if (response.code == "200") {
    batchNumber.value = response.data;
    isVisible.value = true;
    planned.value = false;
    isError.value = false;
    getExampleList();
  }else{
  } 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.$alert(
      "<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" +
        response.msg +
        "</div>",
      t("plan.upload.errorResult"),
      { dangerouslyUseHTMLString: true,
        confirmButtonText: t("plan.btns.confirm"),
        cancelButtonText: t("plan.btns.cancel"),
       }
    );
  }
  proxy.$refs["uploadRef"].handleRemove(file);
  upload.isUploading = false;
@@ -679,7 +830,7 @@
function uploadParse() {
  queryParams.value.params = {};
  queryParams.value.params["batchNumber"] = batchNumber.value;
  confirmWeldSeam(queryParams.value).then(response => {
  confirmWeldSeam(queryParams.value).then((response) => {
    exampleList.value = response.rows;
    loading.value = false;
    isVisible.value = false;
@@ -688,9 +839,9 @@
    upload.open = false;
    getList();
    ElMessage({
      message: '焊缝工单数据已成功上传和解析',
      type: 'success',
    })
      message: `${t("plan.title.metalWeldWork")}${t("plan.title.parseUpload")}`,
      type: "success",
    });
  });
}
@@ -699,17 +850,17 @@
  loading.value = true;
  queryParams.value = {};
  queryParams.value.batchNumber = batchNumber.value;
  examplePlan(queryParams.value).then(response => {
  examplePlan(queryParams.value).then((response) => {
    exampleList.value = response.rows;
    total.value = response.total;
    loading.value = false;
  });
}
function viewEvent(row){
function viewEvent(row) {
  open.value = true;
  title.value = "修改焊缝";
  form.value = {...row};
  title.value = `${t("common.common.modify")} ${t("plan.title.weld")}`;
  form.value = { ...row };
}
getList();