| | |
| | | # 配合后端服务 |
| | | # VITE_APP_LOCAL = 'int' |
| | | # VITE_APP_LOCAL = 'zhl' |
| | | VITE_APP_LOCAL = 'sfd' |
| | | VITE_APP_LOCAL = 'hjy' |
| | |
| | | operate:"操作", |
| | | batchUpdate:"批量更新", |
| | | close:"关闭", |
| | | require:"需求" |
| | | require:"需求", |
| | | modify:"修改" |
| | | }, |
| | | }; |
| | | export const en = { |
| | |
| | | operate:"Operate", |
| | | batchUpdate:"Batch update", |
| | | close:"Close", |
| | | require:"Require" |
| | | require:"Require", |
| | | modify:"Modify" |
| | | }, |
| | | }; |
| | |
| | | viewAssociatedRequirements:"查看关联需求", |
| | | setMode:"设置模式", |
| | | CustomizePlannedCompletionDate:"自定义计划完工日", |
| | | tipsBugSheetMetal:"将生成的钣金需求的计划开工日和计划完工日赋值给工单" |
| | | tipsBugSheetMetal:"将生成的钣金需求的计划开工日和计划完工日赋值给工单", |
| | | metalWeldWork:"焊缝工单数据", |
| | | parseUpload:"已成功上传和解析", |
| | | weld:"焊缝" |
| | | }, |
| | | options: { |
| | | monthlyStatic: "按月统计", |
| | |
| | | selectDateRange: "选择区间", |
| | | requireTraceID: "需求追溯ID", |
| | | itemNumber: "料号", |
| | | |
| | | pipelineOrderRequire:"管路订单需求", |
| | | gasHolderOrderRequire:"气柜订单需求", |
| | | pipelinePredictionDemand:"管路预测需求", |
| | | gasHolderForecastDemand:"气柜预测需求", |
| | | }, |
| | | upload: { |
| | | prevText: "将文件拖到此处,或", |
| | | uploadPartWorkOrderData: "零件工单数据上传", |
| | | uploadSheetMetalPlanData: "钣金计划数据上传", |
| | | uploadGasPipelineData: "气体管路计划数据上传", |
| | | uploadWeldSeamData: "焊缝工单数据上传", |
| | | info: "上传Excel文件,包含零件工单信息。系统将解析数据并保存到本地,用于关联到零件计划中。", |
| | | weldSeamInfo: |
| | | "上传Excel文件,包含焊缝工单信息。系统将解析数据并保存到本地,用于关联到焊缝计划中。", |
| | |
| | | dataPreview: "数据预览", |
| | | totalUpload: "共上传", |
| | | itemUpload: "条零件工单数据", |
| | | itemWeldSeamUpload:"条焊缝工单数据", |
| | | confirmUpload: "确认上传", |
| | | cancel: "取 消", |
| | | errorResult: "导入结果", |
| | | uploadParsePartWorkOrderData: "零件工单数据已成功上传和解析", |
| | | uploadParseGasPipelineData: "气体管路计划数据已成功上传和解析", |
| | | uploadParseWeldSeamData:"焊缝工单数据已成功解析", |
| | | uploadErrorParseWeldSeamData:"焊缝工单数据已解析失败" |
| | | }, |
| | | table: { |
| | | mainPartNumber: "主件料号", |
| | |
| | | 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: "工作中心", |
| | |
| | | dayProduceUnit: "日产出单位", |
| | | personnelNumber: "人员数量", |
| | | dayProduceAllNum: "日产出总数量", |
| | | days: "天数", |
| | | monthProduceAllNum: "月产出数量", |
| | | remark: "备注", |
| | | // 钣金供应缺口报表 |
| | |
| | | requirementDate:"需求日期", |
| | | applicableFactories:"适用工厂", |
| | | productionBase:"生产基地", |
| | | orderRequirements:"订单需求", |
| | | // 钣金冗余工单报表 |
| | | subItemPartNumber:"子件料号", |
| | | mismatchedProductionQuantity:"未匹配生产数量", |
| | |
| | | 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", |
| | |
| | | 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", |
| | |
| | | "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", |
| | |
| | | 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", |
| | |
| | | requirementDate:"Requirement Date", |
| | | applicableFactories:"Applicable Factories", |
| | | productionBase:"Production Base", |
| | | orderRequirements:"Order requirements", |
| | | // 钣金冗余工单报表 |
| | | subItemPartNumber:"Sub Item Part Number", |
| | | mismatchedProductionQuantity:"Mismatched Production Quantity", |
| | |
| | | <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 |
| | |
| | | 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%" |
| | |
| | | </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> |
| | |
| | | </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); |
| | |
| | | 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([]); |
| | |
| | | const isDisabled = ref(true); |
| | | const headers = ref([]); |
| | | const exportData = ref([]); |
| | | // 表格配置 |
| | | const columns = ref([]); |
| | | |
| | | // 表格配置 |
| | | const exampleColumns = ref([]); |
| | | /** 导入参数 */ |
| | | const upload = reactive({ |
| | | // 是否显示弹出层(用户导入) |
| | |
| | | // 是否更新已经存在的用户数据 |
| | | 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: { |
| | |
| | | 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); |
| | |
| | | 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; |
| | | }); |
| | |
| | | mainWorkOrderNo: null, |
| | | superiorWorkOrderNo: null, |
| | | workOrderNo: null, |
| | | plant: null |
| | | plant: null, |
| | | }; |
| | | proxy.resetForm("weldSeamRef"); |
| | | } |
| | |
| | | |
| | | // 多选框选中数据 |
| | | 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(); |
| | |
| | | /** 删除按钮操作 */ |
| | | 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]; |
| | | |
| | |
| | | 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 } }, |
| | |
| | | // 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(); |
| | | } |
| | |
| | | |
| | | /** 文件上传成功处理 */ |
| | | 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; |
| | |
| | | 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; |
| | |
| | | upload.open = false; |
| | | getList(); |
| | | ElMessage({ |
| | | message: '焊缝工单数据已成功上传和解析', |
| | | type: 'success', |
| | | }) |
| | | message: `${t("plan.title.metalWeldWork")}${t("plan.title.parseUpload")}`, |
| | | type: "success", |
| | | }); |
| | | }); |
| | | } |
| | | |
| | |
| | | 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(); |