|
|
@@ -1,8952 +1,9210 @@
|
|
|
-<template>
|
|
|
- <div>
|
|
|
- <layout>
|
|
|
- <layout-header>
|
|
|
- <div class="">
|
|
|
- <!--按钮部分-->
|
|
|
- <el-form ref="elSearchFormRef" class="demo-form-inline" @submit.prevent="onSubmit">
|
|
|
- <el-form-item>
|
|
|
- <el-input v-model="searchInfo" placeholder="查询订单编号、生产款号" style="width: 180px;" @keydown.enter.prevent="onSubmit" />
|
|
|
- <el-button type="primary" native-type="button" icon="search" @click="onSubmit" title="查询">查询</el-button>
|
|
|
- <el-button type="primary" icon="edit" @click="cp_gdprintonClick" class="bt" title="打印生产订单" >订单打印</el-button>
|
|
|
- <el-button type="primary" class="bt" icon="edit" @click="jsfjClick">附件上传</el-button>
|
|
|
- <el-button type="primary" icon="edit" @click="addgd_onclick" class="bt" title="新增工单资料">新增订单资料</el-button>
|
|
|
- <el-button type="primary" icon="edit" @click="addgdyj_onclick" class="bt" title="新增颜色资料">新增颜色资料</el-button>
|
|
|
- <!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openPartAdd">新增部件资料</el-button> -->
|
|
|
- <!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openProcessAdd">新增工艺资料</el-button> -->
|
|
|
- <!-- <el-button type="primary" icon="Sort" class="bt" :disabled="!_Gd_gdbh" @click="openSortDialog">部件与工艺排序</el-button> -->
|
|
|
- <el-button type="primary" icon="edit" @click="BOMclick" class="bt" title="BOM面料">批量修改新增BOM资料</el-button>
|
|
|
- <el-button type="danger" icon="edit" @click="del_ddzlClick" v-if="table_del=== true" :disabled="table_Selection === ''" class="bt" title="选中复选框进行删除订单数据">删除订单资料</el-button>
|
|
|
- <el-button type="danger" icon="edit" @click="delgd_delclick" v-if="delall=== true" :disabled="ysSelection === ''" class="bt" title="选中复选框进行删除颜色数据">删除颜色资料</el-button>
|
|
|
- <!-- <el-button type="danger" icon="edit" @click="delgy_delclick" v-if="delall=== true" :disabled="gySelection === ''" class="bt" title="选中复选框进行删除工艺数据">删除工艺资料</el-button> -->
|
|
|
- <el-button type="primary" icon="edit" @click="copyProductData" :disabled="!_Gd_gdbh" class="bt" title="复制订单工艺">复制订单工艺</el-button>
|
|
|
- <el-button type="primary" icon="upload" @click="openImportProcessDialog" :disabled="!_Gd_gdbh" class="bt" title="导入工艺资料">导入工艺资料</el-button>
|
|
|
- <el-button type="primary" icon="search" :loading="processProductionChecking" @click="openProcessProductionDialog" :disabled="!_Gd_gdbh" class="bt" title="工序产量核查">工序产量核查</el-button>
|
|
|
-
|
|
|
- <!-- <el-button type="primary" icon="edit" @click="delbom_delclick" v-if="del_bom=== true" :disabled="bom_Selection === '' " class="bt" title="选中复选框进行删除bom数据">删除bom资料</el-button> -->
|
|
|
-
|
|
|
- <!-- <el-button type="primary" icon="edit" @click="CSclick" class="bt" title="库存测试">库存测试</el-button> -->
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </div>
|
|
|
- </layout-header>
|
|
|
- <layout>
|
|
|
-
|
|
|
- <!-- 左侧树形结构 -->
|
|
|
- <layout-sider :resize-directions="['right']" :width="190" style="margin: 0px;">
|
|
|
- <div class="JKWTree-tree" style="height: 200px">
|
|
|
- <h3>客户编号</h3>
|
|
|
- <el-tree :data="treeData" class="treecolor" @node-click="handleNodeClick"></el-tree>
|
|
|
- </div>
|
|
|
- </layout-sider>
|
|
|
-
|
|
|
- <!-- 右侧内容区域 -->
|
|
|
- <layout-content >
|
|
|
- <el-main>
|
|
|
- <!-- 订单表格列表 -->
|
|
|
- <div class="gva-table-box">
|
|
|
- <el-table ref="multipleTable" style="width: 100%;height: 28vh"
|
|
|
- :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
- border tooltip-effect="dark"
|
|
|
- v-loading="loading"
|
|
|
- element-loading-text="拼命加载中"
|
|
|
- element-loading-spinner="el-icon-loading"
|
|
|
- element-loading-background="rgba(0, 0, 0, 0.8)"
|
|
|
- :data="tableData" :row-key="ddzlTableRowKey"
|
|
|
- highlight-current-row="true"
|
|
|
- :cell-class-name="tableDataCellClass"
|
|
|
- @row-click="tableRowClick" @row-dblclick="updateCompanyFunc"
|
|
|
- @selection-change="ddzlSelectionChange" :show-overflow-tooltip="true">
|
|
|
- <el-table-column align="center" type="selection" width="40"/>
|
|
|
- <el-table-column align="center" prop="status" width="75">
|
|
|
- <template #header>
|
|
|
- <el-tooltip
|
|
|
- content='「技术附件」列显示 “*” 表示该订单尚未上传对应附件'
|
|
|
- placement="top"
|
|
|
- effect="dark"
|
|
|
- >
|
|
|
- <span class="fj-col-header">
|
|
|
- 附件
|
|
|
- <el-icon class="fj-col-help"><QuestionFilled /></el-icon>
|
|
|
- </span>
|
|
|
- </el-tooltip>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column align="left" label="订单编号" prop="订单编号" width="105" sortable/>
|
|
|
- <el-table-column align="left" label="客户" prop="客户编号" width="68" />
|
|
|
- <el-table-column align="left" label="款号" prop="生产款号" width="200" />
|
|
|
- <el-table-column align="left" label="款式" prop="款式" width="100"/>
|
|
|
- <el-table-column align="left" label="数量" prop="订单数量" width="70" />
|
|
|
- <el-table-column align="center" label="状态" prop="gd_statu" width="125" sortable>
|
|
|
- <template #default="{ row }">
|
|
|
- <el-tag :type="row.gd_statu === '1-计划中' ? 'warning' :
|
|
|
- (row.gd_statu === '已裁剪' ? 'primary' :
|
|
|
- (row.gd_statu === '已车缝' ? '' :
|
|
|
- (row.gd_statu === '2-生产中' ? 'success' :
|
|
|
- (row.gd_statu.includes('总检已') ?
|
|
|
- (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? 'success' : 'info') :
|
|
|
- (row.gd_statu === '已完工' ? 'success' : 'info')))))">
|
|
|
- {{ row.gd_statu === '1-计划中' ? '计划中' :
|
|
|
- (row.gd_statu === '已裁剪' ? '已裁剪' :
|
|
|
- (row.gd_statu === '已车缝' ? '已车缝' :
|
|
|
- (row.gd_statu === '2-生产中' ? '生产中' :
|
|
|
- (row.gd_statu.includes('总检已') ?
|
|
|
- (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? '已完工' : row.gd_statu.replace('总检已', '总检')) :
|
|
|
- row.gd_statu)))) }}
|
|
|
- </el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column align="left" label="落货日期" prop="落货日期" width="98" />
|
|
|
- <el-table-column align="left" label="船样" prop="船样合计" width="55" />
|
|
|
- <el-table-column align="left" label="船样描述" prop="船样描述" width="130" />
|
|
|
- <el-table-column align="left" label="单位" prop="单位" width="55" />
|
|
|
- <el-table-column align="left" label="面料" prop="面料" width="180" />
|
|
|
- <el-table-column align="left" label="备注" prop="要求" width="180" />
|
|
|
- <el-table-column align="left" label="计划制造工分" prop="计划制造工分" width="180" />
|
|
|
- <el-table-column align="left" label="粘衬" prop="粘衬" width="180" />
|
|
|
- <el-table-column align="left" label="箱唛要求" prop="箱唛要求" width="180" />
|
|
|
- <el-table-column align="left" label="制单人" prop="Sys_id" width="160" />
|
|
|
- <el-table-column align="left" label="制单日期" prop="Sys_rq" width="160" />
|
|
|
- </el-table>
|
|
|
- <!-- 分页 -->
|
|
|
- <div class="gva-pagination">
|
|
|
- <el-pagination
|
|
|
- @size-change="handleSizeChange"
|
|
|
- @current-change="handleCurrentChange"
|
|
|
- :current-page="page"
|
|
|
- :page-sizes="[10, 30, 50, 100]"
|
|
|
- :page-size="pageSize"
|
|
|
- layout="total, sizes, prev, pager, next, jumper"
|
|
|
- :total="total">
|
|
|
- </el-pagination>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 颜色资料列表、部件资料列表、工艺资料列表、BOM资料列表 -->
|
|
|
- <el-tabs v-model="activeName" @tab-click="handleClick">
|
|
|
- <el-tab-pane label="颜色资料" name="first">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- highlight-current-row="true"
|
|
|
- @row-click="ystableclick"
|
|
|
- @row-dblclick="ysupdateCompanyFunc"
|
|
|
- @selection-change="selectionChange($event, '颜色资料')"
|
|
|
- style="width: 100%;height: 36vh" border show-summary
|
|
|
- :summary-method="getSummaries" tooltip-effect="dark" :data="ystableData" :row-key="ysColorTableRowKey">
|
|
|
- <el-table-column type="selection" width="30" />
|
|
|
- <el-table-column align="left" sortable label="子订单编号" prop="子订单编号" width="140"/>
|
|
|
- <el-table-column align="left" sortable label="PO号 " prop="款号" width="180"/>
|
|
|
- <el-table-column align="left" sortable label="颜色备注" prop="颜色备注" width="110"/>
|
|
|
- <el-table-column align="left" sortable label="色系名称" prop="颜色" width="110"/>
|
|
|
- <el-table-column align="left" sortable label="船样" prop="船样" width="80"/>
|
|
|
- <!-- 尺码列表 -->
|
|
|
- <template v-for="item in sizeDatas">
|
|
|
- <el-table-column align="left" sortable :label=item :prop=item width="80"/>
|
|
|
- </template>
|
|
|
- <el-table-column align="left" sortable label="制单总数" prop="zdtotal" width="110"/>
|
|
|
- <el-table-column align="left" sortable label="创建用户" prop="Sys_id" width="160"/>
|
|
|
- <el-table-column align="left" sortable label="创建日期" prop="Sys_rq" width="160"/>
|
|
|
- <el-table-column align="left" sortable label="修改时间" prop="更新时间" width="160"/>
|
|
|
- </el-table>
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
- <!-- <el-tab-pane label="部件资料" name="part">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '20px' }"
|
|
|
- :cell-style="{ padding: '0px' }"
|
|
|
- :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- highlight-current-row="true"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- size="small"
|
|
|
- @row-click="partTableRowClick"
|
|
|
- @row-dblclick="partRowDblclick"
|
|
|
- @selection-change="selectionChange($event, '部件资料')"
|
|
|
- style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="parttableData" row-key="部件ID">
|
|
|
- <el-table-column type="selection" width="30" />
|
|
|
- <el-table-column align="left" label="部件编号" prop="部件编号" width="80"/>
|
|
|
- <el-table-column align="left" label="部件名称" prop="部件名称" width="150"/>
|
|
|
- <el-table-column align="left" label="部件类型" prop="部件类型" width="120"/>
|
|
|
- <el-table-column align="left" label="部件备注" prop="部件备注" width="150"/>
|
|
|
- <el-table-column align="left" label="录入人" prop="操作人" width="100"/>
|
|
|
- <el-table-column align="left" label="录入时间" prop="操作时间" width="160"/>
|
|
|
- <el-table-column align="left" label="修改人" prop="修改人" width="100"/>
|
|
|
- <el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
|
|
|
- </el-table>
|
|
|
- </el-tab-pane> -->
|
|
|
-
|
|
|
- <el-tab-pane label="工艺资料" name="second">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '20px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- highlight-current-row="true"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- size="small"
|
|
|
- :cell-class-name="gysatusCellClass"
|
|
|
- @row-dblclick="gdgyupdateCompanyFunc"
|
|
|
- @row-click="clickybupdate2"
|
|
|
- :row-class-name="rowClassStyle2"
|
|
|
- @selection-change="selectionChange($event, '工艺资料')"
|
|
|
- style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="gytableData" row-key="id"
|
|
|
- :summary-method="gySummaries"
|
|
|
- show-summary>
|
|
|
- <!-- <el-table-column align="left" label="部件编号" prop="部件编号" width="80"/> -->
|
|
|
- <el-table-column align="center" label="部件名称" prop="部件名称" width="80"/>
|
|
|
- <el-table-column align="center" label="工序编号" prop="工艺编号" width="75"/>
|
|
|
- <el-table-column align="left" label="工序名称" prop="工艺名称" width="200"/>
|
|
|
- <el-table-column align="center" label="生产工序" prop="大工艺" width="75"/>
|
|
|
- <!-- <el-table-column align="left" label="秒" prop="标准工时" width="80"/> -->
|
|
|
- <el-table-column align="center" label="工分" prop="标准公分" width="75"/>
|
|
|
- <el-table-column align="left" label="备注" prop="备注" width="150"/>
|
|
|
- <el-table-column align="center" label="难度系数" prop="系数" width="80"/>
|
|
|
- <el-table-column align="left" label="录入人" prop="系统人" width="100"/>
|
|
|
- <el-table-column align="left" label="录入时间" prop="系统时间" width="160"/>
|
|
|
- <el-table-column align="left" label="修改人" prop="修改人" width="100"/>
|
|
|
- <el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
|
|
|
- </el-table>
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
- <el-tab-pane label="订单资料附件" name="third">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '30px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '30px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- @row-dblclick="gdbomupdateCompanyFunc"
|
|
|
- style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="ddtableData" row-key="ID"
|
|
|
- @selection-change="fjSelectionChange">
|
|
|
- <el-table-column align="left" label="关联编号" prop="关联编号" width="115"/>
|
|
|
- <el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
|
|
|
- <el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
|
|
|
- <el-table-column align="left" label="版本号" prop="version" width="80"/>
|
|
|
- <el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
|
|
|
- <el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
|
|
|
- <!-- 操作列,新增修改和删除按钮 -->
|
|
|
- <el-table-column align="left" label="操作" width="230" fixed="right">
|
|
|
- <template #default="scope">
|
|
|
- <!-- PDF预览按钮 -->
|
|
|
- <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
|
|
|
- <!-- 删除按钮 -->
|
|
|
- <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- <el-tab-pane label="技术附件" name="fourth">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '30px' }"
|
|
|
- :cell-style="{ padding: '0px' }"
|
|
|
- :header-row-style="{ height: '30px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- @row-dblclick="ExcelShow"
|
|
|
- style="width: 100%;height: 36vh"
|
|
|
- border tooltip-effect="dark"
|
|
|
- :data="jstableData"
|
|
|
- row-key="ID"
|
|
|
- @selection-change="fjSelectionChange">
|
|
|
-
|
|
|
- <el-table-column align="left" label="关联编号" prop="关联编号" width="115"/>
|
|
|
- <el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
|
|
|
- <el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
|
|
|
- <el-table-column align="left" label="版本号" prop="version" width="80"/>
|
|
|
- <el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
|
|
|
- <el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
|
|
|
-
|
|
|
- <!-- 操作列,新增修改和删除按钮 -->
|
|
|
- <el-table-column align="left" label="操作" width="230" fixed="right">
|
|
|
- <template #default="scope">
|
|
|
- <!-- PDF预览按钮 -->
|
|
|
- <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
|
|
|
- <!-- 删除按钮 -->
|
|
|
- <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
-
|
|
|
- <el-tab-pane label="发货单附件" name="fourths">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '30px' }"
|
|
|
- :cell-style="{ padding: '0px' }"
|
|
|
- :header-row-style="{ height: '30px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- @row-dblclick="ExcelShow"
|
|
|
- style="width: 100%;height: 36vh"
|
|
|
- border tooltip-effect="dark"
|
|
|
- :data="fhdtableData"
|
|
|
- row-key="ID"
|
|
|
- @selection-change="fhdSelectionChange">
|
|
|
- <el-table-column align="left" label="发货单号" prop="rand_number" width="160"/>
|
|
|
- <el-table-column align="left" label="订单编号" prop="关联编号" width="115"/>
|
|
|
- <el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
|
|
|
- <el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
|
|
|
- <el-table-column align="left" label="版本号" prop="version" width="80"/>
|
|
|
- <el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
|
|
|
- <el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
|
|
|
-
|
|
|
- <!-- 操作列,新增修改和删除按钮 -->
|
|
|
- <el-table-column align="left" label="操作" width="330" fixed="right">
|
|
|
- <template #default="scope">
|
|
|
- <!-- PDF预览按钮 -->
|
|
|
- <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
|
|
|
- <el-button type="primary" size="small" @click="fahuodan(scope.row)">获取发货数量</el-button>
|
|
|
- <!-- 删除按钮 -->
|
|
|
- <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
-
|
|
|
- <el-tab-pane label="BOM资料" name="six">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '20px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- @row-dblclick="bombomupdateCompanyFunc"
|
|
|
- @selection-change="bomSelectionChange"
|
|
|
- style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="bomtableData" row-key="ID">
|
|
|
- <!-- <el-table-column type="selection" width="30" /> -->
|
|
|
- <el-table-column align="left" label="订单编号" prop="订单编号" width="105"/>
|
|
|
- <el-table-column align="left" label="物料分类" prop="物料分类" width="100"/>
|
|
|
- <el-table-column align="left" label="物料名称" prop="物料名称" width="210"/>
|
|
|
- <el-table-column align="left" label="计划入库时间" prop="计划入库时间" width="160" />
|
|
|
- <el-table-column align="left" label="计划用料" prop="计划用料" width="90" />
|
|
|
- <el-table-column align="left" label="计划门幅" prop="计划门幅" width="90"/>
|
|
|
- <el-table-column align="left" label="定额用料" prop="定额用料" width="90"/>
|
|
|
- <el-table-column align="left" label="定额门幅" prop="定额门幅" width="90"/>
|
|
|
- <el-table-column align="left" label="备注" prop="备注" width="240"/>
|
|
|
- <el-table-column align="left" label="更新用户" prop="ID" width="90"/>
|
|
|
- <el-table-column align="left" label="更新日期" prop="日期" width="160"/>
|
|
|
- <!-- <el-table-column align="left" label="UNIQID" prop="UNIQID" width="80"/> -->
|
|
|
- </el-table>
|
|
|
- </el-tab-pane>
|
|
|
-
|
|
|
- <el-tab-pane label="面料库存" name="seven">
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '25px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- @row-dblclick="mlupdateCompanyFunc"
|
|
|
- :summary-method="mlgetSummaries"
|
|
|
- style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="mltableData" row-key="ID" @selection-change="handleSelectionChange">
|
|
|
- <!-- <el-table-column type="selection" width="30" />-->
|
|
|
- <!-- <el-table-column type="selection" width="30" /> -->
|
|
|
- <el-table-column align="left" label="订单编号" prop="订单编号" width="110"/>
|
|
|
- <!-- <el-table-column align="left" label="客户编号" prop="客户编号" width="100"/>
|
|
|
- <el-table-column align="left" label="生产款号" prop="生产款号" width="100"/>
|
|
|
- <el-table-column align="left" label="款式" prop="款式" width="90"/> -->
|
|
|
- <el-table-column align="left" label="颜色" prop="颜色" width="110"/>
|
|
|
- <el-table-column align="left" label="物料编号" prop="物料编码" width="220"/>
|
|
|
- <el-table-column align="left" label="物料名称" prop="物料名称" width="180"/>
|
|
|
- <el-table-column align="left" label="定额用料" prop="定额用料" width="90"/>
|
|
|
- <el-table-column align="left" label="定额门幅" prop="定额门幅" width="90"/>
|
|
|
- <el-table-column align="left" label="入库总量" prop="入仓总量" width="90"/>
|
|
|
- <el-table-column align="left" label="领用数量" prop="领用数量" width="90"/>
|
|
|
- <el-table-column align="left" label="面料结余" prop="库存数量" width="90"/>
|
|
|
- <el-table-column align="left" label="单位" prop="单位" width="60"/>
|
|
|
- <el-table-column align="left" label="备注" prop="备注" width="200"/>
|
|
|
- <el-table-column align="left" label="关联订单" prop="关联订单" width="200"/>
|
|
|
- <el-table-column align="left" label="更新用户" prop="Sys_ID" width="160"/>
|
|
|
- <el-table-column align="left" label="更新日期" prop="Sys_rq" width="160"/>
|
|
|
- </el-table>
|
|
|
- </el-tab-pane>
|
|
|
- </el-tabs>
|
|
|
-
|
|
|
-
|
|
|
- <!-- 工艺资料详情弹窗 -->
|
|
|
- <el-dialog v-model="gyDetailDialogVisible" :before-close="closeGyDetailDialog"
|
|
|
- style="width: 100vw; height: 100vh; margin: 0; padding: 0; top: 0; left: 0;"
|
|
|
- destroy-on-close class="gy-detail-dialog" :show-close="false">
|
|
|
- <template #header>
|
|
|
- <div class="gy-detail-dialog-header">
|
|
|
- <div class="gy-detail-dialog-title-row">
|
|
|
- <span class="gy-detail-dialog-title">工艺资料详情</span>
|
|
|
- </div>
|
|
|
- <div class="gy-detail-dialog-toolbar-row">
|
|
|
- <div class="gy-detail-dialog-actions-left">
|
|
|
- <el-button type="primary" @click="openGyDetailProcessAdd">增加</el-button>
|
|
|
- <el-button type="danger" :disabled="!gyDetailSelection.length || gyDetailDeleting" :loading="gyDetailDeleting" @click="handleGyDetailBatchDelete">删除</el-button>
|
|
|
- <el-button type="primary" @click="handleGyDetailPrintPreview">打印预览</el-button>
|
|
|
- <el-button type="success" v-if="!gyDetailReadonly" :loading="gyDetailSaving" @click="handleGyDetailSave">保存</el-button>
|
|
|
- </div>
|
|
|
- <el-button type="danger" class="gy-detail-dialog-exit" @click="closeGyDetailDialog">退出</el-button>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <div class="gy-detail-dialog-body">
|
|
|
- <!-- 上方信息 -->
|
|
|
- <div style="margin-bottom: 15px; overflow-x: auto;">
|
|
|
- <el-row :gutter="20" style="width: max-content; display: flex; align-items: center;">
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 80px; text-align: right; margin-right: 8px;">订单编号:</span>
|
|
|
- <el-input v-model="gyDetailFormData.订单编号" disabled style="width: 100px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 80px; text-align: right; margin-right: 8px;">客户编号:</span>
|
|
|
- <el-input v-model="gyDetailFormData.客户编号" disabled style="width: 70px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 80px; text-align: right; margin-right: 8px;">生产款号:</span>
|
|
|
- <el-input v-model="gyDetailFormData.生产款号" disabled style="width: 280px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 60px; text-align: right; margin-right: 8px;">款式:</span>
|
|
|
- <el-input v-model="gyDetailFormData.款式" disabled style="width: 200px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 60px; text-align: right; margin-right: 8px;">接单日期:</span>
|
|
|
- <el-input v-model="gyDetailFormData.接单日期" disabled style="width: 120px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span
|
|
|
- style="width: 60px; text-align: right; margin-right: 8px; cursor: pointer;"
|
|
|
- @click="startGyDetailPlanManufactureEdit"
|
|
|
- >备注:</span>
|
|
|
- <el-input
|
|
|
- v-model="gyDetailFormData.备注"
|
|
|
- style="width: 200px;"
|
|
|
- :readonly="!gyDetailPlanManufactureEditing"
|
|
|
- @click="startGyDetailPlanManufactureEdit"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </el-row>
|
|
|
- <el-row :gutter="20" style="width: max-content; display: flex; align-items: center; margin-top: 10px;">
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 80px; text-align: right; margin-right: 8px;">落货日期:</span>
|
|
|
- <el-input v-model="gyDetailFormData.落货日期" disabled style="width: 120px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 80px; text-align: right; margin-right: 8px;">制单日期:</span>
|
|
|
- <el-input v-model="gyDetailFormData.制单日期" disabled style="width: 160px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 60px; text-align: right; margin-right: 8px;">制单人:</span>
|
|
|
- <el-input v-model="gyDetailFormData.制单人" disabled style="width: 70px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 90px; text-align: right; margin-right: 8px;">工单完工日期:</span>
|
|
|
- <el-date-picker
|
|
|
- v-model="gyDetailFormData.工单完工日期"
|
|
|
- type="date"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- format="YYYY-MM-DD"
|
|
|
- clearable
|
|
|
- placeholder="选择日期"
|
|
|
- style="width: 140px;"
|
|
|
- />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span style="width: 80px; text-align: right; margin-right: 8px;">订单数量:</span>
|
|
|
- <el-input v-model="gyDetailFormData.订单数量" disabled style="width: 80px;" />
|
|
|
- </div>
|
|
|
- <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
- <span
|
|
|
- style="width: 100px; text-align: right; margin-right: 8px; cursor: pointer;"
|
|
|
- @click="startGyDetailPlanManufactureEdit"
|
|
|
- >计划制造工分:</span>
|
|
|
- <el-input
|
|
|
- :model-value="gyDetailFormData.计划制造工分"
|
|
|
- style="width: 80px;"
|
|
|
- :readonly="!gyDetailPlanManufactureEditing"
|
|
|
- inputmode="decimal"
|
|
|
- @click="startGyDetailPlanManufactureEdit"
|
|
|
- @update:model-value="onGyDetailPlanManufactureInput"
|
|
|
- />
|
|
|
- <template v-if="gyDetailPlanManufactureEditing">
|
|
|
- <el-button style="margin-left: 10px;" @click="cancelGyDetailPlanManufactureEdit">取消</el-button>
|
|
|
- <el-button type="primary" style="margin-left: 8px;" :loading="gyDetailPlanManufactureSaving" @click="confirmGyDetailPlanManufactureEdit">保存</el-button>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </el-row>
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 工艺列表表格(虚拟滚动 + 底部横向滚动条) -->
|
|
|
- <div ref="gyDetailTableWrapRef" class="gy-detail-table-wrap">
|
|
|
- <vxe-table
|
|
|
- ref="gyDetailTableRef"
|
|
|
- border
|
|
|
- size="small"
|
|
|
- show-overflow
|
|
|
- auto-resize
|
|
|
- :height="gyDetailTableHeight"
|
|
|
- :min-width="gyDetailTableMinWidth"
|
|
|
- :data="gyDetailDisplayProcessList"
|
|
|
- :row-config="{ keyField: '_rowKey', isHover: true, isCurrent: true, height: 28 }"
|
|
|
- :cell-config="{ height: 28, padding: false }"
|
|
|
- :scroll-y="{ enabled: true, gt: 30 }"
|
|
|
- :scroll-x="{ enabled: true }"
|
|
|
- :column-config="{ resizable: true, minWidth: 56 }"
|
|
|
- :checkbox-config="{ trigger: 'default', highlight: false }"
|
|
|
- show-footer
|
|
|
- :footer-method="gyDetailFooterMethod"
|
|
|
- class="gy-detail-vxe-table"
|
|
|
- @checkbox-change="handleGyDetailCheckboxChange"
|
|
|
- @checkbox-all="handleGyDetailCheckboxChange"
|
|
|
- >
|
|
|
- <vxe-column type="checkbox" width="55" fixed="left" align="center" header-align="center" />
|
|
|
- <vxe-column field="部件编号" title="部件编号" width="75" align="center" header-align="center" />
|
|
|
- <vxe-column field="部件名称" width="120" align="center" header-align="center">
|
|
|
- <template #header>
|
|
|
- <div class="gy-detail-col-header">
|
|
|
- <span>部件名称</span>
|
|
|
- <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
- <template #reference>
|
|
|
- <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions) }" @click.stop>
|
|
|
- <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- <div class="gy-detail-filter-panel">
|
|
|
- <div class="gy-detail-filter-options">
|
|
|
- <el-checkbox-group v-model="gyDetailBuJianMingChengFilter" @change="handleGyDetailBuJianMingChengFilterChange">
|
|
|
- <el-checkbox v-for="item in gyDetailBuJianMingChengFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
- </el-checkbox-group>
|
|
|
- </div>
|
|
|
- <div class="gy-detail-filter-actions">
|
|
|
- <span class="gy-detail-filter-link" @click.stop="clearGyDetailBuJianMingChengFilter">取消全选</span>
|
|
|
- <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailBuJianMingChengFilter">全选</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-popover>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="!isGyDetailCellEditable('部件名称') && !isGyDetailCellEditing(row, '部件名称')">{{ row.部件名称 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '部件名称')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '部件名称')">{{ formatGyDetailCellText(row.部件名称) }}</div>
|
|
|
- <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.部件名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '部件名称')" />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="工序编号" title="工序编号" width="100" align="center" header-align="center" />
|
|
|
- <vxe-column field="工序名称" title="工序名称" width="320" align="left" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="!isGyDetailCellEditable('工序名称') && !isGyDetailCellEditing(row, '工序名称')">{{ row.工序名称 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '工序名称')" class="gy-detail-cell gy-detail-cell--wide" @click.stop="startGyDetailCellEdit(row, '工序名称')">{{ formatGyDetailCellText(row.工序名称) }}</div>
|
|
|
- <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.工序名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '工序名称')" />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="大工序" width="110" align="center" header-align="center">
|
|
|
- <template #header>
|
|
|
- <div class="gy-detail-col-header">
|
|
|
- <span>生产工序</span>
|
|
|
- <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
- <template #reference>
|
|
|
- <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailDaGongXuFilter, dagongxuFilters) }" @click.stop>
|
|
|
- <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- <div class="gy-detail-filter-panel">
|
|
|
- <div class="gy-detail-filter-options">
|
|
|
- <el-checkbox-group v-model="gyDetailDaGongXuFilter" @change="handleGyDetailDaGongXuFilterChange">
|
|
|
- <el-checkbox v-for="item in dagongxuFilters" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
- </el-checkbox-group>
|
|
|
- </div>
|
|
|
- <div class="gy-detail-filter-actions">
|
|
|
- <span class="gy-detail-filter-link" @click.stop="clearGyDetailDaGongXuFilter">取消全选</span>
|
|
|
- <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailDaGongXuFilter">全选</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-popover>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="!isGyDetailCellEditable('大工序') && !isGyDetailCellEditing(row, '大工序')">{{ row.大工序 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '大工序')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '大工序')">{{ formatGyDetailCellText(row.大工序) }}</div>
|
|
|
- <el-select
|
|
|
- v-else
|
|
|
- :ref="setGyDetailCellInputRef"
|
|
|
- v-model="row.大工序"
|
|
|
- size="small"
|
|
|
- class="gy-detail-cell-input gy-detail-cell-select"
|
|
|
- filterable
|
|
|
- @change="finishGyDetailCellEdit(row)"
|
|
|
- >
|
|
|
- <el-option v-for="opt in gyDetailDaGongXuOptions" :key="opt" :label="opt" :value="opt" />
|
|
|
- </el-select>
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="秒" title="秒" width="80" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="gyDetailReadonly">{{ row.秒 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '秒')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '秒')">{{ formatGyDetailCellText(row.秒) }}</div>
|
|
|
- <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.秒" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '秒', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '秒')" />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="分" title="分" width="80" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="gyDetailReadonly">{{ row.分 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '分')">{{ formatGyDetailCellText(row.分) }}</div>
|
|
|
- <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '分')" />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="定额分" title="工分" width="80" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="!isGyDetailCellEditable('工分') && !isGyDetailCellEditing(row, '定额分')">{{ row.定额分 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '定额分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '定额分')">{{ formatGyDetailCellText(row.定额分) }}</div>
|
|
|
- <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.定额分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '定额分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '定额分')" />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="金额" title="金额" width="80" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="gyDetailReadonly">{{ row.金额 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '金额')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '金额')">{{ formatGyDetailCellText(row.金额) }}</div>
|
|
|
- <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.金额" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '金额', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '金额')" />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="难度系数" width="110" align="center" header-align="center">
|
|
|
- <template #header>
|
|
|
- <div class="gy-detail-col-header">
|
|
|
- <span>难度系数</span>
|
|
|
- <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
- <template #reference>
|
|
|
- <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions) }" @click.stop>
|
|
|
- <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- <div class="gy-detail-filter-panel">
|
|
|
- <div class="gy-detail-filter-options">
|
|
|
- <el-checkbox-group v-model="gyDetailNanDuXiShuFilter" @change="handleGyDetailNanDuXiShuFilterChange">
|
|
|
- <el-checkbox v-for="item in gyDetailDifficultyFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
- </el-checkbox-group>
|
|
|
- </div>
|
|
|
- <div class="gy-detail-filter-actions">
|
|
|
- <span class="gy-detail-filter-link" @click.stop="clearGyDetailNanDuXiShuFilter">取消全选</span>
|
|
|
- <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailNanDuXiShuFilter">全选</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-popover>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="gyDetailReadonly">{{ row.难度系数 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '难度系数')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '难度系数')">{{ formatGyDetailCellText(row.难度系数) }}</div>
|
|
|
- <el-select
|
|
|
- v-else
|
|
|
- :ref="setGyDetailCellInputRef"
|
|
|
- v-model="row.难度系数"
|
|
|
- size="small"
|
|
|
- class="gy-detail-cell-input gy-detail-cell-select"
|
|
|
- @change="finishGyDetailCellEdit(row)"
|
|
|
- >
|
|
|
- <el-option v-for="opt in gyDetailDifficultyOptions" :key="opt" :label="opt" :value="opt" />
|
|
|
- </el-select>
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="备注" title="备注" width="140" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <span v-if="gyDetailReadonly">{{ row.备注 }}</span>
|
|
|
- <template v-else>
|
|
|
- <div v-if="!isGyDetailCellEditing(row, '备注')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '备注')">{{ formatGyDetailCellText(row.备注) }}</div>
|
|
|
- <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.备注" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" />
|
|
|
- </template>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="状态" width="80" align="center" header-align="center">
|
|
|
- <template #header>
|
|
|
- <div class="gy-detail-col-header">
|
|
|
- <span>状态</span>
|
|
|
- <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
- <template #reference>
|
|
|
- <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions) }" @click.stop>
|
|
|
- <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- <div class="gy-detail-filter-panel">
|
|
|
- <div class="gy-detail-filter-options">
|
|
|
- <el-checkbox-group v-model="gyDetailZhuangTaiFilter" @change="handleGyDetailZhuangTaiFilterChange">
|
|
|
- <el-checkbox v-for="item in gyDetailStatusFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
- </el-checkbox-group>
|
|
|
- </div>
|
|
|
- <div class="gy-detail-filter-actions">
|
|
|
- <span class="gy-detail-filter-link" @click.stop="clearGyDetailZhuangTaiFilter">取消全选</span>
|
|
|
- <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailZhuangTaiFilter">全选</span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-popover>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <template #default="{ row }">
|
|
|
- <div class="gy-detail-status-cell">{{ formatGyDetailStatus(row.状态) }}</div>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- <vxe-column field="_gyAction" title="操作" width="100" fixed="right" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <div class="gy-detail-action-cell">
|
|
|
- <el-button
|
|
|
- v-if="isGyDetailRowSplit(row)"
|
|
|
- size="small"
|
|
|
- type="warning"
|
|
|
- @click="handleUndoSplitProcess(row)"
|
|
|
- >撤销拆分</el-button>
|
|
|
- <el-button
|
|
|
- v-else
|
|
|
- size="small"
|
|
|
- type="success"
|
|
|
- @click="handleSplitProcess(row)"
|
|
|
- >拆分</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </vxe-column>
|
|
|
- </vxe-table>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 拆分弹窗 -->
|
|
|
- <el-dialog v-model="splitDialogVisible" title="拆分工序" width="450px" style="top: 30%;" @close="splitDialogVisible = false">
|
|
|
- <div style="padding: 20px;">
|
|
|
- <div v-if="hasReportData" style="color: #f56c6c; margin-bottom: 15px; font-weight: bold; text-align: center;">
|
|
|
- ⚠️ 该工序已存在报工数据
|
|
|
- </div>
|
|
|
- <div style="margin-bottom: 15px; text-align: center;">
|
|
|
- <span>将复制 </span>
|
|
|
- <span class="gy-split-process-name">{{ currentSplitRow?.工序编号 || '' }}-{{ currentSplitRow?.工序名称 || '' }}</span>
|
|
|
- <span>,拆分数量为:</span>
|
|
|
- </div>
|
|
|
- <div style="display: flex; justify-content: center;">
|
|
|
- <el-input-number
|
|
|
- v-model="splitQuantity"
|
|
|
- :min="1"
|
|
|
- :step="1"
|
|
|
- :precision="0"
|
|
|
- controls-position="right"
|
|
|
- placeholder="请输入拆分数量"
|
|
|
- style="width: 200px;"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <template #footer>
|
|
|
- <el-button @click="splitDialogVisible = false">取消</el-button>
|
|
|
- <el-button type="primary" :loading="splitSubmitting" @click="confirmSplitProcess">确定</el-button>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 修改颜色资料弹窗 -->
|
|
|
- <el-dialog v-model="dialogFormVisible" :before-close="edit_closeDialog"
|
|
|
- style="width: 80%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
|
|
|
- title="颜色资料修改" destroy-on-close >
|
|
|
- <el-row :gutter="20" class="form-row">
|
|
|
- <el-col :span="10">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;">订单编号 {{_ddhval}}</h3>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- <el-col :span="10">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="订单子编号:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
- <el-input v-model="edit_formData['子订单编号']" disabled style="width: 250px;" id="订单子编号" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row :gutter="20">
|
|
|
- <el-col :span="10">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
- <el-select
|
|
|
- v-model=" edit_formData['颜色']" style="width: 150px;" id="色系名称"
|
|
|
- @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
|
|
|
- <el-option
|
|
|
- v-for="color in getSuborderscolor.colorlist"
|
|
|
- :key="color.id"
|
|
|
- :label="color.colorname"
|
|
|
- :value="color.colorname"
|
|
|
- @click="xg_sxhandleSizeChange(color.colorname,color.colorcode)">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
-
|
|
|
- <el-col :span="10">
|
|
|
- <el-form-item label="PO号:" prop="deliveryDate" class="mab" label-width="110px" style="">
|
|
|
- <el-input v-model="edit_formData['款号']" style="width: 250px;" id="生产款号" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row :gutter="20">
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
|
|
|
- <el-input v-model="edit_formData['颜色备注']" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="10">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="是否船样:" prop="joinDate" label-width='200'>
|
|
|
- <el-select v-model="edit_formData['船样']" style="width: 150px;" id="是否船样" @keydown="add_gdzlent($event, '尺码规格', '是否船样', 'zds1')">
|
|
|
- <el-option label="是" value="是" @click="edit_cyChange('是')"></el-option>
|
|
|
- <el-option label="否" value="否" @click="edit_cyChange('否')"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row class="form-row">
|
|
|
- <el-col :span="20">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="尺码:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
- <el-input v-model="edit_cmformdata.cm1" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm2" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm3" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm4" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm5" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm6" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm7" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm8" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm9" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm10" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm11" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm12" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm13" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.cm14" readonly style="width: 80px;" />
|
|
|
- <el-input v-model="edit_cmformdata.sctotal" readonly style="width: 80px;" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row class="form-row">
|
|
|
- <el-col :span="20">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
- <el-input v-model="edit_zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1' @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2' @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3' @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4' @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5' @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6' @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7' @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8' @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9' @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10' @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11' @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12' @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13' @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14' @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
|
|
|
- <el-input v-model="edit_zdsformdata.zdtotal" readonly style="width: 80px;" />
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer" style="display: flex; justify-content: flex-end; margin-top: 20px;">
|
|
|
- <el-button @click="ys_edit_closeDialog" style="margin-left: 10px;">取消</el-button>
|
|
|
- <el-button type="primary" @click="ys_edit_Dialog" style="margin-left: 10px;">确认</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
-
|
|
|
- <!-- 新增订单资料弹窗 -->
|
|
|
- <el-dialog
|
|
|
- v-model="add_gddialogFormVisible"
|
|
|
- :before-close="add_gdcloseDialog"
|
|
|
- title="新增订单资料"
|
|
|
- class="add-order-dialog"
|
|
|
- width="90%"
|
|
|
- top="4vh"
|
|
|
- destroy-on-close
|
|
|
- >
|
|
|
- <el-row :gutter="20" class="add-order-dialog-body">
|
|
|
- <el-col :xs="24" :md="16" class="add-order-dialog-main">
|
|
|
- <el-form :model="add_gdscgdformData" label-width="100px">
|
|
|
- <el-row :gutter="16">
|
|
|
- <el-col :xs="24" :sm="12">
|
|
|
- <el-form-item label="订单编号">
|
|
|
- <el-input v-model="add_gdscgdformData.订单编号" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="生产款号">
|
|
|
- <el-input v-model="add_gdscgdformData['生产款号']" id="生产款号"
|
|
|
- @keydown="add_gdzlent($event, '粘衬', '生产款号', '订单数量')" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="款式">
|
|
|
- <el-input v-model="add_gdscgdformData['款式']" id="款式"
|
|
|
- @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="12">
|
|
|
- <el-form-item label="客户编号">
|
|
|
- <el-input v-model="add_gdscgdformData.客户编号" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="订单数量">
|
|
|
- <el-input v-model="add_gdscgdformData.订单数量" id="订单数量"
|
|
|
- @input="Input_handle()"
|
|
|
- @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="落货日期">
|
|
|
- <el-date-picker v-model="add_gdscgdformData['落货日期']" id="落货日期"
|
|
|
- type="date" @keydown="add_gdzlent($event, '款式', '落货日期', '面料')" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-form-item label="面料">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- v-model="add_gdscgdformData['面料']" id="面料"
|
|
|
- rows="2"
|
|
|
- resize="none"
|
|
|
- @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="箱唛要求">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- v-model="add_gdscgdformData['箱唛要求']" id="箱唛要求"
|
|
|
- @keydown="add_gdzlent($event, '面料', '箱唛要求', '备注')"
|
|
|
- rows="2"
|
|
|
- resize="none"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="备注">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- v-model="add_gdscgdformData['备注']" id="备注"
|
|
|
- @keydown="add_gdzlent($event, '箱唛要求', '备注', '船样描述')"
|
|
|
- rows="2"
|
|
|
- resize="none"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="船样描述">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- v-model="add_gdscgdformData['船样描述']" id="船样描述"
|
|
|
- rows="1"
|
|
|
- resize="none"
|
|
|
- @keydown="add_gdzlent($event, '备注', '船样描述', '船样合计')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-row :gutter="10" class="add-order-bottom-row">
|
|
|
- <el-col :xs="24" :sm="8">
|
|
|
- <el-form-item label="船样合计" label-width="100px">
|
|
|
- <el-input v-model="add_gdscgdformData['船样合计']" id="船样合计"
|
|
|
- @input="Input_handle()"
|
|
|
- @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="10">
|
|
|
- <el-form-item label="粘衬" label-width="60px">
|
|
|
- <el-input v-model="add_gdscgdformData['粘衬']" id="粘衬"
|
|
|
- @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="6">
|
|
|
- <el-form-item label="单位" label-width="70px">
|
|
|
- <el-input v-model="add_gdscgdformData['单位']" id="单位"
|
|
|
- @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- </el-form>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :md="8" class="add-order-dialog-side">
|
|
|
- <div class="add-order-upload-wrap">
|
|
|
- <el-upload
|
|
|
- ref="uploadRef"
|
|
|
- class="upload-demo add-order-upload"
|
|
|
- :action="uploadUrl"
|
|
|
- :http-request="customUpload"
|
|
|
- :headers="uploadHeaders"
|
|
|
- list-type="picture-card"
|
|
|
- :on-preview="handlePreview"
|
|
|
- :on-remove="handleRemove"
|
|
|
- :before-upload="beforeUpload"
|
|
|
- :on-success="handleSuccess"
|
|
|
- :on-error="handleError"
|
|
|
- :file-list="fileList"
|
|
|
- :limit="1"
|
|
|
- accept="image/jpeg,image/png"
|
|
|
- >
|
|
|
- <el-icon class="add-order-upload-plus"><Plus /></el-icon>
|
|
|
- </el-upload>
|
|
|
- <div class="add-order-upload-title">上传图片</div>
|
|
|
- </div>
|
|
|
- <el-form label-width="100px">
|
|
|
- <el-form-item label="制单人">
|
|
|
- <el-input v-model="add_gdscgdformData['Sys_id']" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="制单日期">
|
|
|
- <el-date-picker v-model="add_gdscgdformData['制单日期']" disabled type="date" />
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '30px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="zsglddtableData" row-key="ID">
|
|
|
- <el-table-column align="left" label="订单编号" prop="订单编号" width="110"/>
|
|
|
- <el-table-column align="left" label="物料编码" prop="物料编码" width="200"/>
|
|
|
- <el-table-column align="left" label="生产款号" prop="生产款号" width="200"/>
|
|
|
- <el-table-column align="left" label="颜色" prop="颜色" width="115"/>
|
|
|
- <el-table-column align="left" label="物料名称" prop="物料名称" width="170"/>
|
|
|
- <el-table-column align="left" label="计划门幅" prop="计划门幅" width="115"/>
|
|
|
- <el-table-column align="left" label="定额门幅" prop="定额门幅" width="115"/>
|
|
|
- <el-table-column align="left" label="款式" prop="款式" width="115" />
|
|
|
-
|
|
|
- <el-table-column fixed="right" label="操作" width="120">
|
|
|
- <template #default="{ row, $index }">
|
|
|
- <el-button @click="deleteRow($index)" type="text" size="small">
|
|
|
- 移除
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- </el-table> -->
|
|
|
-
|
|
|
- <!-- 底部操作按钮 -->
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer" style="text-align: right;">
|
|
|
- <el-button @click="add_gdcloseDialog">取消</el-button>
|
|
|
- <el-button type="primary" @click="add_gdenterDialog":disabled="!isClickable" v-loading.fullscreen.lock="fullscreenLoading">确定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 订单图片页内放大预览 -->
|
|
|
- <el-image-viewer
|
|
|
- v-if="imgPreviewVisible"
|
|
|
- :url-list="imgPreviewList"
|
|
|
- teleported
|
|
|
- hide-on-click-modal
|
|
|
- @close="closeImgPreview"
|
|
|
- />
|
|
|
-
|
|
|
- <!-- 关联订单面料弹窗 -->
|
|
|
- <el-dialog v-model="Related_fabricsVisible" :before-close="Related_fabricscloseDialog" title="关联订单面料"
|
|
|
- style="width: 70%;height: 80%;" top="2%" destroy-on-close>
|
|
|
- <el-form>
|
|
|
- <div>
|
|
|
- <el-space>
|
|
|
-
|
|
|
- <el-input v-model="glddzl_keyword" style="width: 300px;" placeholder="请搜索要关联的订单编号或款号进行关联" @input="real_handleInput"/>
|
|
|
- <el-button type="primary" @click="ddsearchHandle(glddzl_keyword)">搜索</el-button>
|
|
|
- <!-- <el-button @click="Related_fabricscloseDialog">关闭</el-button> -->
|
|
|
- <el-button type="primary" @click="Related_fabricsenterDialog">确定关联</el-button>
|
|
|
- <span style="color: red;">请选择需要关联复用的颜色物料,在确定关联</span>
|
|
|
- </el-space>
|
|
|
- <br>
|
|
|
- <br>
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '30px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- @row-dblclick="updateCompanyFunc2"
|
|
|
- @selection-change="glddSelectionChange"
|
|
|
- style="width: 100%;height: 65vh" border tooltip-effect="dark" :data="glddtableData" row-key="ID">
|
|
|
- <el-table-column type="selection" width="50" />
|
|
|
- <el-table-column align="left" label="订单编号" prop="订单编号" width="115"/>
|
|
|
- <el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码" width="200"/>
|
|
|
- <el-table-column align="left" label="生产款号" prop="生产款号" width="200"/>
|
|
|
- <el-table-column align="left" label="颜色" prop="颜色" width="115"/>
|
|
|
- <el-table-column align="left" label="物料名称" prop="物料名称" width="170"/>
|
|
|
- <el-table-column align="left" label="计划门幅" prop="计划门幅" width="115"/>
|
|
|
- <el-table-column align="left" label="定额门幅" prop="定额门幅" width="115"/>
|
|
|
- <el-table-column align="left" label="款式" prop="款式" width="115"/>
|
|
|
- <el-table-column align="left" label="单位" prop="投料单位" width="115"/>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
-
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
-
|
|
|
- <el-dialog
|
|
|
- v-model="order_viewVisible"
|
|
|
- title="选择打印格式"
|
|
|
- width="30%"
|
|
|
- top="10%"
|
|
|
- :before-close="order_viewCloseDialog"
|
|
|
- destroy-on-close
|
|
|
- >
|
|
|
- <el-form>
|
|
|
- <el-form-item label="打印方向" label-width="100px">
|
|
|
- <el-radio-group v-model="printDirection">
|
|
|
- <el-radio label="纵向">纵向</el-radio>
|
|
|
- <el-radio label="横向">横向</el-radio>
|
|
|
- </el-radio-group>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
-
|
|
|
- <template #footer>
|
|
|
- <el-button @click="order_viewCloseDialog">关闭</el-button>
|
|
|
- <el-button type="primary" @click="confirmPrintDirection">确定打印</el-button>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 修改BOM资料 -->
|
|
|
- <el-dialog v-model="edit_bomdialogFormVisible" :before-close="edit_bomcloseDialog" title="修改BOM资料" width="60%" top="2%" destroy-on-close>
|
|
|
- <el-descriptions class="margin-top" :column="4" :size="size" border>
|
|
|
- <el-descriptions-item label="订单编号" class="ddh">{{ ddhformData['ddh'] }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
|
|
|
- </el-descriptions>
|
|
|
- <el-divider content-position="left">
|
|
|
- <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
|
|
|
- </el-divider>
|
|
|
- <div style="margin-top: 5px;">
|
|
|
- <el-table ref="paichengRef"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- highlight-current-row="true"
|
|
|
- :row-style="{ height: '0px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '0px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- style="width: 100%;height: 60vh" border tooltip-effect="dark"
|
|
|
- :data="edit_resbomtableData" row-key="ID"
|
|
|
- :cell-class-name="scfjfpxsCellClass">
|
|
|
- <template v-for="(item, idx) in edit_resbom_tableColumns">
|
|
|
- <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width" >
|
|
|
- <div v-if="['物料名称', '计划用料', '定额用料','计划门幅','定额门幅', '备注'].includes(item.prop)">
|
|
|
- <el-input v-model="row[item.prop]" :clearable="false"
|
|
|
- :id="`input${idx}${$index}`" @keyup="resbom_handleKeyDown($event, idx, $index, item.prop)" @input="handleInput($event, row, item.prop)"/>
|
|
|
- </div>
|
|
|
- <div v-else>{{ row[item.prop] }}</div>
|
|
|
- </el-table-column>
|
|
|
- </template>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
|
|
|
- <el-button @click="editres_bomcloseDialog">取 消</el-button>
|
|
|
- <el-button type="primary" @click="editres_bomenterDialog">修改</el-button>
|
|
|
- </div>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 批量修改BOM资料弹窗 -->
|
|
|
- <el-dialog v-model="res_bomdialogFormVisible" :before-close="res_bomcloseDialog" title="批量新增/更新BOM数据" width="70%" top="1%" destroy-on-close>
|
|
|
-
|
|
|
- <el-descriptions class="margin-top" :column="4" :size="size" border>
|
|
|
- <el-descriptions-item label="订单编号">{{ ddhformData['ddh'] }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
|
|
|
- </el-descriptions>
|
|
|
- <el-descriptions class="margin-top" :column="1" :size="size" border>
|
|
|
- <el-descriptions-item label="面料" >{{ ddhformData['ml'] }}</el-descriptions-item>
|
|
|
- </el-descriptions>
|
|
|
-
|
|
|
- <el-divider content-position="left">
|
|
|
- <el-button type="primary" icon="plus" @click="add_bomenterDialog">新增一行</el-button>
|
|
|
- <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
|
|
|
- </el-divider>
|
|
|
- <div style="margin-top: 5px;">
|
|
|
- <el-table ref="paichengRef"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- highlight-current-row="true"
|
|
|
- :row-style="{ height: '0px' }"
|
|
|
- :cell-style="{ padding: '0px' }"
|
|
|
- :header-row-style="{ height: '0px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- style="width: 100%;height: 58vh"
|
|
|
- border tooltip-effect="dark"
|
|
|
- :data="resbomtableData" row-key="ID"
|
|
|
- :cell-class-name="scfjfpxsCellClass">
|
|
|
-
|
|
|
- <template v-for="(item, idx) in resbom_tableColumns">
|
|
|
- <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width">
|
|
|
-
|
|
|
- <!-- 如果是物料名称且UNIQID没有值,则显示输入框,否则显示内容 -->
|
|
|
- <div v-if="item.prop === '物料名称'">
|
|
|
- <el-input
|
|
|
- v-if="!row.UNIQID"
|
|
|
- v-model="row[item.prop]"
|
|
|
- :clearable="false"
|
|
|
- :id="`input${idx}${$index}`"
|
|
|
- @input="handleInput($event, row, item.prop)"
|
|
|
- />
|
|
|
- <span v-else>{{ row[item.prop] }}</span> <!-- 如果UNIQID有值,则直接显示内容 -->
|
|
|
- </div>
|
|
|
-
|
|
|
- <div v-else-if="item.prop === '计划入库时间'">
|
|
|
- <el-date-picker
|
|
|
- v-model="row['计划入库时间']"
|
|
|
- type="date"
|
|
|
- value-format="YYYY-MM-DD"
|
|
|
- placeholder="选择日期"
|
|
|
- style="width: 100%"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 其他列的处理 -->
|
|
|
- <div v-else-if="['物料分类','计划用料', '定额用料', '计划门幅', '定额门幅', '备注'].includes(item.prop)">
|
|
|
- <el-input
|
|
|
- v-model="row[item.prop]"
|
|
|
- :clearable="false"
|
|
|
- :id="`input${idx}${$index}`"
|
|
|
- @input="handleInput($event, row, item.prop)"
|
|
|
- />
|
|
|
- </div>
|
|
|
-
|
|
|
- <!-- 非输入框列 -->
|
|
|
- <div v-else>{{ row[item.prop] }}</div>
|
|
|
-
|
|
|
- </el-table-column>
|
|
|
- </template>
|
|
|
-
|
|
|
- <el-table-column fixed="right" label="操作" width="80">
|
|
|
- <template #default="{ row, $index }">
|
|
|
- <el-button @click="record_deleteRow(row,$index)" type="danger" size="small"
|
|
|
- style="font-size: 16px;padding: 0px;width: 60px;background-color: red;">
|
|
|
- 删除
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
|
|
|
- <el-button @click="res_bomcloseDialog" style="width: 70px;height: 40px;">关闭</el-button>
|
|
|
- <el-button type="primary" @click="res_bomenterDialog" style="width: 70px;height: 40px;">一键修改</el-button>
|
|
|
- </div>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
-
|
|
|
- <el-dialog
|
|
|
- v-model="ddzl_dialogFormVisible"
|
|
|
- :before-close="dd_closeDialog"
|
|
|
- title="修改订单资料"
|
|
|
- class="add-order-dialog"
|
|
|
- width="90%"
|
|
|
- top="4vh"
|
|
|
- destroy-on-close
|
|
|
- >
|
|
|
- <el-row :gutter="20" class="add-order-dialog-body">
|
|
|
- <el-col :xs="24" :md="16" class="add-order-dialog-main">
|
|
|
- <el-form :model="edit_ddformData" label-width="100px">
|
|
|
- <el-row :gutter="16">
|
|
|
- <el-col :xs="24" :sm="12">
|
|
|
- <el-form-item label="订单编号">
|
|
|
- <el-input v-model="edit_ddformData['订单编号']" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="生产款号">
|
|
|
- <el-input
|
|
|
- v-model="edit_ddformData['生产款号']" id="生产款号"
|
|
|
- @keydown="add_gdzlent($event, '单位', '生产款号', '订单数量')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="款式">
|
|
|
- <el-input v-model="edit_ddformData['款式']" id="款式"
|
|
|
- @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="12">
|
|
|
- <el-form-item label="客户编号">
|
|
|
- <el-input v-model="edit_ddformData['客户编号']" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="订单数量">
|
|
|
- <el-input v-model="edit_ddformData['订单数量']" id="订单数量"
|
|
|
- @input="Input_handle()"
|
|
|
- @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="落货日期">
|
|
|
- <el-date-picker
|
|
|
- v-model="edit_ddformData['落货日期']"
|
|
|
- id="落货日期"
|
|
|
- type="date"
|
|
|
- @keydown="add_gdzlent($event, '款式', '落货日期', '面料')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <el-form-item label="面料">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- v-model="edit_ddformData['面料']"
|
|
|
- id="面料"
|
|
|
- rows="2"
|
|
|
- resize="none"
|
|
|
- @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="箱唛要求">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- id="箱唛要求"
|
|
|
- v-model="edit_ddformData['箱唛要求']"
|
|
|
- @keydown="add_gdzlent($event, '面料', '箱唛要求', '要求')"
|
|
|
- rows="2"
|
|
|
- resize="none"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="备注">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- v-model="edit_ddformData['要求']"
|
|
|
- id="要求"
|
|
|
- @keydown="add_gdzlent($event, '箱唛要求', '要求', '船样描述')"
|
|
|
- rows="2"
|
|
|
- resize="none"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="船样描述">
|
|
|
- <el-input
|
|
|
- type="textarea"
|
|
|
- id="船样描述"
|
|
|
- @keydown="add_gdzlent($event, '要求', '船样描述', '船样合计')"
|
|
|
- v-model="edit_ddformData['船样描述']"
|
|
|
- rows="1"
|
|
|
- resize="none"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- <el-row :gutter="10" class="add-order-bottom-row">
|
|
|
- <el-col :xs="24" :sm="8">
|
|
|
- <el-form-item label="船样合计" label-width="100px">
|
|
|
- <el-input v-model="edit_ddformData['船样合计']" id="船样合计"
|
|
|
- @input="Input_handle()"
|
|
|
- @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="10">
|
|
|
- <el-form-item label="粘衬" label-width="60px">
|
|
|
- <el-input v-model="edit_ddformData['粘衬']" id="粘衬"
|
|
|
- @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :sm="6">
|
|
|
- <el-form-item label="单位" label-width="70px">
|
|
|
- <el-input v-model="edit_ddformData['单位']" id="单位"
|
|
|
- @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- </el-form>
|
|
|
- </el-col>
|
|
|
- <el-col :xs="24" :md="8" class="add-order-dialog-side">
|
|
|
- <div class="add-order-upload-wrap">
|
|
|
- <el-upload
|
|
|
- ref="uploadRef"
|
|
|
- class="upload-demo add-order-upload"
|
|
|
- :action="uploadUrl"
|
|
|
- :http-request="customUpload"
|
|
|
- :headers="uploadHeaders"
|
|
|
- list-type="picture-card"
|
|
|
- :on-preview="handlePreview"
|
|
|
- :on-remove="handleRemove"
|
|
|
- :before-upload="beforeUpload"
|
|
|
- :on-success="handleSuccess"
|
|
|
- :on-error="handleError"
|
|
|
- :file-list="fileList"
|
|
|
- :limit="1"
|
|
|
- accept="image/jpeg,image/png"
|
|
|
- >
|
|
|
- <el-icon class="add-order-upload-plus"><Plus /></el-icon>
|
|
|
- </el-upload>
|
|
|
- <div class="add-order-upload-title">上传图片</div>
|
|
|
- </div>
|
|
|
- <el-form label-width="100px">
|
|
|
- <el-form-item label="制单人">
|
|
|
- <el-input v-model="edit_ddformData['Sys_id']" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="制单日期">
|
|
|
- <el-date-picker v-model="edit_ddformData['Sys_rq']" id="制单日期" disabled type="date" />
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
|
|
|
- <el-table ref="multipleTable"
|
|
|
- :row-style="{ height: '30px' }"
|
|
|
- :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :cell-class-name="planUsageCellClass"
|
|
|
- highlight-current-row="true"
|
|
|
- style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="edit_zsglddtableData" row-key="ID">
|
|
|
- <el-table-column align="left" label="订单编号" prop="订单编号" width="110"/>
|
|
|
- <el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码" width="200"/>
|
|
|
- <el-table-column align="left" label="生产款号" prop="生产款号" width="200"/>
|
|
|
- <el-table-column align="left" label="颜色" prop="颜色" width="115"/>
|
|
|
- <el-table-column align="left" label="物料名称" prop="物料名称" width="170"/>
|
|
|
- <el-table-column align="left" label="计划门幅" prop="计划门幅" width="115"/>
|
|
|
- <el-table-column align="left" label="定额门幅" prop="定额门幅" width="115"/>
|
|
|
- <el-table-column align="left" label="款式" prop="款式" width="115" />
|
|
|
-
|
|
|
- <el-table-column fixed="right" label="操作" width="120">
|
|
|
- <template #default="{ row, $index }">
|
|
|
- <el-button @click="edit_deleteRow($index)" type="text" size="small">
|
|
|
- 移除
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- </el-table> -->
|
|
|
- <!-- 底部操作按钮 -->
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer" style="text-align: right;">
|
|
|
- <el-button @click="dd_closeDialog">取消</el-button>
|
|
|
- <el-button type="primary" @click="dd_edit_Dialog">确定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
-
|
|
|
- <!-- 新增颜色资料弹窗 -->
|
|
|
- <el-dialog
|
|
|
- v-model="add_gdyjdialogFormVisible"
|
|
|
- :before-close="add_gdyjcloseDialog"
|
|
|
- style="width: 73%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
|
|
|
- :title="'新增颜色资料'"
|
|
|
- destroy-on-close>
|
|
|
- <el-form label-width="100px" :model="add_yszlformdata">
|
|
|
- <el-row :gutter="24" class="form-row">
|
|
|
- <el-col :span="10">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号 {{_ddhval}}</h3>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- <el-col :span="10">
|
|
|
- <el-form-item label="订单子编号:" class="mab" prop="keyOrder" id ='订单子编号' label-width='110'>
|
|
|
- <el-input v-model="add_yszlformdata.ddzbh" disabled style="width: 250px;" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row :gutter="24" class="form-row">
|
|
|
- <el-col :span="10">
|
|
|
- <el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
- <el-select
|
|
|
- v-model="add_yszlformdata.sxmc" style="width: 150px;" id="色系名称"
|
|
|
- @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
|
|
|
- <el-option
|
|
|
- v-for="color in getSuborderscolor.colorlist"
|
|
|
- :key="color.id"
|
|
|
- :label="color.colorname"
|
|
|
- :value="color.colorname"
|
|
|
- @click="xz_sxhandleSizeChange(color.colorname,color.colorcode)">
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <el-col :span="10">
|
|
|
- <el-form-item label="PO号:" class="mab" prop="keyOrder" label-width="110">
|
|
|
- <el-input v-model="add_yszlformdata.kh" style="width: 250px;" id ='款号:' @keydown="add_gdzlent($event, '色系名称', '款号:', '颜色备注')"/>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row :gutter="24" class="form-row">
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
|
|
|
- <el-input v-model="add_yszlformdata.ysbz" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
-
|
|
|
- <el-col :span="8">
|
|
|
- <el-form-item label="是否船样:" prop="joinDate" label-width='230'>
|
|
|
- <el-select v-model="add_yszlformdata.sfcy" style="width: 150px;" id ='是否船样' @keydown="add_gdzlent($event, '颜色备注', '是否船样', 'cm1')">
|
|
|
- <el-option label="是" value="是" @click="cyChange('是')"></el-option>
|
|
|
- <el-option label="否" value="否" @click="cyChange('否')"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row :gutter="24" class="form-row">
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="尺码:" class="mab" prop="keyOrder" label-width="110">
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm1"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm1"
|
|
|
- @input="handleSizeInput('cm1')"
|
|
|
- @keydown="add_gdzlent($event, '', 'cm1', 'cm2')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm2"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm2"
|
|
|
- @input="handleSizeInput('cm2')"
|
|
|
- @keydown="add_gdzlent($event, 'cm1', 'cm2', 'cm3')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm3"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm3"
|
|
|
- @input="handleSizeInput('cm3')"
|
|
|
- @keydown="add_gdzlent($event, 'cm2', 'cm3', 'cm4')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm4"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm4"
|
|
|
- @input="handleSizeInput('cm4')"
|
|
|
- @keydown="add_gdzlent($event, 'cm3', 'cm4', 'cm5')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm5"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm5"
|
|
|
- @input="handleSizeInput('cm5')"
|
|
|
- @keydown="add_gdzlent($event, 'cm4', 'cm5', 'cm6')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm6"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm6"
|
|
|
- @input="handleSizeInput('cm6')"
|
|
|
- @keydown="add_gdzlent($event, 'cm5', 'cm6', 'cm7')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm7"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm7"
|
|
|
- @input="handleSizeInput('cm7')"
|
|
|
- @keydown="add_gdzlent($event, 'cm6', 'cm7', 'cm8')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm8"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm8"
|
|
|
- @input="handleSizeInput('cm8')"
|
|
|
- @keydown="add_gdzlent($event, 'cm7', 'cm8', 'cm9')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm9"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm9"
|
|
|
- @input="handleSizeInput('cm9')"
|
|
|
- @keydown="add_gdzlent($event, 'cm8', 'cm9', 'cm10')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm10"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm10"
|
|
|
- @input="handleSizeInput('cm10')"
|
|
|
- @keydown="add_gdzlent($event, 'cm9', 'cm10', 'cm11')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm11"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm11"
|
|
|
- @input="handleSizeInput('cm11')"
|
|
|
- @keydown="add_gdzlent($event, 'cm10', 'cm11', 'cm12')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm12"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm12"
|
|
|
- @input="handleSizeInput('cm12')"
|
|
|
- @keydown="add_gdzlent($event, 'cm11', 'cm12', 'cm13')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm13"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm13"
|
|
|
- @input="handleSizeInput('cm13')"
|
|
|
- @keydown="add_gdzlent($event, 'cm12', 'cm13', 'cm14')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.cm14"
|
|
|
- style="width: 80px;"
|
|
|
- id="cm14"
|
|
|
- @input="handleSizeInput('cm14')"
|
|
|
- @keydown="add_gdzlent($event, 'cm13', 'cm14', 'sctotal')"
|
|
|
- />
|
|
|
- <el-input
|
|
|
- v-model="cmformdata.sctotal"
|
|
|
- style="width: 80px;"
|
|
|
- id="sctotal"
|
|
|
- @input="handleSizeInput('sctotal')"
|
|
|
- @keydown="add_gdzlent($event, 'cm14', 'sctotal', 'zds1')"
|
|
|
- />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
- <el-row :gutter="24" class="form-row">
|
|
|
- <el-col :span="24">
|
|
|
- <el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
- <el-input v-model="zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1' @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
|
|
|
- <el-input v-model="zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2' @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
|
|
|
- <el-input v-model="zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3' @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
|
|
|
- <el-input v-model="zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4' @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
|
|
|
- <el-input v-model="zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5' @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
|
|
|
- <el-input v-model="zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6' @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
|
|
|
- <el-input v-model="zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7' @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
|
|
|
- <el-input v-model="zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8' @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
|
|
|
- <el-input v-model="zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9' @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
|
|
|
- <el-input v-model="zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10' @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
|
|
|
- <el-input v-model="zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11' @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
|
|
|
- <el-input v-model="zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12' @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
|
|
|
- <el-input v-model="zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13' @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
|
|
|
- <el-input v-model="zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14' @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
|
|
|
- <el-input v-model="zdsformdata.zdtotal" readonly style="width: 80px;" />
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
-
|
|
|
-
|
|
|
- </el-form>
|
|
|
-
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer" style="display: flex; justify-content: flex-end; padding: 10px;">
|
|
|
- <el-button type="primary" @click="add_dyjcloseDialog">取消</el-button>
|
|
|
- <el-button type="primary" @click="add_gdyjenterDialog">确定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
-
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 新增工序资料-->
|
|
|
- <el-dialog v-model="visible" :before-close="()=> visible = false" style="width: 25%;margin: 10% auto" :title="'新增工序资料'" destroy-on-close>
|
|
|
- <el-form>
|
|
|
- <div>
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <h3 style="color:red;font-size: 24px;margin:0px 0px 0px 15px;">订单号 {{_ddhval}}</h3>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="仓库出库:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
- <el-checkbox v-model="form['仓库出库']"></el-checkbox>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="裁切:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
- <el-checkbox v-model="form['裁切']"></el-checkbox>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="车缝:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
- <el-checkbox v-model="form['车缝']"></el-checkbox>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="后道收样:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
- <el-checkbox v-model="form['后道收样']"></el-checkbox>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="大烫:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
- <el-checkbox v-model="form['大烫']"></el-checkbox>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="总检:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
- <el-checkbox v-model="form['总检']"></el-checkbox>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
-
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <el-form-item label="包装:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
- <el-checkbox v-model="form['包装']"></el-checkbox>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer" style="text-align: right;top: auto;">
|
|
|
- <el-button @click="add_gxcloseDialog">取 消</el-button>
|
|
|
- <el-button type="primary" @click="add_gxenterDialog">确 定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 新增部件资料弹窗 -->
|
|
|
- <el-dialog
|
|
|
- v-model="partAddDialogVisible"
|
|
|
- :title="partIsEdit ? '修改部件' : '新增部件'"
|
|
|
- width="900px"
|
|
|
- top="5%"
|
|
|
- :fullscreen="false"
|
|
|
- class="part-add-dialog"
|
|
|
- destroy-on-close
|
|
|
- >
|
|
|
- <div v-if="_Gd_gdbh" class="list-dialog-context-header" style="margin-bottom: 15px;">
|
|
|
- <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0" style="width: 100%;">
|
|
|
- <tbody>
|
|
|
- <tr>
|
|
|
- <th scope="row" style="width: 80px;">订单编号</th>
|
|
|
- <td>{{ _Gd_gdbh }}</td>
|
|
|
- </tr>
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </div>
|
|
|
- <el-form
|
|
|
- v-if="partIsEdit"
|
|
|
- ref="partFormRef"
|
|
|
- :model="partAddForm"
|
|
|
- label-width="0"
|
|
|
- class="list-part-edit-form"
|
|
|
- >
|
|
|
- <div class="list-part-edit-table-wrap">
|
|
|
- <el-table
|
|
|
- :data="[partAddForm]"
|
|
|
- border
|
|
|
- class="list-part-add-table"
|
|
|
- style="width: 100%;"
|
|
|
- >
|
|
|
- <el-table-column label="部件序号" width="120" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件序号" disabled placeholder="已保存序号" style="width: 80px;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件编号" width="150">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件名称" min-width="200">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-select
|
|
|
- v-model="row.部件名称"
|
|
|
- placeholder="请选择或输入部件名称"
|
|
|
- filterable
|
|
|
- allow-create
|
|
|
- reserve-keyword
|
|
|
- clearable
|
|
|
- style="width: 100%;"
|
|
|
- >
|
|
|
- <el-option
|
|
|
- v-for="opt in partNameOptions"
|
|
|
- :key="opt"
|
|
|
- :label="opt"
|
|
|
- :value="opt"
|
|
|
- />
|
|
|
- </el-select>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件类型" width="150">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件备注" min-width="150">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作" width="80" align="center">
|
|
|
- <template #default="{ $index }">
|
|
|
- <el-button
|
|
|
- type="danger"
|
|
|
- size="small"
|
|
|
- @click="removePartRow($index)"
|
|
|
- :disabled="partAddRows.length <= 1"
|
|
|
- >
|
|
|
- 移除
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- </el-form>
|
|
|
- <div v-else class="list-part-add-batch">
|
|
|
- <p class="list-part-hint" style="color:red; margin-bottom: 15px;">在选择部件名称后会自动增加新行。</p>
|
|
|
- <el-table
|
|
|
- :data="partAddRows"
|
|
|
- border
|
|
|
- style="width: 100%;"
|
|
|
- >
|
|
|
- <el-table-column label="部件序号" width="120" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件序号" disabled placeholder="部件序号" style="width: 80px;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件编号" width="150">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件名称" min-width="200">
|
|
|
- <template #default="{ row, $index }">
|
|
|
- <el-select
|
|
|
- v-model="row.部件名称"
|
|
|
- placeholder="请选择或输入部件名称"
|
|
|
- filterable
|
|
|
- allow-create
|
|
|
- reserve-keyword
|
|
|
- clearable
|
|
|
- style="width: 100%;"
|
|
|
- @change="onPartNameChange($index)"
|
|
|
- >
|
|
|
- <el-option
|
|
|
- v-for="opt in partNameOptions"
|
|
|
- :key="opt"
|
|
|
- :label="opt"
|
|
|
- :value="opt"
|
|
|
- />
|
|
|
- </el-select>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件类型" width="150">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="部件备注" min-width="150">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作" width="80" align="center">
|
|
|
- <template #default="{ $index }">
|
|
|
- <el-button
|
|
|
- type="danger"
|
|
|
- size="small"
|
|
|
- @click="removePartRow($index)"
|
|
|
- :disabled="partAddRows.length <= 1"
|
|
|
- >
|
|
|
- 移除
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer" style="text-align: right;">
|
|
|
- <el-button @click="partAddCloseDialog">取消</el-button>
|
|
|
- <el-button type="primary" @click="partAddConfirm">{{ partIsEdit ? '保存' : '确定' }}</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 新增工艺资料弹窗 -->
|
|
|
- <el-dialog
|
|
|
- v-model="processAddDialogVisible"
|
|
|
- :title="processIsEdit ? '修改工艺' : '新增工艺'"
|
|
|
- :width="'min(1280px, 90vw)'"
|
|
|
- align-center
|
|
|
- destroy-on-close
|
|
|
- append-to-body
|
|
|
- :class="['list-unified-dialog', 'list-process-add-dialog']"
|
|
|
- @closed="resetProcessLibForm"
|
|
|
- >
|
|
|
- <div v-if="_Gd_gdbh" class="list-dialog-context-header">
|
|
|
- <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
|
|
|
- <tbody>
|
|
|
- <tr>
|
|
|
- <th scope="row">订单编号</th>
|
|
|
- <td>{{ _Gd_gdbh }}</td>
|
|
|
- </tr>
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </div>
|
|
|
- <p class="list-process-add-split-hint">
|
|
|
- <strong>车缝工艺选部件</strong>,工艺与部件绑定;<strong>其余工序工艺不选部件</strong>。选择查询工艺名称后自动带出标准工时、标准工分。
|
|
|
- </p>
|
|
|
- <div class="list-process-add-scroll-body">
|
|
|
- <div class="list-process-add-split">
|
|
|
- <div class="list-process-add-sidebar">
|
|
|
- <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
|
|
|
- <div class="list-process-add-part-list list-process-add-stage-list">
|
|
|
- <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="st">
|
|
|
- <div
|
|
|
- class="list-process-add-stage-item"
|
|
|
- :class="{
|
|
|
- 'is-active':
|
|
|
- processAddSelectedStage === st && (st !== '车缝' || !processAddPartList.length),
|
|
|
- }"
|
|
|
- @click="onProcessAddSelectStage(st)"
|
|
|
- >
|
|
|
- {{ st }}
|
|
|
- </div>
|
|
|
- <div
|
|
|
- v-if="st === '车缝' && processAddPartList.length"
|
|
|
- class="list-process-add-sewing-nest"
|
|
|
- >
|
|
|
- <div
|
|
|
- v-for="(part, pi) in processAddPartList"
|
|
|
- :key="processAddPartBlockKey(part, pi)"
|
|
|
- class="list-process-add-part-item list-process-add-part-item--nest"
|
|
|
- :class="{
|
|
|
- 'is-active':
|
|
|
- processAddSelectedStage === '车缝' &&
|
|
|
- processAddSelectedPartKey === processAddPartBlockKey(part, pi),
|
|
|
- }"
|
|
|
- @click.stop="onProcessAddSelectSewingPart(part, pi)"
|
|
|
- >
|
|
|
- <div class="list-process-add-part-item-text">
|
|
|
- <span class="list-process-add-part-sort">序号 {{ part.part_sort ?? part['部件序号'] ?? '—' }}</span>
|
|
|
- <span
|
|
|
- class="list-process-add-part-name"
|
|
|
- :title="String(part.part_name ?? part['部件名称'] ?? '')"
|
|
|
- >
|
|
|
- {{ part.part_name ?? part['部件名称'] ?? '—' }}
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="list-process-add-main-panel">
|
|
|
- <template v-if="processAddCurrentRowKey">
|
|
|
- <div v-if="processAddSelectedStage !== '车缝'" class="list-process-add-main-head">
|
|
|
- 当前工序:<strong>{{ processAddSelectedStage }}</strong>
|
|
|
- <span class="list-process-add-main-head-sub">(不关联部件)</span>
|
|
|
- </div>
|
|
|
- <div v-else class="list-process-add-main-head">
|
|
|
- 车缝 · 当前部件:<strong>{{
|
|
|
- processAddActivePart?.part_name ?? processAddActivePart?.['部件名称'] ?? '—'
|
|
|
- }}</strong>
|
|
|
- <span class="list-process-add-main-head-sub">
|
|
|
- (序号 {{ processAddActivePart?.part_sort ?? processAddActivePart?.['部件序号'] ?? '—' }})
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- <div class="list-process-add-table-wrap">
|
|
|
- <el-table
|
|
|
- :data="processAddByPartRows[processAddCurrentRowKey] ?? []"
|
|
|
- border
|
|
|
- class="list-process-add-table"
|
|
|
- :row-key="(row) => row._key"
|
|
|
- :height="processAddDialogTableHeight"
|
|
|
- >
|
|
|
- <el-table-column label="工艺序号" width="120" align="center" header-align="center">
|
|
|
- <template #default="{ row }">
|
|
|
- <span class="list-serial-cell-text">{{ row['工艺序号'] || '—' }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="工艺名称" min-width="200">
|
|
|
- <template #default="{ row, $index }">
|
|
|
- <el-select
|
|
|
- v-model="row['工艺名称']"
|
|
|
- class="list-lib-name-select"
|
|
|
- popper-class="process-lib-select-dropdown"
|
|
|
- placeholder="请选择或输入工艺名称"
|
|
|
- filterable
|
|
|
- remote
|
|
|
- reserve-keyword
|
|
|
- allow-create
|
|
|
- default-first-option
|
|
|
- clearable
|
|
|
- :remote-method="onProcessLibSelectFilter"
|
|
|
- @visible-change="onProcessLibSelectVisible"
|
|
|
- @change="onProcessLibNameSelectChangeForPart(processAddCurrentRowKey, $index)"
|
|
|
- >
|
|
|
- <el-option
|
|
|
- v-for="opt in filteredProcessLibNameOptionsForProcessAdd"
|
|
|
- :key="opt.value"
|
|
|
- :label="opt.value"
|
|
|
- :value="opt.value"
|
|
|
- >
|
|
|
- <div class="process-lib-opt-two-col">
|
|
|
- <span class="process-lib-opt-name" :title="String(opt.value)">{{ opt.value }}</span>
|
|
|
- <span class="process-lib-opt-stage">{{ processLibOptStageText(opt) }}</span>
|
|
|
- </div>
|
|
|
- </el-option>
|
|
|
- </el-select>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="生产工序" min-width="120" show-overflow-tooltip>
|
|
|
- <template #default="{ row }">
|
|
|
- <span class="list-process-cell-plain">{{ row['生产工序'] || '—' }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="标准工时" width="118">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input-number v-model="row['标准工时']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="标准工分" width="118">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input-number v-model="row['标准工分']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="难度系数" width="110">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-input-number
|
|
|
- v-model="row['难度系数']"
|
|
|
- :min="0"
|
|
|
- :precision="2"
|
|
|
- :step="0.1"
|
|
|
- controls-position="right"
|
|
|
- style="width: 100%"
|
|
|
- />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作" width="72" align="center">
|
|
|
- <template #default="{ row, $index }">
|
|
|
- <el-button
|
|
|
- type="danger"
|
|
|
- link
|
|
|
- size="small"
|
|
|
- @click="removeProcessLibRowForPart(processAddCurrentRowKey, row, $index)"
|
|
|
- >
|
|
|
- 移除
|
|
|
- </el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <template v-else-if="processAddSelectedStage === '车缝' && !processAddPartList.length">
|
|
|
- <el-empty
|
|
|
- description="车缝需先有部件。请先在「部件资料」中新增部件后再编辑车缝工艺"
|
|
|
- :image-size="72"
|
|
|
- class="list-process-add-main-empty"
|
|
|
- />
|
|
|
- </template>
|
|
|
- <el-empty
|
|
|
- v-else
|
|
|
- description="请在左侧选择生产工序;车缝时请选择具体部件"
|
|
|
- :image-size="72"
|
|
|
- class="list-process-add-main-empty"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="list-process-meta">将提交 {{ processLibAddSubmitCount }} 条</div>
|
|
|
- <template #footer>
|
|
|
- <el-button @click="processAddCloseDialog">取消</el-button>
|
|
|
- <el-button type="primary" :loading="processSubmitLoading" @click="processAddConfirm">确定</el-button>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 部件与工艺排序弹窗 -->
|
|
|
- <el-dialog
|
|
|
- v-model="sortPartGyDialogVisible"
|
|
|
- title="调整部件 / 工艺序号排序"
|
|
|
- :width="'min(1280px, 90vw)'"
|
|
|
- :max-height="'85vh'"
|
|
|
- align-center
|
|
|
- destroy-on-close
|
|
|
- append-to-body
|
|
|
- :class="['list-unified-dialog', 'list-process-add-dialog', 'sort-part-gy-dialog']"
|
|
|
- @closed="onSortPartGyDialogClosed"
|
|
|
- >
|
|
|
- <div v-if="_Gd_gdbh" class="list-dialog-context-header">
|
|
|
- <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
|
|
|
- <tbody>
|
|
|
- <tr>
|
|
|
- <th scope="row">订单编号</th>
|
|
|
- <td>{{ _Gd_gdbh }}</td>
|
|
|
- </tr>
|
|
|
- </tbody>
|
|
|
- </table>
|
|
|
- </div>
|
|
|
- <div class="sort-part-gy-hint" role="note">
|
|
|
- <ul class="sort-part-gy-hint-list">
|
|
|
- <li>
|
|
|
- <strong>左侧</strong>:与「新增工艺」一致,一级为生产工序(裁剪 → 车缝 → 手工 → 大烫 → 总检);仅<strong>车缝</strong>下可拖拽调整部件先后,点击部件后右侧排该车缝工艺。
|
|
|
- </li>
|
|
|
- <li>
|
|
|
- <strong>非车缝工序</strong>:点选后右侧为该工单下、不关联部件的工艺;<strong>右侧工艺表</strong>可拖拽「拖」列、改工艺名等。
|
|
|
- </li>
|
|
|
- <li>
|
|
|
- <strong>保存</strong>:按当前顺序重编部件号与工艺号,并提交变更。
|
|
|
- </li>
|
|
|
- </ul>
|
|
|
- </div>
|
|
|
- <div v-loading="sortDialogLoading" class="sort-part-gy-body">
|
|
|
- <template v-if="!sortDialogLoading && !sortDialogHasData">
|
|
|
- <el-empty description="当前工单下暂无工艺数据" />
|
|
|
- </template>
|
|
|
- <div v-else class="sort-part-gy-split list-process-add-split">
|
|
|
- <div class="list-process-add-sidebar sort-gy-left-nav">
|
|
|
- <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
|
|
|
- <div class="list-process-add-part-list list-process-add-stage-list list-sort-gy-nav-list">
|
|
|
- <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="'sort-nav-' + st">
|
|
|
- <div
|
|
|
- class="list-process-add-stage-item"
|
|
|
- :class="{
|
|
|
- 'is-active': sortDialogViewStage === st && (st !== '车缝' || !sortDialogSewingGroups.length),
|
|
|
- }"
|
|
|
- @click="onSortDialogViewStageSelect(st)"
|
|
|
- >
|
|
|
- {{ st }}
|
|
|
- </div>
|
|
|
- <div
|
|
|
- v-if="st === '车缝' && sortDialogSewingGroups.length"
|
|
|
- class="list-process-add-sewing-nest list-sort-gy-sewing-parts"
|
|
|
- >
|
|
|
- <div
|
|
|
- v-for="(sg, spi) in sortDialogSewingGroups"
|
|
|
- :key="String(sg.part?.id ?? `sg-${spi}`)"
|
|
|
- class="list-process-add-part-item list-process-add-part-item--nest sort-part-gy-part-item"
|
|
|
- :class="{
|
|
|
- 'is-active':
|
|
|
- sortDialogViewStage === '车缝' &&
|
|
|
- sortDialogSelectedPartId != null &&
|
|
|
- String(sortDialogSelectedPartId) === String(sg.part?.id),
|
|
|
- }"
|
|
|
- title="拖拽或点击"
|
|
|
- @click.stop="onSortDialogSelectSewingPart(sg.part?.id)"
|
|
|
- >
|
|
|
- <span class="sort-part-gy-part-item-grip" aria-hidden="true">
|
|
|
- <el-icon><Rank /></el-icon>
|
|
|
- </span>
|
|
|
- <div class="list-process-add-part-item-text">
|
|
|
- <span class="list-process-add-part-sort">序号 {{ sg.part?.part_sort ?? '—' }}</span>
|
|
|
- <span
|
|
|
- class="list-process-add-part-name"
|
|
|
- :title="String(sg.part?.部件名称 ?? '')"
|
|
|
- >
|
|
|
- {{ sg.part?.部件名称 ?? '—' }}
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <div class="sort-part-gy-main-panel">
|
|
|
- <template v-if="sortDialogViewStage && sortDialogRightPanelReady">
|
|
|
- <div v-if="sortDialogViewStage !== '车缝'" class="sort-part-gy-main-head list-process-add-main-head">
|
|
|
- 当前工序:<strong>{{ sortDialogViewStage }}</strong>
|
|
|
- <span class="list-process-add-main-head-sub">(不关联部件)</span>
|
|
|
- </div>
|
|
|
- <div v-else-if="sortDialogRightActiveSewingGroup" class="sort-part-gy-main-head list-process-add-main-head">
|
|
|
- 车缝 · 当前部件:<strong>{{
|
|
|
- sortDialogRightActiveSewingGroup.part?.部件名称 ?? '—'
|
|
|
- }}</strong>
|
|
|
- <span class="list-process-add-main-head-sub">
|
|
|
- (序号 {{ sortDialogRightActiveSewingGroup.part?.part_sort ?? '—' }})
|
|
|
- </span>
|
|
|
- </div>
|
|
|
- <div v-else class="sort-part-gy-main-head list-process-add-main-head--warn">请在「车缝」下选择一个部件,或先维护部件资料。</div>
|
|
|
- <el-table
|
|
|
- v-if="sortDialogActiveGysList.length"
|
|
|
- :data="sortDialogActiveGysList"
|
|
|
- border
|
|
|
- size="small"
|
|
|
- class="sort-gy-table"
|
|
|
- :row-key="(row) => String(row.id ?? `${row.gy_sort}-${row.gy_name}`)"
|
|
|
- >
|
|
|
- <el-table-column width="44" align="center" fixed="left">
|
|
|
- <template #header><span class="sort-drag-col-hint">拖</span></template>
|
|
|
- <template #default>
|
|
|
- <span class="sort-drag-handle" title="拖拽调整工艺顺序">
|
|
|
- <el-icon><Rank /></el-icon>
|
|
|
- </span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="工艺序号" width="88" align="center">
|
|
|
- <template #default="{ row: r }"> {{ r.gy_sort ?? r['工艺序号'] ?? '—' }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="工艺名称" min-width="220">
|
|
|
- <template #default="{ row: r }">
|
|
|
- <span :title="r['工艺名称'] || ''">{{ r['工艺名称'] || '—' }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="标准工时" width="100" align="center">
|
|
|
- <template #default="{ row: r }"> {{ r['标准工时'] || '—' }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="标准工分" width="100" align="center">
|
|
|
- <template #default="{ row: r }"> {{ r['标准公分'] || r['标准工分'] || '—' }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="难度系数" width="120" align="center">
|
|
|
- <template #default="{ row: r }"> {{ r['系数'] || r['难度系数'] || '—' }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="生产工序" width="100" align="center" prop="big_process" show-overflow-tooltip />
|
|
|
- </el-table>
|
|
|
- <el-empty
|
|
|
- v-else
|
|
|
- :description="sortDialogViewStage === '车缝' ? '该部件下暂无车缝工艺' : '该工序下暂无工艺'"
|
|
|
- :image-size="64"
|
|
|
- class="sort-part-gy-main-empty"
|
|
|
- />
|
|
|
- </template>
|
|
|
- <el-empty
|
|
|
- v-else
|
|
|
- description="请先在左侧选择生产工序,车缝时请选择具体部件"
|
|
|
- :image-size="72"
|
|
|
- class="sort-part-gy-main-empty"
|
|
|
- />
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- </div>
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer" style="text-align: right;">
|
|
|
- <el-button @click="sortCloseDialog">取 消</el-button>
|
|
|
- <el-button type="primary" :loading="sortDialogSubmitLoading" @click="submitSortPartGy">保存排序</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 附件上传 -->
|
|
|
- <el-dialog v-model="jsfjdialogFormVisible" :before-close="jsfjcloseDialog"
|
|
|
- style="margin-top: 40px" height="500px" width="700px" destroy-on-close>
|
|
|
- <el-form :model="jsfjformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
|
|
|
- <el-row :gutter="24">
|
|
|
- <el-col :span="10">
|
|
|
- <div style="display: flex; gap: 0px;">
|
|
|
- <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号 {{_ddhval}}</h3>
|
|
|
- </div>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <br />
|
|
|
- <el-row :gutter="24">
|
|
|
- <el-col :span="16">
|
|
|
- <el-form-item label="附件备注:" prop="address" class="mab">
|
|
|
- <el-select v-model="jsfjformdata.附件备注" placeholder="请选择附件类型" id="附件备注">
|
|
|
- <el-option label="订单附件" value="订单资料附件"></el-option>
|
|
|
- <el-option label="技术附件" value="技术附件"></el-option>
|
|
|
- <el-option label="发货单附件" value="发货单附件"></el-option>
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- </el-row>
|
|
|
- <br>
|
|
|
- <el-row :gutter="24">
|
|
|
- <!-- <el-col :span="8">
|
|
|
- <br>
|
|
|
- <p>s</p>
|
|
|
- </el-col> -->
|
|
|
- <el-col :span="12">
|
|
|
- <!-- <br> -->
|
|
|
- <el-form-item label="附件备注:" prop="address" class="mab">
|
|
|
- <input style="font-size:16px;" type="file" @change="uploadExcel" >
|
|
|
- </el-form-item>
|
|
|
- </el-col>
|
|
|
- <!-- <el-col :span="4">
|
|
|
- <br>
|
|
|
- <el-button @click="yulan">预览</el-button>
|
|
|
- </el-col> -->
|
|
|
- </el-row>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
- <br>
|
|
|
- <div class="dialog-footer">
|
|
|
- <el-button @click="jsfjcloseDialog">取 消</el-button>
|
|
|
- <el-button type="primary" @click="jsfjenterDialog">确 定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 复制工艺资料弹窗 -->
|
|
|
- <el-dialog v-model="copyProductDialogVisible" title="复制工艺资料">
|
|
|
- <div style=" padding: 0px; align-items: center; display: flex; flex-wrap: wrap;">
|
|
|
- <el-form-item label="当前订单" prop="processName" class="mab">
|
|
|
- <el-input v-model="copyProductFormData['gdbh']" disabled style="width: 150px;" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="生产款号" prop="生产款号" class="mab">
|
|
|
- <el-input v-model="copyProductFormData['生产款号']" disabled style="width: 200px;" />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="搜索订单" prop="processName" class="mab" style="width: 50%;">
|
|
|
- <el-input v-model="copyProductSearchText" placeholder="请输入订单编号或生产款号搜索" style="width: 70%;" @keydown.enter.prevent="copyProductSearch" />
|
|
|
- <el-button type="primary" @click="copyProductSearch" style="margin-left: 10px;">搜索</el-button>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item prop="processName" class="mab" style="width: 100%;">
|
|
|
- <span style="color:red">请选择要复制工艺的源订单</span>
|
|
|
- </el-form-item>
|
|
|
- </div>
|
|
|
- <div slot="footer" class="dialog-footer" style="text-align: right;margin-left: 25%">
|
|
|
- <el-button @click="copyProductHandleCancel">放弃</el-button>
|
|
|
- <el-button type="primary" @click="copyProductHandleConfirm" :disabled="!copyProductSelectedRow">复制</el-button>
|
|
|
- </div>
|
|
|
- <el-table ref="copyProductTableRef"
|
|
|
- :show-overflow-tooltip="true"
|
|
|
- :row-style="{ height: '0px' }"
|
|
|
- :cell-style="{ padding: '0px' }"
|
|
|
- :header-row-style="{ height: '0px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- @row-click="copyProductTableRowClick"
|
|
|
- highlight-current-row="true"
|
|
|
- style="width: 100%;height: 30vh;" border tooltip-effect="dark"
|
|
|
- :data="copyProductTableData" row-key="订单编号">
|
|
|
- <el-table-column align="left" label="订单编号" width="120">
|
|
|
- <template v-slot="{ row }"><span>{{ row.订单编号 }}</span></template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column align="left" label="生产款号" width="200">
|
|
|
- <template v-slot="{ row }"><span>{{ row.生产款号 }}</span></template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column align="left" label="客户编号" width="100">
|
|
|
- <template v-slot="{ row }"><span>{{ row.客户编号 }}</span></template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column align="left" label="款式" width="150">
|
|
|
- <template v-slot="{ row }"><span>{{ row.款式 }}</span></template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 面料库存弹窗 -->
|
|
|
- <el-dialog v-model="mlinventoryVisible" :before-close="mlcloseDialog" title="面料库存出入库记录"
|
|
|
- style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
|
|
|
- <el-form :model="mlformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
|
|
|
- <el-table
|
|
|
- ref="table"
|
|
|
- highlight-current-row
|
|
|
- show-overflow-tooltip
|
|
|
- border
|
|
|
- :data="historytableData"
|
|
|
- :row-style="{ height: '25px' }"
|
|
|
- :cell-style="{ padding: '0px' }"
|
|
|
- :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- style="width: 100%;height: 75vh;" >
|
|
|
-
|
|
|
- <el-table-column label="订单编号" prop="订单编号"width="110" ></el-table-column>
|
|
|
- <el-table-column label="面料" prop="面料" width="110"></el-table-column>
|
|
|
- <el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
|
|
|
- <el-table-column label="入库数量" prop="入库数量" width="110"></el-table-column>
|
|
|
- <el-table-column label="出库数量" prop="出库数量" width="110"></el-table-column>
|
|
|
- <el-table-column label="领料部门" prop="领料部门" width="110"></el-table-column>
|
|
|
- <el-table-column label="领料时间" prop="领料时间" width="110"></el-table-column>
|
|
|
- </el-table>
|
|
|
- <br>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
- <br>
|
|
|
- <div class="dialog-footer">
|
|
|
- <el-button @click="mlcloseDialog">取 消</el-button>
|
|
|
- <el-button type="primary" @click="mlenterDialog">确 定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
-
|
|
|
- <!-- 发货单页面 -->
|
|
|
-
|
|
|
- <el-dialog v-model="InvoiceVisible" :before-close="InvoiceDialog" title="AI获取发货单出货信息"
|
|
|
- style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
|
|
|
-
|
|
|
- <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号 {{_ddhval}} {{_mesval}}</h3>
|
|
|
-
|
|
|
- <el-table
|
|
|
- ref="table" highlight-current-row
|
|
|
- show-overflow-tooltip border
|
|
|
- :data="InvoicetableData"
|
|
|
- :row-style="{ height: '25px' }"
|
|
|
- :cell-style="{ padding: '0px' }"
|
|
|
- :header-row-style="{ height: '20px' }"
|
|
|
- :header-cell-style="{ padding: '0px' }"
|
|
|
- style="width: 100%;height: 65vh;" >
|
|
|
-
|
|
|
- <el-table-column label="子订单编号" prop="子订单编号" width="160"></el-table-column>
|
|
|
- <el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
|
|
|
- <el-table-column label="尺码" prop="尺码" width="110"></el-table-column>
|
|
|
- <el-table-column label="制单数量" prop="制单数量" width="110"></el-table-column>
|
|
|
- <el-table-column label="发货箱数" prop="发货箱数" width="110">
|
|
|
- <template #default="scope">
|
|
|
- <el-input
|
|
|
- v-model="scope.row.发货箱数"
|
|
|
- size="mini"
|
|
|
- @change="handleQuantityChange(scope.row)"
|
|
|
- @blur="handleQuantityBlur(scope.row)"
|
|
|
- placeholder="请输入数量"
|
|
|
- />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="每箱件数" prop="每箱件数" width="110">
|
|
|
- <template #default="scope">
|
|
|
- <el-input
|
|
|
- v-model="scope.row.每箱件数"
|
|
|
- size="mini"
|
|
|
- @change="handleQuantityChange(scope.row)"
|
|
|
- @blur="handleQuantityBlur(scope.row)"
|
|
|
- placeholder="请输入数量"
|
|
|
- />
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="发货数量" prop="发货数量" width="110"></el-table-column>
|
|
|
- </el-table>
|
|
|
-
|
|
|
- <template #footer>
|
|
|
- <br>
|
|
|
- <div class="dialog-footer">
|
|
|
- <el-button @click="InvoiceDialog">取 消</el-button>
|
|
|
- <el-button type="primary" @click="InvoiceenterDialog">确 定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
-
|
|
|
- </el-main>
|
|
|
- </layout-content>
|
|
|
- </layout>
|
|
|
- </layout>
|
|
|
-
|
|
|
- <!-- 打印订单表预览 -->
|
|
|
- <PrintPage ref="printPageRef" />
|
|
|
- <!-- 子订单详情页 -->
|
|
|
- <luckyexcelPage ref="luckyexcelPageRef" />
|
|
|
-
|
|
|
- <!-- 工序产量核查 -->
|
|
|
- <el-dialog
|
|
|
- v-model="processProductionVisible"
|
|
|
- width="100%"
|
|
|
- style="height: 100%;margin: 0px;"
|
|
|
- top="2vh"
|
|
|
- :close-on-click-modal="true"
|
|
|
- :show-close="false"
|
|
|
- destroy-on-close
|
|
|
- class="process-production-dialog"
|
|
|
- >
|
|
|
- <template #header>
|
|
|
- <div class="process-production-dialog-header">
|
|
|
- <span class="process-production-dialog-title">工序产量核查</span>
|
|
|
- <el-button
|
|
|
- type="danger"
|
|
|
- size="small"
|
|
|
- class="process-production-dialog-close"
|
|
|
- @click="processProductionVisible = false"
|
|
|
- >
|
|
|
- 关闭
|
|
|
- </el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <ProcessProduction
|
|
|
- :key="processProductionDialogKey"
|
|
|
- :initial-workorder="processProductionWorkorder"
|
|
|
- in-dialog
|
|
|
- hide-amount-columns
|
|
|
- />
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- <!-- 导入工艺资料弹窗 -->
|
|
|
- <el-dialog
|
|
|
- title="导入工艺资料"
|
|
|
- v-model="importProcessDialogVisible"
|
|
|
- width="400px"
|
|
|
- :close-on-click-modal="false"
|
|
|
- destroy-on-close
|
|
|
- >
|
|
|
- <el-form :model="importProcessForm" label-width="100px">
|
|
|
- <el-form-item label="订单编号">
|
|
|
- <el-input v-model="importProcessForm.workorderNo" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="款号">
|
|
|
- <el-input v-model="importProcessForm.styleNo" disabled />
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="Excel文件">
|
|
|
- <el-upload
|
|
|
- ref="importProcessUploadRef"
|
|
|
- class="upload-demo import-process-upload"
|
|
|
- action="#"
|
|
|
- :auto-upload="false"
|
|
|
- :show-file-list="true"
|
|
|
- :file-list="importProcessFileList"
|
|
|
- accept=".xlsx,.xls"
|
|
|
- :on-change="handleImportProcessFileChange"
|
|
|
- :on-remove="handleImportProcessFileRemove"
|
|
|
- :before-upload="beforeImportProcessUpload"
|
|
|
- list-type="text"
|
|
|
- >
|
|
|
- <el-button type="primary" icon="upload">选择文件</el-button>
|
|
|
- </el-upload>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
- <div class="dialog-footer">
|
|
|
- <el-button @click="closeImportProcessDialog">取 消</el-button>
|
|
|
- <el-button type="primary" @click="submitImportProcess">确 定</el-button>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
-
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- <script>
|
|
|
- //点击按钮显示下方表格
|
|
|
- export default {
|
|
|
- data() {
|
|
|
- return {
|
|
|
- currentTable: '', // 当前展示的表格
|
|
|
- activeName: 'first',
|
|
|
- _ddhval:'',
|
|
|
- size: '',
|
|
|
- add_gddialogFormVisible: true,
|
|
|
- };
|
|
|
- }
|
|
|
- };
|
|
|
- </script>
|
|
|
-
|
|
|
- <script setup>
|
|
|
- // 全量引入格式化工具 请按需保留
|
|
|
- import $script from 'scriptjs'
|
|
|
- import $ from 'jquery';
|
|
|
- import LuckyExcel from 'luckyexcel';
|
|
|
- import { toRaw } from 'vue';
|
|
|
- import { Layout, LayoutSider, LayoutContent } from '@arco-design/web-vue';
|
|
|
- import { ElMessage, ElMessageBox, ElUpload, ElButton, ElLoading } from 'element-plus'
|
|
|
- // 生产环境为按需引入,手动 import 组件不会带样式;补全 Upload,避免 picture-card 退化成原生「选择文件」
|
|
|
- import 'element-plus/es/components/upload/style/css'
|
|
|
- import 'element-plus/es/components/button/style/css'
|
|
|
- import 'element-plus/es/components/image-viewer/style/css'
|
|
|
- import { Plus } from '@element-plus/icons-vue'
|
|
|
- import { ref, reactive, computed, nextTick, watch, onMounted, onBeforeUnmount, isRef } from 'vue'
|
|
|
- import axios from 'axios';
|
|
|
- import * as XLSX from 'xlsx';
|
|
|
- import jsPDF from 'jspdf';
|
|
|
- import 'vxe-table/lib/style.css';
|
|
|
- import { VxeTable, VxeColumn } from 'vxe-table';
|
|
|
- import Sortable from '@/utils/vendor/sortable.esm.js'
|
|
|
- import {Datalist,WorkOrderList,WorkOrderAdd,PrintListData,
|
|
|
- printDetailAdd,PrintDetailDel,orderDataDel,getWorkOrder,
|
|
|
- getSuborder,PrintDataEdit,WorkOrderEdit,gdAnnexAdd,upload,OrderAttachments,
|
|
|
- getPonumber,FabricEdit,orderBomList,FabricDetail,fabricList,Bomdel,delfujian,Read_File,Read_Add,PartList,GetProcessList,
|
|
|
- AddPart,UpdatePartInfo,DeletePart,AddProcess,UpdateProcess,DeleteProcess,getproducttype,workorderprocessCopy,sortProcess,getProductStyleList,copyProcessToCurrentWorkOrder,
|
|
|
- importProcess,getWorkOrderProcess,updateWorkOrderPlanManufacture,checkProcessReport,confirmProcessSplit,updateOrderRemarkAndFinishDate} from '@/api/mes/job'
|
|
|
- import {ParList,ProcessList} from '@/api/yunyin/product'
|
|
|
- import PrintPage from './components/print.vue'
|
|
|
- import luckyexcelPage from './components/luckyexcel.vue'
|
|
|
- import AddGongYi from './components/addGongYi.vue'
|
|
|
- import ProcessProduction from '@/view/SalaryManage/ProcessProduction.vue'
|
|
|
- import { ensureProcessProductionData } from '@/utils/processProductionDialog'
|
|
|
- import { useUserStore } from '@/pinia/modules/user';
|
|
|
- defineOptions({name: 'Company'})
|
|
|
- //定义打印跳转页面
|
|
|
- const printPageRef = ref()
|
|
|
- const luckyexcelPageRef = ref()
|
|
|
- //获取登录用户信息
|
|
|
- const userStore = useUserStore()
|
|
|
- const _username = ref('')
|
|
|
- _username.value = userStore.userInfo.userName + '/' + userStore.userInfo.nickName
|
|
|
- console.log('获取用户名称',_username.value)
|
|
|
- //全局获取当前日期
|
|
|
- const today = new Date();
|
|
|
- const year = today.getFullYear();
|
|
|
- const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从 0 开始,需要补零
|
|
|
- const day = String(today.getDate()).padStart(2, '0');
|
|
|
- const hours = String(today.getHours()).padStart(2, '0');
|
|
|
- const minutes = String(today.getMinutes()).padStart(2, '0');
|
|
|
- const seconds = String(today.getSeconds()).padStart(2, '0');
|
|
|
- const currentDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
- const currentDates = `${year}-${month}-${day}`;
|
|
|
-
|
|
|
- //==============图片上传=============
|
|
|
- //测试环境前端
|
|
|
- // const uploadUrl = ref('http://mes-dacheng-api:8083/index.php/api/work_order/ImgUpload')
|
|
|
-
|
|
|
- // 获取环境变量
|
|
|
- const basePath = import.meta.env.VITE_BASE_PATH;
|
|
|
- const uploadsPort = import.meta.env.VITE_UPLOADS_PORT;
|
|
|
- // 动态生成路径
|
|
|
- let path = basePath && uploadsPort ? `${basePath}:${uploadsPort}` : undefined;
|
|
|
- // 如果 path 是 undefined,则使用默认地址
|
|
|
- if (!path || path.includes("undefined")) {
|
|
|
- console.log("第一路径获取失败,尝试使用备用地址 http://192.168.28.22:8082");
|
|
|
- path = "http://192.168.28.22:8082";
|
|
|
- }
|
|
|
- // 如果还是 undefined,再降级到本地地址
|
|
|
- if (path.includes("undefined")) {
|
|
|
- console.log("备用地址获取失败,使用本地地址 http://127.0.0.1:58082");
|
|
|
- path = "http://127.0.0.1:58082";
|
|
|
- }
|
|
|
- console.log("最终获取地址:", path);
|
|
|
-
|
|
|
- /** 将接口返回的相对路径 img 转为可预览的完整 URL(与上传服务同源) */
|
|
|
- const buildFullImageUrl = (imgRel) => {
|
|
|
- if (!imgRel || typeof imgRel !== 'string') return '';
|
|
|
- const trimmed = imgRel.trim();
|
|
|
- if (/^https?:\/\//i.test(trimmed)) return trimmed;
|
|
|
- const base = String(path).replace(/\/$/, '');
|
|
|
- const rel = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
|
- return `${base}${rel}`;
|
|
|
- };
|
|
|
-
|
|
|
- // 上传的URL
|
|
|
- const uploadUrl = ref(`${path}/api/work_order/ImgUpload`);
|
|
|
- // const uploadUrl = ref("http://192.168.28.22:8082/api/work_order/ImgUpload");
|
|
|
- const uploadHeaders = { 'Content-Type': 'multipart/form-data' };
|
|
|
- const fileList = reactive([]);
|
|
|
- const uploadRef = ref(null);
|
|
|
-
|
|
|
- /** 根据 img 相对/绝对路径同步 el-upload 展示列表(修改订单回显图片) */
|
|
|
- const syncUploadFileList = (imgRel) => {
|
|
|
- fileList.splice(0, fileList.length);
|
|
|
- if (!imgRel || typeof imgRel !== 'string') return;
|
|
|
- const url = buildFullImageUrl(imgRel);
|
|
|
- if (!url) return;
|
|
|
- fileList.push({
|
|
|
- uid: Date.now(),
|
|
|
- name: imgRel.split('/').pop() || 'image.jpg',
|
|
|
- url,
|
|
|
- status: 'success',
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
- // 预览图片(页内放大,不新开标签页)
|
|
|
- const imgPreviewVisible = ref(false)
|
|
|
- const imgPreviewList = ref([])
|
|
|
- const handlePreview = (file) => {
|
|
|
- const previewUrl = file.url || buildFullImageUrl(file.response?.data?.data?.url)
|
|
|
- if (!previewUrl) {
|
|
|
- ElMessage.warning('暂无可预览的图片')
|
|
|
- return
|
|
|
- }
|
|
|
- imgPreviewList.value = [previewUrl]
|
|
|
- imgPreviewVisible.value = true
|
|
|
- }
|
|
|
- const closeImgPreview = () => {
|
|
|
- imgPreviewVisible.value = false
|
|
|
- imgPreviewList.value = []
|
|
|
- }
|
|
|
- // 移除图片
|
|
|
- const handleRemove = () => {
|
|
|
- fileList.splice(0, fileList.length);
|
|
|
- add_gdscgdformData.img = '';
|
|
|
- if (edit_ddformData.value) edit_ddformData.value.img = '';
|
|
|
- };
|
|
|
- // 上传错误处理
|
|
|
- const handleError = (err, file, fileList) => {
|
|
|
- console.error('上传失败:', err);
|
|
|
- ElMessage.error(`图片上传失败: ${err.message || '未知错误'}`);
|
|
|
- };
|
|
|
- // 上传前的检查与图片压缩
|
|
|
- const beforeUpload = (file) => {
|
|
|
- const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png';
|
|
|
- const isLt500K = file.size / 1024 < 500;
|
|
|
- if (!isJPGOrPNG) {
|
|
|
- ElMessage.error('上传图片只能是 JPG 或 PNG 格式!');
|
|
|
- return false;
|
|
|
- }
|
|
|
- if (!isLt500K) {
|
|
|
- ElMessage.error('上传图片大小不能超过 500KB!');
|
|
|
- return false;
|
|
|
- }
|
|
|
- // 图片格式和大小符合,压缩图片
|
|
|
- return new Promise((resolve, reject) => {
|
|
|
- const reader = new FileReader();
|
|
|
- reader.readAsDataURL(file);
|
|
|
- reader.onload = () => {
|
|
|
- const img = new Image();
|
|
|
- img.src = reader.result;
|
|
|
- img.onload = () => {
|
|
|
- const canvas = document.createElement('canvas');
|
|
|
- const ctx = canvas.getContext('2d');
|
|
|
- const fixedWidth = 300;
|
|
|
- const fixedHeight = 300;
|
|
|
- canvas.width = fixedWidth;
|
|
|
- canvas.height = fixedHeight;
|
|
|
- ctx.drawImage(img, 0, 0, fixedWidth, fixedHeight);
|
|
|
- canvas.toBlob((blob) => {
|
|
|
- const compressedFile = new File([blob], file.name, { type: file.type });
|
|
|
- resolve(compressedFile);
|
|
|
- }, file.type);
|
|
|
- };
|
|
|
- };
|
|
|
- reader.onerror = (error) => {
|
|
|
- ElMessage.error('图片处理失败');
|
|
|
- reject(error);
|
|
|
- };
|
|
|
- });
|
|
|
- };
|
|
|
- // 上传成功处理
|
|
|
- const handleSuccess = (response, file, fileList) => {
|
|
|
- console.log('上传成功:', response, file, fileList);
|
|
|
- };
|
|
|
- // 自定义上传逻辑
|
|
|
- const customUpload = async (options) => {
|
|
|
- try {
|
|
|
- const formData = new FormData();
|
|
|
- formData.append('image', options.file);
|
|
|
- const response = await axios.post(uploadUrl.value, formData, {
|
|
|
- headers: uploadHeaders,
|
|
|
- onUploadProgress: (progressEvent) => {
|
|
|
- options.onProgress({
|
|
|
- percent: Math.round((progressEvent.loaded * 100) / progressEvent.total),
|
|
|
- });
|
|
|
- },
|
|
|
- });
|
|
|
- if (response.data.code === 0) {
|
|
|
- const imgUrl = response.data.data.url;
|
|
|
- options.onSuccess(response.data);
|
|
|
- ElMessage.success('图片上传成功');
|
|
|
- add_gdscgdformData.img = imgUrl;
|
|
|
- if (edit_ddformData.value) edit_ddformData.value.img = imgUrl;
|
|
|
- syncUploadFileList(imgUrl);
|
|
|
- } else {
|
|
|
- throw new Error(response.data.msg);
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('上传失败:', error);
|
|
|
- options.onError(error);
|
|
|
- ElMessage.error(`上传失败: ${error.message}`);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // =========== 左侧树侧形结构 ===========
|
|
|
- const treeData = ref([])
|
|
|
- const tableData = ref([])
|
|
|
- const _Gd_khdh = ref(null)
|
|
|
- const defaultProps = {
|
|
|
- children: 'children',
|
|
|
- label: 'label'
|
|
|
- };
|
|
|
- const Datalistdata = async () => {
|
|
|
- try {
|
|
|
- const Datalists = await Datalist();
|
|
|
- console.log(Datalists)
|
|
|
- Datalists.data.forEach(id => {
|
|
|
- treeData.value.push({
|
|
|
- label: id,
|
|
|
- });
|
|
|
- });
|
|
|
- } catch (error) {
|
|
|
- console.error(error);
|
|
|
- }
|
|
|
- };
|
|
|
- Datalistdata();
|
|
|
-
|
|
|
- //点击左侧树形获取编号
|
|
|
- const handleNodeClick = async (node) => {
|
|
|
- ystableData.splice(0, ystableData.length);
|
|
|
- parttableData.splice(0, parttableData.length);
|
|
|
- gytableData.splice(0, gytableData.length);
|
|
|
- ddtableData.splice(0, ddtableData.length);
|
|
|
- jstableData.splice(0, jstableData.length);
|
|
|
- fhdtableData.splice(0, fhdtableData.length);
|
|
|
- // 取消所有节点的颜色
|
|
|
- const allNodes = document.querySelectorAll('.treecolor .el-tree-node');
|
|
|
- allNodes.forEach(node => {
|
|
|
- node.querySelector('.el-tree-node__label').style.color = '';
|
|
|
- });
|
|
|
- // 获取点击的节点 给当前点击的节点改变颜色【红色】
|
|
|
- const clickedNodeId = node['$treeNodeId'];
|
|
|
- const clickedNode = document.querySelector(`.treecolor .el-tree-node[data-key="${clickedNodeId}"]`);
|
|
|
- if (clickedNode) {
|
|
|
- clickedNode.querySelector('.el-tree-node__label').style.color = 'red';
|
|
|
- }
|
|
|
- ystableData.length = 0
|
|
|
- searchInfo.value = '';
|
|
|
- _Gd_khdh.value = node.label.split('【')[0];
|
|
|
- _WorkList_page();
|
|
|
- };
|
|
|
-
|
|
|
- const InvoiceVisible = ref(false)
|
|
|
- const InvoicetableData = ref([])
|
|
|
- const _mesval = ref('')
|
|
|
-
|
|
|
- const fahuodan = async(row)=>{
|
|
|
-
|
|
|
- const Read_Filelist = await Read_File({
|
|
|
- UniqId: row['UniqId'],
|
|
|
- order: row['关联编号'],
|
|
|
- url: path
|
|
|
- })
|
|
|
- if(Read_Filelist.code === 0){
|
|
|
- console.log(Read_Filelist)
|
|
|
- InvoiceVisible.value = true
|
|
|
- const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
- sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
|
|
|
- InvoicetableData.value = Read_Filelist.data
|
|
|
- _mesval.value = Read_Filelist.msg
|
|
|
- console.log(_mesval)
|
|
|
- }
|
|
|
- }
|
|
|
- //取消
|
|
|
- const InvoiceDialog = () => {
|
|
|
- InvoiceVisible.value = false
|
|
|
- }
|
|
|
-
|
|
|
- const InvoiceenterDialog = async() => {
|
|
|
- console.log(InvoicetableData.value)
|
|
|
- // InvoiceVisible.value = false
|
|
|
-
|
|
|
- const rawValueArray = InvoicetableData.value;
|
|
|
- const formattedData = rawValueArray
|
|
|
- .map(item => {
|
|
|
- return {
|
|
|
- sys_id: _username.value,
|
|
|
- 订单编号: item.订单编号,
|
|
|
- 子订单编号: item.子订单编号,
|
|
|
- 尺码: item.尺码,
|
|
|
- 制单数量: item.制单数量,
|
|
|
- 发货数量: item.发货数量,
|
|
|
- 发货箱数: item.发货箱数,
|
|
|
- 每箱件数: item.每箱件数
|
|
|
- }
|
|
|
- });
|
|
|
- console.log(formattedData);
|
|
|
- const Read_Addres = await Read_Add(formattedData)
|
|
|
- console.log(Read_Addres)
|
|
|
- if(Read_Addres.msg === '成功'){
|
|
|
- ElMessage({type: 'success',message: '处理成功'})
|
|
|
- InvoiceVisible.value = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 删除
|
|
|
- const deleteItem = async (row) => {
|
|
|
- console.log(_username.value.split('/')[1])
|
|
|
- console.log(row.sys_id.split('/')[1])
|
|
|
-
|
|
|
- const delfujian_del = await delfujian({UniqId:row['UniqId'],登录用户:_username.value.split('/')[1],建档用户:row.sys_id.split('/')[1]});
|
|
|
- if(delfujian_del.code === 0){
|
|
|
- ElMessage({type: 'success',message: '删除成功'})
|
|
|
- }else{
|
|
|
- ElMessage({type: 'error',message: '删除失败'})
|
|
|
- }
|
|
|
- tableRowClick (row)
|
|
|
- }
|
|
|
-
|
|
|
- const showPdf = async (row) => {
|
|
|
- luckyexcelPageRef.value.open(row)
|
|
|
- };
|
|
|
- //调用订单资料列表
|
|
|
- const _WorkList_page = async () => {
|
|
|
- console.log("page",page.value)
|
|
|
- console.log("pageSize",pageSize.value)
|
|
|
- try {
|
|
|
- //通过客户编号获取
|
|
|
- const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
|
|
|
- tableData.value = WorkListdata.data.data
|
|
|
- total.value = WorkListdata.data.total
|
|
|
- } catch (error) {
|
|
|
- console.error(error);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- //调用订单资料列表
|
|
|
- const page_WorkList_page = async () => {
|
|
|
- console.log("page",page.value)
|
|
|
- console.log("pageSize",pageSize.value)
|
|
|
- try {
|
|
|
- //通过客户编号获取
|
|
|
- const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
|
|
|
- tableData.value = WorkListdata.data.data
|
|
|
- total.value = WorkListdata.data.total
|
|
|
- } catch (error) {
|
|
|
- console.error(error);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- //============订单资料============
|
|
|
- //订单资料修改
|
|
|
- const ddzl_dialogFormVisible = ref(false)
|
|
|
- const edit_ddformData = ref({
|
|
|
- 合并: false,
|
|
|
- })
|
|
|
- // 双击订单表格
|
|
|
- const updateCompanyFunc = async (row) => {
|
|
|
- await getProductStyleData();
|
|
|
- if (row.water === '1') {
|
|
|
- edit_ddformData.value = { 合并: true };
|
|
|
- } else {
|
|
|
- edit_ddformData.value = { 合并: false };
|
|
|
- }
|
|
|
- Object.assign(edit_ddformData.value, row);
|
|
|
- ddzl_dialogFormVisible.value = true;
|
|
|
- await nextTick();
|
|
|
- syncUploadFileList(edit_ddformData.value.img);
|
|
|
- }
|
|
|
-
|
|
|
- // Sys_id 形如「账号/角色」,安全取「/」后一段,避免空值或格式异常导致白屏
|
|
|
- const getSysIdPart = (sysId) => {
|
|
|
- const parts = String(sysId ?? '').split('/')
|
|
|
- return parts.length > 1 ? parts[1] : ''
|
|
|
- }
|
|
|
-
|
|
|
- //订单资料修改确认
|
|
|
- const dd_edit_Dialog = async () => {
|
|
|
- const orderSysPart = getSysIdPart(edit_ddformData.value?.Sys_id)
|
|
|
- const userSysPart = getSysIdPart(_username.value)
|
|
|
- if (orderSysPart !== userSysPart && userSysPart !== '超级管理员') {
|
|
|
- return ElMessage({ type: 'error', message: '无法修改其他用户订单数据' })
|
|
|
- }
|
|
|
- //日期转换
|
|
|
- let lhrq_formattedDeliveryDate = '';
|
|
|
- if (edit_ddformData.value.落货日期) {
|
|
|
- const date = new Date(edit_ddformData.value.落货日期);
|
|
|
- lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
|
|
|
- }
|
|
|
- let params = {};
|
|
|
- params.订单编号 = edit_ddformData.value.订单编号
|
|
|
- params.生产款号 = edit_ddformData.value.生产款号
|
|
|
- params.客户编号 = edit_ddformData.value.客户编号
|
|
|
- params.款式 = edit_ddformData.value.款式
|
|
|
- params.箱唛要求 = edit_ddformData.value.箱唛要求
|
|
|
- params.面料 = edit_ddformData.value.面料
|
|
|
- params.要求 = edit_ddformData.value.要求
|
|
|
- params.船样描述 = edit_ddformData.value.船样描述
|
|
|
- params.船样合计 = edit_ddformData.value.船样合计
|
|
|
- params.粘衬 = edit_ddformData.value.粘衬
|
|
|
- params.订单数量 = edit_ddformData.value.订单数量
|
|
|
- params.单位 = edit_ddformData.value.单位
|
|
|
- params.接单日期 = edit_ddformData.value.接单日期
|
|
|
- params.落货日期 = lhrq_formattedDeliveryDate
|
|
|
- params.Sys_id = edit_ddformData.value.Sys_id
|
|
|
- params.id = edit_ddformData.value.Uniqid
|
|
|
- params.img = edit_ddformData.value.img
|
|
|
- console.log(params)
|
|
|
- try {
|
|
|
- const WorkOrderEdit_list = await WorkOrderEdit(params);
|
|
|
- if (WorkOrderEdit_list.code === 0) {
|
|
|
- ddzl_dialogFormVisible.value = false;
|
|
|
- _WorkList_page()
|
|
|
- ElMessage({ type: 'success', message: '修改成功' })
|
|
|
- } else {
|
|
|
- ElMessage({ type: 'error', message: WorkOrderEdit_list.msg || WorkOrderEdit_list.message || '修改失败' })
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error(error);
|
|
|
- const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '修改失败,请重试'
|
|
|
- ElMessage({ type: 'error', message: msg })
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //订单资料修改取消
|
|
|
- const dd_closeDialog = async () => {
|
|
|
- ddzl_dialogFormVisible.value = false;
|
|
|
- syncUploadFileList('');
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //=============颜色资料============
|
|
|
- //颜色资料修改
|
|
|
- const dialogFormVisible = ref(false)
|
|
|
- //尺码
|
|
|
- const edit_cmformdata = reactive({
|
|
|
- cm1:'',
|
|
|
- cm2:'',
|
|
|
- cm3:'',
|
|
|
- cm4:'',
|
|
|
- cm5:'',
|
|
|
- cm6:'',
|
|
|
- cm7:'',
|
|
|
- cm8:'',
|
|
|
- cm9:'',
|
|
|
- cm10:'',
|
|
|
- cm11:'',
|
|
|
- cm12:'',
|
|
|
- cm13:'',
|
|
|
- cm14:'',
|
|
|
- sctotal:'总计',
|
|
|
- });
|
|
|
- //制单数
|
|
|
- const edit_zdsformdata = reactive({
|
|
|
- zds1:'',
|
|
|
- zds2:'',
|
|
|
- zds3:'',
|
|
|
- zds4:'',
|
|
|
- zds5:'',
|
|
|
- zds6:'',
|
|
|
- zds7:'',
|
|
|
- zds8:'',
|
|
|
- zds9:'',
|
|
|
- zds10:'',
|
|
|
- zds11:'',
|
|
|
- zds12:'',
|
|
|
- zds13:'',
|
|
|
- zds14:'',
|
|
|
- zdtotal:'',
|
|
|
- });
|
|
|
- const Uniqid = ref('')//颜色资料Uniqid
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //颜色资料表格双击
|
|
|
- const ysupdateCompanyFunc = async (row) => {
|
|
|
- dialogFormVisible.value = true;
|
|
|
- edit_formData.value = { ...row };
|
|
|
- console.log(row)
|
|
|
- edit_formData['子订单编号'] = row['子订单编号']
|
|
|
- edit_formData['颜色备注'] = row['颜色备注']
|
|
|
- edit_formData['款号'] = row['款号']
|
|
|
- edit_formData['船样'] = row['船样']
|
|
|
- edit_formData['颜色'] = row['颜色']
|
|
|
- edit_colorcode.value =row['color_id']
|
|
|
- Uniqid.value = row['Uniqid']
|
|
|
- //获取色系名称列表
|
|
|
- const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
|
|
|
- getSuborderscolor.colorlist = getSuborders.data.colorlist;
|
|
|
- let index = 1;
|
|
|
- // 创建一个函数来构建尺码和数量的映射
|
|
|
- function buildSizeQuantitiesMap(sizes, formData) {
|
|
|
- const sizeQuantitiesMap = {};
|
|
|
- sizes.forEach(size => {
|
|
|
- // 使用逻辑或操作符确保所有尺码都有数量(默认为0,但如果有值则使用那个值)
|
|
|
- const quantity = formData[size] || 0;
|
|
|
- sizeQuantitiesMap[size] = quantity;
|
|
|
- });
|
|
|
- return sizeQuantitiesMap;
|
|
|
- }
|
|
|
- // 使用函数构建映射
|
|
|
- let sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);
|
|
|
- let edit_params = {};
|
|
|
- for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {
|
|
|
- edit_params[`cm${index}`] = size;
|
|
|
- edit_params[`cmsl${index++}`] = quantity;
|
|
|
- }
|
|
|
- for (let i = 1; i <= 14; i++) {
|
|
|
- edit_cmformdata[`cm${i}`] = edit_params[`cm${i}`] || '';
|
|
|
- edit_zdsformdata[`zds${i}`] = (edit_params[`cmsl${i}`] === 0 || edit_params[`cmsl${i}`] === null) ? '' : edit_params[`cmsl${i}`];
|
|
|
- }
|
|
|
- //计算尺码数量总数合计
|
|
|
- updateTotal()
|
|
|
- };
|
|
|
-
|
|
|
- //自动计算制单数总计(仅数字,自动去掉空格及其他字符)
|
|
|
- function updateTotal() {
|
|
|
- const relevantKeys = ['zds1', 'zds2', 'zds3', 'zds4', 'zds5', 'zds6', 'zds7', 'zds8', 'zds9', 'zds10', 'zds11', 'zds12', 'zds13', 'zds14'];
|
|
|
- relevantKeys.forEach((key) => {
|
|
|
- zdsformdata[key] = String(zdsformdata[key] ?? '').replace(/[^\d]/g, '')
|
|
|
- edit_zdsformdata[key] = String(edit_zdsformdata[key] ?? '').replace(/[^\d]/g, '')
|
|
|
- })
|
|
|
- const values = relevantKeys.map(key => parseInt(zdsformdata[key], 10) || 0);
|
|
|
- zdsformdata.zdtotal = values.reduce((sum, value) => sum + value, 0);
|
|
|
- const valuess = relevantKeys.map(key => parseInt(edit_zdsformdata[key], 10) || 0);
|
|
|
- edit_zdsformdata.zdtotal = valuess.reduce((sum, value) => sum + value, 0);
|
|
|
- }
|
|
|
-
|
|
|
- //点击是否船样 改变子订单编号
|
|
|
- const edit_cyChange = async (value) => {
|
|
|
- if (value === '是') {
|
|
|
- const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:edit_formData['颜色']});
|
|
|
- edit_formData['子订单编号'] = getSuborders.data;
|
|
|
- }else if(value === '否'){
|
|
|
- const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
|
|
|
- edit_formData['子订单编号'] = getSuborders.data.order;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- //修改颜色资料确认
|
|
|
- const ys_edit_Dialog = async () => {
|
|
|
- updateTotal()
|
|
|
- if (!edit_formData.value) return;
|
|
|
-
|
|
|
- //获取颜色编号id
|
|
|
- const getPonumberdata = await getSuborder({colorname:edit_formData['颜色'],order:_ddhval.value,cy:edit_formData['船样']});
|
|
|
- // 从返回中提取 colorlist
|
|
|
- const colorlist = getPonumberdata.data.colorlist || [];
|
|
|
- // 获取匹配的颜色项
|
|
|
- const match = colorlist.find(item => item.colorname === edit_formData['颜色']);
|
|
|
- if (match) {
|
|
|
- edit_colorcode.value = match.colorcode;
|
|
|
- } else {
|
|
|
- console.warn('未找到匹配的颜色');
|
|
|
- }
|
|
|
-
|
|
|
- function buildSizeQuantitiesMap(sizes, formData) {
|
|
|
- const sizeQuantitiesMap = {};
|
|
|
- sizes.forEach(size => {
|
|
|
- // 使用逻辑或操作符确保所有尺码的数量
|
|
|
- const quantity = formData[size] || 0;
|
|
|
- sizeQuantitiesMap[size] = quantity;
|
|
|
- });
|
|
|
- return sizeQuantitiesMap;
|
|
|
- }
|
|
|
-
|
|
|
- // 使用函数构建映射
|
|
|
- const sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);
|
|
|
- let index = 1;
|
|
|
- const params = {
|
|
|
- 订单编号: edit_formData.value.订单编号,
|
|
|
- 子订单编号: edit_formData.子订单编号,
|
|
|
- 款号: edit_formData.款号,
|
|
|
- 颜色备注: edit_formData.颜色备注,
|
|
|
- 船样: edit_formData.船样 === '是' ? '1' : '0', // 转换船样字段
|
|
|
- 颜色: edit_formData.颜色,
|
|
|
- color_id:edit_colorcode.value,
|
|
|
- zdtotal: edit_zdsformdata.zdtotal,
|
|
|
- Sys_id: edit_formData.value.Sys_id,
|
|
|
- id: Uniqid.value,
|
|
|
- };
|
|
|
- for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {
|
|
|
- params[`cm${index}`] = size;
|
|
|
- const cmslValue = +edit_zdsformdata[`zds${index}`]; // 获取对应的数量
|
|
|
- params[`cmsl${index++}`] = cmslValue === 0 ? "" : cmslValue; // 如果为0,赋值为空字符串
|
|
|
- }
|
|
|
- console.log(params)
|
|
|
- //颜色资料修改接口
|
|
|
- const PrintDataEdit_list = await PrintDataEdit(params);
|
|
|
- if(PrintDataEdit_list.code === 0){
|
|
|
- dialogFormVisible.value = false;
|
|
|
- ElMessage({type: 'success',message: '修改成功'})
|
|
|
- //数据列表显示
|
|
|
- const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
- const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
|
|
|
- const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
|
|
|
- //颜色资料
|
|
|
- if(PrintListDatas.data.列表.length === 0 ){
|
|
|
- ystableData.length = 0
|
|
|
- }else{
|
|
|
- sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//型号数据
|
|
|
- ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
|
|
|
- // 使用 map 方法创建一个新数组,并转换船样字段
|
|
|
- const newData = PrintListDatas.data.列表.map(item => ({
|
|
|
- ...item,
|
|
|
- 船样: item.船样 === 1 ? '是' : '否'
|
|
|
- }));
|
|
|
- // 将新数组赋值给 ystableData,这会触发视图更新,清空旧数据(可选,如果不需要保留旧数据的话)
|
|
|
- ystableData.length = 0;
|
|
|
- ystableData.push(...newData);
|
|
|
- }
|
|
|
- tableRowClick(params)
|
|
|
- }else{
|
|
|
- ElMessage({type: 'error',message: '修改失败'})
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- //颜色资料修改取消
|
|
|
- const ys_edit_closeDialog = async (row) => {
|
|
|
- dialogFormVisible.value = false;
|
|
|
- };
|
|
|
-
|
|
|
- const mlinventoryVisible = ref(false)
|
|
|
- const historytableData = ref([])
|
|
|
- // //双击面料库存
|
|
|
- // const mlupdateCompanyFunc = async (row) => {
|
|
|
- // mlinventoryVisible.value = true;
|
|
|
- // }
|
|
|
-
|
|
|
- //库存测试
|
|
|
- const CSclick = async (row) => {
|
|
|
- mlinventoryVisible.value = true;
|
|
|
- }
|
|
|
-
|
|
|
- //技术附件弹窗取消
|
|
|
- const mlcloseDialog = () => {
|
|
|
- mlinventoryVisible.value = false
|
|
|
- }
|
|
|
- // 分页
|
|
|
- const page = ref(1)
|
|
|
- const total = ref(0)
|
|
|
- const pageSize = ref(50)
|
|
|
- const handleCurrentChange = (val) => {
|
|
|
- page.value = val;
|
|
|
- _WorkList_page();
|
|
|
- };
|
|
|
-
|
|
|
- // 修改页面容量 点击多少条/页
|
|
|
- const handleSizeChange = (val) => {
|
|
|
- pageSize.value = val;
|
|
|
- _WorkList_page();
|
|
|
- };
|
|
|
-
|
|
|
- // 款式列表数据
|
|
|
- const productStyleList = ref([]);
|
|
|
-
|
|
|
- // 获取款式列表
|
|
|
- const getProductStyleData = async () => {
|
|
|
- try {
|
|
|
- const result = await getProductStyleList();
|
|
|
- if (result.code === 0) {
|
|
|
- productStyleList.value = result.data;
|
|
|
- } else {
|
|
|
- ElMessage.error('获取款式列表失败');
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('获取款式列表出错:', error);
|
|
|
- ElMessage.error('获取款式列表失败');
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- // =========== 新增订单资料 ===========
|
|
|
- const add_gdscgdformData = reactive({
|
|
|
- 订单编号: '',
|
|
|
- 生产款号: '',
|
|
|
- 款式: '',
|
|
|
- 客户编号: '',
|
|
|
- 落货日期: '',
|
|
|
- 箱唛要求: '',
|
|
|
- 面料: '',
|
|
|
- 要求: '',
|
|
|
- 船样描述: '',
|
|
|
- 船样合计: '',
|
|
|
- 粘衬: '',
|
|
|
- 订单数量: '',
|
|
|
- 单位: '件',
|
|
|
- Sys_id: '',
|
|
|
- 制单日期: '',
|
|
|
- 审核日期: '',
|
|
|
- 合并: false,
|
|
|
- });
|
|
|
-
|
|
|
-
|
|
|
- const add_gddialogFormVisible = ref(false)
|
|
|
- //点击新增订单资料按钮
|
|
|
- const addgd_onclick = async () => {
|
|
|
-
|
|
|
- console.log("用户信息", _username.value);
|
|
|
- // 判断客户代号是否为空
|
|
|
- if (!_Gd_khdh.value) {
|
|
|
- ElMessage({ type: 'warning', message: '请选择具体的客户后,再操作此功能' });
|
|
|
- return false;
|
|
|
- }
|
|
|
- syncUploadFileList('');
|
|
|
- add_gdscgdformData.img = '';
|
|
|
- add_gddialogFormVisible.value = true;
|
|
|
- zsglddtableData.value = [];
|
|
|
- await getProductStyleData();
|
|
|
- //获取订单编号接口
|
|
|
- const getWorkOrder_list = await getWorkOrder();
|
|
|
- add_gdscgdformData['订单编号'] = getWorkOrder_list.data;
|
|
|
- add_gdscgdformData['客户编号'] = _Gd_khdh.value
|
|
|
- add_gdscgdformData['Sys_id'] = _username.value
|
|
|
- add_gdscgdformData['制单日期'] = currentDates
|
|
|
- }
|
|
|
-
|
|
|
- //操作移除按钮
|
|
|
- const deleteRow = (index) => {
|
|
|
- //当前点击索引值
|
|
|
- console.log(index)
|
|
|
- console.log(zsglddtableData)
|
|
|
- //移除当前行
|
|
|
- zsglddtableData.value.splice(index, 1);
|
|
|
- }
|
|
|
- const fullscreenLoading = ref(false); // 控制全屏加载
|
|
|
- const isClickable = ref(true); // 控制按钮是否可点击
|
|
|
-
|
|
|
- const resetAddOrderForm = () => {
|
|
|
- Object.assign(add_gdscgdformData, {
|
|
|
- 订单编号: '',
|
|
|
- 生产款号: '',
|
|
|
- 款式: '',
|
|
|
- 客户编号: '',
|
|
|
- 落货日期: '',
|
|
|
- 箱唛要求: '',
|
|
|
- 面料: '',
|
|
|
- 要求: '',
|
|
|
- 备注: '',
|
|
|
- 船样描述: '',
|
|
|
- 船样合计: '',
|
|
|
- 粘衬: '',
|
|
|
- 订单数量: '',
|
|
|
- 单位: '件',
|
|
|
- Sys_id: '',
|
|
|
- 制单日期: '',
|
|
|
- 审核日期: '',
|
|
|
- 合并: false,
|
|
|
- img: '',
|
|
|
- });
|
|
|
- zsglddtableData.value = [];
|
|
|
- syncUploadFileList('');
|
|
|
- };
|
|
|
-
|
|
|
- //新增工单资料确定
|
|
|
- const add_gdenterDialog = async () => {
|
|
|
- if (!isClickable.value) return;
|
|
|
-
|
|
|
- // 先校验,通过后再 Loading,避免未填完就全屏卡住
|
|
|
- const fields = [
|
|
|
- { key: '款式', message: '款式不能为空' },
|
|
|
- { key: '订单编号', message: '网络异常, 请重新打开' },
|
|
|
- { key: '客户编号', message: '网络异常, 请重新打开' },
|
|
|
- { key: '落货日期', message: '落货日期不能为空' },
|
|
|
- { key: '订单数量', message: '订单数量不能为空' },
|
|
|
- { key: '面料', message: '缺少面料信息,无法完成提交,请提供面料数据以便获取BOM资料数据' },
|
|
|
- ];
|
|
|
- for (const field of fields) {
|
|
|
- if (!add_gdscgdformData[field.key]) {
|
|
|
- ElMessage({ type: 'warning', message: field.message });
|
|
|
- return;
|
|
|
- }
|
|
|
- }
|
|
|
- if (!add_gdscgdformData['制单日期']) {
|
|
|
- ElMessage({ type: 'warning', message: '制单日期不能为空' });
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- isClickable.value = false;
|
|
|
- const loadingInstance = ElLoading.service({
|
|
|
- lock: true,
|
|
|
- text: '正在自动获取生成BOM面料资料,请稍候...',
|
|
|
- background: 'rgba(0, 0, 0, 0.8)',
|
|
|
- spinner: 'el-icon-loading',
|
|
|
- });
|
|
|
-
|
|
|
- try {
|
|
|
- let lhrq_formattedDeliveryDate = '';
|
|
|
- if (add_gdscgdformData['落货日期']) {
|
|
|
- const date = new Date(add_gdscgdformData['落货日期']);
|
|
|
- lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
|
|
|
- }
|
|
|
-
|
|
|
- const ids = zsglddtableData.value.map(item => item.UNIQID);
|
|
|
- const dds = zsglddtableData.value.map(item => item.订单编号);
|
|
|
- const uniqueIds = [...new Set(ids)];
|
|
|
- const uniqueDds = [...new Set(dds)];
|
|
|
- const formattedIds = uniqueIds.join(',');
|
|
|
- const formattedDds = uniqueDds.join(',');
|
|
|
-
|
|
|
- console.log('关联订单编号:', formattedDds);
|
|
|
- console.log('关联订单UNIQID:', formattedIds);
|
|
|
-
|
|
|
- const formattedData = {
|
|
|
- 订单编号: add_gdscgdformData['订单编号'],
|
|
|
- 生产款号: add_gdscgdformData['生产款号'],
|
|
|
- 款式: add_gdscgdformData['款式'],
|
|
|
- 客户编号: add_gdscgdformData['客户编号'],
|
|
|
- 落货日期: lhrq_formattedDeliveryDate,
|
|
|
- 箱唛要求: add_gdscgdformData['箱唛要求'],
|
|
|
- 面料: add_gdscgdformData['面料'],
|
|
|
- 要求: add_gdscgdformData['备注'],
|
|
|
- 船样描述: add_gdscgdformData['船样描述'],
|
|
|
- 船样合计: add_gdscgdformData['船样合计'],
|
|
|
- 粘衬: add_gdscgdformData['粘衬'],
|
|
|
- 订单数量: add_gdscgdformData['订单数量'],
|
|
|
- 单位: add_gdscgdformData['单位'],
|
|
|
- Sys_id: _username.value,
|
|
|
- 接单日期: currentDates,
|
|
|
- img: add_gdscgdformData.img,
|
|
|
- 关联订单: formattedDds,
|
|
|
- 关联面料ID: formattedIds,
|
|
|
- };
|
|
|
-
|
|
|
- console.log(formattedData);
|
|
|
-
|
|
|
- const edit_gdformdata_list = await WorkOrderAdd(formattedData);
|
|
|
- if (edit_gdformdata_list.code === 0) {
|
|
|
- resetAddOrderForm();
|
|
|
- add_gddialogFormVisible.value = false;
|
|
|
- ElMessage({ type: 'success', message: '新增成功' });
|
|
|
- const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: 1, limit: 50 });
|
|
|
- tableData.value = WorkListdata.data.data;
|
|
|
- } else {
|
|
|
- ElMessage({ type: 'error', message: edit_gdformdata_list.msg || edit_gdformdata_list.message || '新增失败' });
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('Error:', error);
|
|
|
- const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '操作失败,请重试'
|
|
|
- ElMessage({ type: 'error', message: msg });
|
|
|
- } finally {
|
|
|
- isClickable.value = true;
|
|
|
- loadingInstance.close();
|
|
|
- }
|
|
|
- };
|
|
|
- //新增工单资料取消 / 关闭
|
|
|
- const add_gdcloseDialog = (done) => {
|
|
|
- resetAddOrderForm();
|
|
|
- add_gddialogFormVisible.value = false;
|
|
|
- if (typeof done === 'function') done();
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // =========== 关联订单资料 ===========
|
|
|
- const Related_fabricsVisible = ref(false)
|
|
|
- const glddzl_keyword = ref('')
|
|
|
- const glddtableData = reactive([])
|
|
|
- // 关联订单面料按钮
|
|
|
- const Related_fabrics = () => {
|
|
|
- Related_fabricsVisible.value = true
|
|
|
- // glddtableData.splice(0, glddtableData.length);//清空表格
|
|
|
- ddsearchHandle()
|
|
|
- }
|
|
|
-
|
|
|
- //实时触发input
|
|
|
- const real_handleInput = async ()=>{
|
|
|
- glddtableData.splice(0, glddtableData.length);//清空表格
|
|
|
- ddsearchHandle()
|
|
|
- }
|
|
|
-
|
|
|
- // 关联订单面料搜索
|
|
|
- const ddsearchHandle = async (v) => {
|
|
|
- console.log(v)
|
|
|
- glddtableData.splice(0, glddtableData.length);//清空表格
|
|
|
-
|
|
|
- //搜索面料库存数据列表接口
|
|
|
- const response = await fabricList({order:v});
|
|
|
- if (response.data && response.data.length === 0) {
|
|
|
- ElMessage({type: 'warning',message: '未查询到搜索条件'})
|
|
|
- }else{
|
|
|
- // 确保 response.data 和 response.data.table 存在
|
|
|
- if (response?.data?.table) {
|
|
|
- glddtableData.value = response.data.table.map(item => ({
|
|
|
- ...item,
|
|
|
- checked: false, // 初始化时默认未勾选
|
|
|
- }));
|
|
|
- glddtableData.splice(0, response.data.table.total, ...response.data.table);
|
|
|
- } else {
|
|
|
- console.error("response.data.table 不存在或为空:", response.data);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const gldd_Selection = ref('') // 存储选中Uniqid
|
|
|
- const gldd_Selection_ddbh = ref('') // 存储选中订单编号
|
|
|
- const zsglddtableData = ref([]) // 存储最终选择的订单数据
|
|
|
- const currentSelectedRows = ref([]) // 新增:存储当前选中的行数据
|
|
|
-
|
|
|
- const glddSelectionChange = (selection) => {
|
|
|
- console.log("当前选中的数据:", selection)
|
|
|
- currentSelectedRows.value = selection // 存储当前选中的行数据
|
|
|
- // 更新 glddtableData 中每一行的 checked 状态
|
|
|
- glddtableData.value = glddtableData.value.map(item => {
|
|
|
- return {
|
|
|
- ...item,
|
|
|
- checked: selection.some(selectedItem => selectedItem.UNIQID === item.UNIQID)
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- // 关联订单取消
|
|
|
- const Related_fabricscloseDialog = () => {
|
|
|
- gldd_Selection.value = ''
|
|
|
- Related_fabricsVisible.value = false
|
|
|
- }
|
|
|
-
|
|
|
- // 关联订单确定
|
|
|
- const Related_fabricsenterDialog = () => {
|
|
|
- if (currentSelectedRows.value.length === 0) {
|
|
|
- ElMessage.warning('请至少选择一条数据')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- console.log("确定选择的数据:", currentSelectedRows.value)
|
|
|
-
|
|
|
- // 将选中的数据添加到 zsglddtableData
|
|
|
- zsglddtableData.value = [...zsglddtableData.value, ...currentSelectedRows.value]
|
|
|
-
|
|
|
- // 提取UNIQID和订单编号
|
|
|
- gldd_Selection.value = currentSelectedRows.value.map(item => item.UNIQID).join(',')
|
|
|
- gldd_Selection_ddbh.value = currentSelectedRows.value.map(item => item.订单编号).join(',')
|
|
|
-
|
|
|
- // 关闭弹窗
|
|
|
- Related_fabricsVisible.value = false
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // =========== 新增颜色资料 ===========
|
|
|
- const add_gdyjdialogFormVisible = ref(false)
|
|
|
- const add_yszlformdata = reactive({
|
|
|
- ddh: '',
|
|
|
- ddzbh: '',
|
|
|
- sxmc: '',
|
|
|
- cmgg: '',
|
|
|
- sfcy: '',
|
|
|
- ysbz: '',
|
|
|
- });
|
|
|
- const cmformdata = reactive({
|
|
|
- cm1:'32',
|
|
|
- cm2:'34',
|
|
|
- cm3:'36',
|
|
|
- cm4:'38',
|
|
|
- cm5:'40',
|
|
|
- cm6:'42',
|
|
|
- cm7:'44',
|
|
|
- cm8:'46',
|
|
|
- cm9:'48',
|
|
|
- cm10:'',
|
|
|
- cm11:'',
|
|
|
- cm12:'',
|
|
|
- cm13:'',
|
|
|
- cm14:'',
|
|
|
- sctotal:'总计',
|
|
|
- });
|
|
|
- const zdsformdata = reactive({
|
|
|
- zds1:'',
|
|
|
- zds2:'',
|
|
|
- zds3:'',
|
|
|
- zds4:'',
|
|
|
- zds5:'',
|
|
|
- zds6:'',
|
|
|
- zds7:'',
|
|
|
- zds8:'',
|
|
|
- zds9:'',
|
|
|
- zds10:'',
|
|
|
- zds11:'',
|
|
|
- zds12:'',
|
|
|
- zds13:'',
|
|
|
- zds14:'',
|
|
|
- zdtotal:'',
|
|
|
- });
|
|
|
- //记录色系编号
|
|
|
- const add_colorcode = ref('')
|
|
|
-
|
|
|
- //选择色系名称获取子订单编号
|
|
|
- const xz_sxhandleSizeChange = async (value,color_id) => {
|
|
|
-
|
|
|
- //获取子订单编号
|
|
|
- const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:add_yszlformdata.sfcy});
|
|
|
- console.log("获取子订单编号",getPonumberdata)
|
|
|
- add_yszlformdata.ddzbh = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
|
|
|
-
|
|
|
- if (value === '红色系') {
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- } else if(value === '黄色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '蓝色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '绿色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '紫色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '灰色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '咖啡色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '黑色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '经典色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }else if(value === '白色系'){
|
|
|
- add_yszlformdata.sxmc = value
|
|
|
- add_colorcode.value = color_id
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const edit_formData = reactive({
|
|
|
- '颜色': ''
|
|
|
- });
|
|
|
-
|
|
|
- //记录色系编号
|
|
|
- const edit_colorcode = ref('')
|
|
|
- const xg_sxhandleSizeChange = async (value,color_id) => {
|
|
|
-
|
|
|
- const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:edit_formData['船样']});
|
|
|
- console.log(edit_formData.value)
|
|
|
- if(edit_formData.value['颜色'] === edit_formData['颜色']){
|
|
|
- edit_formData['子订单编号'] = edit_formData.value['子订单编号']
|
|
|
- }else{
|
|
|
- edit_formData['子订单编号'] = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
|
|
|
- }
|
|
|
- if (value === '红色系') {
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- } else if(value === '黄色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- }else if(value === '蓝色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- }else if(value === '绿色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- }else if(value === '紫色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- }else if(value === '灰色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- }else if(value === '咖啡色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- }else if(value === '黑色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- edit_colorcode.value = color_id
|
|
|
- }else if(value === '经典色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- }else if(value === '白色系'){
|
|
|
- edit_formData['颜色'] = value
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- //清空对象的属性值
|
|
|
- const gdyj_clearFormData = () => {
|
|
|
- Object.keys(zdsformdata).forEach(key => {
|
|
|
- zdsformdata[key] = '';
|
|
|
- });
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
- //点击是否船样 改变子订单编号
|
|
|
- const cyChange = async (value) => {
|
|
|
- if (value === '是') {
|
|
|
- add_yszlformdata.ddzbh = _Gd_gdbh.value + '-99'
|
|
|
- const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:add_yszlformdata['sxmc']});
|
|
|
- add_yszlformdata['ddzbh'] = getSuborders.data;
|
|
|
- }else if(value === '否'){
|
|
|
- const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:add_yszlformdata['sxmc']});
|
|
|
- add_yszlformdata['ddzbh'] = getSuborders.data.order;
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const getSuborderscolor = reactive({
|
|
|
- colorlist: []
|
|
|
- });
|
|
|
-
|
|
|
- //新增颜色资料按钮
|
|
|
- const addgdyj_onclick = async () => {
|
|
|
- if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
- ElMessage({type: 'warning',message: '请选择具体的订单后,再操作此功能'})
|
|
|
- return false;
|
|
|
- }else{
|
|
|
- add_gdyjdialogFormVisible.value = true
|
|
|
- add_yszlformdata['sxmc'] = '红色系';
|
|
|
- const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:'红色系'});
|
|
|
- console.log(getSuborders)
|
|
|
-
|
|
|
-
|
|
|
- getSuborderscolor.colorlist = getSuborders.data.colorlist;
|
|
|
-
|
|
|
- add_yszlformdata['ddzbh'] = getSuborders.data.order;
|
|
|
- // 假设获取的数据是 getSuborders.data
|
|
|
- if (getSuborders.data.cm) {
|
|
|
- // 判断并赋值
|
|
|
- cmformdata.cm1 = getSuborders.data.cm.cm1 || '';
|
|
|
- cmformdata.cm2 = getSuborders.data.cm.cm2 || '';
|
|
|
- cmformdata.cm3 = getSuborders.data.cm.cm3 || '';
|
|
|
- cmformdata.cm4 = getSuborders.data.cm.cm4 || '';
|
|
|
- cmformdata.cm5 = getSuborders.data.cm.cm5 || '';
|
|
|
- cmformdata.cm6 = getSuborders.data.cm.cm6 || '';
|
|
|
- cmformdata.cm7 = getSuborders.data.cm.cm7 || '';
|
|
|
- cmformdata.cm8 = getSuborders.data.cm.cm8 || '';
|
|
|
- cmformdata.cm9 = getSuborders.data.cm.cm9 || '';
|
|
|
- cmformdata.cm10 = getSuborders.data.cm.cm10 || '';
|
|
|
- cmformdata.cm11 = getSuborders.data.cm.cm11 || '';
|
|
|
- cmformdata.cm12 = getSuborders.data.cm.cm12 || '';
|
|
|
- cmformdata.cm13 = getSuborders.data.cm.cm13 || '';
|
|
|
- cmformdata.cm14 = getSuborders.data.cm.cm14 || '';
|
|
|
- cmformdata.sctotal = '合计';
|
|
|
- }
|
|
|
-
|
|
|
- add_yszlformdata['ddh'] = _Gd_gdbh.value;
|
|
|
- add_yszlformdata['ys'] = '';
|
|
|
- add_yszlformdata['kh'] = '';
|
|
|
- add_yszlformdata['sfcy'] = '否';
|
|
|
- add_yszlformdata['颜色备注'] = '否';
|
|
|
- add_yszlformdata['kdy'] = _username.value;
|
|
|
- gdyj_clearFormData();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- const child_order = ref('')
|
|
|
- //单机颜色资料表格
|
|
|
- const ystableclick = async (row) => {
|
|
|
- // console.log(row.子订单编号)
|
|
|
- // child_order.value = row.子订单编号
|
|
|
- }
|
|
|
-
|
|
|
- //部件资料行点击
|
|
|
- const partTableRowClick = async (row) => {
|
|
|
- // console.log(row.部件编号)
|
|
|
- }
|
|
|
-
|
|
|
- //部件资料行双击
|
|
|
- const partRowDblclick = async (row) => {
|
|
|
- // console.log(row.部件编号)
|
|
|
- }
|
|
|
-
|
|
|
-//限制尺码输入规则
|
|
|
-function handleSizeInput(field) {
|
|
|
- // 获取当前字段的值
|
|
|
- let value = cmformdata[field];
|
|
|
- // 使用正则表达式过滤,只保留字母和数字,并将字母转换为大写
|
|
|
- const filteredValue = value.replace(/[^a-zA-Z0-9]/g, '').replace(/[a-z]/g, (match) => match.toUpperCase());
|
|
|
- // 更新字段值
|
|
|
- cmformdata[field] = filteredValue; // 直接更新 reactive 对象的属性
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
-function Input_handle() {
|
|
|
- add_gdscgdformData['订单数量'] = add_gdscgdformData['订单数量'].replace(/[^\d]/g, '')
|
|
|
- add_gdscgdformData['船样合计'] = add_gdscgdformData['船样合计'].replace(/[^\d]/g, '')
|
|
|
-
|
|
|
- edit_ddformData.value['订单数量'] = String(edit_ddformData.value['订单数量'] ?? '').replace(/[^\d]/g, '')
|
|
|
- edit_ddformData.value['船样合计'] = String(edit_ddformData.value['船样合计'] ?? '').replace(/[^\d]/g, '')
|
|
|
-}
|
|
|
-
|
|
|
-
|
|
|
- //新增颜色资料确定
|
|
|
- const add_gdyjenterDialog = async () => {
|
|
|
- updateTotal()
|
|
|
- //必填
|
|
|
- if(add_yszlformdata['kh'] === ''){
|
|
|
- ElMessage({type: 'warning',message: '款号不能为空'})
|
|
|
- return false;
|
|
|
- }
|
|
|
- if(add_yszlformdata['ysbz'] === ''){
|
|
|
- ElMessage({type: 'warning',message: '颜色备注不能为空'})
|
|
|
- return false;
|
|
|
- }
|
|
|
- if(add_yszlformdata['sxmc'] === ''){
|
|
|
- ElMessage({type: 'warning',message: '色系名称不能为空'})
|
|
|
- return false;
|
|
|
- }
|
|
|
-
|
|
|
- let cy = '';
|
|
|
- if(add_yszlformdata['sfcy'] === '是'){
|
|
|
- cy = '1'
|
|
|
- }else if(add_yszlformdata['sfcy'] === '否'){
|
|
|
- cy = '0'
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //获取颜色编号id
|
|
|
- const getPonumberdata = await getSuborder({colorname:add_yszlformdata['sxmc'],order:_ddhval.value,cy:add_yszlformdata['sfcy']});
|
|
|
- // 从返回中提取 colorlist
|
|
|
- const colorlist = getPonumberdata.data.colorlist || [];
|
|
|
- // 获取匹配的颜色项
|
|
|
- const match = colorlist.find(item => item.colorname === add_yszlformdata['sxmc']);
|
|
|
- if (match) {
|
|
|
- add_colorcode.value = match.colorcode;
|
|
|
- } else {
|
|
|
- console.warn('未找到匹配的颜色');
|
|
|
- }
|
|
|
-
|
|
|
- const addyszltable = {
|
|
|
- 订单编号: add_yszlformdata['ddh'],
|
|
|
- 子订单编号: add_yszlformdata['ddzbh'],
|
|
|
- 颜色: add_yszlformdata['sxmc'],
|
|
|
- 款号: add_yszlformdata['kh'],
|
|
|
- 颜色备注:add_yszlformdata.ysbz,
|
|
|
- 船样: cy,
|
|
|
- Sys_id:add_yszlformdata['kdy'],
|
|
|
- color_id:add_colorcode.value,
|
|
|
- //尺码
|
|
|
- cm1: cmformdata['cm1'],
|
|
|
- cm2: cmformdata['cm2'],
|
|
|
- cm3: cmformdata['cm3'],
|
|
|
- cm4: cmformdata['cm4'],
|
|
|
- cm5: cmformdata['cm5'],
|
|
|
- cm6: cmformdata['cm6'],
|
|
|
- cm7: cmformdata['cm7'],
|
|
|
- cm8: cmformdata['cm8'],
|
|
|
- cm9: cmformdata['cm9'],
|
|
|
- cm10: cmformdata['cm10'],
|
|
|
- cm11: cmformdata['cm11'],
|
|
|
- cm12: cmformdata['cm12'],
|
|
|
- cm13: cmformdata['cm13'],
|
|
|
- cm14: cmformdata['cm14'],
|
|
|
- sctotal: cmformdata['sctotal'],
|
|
|
- //尺码数量
|
|
|
- cmsl1: zdsformdata['zds1'],
|
|
|
- cmsl2: zdsformdata['zds2'],
|
|
|
- cmsl3: zdsformdata['zds3'],
|
|
|
- cmsl4: zdsformdata['zds4'],
|
|
|
- cmsl5: zdsformdata['zds5'],
|
|
|
- cmsl6: zdsformdata['zds6'],
|
|
|
- cmsl7: zdsformdata['zds7'],
|
|
|
- cmsl8: zdsformdata['zds8'],
|
|
|
- cmsl9: zdsformdata['zds9'],
|
|
|
- cmsl10: zdsformdata['zds10'],
|
|
|
- cmsl11: zdsformdata['zds11'],
|
|
|
- cmsl12: zdsformdata['zds12'],
|
|
|
- cmsl13: zdsformdata['zds13'],
|
|
|
- cmsl14: zdsformdata['zds14'],
|
|
|
- zdtotal: zdsformdata['zdtotal'],
|
|
|
- };
|
|
|
- console.log(addyszltable)
|
|
|
- // return;
|
|
|
- const printDetailAdds = await printDetailAdd(addyszltable);
|
|
|
- if (printDetailAdds.code === 0) {
|
|
|
- add_gdyjdialogFormVisible.value = false;
|
|
|
- ElMessage({type: 'success',message: '新增成功'})
|
|
|
- }
|
|
|
- const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
- if(PrintListDatas.data.列表.length === 0){
|
|
|
- ystableData.length = 0
|
|
|
- }else{
|
|
|
- sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
|
|
|
- ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);
|
|
|
-
|
|
|
- const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
- bomtableData.value = orderBomListdata.data
|
|
|
- bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
|
|
|
-
|
|
|
- const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
|
|
|
- console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
|
|
|
-
|
|
|
- if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
|
|
|
- // 如果 data.table 是数组且不为空,更新表格数据
|
|
|
- mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
|
|
|
- } else {
|
|
|
- // 如果 data.table 为空或无效,清空表格数据
|
|
|
- mltableData.splice(0, mltableData.length);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //新增颜色资料取消
|
|
|
- const add_dyjcloseDialog = () => {
|
|
|
- add_gdyjdialogFormVisible.value = false
|
|
|
- }
|
|
|
- //键盘input框跳转
|
|
|
- const add_gdzlent = async (event,id1,id2,id3,idx) => {
|
|
|
- if(event.keyCode === 40){
|
|
|
- if(id3!=''){
|
|
|
- document.getElementById(id3).focus()
|
|
|
- }
|
|
|
- }else if (event.keyCode === 13) { // Enter 或向下箭头
|
|
|
- if(id3!=''){
|
|
|
- document.getElementById(id3).focus()
|
|
|
- }
|
|
|
- } else if (event.keyCode === 38) { // 向上箭头
|
|
|
- if(id1!=''){
|
|
|
- document.getElementById(id1).focus()
|
|
|
- }
|
|
|
- }else if (event.keyCode === 8) { // 删除箭头
|
|
|
- if(id1!='' && document.getElementById(id2).value==''){
|
|
|
- document.getElementById(id1).focus()
|
|
|
- }
|
|
|
- }else if (event.keyCode === 37) { // 向左箭头
|
|
|
- if(id1!='' && document.getElementById(id2).selectionStart==0){
|
|
|
- document.getElementById(id1).focus()
|
|
|
- }
|
|
|
- }else if (event.keyCode === 39) { // 向右箭头
|
|
|
- if(id3!='' && document.getElementById(id2).selectionStart == document.getElementById(id2).value.length){
|
|
|
- document.getElementById(id3).focus()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // =========== 新增工序资料 ===========
|
|
|
- const visible = ref(false)
|
|
|
- // 新增部件资料相关
|
|
|
- const partAddDialogVisible = ref(false)
|
|
|
- const partIsEdit = ref(false)
|
|
|
- const partAddForm = reactive({
|
|
|
- 部件序号: '',
|
|
|
- 部件名称: ''
|
|
|
- })
|
|
|
- const partAddRows = ref([])
|
|
|
- const partAddExistingNames = ref(new Set())
|
|
|
- const partAddMaxExistingSort = ref(0)
|
|
|
- const partNameOptions = ref([])
|
|
|
-
|
|
|
- // 排序相关状态
|
|
|
-const sortPartGyDialogVisible = ref(false)
|
|
|
-const sortDialogLoading = ref(false)
|
|
|
-const sortDialogSewingGroups = ref([])
|
|
|
-const sortDialogStageGys = ref({ 裁剪: [], 手工: [], 大烫: [], 总检: [] })
|
|
|
-const sortDialogViewStage = ref('裁剪')
|
|
|
-const sortDialogSelectedPartId = ref(null)
|
|
|
-const sortDialogInitialSnapshot = ref(null)
|
|
|
-const sortDialogSubmitLoading = ref(false)
|
|
|
-
|
|
|
-// 排序弹窗相关计算属性
|
|
|
-const sortDialogRightPanelReady = computed(() => {
|
|
|
- const vs = sortDialogViewStage.value
|
|
|
- if (!vs) return false
|
|
|
- if (vs === '车缝') return sortDialogSelectedPartId.value != null
|
|
|
- return true
|
|
|
-})
|
|
|
-
|
|
|
-const sortDialogRightActiveSewingGroup = computed(() => {
|
|
|
- if (sortDialogViewStage.value !== '车缝' || sortDialogSelectedPartId.value == null) return null
|
|
|
- return (
|
|
|
- sortDialogSewingGroups.value.find(
|
|
|
- (g) => String(g.part?.id) === String(sortDialogSelectedPartId.value)
|
|
|
- ) ?? null
|
|
|
- )
|
|
|
-})
|
|
|
-
|
|
|
-const sortDialogActiveGysList = computed(() => {
|
|
|
- const vs = sortDialogViewStage.value
|
|
|
- if (vs && vs !== '车缝') {
|
|
|
- return sortDialogStageGys.value[vs] ?? []
|
|
|
- }
|
|
|
- if (vs === '车缝' && sortDialogRightActiveSewingGroup.value) {
|
|
|
- return sortDialogRightActiveSewingGroup.value.gys ?? []
|
|
|
- }
|
|
|
- return []
|
|
|
-})
|
|
|
-
|
|
|
-
|
|
|
-// 复制产品资料相关状态
|
|
|
-const copyProductDialogVisible = ref(false)
|
|
|
-const copyProductFormData = ref({
|
|
|
- gdbh: '',
|
|
|
- ks: ''
|
|
|
-})
|
|
|
-const copyProductTableData = ref([])
|
|
|
-const copyProductSelectedRow = ref(null)
|
|
|
-const copyProductTableRef = ref(null)
|
|
|
-const copyProductSearchText = ref('')
|
|
|
-
|
|
|
-// 排序相关常量
|
|
|
-const PROCESS_ADD_STAGE_ORDER = ['裁剪', '车缝', '手工', '大烫', '总检']
|
|
|
-const SORT_NON_SEWING_STAGES = ['裁剪', '手工', '大烫', '总检']
|
|
|
-
|
|
|
-// 排序相关状态
|
|
|
-const sortDialogVisible = ref(false)
|
|
|
-const sortTableData = ref([])
|
|
|
-
|
|
|
- // 新增工艺资料相关
|
|
|
- const processAddDialogVisible = ref(false)
|
|
|
-
|
|
|
- watch(processAddDialogVisible, async (visible) => {
|
|
|
- if (!visible && gyDetailDialogVisible.value) {
|
|
|
- await refreshGyDetailProcessList()
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- const processIsEdit = ref(false)
|
|
|
- const processSubmitLoading = ref(false)
|
|
|
- const processFormRef = ref(null)
|
|
|
- const processForm = reactive({
|
|
|
- id: undefined,
|
|
|
- 工艺序号: '',
|
|
|
- 工艺名称: '',
|
|
|
- 生产工序: '',
|
|
|
- 标准工时: undefined,
|
|
|
- 标准工分: undefined,
|
|
|
- 难度系数: 1,
|
|
|
- })
|
|
|
- const processFormRules = {
|
|
|
- 工艺名称: [{ required: true, message: '请选择或输入工艺名称', trigger: 'change' }],
|
|
|
- 生产工序: [{ required: true, message: '请选择生产工序', trigger: 'change' }],
|
|
|
- }
|
|
|
-
|
|
|
- const processAddPartList = ref([])
|
|
|
- const processAddSelectedStage = ref('裁剪')
|
|
|
- const processAddSelectedPartKey = ref(null)
|
|
|
- const processAddByPartRows = ref({})
|
|
|
- const processAddActivePart = ref(null)
|
|
|
- const processAddCurrentRowKey = ref(null)
|
|
|
- const processLibAddSubmitCount = ref(0)
|
|
|
-
|
|
|
- const processAddDialogTableHeight = ref(460)
|
|
|
-
|
|
|
- function processAddStageKey(bigProcess) {
|
|
|
- return `stg_${String(bigProcess ?? '').trim()}`
|
|
|
- }
|
|
|
- function isProcessAddStageListKey(k) {
|
|
|
- return typeof k === 'string' && k.startsWith('stg_')
|
|
|
- }
|
|
|
-
|
|
|
- const PROCESS_LIB_LIST_LIMIT = 200
|
|
|
- const processLibNameOptions = ref([])
|
|
|
- const processLibByName = ref({})
|
|
|
- const processLibFilterQuery = ref('')
|
|
|
-
|
|
|
- const filteredProcessLibNameOptions = computed(() => {
|
|
|
- const q = processLibFilterQuery.value.trim().toLowerCase()
|
|
|
- const list = processLibNameOptions.value
|
|
|
- if (!q) return list
|
|
|
- return list.filter((opt) => {
|
|
|
- const name = String(opt.value ?? '').toLowerCase()
|
|
|
- const code = String(opt.code ?? '').toLowerCase()
|
|
|
- const bp = String(opt.big_process ?? '').toLowerCase()
|
|
|
- return name.includes(q) || code.includes(q) || bp.includes(q) || `${code} ${name}`.trim().includes(q)
|
|
|
- })
|
|
|
- })
|
|
|
-
|
|
|
- const filteredProcessLibNameOptionsForProcessAdd = computed(() => filteredProcessLibNameOptions.value)
|
|
|
-
|
|
|
- async function loadProcessLibNameOptions(req) {
|
|
|
- const toNum = (v) => {
|
|
|
- if (v === undefined || v === null || v === '') return undefined
|
|
|
- const n = Number(v)
|
|
|
- return Number.isFinite(n) ? n : undefined
|
|
|
- }
|
|
|
- const q = String(req?.search ?? '').trim()
|
|
|
- try {
|
|
|
- // 使用 GetProcessList 获取当前工单的工艺数据
|
|
|
- const res = await GetProcessList({ workorder: _Gd_gdbh.value })
|
|
|
- if (res?.code !== 0) {
|
|
|
- processLibNameOptions.value = []
|
|
|
- processLibByName.value = {}
|
|
|
- return
|
|
|
- }
|
|
|
- const list = res?.data ?? []
|
|
|
-
|
|
|
- // 根据大工艺筛选数据
|
|
|
- let filteredList = list
|
|
|
- if (q) {
|
|
|
- filteredList = list.filter((row) => {
|
|
|
- const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
|
|
|
- // 车缝包含车缝和烫工(小烫按部件算)
|
|
|
- if (q === '车缝') {
|
|
|
- return bp === '车缝' || bp === '烫工'
|
|
|
- }
|
|
|
- // 其他工序直接匹配
|
|
|
- return bp === q
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- const seen = new Set()
|
|
|
- const opts = []
|
|
|
- const byName = {}
|
|
|
- for (const row of filteredList) {
|
|
|
- const name = String(row.gy_name ?? row['工艺名称'] ?? '').trim()
|
|
|
- if (!name || seen.has(name)) continue
|
|
|
- seen.add(name)
|
|
|
- const sort = String(row.gy_sort ?? row.gy_code ?? row['工艺序号'] ?? row['工艺编号'] ?? '').trim()
|
|
|
- const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
|
|
|
- opts.push({ value: name, code: sort, big_process: bp })
|
|
|
- byName[name] = {
|
|
|
- gy_sort: sort,
|
|
|
- gy_code: String(row.gy_code ?? row['工艺编号'] ?? '').trim(),
|
|
|
- big_process: bp,
|
|
|
- standard_hour: toNum(row.standard_hour ?? row['标准工时']),
|
|
|
- standard_score: toNum(row.standard_score ?? row['标准公分'] ?? row['标准工分']),
|
|
|
- difficulty_coef: toNum(row.difficulty_coef ?? row['系数'] ?? row['难度系数']) ?? 1,
|
|
|
- }
|
|
|
- }
|
|
|
- processLibNameOptions.value = opts
|
|
|
- processLibByName.value = byName
|
|
|
- } catch (e) {
|
|
|
- console.error(e)
|
|
|
- processLibNameOptions.value = []
|
|
|
- processLibByName.value = {}
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function processLibOptStageText(opt) {
|
|
|
- const s = String(opt?.big_process ?? '').trim()
|
|
|
- return s || '—'
|
|
|
- }
|
|
|
- function onProcessLibSelectFilter(query) {
|
|
|
- processLibFilterQuery.value = query == null ? '' : String(query)
|
|
|
- }
|
|
|
- function onProcessLibSelectVisible(visible) {
|
|
|
- if (visible) processLibFilterQuery.value = ''
|
|
|
- }
|
|
|
-
|
|
|
- function processAddPartBlockKey(part, index) {
|
|
|
- return `p_${String(part?.id ?? part?.part_sort ?? part?.['部件序号'] ?? index)}`
|
|
|
- }
|
|
|
-
|
|
|
- function onProcessAddSelectStage(stage) {
|
|
|
- processAddSelectedStage.value = stage
|
|
|
- if (stage !== '车缝') {
|
|
|
- processAddSelectedPartKey.value = null
|
|
|
- processAddActivePart.value = null
|
|
|
- const stgKey = processAddStageKey(stage)
|
|
|
- processAddCurrentRowKey.value = stgKey
|
|
|
- if (!processAddByPartRows.value[stgKey]) {
|
|
|
- processAddByPartRows.value[stgKey] = [newProcessLibRow()]
|
|
|
- }
|
|
|
- loadProcessLibNameOptions({ search: stage })
|
|
|
- } else {
|
|
|
- const parts = processAddPartList.value
|
|
|
- if (parts.length) {
|
|
|
- const first = parts[0]
|
|
|
- const key = processAddPartBlockKey(first, 0)
|
|
|
- onProcessAddSelectSewingPart(first, 0)
|
|
|
- } else {
|
|
|
- processAddSelectedPartKey.value = null
|
|
|
- processAddActivePart.value = null
|
|
|
- processAddCurrentRowKey.value = null
|
|
|
- }
|
|
|
- }
|
|
|
- syncProcessAddSubmitCount()
|
|
|
- }
|
|
|
-
|
|
|
- function onProcessAddSelectSewingPart(part, index) {
|
|
|
- processAddSelectedStage.value = '车缝'
|
|
|
- const key = processAddPartBlockKey(part, index)
|
|
|
- processAddSelectedPartKey.value = key
|
|
|
- processAddActivePart.value = part
|
|
|
- processAddCurrentRowKey.value = key
|
|
|
- if (!processAddByPartRows.value[key]) {
|
|
|
- processAddByPartRows.value[key] = [newProcessLibRow()]
|
|
|
- }
|
|
|
- loadProcessLibNameOptions({ search: '车缝' })
|
|
|
- syncProcessAddSubmitCount()
|
|
|
- }
|
|
|
-
|
|
|
- function newProcessLibRow() {
|
|
|
- return {
|
|
|
- _key: `proc_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
|
- 工艺序号: '',
|
|
|
- 工艺名称: '',
|
|
|
- 生产工序: '',
|
|
|
- 标准工时: undefined,
|
|
|
- 标准工分: undefined,
|
|
|
- 难度系数: 1,
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- function onProcessLibNameSelectChangeForPart(key, index) {
|
|
|
- const rows = processAddByPartRows.value[key]
|
|
|
- if (!rows) return
|
|
|
- const row = rows[index]
|
|
|
- if (!row) return
|
|
|
- const name = String(row['工艺名称'] ?? '').trim()
|
|
|
- if (!name) {
|
|
|
- row['生产工序'] = ''
|
|
|
- row['标准工时'] = undefined
|
|
|
- row['标准工分'] = undefined
|
|
|
- row['难度系数'] = 1
|
|
|
- return
|
|
|
- }
|
|
|
- const lib = processLibByName.value[name]
|
|
|
- if (lib) {
|
|
|
- row['生产工序'] = lib.big_process
|
|
|
- row['标准工时'] = lib.standard_hour
|
|
|
- row['标准工分'] = lib.standard_score
|
|
|
- row['难度系数'] = lib.difficulty_coef ?? 1
|
|
|
- } else {
|
|
|
- row['生产工序'] = ''
|
|
|
- row['标准工时'] = undefined
|
|
|
- row['标准工分'] = undefined
|
|
|
- row['难度系数'] = 1
|
|
|
- }
|
|
|
- if (index === rows.length - 1) {
|
|
|
- rows.push(newProcessLibRow())
|
|
|
- }
|
|
|
- syncProcessAddSubmitCount()
|
|
|
- }
|
|
|
-
|
|
|
- function removeProcessLibRowForPart(key, row, index) {
|
|
|
- const rows = processAddByPartRows.value[key]
|
|
|
- if (!rows) return
|
|
|
- if (rows.length <= 1) {
|
|
|
- ElMessage.warning('至少保留一行')
|
|
|
- return
|
|
|
- }
|
|
|
- rows.splice(index, 1)
|
|
|
- syncProcessAddSubmitCount()
|
|
|
- }
|
|
|
-
|
|
|
- function syncProcessAddSubmitCount() {
|
|
|
- let n = 0
|
|
|
- for (const k in processAddByPartRows.value) {
|
|
|
- const rows = processAddByPartRows.value[k]
|
|
|
- if (!Array.isArray(rows)) continue
|
|
|
- for (const r of rows) {
|
|
|
- const name = String(r['工艺名称'] ?? '').trim()
|
|
|
- if (name) n++
|
|
|
- }
|
|
|
- }
|
|
|
- processLibAddSubmitCount.value = n
|
|
|
- }
|
|
|
-
|
|
|
- function resetProcessLibForm() {
|
|
|
- processIsEdit.value = false
|
|
|
- processForm.id = undefined
|
|
|
- processForm['工艺序号'] = ''
|
|
|
- processForm['工艺名称'] = ''
|
|
|
- processForm['生产工序'] = ''
|
|
|
- processForm['标准工时'] = undefined
|
|
|
- processForm['标准工分'] = undefined
|
|
|
- processForm['难度系数'] = 1
|
|
|
- processAddPartList.value = []
|
|
|
- processAddByPartRows.value = {}
|
|
|
- processAddSelectedStage.value = '裁剪'
|
|
|
- processAddSelectedPartKey.value = null
|
|
|
- processAddActivePart.value = null
|
|
|
- processAddCurrentRowKey.value = null
|
|
|
- processLibAddSubmitCount.value = 0
|
|
|
- processFormRef.value?.clearValidate?.()
|
|
|
- }
|
|
|
-
|
|
|
- // 打开新增工艺资料弹窗
|
|
|
- const addgdgy_onclick = async () => {
|
|
|
- if(!_Gd_gdbh.value){
|
|
|
- ElMessage.warning('请先选择具体的工单后,再操作此功能')
|
|
|
- return
|
|
|
- }
|
|
|
- // 初始化工艺添加相关数据
|
|
|
- resetProcessLibForm()
|
|
|
- try {
|
|
|
- // 获取部件列表
|
|
|
- const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
- if (partRes?.code !== 0 || !Array.isArray(partRes.data)) {
|
|
|
- ElMessage.error('获取部件列表失败')
|
|
|
- return
|
|
|
- }
|
|
|
- const parts = partRes.data
|
|
|
- processAddPartList.value = parts
|
|
|
-
|
|
|
- // 加载工艺库
|
|
|
- await loadProcessLibNameOptions({ search: '裁剪' })
|
|
|
-
|
|
|
- // 设置默认选中的工序
|
|
|
- processAddSelectedStage.value = '裁剪'
|
|
|
- const stgKey = processAddStageKey('裁剪')
|
|
|
- processAddCurrentRowKey.value = stgKey
|
|
|
- processAddByPartRows.value[stgKey] = [newProcessLibRow()]
|
|
|
-
|
|
|
- // 如果有部件,设置默认选中的部件
|
|
|
- if (parts.length) {
|
|
|
- const first = parts[0]
|
|
|
- const key = processAddPartBlockKey(first, 0)
|
|
|
- processAddByPartRows.value[key] = [newProcessLibRow()]
|
|
|
- }
|
|
|
-
|
|
|
- processAddDialogVisible.value = true
|
|
|
- } catch (e) {
|
|
|
- console.error('获取工艺名称列表失败', e)
|
|
|
- ElMessage.error('获取工艺名称列表失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 打开新增工艺资料弹窗
|
|
|
- const openProcessAdd = async () => {
|
|
|
- await addgdgy_onclick()
|
|
|
- }
|
|
|
-
|
|
|
- // 部件列表数据
|
|
|
- const partListData = ref([])
|
|
|
-
|
|
|
- // 打开新增部件资料弹窗
|
|
|
- const openPartAdd = async () => {
|
|
|
- if(!_Gd_gdbh.value){
|
|
|
- ElMessage.warning('请先选择具体的工单后,再操作此功能')
|
|
|
- return
|
|
|
- }
|
|
|
- resetPartLibForm()
|
|
|
- // 获取部件名称下拉列表
|
|
|
- try {
|
|
|
- // 调用ParList获取部件列表
|
|
|
- const parRes = await ParList({ page: 1, limit: 100 })
|
|
|
- console.log('ParList接口返回数据:', parRes)
|
|
|
- if (parRes?.code === 0) {
|
|
|
- const list = parRes?.data?.list ?? []
|
|
|
- console.log('部件列表数据:', list)
|
|
|
- partListData.value = list
|
|
|
- // 提取部件名称
|
|
|
- const seen = new Set()
|
|
|
- const opts = []
|
|
|
- for (const row of list) {
|
|
|
- const name = String(row.part_name ?? row['部件名称'] ?? '').trim()
|
|
|
- if (!name || seen.has(name)) continue
|
|
|
- seen.add(name)
|
|
|
- opts.push(name)
|
|
|
- }
|
|
|
- partNameOptions.value = opts
|
|
|
- console.log('部件名称选项:', partNameOptions.value)
|
|
|
- }
|
|
|
- // 获取已存在的部件名称和最大序号
|
|
|
- const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
- if (partRes?.code === 0 && Array.isArray(partRes.data)) {
|
|
|
- partAddExistingNames.value = new Set(partRes.data.map(p => p.部件名称))
|
|
|
- // 计算已存在的最大部件序号
|
|
|
- let maxSort = 0
|
|
|
- for (const part of partRes.data) {
|
|
|
- const sort = Number(part.部件序号) || 0
|
|
|
- if (sort > maxSort) {
|
|
|
- maxSort = sort
|
|
|
- }
|
|
|
- }
|
|
|
- partAddMaxExistingSort.value = maxSort
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.error('获取部件名称列表失败', e)
|
|
|
- ElMessage.error('获取部件名称列表失败')
|
|
|
- }
|
|
|
- // 初始化新增行
|
|
|
- partAddRows.value = [newPartLibRow()]
|
|
|
- syncPartAddRowSorts()
|
|
|
- partAddDialogVisible.value = true
|
|
|
- }
|
|
|
-
|
|
|
- // 重置部件表单
|
|
|
- const resetPartLibForm = () => {
|
|
|
- partIsEdit.value = false
|
|
|
- partAddForm.部件序号 = ''
|
|
|
- partAddForm.部件名称 = ''
|
|
|
- partAddForm.部件编号 = ''
|
|
|
- partAddForm.部件类型 = ''
|
|
|
- partAddForm.部件备注 = ''
|
|
|
- partAddRows.value = []
|
|
|
- partAddMaxExistingSort.value = 0
|
|
|
- partAddExistingNames.value = new Set()
|
|
|
- // 不要清空partNameOptions,因为它是通过ParList接口获取的
|
|
|
- }
|
|
|
-
|
|
|
- // 新建部件行
|
|
|
- const newPartLibRow = () => {
|
|
|
- return {
|
|
|
- _key: Date.now() + Math.random(),
|
|
|
- 部件序号: '',
|
|
|
- 部件名称: '',
|
|
|
- 部件编号: '',
|
|
|
- 部件类型: '',
|
|
|
- 部件备注: ''
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 同步部件行序号
|
|
|
- const syncPartAddRowSorts = () => {
|
|
|
- const rows = partAddRows.value
|
|
|
- const base = partAddMaxExistingSort.value
|
|
|
- for (let i = 0; i < rows.length; i++) {
|
|
|
- rows[i].部件序号 = String(base + i + 1)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 部件名称变化处理
|
|
|
- const onPartNameChange = (index) => {
|
|
|
- const row = partAddRows.value[index]
|
|
|
- if (!row) return
|
|
|
- const name = String(row.部件名称 ?? '').trim()
|
|
|
- if (name) {
|
|
|
- // 检查是否重复
|
|
|
- if (partAddExistingNames.value.has(name)) {
|
|
|
- ElMessage.warning('该工单下已存在该部件名称,请勿重复添加')
|
|
|
- row.部件名称 = ''
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 检查同批添加中是否重复
|
|
|
- for (let i = 0; i < partAddRows.value.length; i++) {
|
|
|
- if (i === index) continue
|
|
|
- if (String(partAddRows.value[i].部件名称 ?? '').trim() === name) {
|
|
|
- ElMessage.warning('该部件名称已在其他行选择,请勿重复')
|
|
|
- row.部件名称 = ''
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 根据部件名称填充部件编号、部件类型和部件备注
|
|
|
- const part = partListData.value.find(p => {
|
|
|
- return String(p.part_name ?? p['部件名称'] ?? '').trim() === name
|
|
|
- })
|
|
|
- if (part) {
|
|
|
- row.部件编号 = String(part.part_code ?? part['部件编码'] ?? '').trim()
|
|
|
- row.部件类型 = ''
|
|
|
- row.部件备注 = '' // 默认为空
|
|
|
- }
|
|
|
-
|
|
|
- // 自动添加新行
|
|
|
- if (index === partAddRows.value.length - 1) {
|
|
|
- partAddRows.value.push(newPartLibRow())
|
|
|
- syncPartAddRowSorts()
|
|
|
- }
|
|
|
- } else {
|
|
|
- // 清空相关字段
|
|
|
- row.部件编号 = ''
|
|
|
- row.部件类型 = ''
|
|
|
- row.部件备注 = ''
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 删除部件行
|
|
|
- const removePartRow = (index) => {
|
|
|
- if (partAddRows.value.length <= 1) {
|
|
|
- ElMessage.warning('至少保留一行')
|
|
|
- return
|
|
|
- }
|
|
|
- partAddRows.value.splice(index, 1)
|
|
|
- syncPartAddRowSorts()
|
|
|
- }
|
|
|
-
|
|
|
- // 关闭新增部件资料弹窗
|
|
|
- const partAddCloseDialog = () => {
|
|
|
- partAddDialogVisible.value = false
|
|
|
- }
|
|
|
-
|
|
|
- // 确认新增部件资料
|
|
|
- const partAddConfirm = async () => {
|
|
|
- // 收集有效行
|
|
|
- const validRows = []
|
|
|
- for (const row of partAddRows.value) {
|
|
|
- const name = String(row.部件名称 ?? '').trim()
|
|
|
- if (name) {
|
|
|
- validRows.push({
|
|
|
- part_name: name,
|
|
|
- part_code: String(row.部件编号 ?? '').trim(),
|
|
|
- part_type: String(row.部件类型 ?? '').trim(),
|
|
|
- remark: String(row.部件备注 ?? '').trim(),
|
|
|
- part_sort: String(row.部件序号 ?? '').trim()
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (validRows.length === 0) {
|
|
|
- ElMessage.warning('请至少填写一个部件')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- for (const row of validRows) {
|
|
|
- const res = await AddPart({
|
|
|
- workorder: _Gd_sckh.value,
|
|
|
- part_name: row.part_name,
|
|
|
- part_code: row.part_code,
|
|
|
- part_type: row.part_type,
|
|
|
- remark: row.remark,
|
|
|
- sys_id: userStore.userInfo.nickName
|
|
|
- })
|
|
|
- if (res?.code !== 0) {
|
|
|
- throw new Error(res.msg || '新增部件资料失败')
|
|
|
- }
|
|
|
- }
|
|
|
- ElMessage.success('新增部件资料成功')
|
|
|
- partAddDialogVisible.value = false
|
|
|
- // 刷新部件资料列表
|
|
|
- await loadPartAndProcessData()
|
|
|
- } catch (e) {
|
|
|
- console.error('新增部件资料失败', e)
|
|
|
- ElMessage.error(e.message || '新增部件资料失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 关闭新增工艺资料弹窗
|
|
|
- const processAddCloseDialog = () => {
|
|
|
- processAddDialogVisible.value = false
|
|
|
- }
|
|
|
-
|
|
|
- // 确认新增工艺资料
|
|
|
- const processAddConfirm = async () => {
|
|
|
- // 收集有效行
|
|
|
- const validRows = []
|
|
|
- for (const key in processAddByPartRows.value) {
|
|
|
- const rows = processAddByPartRows.value[key]
|
|
|
- if (!Array.isArray(rows)) continue
|
|
|
- for (const row of rows) {
|
|
|
- const name = String(row.工艺名称 ?? '').trim()
|
|
|
- const stage = String(row.生产工序 ?? '').trim()
|
|
|
- if (name && stage) {
|
|
|
- validRows.push({
|
|
|
- key: key,
|
|
|
- process_name: name,
|
|
|
- big_process: stage,
|
|
|
- process_code: String(row.工艺序号 ?? '').trim(),
|
|
|
- standard_hour: row.标准工时,
|
|
|
- standard_score: row.标准工分,
|
|
|
- coefficient: row.难度系数
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (validRows.length === 0) {
|
|
|
- ElMessage.warning('请至少填写一个工艺')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- for (const row of validRows) {
|
|
|
- // 确定部件号:如果是车缝工序,从部件中获取部件编号作为部件号
|
|
|
- let part_code = ''
|
|
|
- if (row.big_process === '车缝' && processAddActivePart.value) {
|
|
|
- part_code = String(processAddActivePart.value.part_code ?? processAddActivePart.value['部件编号'] ?? '').trim()
|
|
|
- }
|
|
|
-
|
|
|
- const res = await AddProcess({
|
|
|
- workorder: _Gd_gdbh.value,
|
|
|
- part_code: part_code,
|
|
|
- process_name: row.process_name,
|
|
|
- process_code: row.process_code,
|
|
|
- big_process: row.big_process,
|
|
|
- standard_hour: row.standard_hour,
|
|
|
- standard_score: row.standard_score,
|
|
|
- coefficient: row.coefficient,
|
|
|
- remark: '',
|
|
|
- sys_id: userStore.userInfo?.nickName || ''
|
|
|
- })
|
|
|
- if (res?.code !== 0) {
|
|
|
- throw new Error(res.msg || '新增工艺资料失败')
|
|
|
- }
|
|
|
- }
|
|
|
- ElMessage.success('新增工艺资料成功')
|
|
|
- processAddDialogVisible.value = false
|
|
|
- // 刷新工艺资料列表
|
|
|
- await loadPartAndProcessData()
|
|
|
- } catch (e) {
|
|
|
- console.error('新增工艺资料失败', e)
|
|
|
- ElMessage.error(e.message || '新增工艺资料失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 打开排序弹窗
|
|
|
- const openSortDialog = async () => {
|
|
|
- await openSortPartGyDialog()
|
|
|
- }
|
|
|
-
|
|
|
- // 打开排序弹窗(新)
|
|
|
- const openSortPartGyDialog = async () => {
|
|
|
- if(!_Gd_gdbh.value){
|
|
|
- ElMessage.warning('请先选择具体的工单后,再操作此功能')
|
|
|
- return
|
|
|
- }
|
|
|
- sortPartGyDialogVisible.value = true
|
|
|
- sortDialogLoading.value = true
|
|
|
- sortDialogSewingGroups.value = []
|
|
|
- sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
|
|
|
- try {
|
|
|
- // 获取部件列表
|
|
|
- const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
- const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
|
|
|
-
|
|
|
- // 获取工艺列表
|
|
|
- const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
|
|
|
- const rawGy = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
|
|
|
- const gyNorm = rawGy.map((r) => normalizeGyRow(r))
|
|
|
-
|
|
|
- // 构建排序数据
|
|
|
- sortDialogSewingGroups.value = buildSortSewingGroups(parts, rawGy)
|
|
|
- sortDialogStageGys.value = buildSortStageGys(gyNorm)
|
|
|
- reindexSortDialogGroupsDisplay()
|
|
|
- sortDialogViewStage.value = '裁剪'
|
|
|
- sortDialogSelectedPartId.value = sortDialogSewingGroups.value[0]?.part?.id ?? null
|
|
|
- sortDialogInitialSnapshot.value = JSON.stringify(snapshotSortDialogStateV2())
|
|
|
-
|
|
|
- // 加载工艺库数据
|
|
|
- // await loadProcessLibNameOptions({ search: '裁剪' })
|
|
|
- } catch (e) {
|
|
|
- console.error('加载排序数据失败', e)
|
|
|
- ElMessage.error('加载排序数据失败')
|
|
|
- } finally {
|
|
|
- sortDialogLoading.value = false
|
|
|
- }
|
|
|
- bindSortPartGyDrag()
|
|
|
- }
|
|
|
-
|
|
|
- // 关闭排序弹窗
|
|
|
- const sortCloseDialog = () => {
|
|
|
- sortPartGyDialogVisible.value = false
|
|
|
- }
|
|
|
-
|
|
|
- // 排序弹窗关闭时的清理
|
|
|
- const onSortPartGyDialogClosed = () => {
|
|
|
- destroySortPartGySortables()
|
|
|
- sortDialogSewingGroups.value = []
|
|
|
- sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
|
|
|
- sortDialogViewStage.value = '裁剪'
|
|
|
- sortDialogSelectedPartId.value = null
|
|
|
- sortDialogInitialSnapshot.value = null
|
|
|
- }
|
|
|
-
|
|
|
- // 数字排序键
|
|
|
- const numSortKey = (v) => {
|
|
|
- if (v === undefined || v === null || v === '') return 0
|
|
|
- const n = Number(v)
|
|
|
- return Number.isFinite(n) ? n : 0
|
|
|
- }
|
|
|
-
|
|
|
- // 按部件序号升序排序
|
|
|
- const sortByPartSortAsc = (parts) => {
|
|
|
- return [...parts].sort((a, b) => numSortKey(a.部件序号) - numSortKey(b.部件序号))
|
|
|
- }
|
|
|
-
|
|
|
- // 标准化工艺行数据
|
|
|
- const normalizeGyRow = (row) => {
|
|
|
- return {
|
|
|
- id: row.工艺ID || row.id,
|
|
|
- gy_name: row.工艺名称 || row.gy_name,
|
|
|
- '工艺名称': row.工艺名称 || row.gy_name,
|
|
|
- big_process: row.大工艺 || row.生产工序 || row.big_process,
|
|
|
- '大工艺': row.大工艺 || row.生产工序 || row.big_process,
|
|
|
- part_sort: row.部件序号 || row.part_sort,
|
|
|
- '部件序号': row.部件序号 || row.part_sort,
|
|
|
- part_name: row.部件名称 || row.part_name,
|
|
|
- '部件名称': row.部件名称 || row.part_name,
|
|
|
- part_code: row.部件编号 || row.part_code,
|
|
|
- '部件编号': row.部件编号 || row.part_code,
|
|
|
- gy_sort: row.工艺序号 || row.gy_sort,
|
|
|
- '工艺序号': row.工艺序号 || row.gy_sort,
|
|
|
- gy_code: row.工艺编号 || row.gy_code,
|
|
|
- '工艺编号': row.工艺编号 || row.gy_code,
|
|
|
- standard_hour: row.标准工时 || row.standard_hour,
|
|
|
- '标准工时': row.标准工时 || row.standard_hour,
|
|
|
- standard_score: row.标准公分 || row.标准工分 || row.standard_score,
|
|
|
- '标准公分': row.标准公分 || row.标准工分 || row.standard_score,
|
|
|
- '标准工分': row.标准公分 || row.标准工分 || row.standard_score,
|
|
|
- difficulty_coef: row.系数 || row.难度系数 || row.difficulty_coef,
|
|
|
- '系数': row.系数 || row.难度系数 || row.difficulty_coef,
|
|
|
- '难度系数': row.系数 || row.难度系数 || row.difficulty_coef,
|
|
|
- remark: row.备注 || row.remark,
|
|
|
- '备注': row.备注 || row.remark
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 构建车缝工序的部件-工艺分组(包含车缝和烫工)
|
|
|
- const buildSortSewingGroups = (parts, processes) => {
|
|
|
- const list = sortByPartSortAsc(Array.isArray(parts) ? parts : [])
|
|
|
- console.log('部件列表:', list)
|
|
|
- console.log('工艺列表:', processes)
|
|
|
- return list.map((part) => {
|
|
|
- const partName = String(part.部件名称 || '').trim()
|
|
|
- console.log('处理部件:', partName)
|
|
|
- const gys = processes
|
|
|
- .map((g) => {
|
|
|
- const normalized = normalizeGyRow(g)
|
|
|
- // 保留原始字段
|
|
|
- return {
|
|
|
- ...g,
|
|
|
- ...normalized
|
|
|
- }
|
|
|
- })
|
|
|
- .filter((g) => {
|
|
|
- const bigProcess = String(g.big_process ?? g.大工艺 ?? '').trim()
|
|
|
- const processPartName = String(g.part_name ?? g.部件名称 ?? '').trim()
|
|
|
- // 车缝包含车缝和烫工(小烫按部件算)
|
|
|
- const match = (bigProcess === '车缝' || bigProcess === '烫工') && processPartName === partName
|
|
|
- console.log('过滤工艺:', { bigProcess, processPartName, partName, match })
|
|
|
- return match
|
|
|
- })
|
|
|
- .sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
|
|
|
- console.log('匹配的工艺:', gys)
|
|
|
- return { part: { ...part, id: part.部件ID || part.id }, gys }
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- // 构建非车缝工序的工艺列表
|
|
|
- const buildSortStageGys = (processes) => {
|
|
|
- const stages = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
|
|
|
- for (const raw of processes) {
|
|
|
- const g = normalizeGyRow({ ...raw })
|
|
|
- const bp = String(g.big_process ?? '').trim()
|
|
|
- if (bp === '车缝' || !SORT_NON_SEWING_STAGES.includes(bp)) continue
|
|
|
- stages[bp].push(g)
|
|
|
- }
|
|
|
- for (const st of SORT_NON_SEWING_STAGES) {
|
|
|
- stages[st] = (stages[st] || []).sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
|
|
|
- }
|
|
|
- return stages
|
|
|
- }
|
|
|
-
|
|
|
- // 重新索引排序对话框中的显示序号
|
|
|
- const reindexSortDialogGroupsDisplay = () => {
|
|
|
- sortDialogSewingGroups.value.forEach((grp, i) => {
|
|
|
- const partSortStr = String(i + 1)
|
|
|
- if (grp.part && typeof grp.part === 'object') {
|
|
|
- grp.part.part_sort = partSortStr
|
|
|
- }
|
|
|
- const partName = String(grp.part?.部件名称 ?? '').trim()
|
|
|
- const gys = grp.gys
|
|
|
- if (!Array.isArray(gys)) return
|
|
|
- gys.forEach((row, j) => {
|
|
|
- const gyStr = String(j + 1)
|
|
|
- row.gy_sort = gyStr
|
|
|
- row['工艺序号'] = gyStr
|
|
|
- row.part_sort = partSortStr
|
|
|
- row['部件序号'] = partSortStr
|
|
|
- row.part_name = partName
|
|
|
- row['部件名称'] = partName
|
|
|
- row.big_process = '车缝'
|
|
|
- row['生产工序'] = '车缝'
|
|
|
- // 确保工艺名称等属性存在
|
|
|
- if (!row['工艺名称']) {
|
|
|
- row['工艺名称'] = row.gy_name || row.工艺名称 || ''
|
|
|
- }
|
|
|
- if (!row['标准工时']) {
|
|
|
- row['标准工时'] = row.standard_hour || row.标准工时 || ''
|
|
|
- }
|
|
|
- if (!row['标准工分']) {
|
|
|
- row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
|
|
|
- }
|
|
|
- if (!row['难度系数']) {
|
|
|
- row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
|
|
|
- }
|
|
|
- })
|
|
|
- })
|
|
|
- for (const st of SORT_NON_SEWING_STAGES) {
|
|
|
- const gys = sortDialogStageGys.value[st] || []
|
|
|
- gys.forEach((row, j) => {
|
|
|
- const gyStr = String(j + 1)
|
|
|
- row.gy_sort = gyStr
|
|
|
- row['工艺序号'] = gyStr
|
|
|
- row.part_sort = ''
|
|
|
- row['部件序号'] = ''
|
|
|
- row.part_name = ''
|
|
|
- row['部件名称'] = ''
|
|
|
- row.big_process = st
|
|
|
- row['生产工序'] = st
|
|
|
- // 确保工艺名称等属性存在
|
|
|
- if (!row['工艺名称']) {
|
|
|
- row['工艺名称'] = row.gy_name || row.工艺名称 || ''
|
|
|
- }
|
|
|
- if (!row['标准工时']) {
|
|
|
- row['标准工时'] = row.standard_hour || row.标准工时 || ''
|
|
|
- }
|
|
|
- if (!row['标准工分']) {
|
|
|
- row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
|
|
|
- }
|
|
|
- if (!row['难度系数']) {
|
|
|
- row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 快照排序对话框状态
|
|
|
- const snapshotSortDialogStateV2 = () => {
|
|
|
- return {
|
|
|
- sewing: sortDialogSewingGroups.value.map((g) => ({
|
|
|
- partId: g.part?.id,
|
|
|
- partCode: g.part?.部件编号,
|
|
|
- gyIds: g.gys.map((gy) => gy.id)
|
|
|
- })),
|
|
|
- stages: Object.fromEntries(
|
|
|
- SORT_NON_SEWING_STAGES.map((st) => [
|
|
|
- st,
|
|
|
- sortDialogStageGys.value[st]?.map((gy) => gy.id) || []
|
|
|
- ])
|
|
|
- )
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 绑定部件和工艺的拖拽功能
|
|
|
- const bindSortPartGyDrag = () => {
|
|
|
- destroySortPartGySortables()
|
|
|
- if (!sortPartGyDialogVisible.value) return
|
|
|
-
|
|
|
- // 绑定部件拖拽
|
|
|
- const partListEl = document.querySelector('.sort-part-gy-sewing-parts')
|
|
|
- if (partListEl) {
|
|
|
- new Sortable(partListEl, {
|
|
|
- draggable: '.sort-part-gy-part-item',
|
|
|
- animation: 180,
|
|
|
- onEnd: (event) => {
|
|
|
- if (event.oldIndex !== event.newIndex) {
|
|
|
- // 重新排序部件
|
|
|
- const groups = [...sortDialogSewingGroups.value]
|
|
|
- const [moved] = groups.splice(event.oldIndex, 1)
|
|
|
- groups.splice(event.newIndex, 0, moved)
|
|
|
- sortDialogSewingGroups.value = groups
|
|
|
- // 重新索引
|
|
|
- reindexSortDialogGroupsDisplay()
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- // 绑定工艺拖拽
|
|
|
- const processTableEl = document.querySelector('.sort-gy-table .el-table__body-wrapper tbody')
|
|
|
- if (processTableEl) {
|
|
|
- new Sortable(processTableEl, {
|
|
|
- handle: '.sort-drag-handle',
|
|
|
- animation: 180,
|
|
|
- onEnd: (event) => {
|
|
|
- if (event.oldIndex !== event.newIndex) {
|
|
|
- const stage = sortDialogViewStage.value
|
|
|
- if (stage === '车缝' && sortDialogSelectedPartId.value) {
|
|
|
- // 车缝工艺排序
|
|
|
- const group = sortDialogSewingGroups.value.find(
|
|
|
- g => String(g.part?.id) === String(sortDialogSelectedPartId.value)
|
|
|
- )
|
|
|
- if (group && Array.isArray(group.gys)) {
|
|
|
- const gys = [...group.gys]
|
|
|
- const [moved] = gys.splice(event.oldIndex, 1)
|
|
|
- gys.splice(event.newIndex, 0, moved)
|
|
|
- group.gys = gys
|
|
|
- // 重新索引
|
|
|
- reindexSortDialogGroupsDisplay()
|
|
|
- }
|
|
|
- } else if (stage && SORT_NON_SEWING_STAGES.includes(stage)) {
|
|
|
- // 非车缝工艺排序
|
|
|
- const gys = [...sortDialogStageGys.value[stage]]
|
|
|
- const [moved] = gys.splice(event.oldIndex, 1)
|
|
|
- gys.splice(event.newIndex, 0, moved)
|
|
|
- sortDialogStageGys.value[stage] = gys
|
|
|
- // 重新索引
|
|
|
- reindexSortDialogGroupsDisplay()
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 销毁拖拽实例
|
|
|
- const destroySortPartGySortables = () => {
|
|
|
- // 这里可以添加销毁拖拽实例的代码
|
|
|
- // 由于我们使用的是局部变量创建Sortable实例,不需要显式销毁
|
|
|
- }
|
|
|
-
|
|
|
- // 选择排序对话框的视图工序
|
|
|
- const onSortDialogViewStageSelect = async (stage) => {
|
|
|
- sortDialogViewStage.value = stage
|
|
|
- if (stage !== '车缝') {
|
|
|
- sortDialogSelectedPartId.value = null
|
|
|
- }
|
|
|
- // 加载工艺库数据
|
|
|
- const loadSt = stage === '车缝' ? '车缝' : stage
|
|
|
- await loadProcessLibNameOptions({ search: loadSt })
|
|
|
- // 重新绑定拖拽
|
|
|
- nextTick(() => {
|
|
|
- destroySortPartGySortables()
|
|
|
- bindSortPartGyDrag()
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- // 选择车缝工序的部件
|
|
|
- const onSortDialogSelectSewingPart = async (partId) => {
|
|
|
- sortDialogSelectedPartId.value = partId
|
|
|
- sortDialogViewStage.value = '车缝'
|
|
|
- // 加载工艺库数据
|
|
|
- await loadProcessLibNameOptions({ search: '车缝' })
|
|
|
- // 重新绑定拖拽
|
|
|
- nextTick(() => {
|
|
|
- destroySortPartGySortables()
|
|
|
- bindSortPartGyDrag()
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- // 排序弹窗中工艺名称变化处理
|
|
|
- const onSortDialogGyNameChange = (row) => {
|
|
|
- const name = String(row['工艺名称'] ?? '').trim()
|
|
|
- if (!name) return
|
|
|
- const info = processLibByName.value[name]
|
|
|
- if (info) {
|
|
|
- row['标准工时'] = info.standard_hour
|
|
|
- row['标准工分'] = info.standard_score
|
|
|
- row['难度系数'] = info.difficulty_coef ?? 1
|
|
|
- if (!row['生产工序'] && info.big_process) {
|
|
|
- row['生产工序'] = info.big_process
|
|
|
- row.big_process = info.big_process
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 复制产品资料 - 打开弹窗
|
|
|
- const copyProductData = () => {
|
|
|
- if(!_Gd_gdbh.value){
|
|
|
- ElMessage.warning('请先选择具体的工单')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- copyProductTableData.value = []
|
|
|
- copyProductFormData.value.gdbh = _Gd_gdbh.value
|
|
|
- copyProductFormData.value.ks = ''
|
|
|
- copyProductSelectedRow.value = null
|
|
|
- copyProductSearchText.value = ''
|
|
|
- copyProductDialogVisible.value = true
|
|
|
- }
|
|
|
-
|
|
|
- // 复制产品资料搜索
|
|
|
- const copyProductSearch = async () => {
|
|
|
- if(!copyProductSearchText.value.trim()){
|
|
|
- ElMessage.warning('请输入搜索内容')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- const res = await WorkOrderList({ search: copyProductSearchText.value, page: 1, limit: 100 })
|
|
|
- if (res?.code === 0 && res.data && Array.isArray(res.data.data)) {
|
|
|
- copyProductTableData.value = res.data.data
|
|
|
- copyProductSelectedRow.value = null
|
|
|
- } else {
|
|
|
- copyProductTableData.value = []
|
|
|
- ElMessage.info('未找到匹配的工单')
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.error('搜索工单失败', e)
|
|
|
- ElMessage.error('搜索工单失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 复制产品资料表格行点击
|
|
|
- const copyProductTableRowClick = (row) => {
|
|
|
- copyProductSelectedRow.value = row
|
|
|
- copyProductFormData.value['生产款号'] = row.生产款号 || ''
|
|
|
- }
|
|
|
-
|
|
|
- // 复制产品资料确认
|
|
|
- const copyProductHandleConfirm = async () => {
|
|
|
- if(!copyProductSelectedRow.value) {
|
|
|
- ElMessage.warning('请选择要复制的工单')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- // 调用copyProcessToCurrentWorkOrder接口
|
|
|
- const res = await copyProcessToCurrentWorkOrder({
|
|
|
- target_workorder: copyProductSelectedRow.value.订单编号,
|
|
|
- current_workorder: _Gd_gdbh.value,
|
|
|
- sys_id: userStore.userInfo.nickName
|
|
|
- })
|
|
|
-
|
|
|
- if (res?.code === 0) {
|
|
|
- ElMessage.success('复制工艺资料成功')
|
|
|
- copyProductDialogVisible.value = false
|
|
|
- // 刷新数据
|
|
|
- await loadPartAndProcessData()
|
|
|
- } else {
|
|
|
- ElMessage.error('复制工艺资料失败')
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.error('复制工艺资料失败', e)
|
|
|
- ElMessage.error('复制工艺资料失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 复制产品资料取消
|
|
|
- const copyProductHandleCancel = () => {
|
|
|
- copyProductDialogVisible.value = false
|
|
|
- copyProductSelectedRow.value = null
|
|
|
- }
|
|
|
-
|
|
|
- // 保存排序
|
|
|
- const submitSortPartGy = async () => {
|
|
|
- if (!_Gd_gdbh.value) return
|
|
|
-
|
|
|
- sortDialogSubmitLoading.value = true
|
|
|
- try {
|
|
|
- // 构建工艺排序数据
|
|
|
- const process_list = []
|
|
|
-
|
|
|
- // 处理车缝工艺
|
|
|
- sortDialogSewingGroups.value.forEach((g) => {
|
|
|
- const rows = g.gys || []
|
|
|
- for (let j = 0; j < rows.length; j++) {
|
|
|
- const r = rows[j]
|
|
|
- if (r.id == null) continue
|
|
|
- process_list.push({
|
|
|
- id: r.id,
|
|
|
- process_code: j + 1
|
|
|
- })
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- // 处理非车缝工艺
|
|
|
- for (const st of SORT_NON_SEWING_STAGES) {
|
|
|
- const rows = sortDialogStageGys.value[st] || []
|
|
|
- for (let j = 0; j < rows.length; j++) {
|
|
|
- const r = rows[j]
|
|
|
- if (r.id == null) continue
|
|
|
- process_list.push({
|
|
|
- id: r.id,
|
|
|
- process_code: j + 1
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (process_list.length === 0) {
|
|
|
- ElMessage.warning('无工艺数据可保存')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 调用保存接口
|
|
|
- const res = await sortProcess(process_list)
|
|
|
-
|
|
|
- if (res?.code === 0) {
|
|
|
- ElMessage.success('排序保存成功')
|
|
|
- sortPartGyDialogVisible.value = false
|
|
|
- // 刷新数据
|
|
|
- await loadPartAndProcessData()
|
|
|
- } else {
|
|
|
- ElMessage.error(res?.msg || '保存失败')
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.error('保存排序失败', e)
|
|
|
- ElMessage.error('保存排序失败')
|
|
|
- } finally {
|
|
|
- sortDialogSubmitLoading.value = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 排序对话框是否有数据
|
|
|
- const sortDialogHasData = computed(() => {
|
|
|
- return sortDialogSewingGroups.value.length > 0 ||
|
|
|
- Object.values(sortDialogStageGys.value).some(gys => gys.length > 0)
|
|
|
- })
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- // 加载排序表格数据
|
|
|
- const loadSortTableData = async () => {
|
|
|
- try {
|
|
|
- // 获取部件列表
|
|
|
- const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
- const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
|
|
|
-
|
|
|
- // 获取工艺列表
|
|
|
- const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
|
|
|
- const processes = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
|
|
|
-
|
|
|
- // 构建排序表格数据
|
|
|
- sortTableData.value = parts.map(part => ({
|
|
|
- 部件ID: part.部件ID || part.id,
|
|
|
- 部件编号: part.部件编号,
|
|
|
- 部件名称: part.部件名称,
|
|
|
- gyList: processes.filter(gy => String(gy.部件编号) === String(part.部件编号))
|
|
|
- }))
|
|
|
- } catch (e) {
|
|
|
- console.error('加载排序数据失败', e)
|
|
|
- ElMessage.error('加载排序数据失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // 确认排序
|
|
|
- const sortConfirm = async () => {
|
|
|
- try {
|
|
|
- // 按顺序更新部件序号
|
|
|
- for (let i = 0; i < sortTableData.value.length; i++) {
|
|
|
- const part = sortTableData.value[i]
|
|
|
- await UpdatePartInfo({
|
|
|
- workorder: _Gd_gdbh.value,
|
|
|
- part_code: part.部件编号,
|
|
|
- part_sort: i + 1
|
|
|
- })
|
|
|
- // 按顺序更新工艺序号
|
|
|
- const gyList = part.gyList
|
|
|
- for (let j = 0; j < gyList.length; j++) {
|
|
|
- const gy = gyList[j]
|
|
|
- await UpdateProcess({
|
|
|
- workorder: _Gd_gdbh.value,
|
|
|
- part_code: part.部件编号,
|
|
|
- process_code: gy.工艺编号,
|
|
|
- process_sort: j + 1
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
- ElMessage.success('排序保存成功')
|
|
|
- sortDialogVisible.value = false
|
|
|
- // 刷新部件和工艺列表
|
|
|
- await loadPartAndProcessData()
|
|
|
- } catch (e) {
|
|
|
- console.error('保存排序失败', e)
|
|
|
- ElMessage.error('保存排序失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 刷新部件和工艺数据
|
|
|
- const loadPartAndProcessData = async () => {
|
|
|
- const partListData = await PartList({ workorder: _Gd_gdbh.value });
|
|
|
- if (partListData?.code === 0 && Array.isArray(partListData.data)) {
|
|
|
- parttableData.splice(0, parttableData.length, ...partListData.data);
|
|
|
- } else {
|
|
|
- parttableData.splice(0, parttableData.length);
|
|
|
- }
|
|
|
-
|
|
|
- const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
- if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
- gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
- } else {
|
|
|
- gytableData.splice(0, gytableData.length);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //新增工序资料确定按钮
|
|
|
- const add_gxenterDialog = () => {
|
|
|
- console.log(form)
|
|
|
- const formattedData = {
|
|
|
- ckck: form['仓库出库'],
|
|
|
- cq: form['裁剪'],
|
|
|
- cf: form['车缝'],
|
|
|
- hdsy: form['手工'],
|
|
|
- dt: form['大烫'],
|
|
|
- zj: form['总检'],
|
|
|
- bz: form['包装']
|
|
|
- };
|
|
|
- // true 选择 fasle 未选择
|
|
|
- for (let key in formattedData) {
|
|
|
- if (formattedData[key] === true) {
|
|
|
- formattedData[key] = 1;
|
|
|
- } else if (formattedData[key] === false) {
|
|
|
- formattedData[key] = 2;
|
|
|
- }
|
|
|
- }
|
|
|
- console.log(formattedData)
|
|
|
- }
|
|
|
-
|
|
|
- //新增工序资料取消按钮
|
|
|
- const add_gxcloseDialog = () => {
|
|
|
- visible.value = false;
|
|
|
- }
|
|
|
-
|
|
|
- // =========== 工艺资料详情弹窗 ===========
|
|
|
- const gyDetailDialogVisible = ref(false)
|
|
|
- const gyDetailFormData = reactive({
|
|
|
- 订单编号: '',
|
|
|
- 客户编号: '',
|
|
|
- 生产款号: '',
|
|
|
- 款式: '',
|
|
|
- 落货日期: '',
|
|
|
- 审核日期: '',
|
|
|
- 接单日期: '',
|
|
|
- 审核: '',
|
|
|
- 订单数量: '',
|
|
|
- 计划制造工分: '',
|
|
|
- 工单完工日期: null,
|
|
|
- 备注: '',
|
|
|
- Sys_id: '',
|
|
|
- Sys_rq: '',
|
|
|
- img: '',
|
|
|
- 工艺列表: []
|
|
|
- })
|
|
|
-
|
|
|
- // 工艺详情列筛选
|
|
|
- const dagongxuFilters = computed(() => {
|
|
|
- const processes = new Set(
|
|
|
- gyDetailFormData.工艺列表
|
|
|
- .filter((item) => !item._gyDetailNew)
|
|
|
- .map((item) => item.大工序)
|
|
|
- .filter(Boolean)
|
|
|
- )
|
|
|
- return Array.from(processes).map((process) => ({ text: process, value: process }))
|
|
|
- })
|
|
|
-
|
|
|
- const gyDetailBuJianMingChengFilterOptions = computed(() => {
|
|
|
- const names = new Set(
|
|
|
- gyDetailFormData.工艺列表
|
|
|
- .filter((item) => !item._gyDetailNew)
|
|
|
- .map((item) => item.部件名称)
|
|
|
- .filter(Boolean)
|
|
|
- )
|
|
|
- return Array.from(names).map((name) => ({ text: name, value: name }))
|
|
|
- })
|
|
|
-
|
|
|
- const gyDetailDifficultyFilterOptions = computed(() => {
|
|
|
- const values = new Set(gyDetailDifficultyOptions)
|
|
|
- for (const item of gyDetailFormData.工艺列表 || []) {
|
|
|
- if (item._gyDetailNew) continue
|
|
|
- const v = normalizeGyDetailField(item?.难度系数)
|
|
|
- if (v) values.add(v)
|
|
|
- }
|
|
|
- return Array.from(values).map((v) => ({ text: v, value: v }))
|
|
|
- })
|
|
|
-
|
|
|
- const gyDetailStatusFilterOptions = [
|
|
|
- { text: '正常', value: '0' },
|
|
|
- { text: '被拆分', value: '1' },
|
|
|
- ]
|
|
|
-
|
|
|
- const getGyDetailRowStatusFilterValue = (row) => {
|
|
|
- const code = Number(row?.状态)
|
|
|
- if (code === 1) return '1'
|
|
|
- if (code === 0) return '0'
|
|
|
- return normalizeGyDetailField(row?.状态)
|
|
|
- }
|
|
|
-
|
|
|
- const gdgyupdateCompanyFunc = async (row) => {
|
|
|
- const workorder = _Gd_gdbh.value || row['订单编号'] || ''
|
|
|
- if (!workorder) {
|
|
|
- ElMessage.warning('请先选择订单')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- // 获取订单信息
|
|
|
- const orderInfoRes = await WorkOrderList({ search: workorder, page: 1, limit: 1 })
|
|
|
- if (orderInfoRes.code === 0 && orderInfoRes.data && orderInfoRes.data.data && orderInfoRes.data.data.length > 0) {
|
|
|
- const data = orderInfoRes.data.data[0]
|
|
|
- gyDetailFormData.订单编号 = data['订单编号'] || ''
|
|
|
- gyDetailFormData.客户编号 = data['客户编号'] || ''
|
|
|
- gyDetailFormData.生产款号 = data['生产款号'] || ''
|
|
|
- gyDetailFormData.款式 = data['款式'] || ''
|
|
|
- gyDetailFormData.落货日期 = data['落货日期'] || ''
|
|
|
- gyDetailFormData.制单日期 = data['Sys_rq'] || ''
|
|
|
- gyDetailFormData.接单日期 = data['接单日期'] || ''
|
|
|
- // 制单人:如果有/则显示/后的值,否则全部显示
|
|
|
- const sysId = data['Sys_id'] || ''
|
|
|
- gyDetailFormData.制单人 = sysId.includes('/') ? sysId.split('/')[1] : sysId
|
|
|
- gyDetailFormData.订单数量 = data['订单数量'] || ''
|
|
|
- gyDetailFormData.计划制造工分 = data['计划制造工分'] || ''
|
|
|
- const finishDateRaw = String(data['工单完工日期'] || '').trim()
|
|
|
- gyDetailFormData.工单完工日期 = finishDateRaw || null
|
|
|
- gyDetailFormData.备注 = data['remark'] || ''
|
|
|
- gyDetailFormData.Sys_id = data['Sys_id'] || data['sys_id'] || row?.['Sys_id'] || row?.['sys_id'] || ''
|
|
|
- gyDetailFormData.Sys_rq = data['Sys_rq'] || data['sys_rq'] || ''
|
|
|
- gyDetailFormData.Uniqid = data['Uniqid'] || ''
|
|
|
- }
|
|
|
-
|
|
|
- // 获取工艺列表
|
|
|
- const processRes = await getWorkOrderProcess({ workorder })
|
|
|
- if (processRes.code === 0 && Array.isArray(processRes.data)) {
|
|
|
- gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
|
|
|
- } else {
|
|
|
- gyDetailFormData.工艺列表 = []
|
|
|
- }
|
|
|
-
|
|
|
- initGyDetailFilters()
|
|
|
- gyDetailPlanManufactureEditing.value = false
|
|
|
- gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分
|
|
|
- gyDetailDialogVisible.value = true
|
|
|
- await nextTick()
|
|
|
- updateGyDetailTableHeight()
|
|
|
- } catch (error) {
|
|
|
- console.error('获取工艺资料详情失败', error)
|
|
|
- ElMessage.error('获取工艺资料详情失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const gyDetailSelection = ref([])
|
|
|
- const gyDetailDeleting = ref(false)
|
|
|
- const gyDetailSaving = ref(false)
|
|
|
- const gyDetailTableWrapRef = ref(null)
|
|
|
- const gyDetailTableRef = ref(null)
|
|
|
- const gyDetailTableHeight = ref(480)
|
|
|
- const gyDetailTableMinWidth = 1320
|
|
|
- let gyDetailResizeObserver = null
|
|
|
-
|
|
|
- const gyDetailReadonly = computed(() => userStore.userInfo?.nickName === '邢科芳')
|
|
|
-
|
|
|
- const isGyDetailCellEditable = (column) => {
|
|
|
- const editableColumns = ['部件名称', '工序名称', '大工序', '工分', '定额分']
|
|
|
- if (editableColumns.includes(column)) {
|
|
|
- return true
|
|
|
- }
|
|
|
- return !gyDetailReadonly.value
|
|
|
- }
|
|
|
- const gyDetailEditingCell = ref(null)
|
|
|
- const gyDetailCellInputRef = ref(null)
|
|
|
- const gyDetailLastEditingField = ref(null)
|
|
|
- const isGyDetailNavigating = ref(false)
|
|
|
-
|
|
|
- const gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
|
|
|
- const gyDetailDifficultyOptions = ['A', 'B', 'C']
|
|
|
-
|
|
|
- const sanitizeGyDetailDecimalInput = (val) => {
|
|
|
- if (val === null || val === undefined) return ''
|
|
|
- let s = String(val).replace(/[^\d.]/g, '')
|
|
|
- const dotIndex = s.indexOf('.')
|
|
|
- if (dotIndex !== -1) {
|
|
|
- s = s.slice(0, dotIndex + 1) + s.slice(dotIndex + 1).replace(/\./g, '')
|
|
|
- }
|
|
|
- return s
|
|
|
- }
|
|
|
-
|
|
|
- /** 四舍五入保留两位;空/非法返回空串 */
|
|
|
- const roundGyDetail2 = (n) => {
|
|
|
- if (!Number.isFinite(n)) return ''
|
|
|
- return (Math.round(n * 100) / 100).toFixed(2)
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 工分 ↔ 金额 ↔ 秒/分 联动
|
|
|
- * 秒 = 60/0.25 * 金额;分 = 秒/60
|
|
|
- * 金额 = 工分 * 0.067;工分 = 金额 / 0.067
|
|
|
- * (两式互为倒数;若都乘 0.067 无法双向换算)
|
|
|
- */
|
|
|
- const applyGyDetailScoreMoneyCalc = (row, sourceField) => {
|
|
|
- if (!row || (sourceField !== '定额分' && sourceField !== '金额')) return
|
|
|
- const raw = String(row[sourceField] ?? '').trim()
|
|
|
- if (raw === '' || raw === '.') {
|
|
|
- if (sourceField === '定额分') {
|
|
|
- row.金额 = ''
|
|
|
- row.秒 = ''
|
|
|
- row.分 = ''
|
|
|
- } else {
|
|
|
- row.定额分 = ''
|
|
|
- row.秒 = ''
|
|
|
- row.分 = ''
|
|
|
- }
|
|
|
- return
|
|
|
- }
|
|
|
- const num = parseFloat(raw)
|
|
|
- if (!Number.isFinite(num)) return
|
|
|
-
|
|
|
- if (sourceField === '定额分') {
|
|
|
- const money = num * 0.067
|
|
|
- const seconds = (60 / 0.25) * money
|
|
|
- row.金额 = roundGyDetail2(money)
|
|
|
- row.秒 = roundGyDetail2(seconds)
|
|
|
- row.分 = roundGyDetail2(seconds / 60)
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- const score = num / 0.067
|
|
|
- const seconds = (60 / 0.25) * num
|
|
|
- row.定额分 = roundGyDetail2(score)
|
|
|
- row.秒 = roundGyDetail2(seconds)
|
|
|
- row.分 = roundGyDetail2(seconds / 60)
|
|
|
- }
|
|
|
-
|
|
|
- const onGyDetailDecimalInput = (row, field, val) => {
|
|
|
- row[field] = sanitizeGyDetailDecimalInput(val)
|
|
|
- applyGyDetailScoreMoneyCalc(row, field)
|
|
|
- refreshGyDetailTableFooter()
|
|
|
- }
|
|
|
-
|
|
|
- const formatGyDetailCellText = (val) => {
|
|
|
- if (val === null || val === undefined) return ''
|
|
|
- return String(val)
|
|
|
- }
|
|
|
-
|
|
|
- /** 工艺状态:0 正常,1 被拆分(接口可能为字符串) */
|
|
|
- const formatGyDetailStatus = (status) => {
|
|
|
- const code = Number(status)
|
|
|
- if (code === 1) return '被拆分'
|
|
|
- if (code === 0) return '正常'
|
|
|
- return ''
|
|
|
- }
|
|
|
-
|
|
|
- const isGyDetailRowSplit = (row) => Number(row?.状态) === 1
|
|
|
-
|
|
|
- const isGyDetailCellEditing = (row, field) => {
|
|
|
- if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return false
|
|
|
- const editing = gyDetailEditingCell.value
|
|
|
- return editing?.rowKey === row._rowKey && editing?.field === field
|
|
|
- }
|
|
|
-
|
|
|
- const setGyDetailCellInputRef = (el) => {
|
|
|
- gyDetailCellInputRef.value = el
|
|
|
- }
|
|
|
-
|
|
|
- const startGyDetailCellEdit = (row, field) => {
|
|
|
- if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return
|
|
|
- // 先清除之前的输入框引用,确保新输入框能正确获取焦点
|
|
|
- gyDetailCellInputRef.value = null
|
|
|
- gyDetailEditingCell.value = { rowKey: row._rowKey, field }
|
|
|
- }
|
|
|
-
|
|
|
- // 键盘导航字段顺序
|
|
|
- const navFields = ['部件名称', '工序名称', '秒', '分', '定额分', '金额']
|
|
|
-
|
|
|
- // 处理单元格键盘事件
|
|
|
- const handleGyDetailCellKeydown = async (event, row, field) => {
|
|
|
- const key = event.key
|
|
|
-
|
|
|
- // 只处理方向键
|
|
|
- if (!['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp'].includes(key)) {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 阻止浏览器默认行为(页面滚动)
|
|
|
- event.preventDefault()
|
|
|
-
|
|
|
- const fieldIndex = navFields.indexOf(field)
|
|
|
-
|
|
|
- // 如果不是导航字段,不处理
|
|
|
- if (fieldIndex === -1) return
|
|
|
-
|
|
|
- const processList = gyDetailFormData.工艺列表
|
|
|
- const rowIndex = processList.findIndex(r => r._rowKey === row._rowKey)
|
|
|
-
|
|
|
- if (rowIndex === -1) return
|
|
|
-
|
|
|
- let targetRow = row
|
|
|
- let targetField = field
|
|
|
- let shouldMove = false
|
|
|
-
|
|
|
- switch (key) {
|
|
|
- case 'ArrowRight':
|
|
|
- // 向右移动到下一个字段
|
|
|
- if (fieldIndex < navFields.length - 1) {
|
|
|
- targetField = navFields[fieldIndex + 1]
|
|
|
- shouldMove = true
|
|
|
- }
|
|
|
- break
|
|
|
- case 'ArrowLeft':
|
|
|
- // 向左移动到上一个字段
|
|
|
- if (fieldIndex > 0) {
|
|
|
- targetField = navFields[fieldIndex - 1]
|
|
|
- shouldMove = true
|
|
|
- }
|
|
|
- break
|
|
|
- case 'ArrowDown':
|
|
|
- // 向下移动到下一行
|
|
|
- if (rowIndex < processList.length - 1) {
|
|
|
- targetRow = processList[rowIndex + 1]
|
|
|
- shouldMove = true
|
|
|
- }
|
|
|
- break
|
|
|
- case 'ArrowUp':
|
|
|
- // 向上移动到上一行
|
|
|
- if (rowIndex > 0) {
|
|
|
- targetRow = processList[rowIndex - 1]
|
|
|
- shouldMove = true
|
|
|
- }
|
|
|
- break
|
|
|
- }
|
|
|
-
|
|
|
- // 如果需要移动,切换焦点
|
|
|
- if (shouldMove) {
|
|
|
- // 先完成当前单元格的编辑(保存数据)
|
|
|
- await finishGyDetailCellEdit(row)
|
|
|
- // 然后移动到新单元格
|
|
|
- startGyDetailCellEdit(targetRow, targetField)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const clearGyDetailCellEdit = () => {
|
|
|
- gyDetailEditingCell.value = null
|
|
|
- gyDetailCellInputRef.value = null
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- const finishGyDetailCellEdit = async (row) => {
|
|
|
- if (!gyDetailEditingCell.value) return
|
|
|
- const editingField = gyDetailEditingCell.value.field
|
|
|
- gyDetailLastEditingField.value = editingField
|
|
|
-
|
|
|
- // 检查当前编辑字段的值是否变化
|
|
|
- const currentValue = normalizeGyDetailField(row[editingField])
|
|
|
- const originValue = normalizeGyDetailField(row._gyDetailOrigin?.[editingField])
|
|
|
- const isFieldChanged = currentValue !== originValue
|
|
|
-
|
|
|
- clearGyDetailCellEdit()
|
|
|
-
|
|
|
- // 如果字段值没有变化,直接返回,不做任何操作
|
|
|
- if (!isFieldChanged && !row._gyDetailNew) {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 失焦时再按工分/金额公式落一次(四舍五入两位),并带上联动字段一起保存
|
|
|
- if (editingField === '定额分' || editingField === '金额') {
|
|
|
- applyGyDetailScoreMoneyCalc(row, editingField)
|
|
|
- if (editingField === '定额分' && String(row.定额分 ?? '').trim() !== '') {
|
|
|
- row.定额分 = roundGyDetail2(parseFloat(row.定额分))
|
|
|
- }
|
|
|
- if (editingField === '金额' && String(row.金额 ?? '').trim() !== '') {
|
|
|
- row.金额 = roundGyDetail2(parseFloat(row.金额))
|
|
|
- }
|
|
|
- refreshGyDetailTableFooter()
|
|
|
- }
|
|
|
-
|
|
|
- // 新行:未齐三个必填时,工分等字段暂不提交;已齐则继续(可能已新增过,由 handleUpdateProcess 决定增/改)
|
|
|
- if (row._gyDetailNew && editingField !== '工序名称' && editingField !== '部件名称') {
|
|
|
- const buJianMingCheng = String(row.部件名称 || '').trim()
|
|
|
- const gongXuMingCheng = String(row.工序名称 || '').trim()
|
|
|
- const daGongXu = String(row.大工序 || '').trim()
|
|
|
- if (!buJianMingCheng || !gongXuMingCheng || !daGongXu) {
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (editingField === '部件名称') {
|
|
|
- const buJianMingCheng = String(row.部件名称 || '').trim()
|
|
|
- if (!buJianMingCheng) {
|
|
|
- row.部件编号 = ''
|
|
|
- } else {
|
|
|
- ensureGyDetailPartCode(row)
|
|
|
- }
|
|
|
-
|
|
|
- // 自动填写生产工序
|
|
|
- const autoFillOptions = ['裁剪', '手工', '大烫', '总检', '包装']
|
|
|
- if (autoFillOptions.includes(buJianMingCheng)) {
|
|
|
- row.大工序 = buJianMingCheng
|
|
|
- } else if (buJianMingCheng) {
|
|
|
- row.大工序 = '车缝'
|
|
|
- }
|
|
|
-
|
|
|
- // 新行编辑部件名称时,检查工序名称是否已填写
|
|
|
- if (row._gyDetailNew) {
|
|
|
- const gongXuMingCheng = String(row.工序名称 || '').trim()
|
|
|
- if (!gongXuMingCheng) {
|
|
|
- ElMessage.warning('请先填写工序名称')
|
|
|
- return
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (editingField === '定额分') {
|
|
|
- // 获取所有未拆分的数据
|
|
|
- const unsplitData = gyDetailDisplayProcessList.value.filter(
|
|
|
- row => !isGyDetailRowSplit(row)
|
|
|
- );
|
|
|
-
|
|
|
- // 计算未拆分工序的总工分
|
|
|
- const unsplitTotalScore = unsplitData.reduce(
|
|
|
- (sum, row) => sum + (parseFloat(row.定额分) || 0),
|
|
|
- 0
|
|
|
- );
|
|
|
-
|
|
|
- // 获取计划制造工分
|
|
|
- const planManufactureScore = parseFloat(gyDetailFormData.计划制造工分) || 0;
|
|
|
-
|
|
|
- // 如果未拆分工序的总工分超过计划制造工分,回退并提示
|
|
|
- if (unsplitTotalScore > planManufactureScore) {
|
|
|
- ElMessage.warning(`未拆分工序总工分(${unsplitTotalScore.toFixed(2)})不能大于计划制造工分(${planManufactureScore.toFixed(2)})`);
|
|
|
- row.定额分 = row._gyDetailOrigin?.定额分 ?? row.定额分;
|
|
|
- refreshGyDetailTableFooter();
|
|
|
- return;
|
|
|
- }
|
|
|
-}
|
|
|
-
|
|
|
- await handleUpdateProcess(row)
|
|
|
- refreshGyDetailTableFooter()
|
|
|
- }
|
|
|
-
|
|
|
- watch(gyDetailEditingCell, async (cell) => {
|
|
|
- if (!cell) return
|
|
|
- await nextTick()
|
|
|
- await nextTick() // 多等一个tick确保DOM更新
|
|
|
-
|
|
|
- // 优先使用ref引用
|
|
|
- const comp = gyDetailCellInputRef.value
|
|
|
- if (comp?.focus) {
|
|
|
- comp.focus()
|
|
|
- comp.select?.()
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 如果ref没有值,尝试从DOM中查找当前编辑单元格的输入框
|
|
|
- const inputEl = comp?.input || comp?.$el?.querySelector?.('input')
|
|
|
- if (inputEl) {
|
|
|
- inputEl.focus?.()
|
|
|
- inputEl.select?.()
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- // 最后的备选方案:查找所有可见的输入框
|
|
|
- const allInputs = document.querySelectorAll('.gy-detail-cell-input input')
|
|
|
- if (allInputs.length > 0) {
|
|
|
- const lastInput = allInputs[allInputs.length - 1]
|
|
|
- lastInput.focus()
|
|
|
- lastInput.select()
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- const normalizeGyDetailField = (val) => String(val ?? '').trim()
|
|
|
-
|
|
|
- const snapshotGyDetailRow = (row) => ({
|
|
|
- 部件编号: normalizeGyDetailField(row?.部件编号),
|
|
|
- 部件名称: normalizeGyDetailField(row?.部件名称),
|
|
|
- 工序编号: normalizeGyDetailField(row?.工序编号),
|
|
|
- 工序名称: normalizeGyDetailField(row?.工序名称),
|
|
|
- 大工序: normalizeGyDetailField(row?.大工序),
|
|
|
- 秒: normalizeGyDetailField(row?.秒),
|
|
|
- 分: normalizeGyDetailField(row?.分),
|
|
|
- 定额分: normalizeGyDetailField(row?.定额分),
|
|
|
- 金额: normalizeGyDetailField(row?.金额),
|
|
|
- 难度系数: normalizeGyDetailField(row?.难度系数),
|
|
|
- 备注: normalizeGyDetailField(row?.备注),
|
|
|
- })
|
|
|
-
|
|
|
- const isGyDetailRowChanged = (row) => {
|
|
|
- const current = snapshotGyDetailRow(row)
|
|
|
- const origin = row?._gyDetailOrigin || {}
|
|
|
- return Object.keys(current).some((key) => current[key] !== origin[key])
|
|
|
- }
|
|
|
-
|
|
|
- const attachGyDetailRowMeta = (row, index) => {
|
|
|
- const item = {
|
|
|
- ...row,
|
|
|
- _rowKey: row.id ? `id_${row.id}` : `idx_${index}_${row.工序编号 ?? ''}`,
|
|
|
- }
|
|
|
- item._gyDetailOrigin = snapshotGyDetailRow(item)
|
|
|
- return item
|
|
|
- }
|
|
|
-
|
|
|
- const assignGyDetailRowKeys = (list) => {
|
|
|
- if (!Array.isArray(list)) return []
|
|
|
- return list.map((row, index) => attachGyDetailRowMeta(row, index))
|
|
|
- }
|
|
|
-
|
|
|
- const updateGyDetailTableHeight = () => {
|
|
|
- const el = gyDetailTableWrapRef.value
|
|
|
- if (el?.clientHeight > 0) {
|
|
|
- // 预留底部横向滚动条高度
|
|
|
- gyDetailTableHeight.value = Math.max(240, el.clientHeight - 16)
|
|
|
- }
|
|
|
- nextTick(() => {
|
|
|
- gyDetailTableRef.value?.recalculate?.()
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- const gyDetailBuJianMingChengFilter = ref([])
|
|
|
- const gyDetailDaGongXuFilter = ref([])
|
|
|
- const gyDetailNanDuXiShuFilter = ref([])
|
|
|
- const gyDetailZhuangTaiFilter = ref([])
|
|
|
-
|
|
|
- // 跟踪每个筛选是否被用户手动设置过
|
|
|
- const gyDetailBuJianMingChengFilterManuallySet = ref(false)
|
|
|
- const gyDetailDaGongXuFilterManuallySet = ref(false)
|
|
|
- const gyDetailNanDuXiShuFilterManuallySet = ref(false)
|
|
|
- const gyDetailZhuangTaiFilterManuallySet = ref(false)
|
|
|
-
|
|
|
- const isGyDetailFilterActive = (selectedRef, options) => {
|
|
|
- const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
- const allValues = optionList.map((item) => item.value)
|
|
|
- const selected = selectedRef?.value ?? selectedRef ?? []
|
|
|
- if (!allValues.length) return false
|
|
|
- return selected.length < allValues.length
|
|
|
- }
|
|
|
-
|
|
|
- /** 模板里 ref 会自动解包为数组,脚本里传的是 ref,需兼容两种写法 */
|
|
|
- const setGyDetailFilterSelected = (filterRef, values) => {
|
|
|
- const next = [...values]
|
|
|
- if (isRef(filterRef)) {
|
|
|
- filterRef.value = next
|
|
|
- return
|
|
|
- }
|
|
|
- if (Array.isArray(filterRef)) {
|
|
|
- filterRef.splice(0, filterRef.length, ...next)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const selectAllGyDetailFilter = (filterRef, options) => {
|
|
|
- const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
- setGyDetailFilterSelected(filterRef, optionList.map((item) => item.value))
|
|
|
- }
|
|
|
-
|
|
|
- const clearGyDetailFilter = (filterRef) => {
|
|
|
- setGyDetailFilterSelected(filterRef, [])
|
|
|
- }
|
|
|
-
|
|
|
- // 部件名称筛选操作
|
|
|
- const selectAllGyDetailBuJianMingChengFilter = () => {
|
|
|
- gyDetailBuJianMingChengFilterManuallySet.value = true
|
|
|
- selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
|
- }
|
|
|
- const clearGyDetailBuJianMingChengFilter = () => {
|
|
|
- gyDetailBuJianMingChengFilterManuallySet.value = true
|
|
|
- clearGyDetailFilter(gyDetailBuJianMingChengFilter)
|
|
|
- }
|
|
|
- const handleGyDetailBuJianMingChengFilterChange = () => {
|
|
|
- gyDetailBuJianMingChengFilterManuallySet.value = true
|
|
|
- }
|
|
|
-
|
|
|
- // 大工序筛选操作
|
|
|
- const selectAllGyDetailDaGongXuFilter = () => {
|
|
|
- gyDetailDaGongXuFilterManuallySet.value = true
|
|
|
- selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
|
- }
|
|
|
- const clearGyDetailDaGongXuFilter = () => {
|
|
|
- gyDetailDaGongXuFilterManuallySet.value = true
|
|
|
- clearGyDetailFilter(gyDetailDaGongXuFilter)
|
|
|
- }
|
|
|
- const handleGyDetailDaGongXuFilterChange = () => {
|
|
|
- gyDetailDaGongXuFilterManuallySet.value = true
|
|
|
- }
|
|
|
-
|
|
|
- // 难度系数筛选操作
|
|
|
- const selectAllGyDetailNanDuXiShuFilter = () => {
|
|
|
- gyDetailNanDuXiShuFilterManuallySet.value = true
|
|
|
- selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
|
- }
|
|
|
- const clearGyDetailNanDuXiShuFilter = () => {
|
|
|
- gyDetailNanDuXiShuFilterManuallySet.value = true
|
|
|
- clearGyDetailFilter(gyDetailNanDuXiShuFilter)
|
|
|
- }
|
|
|
- const handleGyDetailNanDuXiShuFilterChange = () => {
|
|
|
- gyDetailNanDuXiShuFilterManuallySet.value = true
|
|
|
- }
|
|
|
-
|
|
|
- // 状态筛选操作
|
|
|
- const selectAllGyDetailZhuangTaiFilter = () => {
|
|
|
- gyDetailZhuangTaiFilterManuallySet.value = true
|
|
|
- selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
|
|
|
- }
|
|
|
- const clearGyDetailZhuangTaiFilter = () => {
|
|
|
- gyDetailZhuangTaiFilterManuallySet.value = true
|
|
|
- clearGyDetailFilter(gyDetailZhuangTaiFilter)
|
|
|
- }
|
|
|
- const handleGyDetailZhuangTaiFilterChange = () => {
|
|
|
- gyDetailZhuangTaiFilterManuallySet.value = true
|
|
|
- }
|
|
|
-
|
|
|
- const applyGyDetailColumnFilter = (list, filterRef, options, matchRow, isManuallySet) => {
|
|
|
- // 如果没有被用户手动设置过筛选,直接返回所有数据
|
|
|
- if (!isManuallySet) {
|
|
|
- return list
|
|
|
- }
|
|
|
- const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
- const selected = filterRef.value
|
|
|
- if (!selected.length) return list
|
|
|
- if (!optionList.length || selected.length >= optionList.length) return list
|
|
|
- const set = new Set(selected.map((v) => normalizeGyDetailField(v)))
|
|
|
- return list.filter((row) => row._gyDetailNew || set.has(matchRow(row)))
|
|
|
- }
|
|
|
-
|
|
|
- const gyDetailDisplayProcessList = computed(() => {
|
|
|
- let list = gyDetailFormData.工艺列表 || []
|
|
|
- list = applyGyDetailColumnFilter(
|
|
|
- list,
|
|
|
- gyDetailBuJianMingChengFilter,
|
|
|
- gyDetailBuJianMingChengFilterOptions.value,
|
|
|
- (row) => normalizeGyDetailField(row.部件名称),
|
|
|
- gyDetailBuJianMingChengFilterManuallySet.value,
|
|
|
- )
|
|
|
- list = applyGyDetailColumnFilter(
|
|
|
- list,
|
|
|
- gyDetailDaGongXuFilter,
|
|
|
- dagongxuFilters.value,
|
|
|
- (row) => normalizeGyDetailField(row.大工序),
|
|
|
- gyDetailDaGongXuFilterManuallySet.value,
|
|
|
- )
|
|
|
- list = applyGyDetailColumnFilter(
|
|
|
- list,
|
|
|
- gyDetailNanDuXiShuFilter,
|
|
|
- gyDetailDifficultyFilterOptions.value,
|
|
|
- (row) => normalizeGyDetailField(row.难度系数),
|
|
|
- gyDetailNanDuXiShuFilterManuallySet.value,
|
|
|
- )
|
|
|
- list = applyGyDetailColumnFilter(
|
|
|
- list,
|
|
|
- gyDetailZhuangTaiFilter,
|
|
|
- gyDetailStatusFilterOptions,
|
|
|
- (row) => getGyDetailRowStatusFilterValue(row),
|
|
|
- gyDetailZhuangTaiFilterManuallySet.value,
|
|
|
- )
|
|
|
- return list
|
|
|
- })
|
|
|
-
|
|
|
- const syncGyDetailFilterAfterDataChange = (filterRef, options) => {
|
|
|
- // 禁用自动同步筛选,只在用户手动点击时才触发
|
|
|
- // const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
- // const allValues = optionList.map((item) => item.value)
|
|
|
- // const selected = filterRef.value
|
|
|
- // if (!selected.length) {
|
|
|
- // filterRef.value = [...allValues]
|
|
|
- // return
|
|
|
- // }
|
|
|
- // const wasAllSelected = allValues.length > 0 && allValues.every((v) => selected.includes(v))
|
|
|
- // if (wasAllSelected) {
|
|
|
- // filterRef.value = [...allValues]
|
|
|
- // return
|
|
|
- // }
|
|
|
- // filterRef.value = selected.filter((v) => allValues.includes(v))
|
|
|
- }
|
|
|
-
|
|
|
- /** 打开详情或刷新后:默认全选各列筛选项 */
|
|
|
- const initGyDetailFilters = () => {
|
|
|
- // 重置手动设置标志位为 false
|
|
|
- gyDetailBuJianMingChengFilterManuallySet.value = false
|
|
|
- gyDetailDaGongXuFilterManuallySet.value = false
|
|
|
- gyDetailNanDuXiShuFilterManuallySet.value = false
|
|
|
- gyDetailZhuangTaiFilterManuallySet.value = false
|
|
|
- // 初始化筛选选项
|
|
|
- selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
|
- selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
|
- selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
|
- selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
|
|
|
- }
|
|
|
-
|
|
|
- const syncGyDetailFiltersAfterDataChange = () => {
|
|
|
- syncGyDetailFilterAfterDataChange(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
|
- syncGyDetailFilterAfterDataChange(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
|
- syncGyDetailFilterAfterDataChange(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
|
- syncGyDetailFilterAfterDataChange(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
|
|
|
- }
|
|
|
-
|
|
|
- const sumGyDetailDisplayField = (field) => {
|
|
|
- let total = 0
|
|
|
- let count = 0
|
|
|
- for (const item of gyDetailDisplayProcessList.value || []) {
|
|
|
- const val = Number(item?.[field])
|
|
|
- if (!Number.isNaN(val)) {
|
|
|
- total += val
|
|
|
- count++
|
|
|
- }
|
|
|
- }
|
|
|
- return count > 0 ? total.toFixed(2) : '0.00'
|
|
|
- }
|
|
|
-
|
|
|
- const gyDetailFooterSums = computed(() => ({
|
|
|
- 秒: sumGyDetailDisplayField('秒'),
|
|
|
- 分: sumGyDetailDisplayField('分'),
|
|
|
- 定额分: sumGyDetailDisplayField('定额分'),
|
|
|
- 金额: sumGyDetailDisplayField('金额'),
|
|
|
- }))
|
|
|
-
|
|
|
- const gyDetailFooterMethod = () => {
|
|
|
- // 与拆分判断一致:状态 1 为被拆分,其余(含数字 0 / 字符串 '0')都计入合计
|
|
|
- const normalData = (gyDetailDisplayProcessList.value || []).filter(
|
|
|
- (row) => !isGyDetailRowSplit(row)
|
|
|
- )
|
|
|
-
|
|
|
- // 如果没有正常数据,合计全部为0
|
|
|
- if (normalData.length === 0) {
|
|
|
- return [['合计', '', '', '', '', '', '0.00', '0.00', '0.00', '0.00', '', '', '', '']]
|
|
|
- }
|
|
|
-
|
|
|
- // 计算各项合计
|
|
|
- const sums = {
|
|
|
- 秒: normalData.reduce((sum, row) => sum + (Number(row.秒) || 0), 0),
|
|
|
- 分: normalData.reduce((sum, row) => sum + (Number(row.分) || 0), 0),
|
|
|
- 定额分: normalData.reduce((sum, row) => sum + (Number(row.定额分) || 0), 0),
|
|
|
- 金额: normalData.reduce((sum, row) => sum + (Number(row.金额) || 0), 0),
|
|
|
- }
|
|
|
-
|
|
|
- return [[
|
|
|
- '合计',
|
|
|
- '',
|
|
|
- '',
|
|
|
- '',
|
|
|
- '',
|
|
|
- '',
|
|
|
- sums.秒.toFixed(2),
|
|
|
- sums.分.toFixed(2),
|
|
|
- sums.定额分.toFixed(2),
|
|
|
- sums.金额.toFixed(2),
|
|
|
- '',
|
|
|
- '',
|
|
|
- '',
|
|
|
- '',
|
|
|
- ]]
|
|
|
-}
|
|
|
-
|
|
|
- const refreshGyDetailTableFooter = () => {
|
|
|
- nextTick(() => {
|
|
|
- const $table = gyDetailTableRef.value
|
|
|
- $table?.updateFooter?.()
|
|
|
- $table?.recalculate?.()
|
|
|
- })
|
|
|
- }
|
|
|
-
|
|
|
- watch(
|
|
|
- [gyDetailBuJianMingChengFilter, gyDetailDaGongXuFilter, gyDetailNanDuXiShuFilter, gyDetailZhuangTaiFilter],
|
|
|
- refreshGyDetailTableFooter,
|
|
|
- { deep: true },
|
|
|
- )
|
|
|
- watch(gyDetailDisplayProcessList, refreshGyDetailTableFooter)
|
|
|
-
|
|
|
- const gyDetailPrintTableData = computed(() => {
|
|
|
- return (gyDetailFormData.工艺列表 || []).map((row) => ({
|
|
|
- 部位编号: row.部件编号 ?? '',
|
|
|
- 部位名称: row.部件名称 ?? '',
|
|
|
- 工序编号: row.工序编号 ?? '',
|
|
|
- 工序名称: row.工序名称 ?? '',
|
|
|
- 生产工序: row.大工序 ?? '',
|
|
|
- }))
|
|
|
- })
|
|
|
-
|
|
|
- const getNextGyDetailProcessCode = () => {
|
|
|
- const list = gyDetailFormData.工艺列表 || []
|
|
|
- let max = 0
|
|
|
- for (const row of list) {
|
|
|
- const n = parseInt(String(row.工序编号 ?? '').trim(), 10)
|
|
|
- if (!Number.isNaN(n) && n > max) {
|
|
|
- max = n
|
|
|
- }
|
|
|
- }
|
|
|
- return max + 1
|
|
|
- }
|
|
|
-
|
|
|
- const handleGyDetailCheckboxChange = ({ records }) => {
|
|
|
- gyDetailSelection.value = records || []
|
|
|
- }
|
|
|
-
|
|
|
- watch(gyDetailDialogVisible, async (visible) => {
|
|
|
- if (visible) {
|
|
|
- await nextTick()
|
|
|
- updateGyDetailTableHeight()
|
|
|
- if (!gyDetailResizeObserver && gyDetailTableWrapRef.value) {
|
|
|
- gyDetailResizeObserver = new ResizeObserver(() => updateGyDetailTableHeight())
|
|
|
- gyDetailResizeObserver.observe(gyDetailTableWrapRef.value)
|
|
|
- }
|
|
|
- }
|
|
|
- })
|
|
|
-
|
|
|
- onBeforeUnmount(() => {
|
|
|
- gyDetailResizeObserver?.disconnect()
|
|
|
- gyDetailResizeObserver = null
|
|
|
- })
|
|
|
-
|
|
|
- const clearGyDetailTableSelection = async () => {
|
|
|
- gyDetailSelection.value = []
|
|
|
- await nextTick()
|
|
|
- const $table = gyDetailTableRef.value
|
|
|
- if ($table?.clearCheckboxRow) {
|
|
|
- $table.clearCheckboxRow()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const refreshGyDetailProcessList = async () => {
|
|
|
- const workorder = gyDetailFormData.订单编号
|
|
|
- if (!workorder) return
|
|
|
- const processRes = await getWorkOrderProcess({ workorder })
|
|
|
- if (processRes.code === 0 && Array.isArray(processRes.data)) {
|
|
|
- gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
|
|
|
- } else {
|
|
|
- gyDetailFormData.工艺列表 = []
|
|
|
- }
|
|
|
- await clearGyDetailTableSelection()
|
|
|
- // syncGyDetailFiltersAfterDataChange() // 禁用自动同步筛选,只在用户手动点击时才触发
|
|
|
- await nextTick()
|
|
|
- updateGyDetailTableHeight()
|
|
|
- }
|
|
|
-
|
|
|
- const scrollGyDetailTableToBottom = async (row) => {
|
|
|
- await nextTick()
|
|
|
- const $table = gyDetailTableRef.value
|
|
|
- const visibleList = gyDetailDisplayProcessList.value
|
|
|
- const targetRow = row && visibleList.includes(row) ? row : visibleList[visibleList.length - 1]
|
|
|
- if (!targetRow) return
|
|
|
-
|
|
|
- const scrollToTarget = () => {
|
|
|
- if ($table?.scrollToRow) {
|
|
|
- $table.scrollToRow(targetRow)
|
|
|
- } else {
|
|
|
- const body = gyDetailTableWrapRef.value?.querySelector('.vxe-table--body-wrapper')
|
|
|
- if (body) body.scrollTop = body.scrollHeight
|
|
|
- }
|
|
|
- $table?.setCurrentRow?.(targetRow)
|
|
|
- }
|
|
|
-
|
|
|
- scrollToTarget()
|
|
|
- requestAnimationFrame(scrollToTarget)
|
|
|
- }
|
|
|
-
|
|
|
- const openGyDetailProcessAdd = async () => {
|
|
|
- const orderNo = String(gyDetailFormData.订单编号 || '').trim()
|
|
|
- if (!orderNo) {
|
|
|
- ElMessage.warning('无订单编号,无法新增工艺')
|
|
|
- return
|
|
|
- }
|
|
|
- const batchCount = 10
|
|
|
- const startIndex = gyDetailFormData.工艺列表.length
|
|
|
- for (let i = 0; i < batchCount; i++) {
|
|
|
- const nextCode = getNextGyDetailProcessCode()
|
|
|
- const newRow = {
|
|
|
- id: '',
|
|
|
- 部件编号: '',
|
|
|
- 部件名称: '',
|
|
|
- 工序编号: String(nextCode),
|
|
|
- 工序名称: '',
|
|
|
- 大工序: '',
|
|
|
- 秒: '',
|
|
|
- 分: '',
|
|
|
- 定额分: '',
|
|
|
- 金额: '',
|
|
|
- 难度系数: 'C',
|
|
|
- 备注: '',
|
|
|
- 状态: 0,
|
|
|
- _gyDetailNew: true,
|
|
|
- _rowKey: `new_${Date.now()}_${nextCode}_${i}`,
|
|
|
- }
|
|
|
- gyDetailFormData.工艺列表.push(newRow)
|
|
|
- newRow._gyDetailOrigin = snapshotGyDetailRow(newRow)
|
|
|
- }
|
|
|
- // 聚焦本次新增的第一条空白行(不是最后一条)
|
|
|
- const firstNewRow = gyDetailFormData.工艺列表[startIndex]
|
|
|
- await scrollGyDetailTableToBottom(firstNewRow)
|
|
|
- if (!gyDetailReadonly.value && firstNewRow) {
|
|
|
- startGyDetailCellEdit(firstNewRow, '工序名称')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- const handleGyDetailBatchDelete = async () => {
|
|
|
- if (gyDetailDeleting.value) return
|
|
|
- if (!gyDetailSelection.value.length) {
|
|
|
- ElMessage.warning('请先勾选要删除的工序')
|
|
|
- return
|
|
|
- }
|
|
|
- const selectedRows = [...gyDetailSelection.value]
|
|
|
- try {
|
|
|
- await ElMessageBox.confirm('确定删除选中的工序吗?', '提示', {
|
|
|
- confirmButtonText: '确定',
|
|
|
- cancelButtonText: '取消',
|
|
|
- type: 'warning',
|
|
|
- appendTo: document.body,
|
|
|
- })
|
|
|
- } catch {
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- gyDetailDeleting.value = true
|
|
|
- let failCount = 0
|
|
|
- try {
|
|
|
- for (const row of selectedRows) {
|
|
|
- if (!row.id || row._gyDetailNew) {
|
|
|
- const index = gyDetailFormData.工艺列表.indexOf(row)
|
|
|
- if (index > -1) {
|
|
|
- gyDetailFormData.工艺列表.splice(index, 1)
|
|
|
- }
|
|
|
- continue
|
|
|
- }
|
|
|
- const result = await DeleteProcess({ id: row.id })
|
|
|
- if (result?.code !== 0) {
|
|
|
- failCount += 1
|
|
|
- }
|
|
|
- }
|
|
|
- await refreshGyDetailProcessList()
|
|
|
- if (failCount > 0) {
|
|
|
- ElMessage.warning(`有 ${failCount} 条删除失败,列表已刷新`)
|
|
|
- } else {
|
|
|
- ElMessage.success('删除成功')
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.error('批量删除工艺失败', e)
|
|
|
- ElMessage.error('删除失败')
|
|
|
- try {
|
|
|
- await refreshGyDetailProcessList()
|
|
|
- } catch {
|
|
|
- /* ignore */
|
|
|
- }
|
|
|
- } finally {
|
|
|
- gyDetailDeleting.value = false
|
|
|
- document.body.classList.remove('el-popup-parent--hidden')
|
|
|
- document.body.style.overflow = ''
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const escapeGyPrintHtml = (val) => {
|
|
|
- return String(val ?? '')
|
|
|
- .replace(/&/g, '&')
|
|
|
- .replace(/</g, '<')
|
|
|
- .replace(/>/g, '>')
|
|
|
- .replace(/"/g, '"')
|
|
|
- }
|
|
|
-
|
|
|
- const GY_DETAIL_PRINT_PAGE_STYLE = `
|
|
|
- @page { size: A4 portrait; margin: 5mm 6mm; }
|
|
|
- * { box-sizing: border-box; }
|
|
|
- body {
|
|
|
- margin: 0;
|
|
|
- padding: 0;
|
|
|
- font-family: "Microsoft YaHei", SimSun, sans-serif;
|
|
|
- font-size: 12px;
|
|
|
- line-height: 1.25;
|
|
|
- color: #000;
|
|
|
- }
|
|
|
- .gy-print-table {
|
|
|
- width: 100%;
|
|
|
- border-collapse: collapse;
|
|
|
- table-layout: fixed;
|
|
|
- font-size: 18px;
|
|
|
- }
|
|
|
- .gy-print-table th,
|
|
|
- .gy-print-table td {
|
|
|
- border: 1px solid #000;
|
|
|
- padding: 2px 4px;
|
|
|
- text-align: center;
|
|
|
- vertical-align: middle;
|
|
|
- word-break: break-word;
|
|
|
- overflow-wrap: anywhere;
|
|
|
- }
|
|
|
- .gy-print-table th { font-weight: bold; padding: 3px 4px; }
|
|
|
- .gy-print-sheet-head td {
|
|
|
- border: none;
|
|
|
- padding: 0 4px;
|
|
|
- text-align: center;
|
|
|
- vertical-align: middle;
|
|
|
- }
|
|
|
- .gy-print-sheet-head--company-cn td {
|
|
|
- padding-top: 2px;
|
|
|
- padding-bottom: 2px;
|
|
|
- font-size: 18px;
|
|
|
- font-weight: bold;
|
|
|
- line-height: 1.35;
|
|
|
- letter-spacing: 2px;
|
|
|
- }
|
|
|
- .gy-print-sheet-head--company-en td {
|
|
|
- padding-bottom: 6px;
|
|
|
- font-size: 11px;
|
|
|
- font-weight: normal;
|
|
|
- line-height: 1.3;
|
|
|
- letter-spacing: 0.5px;
|
|
|
- }
|
|
|
- .gy-print-sheet-head--title td {
|
|
|
- font-size: 24px;
|
|
|
- font-weight: bold;
|
|
|
- letter-spacing: 6px;
|
|
|
- padding-bottom: 8px;
|
|
|
- line-height: 1.2;
|
|
|
- text-align: left;
|
|
|
- }
|
|
|
- .gy-print-sheet-head--meta td {
|
|
|
- font-size: 13px;
|
|
|
- font-weight: normal;
|
|
|
- padding-bottom: 2px;
|
|
|
- letter-spacing: 0.5px;
|
|
|
- }
|
|
|
- .gy-print-sheet-head--meta-last td {
|
|
|
- padding-bottom: 6px;
|
|
|
- }
|
|
|
- .gy-print-meta-row {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- width: 100%;
|
|
|
- text-align: left;
|
|
|
- }
|
|
|
- .gy-print-table col.col-part-no { width: 80px; }
|
|
|
- .gy-print-table col.col-part-name { width: 80px; }
|
|
|
- .gy-print-table col.col-process-no { width: 80px; }
|
|
|
- .gy-print-table col.col-workshop { width: 12%; }
|
|
|
- .gy-print-table col.col-process-name { width: auto; }
|
|
|
- .gy-print-table .col-part-no,
|
|
|
- .gy-print-table .col-part-name,
|
|
|
- .gy-print-table .col-process-no {
|
|
|
- padding: 2px 3px;
|
|
|
- white-space: nowrap;
|
|
|
- }
|
|
|
- .gy-print-table .col-process-name { text-align: left; }
|
|
|
- thead { display: table-header-group; }
|
|
|
- tr { page-break-inside: avoid; }
|
|
|
- `
|
|
|
-
|
|
|
- const buildGyDetailPrintHtml = () => {
|
|
|
- const rows = gyDetailPrintTableData.value
|
|
|
- const rowHtml = rows.length
|
|
|
- ? rows
|
|
|
- .map(
|
|
|
- (item) => `<tr>
|
|
|
- <td class="col-part-no">${escapeGyPrintHtml(item.部位编号)}</td>
|
|
|
- <td class="col-part-name">${escapeGyPrintHtml(item.部位名称)}</td>
|
|
|
- <td class="col-process-no">${escapeGyPrintHtml(item.工序编号)}</td>
|
|
|
- <td class="col-process-name">${escapeGyPrintHtml(item.工序名称)}</td>
|
|
|
- <td class="col-workshop">${escapeGyPrintHtml(item.生产工序)}</td>
|
|
|
- </tr>`
|
|
|
- )
|
|
|
- .join('')
|
|
|
- : '<tr><td colspan="5" style="padding:16px;text-align:center;">暂无数据</td></tr>'
|
|
|
- const orderNo = escapeGyPrintHtml(gyDetailFormData.订单编号)
|
|
|
- const styleNo = escapeGyPrintHtml(gyDetailFormData.生产款号)
|
|
|
- const customerNo = escapeGyPrintHtml(gyDetailFormData.客户编号)
|
|
|
- const productStyle = escapeGyPrintHtml(gyDetailFormData.款式)
|
|
|
-
|
|
|
- return `
|
|
|
- <table class="gy-print-table">
|
|
|
- <colgroup>
|
|
|
- <col class="col-part-no" />
|
|
|
- <col class="col-part-name" />
|
|
|
- <col class="col-process-no" />
|
|
|
- <col class="col-process-name" />
|
|
|
- <col class="col-workshop" />
|
|
|
- </colgroup>
|
|
|
- <thead>
|
|
|
- <tr class="gy-print-sheet-head gy-print-sheet-head--company-cn">
|
|
|
- <td colspan="5">浙 江 达 成 凯 悦 纺 织 服 装 有 限 公 司</td>
|
|
|
- </tr>
|
|
|
- <tr class="gy-print-sheet-head gy-print-sheet-head--company-en">
|
|
|
- <td colspan="5">ZHE JIANG REACHING KAYO TEXTILE & GARMENTS CO LTD</td>
|
|
|
- </tr>
|
|
|
- <tr class="gy-print-sheet-head gy-print-sheet-head--title">
|
|
|
- <td colspan="5">工序表</td>
|
|
|
- </tr>
|
|
|
- <tr class="gy-print-sheet-head gy-print-sheet-head--meta">
|
|
|
- <td colspan="5">
|
|
|
- <div class="gy-print-meta-row">
|
|
|
- <span>订单编号:${orderNo}</span>
|
|
|
- <span>生产款号:${styleNo}</span>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- <tr class="gy-print-sheet-head gy-print-sheet-head--meta gy-print-sheet-head--meta-last">
|
|
|
- <td colspan="5">
|
|
|
- <div class="gy-print-meta-row">
|
|
|
- <span>客户编号:${customerNo}</span>
|
|
|
- <span>款式:${productStyle}</span>
|
|
|
- </div>
|
|
|
- </td>
|
|
|
- </tr>
|
|
|
- <tr>
|
|
|
- <th class="col-part-no">部位编号</th>
|
|
|
- <th class="col-part-name">部件名称</th>
|
|
|
- <th class="col-process-no">工序编号</th>
|
|
|
- <th class="col-process-name">工序名称</th>
|
|
|
- <th class="col-workshop">生产工序</th>
|
|
|
- </tr>
|
|
|
- </thead>
|
|
|
- <tbody>${rowHtml}</tbody>
|
|
|
- </table>
|
|
|
- `
|
|
|
- }
|
|
|
-
|
|
|
- let gyDetailPrintIframe = null
|
|
|
- let gyDetailPrintMql = null
|
|
|
-
|
|
|
- const showGyDetailPrintMask = () => {
|
|
|
- if (document.getElementById('gy-detail-print-mask')) return
|
|
|
- const mask = document.createElement('div')
|
|
|
- mask.id = 'gy-detail-print-mask'
|
|
|
- mask.style.cssText = 'position:fixed;inset:0;background:#fff;z-index:99999;'
|
|
|
- document.body.appendChild(mask)
|
|
|
- document.body.style.overflow = 'hidden'
|
|
|
- }
|
|
|
-
|
|
|
- const cleanupGyDetailPrint = (restoreDetail = false) => {
|
|
|
- document.getElementById('gy-detail-print-mask')?.remove()
|
|
|
- document.body.style.overflow = ''
|
|
|
- if (gyDetailPrintMql) {
|
|
|
- if (gyDetailPrintMql.removeListener) {
|
|
|
- gyDetailPrintMql.removeListener(gyDetailPrintMqlHandler)
|
|
|
- } else {
|
|
|
- gyDetailPrintMql.removeEventListener('change', gyDetailPrintMqlHandler)
|
|
|
- }
|
|
|
- gyDetailPrintMql = null
|
|
|
- }
|
|
|
- if (gyDetailPrintIframe) {
|
|
|
- gyDetailPrintIframe.remove()
|
|
|
- gyDetailPrintIframe = null
|
|
|
- }
|
|
|
- if (restoreDetail) {
|
|
|
- gyDetailDialogVisible.value = true
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const gyDetailPrintMqlHandler = (e) => {
|
|
|
- if (!e.matches) {
|
|
|
- cleanupGyDetailPrint(true)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const handleGyDetailSave = async () => {
|
|
|
- if (gyDetailReadonly.value || gyDetailSaving.value) return
|
|
|
- gyDetailSaving.value = true
|
|
|
- try {
|
|
|
- // 先结束当前单元格编辑(原先保存按钮只 blur,没有真正提交)
|
|
|
- let hadEditingCell = false
|
|
|
- if (gyDetailEditingCell.value) {
|
|
|
- hadEditingCell = true
|
|
|
- const editing = gyDetailEditingCell.value
|
|
|
- const editingRow = (gyDetailFormData.工艺列表 || []).find((r) => r._rowKey === editing.rowKey)
|
|
|
- if (editingRow) {
|
|
|
- await finishGyDetailCellEdit(editingRow)
|
|
|
- } else {
|
|
|
- clearGyDetailCellEdit()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const pendingRows = (gyDetailFormData.工艺列表 || []).filter((row) => {
|
|
|
- if (!isGyDetailRowChanged(row)) return false
|
|
|
- // 完全空白的新行不提交
|
|
|
- if (row._gyDetailNew && !row.id) {
|
|
|
- const filled =
|
|
|
- String(row.部件名称 || '').trim() ||
|
|
|
- String(row.工序名称 || '').trim() ||
|
|
|
- String(row.定额分 || '').trim() ||
|
|
|
- String(row.金额 || '').trim() ||
|
|
|
- String(row.秒 || '').trim() ||
|
|
|
- String(row.分 || '').trim()
|
|
|
- if (!filled) return false
|
|
|
- }
|
|
|
- return true
|
|
|
- })
|
|
|
-
|
|
|
- if (!pendingRows.length) {
|
|
|
- // 编辑中的格子已在 finish 时保存并提示过,这里不再重复弹
|
|
|
- if (!hadEditingCell) {
|
|
|
- ElMessage.success('没有需要保存的修改')
|
|
|
- }
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- let successCount = 0
|
|
|
- let failCount = 0
|
|
|
- let skipIncomplete = 0
|
|
|
-
|
|
|
- for (const row of pendingRows) {
|
|
|
- const requiredReady = !!(
|
|
|
- String(row.部件名称 || '').trim() &&
|
|
|
- String(row.工序名称 || '').trim() &&
|
|
|
- String(row.大工序 || '').trim()
|
|
|
- )
|
|
|
- if (!row.id && !requiredReady) {
|
|
|
- skipIncomplete++
|
|
|
- continue
|
|
|
- }
|
|
|
- const ok = await handleUpdateProcess(row, { silent: true })
|
|
|
- if (ok) successCount++
|
|
|
- else failCount++
|
|
|
- }
|
|
|
-
|
|
|
- if (successCount > 0 && failCount === 0 && skipIncomplete === 0) {
|
|
|
- ElMessage.success(successCount === 1 ? '保存成功' : `已保存 ${successCount} 条工序`)
|
|
|
- } else if (successCount > 0) {
|
|
|
- const parts = [`成功 ${successCount} 条`]
|
|
|
- if (failCount) parts.push(`失败 ${failCount} 条`)
|
|
|
- if (skipIncomplete) parts.push(`未填齐必填 ${skipIncomplete} 条`)
|
|
|
- ElMessage.warning(parts.join(','))
|
|
|
- } else if (skipIncomplete > 0 && failCount === 0) {
|
|
|
- ElMessage.warning('请先填写部件名称、工序名称、生产工序后再保存')
|
|
|
- } else {
|
|
|
- ElMessage.error('保存失败')
|
|
|
- }
|
|
|
-
|
|
|
- refreshGyDetailTableFooter()
|
|
|
- } catch (e) {
|
|
|
- console.error('工艺资料保存失败', e)
|
|
|
- ElMessage.error('保存失败')
|
|
|
- } finally {
|
|
|
- gyDetailSaving.value = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const handleGyDetailPrintPreview = async () => {
|
|
|
- if (!gyDetailFormData.工艺列表?.length) {
|
|
|
- ElMessage.warning('暂无工艺数据,无法打印预览')
|
|
|
- return
|
|
|
- }
|
|
|
- gyDetailDialogVisible.value = false
|
|
|
- await nextTick()
|
|
|
- showGyDetailPrintMask()
|
|
|
-
|
|
|
- try {
|
|
|
- gyDetailPrintIframe = document.createElement('iframe')
|
|
|
- gyDetailPrintIframe.setAttribute(
|
|
|
- 'style',
|
|
|
- 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;'
|
|
|
- )
|
|
|
- document.body.appendChild(gyDetailPrintIframe)
|
|
|
-
|
|
|
- const printWin = gyDetailPrintIframe.contentWindow
|
|
|
- if (!printWin) {
|
|
|
- throw new Error('print iframe unavailable')
|
|
|
- }
|
|
|
-
|
|
|
- const html = `<!DOCTYPE html><html><head><meta charset="utf-8"><title>工艺资料</title>
|
|
|
- <style>${GY_DETAIL_PRINT_PAGE_STYLE}</style></head><body>${buildGyDetailPrintHtml()}</body></html>`
|
|
|
-
|
|
|
- const startPrint = () => {
|
|
|
- printWin.focus()
|
|
|
- printWin.print()
|
|
|
- }
|
|
|
-
|
|
|
- const onAfterPrint = () => cleanupGyDetailPrint(true)
|
|
|
- printWin.addEventListener('afterprint', onAfterPrint, { once: true })
|
|
|
-
|
|
|
- if (printWin.matchMedia) {
|
|
|
- gyDetailPrintMql = printWin.matchMedia('print')
|
|
|
- if (gyDetailPrintMql.addListener) {
|
|
|
- gyDetailPrintMql.addListener(gyDetailPrintMqlHandler)
|
|
|
- } else {
|
|
|
- gyDetailPrintMql.addEventListener('change', gyDetailPrintMqlHandler)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- printWin.document.open()
|
|
|
- printWin.document.write(html)
|
|
|
- printWin.document.close()
|
|
|
-
|
|
|
- if (printWin.document.readyState === 'complete') {
|
|
|
- startPrint()
|
|
|
- } else {
|
|
|
- gyDetailPrintIframe.onload = startPrint
|
|
|
- }
|
|
|
- } catch {
|
|
|
- cleanupGyDetailPrint(true)
|
|
|
- ElMessage.error('打印失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const gyDetailPlanManufactureEditing = ref(false)
|
|
|
- const gyDetailPlanManufactureBackup = ref('')
|
|
|
- const gyDetailRemarkBackup = ref('')
|
|
|
- const gyDetailFinishDateBackup = ref('')
|
|
|
- const gyDetailPlanManufactureSaving = ref(false)
|
|
|
-
|
|
|
- const onGyDetailPlanManufactureInput = (val) => {
|
|
|
- let s = String(val ?? '').replace(/[^\d.]/g, '')
|
|
|
- const dot = s.indexOf('.')
|
|
|
- if (dot !== -1) {
|
|
|
- s = s.slice(0, dot + 1) + s.slice(dot + 1).replace(/\./g, '')
|
|
|
- }
|
|
|
- gyDetailFormData.计划制造工分 = s
|
|
|
- }
|
|
|
-
|
|
|
- const startGyDetailPlanManufactureEdit = () => {
|
|
|
- if (gyDetailPlanManufactureEditing.value) return
|
|
|
- // 邢科芳账号不能修改计划制造工分
|
|
|
- if (gyDetailReadonly.value) {
|
|
|
- // ElMessage.warning('您没有权限修改计划制造工分')
|
|
|
- return
|
|
|
- }
|
|
|
- gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
|
|
|
- gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
|
|
|
- gyDetailPlanManufactureEditing.value = true
|
|
|
- }
|
|
|
-
|
|
|
- const cancelGyDetailPlanManufactureEdit = () => {
|
|
|
- gyDetailFormData.计划制造工分 = gyDetailPlanManufactureBackup.value
|
|
|
- gyDetailFormData.备注 = gyDetailRemarkBackup.value
|
|
|
- gyDetailPlanManufactureEditing.value = false
|
|
|
- }
|
|
|
-
|
|
|
- const confirmGyDetailPlanManufactureEdit = async () => {
|
|
|
- gyDetailPlanManufactureSaving.value = true
|
|
|
- try {
|
|
|
- const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
|
|
|
-
|
|
|
- const updatePromises = []
|
|
|
-
|
|
|
- if (gyDetailFormData.计划制造工分 !== gyDetailPlanManufactureBackup.value) {
|
|
|
- updatePromises.push(updateWorkOrderPlanManufacture({
|
|
|
- id: gyDetailFormData.Uniqid,
|
|
|
- number: gyDetailFormData.计划制造工分,
|
|
|
- sys_id: userStore.userInfo.nickName
|
|
|
- }))
|
|
|
- }
|
|
|
-
|
|
|
- if (gyDetailFormData.备注 !== gyDetailRemarkBackup.value || finishDate) {
|
|
|
- updatePromises.push(updateOrderRemarkAndFinishDate({
|
|
|
- id: gyDetailFormData.Uniqid,
|
|
|
- remark: gyDetailFormData.备注,
|
|
|
- 工单完工日期: finishDate,
|
|
|
- sys_id: userStore.userInfo.nickName
|
|
|
- }))
|
|
|
- }
|
|
|
-
|
|
|
- if (updatePromises.length === 0) {
|
|
|
- ElMessage.success('没有修改任何内容')
|
|
|
- gyDetailPlanManufactureEditing.value = false
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- const results = await Promise.all(updatePromises)
|
|
|
-
|
|
|
- const allSuccess = results.every(res => res?.code === 0)
|
|
|
-
|
|
|
- if (allSuccess) {
|
|
|
- ElMessage.success('保存成功')
|
|
|
- gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
|
|
|
- gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
|
|
|
- gyDetailPlanManufactureEditing.value = false
|
|
|
- } else {
|
|
|
- ElMessage.error('保存失败')
|
|
|
- }
|
|
|
- } catch (e) {
|
|
|
- console.error('保存失败', e)
|
|
|
- ElMessage.error('保存失败')
|
|
|
- } finally {
|
|
|
- gyDetailPlanManufactureSaving.value = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 工单完工日期仅前端选择,不在失焦时调接口(随保存一并提交)
|
|
|
- const handleGyDetailFinishDateBlur = async () => {}
|
|
|
-
|
|
|
- const handleGyDetailRemarkBlur = async () => {
|
|
|
- try {
|
|
|
- // 格式化日期为 YYYY-MM-DD 格式
|
|
|
- const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
|
|
|
-
|
|
|
- await updateOrderRemarkAndFinishDate({
|
|
|
- id: gyDetailFormData.Uniqid,
|
|
|
- remark: gyDetailFormData.备注,
|
|
|
- 工单完工日期: finishDate,
|
|
|
- sys_id: userStore.userInfo.nickName
|
|
|
- })
|
|
|
- } catch (e) {
|
|
|
- console.error('更新备注和完工日期失败', e)
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const closeGyDetailDialog = () => {
|
|
|
- clearGyDetailCellEdit()
|
|
|
- gyDetailPlanManufactureEditing.value = false
|
|
|
- gyDetailBuJianMingChengFilter.value = []
|
|
|
- gyDetailDaGongXuFilter.value = []
|
|
|
- gyDetailNanDuXiShuFilter.value = []
|
|
|
- gyDetailZhuangTaiFilter.value = []
|
|
|
- gyDetailDialogVisible.value = false
|
|
|
- gyDetailSelection.value = []
|
|
|
- gyDetailDeleting.value = false
|
|
|
- document.body.classList.remove('el-popup-parent--hidden')
|
|
|
- document.body.style.overflow = ''
|
|
|
- }
|
|
|
-
|
|
|
- // 修改计划制造工分
|
|
|
- const handleUpdatePlanManufacture = async () => {
|
|
|
- gyDetailPlanManufactureSaving.value = true
|
|
|
- try {
|
|
|
- const result = await updateWorkOrderPlanManufacture({
|
|
|
- id: gyDetailFormData.Uniqid,
|
|
|
- number: gyDetailFormData.计划制造工分,
|
|
|
- sys_id: userStore.userInfo.nickName
|
|
|
- })
|
|
|
- if (result.code === 0) {
|
|
|
- ElMessage.success('修改成功')
|
|
|
- return true
|
|
|
- }
|
|
|
- ElMessage.error(result.msg || '修改失败')
|
|
|
- return false
|
|
|
- } catch (error) {
|
|
|
- ElMessage.error('修改失败')
|
|
|
- return false
|
|
|
- } finally {
|
|
|
- gyDetailPlanManufactureSaving.value = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 拆分弹窗相关
|
|
|
- const splitDialogVisible = ref(false)
|
|
|
- const splitQuantity = ref(1)
|
|
|
- const currentSplitRow = ref(null)
|
|
|
- const hasReportData = ref(false)
|
|
|
- const splitSubmitting = ref(false)
|
|
|
-
|
|
|
- const submitProcessSplit = async (row, number) => {
|
|
|
- if (!row?.id) {
|
|
|
- ElMessage.warning('工序数据无效,无法操作')
|
|
|
- return false
|
|
|
- }
|
|
|
- splitSubmitting.value = true
|
|
|
- try {
|
|
|
- const result = await confirmProcessSplit({
|
|
|
- id: row.id,
|
|
|
- number,
|
|
|
- sys_id: userStore.userInfo.nickName,
|
|
|
- })
|
|
|
- if (result.code === 0) {
|
|
|
- ElMessage.success(number === 0 ? '撤销拆分成功' : '拆分成功')
|
|
|
- await refreshGyDetailProcessList()
|
|
|
- return true
|
|
|
- }
|
|
|
- ElMessage.error(result.msg || (number === 0 ? '撤销拆分失败' : '拆分失败'))
|
|
|
- return false
|
|
|
- } catch (error) {
|
|
|
- ElMessage.error(number === 0 ? '撤销拆分失败' : '拆分失败')
|
|
|
- return false
|
|
|
- } finally {
|
|
|
- splitSubmitting.value = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 处理拆分工艺
|
|
|
- const handleSplitProcess = async (row) => {
|
|
|
- if (isGyDetailRowSplit(row)) return
|
|
|
- currentSplitRow.value = row
|
|
|
- splitQuantity.value = 1
|
|
|
-
|
|
|
- try {
|
|
|
- const result = await checkProcessReport({
|
|
|
- workorder: gyDetailFormData.订单编号,
|
|
|
- process_code: row.工序编号,
|
|
|
- })
|
|
|
-
|
|
|
- if (result.code === 0) {
|
|
|
- hasReportData.value = false
|
|
|
- } else if (result.code === 1) {
|
|
|
- hasReportData.value = true
|
|
|
- }
|
|
|
-
|
|
|
- splitDialogVisible.value = true
|
|
|
- } catch (error) {
|
|
|
- ElMessage.error('检查工序报工状态失败')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const buildGySplitProcessLabel = (row) =>
|
|
|
- `${row?.工序编号 || ''}-${row?.工序名称 || ''}`
|
|
|
-
|
|
|
- const buildUndoSplitConfirmMessage = (row) => {
|
|
|
- const label = escapeGyPrintHtml(buildGySplitProcessLabel(row))
|
|
|
- return `确定撤销工序 <span class="gy-split-process-name" style="color:#f56c6c;font-weight:600;">${label}</span> 的拆分吗?`
|
|
|
- }
|
|
|
-
|
|
|
- // 撤销拆分
|
|
|
- const handleUndoSplitProcess = async (row) => {
|
|
|
- if (!isGyDetailRowSplit(row)) return
|
|
|
- try {
|
|
|
- await ElMessageBox.confirm(buildUndoSplitConfirmMessage(row), '撤销拆分', {
|
|
|
- confirmButtonText: '确定',
|
|
|
- cancelButtonText: '取消',
|
|
|
- type: 'warning',
|
|
|
- dangerouslyUseHTMLString: true,
|
|
|
- appendTo: document.body,
|
|
|
- })
|
|
|
- } catch {
|
|
|
- return
|
|
|
- }
|
|
|
- await submitProcessSplit(row, 0)
|
|
|
- }
|
|
|
-
|
|
|
- // 确认拆分
|
|
|
- const confirmSplitProcess = async () => {
|
|
|
- const qty = Number(splitQuantity.value)
|
|
|
- if (!Number.isFinite(qty) || qty < 1 || !Number.isInteger(qty)) {
|
|
|
- ElMessage.warning('拆分数量必须为大于等于 1 的整数,不能为 0')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- const ok = await submitProcessSplit(currentSplitRow.value, qty)
|
|
|
- if (ok) {
|
|
|
- splitDialogVisible.value = false
|
|
|
- currentSplitRow.value = null
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 修改工艺(未改动不请求接口)
|
|
|
- // 新行填齐必填项后会先新增;再改工分等字段应走修改。若新增成功但未带回 id,或再次新增报工序编号已存在,则绑定 id 后改为 UpdateProcess。
|
|
|
- const resolveGyDetailProcessId = (payload) => {
|
|
|
- if (payload == null || payload === '') return ''
|
|
|
- if (typeof payload === 'number' || typeof payload === 'string') return payload
|
|
|
- return payload.id ?? payload.ID ?? payload.Id ?? ''
|
|
|
- }
|
|
|
-
|
|
|
- const isGyProcessCodeExistsError = (res) => {
|
|
|
- const msg = String(res?.msg || res?.message || '')
|
|
|
- return /工序编号/.test(msg) && /(已存在|已经有|重复)/.test(msg)
|
|
|
- }
|
|
|
-
|
|
|
- const bindGyDetailRowIdByProcessCode = async (row) => {
|
|
|
- const orderNo = String(gyDetailFormData.订单编号 || '').trim()
|
|
|
- const code = String(row?.工序编号 ?? '').trim()
|
|
|
- if (!orderNo || !code) return false
|
|
|
- try {
|
|
|
- const processRes = await getWorkOrderProcess({ workorder: orderNo })
|
|
|
- if (processRes?.code !== 0 || !Array.isArray(processRes.data)) return false
|
|
|
- const found = processRes.data.find(
|
|
|
- (item) => String(item.工序编号 ?? item.process_code ?? '').trim() === code
|
|
|
- )
|
|
|
- const id = resolveGyDetailProcessId(found)
|
|
|
- if (!id) return false
|
|
|
- row.id = id
|
|
|
- row._gyDetailNew = false
|
|
|
- return true
|
|
|
- } catch {
|
|
|
- return false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /**
|
|
|
- * 按部件名称补齐部件编号:同名复用已有编号,否则取当前列表最大编号+1。
|
|
|
- * 提交 Add/Update 前必须调用,避免后端报「部件编号不能为空」。
|
|
|
- */
|
|
|
- const ensureGyDetailPartCode = (row) => {
|
|
|
- if (!row) return ''
|
|
|
- const partName = String(row.部件名称 || '').trim()
|
|
|
- if (!partName) {
|
|
|
- row.部件编号 = ''
|
|
|
- return ''
|
|
|
- }
|
|
|
- const currentCode = String(row.部件编号 || '').trim()
|
|
|
- if (currentCode) return currentCode
|
|
|
-
|
|
|
- const existingRow = (gyDetailFormData.工艺列表 || []).find(
|
|
|
- (r) => r !== row && String(r.部件名称 || '').trim() === partName && String(r.部件编号 || '').trim()
|
|
|
- )
|
|
|
- if (existingRow) {
|
|
|
- row.部件编号 = String(existingRow.部件编号).trim()
|
|
|
- return row.部件编号
|
|
|
- }
|
|
|
-
|
|
|
- let maxCode = 0
|
|
|
- ;(gyDetailFormData.工艺列表 || []).forEach((r) => {
|
|
|
- const code = parseInt(String(r.部件编号 || ''), 10)
|
|
|
- if (!isNaN(code) && code > maxCode) {
|
|
|
- maxCode = code
|
|
|
- }
|
|
|
- })
|
|
|
- row.部件编号 = String(maxCode + 1).padStart(2, '0')
|
|
|
- return row.部件编号
|
|
|
- }
|
|
|
-
|
|
|
- const handleUpdateProcess = async (row, options = {}) => {
|
|
|
- const silent = !!options.silent
|
|
|
- const orderNo = String(gyDetailFormData.订单编号 || '').trim()
|
|
|
- if (!orderNo) return false
|
|
|
- if (!isGyDetailRowChanged(row)) return false
|
|
|
-
|
|
|
- if (row._gyDetailSaving) {
|
|
|
- return false
|
|
|
- }
|
|
|
-
|
|
|
- const buJianMingCheng = String(row.部件名称 || '').trim()
|
|
|
- const gongXuMingCheng = String(row.工序名称 || '').trim()
|
|
|
- const daGongXu = String(row.大工序 || '').trim()
|
|
|
- const requiredReady = !!(buJianMingCheng && gongXuMingCheng && daGongXu)
|
|
|
-
|
|
|
- // 有部件名称时提交前补齐部件编号,避免偶发「部件编号不能为空」
|
|
|
- if (buJianMingCheng) {
|
|
|
- ensureGyDetailPartCode(row)
|
|
|
- }
|
|
|
-
|
|
|
- const runUpdate = async () => {
|
|
|
- const partCode = ensureGyDetailPartCode(row) || String(row.部件编号 || '').trim()
|
|
|
- if (buJianMingCheng && !partCode) {
|
|
|
- if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
|
|
|
- return false
|
|
|
- }
|
|
|
- const result = await UpdateProcess({
|
|
|
- id: row.id,
|
|
|
- process_name: row.工序名称 || '',
|
|
|
- big_process: row.大工序 || '',
|
|
|
- standard_hour: row.秒 || '',
|
|
|
- standard_minutes: row.分 || '',
|
|
|
- standard_score: row.定额分 || '',
|
|
|
- money: row.金额 || '',
|
|
|
- coefficient: row.难度系数 || '',
|
|
|
- remark: row.备注 || '',
|
|
|
- mod_id: userStore.userInfo.nickName,
|
|
|
- part_code: partCode,
|
|
|
- part_name: row.部件名称 || '',
|
|
|
- process_code: row.工序编号 || '',
|
|
|
- })
|
|
|
- if (result.code === 0) {
|
|
|
- row._gyDetailNew = false
|
|
|
- row._gyDetailOrigin = snapshotGyDetailRow(row)
|
|
|
- if (!silent) ElMessage.success('修改成功')
|
|
|
- return true
|
|
|
- }
|
|
|
- if (!silent) ElMessage.error(result.msg || '修改失败')
|
|
|
- return false
|
|
|
- }
|
|
|
-
|
|
|
- try {
|
|
|
- // 已有 id:一律修改
|
|
|
- if (row.id) {
|
|
|
- row._gyDetailSaving = true
|
|
|
- row._gyDetailNew = false
|
|
|
- return await runUpdate()
|
|
|
- }
|
|
|
-
|
|
|
- // 无 id:需三个必填齐全才能新增
|
|
|
- if (!requiredReady) {
|
|
|
- if (!silent && (gyDetailLastEditingField.value === '工序名称' || gyDetailLastEditingField.value === '部件名称')) {
|
|
|
- ElMessage.warning('部件名称、工序名称、生产工序三个字段都必须填写')
|
|
|
- }
|
|
|
- return false
|
|
|
- }
|
|
|
-
|
|
|
- const partCode = ensureGyDetailPartCode(row)
|
|
|
- if (!partCode) {
|
|
|
- if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
|
|
|
- return false
|
|
|
- }
|
|
|
-
|
|
|
- row._gyDetailSaving = true
|
|
|
-
|
|
|
- const addRes = await AddProcess({
|
|
|
- workorder: orderNo,
|
|
|
- part_code: partCode,
|
|
|
- part_name: row.部件名称 || '',
|
|
|
- process_name: row.工序名称 || '',
|
|
|
- process_code: String(row.工序编号 ?? ''),
|
|
|
- big_process: row.大工序 || '',
|
|
|
- standard_hour: row.秒 || '',
|
|
|
- standard_minutes: row.分 || '',
|
|
|
- standard_score: row.定额分 || '',
|
|
|
- money: row.金额 || '',
|
|
|
- coefficient: row.难度系数 || '',
|
|
|
- remark: row.备注 || '',
|
|
|
- sys_id: userStore.userInfo?.nickName || '',
|
|
|
- })
|
|
|
-
|
|
|
- if (addRes?.code === 0) {
|
|
|
- row._gyDetailNew = false
|
|
|
- row.id = resolveGyDetailProcessId(addRes.data)
|
|
|
- if (!row.id) {
|
|
|
- await bindGyDetailRowIdByProcessCode(row)
|
|
|
- }
|
|
|
- row._gyDetailOrigin = snapshotGyDetailRow(row)
|
|
|
- if (!silent) ElMessage.success('保存成功')
|
|
|
- return true
|
|
|
- }
|
|
|
-
|
|
|
- // 工序已在库中(例如必填项保存时已新增):改为修改
|
|
|
- if (isGyProcessCodeExistsError(addRes)) {
|
|
|
- const bound = await bindGyDetailRowIdByProcessCode(row)
|
|
|
- if (bound && row.id) {
|
|
|
- return await runUpdate()
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (!silent) ElMessage.error(addRes?.msg || '保存失败')
|
|
|
- return false
|
|
|
- } catch {
|
|
|
- return false
|
|
|
- } finally {
|
|
|
- row._gyDetailSaving = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // =========== 订单打印 ===========
|
|
|
- //弹窗
|
|
|
- const order_viewVisible = ref(false)
|
|
|
- // 默认选择竖向
|
|
|
- const printDirection = ref('纵向')
|
|
|
- const cp_gdprintonClick = () => {
|
|
|
- order_viewVisible.value = true
|
|
|
- }
|
|
|
-
|
|
|
- //确定打印
|
|
|
- const confirmPrintDirection = () => {
|
|
|
-
|
|
|
- console.log(_Gd_gdbh.value)
|
|
|
- console.log(printDirection.value)
|
|
|
-
|
|
|
- if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
- ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
|
|
|
- return false;
|
|
|
- }else{
|
|
|
- if(ystableData.length >=1){
|
|
|
- printPageRef.value.open(_Gd_gdbh.value,printDirection.value)
|
|
|
- }else{
|
|
|
- ElMessage({type: 'warning',message: '请新增颜色资料,再操作此功能'})
|
|
|
- return false;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- const order_viewCloseDialog = () => {
|
|
|
- order_viewVisible.value = false
|
|
|
- }
|
|
|
-
|
|
|
- // =========== BOM资料 ===========
|
|
|
- const res_bomdialogFormVisible = ref(false)
|
|
|
- const resbomtableData = ref([]);
|
|
|
- const ddhformData = reactive({
|
|
|
- ddh: '',
|
|
|
- kh: '',
|
|
|
- sckh: '',
|
|
|
- ks: '',
|
|
|
- ml: '',
|
|
|
- });
|
|
|
- const getTodayYmd = () => {
|
|
|
- const t = new Date()
|
|
|
- return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(t.getDate()).padStart(2, '0')}`
|
|
|
- }
|
|
|
- const fillDefaultPlanRuku = (rows) => {
|
|
|
- if (!Array.isArray(rows)) return
|
|
|
- rows.forEach((row) => {
|
|
|
- const v = row['计划入库时间']
|
|
|
- if (v === undefined || v === null || String(v).trim() === '') {
|
|
|
- row['计划入库时间'] = getTodayYmd()
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
- const resbom_tableColumns = ref(
|
|
|
- [
|
|
|
- { label: '物料分类', prop: '物料分类', width: '130' },
|
|
|
- { label: '物料名称', prop: '物料名称', width: '300' },
|
|
|
- { label: '计划入库时间', prop: '计划入库时间', width: '160' },
|
|
|
- { label: '计划用料', prop: '计划用料', width: '130' },
|
|
|
- { label: '计划门幅', prop: '计划门幅', width: '130' },
|
|
|
- { label: '定额用料', prop: '定额用料', width: '130' },
|
|
|
- { label: '定额门幅', prop: '定额门幅', width: '130' },
|
|
|
- { label: '备注', prop: '备注', width: '240' },
|
|
|
- ]
|
|
|
- )
|
|
|
- //批量修改BOM资料
|
|
|
- const BOMclick = () => {
|
|
|
- if(bomtableData.value === ''){
|
|
|
- ElMessage({type: 'warning',message: 'BOM数据为空'})
|
|
|
- return;
|
|
|
- }
|
|
|
- if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
- ElMessage({type: 'warning',message: '请选择订单后,再操作此功能'})
|
|
|
- return;
|
|
|
- }else{
|
|
|
- res_bomdialogFormVisible.value = true
|
|
|
- ddhformData.ddh = _Gd_gdbh.value
|
|
|
- ddhformData.kh = _Gd_kh.value
|
|
|
- ddhformData.sckh = _Gd_sckh.value
|
|
|
- ddhformData.ks = _Gd_ks.value
|
|
|
- ddhformData.ml = _Gd_ML.value
|
|
|
- _TestCoefficient();
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const handleInput = (value, row, prop) => {
|
|
|
- if(prop != "物料名称" && prop != "备注" && prop != "物料分类" && prop != "计划入库时间" ){
|
|
|
- // 使用正则表达式过滤非数字和小数点的字符
|
|
|
- let filteredValue = value.replace(/[^\d.]/g, '');
|
|
|
-
|
|
|
- // 不允许以 . 开头
|
|
|
- if (filteredValue.startsWith('.')) {
|
|
|
- filteredValue = filteredValue.slice(1); // 去掉开头的 .
|
|
|
- }
|
|
|
-
|
|
|
- // 确保只有一个小数点
|
|
|
- const parts = filteredValue.split('.');
|
|
|
- if (parts.length > 2) {
|
|
|
- // 如果超过一个小数点,只保留第一个
|
|
|
- row[prop] = `${parts[0]}.${parts.slice(1).join('')}`;
|
|
|
- } else {
|
|
|
- // 否则直接赋值
|
|
|
- row[prop] = filteredValue;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
- //bom数据获取
|
|
|
- const _TestCoefficient = async ()=>{
|
|
|
- try {
|
|
|
- const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
- console.log(orderBomListdata)
|
|
|
- resbomtableData.value = orderBomListdata.data;
|
|
|
- const formattedData = orderBomListdata.data.map(item=>{
|
|
|
- item.BOM_desc = item.BOM_desc;
|
|
|
- item.物料名称 = item.物料名称;
|
|
|
- item.计划用料 = item.计划用料;
|
|
|
- item.定额用料 = item.定额用料;
|
|
|
- item.裁床实际用料 = item.裁床实际用料;
|
|
|
- item.裁床领用面料 = item.裁床领用面料;
|
|
|
- item.裁床退回仓库面料 = item.裁床退回仓库面料;
|
|
|
- item.备注 = item.备注;
|
|
|
- item.投料单位 = "米";
|
|
|
- // item.UNIQID = item.UNIQID;
|
|
|
- return item
|
|
|
- });
|
|
|
- fillDefaultPlanRuku(resbomtableData.value)
|
|
|
- } catch (error) {
|
|
|
- console.error(error);
|
|
|
- }
|
|
|
- }
|
|
|
- const resbom_handleKeyDown = (event, x, y, prop) => {
|
|
|
- const currentElement = document.getElementById(`input${x}${y}`);
|
|
|
- if (currentElement === null && currentElement === undefined) return
|
|
|
- let move = 0
|
|
|
- switch (event.keyCode) {
|
|
|
- case 13: // Enter
|
|
|
- case 40: // 向下箭头
|
|
|
- if (y < resbomtableData.value.length )
|
|
|
- document.getElementById(`input${x}${y + 1}`).focus();
|
|
|
- break;
|
|
|
- case 38: // 向上箭头
|
|
|
- if ( y > 0) {
|
|
|
- document.getElementById(`input${x}${y - 1}`).focus();
|
|
|
- }
|
|
|
- break;
|
|
|
- case 39: // 向左箭头
|
|
|
- if (x >= 0 && x <=6) {
|
|
|
- move = x + 1
|
|
|
- }
|
|
|
- document.getElementById(`input${move}${y}`).focus();
|
|
|
- break;
|
|
|
- case 37: // 向右箭头
|
|
|
- if (x = 0 && x <=6) {
|
|
|
- move = x - 1
|
|
|
- }
|
|
|
- document.getElementById(`input${move}${y}`).focus();
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- const scfjfpxsCellClass = ({row, column, rowIndex, columnIndex}) =>{
|
|
|
- if (
|
|
|
- column.label === '物料分类' ||
|
|
|
- column.label === '计划门幅' ||
|
|
|
- column.label === '定额门幅' ||
|
|
|
- column.label === '计划用料' ||
|
|
|
- column.label === '备注' ||
|
|
|
- column.label === '物料名称' ||
|
|
|
- column.label === '计划用量' ||
|
|
|
- column.label === '定额用料' ||
|
|
|
- column.label === '计划入库时间' ) {
|
|
|
- return 'background-plan-usage-low';
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- //新增
|
|
|
- const add_bomenterDialog = async() => {
|
|
|
- // 创建一行空数据,字段值可以根据需求初始化
|
|
|
- const newRow = {
|
|
|
- 'BOM_desc': '',
|
|
|
- '物料名称': '',
|
|
|
- '计划入库时间': getTodayYmd(),
|
|
|
- '计划用料': '',
|
|
|
- '定额用料': '',
|
|
|
- '裁床实际用料': '',
|
|
|
- '裁床领用面料': '',
|
|
|
- '裁床退回仓库面料': '',
|
|
|
- '备注': '',
|
|
|
- '投料单位': '米',
|
|
|
- 'UNIQID':''
|
|
|
- };
|
|
|
- if (!resbomtableData.value || !Array.isArray(resbomtableData.value)) {
|
|
|
- resbomtableData.value = []; // 重新初始化
|
|
|
- }
|
|
|
- // 将新增的行数据推入到表格数据中
|
|
|
- resbomtableData.value.push(newRow);
|
|
|
- }
|
|
|
-
|
|
|
- // BOM删除
|
|
|
- const record_deleteRow = async (row, index) => {
|
|
|
- console.log(row.UNIQID);
|
|
|
-
|
|
|
- // 使用 ElMessageBox 提示确认删除
|
|
|
- ElMessageBox.confirm('确定删除此行数据吗?', '提示', {
|
|
|
- confirmButtonText: '确定',
|
|
|
- cancelButtonText: '取消',
|
|
|
- type: 'warning'
|
|
|
- }).then(async () => {
|
|
|
- // 确认删除,检查UNIQID是否为空
|
|
|
- if (row.UNIQID === '' || row.UNIQID === null || row.UNIQID === undefined) {
|
|
|
- // 删除当前行数据
|
|
|
- resbomtableData.value.splice(index, 1);
|
|
|
- ElMessage({
|
|
|
- type: 'success',
|
|
|
- message: '删除成功'
|
|
|
- });
|
|
|
- } else {
|
|
|
- // 调用接口删除
|
|
|
- const Bomdel_del = await Bomdel({ UNIQID: row.UNIQID });
|
|
|
- console.log(Bomdel_del)
|
|
|
- if (Bomdel_del.code === 0) {
|
|
|
- ElMessage({
|
|
|
- type: 'success',
|
|
|
- message: '删除成功'
|
|
|
- });
|
|
|
- } else {
|
|
|
- const msg = Bomdel_del.msg || '';
|
|
|
- console.log('msg:', msg);
|
|
|
-
|
|
|
- // 初始化标题和内容
|
|
|
- let title = '提示';
|
|
|
- let content = msg;
|
|
|
-
|
|
|
- // 截取中文句号(。)分割
|
|
|
- const splitIndex = msg.indexOf('。');
|
|
|
- if (splitIndex !== -1) {
|
|
|
- title = msg.substring(0, splitIndex + 1); // 截取第一个句号前的作为标题(含句号)
|
|
|
- content = msg.substring(splitIndex + 1); // 后面的作为内容
|
|
|
- }
|
|
|
-
|
|
|
- // 弹窗提示(注意参数顺序)
|
|
|
- ElMessageBox.confirm(
|
|
|
- `<p style="font-size:14px;">${content}</p>`, // 内容
|
|
|
- title, // 标题
|
|
|
- {
|
|
|
- type: 'warning',
|
|
|
- dangerouslyUseHTMLString: true
|
|
|
- }
|
|
|
- );
|
|
|
-
|
|
|
- }
|
|
|
- // 重新获取BOM列表数据
|
|
|
- const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
- //BOM资料列表
|
|
|
- bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
|
|
|
- //批量新增/更新BOM数据列表
|
|
|
- resbomtableData.value = orderBomListdata.data;
|
|
|
- fillDefaultPlanRuku(resbomtableData.value)
|
|
|
- }
|
|
|
- }).catch(() => {
|
|
|
- // 取消删除
|
|
|
- // ElMessage({
|
|
|
- // type: 'info',
|
|
|
- // message: '已取消删除'
|
|
|
- // });
|
|
|
- });
|
|
|
- }
|
|
|
-
|
|
|
- //修改
|
|
|
- const res_bomenterDialog = async () => {
|
|
|
- const rawValueArray = resbomtableData._rawValue;
|
|
|
- const formattedData = rawValueArray
|
|
|
- .filter(item => item.物料名称 !== null && item.物料名称 !== "") // 过滤掉物料名称为空的行
|
|
|
- .map(item => {
|
|
|
- return {
|
|
|
- BOM_工单编号: ddhformData['ddh'],
|
|
|
- UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
|
|
|
- 物料分类: item.物料分类 !== null ? item.物料分类 : "",
|
|
|
- BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
|
|
|
- BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
|
|
|
- BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
|
|
|
- BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
|
|
|
- Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
|
|
|
- BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
|
|
|
- BOM_desc: item.备注 !== null ? item.备注 : "",
|
|
|
- BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
|
|
|
- BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
|
|
|
- BOM_投料单位: "",
|
|
|
- Sys_ID: userStore.userInfo.nickName,
|
|
|
- Sys_rq: currentDate,
|
|
|
- 计划入库时间: item['计划入库时间'] != null && String(item['计划入库时间']).trim() !== ''
|
|
|
- ? String(item['计划入库时间']).trim()
|
|
|
- : getTodayYmd(),
|
|
|
- 计划入库操作人:userStore.userInfo.nickName,
|
|
|
- }
|
|
|
- });
|
|
|
- console.log(formattedData);
|
|
|
- const add_FabricEditdata = await FabricEdit(formattedData);
|
|
|
- if (add_FabricEditdata.code === 0) {
|
|
|
- res_bomdialogFormVisible.value = false;
|
|
|
- ElMessage({type: 'success',message: '修改成功'})
|
|
|
- const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
- bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
|
|
|
- } else {
|
|
|
- ElMessage({ type: 'error',message: '修改失败'})
|
|
|
- }
|
|
|
-
|
|
|
- }
|
|
|
-
|
|
|
- // 取消
|
|
|
- const
|
|
|
- res_bomcloseDialog = () => {
|
|
|
- res_bomdialogFormVisible.value = false;
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- //BOM资料表格双击
|
|
|
- const edit_bomdialogFormVisible = ref(false)
|
|
|
- const edit_resbomtableData = ref([]);
|
|
|
- const edit_resbom_tableColumns = ref(
|
|
|
- [
|
|
|
- { label: '物料名称', prop: '物料名称', width: '170' },
|
|
|
- { label: '计划用料', prop: '计划用料', width: '130' },
|
|
|
- { label: '定额用料', prop: '定额用料', width: '130' },
|
|
|
- { label: '计划门幅', prop: '计划门幅', width: '170' },
|
|
|
- { label: '定额门幅', prop: '定额门幅', width: '170' },
|
|
|
- // { label: '裁床实际用料', prop: '裁床实际用料', width: '130' },
|
|
|
- // { label: '裁床领用面料', prop: '裁床领用面料', width: '130' },
|
|
|
- // { label: '裁床退回仓库面料', prop: '裁床退回仓库面料', width: '170' },
|
|
|
- { label: '备注', prop: '备注', width: '170' },
|
|
|
- { label: '投料单位', prop: '投料单位', width: '100' },
|
|
|
- ]
|
|
|
- )
|
|
|
-
|
|
|
- const UNIQID = ref('')
|
|
|
- const bombomupdateCompanyFunc = async (row) => {
|
|
|
- BOMclick()
|
|
|
- // edit_bomdialogFormVisible.value = true
|
|
|
- // ddhformData.ddh = _Gd_gdbh.value
|
|
|
- // ddhformData.kh = _Gd_kh.value
|
|
|
- // ddhformData.sckh = _Gd_sckh.value
|
|
|
- // ddhformData.ks = _Gd_ks.value
|
|
|
- // UNIQID.value = row.UNIQID
|
|
|
- // _editTestCoefficient()
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // BOM数据获取
|
|
|
- const _editTestCoefficient = async () => {
|
|
|
- try {
|
|
|
- // 获取 BOM 数据
|
|
|
- const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
- console.log(orderBomListdata);
|
|
|
-
|
|
|
- // 过滤数据,只保留 UNIQID 相同的项
|
|
|
- const filteredData = orderBomListdata.data.filter(item => item.UNIQID === UNIQID.value);
|
|
|
-
|
|
|
- // 处理数据
|
|
|
- edit_resbomtableData.value = filteredData.map(item => ({
|
|
|
- 物料名称: item.物料名称,
|
|
|
- 计划用料: item.计划用料,
|
|
|
- 定额用料: item.定额用料,
|
|
|
- 裁床实际用料: item.裁床实际用料,
|
|
|
- 裁床领用面料: item.裁床领用面料,
|
|
|
- 裁床退回仓库面料: item.裁床退回仓库面料,
|
|
|
- 备注: item.备注,
|
|
|
- 计划门幅: item.计划门幅,
|
|
|
- 定额门幅: item.定额门幅,
|
|
|
- UNIQID: item.UNIQID // 保留 UNIQID 以便后续使用
|
|
|
- }));
|
|
|
- } catch (error) {
|
|
|
- console.error(error);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
- //一键修改
|
|
|
- const editres_bomenterDialog = async () => {
|
|
|
- const rawValueArray = edit_resbomtableData._rawValue;
|
|
|
- const formattedData = rawValueArray
|
|
|
- .filter(item => item.物料名称 !== null && item.物料名称 !== "") // 过滤掉物料名称为空的行
|
|
|
- .map(item => {
|
|
|
- return {
|
|
|
- BOM_工单编号: ddhformData['ddh'],
|
|
|
- UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
|
|
|
- BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
|
|
|
- BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
|
|
|
- BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
|
|
|
- BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
|
|
|
- Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
|
|
|
- BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
|
|
|
- BOM_desc: item.备注 !== null ? item.备注 : "",
|
|
|
- BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
|
|
|
- BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
|
|
|
- BOM_投料单位: "米",
|
|
|
- Sys_ID: userStore.userInfo.nickName,
|
|
|
- Sys_rq: currentDate
|
|
|
- }
|
|
|
- });
|
|
|
- console.log(formattedData);
|
|
|
-
|
|
|
- const add_FabricEditdata = await FabricEdit(formattedData);
|
|
|
- if (add_FabricEditdata.code === 0) {
|
|
|
- edit_bomdialogFormVisible.value = false;
|
|
|
- ElMessage({type: 'success',message: '修改成功'})
|
|
|
- const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
- bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
|
|
|
- } else {
|
|
|
- ElMessage({ type: 'error',message: '修改失败'})
|
|
|
- }
|
|
|
- }
|
|
|
- // 取消
|
|
|
- const editres_bomcloseDialog = () => {
|
|
|
- edit_bomdialogFormVisible.value = false;
|
|
|
- }
|
|
|
- //点击表格行获取下方表格数据列表
|
|
|
- // =========== 颜色资料、工艺资料、技术资料附件 ===========
|
|
|
- //全局调用订单号编号
|
|
|
- const _Gd_gdbh = ref('')
|
|
|
- const _ddhval = ref('')
|
|
|
- const _Gd_kh = ref('')
|
|
|
- const _Gd_sckh = ref('')
|
|
|
- const _Gd_ks = ref('')
|
|
|
- const _Gd_ML = ref('')
|
|
|
- //颜色资料
|
|
|
- const ystableData = reactive([])
|
|
|
- //尺寸列表
|
|
|
- const sizeDatas = reactive([])
|
|
|
- //部件资料
|
|
|
- const parttableData = reactive([])
|
|
|
- //工艺资料
|
|
|
- const gytableData = reactive([])
|
|
|
- //订单资料表
|
|
|
- const ddtableData = reactive([])
|
|
|
- //技术附件
|
|
|
- const jstableData = reactive([])
|
|
|
-
|
|
|
- const fhdtableData = reactive([])
|
|
|
- //BOM附件
|
|
|
- const bomtableData = reactive([])
|
|
|
- //面料附件
|
|
|
- const mltableData = reactive([])
|
|
|
-
|
|
|
- // 工序产量核查
|
|
|
- const processProductionVisible = ref(false)
|
|
|
- const processProductionWorkorder = ref('')
|
|
|
- const processProductionDialogKey = ref(0)
|
|
|
- const processProductionChecking = ref(false)
|
|
|
- const openProcessProductionDialog = async () => {
|
|
|
- if (!_Gd_gdbh.value) {
|
|
|
- ElMessage.warning('请先在表格中点击选择订单')
|
|
|
- return
|
|
|
- }
|
|
|
- processProductionChecking.value = true
|
|
|
- try {
|
|
|
- const result = await ensureProcessProductionData(_Gd_gdbh.value)
|
|
|
- if (!result.ok) return
|
|
|
- processProductionWorkorder.value = result.workorder
|
|
|
- processProductionDialogKey.value += 1
|
|
|
- processProductionVisible.value = true
|
|
|
- } finally {
|
|
|
- processProductionChecking.value = false
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 导入工艺资料相关变量
|
|
|
- const importProcessDialogVisible = ref(false)
|
|
|
- const importProcessForm = reactive({
|
|
|
- workorderNo: '',
|
|
|
- styleNo: ''
|
|
|
- })
|
|
|
- const importProcessFileList = reactive([])
|
|
|
- const importProcessUploadRef = ref(null)
|
|
|
- let importProcessFile = null
|
|
|
-
|
|
|
- //点击订单资料行
|
|
|
- const tableRowClick = async (row) => {
|
|
|
- //清空尺寸列表、颜色资料、部件资料、工艺资料、订单资料附件、技术附件
|
|
|
- sizeDatas.length = 0
|
|
|
- ystableData.splice(0, ystableData.length);
|
|
|
- parttableData.splice(0, parttableData.length);
|
|
|
- gytableData.splice(0, gytableData.length);
|
|
|
- ddtableData.splice(0, ddtableData.length);
|
|
|
- fhdtableData.splice(0, fhdtableData.length);
|
|
|
- jstableData.splice(0, jstableData.length);
|
|
|
- bomtableData.splice(0, bomtableData.length);
|
|
|
- mltableData.splice(0, mltableData.length);
|
|
|
- _Gd_gdbh.value = row.订单编号
|
|
|
- _ddhval.value = row.订单编号
|
|
|
- _Gd_kh.value = row.客户编号
|
|
|
- _Gd_sckh.value = row.生产款号
|
|
|
- _Gd_ks.value = row.款式
|
|
|
- _Gd_ML.value = row.面料
|
|
|
-
|
|
|
- //数据列表显示
|
|
|
- const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
- const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
|
|
|
- const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
|
|
|
- const fhdOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'发货单附件'})
|
|
|
-
|
|
|
- const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
- // console.log("orderBomListdata:", orderBomListdata); // 打印接口返回的数据
|
|
|
- // 确保 orderBomListdata.data 是数组,避免 undefined 错误
|
|
|
- if (orderBomListdata?.data && Array.isArray(orderBomListdata.data)) {
|
|
|
- bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
|
|
|
- } else {
|
|
|
- bomtableData.splice(0, bomtableData.length); // 如果数据无效,清空表格
|
|
|
- }
|
|
|
-
|
|
|
- // 获取部件资料
|
|
|
- const partListData = await PartList({ workorder: _Gd_gdbh.value });
|
|
|
- if (partListData?.code === 0 && Array.isArray(partListData.data)) {
|
|
|
- parttableData.splice(0, parttableData.length, ...partListData.data);
|
|
|
- } else {
|
|
|
- parttableData.splice(0, parttableData.length);
|
|
|
- }
|
|
|
-
|
|
|
- // 获取工艺资料
|
|
|
- const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
- if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
- gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
- } else {
|
|
|
- gytableData.splice(0, gytableData.length);
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
|
|
|
- // console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
|
|
|
-
|
|
|
- if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
|
|
|
- // 如果 data.table 是数组且不为空,更新表格数据
|
|
|
- mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
|
|
|
- } else {
|
|
|
- // 如果 data.table 为空或无效,清空表格数据
|
|
|
- mltableData.splice(0, mltableData.length);
|
|
|
- }
|
|
|
-
|
|
|
- //颜色资料
|
|
|
- if(PrintListDatas.data.列表.length === 0 ){
|
|
|
- ystableData.length = 0
|
|
|
- }else{
|
|
|
- sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//表格尺码投数据
|
|
|
- ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
|
|
|
- const newData = PrintListDatas.data.列表.map(item => ({
|
|
|
- ...item,
|
|
|
- 船样: item.船样 === 1 ? '是' : '否'
|
|
|
- }));
|
|
|
- ystableData.length = 0;
|
|
|
- ystableData.push(...newData);
|
|
|
- }
|
|
|
- //技术附件
|
|
|
- if(jsOrderAttachments.data === ''){
|
|
|
- const WorkListdata = [];
|
|
|
- jstableData.splice(0,jstableData.length,...WorkListdata);
|
|
|
- }
|
|
|
- if(jsOrderAttachments.code === 0 && ddOrderAttachments.code === 0){
|
|
|
- jstableData.splice(0,jsOrderAttachments.data.list.length,...jsOrderAttachments.data.list);
|
|
|
- ddtableData.splice(0,ddOrderAttachments.data.list.length,...ddOrderAttachments.data.list);
|
|
|
- if(fhdOrderAttachments.data && fhdOrderAttachments.data.list && fhdOrderAttachments.data.list.length > 0){
|
|
|
- if(_username.value === fhdOrderAttachments.data.list[0]['sys_id'] || _username.value === 'admin/超级管理员'){
|
|
|
- fhdtableData.splice(0,fhdOrderAttachments.data.list.length,...fhdOrderAttachments.data.list);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
-
|
|
|
- // //pdf
|
|
|
- // const showPdfModal = ref(false);
|
|
|
- // const pdfContainer = ref(null);
|
|
|
-
|
|
|
- // const closeModal = () => {
|
|
|
- // showPdfModal.value = false;
|
|
|
- // };
|
|
|
-
|
|
|
- // const fetchAndConvertFile = async () => {
|
|
|
- // try {
|
|
|
- // // 从后端获取 Base64 编码的 XLSX 文件数据
|
|
|
- // const responses = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'});
|
|
|
- // const response= responses.data[0].附件内容
|
|
|
- // const base64Data = response.match(/base64,(.*)$/)?.[1];
|
|
|
-
|
|
|
- // if (!base64Data) {
|
|
|
- // throw new Error('Invalid Base64 data');
|
|
|
- // }
|
|
|
-
|
|
|
- // const binaryString = atob(base64Data);
|
|
|
- // const binaryLen = binaryString.length;
|
|
|
- // const bytes = new Uint8Array(binaryLen);
|
|
|
-
|
|
|
- // for (let i = 0; i < binaryLen; i++) {
|
|
|
- // bytes[i] = binaryString.charCodeAt(i);
|
|
|
- // }
|
|
|
-
|
|
|
- // // 解析 XLSX 文件
|
|
|
- // const workbook = XLSX.read(bytes, { type: 'array' });
|
|
|
- // const worksheet = workbook.Sheets[workbook.SheetNames[0]];
|
|
|
- // console.log(121212,worksheet)
|
|
|
- // const jsonData = XLSX.utils.sheet_to_json(worksheet);
|
|
|
-
|
|
|
- // let base64 = XLSX.write(worksheet, { type: 'base64' });
|
|
|
-
|
|
|
- // generatePdf(base64);
|
|
|
- // } catch (error) {
|
|
|
- // console.error('Error fetching and converting file:', error);
|
|
|
- // }
|
|
|
- // };
|
|
|
-
|
|
|
- // const generatePdf = (data) => {
|
|
|
- // console/log('pdf data', data)
|
|
|
- // const pdfDoc = new jsPDF()
|
|
|
- // pdfDoc.text(data)
|
|
|
- // pdfDoc.save(a4.pdf)
|
|
|
- // };
|
|
|
-
|
|
|
- // const previewPdf = (blob) => {
|
|
|
- // const fileURL = URL.createObjectURL(blob);
|
|
|
-
|
|
|
- // // 通过 ref 引用 pdfContainer 来在指定容器中显示 PDF
|
|
|
- // const iframe = document.createElement('iframe');
|
|
|
- // iframe.src = fileURL;
|
|
|
- // iframe.width = '100%';
|
|
|
- // iframe.height = '600px';
|
|
|
-
|
|
|
- // if (pdfContainer.value) {
|
|
|
- // pdfContainer.value.innerHTML = ''; // 清空之前的内容
|
|
|
- // pdfContainer.value.appendChild(iframe);
|
|
|
- // }
|
|
|
- // };
|
|
|
-
|
|
|
- //表格复选框
|
|
|
- const ddzlTableRowKey = (row) => {
|
|
|
- const u = row.Uniqid
|
|
|
- const id = row?.ID ?? row?.id
|
|
|
- if (id != null && id !== '') return String(id)
|
|
|
- return `dd-${row?.['订单编号'] ?? 'x'}-${row?.['生产款号'] ?? ''}-${row?.['客户编号'] ?? ''}`
|
|
|
- }
|
|
|
- const ysColorTableRowKey = (row) => {
|
|
|
- const u = row.Uniqid
|
|
|
- const id = row?.ID ?? row?.id
|
|
|
- if (id != null && id !== '') return String(id)
|
|
|
- return `ys-${row?.['子订单编号'] ?? ''}-${String(row?.['款号'] ?? '')}-${String(row?.['颜色'] ?? '')}`
|
|
|
- }
|
|
|
- const table_del = ref(true)//删除订单资料
|
|
|
- const table_Selection = ref('')//存储选中Uniqid
|
|
|
- const ddzlSelectionChange = (selection, type) => {
|
|
|
- const ids = selection.map(item => {
|
|
|
- return item.Uniqid ?? item.UniqID ?? item.UniqId
|
|
|
- })
|
|
|
- console.log('[订单资料] 勾选 Uniqid:', ids)
|
|
|
- table_Selection.value = ids.filter((v) => v != null && v !== '').join(',')
|
|
|
- }
|
|
|
-
|
|
|
- // 删除按钮
|
|
|
- const del_ddzlClick = async () => {
|
|
|
- try {
|
|
|
- // 显示确认弹窗
|
|
|
- await ElMessageBox.confirm('确定要删除这条记录吗?', '提示', {
|
|
|
- confirmButtonText: '确定',
|
|
|
- cancelButtonText: '取消',
|
|
|
- type: 'warning',
|
|
|
- });
|
|
|
-
|
|
|
- // 如果用户点击了确定
|
|
|
- let params = {};
|
|
|
- params.Uniqid = table_Selection._value;
|
|
|
- console.log(params);
|
|
|
- const res1 = await orderDataDel(params);
|
|
|
- if (res1.code === 0) {
|
|
|
- ElMessage.success('删除成功');
|
|
|
-
|
|
|
- // 重新加载工单列表
|
|
|
- const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: "1", limit: "10" });
|
|
|
- tableData.value = WorkListdata.data.data;
|
|
|
-
|
|
|
- // 清空相关数据
|
|
|
- ystableData.splice(0, ystableData.length); // 颜色资料清空
|
|
|
- parttableData.splice(0, parttableData.length); // 部件资料清空
|
|
|
- gytableData.splice(0, gytableData.length); // 工艺资料清空
|
|
|
- ddtableData.splice(0, ddtableData.length); // 订单资料附件清空
|
|
|
- jstableData.splice(0, jstableData.length); // 技术附件清空
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- // 用户点击了取消或关闭了弹窗
|
|
|
- ElMessage.info('删除操作已取消');
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
- const delall = ref(true)
|
|
|
- //颜色复选框
|
|
|
- const ysSelection = ref('')
|
|
|
- //工艺复选框
|
|
|
- const gySelection = ref('')
|
|
|
- // 颜色资料多选、工艺资料多选
|
|
|
- const selectionChange = (selection, type) => {
|
|
|
- if (type === '颜色资料') {
|
|
|
- const ids = selection.map(item => item.Uniqid ?? item.UniqID ?? item.UniqId)
|
|
|
- console.log('[颜色资料] 勾选 Uniqid:', ids)
|
|
|
- ysSelection.value = ids.filter((v) => v != null && v !== '').join(',')
|
|
|
- }
|
|
|
- if (type === '工艺资料') {
|
|
|
- const ids = selection.map(item => item.id)
|
|
|
- console.log('[工艺资料] 勾选 id:', ids)
|
|
|
- gySelection.value = ids.filter((v) => v != null && v !== '').join(',')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // ===========删除颜色资料、工艺资料 ===========
|
|
|
- const delgd_delclick = async () => {
|
|
|
- let changed = false;
|
|
|
-
|
|
|
- try {
|
|
|
- if (ysSelection.value !== '') {
|
|
|
- const res1 = await PrintDetailDel({ UniqId: ysSelection.value });
|
|
|
- if (res1.code === 0) {
|
|
|
- ElMessage.success('颜色资料删除成功');
|
|
|
- changed = true;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (gySelection.value !== '') {
|
|
|
- const res2 = await PrintDetailDel({ UniqId: gySelection.value });
|
|
|
- if (res2.code === 0) {
|
|
|
- ElMessage.success('工艺资料删除成功');
|
|
|
- changed = true;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- if (changed) {
|
|
|
- const PrintListDatas = await PrintListData({ order: _Gd_gdbh.value });
|
|
|
- sizeDatas.splice(0, sizeDatas.length, ...PrintListDatas.data.型号);
|
|
|
- ystableData.splice(0, ystableData.length, ...PrintListDatas.data.列表);
|
|
|
- }
|
|
|
- } catch (err) {
|
|
|
- ElMessage.error(err);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- // 删除工艺资料
|
|
|
- const delgy_delclick = async () => {
|
|
|
- try {
|
|
|
- if (gySelection.value !== '') {
|
|
|
- const res = await DeleteProcess({ id: gySelection.value });
|
|
|
- if (res.code === 0) {
|
|
|
- ElMessage.success('工艺资料删除成功');
|
|
|
- // 刷新工艺资料表格
|
|
|
- const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
- if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
- gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
- } else {
|
|
|
- gytableData.splice(0, gytableData.length);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- } catch (err) {
|
|
|
- ElMessage.error(err);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
- const fj_Selection = ref('')//存储选中Uniqid
|
|
|
- const fjSelection = ref('')
|
|
|
- const fjdelall = ref(true)
|
|
|
- const fjSelectionChange = (selection, type) => {
|
|
|
- // console.log(selection)
|
|
|
- const ids = selection.map(item => {
|
|
|
- return item.UniqId
|
|
|
- })
|
|
|
- fj_Selection.value = ids.join(',')
|
|
|
- console.log("附件复选框",fj_Selection.value)
|
|
|
- }
|
|
|
-
|
|
|
- // //删除附件按钮
|
|
|
- const fj_delclick = async () => {
|
|
|
- let params = {};
|
|
|
- params.UniqId = fj_Selection._value;
|
|
|
- res1.code === 0 && ElMessage.success('删除成功')
|
|
|
- }
|
|
|
-
|
|
|
- //BOM表格复选框
|
|
|
- const del_bom = ref(true)//删除BOM资料
|
|
|
- const bom_Selection = ref('')//存储选中Uniqid
|
|
|
- const bomSelectionChange = (selection, type) => {
|
|
|
- const ids = selection.map(item => {
|
|
|
- return item.UNIQID
|
|
|
- })
|
|
|
- bom_Selection.value = ids.join(',')
|
|
|
- console.log("bom复选框",bom_Selection.value)
|
|
|
- }
|
|
|
-
|
|
|
- // 删除BOM资料按钮
|
|
|
- // const delbom_delclick = async () => {
|
|
|
- // try {
|
|
|
- // // 弹出确认框
|
|
|
- // await ElMessageBox.confirm('此操作将永久删除该文件, 是否继续?', '提示', {
|
|
|
- // confirmButtonText: '确定',
|
|
|
- // cancelButtonText: '取消',
|
|
|
- // type: 'warning',
|
|
|
- // });
|
|
|
- // // 用户点击“确定”后执行以下逻辑
|
|
|
- // const params = {
|
|
|
- // UNIQID: bom_Selection._value,
|
|
|
- // };
|
|
|
- // console.log('删除参数:', params);
|
|
|
- // // 调用删除接口
|
|
|
- // const res1 = await Bomdel(params);
|
|
|
- // if (res1.code === 0) {
|
|
|
- // ElMessage.success('删除成功');
|
|
|
- // } else {
|
|
|
- // ElMessage.error('删除失败');
|
|
|
- // return; // 如果删除失败,直接返回
|
|
|
- // }
|
|
|
- // // 重新获取BOM列表数据
|
|
|
- // const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
- // bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
|
|
|
- // } catch (error) {
|
|
|
- // // 用户点击“取消”或弹框关闭
|
|
|
- // console.log('用户取消删除操作');
|
|
|
- // }
|
|
|
- // };
|
|
|
-
|
|
|
- //合计
|
|
|
- const getSummaries = (param) => {
|
|
|
- const { columns, data } = param;
|
|
|
- const sums = {};
|
|
|
- //选择你希望合计的列
|
|
|
- const summableLabels = [...sizeDatas, "制单总数"];
|
|
|
- columns.forEach((column, index) => {
|
|
|
- if (index === 1) {
|
|
|
- sums[index] = '总数量合计';
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (summableLabels.includes(column.label)) {
|
|
|
- const values = data.map(item => Number(item[column.property]));
|
|
|
-
|
|
|
- // 检查数组中是否所有值都是 NaN
|
|
|
- if (!values.every(value => isNaN(value))) {
|
|
|
- sums[index] = values.reduce((prev, curr) => {
|
|
|
- const value = Number(curr);
|
|
|
- if (!isNaN(value)) {
|
|
|
- return prev + value;
|
|
|
- }
|
|
|
- return prev;
|
|
|
- }, 0);
|
|
|
- // 如果需要,可以在这里添加单位
|
|
|
- // sums[index] += ' 件';
|
|
|
- } else {
|
|
|
- sums[index] = 'N/A';
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- return sums;
|
|
|
- };
|
|
|
-
|
|
|
- //工艺资料合计
|
|
|
- const gySummaries = ({ columns, data }) => {
|
|
|
- // 只合计状态为0(正常)的行
|
|
|
- const normalData = data.filter(item => String(item.状态) === '0');
|
|
|
- const sums = [];
|
|
|
- columns.forEach((column, index) => {
|
|
|
- if (index === 1) {
|
|
|
- sums[index] = '合计';
|
|
|
- return;
|
|
|
- }
|
|
|
-
|
|
|
- if (column.label === '工分') {
|
|
|
- const values = normalData.map(item => Number(item[column.property]));
|
|
|
-
|
|
|
- if (!values.every(value => isNaN(value))) {
|
|
|
- const total = values.reduce((prev, curr) => {
|
|
|
- const value = Number(curr);
|
|
|
- if (!isNaN(value)) {
|
|
|
- return prev + value;
|
|
|
- }
|
|
|
- return prev;
|
|
|
- }, 0);
|
|
|
- sums[index] = total.toFixed(2);
|
|
|
- } else {
|
|
|
- sums[index] = 'N/A';
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- return sums;
|
|
|
- };
|
|
|
-
|
|
|
- //工艺详情弹窗合计
|
|
|
- const gyDetailSummaries = (param) => {
|
|
|
- const { columns, data } = param;
|
|
|
- const sums = [];
|
|
|
- let total = 0;
|
|
|
- let count = 0;
|
|
|
-
|
|
|
- data.forEach(item => {
|
|
|
- if (item && item['定额分'] !== undefined) {
|
|
|
- const val = Number(item['定额分']);
|
|
|
- if (!isNaN(val)) {
|
|
|
- total += val;
|
|
|
- count++;
|
|
|
- }
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- columns.forEach((column, index) => {
|
|
|
- if (column.prop === '工序名称') {
|
|
|
- sums[index] = '合计';
|
|
|
- } else if (column.label === '工分') {
|
|
|
- sums[index] = count > 0 ? total.toFixed(2) : '0.00';
|
|
|
- } else {
|
|
|
- sums[index] = '';
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- return sums;
|
|
|
- };
|
|
|
-
|
|
|
- // 面料合计
|
|
|
- // const mlgetSummaries = (param) => {
|
|
|
- // const { columns, data } = param;
|
|
|
- // const sums = {};
|
|
|
- // //选择你希望合计的列
|
|
|
- // const summableLabels = ["库存总量"];
|
|
|
- // columns.forEach((column, index) => {
|
|
|
- // if (index === 0) {
|
|
|
- // sums[index] = '总数量合计';
|
|
|
- // return;
|
|
|
- // }
|
|
|
- // if (summableLabels.includes(column.label)) {
|
|
|
- // const values = data.map(item => Number(item[column.property]));
|
|
|
- // if (!values.every(value => isNaN(value))) {
|
|
|
- // sums[index] = values.reduce((prev, curr) => {
|
|
|
- // const value = Number(curr);
|
|
|
- // if (!isNaN(value)) {
|
|
|
- // return prev + value;
|
|
|
- // }
|
|
|
- // return prev;
|
|
|
- // }, 0);
|
|
|
- // } else {
|
|
|
- // sums[index] = 'N/A';
|
|
|
- // }
|
|
|
- // }
|
|
|
- // });
|
|
|
- // return sums;
|
|
|
- // };
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- //=========查询========
|
|
|
- const searchInfo = ref('')
|
|
|
-
|
|
|
- //查询按钮
|
|
|
- const onSubmit = async () => {
|
|
|
- if(searchInfo.value === ''){
|
|
|
- ElMessage({type: 'warning',message: '请输入搜索的订单编号'})
|
|
|
- return false;
|
|
|
- }else{
|
|
|
- const WorkListdata = await WorkOrderList({search:searchInfo.value,page:page.value,limit:pageSize.value});
|
|
|
- tableData.value= WorkListdata.data.data
|
|
|
- ystableData.splice(0, ystableData.length);//颜色资料清空
|
|
|
- parttableData.splice(0, parttableData.length);//部件资料清空
|
|
|
- gytableData.splice(0, gytableData.length);//工艺资料情空
|
|
|
- ddtableData.splice(0, ddtableData.length);//订单资料附件清空
|
|
|
- jstableData.splice(0, jstableData.length);//技术附件清空
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
- // 调用查询数据接口
|
|
|
- const _cha_WorkList = async (node) => {
|
|
|
- if(searchInfo.value === ''){
|
|
|
- ElMessage({type: 'warning',message: '请输入搜索的信息'})
|
|
|
- return false;
|
|
|
- }
|
|
|
- const search = searchInfo.value;
|
|
|
- var regex = /^[a-zA-Z0-9]+$/;
|
|
|
- try {
|
|
|
- if (regex.test(search)) {
|
|
|
- // 符合条件,执行搜索操作
|
|
|
- console.log('搜索内容为纯数字加字母');
|
|
|
- // const WorkListdata = await WorkList({search:search,limit:100,page:1});//接口调用函数
|
|
|
- if(WorkListdata.data.total === 0){
|
|
|
- ElMessage({type: 'warning',message: '未搜索具体查询条件'})
|
|
|
- }
|
|
|
- tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
|
|
|
- total.value = WorkListdata.data.total;//共多少条
|
|
|
- } else {
|
|
|
- // 不符合条件,给出提示
|
|
|
- console.log('搜索内容包含非字母和数字的字符');
|
|
|
- // const WorkListdata = await WorkList({Gd_khdh:'',search:search,limit:100,page:1});//接口调用函数
|
|
|
- if(WorkListdata.data.total === 0){
|
|
|
- ElMessage({type: 'warning',message: '未搜索具体查询条件'})
|
|
|
- }
|
|
|
- tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
|
|
|
- total.value = WorkListdata.data.total;//共多少条
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error(error);
|
|
|
- }
|
|
|
- };
|
|
|
-
|
|
|
-
|
|
|
- //===============附件上传===============
|
|
|
- //附件上传按钮
|
|
|
- const jsfjClick = () => {
|
|
|
- if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
- ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
|
|
|
- }else{
|
|
|
- jsfjdialogFormVisible.value = true
|
|
|
- initJsfjformdata();
|
|
|
- jsfjformdata.value.关联编号 = _Gd_gdbh.value
|
|
|
- }
|
|
|
- }
|
|
|
- //技术附件弹窗
|
|
|
- const jsfjdialogFormVisible = ref(false)
|
|
|
- const jsfjformdata = ref({
|
|
|
- sys_id: _username.value,
|
|
|
- 附件备注: '',
|
|
|
- 附件内容: '',
|
|
|
- 附件类型: '',
|
|
|
- 关联编号: '',
|
|
|
- });
|
|
|
- //技术附件弹窗取消
|
|
|
- const initJsfjformdata = () => {
|
|
|
- jsfjformdata.value = {
|
|
|
- sys_id: _username.value,
|
|
|
- 附件备注: '',
|
|
|
- 附件内容: '',
|
|
|
- 附件类型: '',
|
|
|
- 关联编号: '',
|
|
|
- }
|
|
|
- }
|
|
|
- //技术附件弹窗取消
|
|
|
- const jsfjcloseDialog = () => {
|
|
|
- jsfjdialogFormVisible.value = false
|
|
|
- }
|
|
|
- const uploadExcel = (event) =>{
|
|
|
- const files = event.target.files;
|
|
|
- console.log(files)
|
|
|
- let suffixArr = name.split("."), suffix = suffixArr[suffixArr.length-1];
|
|
|
- jsfjformdata.value.附件内容 = files[0]
|
|
|
- jsfjformdata.value.附件类型 = files[0].name.split('.')[1]
|
|
|
- }
|
|
|
-
|
|
|
- //技术附件弹窗确定
|
|
|
- const jsfjenterDialog = () => {
|
|
|
- if(jsfjformdata.value.附件备注==''){
|
|
|
- ElMessage({type: 'error',message: '请选择附件备注'});
|
|
|
- return;
|
|
|
- }
|
|
|
- if(jsfjformdata.value.附件内容==''){
|
|
|
- ElMessage({type: 'error',message: '请上传文件'});
|
|
|
- return;
|
|
|
- }
|
|
|
- if(jsfjformdata.value.关联编号==''){
|
|
|
- ElMessage({type: 'error',message: '请关闭重新打开'});
|
|
|
- return;
|
|
|
- }
|
|
|
- let fr = new FileReader();
|
|
|
- fr.readAsDataURL(jsfjformdata.value.附件内容);
|
|
|
- fr.onload = function () {
|
|
|
- const restoredData = new FormData();
|
|
|
- restoredData.append('附件备注', jsfjformdata.value.附件备注);
|
|
|
- restoredData.append('附件内容', fr.result);
|
|
|
- restoredData.append('附件类型', jsfjformdata.value.附件类型);
|
|
|
- restoredData.append('关联编号', jsfjformdata.value.关联编号);
|
|
|
- restoredData.append('sys_id', jsfjformdata.value.sys_id);
|
|
|
-
|
|
|
- //将restoredDta数据新增到接口
|
|
|
- gdAnnexAdd(restoredData).then(response => {
|
|
|
- if(response.code==0){
|
|
|
- ElMessage({type: 'success',message: '新增成功',})
|
|
|
- jsfjdialogFormVisible.value = false
|
|
|
- let row = {
|
|
|
- '订单编号':_Gd_gdbh.value,
|
|
|
- // '产品代号':_Gd_cpdh.value,
|
|
|
- // '产品名称':_Gd_cpmc.value,
|
|
|
- }
|
|
|
- tableRowClick (row)
|
|
|
- }
|
|
|
- })
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 导入工艺资料弹窗相关方法
|
|
|
- const openImportProcessDialog = () => {
|
|
|
- importProcessForm.workorderNo = _Gd_gdbh.value
|
|
|
- importProcessForm.styleNo = _Gd_sckh.value
|
|
|
- importProcessFileList.length = 0
|
|
|
- importProcessFile = null
|
|
|
- importProcessDialogVisible.value = true
|
|
|
- console.log(importProcessDialogVisible.value)
|
|
|
- }
|
|
|
-
|
|
|
- const closeImportProcessDialog = () => {
|
|
|
- importProcessDialogVisible.value = false
|
|
|
- importProcessFileList.length = 0
|
|
|
- importProcessFile = null
|
|
|
- }
|
|
|
-
|
|
|
- const handleImportProcessFileChange = (file, fileList) => {
|
|
|
- if (fileList.length > 0) {
|
|
|
- const lastFile = fileList[fileList.length - 1]
|
|
|
- importProcessFile = lastFile.raw || lastFile
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- const handleImportProcessFileRemove = () => {
|
|
|
- importProcessFile = null
|
|
|
- }
|
|
|
-
|
|
|
- const beforeImportProcessUpload = (file) => {
|
|
|
- const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
|
|
|
- file.type === 'application/vnd.ms-excel'
|
|
|
- if (!isExcel) {
|
|
|
- ElMessage.error('请选择Excel文件')
|
|
|
- return false
|
|
|
- }
|
|
|
- return true
|
|
|
- }
|
|
|
-
|
|
|
- const submitImportProcess = async () => {
|
|
|
- console.log('submitImportProcess called')
|
|
|
- console.log('importProcessFile:', importProcessFile)
|
|
|
-
|
|
|
- if (!importProcessFile) {
|
|
|
- ElMessage.error('请选择Excel文件')
|
|
|
- return
|
|
|
- }
|
|
|
-
|
|
|
- const formData = new FormData()
|
|
|
- formData.append('workorder', _Gd_gdbh.value)
|
|
|
- formData.append('file', importProcessFile)
|
|
|
- formData.append('sys_id', userStore.userInfo.nickName)
|
|
|
-
|
|
|
- // 调试:检查 formData 内容
|
|
|
- console.log('workorder:', _Gd_gdbh.value)
|
|
|
- console.log('sys_id:', userStore.userInfo.nickName)
|
|
|
- console.log('formData entries:', [...formData.entries()])
|
|
|
-
|
|
|
- try {
|
|
|
- const baseURL = import.meta.env.VITE_BASE_API || ''
|
|
|
- const response = await axios.post(`${baseURL}/mes_server/work_order_process/importProcess`, formData, {
|
|
|
- headers: {
|
|
|
- 'x-token': userStore.token
|
|
|
- }
|
|
|
- })
|
|
|
- console.log('response:', response.data)
|
|
|
- if (response.data.code === 0) {
|
|
|
- ElMessage.success('导入成功')
|
|
|
- closeImportProcessDialog()
|
|
|
- // 刷新工艺资料表格数据
|
|
|
- const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
- if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
- gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
- } else {
|
|
|
- gytableData.splice(0, gytableData.length);
|
|
|
- }
|
|
|
- } else {
|
|
|
- ElMessage.error(response.data.msg || '导入失败')
|
|
|
- }
|
|
|
- } catch (error) {
|
|
|
- console.error('导入工艺资料失败:', error)
|
|
|
- ElMessage.error('导入失败,请稍后重试')
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- </script>
|
|
|
- <style scoped>
|
|
|
- /* 在样式表中使用媒体查询 */
|
|
|
- @media (max-width: 768px) {
|
|
|
- /* 在小屏幕下的样式设置 */
|
|
|
- .dialog-footer {
|
|
|
- text-align: center;
|
|
|
- }
|
|
|
- }
|
|
|
- /*背景颜色*/
|
|
|
- /*印件背景颜色变黄*/
|
|
|
- :deep(.el-table__body .warning-row) {
|
|
|
- background: #FFFF80 !important;
|
|
|
- }
|
|
|
- /*bom参数背景*/
|
|
|
- :deep(.el-table__body .background-plan-usage-low div div div) {
|
|
|
- background: #80FA80 !important;
|
|
|
- }
|
|
|
- /* 选中某行时的背景色 */
|
|
|
- :deep(.el-table__body tr.current-row) > td {
|
|
|
- background: #ff80ff !important;
|
|
|
- }
|
|
|
- :deep(.statusy-plan-usage-low div) {
|
|
|
- color: #8c939d !important;
|
|
|
- }
|
|
|
- /* 在样式表中添加以下样式 */
|
|
|
- .el-input__textarea {
|
|
|
- resize: none; /* 禁止调整大小 */
|
|
|
- }
|
|
|
- .JKWTree-container {
|
|
|
- display: flex;
|
|
|
- }
|
|
|
- .JKWTree-tree {
|
|
|
- /*width: 300px;*/
|
|
|
- background-color: #fff;
|
|
|
- padding: 10px;
|
|
|
- margin-right: 20px;
|
|
|
- }
|
|
|
- .JKWTree-tree h3 {
|
|
|
- font-size: 15px;
|
|
|
- font-weight: 700;
|
|
|
- margin: 10px 0;
|
|
|
- }
|
|
|
- .JKWTree-content {
|
|
|
- flex: 1;
|
|
|
- }
|
|
|
- /*关闭拖拽功能*/
|
|
|
- .el-textarea textarea {
|
|
|
- resize: none !important;
|
|
|
- }
|
|
|
-
|
|
|
- /* 新增/修改订单资料弹窗 - 16/8 栅格布局(与原版一致,小屏自动换行) */
|
|
|
- .add-order-dialog :deep(.el-dialog) {
|
|
|
- width: min(90%, 1200px) !important;
|
|
|
- max-height: 92vh;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- margin: 4vh auto !important;
|
|
|
- }
|
|
|
- .add-order-dialog :deep(.el-dialog__body) {
|
|
|
- flex: 1;
|
|
|
- min-height: 0;
|
|
|
- overflow-x: hidden;
|
|
|
- overflow-y: auto;
|
|
|
- padding: 12px 20px 8px;
|
|
|
- }
|
|
|
- .add-order-dialog-body {
|
|
|
- min-width: 0;
|
|
|
- }
|
|
|
- .add-order-dialog-main,
|
|
|
- .add-order-dialog-side {
|
|
|
- min-width: 0;
|
|
|
- }
|
|
|
- .add-order-upload-wrap {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: center;
|
|
|
- margin-bottom: 16px;
|
|
|
- }
|
|
|
- .add-order-dialog-side :deep(.el-upload-list--picture-card) {
|
|
|
- margin-left: 0;
|
|
|
- }
|
|
|
- .add-order-upload-title {
|
|
|
- font-size: 16px;
|
|
|
- margin-top: 8px;
|
|
|
- text-align: center;
|
|
|
- color: var(--el-text-color-regular);
|
|
|
- }
|
|
|
- /* 去掉「按 Delete 键可删除」及角标关闭,仅保留 picture-card 悬停放大/垃圾桶 */
|
|
|
- .add-order-upload :deep(.el-icon--close-tip),
|
|
|
- .add-order-upload :deep(.el-upload-list__item .el-icon--close),
|
|
|
- .add-order-upload :deep(.el-upload-list__item-status-label) {
|
|
|
- display: none !important;
|
|
|
- }
|
|
|
- .add-order-bottom-row {
|
|
|
- margin-top: 4px;
|
|
|
- }
|
|
|
- .add-order-dialog-main :deep(.el-input),
|
|
|
- .add-order-dialog-main :deep(.el-select),
|
|
|
- .add-order-dialog-main :deep(.el-date-editor),
|
|
|
- .add-order-dialog-side :deep(.el-input),
|
|
|
- .add-order-dialog-side :deep(.el-date-editor) {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
- .add-order-dialog-main :deep(.el-form-item__content),
|
|
|
- .add-order-dialog-side :deep(.el-form-item__content) {
|
|
|
- min-width: 0;
|
|
|
- }
|
|
|
- @media (max-width: 768px) {
|
|
|
- .add-order-dialog-side {
|
|
|
- margin-top: 12px;
|
|
|
- padding-top: 12px;
|
|
|
- border-top: 1px solid var(--el-border-color-lighter);
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* 新增部件弹窗样式 */
|
|
|
- .part-add-dialog {
|
|
|
- max-height: 95vh;
|
|
|
- height: 95vh;
|
|
|
- }
|
|
|
-
|
|
|
- .part-add-dialog .el-dialog__body {
|
|
|
- max-height: 85vh;
|
|
|
- height: 85vh;
|
|
|
- overflow-y: auto;
|
|
|
- padding: 20px;
|
|
|
- }
|
|
|
-
|
|
|
- .part-add-dialog .list-part-hint {
|
|
|
- margin-bottom: 20px;
|
|
|
- font-size: 14px;
|
|
|
- }
|
|
|
-
|
|
|
- .part-add-dialog .el-table {
|
|
|
- margin-bottom: 20px;
|
|
|
- }
|
|
|
-
|
|
|
- .part-add-dialog .el-table th {
|
|
|
- background-color: #f5f7fa;
|
|
|
- font-weight: bold;
|
|
|
- }
|
|
|
-
|
|
|
- .part-add-dialog .el-table td {
|
|
|
- padding: 12px;
|
|
|
- }
|
|
|
-
|
|
|
- .part-add-dialog .dialog-footer {
|
|
|
- margin-top: 20px;
|
|
|
- padding-top: 15px;
|
|
|
- border-top: 1px solid #ebeef5;
|
|
|
- }
|
|
|
- </style>
|
|
|
- <style scoped>
|
|
|
- :deep(.el-table td .cell) {
|
|
|
- line-height: 20px !important;
|
|
|
- }
|
|
|
- :deep(.el-tabs__header){
|
|
|
- margin-bottom: 0;
|
|
|
- }
|
|
|
- .search{
|
|
|
- margin-left: 0px !important;
|
|
|
- margin-right: 10px !important;
|
|
|
- }
|
|
|
- .bt{
|
|
|
- margin-left: 2px !important;
|
|
|
- padding: 3px !important;
|
|
|
- font-size: 12px;
|
|
|
- }
|
|
|
- .el-tabs__header{
|
|
|
- margin: 0px !important;
|
|
|
- }
|
|
|
- .gva-table-box{
|
|
|
- padding: 0px !important;
|
|
|
- }
|
|
|
- .el-pagination{
|
|
|
- margin-top: 0px !important;
|
|
|
- }
|
|
|
- /* .upload-demo .el-upload {
|
|
|
- border: 1px dashed #d9d9d9;
|
|
|
- border-radius: 6px;
|
|
|
- cursor: pointer;
|
|
|
- position: relative;
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .upload-demo .el-upload:hover {
|
|
|
- border-color: #409EFF;
|
|
|
- } */
|
|
|
-
|
|
|
- .mab{
|
|
|
- margin-bottom: 5px;
|
|
|
- }
|
|
|
- .fj-col-header {
|
|
|
- display: inline-flex;
|
|
|
- align-items: center;
|
|
|
- gap: 2px;
|
|
|
- cursor: help;
|
|
|
- }
|
|
|
- .fj-col-help {
|
|
|
- font-size: 14px;
|
|
|
- color: #909399;
|
|
|
- }
|
|
|
- /* 上下表头统一浅色 */
|
|
|
- :deep(.el-table) {
|
|
|
- --el-table-header-bg-color: #fafafa;
|
|
|
- }
|
|
|
- :deep(.el-table__header th.el-table__cell) {
|
|
|
- background-color: #fafafa !important;
|
|
|
- }
|
|
|
- ::v-deep(.input_style .el-input__inner) {
|
|
|
- font-size: 18px;
|
|
|
- }
|
|
|
- ::v-deep(.el-form-item__label) {
|
|
|
- font-size: 18px;
|
|
|
- }
|
|
|
-
|
|
|
- ::v-deep(.el-upload-list--picture-card) {
|
|
|
- margin-left: 0;
|
|
|
- }
|
|
|
- ::v-deep(.add-order-upload .el-upload__input),
|
|
|
- ::v-deep(.import-process-upload .el-upload__input) {
|
|
|
- display: none !important;
|
|
|
- }
|
|
|
- ::v-deep(.el-checkbox__inner) {
|
|
|
- width: 20px;
|
|
|
- height: 20px;
|
|
|
- }
|
|
|
- ::v-deep(.el-checkbox__input.is-checked .el-checkbox__inner::after) {
|
|
|
- top: 30%;
|
|
|
- left: 30%;
|
|
|
- }
|
|
|
- ::v-deep(.el-descriptions__table tbody tr .is-bordered-label){
|
|
|
- width: 40px;
|
|
|
- }
|
|
|
- ::v-deep(.el-descriptions__table tbody tr .el-descriptions__content){
|
|
|
- width: 120px;
|
|
|
- }
|
|
|
- :deep(.el-descriptions__content) {
|
|
|
- width: 80px !important;
|
|
|
- min-width: 80px !important;
|
|
|
- max-width: 100px !important;
|
|
|
- overflow: hidden !important;
|
|
|
- text-overflow: ellipsis !important;
|
|
|
- }
|
|
|
-
|
|
|
- .big-error-message {
|
|
|
- padding: 20px 30px !important; /* 整体弹窗变大 */
|
|
|
- font-size: 20px !important; /* 文字更大 */
|
|
|
- animation: scaleFadeIn 0.3s ease-out; /* 放大淡入动画 */
|
|
|
- }
|
|
|
-
|
|
|
- .big-error-message .el-message__icon {
|
|
|
- font-size: 26px !important; /* 图标变大 */
|
|
|
- }
|
|
|
-
|
|
|
- @keyframes scaleFadeIn {
|
|
|
- 0% {
|
|
|
- transform: scale(0.8);
|
|
|
- opacity: 0;
|
|
|
- }
|
|
|
- 100% {
|
|
|
- transform: scale(1);
|
|
|
- opacity: 1;
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- /* 排序弹窗样式 */
|
|
|
- .list-unified-dialog :deep(.el-dialog) {
|
|
|
- max-height: 90vh;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- margin-top: 5vh !important;
|
|
|
- margin-bottom: 5vh;
|
|
|
- }
|
|
|
- .list-unified-dialog :deep(.el-dialog__header) {
|
|
|
- flex-shrink: 0;
|
|
|
- padding-bottom: 12px;
|
|
|
- }
|
|
|
- .list-unified-dialog :deep(.el-dialog__body) {
|
|
|
- flex: 1;
|
|
|
- min-height: 320px;
|
|
|
- max-height: min(720px, calc(90vh - 130px));
|
|
|
- overflow-y: auto;
|
|
|
- box-sizing: border-box;
|
|
|
- }
|
|
|
- .list-unified-dialog :deep(.el-dialog__footer) {
|
|
|
- flex-shrink: 0;
|
|
|
- }
|
|
|
- .list-process-add-dialog.list-unified-dialog :deep(.el-dialog) {
|
|
|
- width: min(1280px, 96vw) !important;
|
|
|
- min-width: min(1280px, 96vw) !important;
|
|
|
- max-width: min(1280px, 96vw) !important;
|
|
|
- height: min(620px, 78vh) !important;
|
|
|
- min-height: min(620px, 78vh) !important;
|
|
|
- max-height: min(620px, 78vh) !important;
|
|
|
- box-sizing: border-box !important;
|
|
|
- }
|
|
|
- .list-process-add-dialog.list-unified-dialog :deep(.el-dialog__body) {
|
|
|
- max-height: none !important;
|
|
|
- min-height: 0 !important;
|
|
|
- flex: 1 1 auto !important;
|
|
|
- display: flex !important;
|
|
|
- flex-direction: column !important;
|
|
|
- overflow: hidden !important;
|
|
|
- }
|
|
|
- .list-process-add-dialog.list-unified-dialog .list-process-add-by-part {
|
|
|
- flex: 1 1 auto;
|
|
|
- min-height: 0;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .list-process-add-dialog.list-unified-dialog .list-dialog-context-header {
|
|
|
- flex-shrink: 0;
|
|
|
- }
|
|
|
- .list-dialog-context-header {
|
|
|
- margin-bottom: 14px;
|
|
|
- }
|
|
|
- .list-dialog-kv-table {
|
|
|
- width: 100%;
|
|
|
- border-collapse: collapse;
|
|
|
- font-size: 13px;
|
|
|
- table-layout: fixed;
|
|
|
- }
|
|
|
- .list-dialog-kv-table th,
|
|
|
- .list-dialog-kv-table td {
|
|
|
- border: 1px solid var(--el-border-color);
|
|
|
- padding: 8px 12px;
|
|
|
- text-align: left;
|
|
|
- vertical-align: middle;
|
|
|
- line-height: 1.45;
|
|
|
- }
|
|
|
- .list-dialog-kv-table th {
|
|
|
- width: 92px;
|
|
|
- background: #f5f7fa;
|
|
|
- font-weight: 500;
|
|
|
- color: var(--el-text-color-regular);
|
|
|
- white-space: nowrap;
|
|
|
- }
|
|
|
- .list-dialog-kv-table td {
|
|
|
- background: #fff;
|
|
|
- color: var(--el-text-color-primary);
|
|
|
- word-break: break-word;
|
|
|
- }
|
|
|
- .list-process-add-split {
|
|
|
- display: flex;
|
|
|
- gap: 14px;
|
|
|
- align-items: stretch;
|
|
|
- flex: 1 1 auto;
|
|
|
- min-height: 0;
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .list-process-add-sidebar {
|
|
|
- flex: 0 0 240px;
|
|
|
- max-width: 42%;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- min-height: 0;
|
|
|
- border: 1px solid var(--el-border-color-lighter);
|
|
|
- border-radius: 8px;
|
|
|
- background: var(--el-fill-color-blank);
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .list-process-add-sidebar-title {
|
|
|
- padding: 10px 12px;
|
|
|
- font-size: 13px;
|
|
|
- font-weight: 600;
|
|
|
- color: var(--el-text-color-regular);
|
|
|
- border-bottom: 1px solid var(--el-border-color-lighter);
|
|
|
- background: #f5f7fa;
|
|
|
- }
|
|
|
- .list-process-add-part-list {
|
|
|
- flex: 1;
|
|
|
- min-height: 0;
|
|
|
- overflow-y: auto;
|
|
|
- padding: 8px;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- gap: 6px;
|
|
|
- }
|
|
|
- .list-process-add-stage-list {
|
|
|
- gap: 2px;
|
|
|
- }
|
|
|
- .list-process-add-stage-item {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- padding: 9px 10px;
|
|
|
- border-radius: 6px;
|
|
|
- border: 1px solid var(--el-border-color-lighter);
|
|
|
- background: var(--el-bg-color);
|
|
|
- cursor: pointer;
|
|
|
- font-size: 13px;
|
|
|
- font-weight: 600;
|
|
|
- color: var(--el-text-color-primary);
|
|
|
- user-select: none;
|
|
|
- -webkit-user-select: none;
|
|
|
- transition: border-color 0.15s, background 0.15s;
|
|
|
- }
|
|
|
- .list-process-add-stage-item:hover {
|
|
|
- border-color: var(--el-color-primary-light-5);
|
|
|
- }
|
|
|
- .list-process-add-stage-item.is-active {
|
|
|
- border-color: var(--el-color-primary);
|
|
|
- background: var(--el-color-primary-light-9);
|
|
|
- color: var(--el-color-primary);
|
|
|
- }
|
|
|
- .list-process-add-sewing-nest {
|
|
|
- margin: 0 0 8px 0;
|
|
|
- padding: 0 0 0 10px;
|
|
|
- border-left: 2px solid var(--el-border-color-lighter);
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- gap: 5px;
|
|
|
- }
|
|
|
- .list-process-add-part-item--nest {
|
|
|
- padding: 6px 8px;
|
|
|
- font-size: 12px;
|
|
|
- }
|
|
|
- .list-process-add-part-item {
|
|
|
- display: flex;
|
|
|
- align-items: flex-start;
|
|
|
- gap: 8px;
|
|
|
- padding: 8px 10px;
|
|
|
- border-radius: 6px;
|
|
|
- border: 1px solid var(--el-border-color-lighter);
|
|
|
- background: var(--el-bg-color);
|
|
|
- cursor: pointer;
|
|
|
- user-select: none;
|
|
|
- -webkit-user-select: none;
|
|
|
- transition: border-color 0.15s, background 0.15s;
|
|
|
- }
|
|
|
- .list-process-add-part-item:hover {
|
|
|
- border-color: var(--el-color-primary-light-5);
|
|
|
- }
|
|
|
- .list-process-add-part-item.is-active {
|
|
|
- border-color: var(--el-color-primary);
|
|
|
- background: var(--el-color-primary-light-9);
|
|
|
- }
|
|
|
- .list-process-add-part-item-text {
|
|
|
- flex: 1;
|
|
|
- min-width: 0;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- gap: 2px;
|
|
|
- }
|
|
|
- .list-process-add-part-sort {
|
|
|
- font-size: 12px;
|
|
|
- color: var(--el-text-color-secondary);
|
|
|
- }
|
|
|
- .list-process-add-part-name {
|
|
|
- font-size: 13px;
|
|
|
- font-weight: 600;
|
|
|
- color: var(--el-text-color-primary);
|
|
|
- overflow: hidden;
|
|
|
- text-overflow: ellipsis;
|
|
|
- white-space: nowrap;
|
|
|
- }
|
|
|
- .list-process-add-main-panel {
|
|
|
- flex: 1;
|
|
|
- min-width: 0;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- min-height: 0;
|
|
|
- border: 1px solid var(--el-border-color-lighter);
|
|
|
- border-radius: 8px;
|
|
|
- padding: 10px 12px;
|
|
|
- background: var(--el-bg-color);
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .list-process-add-main-head {
|
|
|
- margin-bottom: 10px;
|
|
|
- font-size: 13px;
|
|
|
- color: var(--el-text-color-regular);
|
|
|
- }
|
|
|
- .list-process-add-main-head-sub {
|
|
|
- margin-left: 6px;
|
|
|
- color: var(--el-text-color-secondary);
|
|
|
- font-weight: normal;
|
|
|
- }
|
|
|
- .list-process-add-main-empty {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- min-height: 200px;
|
|
|
- }
|
|
|
- .sort-part-gy-part-item.is-active {
|
|
|
- border-color: var(--el-color-primary);
|
|
|
- background: var(--el-color-primary-light-9);
|
|
|
- }
|
|
|
- .sort-part-gy-body {
|
|
|
- flex: 1;
|
|
|
- min-height: 0;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .sort-part-gy-hint {
|
|
|
- margin-bottom: 12px;
|
|
|
- font-size: 13px;
|
|
|
- line-height: 1.55;
|
|
|
- color: var(--el-text-color-regular);
|
|
|
- }
|
|
|
- .sort-part-gy-hint-list {
|
|
|
- margin: 0;
|
|
|
- padding-left: 20px;
|
|
|
- }
|
|
|
- .sort-part-gy-hint-list li {
|
|
|
- margin-bottom: 6px;
|
|
|
- }
|
|
|
- .sort-part-gy-split {
|
|
|
- flex: 1;
|
|
|
- min-height: 0;
|
|
|
- display: flex;
|
|
|
- gap: 14px;
|
|
|
- align-items: stretch;
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .sort-gy-left-nav {
|
|
|
- flex: 0 0 240px;
|
|
|
- max-width: 42%;
|
|
|
- }
|
|
|
- .list-sort-gy-nav-list {
|
|
|
- gap: 2px;
|
|
|
- }
|
|
|
- .list-sort-gy-sewing-parts {
|
|
|
- margin: 0 0 8px 0;
|
|
|
- padding: 0 0 0 10px;
|
|
|
- border-left: 2px solid var(--el-border-color-lighter);
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- gap: 5px;
|
|
|
- }
|
|
|
- .sort-part-gy-part-item {
|
|
|
- display: flex;
|
|
|
- align-items: flex-start;
|
|
|
- gap: 8px;
|
|
|
- padding: 8px 10px;
|
|
|
- border-radius: 6px;
|
|
|
- border: 1px solid var(--el-border-color-lighter);
|
|
|
- background: var(--el-bg-color);
|
|
|
- cursor: pointer;
|
|
|
- user-select: none;
|
|
|
- -webkit-user-select: none;
|
|
|
- transition: border-color 0.15s, background 0.15s;
|
|
|
- }
|
|
|
- .sort-part-gy-part-item:hover {
|
|
|
- border-color: var(--el-color-primary-light-5);
|
|
|
- }
|
|
|
- .sort-part-gy-part-item.is-active {
|
|
|
- border-color: var(--el-color-primary);
|
|
|
- background: var(--el-color-primary-light-9);
|
|
|
- }
|
|
|
- .sort-part-gy-part-item-grip {
|
|
|
- color: var(--el-text-color-secondary);
|
|
|
- margin-top: 2px;
|
|
|
- }
|
|
|
- .sort-part-gy-main-panel {
|
|
|
- flex: 1;
|
|
|
- min-width: 0;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- min-height: 0;
|
|
|
- border: 1px solid var(--el-border-color-lighter);
|
|
|
- border-radius: 8px;
|
|
|
- padding: 10px 12px;
|
|
|
- background: var(--el-bg-color);
|
|
|
- overflow: hidden;
|
|
|
- }
|
|
|
- .sort-part-gy-main-head {
|
|
|
- margin-bottom: 10px;
|
|
|
- font-size: 13px;
|
|
|
- color: var(--el-text-color-regular);
|
|
|
- }
|
|
|
- .sort-part-gy-main-head--warn {
|
|
|
- color: var(--el-color-warning);
|
|
|
- }
|
|
|
- .sort-part-gy-main-empty {
|
|
|
- flex: 1;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- min-height: 200px;
|
|
|
- }
|
|
|
- .sort-gy-table {
|
|
|
- flex: 1;
|
|
|
- min-height: 0;
|
|
|
- }
|
|
|
- .sort-drag-col-hint {
|
|
|
- font-size: 12px;
|
|
|
- color: var(--el-text-color-secondary);
|
|
|
- }
|
|
|
- .sort-drag-handle {
|
|
|
- color: var(--el-text-color-secondary);
|
|
|
- cursor: move;
|
|
|
- }
|
|
|
- .list-lib-name-select {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
- .sort-gy-num-input {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
- :deep(.gy-detail-dialog.el-dialog) {
|
|
|
- max-width: 100vw;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-dialog .el-dialog__header) {
|
|
|
- padding: 12px 20px 8px;
|
|
|
- margin-right: 0;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-dialog .el-dialog__body) {
|
|
|
- padding: 0;
|
|
|
- overflow: hidden;
|
|
|
- max-width: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-header {
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- align-items: stretch;
|
|
|
- gap: 12px;
|
|
|
- width: 100%;
|
|
|
- box-sizing: border-box;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-title-row {
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-title {
|
|
|
- font-size: 16px;
|
|
|
- font-weight: 600;
|
|
|
- color: var(--el-text-color-primary);
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-toolbar-row {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- flex-wrap: nowrap;
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-actions-left {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- flex-wrap: nowrap;
|
|
|
- gap: 10px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-exit {
|
|
|
- flex-shrink: 0;
|
|
|
- margin-left: auto;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-body {
|
|
|
- width: 100%;
|
|
|
- max-width: 100%;
|
|
|
- height: calc(100vh - 80px);
|
|
|
- padding: 20px;
|
|
|
- overflow: auto;
|
|
|
- box-sizing: border-box;
|
|
|
- display: flex;
|
|
|
- flex-direction: column;
|
|
|
- min-width: 0;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-dialog-body > .gy-detail-table-wrap {
|
|
|
- flex: 1;
|
|
|
- min-height: 0;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-table-wrap {
|
|
|
- width: 100%;
|
|
|
- max-width: 100%;
|
|
|
- min-width: 0;
|
|
|
- height: calc(100vh - 250px);
|
|
|
- overflow: auto;
|
|
|
- border: 1px solid #ebeef5;
|
|
|
- border-radius: 4px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-vxe-table {
|
|
|
- width: 100%;
|
|
|
- flex: 1;
|
|
|
- min-height: 0;
|
|
|
- --vxe-table-row-current-background-color: #ff80ff;
|
|
|
- --vxe-table-row-hover-current-background-color: #ff80ff;
|
|
|
- --vxe-ui-table-row-current-background-color: #ff80ff;
|
|
|
- --vxe-table-row-height: 28px;
|
|
|
- --vxe-table-cell-padding-left: 4px;
|
|
|
- --vxe-table-cell-padding-right: 4px;
|
|
|
- font-size: 13px;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--row),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--row),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--row) {
|
|
|
- height: 28px !important;
|
|
|
- line-height: 28px !important;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .vxe-header--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-footer--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--cell) {
|
|
|
- font-size: 13px;
|
|
|
- height: 28px !important;
|
|
|
- line-height: 28px !important;
|
|
|
- padding: 0 4px !important;
|
|
|
- vertical-align: middle !important;
|
|
|
- }
|
|
|
-
|
|
|
- /* 单元格内容垂直居中,编辑框贴齐格子 */
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--column .vxe-cell) {
|
|
|
- display: flex !important;
|
|
|
- align-items: center !important;
|
|
|
- height: 100% !important;
|
|
|
- min-height: 28px !important;
|
|
|
- max-height: 28px !important;
|
|
|
- overflow: hidden !important;
|
|
|
- box-sizing: border-box !important;
|
|
|
- }
|
|
|
-
|
|
|
- /* align=center / 固定操作列:水平居中 */
|
|
|
- :deep(.gy-detail-vxe-table .col--center .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-header--column.col--center .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--column.col--center .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-footer--column.col--center .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .col--fixed-right .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-header--column.col--fixed-right .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--column.col--fixed-right .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-footer--column.col--fixed-right .vxe-cell) {
|
|
|
- justify-content: center !important;
|
|
|
- text-align: center !important;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-status-cell,
|
|
|
- .gy-detail-action-cell {
|
|
|
- width: 100%;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell),
|
|
|
- :deep(.gy-detail-vxe-table .col--checkbox) {
|
|
|
- text-align: center !important;
|
|
|
- justify-content: center !important;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--checkbox),
|
|
|
- :deep(.gy-detail-vxe-table .col--checkbox .vxe-checkbox--icon),
|
|
|
- :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--title) {
|
|
|
- margin-left: auto !important;
|
|
|
- margin-right: auto !important;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-table-wrap ::-webkit-scrollbar,
|
|
|
- .gy-detail-vxe-table ::-webkit-scrollbar,
|
|
|
- .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar,
|
|
|
- .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar {
|
|
|
- display: block !important;
|
|
|
- width: 14px;
|
|
|
- height: 14px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-table-wrap ::-webkit-scrollbar-track,
|
|
|
- .gy-detail-vxe-table ::-webkit-scrollbar-track,
|
|
|
- .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-track,
|
|
|
- .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-track {
|
|
|
- background: #f1f1f1;
|
|
|
- border-radius: 7px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-table-wrap ::-webkit-scrollbar-thumb,
|
|
|
- .gy-detail-vxe-table ::-webkit-scrollbar-thumb,
|
|
|
- .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb,
|
|
|
- .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb {
|
|
|
- background: #ccc;
|
|
|
- border-radius: 7px;
|
|
|
- border: 3px solid #f1f1f1;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-table-wrap ::-webkit-scrollbar-thumb:hover,
|
|
|
- .gy-detail-vxe-table ::-webkit-scrollbar-thumb:hover,
|
|
|
- .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb:hover,
|
|
|
- .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb:hover {
|
|
|
- background: #999;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper) {
|
|
|
- z-index: 4;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .col--fixed-right) {
|
|
|
- background-color: #fff;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-right),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-left) {
|
|
|
- background-color: #f5f7fa;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-cell {
|
|
|
- min-height: 24px;
|
|
|
- height: 24px;
|
|
|
- line-height: 24px;
|
|
|
- padding: 0 4px;
|
|
|
- cursor: text;
|
|
|
- border-radius: 2px;
|
|
|
- overflow: hidden;
|
|
|
- text-overflow: ellipsis;
|
|
|
- white-space: nowrap;
|
|
|
- text-align: center;
|
|
|
- color: var(--el-text-color-primary);
|
|
|
- box-sizing: border-box;
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-cell--wide {
|
|
|
- white-space: nowrap;
|
|
|
- line-height: 24px;
|
|
|
- min-height: 24px;
|
|
|
- height: 24px;
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: flex-start;
|
|
|
- text-align: left;
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-cell:hover {
|
|
|
- background: #f5f7fa;
|
|
|
- box-shadow: inset 0 0 0 1px #dcdfe6;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-split-process-name {
|
|
|
- color: #f56c6c;
|
|
|
- font-weight: 600;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-cell-input {
|
|
|
- width: 100%;
|
|
|
- flex: 1;
|
|
|
- min-width: 0;
|
|
|
- position: relative;
|
|
|
- z-index: 2;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-cell-select {
|
|
|
- display: block;
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-vxe-table .gy-detail-cell-select .el-select__wrapper {
|
|
|
- min-height: 24px !important;
|
|
|
- height: 24px !important;
|
|
|
- padding: 0 6px;
|
|
|
- box-shadow: 0 0 0 1px var(--el-color-primary) inset;
|
|
|
- box-sizing: border-box;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-vxe-table .gy-detail-cell-input .el-input__wrapper {
|
|
|
- min-height: 24px !important;
|
|
|
- height: 24px !important;
|
|
|
- padding: 0 6px;
|
|
|
- box-shadow: 0 0 0 1px var(--el-color-primary) inset;
|
|
|
- box-sizing: border-box;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-vxe-table .gy-detail-cell-input .el-input__inner {
|
|
|
- height: 22px !important;
|
|
|
- line-height: 22px !important;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .el-button--small) {
|
|
|
- --el-button-size: 20px;
|
|
|
- height: 20px;
|
|
|
- padding: 0 6px;
|
|
|
- font-size: 12px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-vxe-table .vxe-body--row.row--current .gy-detail-cell:hover {
|
|
|
- background: rgba(255, 255, 255, 0.35);
|
|
|
- }
|
|
|
-
|
|
|
- /* 仅点击当前行显示 #ff80ff,勾选复选框不高亮行背景 */
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.row--current),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.is--current) {
|
|
|
- background-color: #ff80ff !important;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.row--current > .vxe-body--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.row--current.row--hover > .vxe-body--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.is--current > .vxe-body--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper .vxe-body--row.row--current > .vxe-body--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper .vxe-body--row.row--current > .vxe-body--column) {
|
|
|
- background-color: #ff80ff !important;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.row--checked:not(.row--current) > .vxe-body--column),
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.is--checked:not(.is--current) > .vxe-body--column) {
|
|
|
- background-color: #fff !important;
|
|
|
- }
|
|
|
-
|
|
|
- :deep(.gy-detail-vxe-table .vxe-body--row.row--current .el-input__wrapper) {
|
|
|
- background-color: transparent !important;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-col-header {
|
|
|
- display: inline-flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- gap: 4px;
|
|
|
- width: 100%;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-btn {
|
|
|
- display: inline-flex;
|
|
|
- align-items: center;
|
|
|
- justify-content: center;
|
|
|
- width: 22px;
|
|
|
- height: 22px;
|
|
|
- cursor: pointer;
|
|
|
- color: #909399;
|
|
|
- border-radius: 2px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-btn:hover,
|
|
|
- .gy-detail-filter-btn.is-active {
|
|
|
- color: var(--el-color-primary);
|
|
|
- background: #ecf5ff;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-options {
|
|
|
- max-height: 220px;
|
|
|
- overflow-x: hidden;
|
|
|
- overflow-y: auto;
|
|
|
- margin-bottom: 4px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-panel .el-checkbox {
|
|
|
- display: flex;
|
|
|
- margin-right: 0;
|
|
|
- margin-bottom: 6px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-actions {
|
|
|
- display: flex;
|
|
|
- justify-content: space-between;
|
|
|
- align-items: center;
|
|
|
- margin-top: 4px;
|
|
|
- padding-top: 8px;
|
|
|
- border-top: 1px solid #ebeef5;
|
|
|
- background: #fff;
|
|
|
- position: relative;
|
|
|
- z-index: 2;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-link {
|
|
|
- color: var(--el-color-primary);
|
|
|
- font-size: 12px;
|
|
|
- line-height: 1;
|
|
|
- cursor: pointer;
|
|
|
- user-select: none;
|
|
|
- padding: 4px 2px;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-link:hover {
|
|
|
- opacity: 0.85;
|
|
|
- }
|
|
|
-
|
|
|
-</style>
|
|
|
-
|
|
|
-<style>
|
|
|
- .process-production-dialog .el-dialog__header {
|
|
|
- display: block;
|
|
|
- width: 100%;
|
|
|
- margin-right: 0;
|
|
|
- padding: 16px 20px 12px;
|
|
|
- box-sizing: border-box;
|
|
|
- }
|
|
|
-
|
|
|
- .process-production-dialog .el-dialog__body {
|
|
|
- padding: 0;
|
|
|
- background: #fff;
|
|
|
- }
|
|
|
-
|
|
|
- .process-production-dialog-header {
|
|
|
- display: flex;
|
|
|
- align-items: center;
|
|
|
- width: 100%;
|
|
|
- box-sizing: border-box;
|
|
|
- }
|
|
|
-
|
|
|
- .process-production-dialog-title {
|
|
|
- flex: 1;
|
|
|
- font-size: 16px;
|
|
|
- font-weight: 600;
|
|
|
- color: #303133;
|
|
|
- }
|
|
|
-
|
|
|
- .process-production-dialog-close {
|
|
|
- flex-shrink: 0;
|
|
|
- margin-left: auto;
|
|
|
- min-width: 56px;
|
|
|
- font-weight: 500;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-popper {
|
|
|
- z-index: 10050 !important;
|
|
|
- pointer-events: auto;
|
|
|
- padding: 8px 10px !important;
|
|
|
- }
|
|
|
-
|
|
|
- .gy-detail-filter-popper .gy-detail-filter-panel {
|
|
|
- pointer-events: auto;
|
|
|
- }
|
|
|
-
|
|
|
- .el-message-box .gy-split-process-name {
|
|
|
- color: #f56c6c;
|
|
|
- font-weight: 600;
|
|
|
- }
|
|
|
-</style>
|
|
|
+<template>
|
|
|
+ <div>
|
|
|
+ <layout>
|
|
|
+ <layout-header>
|
|
|
+ <div class="">
|
|
|
+ <!--按钮部分-->
|
|
|
+ <el-form ref="elSearchFormRef" class="demo-form-inline" @submit.prevent="onSubmit">
|
|
|
+ <el-form-item>
|
|
|
+ <el-input v-model="searchInfo" placeholder="查询订单编号、生产款号" style="width: 180px;" @keydown.enter.prevent="onSubmit" />
|
|
|
+ <el-button type="primary" native-type="button" icon="search" @click="onSubmit" title="查询">查询</el-button>
|
|
|
+ <el-button type="primary" icon="edit" @click="cp_gdprintonClick" class="bt" title="打印生产订单" >订单打印</el-button>
|
|
|
+ <el-button type="primary" class="bt" icon="edit" @click="jsfjClick">附件上传</el-button>
|
|
|
+ <el-button type="primary" icon="edit" @click="addgd_onclick" class="bt" title="新增工单资料">新增订单资料</el-button>
|
|
|
+ <el-button type="primary" icon="edit" @click="addgdyj_onclick" class="bt" title="新增颜色资料">新增颜色资料</el-button>
|
|
|
+ <!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openPartAdd">新增部件资料</el-button> -->
|
|
|
+ <!-- <el-button type="primary" icon="Plus" class="bt" :disabled="!_Gd_gdbh" @click="openProcessAdd">新增工艺资料</el-button> -->
|
|
|
+ <!-- <el-button type="primary" icon="Sort" class="bt" :disabled="!_Gd_gdbh" @click="openSortDialog">部件与工艺排序</el-button> -->
|
|
|
+ <el-button type="primary" icon="edit" @click="BOMclick" class="bt" title="BOM面料">批量修改新增BOM资料</el-button>
|
|
|
+ <el-button type="danger" icon="edit" @click="del_ddzlClick" v-if="table_del=== true" :disabled="table_Selection === ''" class="bt" title="选中复选框进行删除订单数据">删除订单资料</el-button>
|
|
|
+ <el-button type="danger" icon="edit" @click="delgd_delclick" v-if="delall=== true" :disabled="ysSelection === ''" class="bt" title="选中复选框进行删除颜色数据">删除颜色资料</el-button>
|
|
|
+ <!-- <el-button type="danger" icon="edit" @click="delgy_delclick" v-if="delall=== true" :disabled="gySelection === ''" class="bt" title="选中复选框进行删除工艺数据">删除工艺资料</el-button> -->
|
|
|
+ <el-button type="primary" icon="edit" @click="copyProductData" :disabled="!_Gd_gdbh" class="bt" title="复制订单工艺">复制订单工艺</el-button>
|
|
|
+ <el-button type="primary" icon="upload" @click="openImportProcessDialog" :disabled="!_Gd_gdbh" class="bt" title="导入工艺资料">导入工艺资料</el-button>
|
|
|
+ <el-button type="primary" icon="search" :loading="processProductionChecking" @click="openProcessProductionDialog" :disabled="!_Gd_gdbh" class="bt" title="工序产量核查">工序产量核查</el-button>
|
|
|
+
|
|
|
+ <!-- <el-button type="primary" icon="edit" @click="delbom_delclick" v-if="del_bom=== true" :disabled="bom_Selection === '' " class="bt" title="选中复选框进行删除bom数据">删除bom资料</el-button> -->
|
|
|
+
|
|
|
+ <!-- <el-button type="primary" icon="edit" @click="CSclick" class="bt" title="库存测试">库存测试</el-button> -->
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ </layout-header>
|
|
|
+ <layout>
|
|
|
+
|
|
|
+ <!-- 左侧树形结构 -->
|
|
|
+ <layout-sider :resize-directions="['right']" :width="190" style="margin: 0px;">
|
|
|
+ <div class="JKWTree-tree" style="height: 200px">
|
|
|
+ <h3>客户编号</h3>
|
|
|
+ <el-tree :data="treeData" class="treecolor" @node-click="handleNodeClick"></el-tree>
|
|
|
+ </div>
|
|
|
+ </layout-sider>
|
|
|
+
|
|
|
+ <!-- 右侧内容区域 -->
|
|
|
+ <layout-content >
|
|
|
+ <el-main>
|
|
|
+ <!-- 订单表格列表 -->
|
|
|
+ <div class="gva-table-box">
|
|
|
+ <el-table ref="multipleTable" style="width: 100%;height: 28vh"
|
|
|
+ :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ border tooltip-effect="dark"
|
|
|
+ v-loading="loading"
|
|
|
+ element-loading-text="拼命加载中"
|
|
|
+ element-loading-spinner="el-icon-loading"
|
|
|
+ element-loading-background="rgba(0, 0, 0, 0.8)"
|
|
|
+ :data="tableData" :row-key="ddzlTableRowKey"
|
|
|
+ highlight-current-row="true"
|
|
|
+ :cell-class-name="tableDataCellClass"
|
|
|
+ @row-click="tableRowClick" @row-dblclick="updateCompanyFunc"
|
|
|
+ @selection-change="ddzlSelectionChange" :show-overflow-tooltip="true">
|
|
|
+ <el-table-column align="center" type="selection" width="40"/>
|
|
|
+ <el-table-column align="center" prop="status" width="75">
|
|
|
+ <template #header>
|
|
|
+ <el-tooltip
|
|
|
+ content='「技术附件」列显示 “*” 表示该订单尚未上传对应附件'
|
|
|
+ placement="top"
|
|
|
+ effect="dark"
|
|
|
+ >
|
|
|
+ <span class="fj-col-header">
|
|
|
+ 附件
|
|
|
+ <el-icon class="fj-col-help"><QuestionFilled /></el-icon>
|
|
|
+ </span>
|
|
|
+ </el-tooltip>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column align="left" label="订单编号" prop="订单编号" width="105" sortable/>
|
|
|
+ <el-table-column align="left" label="客户" prop="客户编号" width="68" />
|
|
|
+ <el-table-column align="left" label="款号" prop="生产款号" width="200" />
|
|
|
+ <el-table-column align="left" label="款式" prop="款式" width="100"/>
|
|
|
+ <el-table-column align="left" label="数量" prop="订单数量" width="70" />
|
|
|
+ <el-table-column align="center" label="状态" prop="gd_statu" width="125" sortable>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="row.gd_statu === '1-计划中' ? 'warning' :
|
|
|
+ (row.gd_statu === '已裁剪' ? 'primary' :
|
|
|
+ (row.gd_statu === '已车缝' ? '' :
|
|
|
+ (row.gd_statu === '2-生产中' ? 'success' :
|
|
|
+ (row.gd_statu.includes('总检已') ?
|
|
|
+ (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? 'success' : 'info') :
|
|
|
+ (row.gd_statu === '已完工' ? 'success' : 'info')))))">
|
|
|
+ {{ row.gd_statu === '1-计划中' ? '计划中' :
|
|
|
+ (row.gd_statu === '已裁剪' ? '已裁剪' :
|
|
|
+ (row.gd_statu === '已车缝' ? '已车缝' :
|
|
|
+ (row.gd_statu === '2-生产中' ? '生产中' :
|
|
|
+ (row.gd_statu.includes('总检已') ?
|
|
|
+ (parseInt(row.gd_statu.match(/\d+/)?.[0]) >= 95 ? '已完工' : row.gd_statu.replace('总检已', '总检')) :
|
|
|
+ row.gd_statu)))) }}
|
|
|
+ </el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column align="left" label="落货日期" prop="落货日期" width="98" />
|
|
|
+ <el-table-column align="left" label="船样" prop="船样合计" width="55" />
|
|
|
+ <el-table-column align="left" label="船样描述" prop="船样描述" width="130" />
|
|
|
+ <el-table-column align="left" label="单位" prop="单位" width="55" />
|
|
|
+ <el-table-column align="left" label="面料" prop="面料" width="180" />
|
|
|
+ <el-table-column align="left" label="备注" prop="要求" width="180" />
|
|
|
+ <el-table-column align="left" label="计划制造工分" prop="计划制造工分" width="180" />
|
|
|
+ <el-table-column align="left" label="粘衬" prop="粘衬" width="180" />
|
|
|
+ <el-table-column align="left" label="箱唛要求" prop="箱唛要求" width="180" />
|
|
|
+ <el-table-column align="left" label="制单人" prop="Sys_id" width="160" />
|
|
|
+ <el-table-column align="left" label="制单日期" prop="Sys_rq" width="160" />
|
|
|
+ </el-table>
|
|
|
+ <!-- 分页 -->
|
|
|
+ <div class="gva-pagination">
|
|
|
+ <el-pagination
|
|
|
+ @size-change="handleSizeChange"
|
|
|
+ @current-change="handleCurrentChange"
|
|
|
+ :current-page="page"
|
|
|
+ :page-sizes="[10, 30, 50, 100]"
|
|
|
+ :page-size="pageSize"
|
|
|
+ layout="total, sizes, prev, pager, next, jumper"
|
|
|
+ :total="total">
|
|
|
+ </el-pagination>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 颜色资料列表、部件资料列表、工艺资料列表、BOM资料列表 -->
|
|
|
+ <el-tabs v-model="activeName" @tab-click="handleClick">
|
|
|
+ <el-tab-pane label="颜色资料" name="first">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '20px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-click="ystableclick"
|
|
|
+ @row-dblclick="ysupdateCompanyFunc"
|
|
|
+ @selection-change="selectionChange($event, '颜色资料')"
|
|
|
+ style="width: 100%;height: 36vh" border show-summary
|
|
|
+ :summary-method="getSummaries" tooltip-effect="dark" :data="ystableData" :row-key="ysColorTableRowKey">
|
|
|
+ <el-table-column type="selection" width="30" />
|
|
|
+ <el-table-column align="left" sortable label="子订单编号" prop="子订单编号" width="140"/>
|
|
|
+ <el-table-column align="left" sortable label="PO号 " prop="款号" width="180"/>
|
|
|
+ <el-table-column align="left" sortable label="颜色备注" prop="颜色备注" width="110"/>
|
|
|
+ <el-table-column align="left" sortable label="色系名称" prop="颜色" width="110"/>
|
|
|
+ <el-table-column align="left" sortable label="船样" prop="船样" width="80"/>
|
|
|
+ <!-- 尺码列表 -->
|
|
|
+ <template v-for="item in sizeDatas">
|
|
|
+ <el-table-column align="left" sortable :label=item :prop=item width="80"/>
|
|
|
+ </template>
|
|
|
+ <el-table-column align="left" sortable label="制单总数" prop="zdtotal" width="110"/>
|
|
|
+ <el-table-column align="left" sortable label="创建用户" prop="Sys_id" width="160"/>
|
|
|
+ <el-table-column align="left" sortable label="创建日期" prop="Sys_rq" width="160"/>
|
|
|
+ <el-table-column align="left" sortable label="修改时间" prop="更新时间" width="160"/>
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane>
|
|
|
+
|
|
|
+ <!-- <el-tab-pane label="部件资料" name="part">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '20px' }"
|
|
|
+ :cell-style="{ padding: '0px' }"
|
|
|
+ :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ highlight-current-row="true"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ size="small"
|
|
|
+ @row-click="partTableRowClick"
|
|
|
+ @row-dblclick="partRowDblclick"
|
|
|
+ @selection-change="selectionChange($event, '部件资料')"
|
|
|
+ style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="parttableData" row-key="部件ID">
|
|
|
+ <el-table-column type="selection" width="30" />
|
|
|
+ <el-table-column align="left" label="部件编号" prop="部件编号" width="80"/>
|
|
|
+ <el-table-column align="left" label="部件名称" prop="部件名称" width="150"/>
|
|
|
+ <el-table-column align="left" label="部件类型" prop="部件类型" width="120"/>
|
|
|
+ <el-table-column align="left" label="部件备注" prop="部件备注" width="150"/>
|
|
|
+ <el-table-column align="left" label="录入人" prop="操作人" width="100"/>
|
|
|
+ <el-table-column align="left" label="录入时间" prop="操作时间" width="160"/>
|
|
|
+ <el-table-column align="left" label="修改人" prop="修改人" width="100"/>
|
|
|
+ <el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane> -->
|
|
|
+
|
|
|
+ <el-tab-pane label="工艺资料" name="second">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '20px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ highlight-current-row="true"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ size="small"
|
|
|
+ :cell-class-name="gysatusCellClass"
|
|
|
+ @row-dblclick="gdgyupdateCompanyFunc"
|
|
|
+ @row-click="clickybupdate2"
|
|
|
+ :row-class-name="rowClassStyle2"
|
|
|
+ @selection-change="selectionChange($event, '工艺资料')"
|
|
|
+ style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="gytableData" row-key="id"
|
|
|
+ :summary-method="gySummaries"
|
|
|
+ show-summary>
|
|
|
+ <!-- <el-table-column align="left" label="部件编号" prop="部件编号" width="80"/> -->
|
|
|
+ <el-table-column align="center" label="部件名称" prop="部件名称" width="80"/>
|
|
|
+ <el-table-column align="center" label="工序编号" prop="工艺编号" width="75"/>
|
|
|
+ <el-table-column align="left" label="工序名称" prop="工艺名称" width="200"/>
|
|
|
+ <el-table-column align="center" label="生产工序" prop="大工艺" width="75"/>
|
|
|
+ <!-- <el-table-column align="left" label="秒" prop="标准工时" width="80"/> -->
|
|
|
+ <el-table-column align="center" label="工分" prop="标准公分" width="75"/>
|
|
|
+ <el-table-column align="left" label="备注" prop="备注" width="150"/>
|
|
|
+ <el-table-column align="center" label="难度系数" prop="系数" width="80"/>
|
|
|
+ <el-table-column align="left" label="录入人" prop="系统人" width="100"/>
|
|
|
+ <el-table-column align="left" label="录入时间" prop="系统时间" width="160"/>
|
|
|
+ <el-table-column align="left" label="修改人" prop="修改人" width="100"/>
|
|
|
+ <el-table-column align="left" label="修改时间" prop="修改时间" width="160"/>
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane>
|
|
|
+
|
|
|
+ <el-tab-pane label="订单资料附件" name="third">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '30px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '30px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-dblclick="gdbomupdateCompanyFunc"
|
|
|
+ style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="ddtableData" row-key="ID"
|
|
|
+ @selection-change="fjSelectionChange">
|
|
|
+ <el-table-column align="left" label="关联编号" prop="关联编号" width="115"/>
|
|
|
+ <el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
|
|
|
+ <el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
|
|
|
+ <el-table-column align="left" label="版本号" prop="version" width="80"/>
|
|
|
+ <el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
|
|
|
+ <el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
|
|
|
+ <!-- 操作列,新增修改和删除按钮 -->
|
|
|
+ <el-table-column align="left" label="操作" width="230" fixed="right">
|
|
|
+ <template #default="scope">
|
|
|
+ <!-- PDF预览按钮 -->
|
|
|
+ <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
|
|
|
+ <!-- 删除按钮 -->
|
|
|
+ <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane>
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ <el-tab-pane label="技术附件" name="fourth">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '30px' }"
|
|
|
+ :cell-style="{ padding: '0px' }"
|
|
|
+ :header-row-style="{ height: '30px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-dblclick="ExcelShow"
|
|
|
+ style="width: 100%;height: 36vh"
|
|
|
+ border tooltip-effect="dark"
|
|
|
+ :data="jstableData"
|
|
|
+ row-key="ID"
|
|
|
+ @selection-change="fjSelectionChange">
|
|
|
+
|
|
|
+ <el-table-column align="left" label="关联编号" prop="关联编号" width="115"/>
|
|
|
+ <el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
|
|
|
+ <el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
|
|
|
+ <el-table-column align="left" label="版本号" prop="version" width="80"/>
|
|
|
+ <el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
|
|
|
+ <el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
|
|
|
+
|
|
|
+ <!-- 操作列,新增修改和删除按钮 -->
|
|
|
+ <el-table-column align="left" label="操作" width="230" fixed="right">
|
|
|
+ <template #default="scope">
|
|
|
+ <!-- PDF预览按钮 -->
|
|
|
+ <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
|
|
|
+ <!-- 删除按钮 -->
|
|
|
+ <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane>
|
|
|
+
|
|
|
+
|
|
|
+ <el-tab-pane label="发货单附件" name="fourths">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '30px' }"
|
|
|
+ :cell-style="{ padding: '0px' }"
|
|
|
+ :header-row-style="{ height: '30px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-dblclick="ExcelShow"
|
|
|
+ style="width: 100%;height: 36vh"
|
|
|
+ border tooltip-effect="dark"
|
|
|
+ :data="fhdtableData"
|
|
|
+ row-key="ID"
|
|
|
+ @selection-change="fhdSelectionChange">
|
|
|
+ <el-table-column align="left" label="发货单号" prop="rand_number" width="160"/>
|
|
|
+ <el-table-column align="left" label="订单编号" prop="关联编号" width="115"/>
|
|
|
+ <el-table-column align="left" label="附件备注" prop="附件备注" width="110"/>
|
|
|
+ <el-table-column align="left" label="文件类型" prop="附件类型" width="100"/>
|
|
|
+ <el-table-column align="left" label="版本号" prop="version" width="80"/>
|
|
|
+ <el-table-column align="left" label="建档用户" prop="sys_id" width="160"/>
|
|
|
+ <el-table-column align="left" label="建档时间" prop="sys_rq" width="160"/>
|
|
|
+
|
|
|
+ <!-- 操作列,新增修改和删除按钮 -->
|
|
|
+ <el-table-column align="left" label="操作" width="330" fixed="right">
|
|
|
+ <template #default="scope">
|
|
|
+ <!-- PDF预览按钮 -->
|
|
|
+ <el-button type="success" size="small" :data="ddtableData" @click="showPdf(scope.row)">PDF预览</el-button>
|
|
|
+ <el-button type="primary" size="small" @click="fahuodan(scope.row)">获取发货数量</el-button>
|
|
|
+ <!-- 删除按钮 -->
|
|
|
+ <el-button type="danger" size="small" @click="deleteItem(scope.row)">删除</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane>
|
|
|
+
|
|
|
+
|
|
|
+ <el-tab-pane label="BOM资料" name="six">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '20px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-dblclick="bombomupdateCompanyFunc"
|
|
|
+ @selection-change="bomSelectionChange"
|
|
|
+ style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="bomtableData" row-key="ID">
|
|
|
+ <!-- <el-table-column type="selection" width="30" /> -->
|
|
|
+ <el-table-column align="left" label="订单编号" prop="订单编号" width="105"/>
|
|
|
+ <el-table-column align="left" label="物料分类" prop="物料分类" width="100"/>
|
|
|
+ <el-table-column align="left" label="物料名称" prop="物料名称" width="210"/>
|
|
|
+ <el-table-column align="left" label="计划入库时间" prop="计划入库时间" width="160" />
|
|
|
+ <el-table-column align="left" label="计划用料" prop="计划用料" width="90" />
|
|
|
+ <el-table-column align="left" label="计划门幅" prop="计划门幅" width="90"/>
|
|
|
+ <el-table-column align="left" label="定额用料" prop="定额用料" width="90"/>
|
|
|
+ <el-table-column align="left" label="定额门幅" prop="定额门幅" width="90"/>
|
|
|
+ <el-table-column align="left" label="备注" prop="备注" width="240"/>
|
|
|
+ <el-table-column align="left" label="更新用户" prop="ID" width="90"/>
|
|
|
+ <el-table-column align="left" label="更新日期" prop="日期" width="160"/>
|
|
|
+ <!-- <el-table-column align="left" label="UNIQID" prop="UNIQID" width="80"/> -->
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane>
|
|
|
+
|
|
|
+ <el-tab-pane label="面料库存" name="seven">
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '25px' }" :header-cell-style="{ padding: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '25px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-dblclick="mlupdateCompanyFunc"
|
|
|
+ :summary-method="mlgetSummaries"
|
|
|
+ style="width: 100%;height: 36vh" border tooltip-effect="dark" :data="mltableData" row-key="ID" @selection-change="handleSelectionChange">
|
|
|
+ <!-- <el-table-column type="selection" width="30" />-->
|
|
|
+ <!-- <el-table-column type="selection" width="30" /> -->
|
|
|
+ <el-table-column align="left" label="订单编号" prop="订单编号" width="110"/>
|
|
|
+ <!-- <el-table-column align="left" label="客户编号" prop="客户编号" width="100"/>
|
|
|
+ <el-table-column align="left" label="生产款号" prop="生产款号" width="100"/>
|
|
|
+ <el-table-column align="left" label="款式" prop="款式" width="90"/> -->
|
|
|
+ <el-table-column align="left" label="颜色" prop="颜色" width="110"/>
|
|
|
+ <el-table-column align="left" label="物料编号" prop="物料编码" width="220"/>
|
|
|
+ <el-table-column align="left" label="物料名称" prop="物料名称" width="180"/>
|
|
|
+ <el-table-column align="left" label="定额用料" prop="定额用料" width="90"/>
|
|
|
+ <el-table-column align="left" label="定额门幅" prop="定额门幅" width="90"/>
|
|
|
+ <el-table-column align="left" label="入库总量" prop="入仓总量" width="90"/>
|
|
|
+ <el-table-column align="left" label="领用数量" prop="领用数量" width="90"/>
|
|
|
+ <el-table-column align="left" label="面料结余" prop="库存数量" width="90"/>
|
|
|
+ <el-table-column align="left" label="单位" prop="单位" width="60"/>
|
|
|
+ <el-table-column align="left" label="备注" prop="备注" width="200"/>
|
|
|
+ <el-table-column align="left" label="关联订单" prop="关联订单" width="200"/>
|
|
|
+ <el-table-column align="left" label="更新用户" prop="Sys_ID" width="160"/>
|
|
|
+ <el-table-column align="left" label="更新日期" prop="Sys_rq" width="160"/>
|
|
|
+ </el-table>
|
|
|
+ </el-tab-pane>
|
|
|
+ </el-tabs>
|
|
|
+
|
|
|
+
|
|
|
+ <!-- 工艺资料详情弹窗 -->
|
|
|
+ <el-dialog v-model="gyDetailDialogVisible" :before-close="closeGyDetailDialog"
|
|
|
+ style="width: 100vw; height: 100vh; margin: 0; padding: 0; top: 0; left: 0;"
|
|
|
+ destroy-on-close class="gy-detail-dialog" :show-close="false">
|
|
|
+ <template #header>
|
|
|
+ <div class="gy-detail-dialog-header">
|
|
|
+ <div class="gy-detail-dialog-title-row">
|
|
|
+ <span class="gy-detail-dialog-title">工艺资料详情</span>
|
|
|
+ </div>
|
|
|
+ <div class="gy-detail-dialog-toolbar-row">
|
|
|
+ <div class="gy-detail-dialog-actions-left">
|
|
|
+ <el-button type="primary" @click="openGyDetailProcessAdd">增加</el-button>
|
|
|
+ <el-button type="danger" :disabled="!gyDetailSelection.length || gyDetailDeleting" :loading="gyDetailDeleting" @click="handleGyDetailBatchDelete">删除</el-button>
|
|
|
+ <el-button type="primary" @click="handleGyDetailPrintPreview">打印预览</el-button>
|
|
|
+ <el-button type="success" v-if="!gyDetailReadonly" :loading="gyDetailSaving" @click="handleGyDetailSave">保存</el-button>
|
|
|
+ </div>
|
|
|
+ <el-button type="danger" class="gy-detail-dialog-exit" @click="closeGyDetailDialog">退出</el-button>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div class="gy-detail-dialog-body">
|
|
|
+ <!-- 上方信息 -->
|
|
|
+ <div style="margin-bottom: 15px; overflow-x: auto;">
|
|
|
+ <el-row :gutter="20" style="width: max-content; display: flex; align-items: center;">
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 80px; text-align: right; margin-right: 8px;">订单编号:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.订单编号" disabled style="width: 100px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 80px; text-align: right; margin-right: 8px;">客户编号:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.客户编号" disabled style="width: 70px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 80px; text-align: right; margin-right: 8px;">生产款号:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.生产款号" disabled style="width: 280px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 60px; text-align: right; margin-right: 8px;">款式:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.款式" disabled style="width: 200px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 60px; text-align: right; margin-right: 8px;">接单日期:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.接单日期" disabled style="width: 120px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span
|
|
|
+ style="width: 60px; text-align: right; margin-right: 8px; cursor: pointer;"
|
|
|
+ @click="startGyDetailPlanManufactureEdit"
|
|
|
+ >备注:</span>
|
|
|
+ <el-input
|
|
|
+ v-model="gyDetailFormData.备注"
|
|
|
+ style="width: 200px;"
|
|
|
+ :readonly="!gyDetailPlanManufactureEditing"
|
|
|
+ @click="startGyDetailPlanManufactureEdit"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </el-row>
|
|
|
+ <el-row :gutter="20" style="width: max-content; display: flex; align-items: center; margin-top: 10px;">
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 80px; text-align: right; margin-right: 8px;">落货日期:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.落货日期" disabled style="width: 120px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 80px; text-align: right; margin-right: 8px;">制单日期:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.制单日期" disabled style="width: 160px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 60px; text-align: right; margin-right: 8px;">制单人:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.制单人" disabled style="width: 70px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 90px; text-align: right; margin-right: 8px;">工单完工日期:</span>
|
|
|
+ <el-date-picker
|
|
|
+ v-model="gyDetailFormData.工单完工日期"
|
|
|
+ type="date"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ format="YYYY-MM-DD"
|
|
|
+ clearable
|
|
|
+ placeholder="选择日期"
|
|
|
+ style="width: 140px;"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span style="width: 80px; text-align: right; margin-right: 8px;">订单数量:</span>
|
|
|
+ <el-input v-model="gyDetailFormData.订单数量" disabled style="width: 80px;" />
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; align-items: center; white-space: nowrap;">
|
|
|
+ <span
|
|
|
+ style="width: 100px; text-align: right; margin-right: 8px; cursor: pointer;"
|
|
|
+ @click="startGyDetailPlanManufactureEdit"
|
|
|
+ >计划制造工分:</span>
|
|
|
+ <el-input
|
|
|
+ :model-value="gyDetailFormData.计划制造工分"
|
|
|
+ style="width: 80px;"
|
|
|
+ :readonly="!gyDetailPlanManufactureEditing"
|
|
|
+ inputmode="decimal"
|
|
|
+ @click="startGyDetailPlanManufactureEdit"
|
|
|
+ @update:model-value="onGyDetailPlanManufactureInput"
|
|
|
+ />
|
|
|
+ <template v-if="gyDetailPlanManufactureEditing">
|
|
|
+ <el-button style="margin-left: 10px;" @click="cancelGyDetailPlanManufactureEdit">取消</el-button>
|
|
|
+ <el-button type="primary" style="margin-left: 8px;" :loading="gyDetailPlanManufactureSaving" @click="confirmGyDetailPlanManufactureEdit">保存</el-button>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </el-row>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 工艺列表表格(虚拟滚动 + 底部横向滚动条) -->
|
|
|
+ <div ref="gyDetailTableWrapRef" class="gy-detail-table-wrap">
|
|
|
+ <vxe-table
|
|
|
+ ref="gyDetailTableRef"
|
|
|
+ border
|
|
|
+ size="small"
|
|
|
+ show-overflow
|
|
|
+ auto-resize
|
|
|
+ :height="gyDetailTableHeight"
|
|
|
+ :min-width="gyDetailTableMinWidth"
|
|
|
+ :data="gyDetailDisplayProcessList"
|
|
|
+ :row-config="{ keyField: '_rowKey', isHover: true, isCurrent: true, height: 28 }"
|
|
|
+ :cell-config="{ height: 28, padding: false }"
|
|
|
+ :scroll-y="{ enabled: true, gt: 30 }"
|
|
|
+ :scroll-x="{ enabled: true }"
|
|
|
+ :column-config="{ resizable: true, minWidth: 56 }"
|
|
|
+ :checkbox-config="{ trigger: 'default', highlight: false }"
|
|
|
+ show-footer
|
|
|
+ :footer-method="gyDetailFooterMethod"
|
|
|
+ class="gy-detail-vxe-table"
|
|
|
+ @checkbox-change="handleGyDetailCheckboxChange"
|
|
|
+ @checkbox-all="handleGyDetailCheckboxChange"
|
|
|
+ >
|
|
|
+ <vxe-column type="checkbox" width="55" fixed="left" align="center" header-align="center" />
|
|
|
+ <vxe-column field="部件编号" title="部件编号" width="75" align="center" header-align="center" />
|
|
|
+ <vxe-column field="部件名称" width="120" align="center" header-align="center">
|
|
|
+ <template #header>
|
|
|
+ <div class="gy-detail-col-header">
|
|
|
+ <span>部件名称</span>
|
|
|
+ <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
+ <template #reference>
|
|
|
+ <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions) }" @click.stop>
|
|
|
+ <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ <div class="gy-detail-filter-panel">
|
|
|
+ <div class="gy-detail-filter-options">
|
|
|
+ <el-checkbox-group v-model="gyDetailBuJianMingChengFilter" @change="handleGyDetailBuJianMingChengFilterChange">
|
|
|
+ <el-checkbox v-for="item in gyDetailBuJianMingChengFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
+ </el-checkbox-group>
|
|
|
+ </div>
|
|
|
+ <div class="gy-detail-filter-actions">
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="clearGyDetailBuJianMingChengFilter">取消全选</span>
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailBuJianMingChengFilter">全选</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="!isGyDetailCellEditable('部件名称') && !isGyDetailCellEditing(row, '部件名称')">{{ row.部件名称 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '部件名称')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '部件名称')">{{ formatGyDetailCellText(row.部件名称) }}</div>
|
|
|
+ <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.部件名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '部件名称')" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="工序编号" title="工序编号" width="100" align="center" header-align="center" />
|
|
|
+ <vxe-column field="工序名称" title="工序名称" width="320" align="left" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="!isGyDetailCellEditable('工序名称') && !isGyDetailCellEditing(row, '工序名称')">{{ row.工序名称 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '工序名称')" class="gy-detail-cell gy-detail-cell--wide" @click.stop="startGyDetailCellEdit(row, '工序名称')">{{ formatGyDetailCellText(row.工序名称) }}</div>
|
|
|
+ <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.工序名称" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="handleGyDetailCellKeydown($event, row, '工序名称')" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="大工序" width="110" align="center" header-align="center">
|
|
|
+ <template #header>
|
|
|
+ <div class="gy-detail-col-header">
|
|
|
+ <span>生产工序</span>
|
|
|
+ <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
+ <template #reference>
|
|
|
+ <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailDaGongXuFilter, dagongxuFilters) }" @click.stop>
|
|
|
+ <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ <div class="gy-detail-filter-panel">
|
|
|
+ <div class="gy-detail-filter-options">
|
|
|
+ <el-checkbox-group v-model="gyDetailDaGongXuFilter" @change="handleGyDetailDaGongXuFilterChange">
|
|
|
+ <el-checkbox v-for="item in dagongxuFilters" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
+ </el-checkbox-group>
|
|
|
+ </div>
|
|
|
+ <div class="gy-detail-filter-actions">
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="clearGyDetailDaGongXuFilter">取消全选</span>
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailDaGongXuFilter">全选</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="!isGyDetailCellEditable('大工序') && !isGyDetailCellEditing(row, '大工序')">{{ row.大工序 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '大工序')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '大工序')">{{ formatGyDetailCellText(row.大工序) }}</div>
|
|
|
+ <el-select
|
|
|
+ v-else
|
|
|
+ :ref="setGyDetailCellInputRef"
|
|
|
+ v-model="row.大工序"
|
|
|
+ size="small"
|
|
|
+ class="gy-detail-cell-input gy-detail-cell-select"
|
|
|
+ filterable
|
|
|
+ @change="finishGyDetailCellEdit(row)"
|
|
|
+ >
|
|
|
+ <el-option v-for="opt in gyDetailDaGongXuOptions" :key="opt" :label="opt" :value="opt" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="秒" title="秒" width="80" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="gyDetailReadonly">{{ row.秒 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '秒')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '秒')">{{ formatGyDetailCellText(row.秒) }}</div>
|
|
|
+ <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.秒" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '秒', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '秒')" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="分" title="分" width="80" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="gyDetailReadonly">{{ row.分 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '分')">{{ formatGyDetailCellText(row.分) }}</div>
|
|
|
+ <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '分')" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="定额分" title="工分" width="80" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="!isGyDetailCellEditable('工分') && !isGyDetailCellEditing(row, '定额分')">{{ row.定额分 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '定额分')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '定额分')">{{ formatGyDetailCellText(row.定额分) }}</div>
|
|
|
+ <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.定额分" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '定额分', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '定额分')" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="金额" title="金额" width="80" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="gyDetailReadonly">{{ row.金额 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '金额')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '金额')">{{ formatGyDetailCellText(row.金额) }}</div>
|
|
|
+ <el-input v-else :ref="setGyDetailCellInputRef" :model-value="row.金额" size="small" class="gy-detail-cell-input" @update:model-value="(v) => onGyDetailDecimalInput(row, '金额', v)" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" @keydown="(e) => handleGyDetailCellKeydown(e, row, '金额')" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="难度系数" width="110" align="center" header-align="center">
|
|
|
+ <template #header>
|
|
|
+ <div class="gy-detail-col-header">
|
|
|
+ <span>难度系数</span>
|
|
|
+ <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
+ <template #reference>
|
|
|
+ <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions) }" @click.stop>
|
|
|
+ <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ <div class="gy-detail-filter-panel">
|
|
|
+ <div class="gy-detail-filter-options">
|
|
|
+ <el-checkbox-group v-model="gyDetailNanDuXiShuFilter" @change="handleGyDetailNanDuXiShuFilterChange">
|
|
|
+ <el-checkbox v-for="item in gyDetailDifficultyFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
+ </el-checkbox-group>
|
|
|
+ </div>
|
|
|
+ <div class="gy-detail-filter-actions">
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="clearGyDetailNanDuXiShuFilter">取消全选</span>
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailNanDuXiShuFilter">全选</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="gyDetailReadonly">{{ row.难度系数 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '难度系数')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '难度系数')">{{ formatGyDetailCellText(row.难度系数) }}</div>
|
|
|
+ <el-select
|
|
|
+ v-else
|
|
|
+ :ref="setGyDetailCellInputRef"
|
|
|
+ v-model="row.难度系数"
|
|
|
+ size="small"
|
|
|
+ class="gy-detail-cell-input gy-detail-cell-select"
|
|
|
+ @change="finishGyDetailCellEdit(row)"
|
|
|
+ >
|
|
|
+ <el-option v-for="opt in gyDetailDifficultyOptions" :key="opt" :label="opt" :value="opt" />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="备注" title="备注" width="140" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span v-if="gyDetailReadonly">{{ row.备注 }}</span>
|
|
|
+ <template v-else>
|
|
|
+ <div v-if="!isGyDetailCellEditing(row, '备注')" class="gy-detail-cell" @click.stop="startGyDetailCellEdit(row, '备注')">{{ formatGyDetailCellText(row.备注) }}</div>
|
|
|
+ <el-input v-else :ref="setGyDetailCellInputRef" v-model="row.备注" size="small" class="gy-detail-cell-input" @blur="finishGyDetailCellEdit(row)" @keyup.enter="finishGyDetailCellEdit(row)" />
|
|
|
+ </template>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="状态" width="80" align="center" header-align="center">
|
|
|
+ <template #header>
|
|
|
+ <div class="gy-detail-col-header">
|
|
|
+ <span>状态</span>
|
|
|
+ <el-popover trigger="click" placement="bottom-start" :width="180" :teleported="true" :z-index="10050" append-to-body popper-class="gy-detail-filter-popper">
|
|
|
+ <template #reference>
|
|
|
+ <span class="gy-detail-filter-btn" :class="{ 'is-active': isGyDetailFilterActive(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions) }" @click.stop>
|
|
|
+ <svg viewBox="0 0 1024 1024" width="14" height="14" aria-hidden="true"><path fill="currentColor" d="M880.1 154H143.9c-24.5 0-39.9 26.7-27.6 48L349 597.4V838c0 17.7 14.2 32 31.8 32h262.4c17.6 0 31.8-14.3 31.8-32V597.4L907.7 202c12.2-21.3-3.1-48-27.6-48z"/></svg>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ <div class="gy-detail-filter-panel">
|
|
|
+ <div class="gy-detail-filter-options">
|
|
|
+ <el-checkbox-group v-model="gyDetailZhuangTaiFilter" @change="handleGyDetailZhuangTaiFilterChange">
|
|
|
+ <el-checkbox v-for="item in gyDetailStatusFilterOptions" :key="item.value" :label="item.value">{{ item.text }}</el-checkbox>
|
|
|
+ </el-checkbox-group>
|
|
|
+ </div>
|
|
|
+ <div class="gy-detail-filter-actions">
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="clearGyDetailZhuangTaiFilter">取消全选</span>
|
|
|
+ <span class="gy-detail-filter-link" @click.stop="selectAllGyDetailZhuangTaiFilter">全选</span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-popover>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <div class="gy-detail-status-cell">{{ formatGyDetailStatus(row.状态) }}</div>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ <vxe-column field="_gyAction" title="操作" width="100" fixed="right" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <div class="gy-detail-action-cell">
|
|
|
+ <el-button
|
|
|
+ v-if="isGyDetailRowSplit(row)"
|
|
|
+ size="small"
|
|
|
+ type="warning"
|
|
|
+ @click="handleUndoSplitProcess(row)"
|
|
|
+ >撤销拆分</el-button>
|
|
|
+ <el-button
|
|
|
+ v-else
|
|
|
+ size="small"
|
|
|
+ type="success"
|
|
|
+ @click="handleSplitProcess(row)"
|
|
|
+ >拆分</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </vxe-column>
|
|
|
+ </vxe-table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 拆分弹窗 -->
|
|
|
+ <el-dialog v-model="splitDialogVisible" title="拆分工序" width="450px" style="top: 30%;" @close="splitDialogVisible = false">
|
|
|
+ <div style="padding: 20px;">
|
|
|
+ <div v-if="hasReportData" style="color: #f56c6c; margin-bottom: 15px; font-weight: bold; text-align: center;">
|
|
|
+ ⚠️ 该工序已存在报工数据
|
|
|
+ </div>
|
|
|
+ <div style="margin-bottom: 15px; text-align: center;">
|
|
|
+ <span>将复制 </span>
|
|
|
+ <span class="gy-split-process-name">{{ currentSplitRow?.工序编号 || '' }}-{{ currentSplitRow?.工序名称 || '' }}</span>
|
|
|
+ <span>,拆分数量为:</span>
|
|
|
+ </div>
|
|
|
+ <div style="display: flex; justify-content: center;">
|
|
|
+ <el-input-number
|
|
|
+ v-model="splitQuantity"
|
|
|
+ :min="1"
|
|
|
+ :step="1"
|
|
|
+ :precision="0"
|
|
|
+ controls-position="right"
|
|
|
+ placeholder="请输入拆分数量"
|
|
|
+ style="width: 200px;"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="splitDialogVisible = false">取消</el-button>
|
|
|
+ <el-button type="primary" :loading="splitSubmitting" @click="confirmSplitProcess">确定</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 修改颜色资料弹窗 -->
|
|
|
+ <el-dialog v-model="dialogFormVisible" :before-close="edit_closeDialog"
|
|
|
+ style="width: 80%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
|
|
|
+ title="颜色资料修改" destroy-on-close >
|
|
|
+ <el-row :gutter="20" class="form-row">
|
|
|
+ <el-col :span="10">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;">订单编号 {{_ddhval}}</h3>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="订单子编号:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
+ <el-input v-model="edit_formData['子订单编号']" disabled style="width: 250px;" id="订单子编号" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="10">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
+ <el-select
|
|
|
+ v-model=" edit_formData['颜色']" style="width: 150px;" id="色系名称"
|
|
|
+ @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
|
|
|
+ <el-option
|
|
|
+ v-for="color in getSuborderscolor.colorlist"
|
|
|
+ :key="color.id"
|
|
|
+ :label="color.colorname"
|
|
|
+ :value="color.colorname"
|
|
|
+ @click="xg_sxhandleSizeChange(color.colorname,color.colorcode)">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form-item label="PO号:" prop="deliveryDate" class="mab" label-width="110px" style="">
|
|
|
+ <el-input v-model="edit_formData['款号']" style="width: 250px;" id="生产款号" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="20">
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
|
|
|
+ <el-input v-model="edit_formData['颜色备注']" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="是否船样:" prop="joinDate" label-width='200'>
|
|
|
+ <el-select v-model="edit_formData['船样']" style="width: 150px;" id="是否船样" @keydown="add_gdzlent($event, '尺码规格', '是否船样', 'zds1')">
|
|
|
+ <el-option label="是" value="是" @click="edit_cyChange('是')"></el-option>
|
|
|
+ <el-option label="否" value="否" @click="edit_cyChange('否')"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row class="form-row">
|
|
|
+ <el-col :span="20">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="尺码:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
+ <el-input v-model="edit_cmformdata.cm1" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm2" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm3" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm4" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm5" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm6" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm7" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm8" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm9" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm10" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm11" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm12" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm13" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.cm14" readonly style="width: 80px;" />
|
|
|
+ <el-input v-model="edit_cmformdata.sctotal" readonly style="width: 80px;" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row class="form-row">
|
|
|
+ <el-col :span="20">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1' @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2' @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3' @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4' @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5' @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6' @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7' @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8' @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9' @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10' @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11' @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12' @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13' @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14' @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
|
|
|
+ <el-input v-model="edit_zdsformdata.zdtotal" readonly style="width: 80px;" />
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer" style="display: flex; justify-content: flex-end; margin-top: 20px;">
|
|
|
+ <el-button @click="ys_edit_closeDialog" style="margin-left: 10px;">取消</el-button>
|
|
|
+ <el-button type="primary" @click="ys_edit_Dialog" style="margin-left: 10px;">确认</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+
|
|
|
+ <!-- 新增订单资料弹窗 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="add_gddialogFormVisible"
|
|
|
+ :before-close="add_gdcloseDialog"
|
|
|
+ title="新增订单资料"
|
|
|
+ class="add-order-dialog"
|
|
|
+ width="90%"
|
|
|
+ top="4vh"
|
|
|
+ destroy-on-close
|
|
|
+ >
|
|
|
+ <el-row :gutter="20" class="add-order-dialog-body">
|
|
|
+ <el-col :xs="24" :md="16" class="add-order-dialog-main">
|
|
|
+ <el-form :model="add_gdscgdformData" label-width="100px">
|
|
|
+ <el-row :gutter="16">
|
|
|
+ <el-col :xs="24" :sm="12">
|
|
|
+ <el-form-item label="订单编号">
|
|
|
+ <el-input v-model="add_gdscgdformData.订单编号" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="生产款号">
|
|
|
+ <el-input v-model="add_gdscgdformData['生产款号']" id="生产款号"
|
|
|
+ @keydown="add_gdzlent($event, '粘衬', '生产款号', '订单数量')" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="款式">
|
|
|
+ <el-input v-model="add_gdscgdformData['款式']" id="款式"
|
|
|
+ @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12">
|
|
|
+ <el-form-item label="客户编号">
|
|
|
+ <el-input v-model="add_gdscgdformData.客户编号" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="订单数量">
|
|
|
+ <el-input v-model="add_gdscgdformData.订单数量" id="订单数量"
|
|
|
+ @input="Input_handle()"
|
|
|
+ @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="落货日期">
|
|
|
+ <el-date-picker v-model="add_gdscgdformData['落货日期']" id="落货日期"
|
|
|
+ type="date" @keydown="add_gdzlent($event, '款式', '落货日期', '面料')" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-form-item label="面料">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="add_gdscgdformData['面料']" id="面料"
|
|
|
+ rows="2"
|
|
|
+ resize="none"
|
|
|
+ @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="箱唛要求">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="add_gdscgdformData['箱唛要求']" id="箱唛要求"
|
|
|
+ @keydown="add_gdzlent($event, '面料', '箱唛要求', '备注')"
|
|
|
+ rows="2"
|
|
|
+ resize="none"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="add_gdscgdformData['备注']" id="备注"
|
|
|
+ @keydown="add_gdzlent($event, '箱唛要求', '备注', '船样描述')"
|
|
|
+ rows="2"
|
|
|
+ resize="none"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="船样描述">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="add_gdscgdformData['船样描述']" id="船样描述"
|
|
|
+ rows="1"
|
|
|
+ resize="none"
|
|
|
+ @keydown="add_gdzlent($event, '备注', '船样描述', '船样合计')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-row :gutter="10" class="add-order-bottom-row">
|
|
|
+ <el-col :xs="24" :sm="8">
|
|
|
+ <el-form-item label="船样合计" label-width="100px">
|
|
|
+ <el-input v-model="add_gdscgdformData['船样合计']" id="船样合计"
|
|
|
+ @input="Input_handle()"
|
|
|
+ @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="10">
|
|
|
+ <el-form-item label="粘衬" label-width="60px">
|
|
|
+ <el-input v-model="add_gdscgdformData['粘衬']" id="粘衬"
|
|
|
+ @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="6">
|
|
|
+ <el-form-item label="单位" label-width="70px">
|
|
|
+ <el-input v-model="add_gdscgdformData['单位']" id="单位"
|
|
|
+ @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :md="8" class="add-order-dialog-side">
|
|
|
+ <div class="add-order-upload-wrap">
|
|
|
+ <el-upload
|
|
|
+ ref="uploadRef"
|
|
|
+ class="upload-demo add-order-upload"
|
|
|
+ :action="uploadUrl"
|
|
|
+ :http-request="customUpload"
|
|
|
+ :headers="uploadHeaders"
|
|
|
+ list-type="picture-card"
|
|
|
+ :on-preview="handlePreview"
|
|
|
+ :on-remove="handleRemove"
|
|
|
+ :before-upload="beforeUpload"
|
|
|
+ :on-success="handleSuccess"
|
|
|
+ :on-error="handleError"
|
|
|
+ :file-list="fileList"
|
|
|
+ :limit="1"
|
|
|
+ accept="image/jpeg,image/png"
|
|
|
+ >
|
|
|
+ <el-icon class="add-order-upload-plus"><Plus /></el-icon>
|
|
|
+ </el-upload>
|
|
|
+ <div class="add-order-upload-title">上传图片</div>
|
|
|
+ </div>
|
|
|
+ <el-form label-width="100px">
|
|
|
+ <el-form-item label="制单人">
|
|
|
+ <el-input v-model="add_gdscgdformData['Sys_id']" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="制单日期">
|
|
|
+ <el-date-picker v-model="add_gdscgdformData['制单日期']" disabled type="date" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '30px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="zsglddtableData" row-key="ID">
|
|
|
+ <el-table-column align="left" label="订单编号" prop="订单编号" width="110"/>
|
|
|
+ <el-table-column align="left" label="物料编码" prop="物料编码" width="200"/>
|
|
|
+ <el-table-column align="left" label="生产款号" prop="生产款号" width="200"/>
|
|
|
+ <el-table-column align="left" label="颜色" prop="颜色" width="115"/>
|
|
|
+ <el-table-column align="left" label="物料名称" prop="物料名称" width="170"/>
|
|
|
+ <el-table-column align="left" label="计划门幅" prop="计划门幅" width="115"/>
|
|
|
+ <el-table-column align="left" label="定额门幅" prop="定额门幅" width="115"/>
|
|
|
+ <el-table-column align="left" label="款式" prop="款式" width="115" />
|
|
|
+
|
|
|
+ <el-table-column fixed="right" label="操作" width="120">
|
|
|
+ <template #default="{ row, $index }">
|
|
|
+ <el-button @click="deleteRow($index)" type="text" size="small">
|
|
|
+ 移除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ </el-table> -->
|
|
|
+
|
|
|
+ <!-- 底部操作按钮 -->
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer" style="text-align: right;">
|
|
|
+ <el-button @click="add_gdcloseDialog">取消</el-button>
|
|
|
+ <el-button type="primary" @click="add_gdenterDialog":disabled="!isClickable" v-loading.fullscreen.lock="fullscreenLoading">确定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 订单图片页内放大预览 -->
|
|
|
+ <el-image-viewer
|
|
|
+ v-if="imgPreviewVisible"
|
|
|
+ :url-list="imgPreviewList"
|
|
|
+ teleported
|
|
|
+ hide-on-click-modal
|
|
|
+ @close="closeImgPreview"
|
|
|
+ />
|
|
|
+
|
|
|
+ <!-- 关联订单面料弹窗 -->
|
|
|
+ <el-dialog v-model="Related_fabricsVisible" :before-close="Related_fabricscloseDialog" title="关联订单面料"
|
|
|
+ style="width: 70%;height: 80%;" top="2%" destroy-on-close>
|
|
|
+ <el-form>
|
|
|
+ <div>
|
|
|
+ <el-space>
|
|
|
+
|
|
|
+ <el-input v-model="glddzl_keyword" style="width: 300px;" placeholder="请搜索要关联的订单编号或款号进行关联" @input="real_handleInput"/>
|
|
|
+ <el-button type="primary" @click="ddsearchHandle(glddzl_keyword)">搜索</el-button>
|
|
|
+ <!-- <el-button @click="Related_fabricscloseDialog">关闭</el-button> -->
|
|
|
+ <el-button type="primary" @click="Related_fabricsenterDialog">确定关联</el-button>
|
|
|
+ <span style="color: red;">请选择需要关联复用的颜色物料,在确定关联</span>
|
|
|
+ </el-space>
|
|
|
+ <br>
|
|
|
+ <br>
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '30px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ @row-dblclick="updateCompanyFunc2"
|
|
|
+ @selection-change="glddSelectionChange"
|
|
|
+ style="width: 100%;height: 65vh" border tooltip-effect="dark" :data="glddtableData" row-key="ID">
|
|
|
+ <el-table-column type="selection" width="50" />
|
|
|
+ <el-table-column align="left" label="订单编号" prop="订单编号" width="115"/>
|
|
|
+ <el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码" width="200"/>
|
|
|
+ <el-table-column align="left" label="生产款号" prop="生产款号" width="200"/>
|
|
|
+ <el-table-column align="left" label="颜色" prop="颜色" width="115"/>
|
|
|
+ <el-table-column align="left" label="物料名称" prop="物料名称" width="170"/>
|
|
|
+ <el-table-column align="left" label="计划门幅" prop="计划门幅" width="115"/>
|
|
|
+ <el-table-column align="left" label="定额门幅" prop="定额门幅" width="115"/>
|
|
|
+ <el-table-column align="left" label="款式" prop="款式" width="115"/>
|
|
|
+ <el-table-column align="left" label="单位" prop="投料单位" width="115"/>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+
|
|
|
+ <el-dialog
|
|
|
+ v-model="order_viewVisible"
|
|
|
+ title="选择打印格式"
|
|
|
+ width="30%"
|
|
|
+ top="10%"
|
|
|
+ :before-close="order_viewCloseDialog"
|
|
|
+ destroy-on-close
|
|
|
+ >
|
|
|
+ <el-form>
|
|
|
+ <el-form-item label="打印方向" label-width="100px">
|
|
|
+ <el-radio-group v-model="printDirection">
|
|
|
+ <el-radio label="纵向">纵向</el-radio>
|
|
|
+ <el-radio label="横向">横向</el-radio>
|
|
|
+ </el-radio-group>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="order_viewCloseDialog">关闭</el-button>
|
|
|
+ <el-button type="primary" @click="confirmPrintDirection">确定打印</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 修改BOM资料 -->
|
|
|
+ <el-dialog v-model="edit_bomdialogFormVisible" :before-close="edit_bomcloseDialog" title="修改BOM资料" width="60%" top="2%" destroy-on-close>
|
|
|
+ <el-descriptions class="margin-top" :column="4" :size="size" border>
|
|
|
+ <el-descriptions-item label="订单编号" class="ddh">{{ ddhformData['ddh'] }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+ <el-divider content-position="left">
|
|
|
+ <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
|
|
|
+ </el-divider>
|
|
|
+ <div style="margin-top: 5px;">
|
|
|
+ <el-table ref="paichengRef"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ highlight-current-row="true"
|
|
|
+ :row-style="{ height: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '0px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ style="width: 100%;height: 60vh" border tooltip-effect="dark"
|
|
|
+ :data="edit_resbomtableData" row-key="ID"
|
|
|
+ :cell-class-name="scfjfpxsCellClass">
|
|
|
+ <template v-for="(item, idx) in edit_resbom_tableColumns">
|
|
|
+ <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width" >
|
|
|
+ <div v-if="['物料名称', '计划用料', '定额用料','计划门幅','定额门幅', '备注'].includes(item.prop)">
|
|
|
+ <el-input v-model="row[item.prop]" :clearable="false"
|
|
|
+ :id="`input${idx}${$index}`" @keyup="resbom_handleKeyDown($event, idx, $index, item.prop)" @input="handleInput($event, row, item.prop)"/>
|
|
|
+ </div>
|
|
|
+ <div v-else>{{ row[item.prop] }}</div>
|
|
|
+ </el-table-column>
|
|
|
+ </template>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
|
|
|
+ <el-button @click="editres_bomcloseDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="editres_bomenterDialog">修改</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 批量修改BOM资料弹窗 -->
|
|
|
+ <el-dialog v-model="res_bomdialogFormVisible" :before-close="res_bomcloseDialog" title="批量新增/更新BOM数据" width="70%" top="1%" destroy-on-close>
|
|
|
+
|
|
|
+ <el-descriptions class="margin-top" :column="4" :size="size" border>
|
|
|
+ <el-descriptions-item label="订单编号">{{ ddhformData['ddh'] }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="客户">{{ ddhformData['kh'] }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="生产款号">{{ ddhformData['sckh'] }}</el-descriptions-item>
|
|
|
+ <el-descriptions-item label="款式">{{ ddhformData['ks'] }}</el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+ <el-descriptions class="margin-top" :column="1" :size="size" border>
|
|
|
+ <el-descriptions-item label="面料" >{{ ddhformData['ml'] }}</el-descriptions-item>
|
|
|
+ </el-descriptions>
|
|
|
+
|
|
|
+ <el-divider content-position="left">
|
|
|
+ <el-button type="primary" icon="plus" @click="add_bomenterDialog">新增一行</el-button>
|
|
|
+ <span style="font-size: 18px;color:red;font-weight: bold;margin-left: 20px;">绿色部分可进行修改</span>
|
|
|
+ </el-divider>
|
|
|
+ <div style="margin-top: 5px;">
|
|
|
+ <el-table ref="paichengRef"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ highlight-current-row="true"
|
|
|
+ :row-style="{ height: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }"
|
|
|
+ :header-row-style="{ height: '0px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ style="width: 100%;height: 58vh"
|
|
|
+ border tooltip-effect="dark"
|
|
|
+ :data="resbomtableData" row-key="ID"
|
|
|
+ :cell-class-name="scfjfpxsCellClass">
|
|
|
+
|
|
|
+ <template v-for="(item, idx) in resbom_tableColumns">
|
|
|
+ <el-table-column #default="{ row, column, $index }" align="left" :label="item.label" :width="item.width">
|
|
|
+
|
|
|
+ <!-- 如果是物料名称且UNIQID没有值,则显示输入框,否则显示内容 -->
|
|
|
+ <div v-if="item.prop === '物料名称'">
|
|
|
+ <el-input
|
|
|
+ v-if="!row.UNIQID"
|
|
|
+ v-model="row[item.prop]"
|
|
|
+ :clearable="false"
|
|
|
+ :id="`input${idx}${$index}`"
|
|
|
+ @input="handleInput($event, row, item.prop)"
|
|
|
+ />
|
|
|
+ <span v-else>{{ row[item.prop] }}</span> <!-- 如果UNIQID有值,则直接显示内容 -->
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div v-else-if="item.prop === '计划入库时间'">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="row['计划入库时间']"
|
|
|
+ type="date"
|
|
|
+ value-format="YYYY-MM-DD"
|
|
|
+ placeholder="选择日期"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 其他列的处理 -->
|
|
|
+ <div v-else-if="['物料分类','计划用料', '定额用料', '计划门幅', '定额门幅', '备注'].includes(item.prop)">
|
|
|
+ <el-input
|
|
|
+ v-model="row[item.prop]"
|
|
|
+ :clearable="false"
|
|
|
+ :id="`input${idx}${$index}`"
|
|
|
+ @input="handleInput($event, row, item.prop)"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <!-- 非输入框列 -->
|
|
|
+ <div v-else>{{ row[item.prop] }}</div>
|
|
|
+
|
|
|
+ </el-table-column>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ <el-table-column fixed="right" label="操作" width="80">
|
|
|
+ <template #default="{ row, $index }">
|
|
|
+ <el-button @click="record_deleteRow(row,$index)" type="danger" size="small"
|
|
|
+ style="font-size: 16px;padding: 0px;width: 60px;background-color: red;">
|
|
|
+ 删除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ <div class="dialog-footer" style="text-align: right;margin-top: 5px;">
|
|
|
+ <el-button @click="res_bomcloseDialog" style="width: 70px;height: 40px;">关闭</el-button>
|
|
|
+ <el-button type="primary" @click="res_bomenterDialog" style="width: 70px;height: 40px;">一键修改</el-button>
|
|
|
+ </div>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+
|
|
|
+ <el-dialog
|
|
|
+ v-model="ddzl_dialogFormVisible"
|
|
|
+ :before-close="dd_closeDialog"
|
|
|
+ title="修改订单资料"
|
|
|
+ class="add-order-dialog"
|
|
|
+ width="90%"
|
|
|
+ top="4vh"
|
|
|
+ destroy-on-close
|
|
|
+ >
|
|
|
+ <el-row :gutter="20" class="add-order-dialog-body">
|
|
|
+ <el-col :xs="24" :md="16" class="add-order-dialog-main">
|
|
|
+ <el-form :model="edit_ddformData" label-width="100px">
|
|
|
+ <el-row :gutter="16">
|
|
|
+ <el-col :xs="24" :sm="12">
|
|
|
+ <el-form-item label="订单编号">
|
|
|
+ <el-input v-model="edit_ddformData['订单编号']" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="生产款号">
|
|
|
+ <el-input
|
|
|
+ v-model="edit_ddformData['生产款号']" id="生产款号"
|
|
|
+ @keydown="add_gdzlent($event, '单位', '生产款号', '订单数量')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="款式">
|
|
|
+ <el-input v-model="edit_ddformData['款式']" id="款式"
|
|
|
+ @keydown="add_gdzlent($event, '订单数量', '款式', '落货日期')" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="12">
|
|
|
+ <el-form-item label="客户编号">
|
|
|
+ <el-input v-model="edit_ddformData['客户编号']" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="订单数量">
|
|
|
+ <el-input v-model="edit_ddformData['订单数量']" id="订单数量"
|
|
|
+ @input="Input_handle()"
|
|
|
+ @keydown="add_gdzlent($event, '生产款号', '订单数量', '款式')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="落货日期">
|
|
|
+ <el-date-picker
|
|
|
+ v-model="edit_ddformData['落货日期']"
|
|
|
+ id="落货日期"
|
|
|
+ type="date"
|
|
|
+ @keydown="add_gdzlent($event, '款式', '落货日期', '面料')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <el-form-item label="面料">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="edit_ddformData['面料']"
|
|
|
+ id="面料"
|
|
|
+ rows="2"
|
|
|
+ resize="none"
|
|
|
+ @keydown="add_gdzlent($event, '落货日期', '面料', '箱唛要求')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="箱唛要求">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ id="箱唛要求"
|
|
|
+ v-model="edit_ddformData['箱唛要求']"
|
|
|
+ @keydown="add_gdzlent($event, '面料', '箱唛要求', '要求')"
|
|
|
+ rows="2"
|
|
|
+ resize="none"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="备注">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ v-model="edit_ddformData['要求']"
|
|
|
+ id="要求"
|
|
|
+ @keydown="add_gdzlent($event, '箱唛要求', '要求', '船样描述')"
|
|
|
+ rows="2"
|
|
|
+ resize="none"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="船样描述">
|
|
|
+ <el-input
|
|
|
+ type="textarea"
|
|
|
+ id="船样描述"
|
|
|
+ @keydown="add_gdzlent($event, '要求', '船样描述', '船样合计')"
|
|
|
+ v-model="edit_ddformData['船样描述']"
|
|
|
+ rows="1"
|
|
|
+ resize="none"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ <el-row :gutter="10" class="add-order-bottom-row">
|
|
|
+ <el-col :xs="24" :sm="8">
|
|
|
+ <el-form-item label="船样合计" label-width="100px">
|
|
|
+ <el-input v-model="edit_ddformData['船样合计']" id="船样合计"
|
|
|
+ @input="Input_handle()"
|
|
|
+ @keydown="add_gdzlent($event, '船样描述', '船样合计', '粘衬')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="10">
|
|
|
+ <el-form-item label="粘衬" label-width="60px">
|
|
|
+ <el-input v-model="edit_ddformData['粘衬']" id="粘衬"
|
|
|
+ @keydown="add_gdzlent($event, '船样合计', '粘衬', '单位')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :sm="6">
|
|
|
+ <el-form-item label="单位" label-width="70px">
|
|
|
+ <el-input v-model="edit_ddformData['单位']" id="单位"
|
|
|
+ @keydown="add_gdzlent($event, '粘衬', '单位', '生产款号')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ </el-col>
|
|
|
+ <el-col :xs="24" :md="8" class="add-order-dialog-side">
|
|
|
+ <div class="add-order-upload-wrap">
|
|
|
+ <el-upload
|
|
|
+ ref="uploadRef"
|
|
|
+ class="upload-demo add-order-upload"
|
|
|
+ :action="uploadUrl"
|
|
|
+ :http-request="customUpload"
|
|
|
+ :headers="uploadHeaders"
|
|
|
+ list-type="picture-card"
|
|
|
+ :on-preview="handlePreview"
|
|
|
+ :on-remove="handleRemove"
|
|
|
+ :before-upload="beforeUpload"
|
|
|
+ :on-success="handleSuccess"
|
|
|
+ :on-error="handleError"
|
|
|
+ :file-list="fileList"
|
|
|
+ :limit="1"
|
|
|
+ accept="image/jpeg,image/png"
|
|
|
+ >
|
|
|
+ <el-icon class="add-order-upload-plus"><Plus /></el-icon>
|
|
|
+ </el-upload>
|
|
|
+ <div class="add-order-upload-title">上传图片</div>
|
|
|
+ </div>
|
|
|
+ <el-form label-width="100px">
|
|
|
+ <el-form-item label="制单人">
|
|
|
+ <el-input v-model="edit_ddformData['Sys_id']" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="制单日期">
|
|
|
+ <el-date-picker v-model="edit_ddformData['Sys_rq']" id="制单日期" disabled type="date" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <!-- <el-tag><span style="font-size: 18px;margin-left: 10px;">关联订单面料明细</span></el-tag>
|
|
|
+ <el-table ref="multipleTable"
|
|
|
+ :row-style="{ height: '30px' }"
|
|
|
+ :cell-style="{ padding: '0px' }" :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :cell-class-name="planUsageCellClass"
|
|
|
+ highlight-current-row="true"
|
|
|
+ style="width: 100%;height: 30vh" border tooltip-effect="dark" :data="edit_zsglddtableData" row-key="ID">
|
|
|
+ <el-table-column align="left" label="订单编号" prop="订单编号" width="110"/>
|
|
|
+ <el-table-column align="left" label="BOM_物料编码" prop="BOM_物料编码" width="200"/>
|
|
|
+ <el-table-column align="left" label="生产款号" prop="生产款号" width="200"/>
|
|
|
+ <el-table-column align="left" label="颜色" prop="颜色" width="115"/>
|
|
|
+ <el-table-column align="left" label="物料名称" prop="物料名称" width="170"/>
|
|
|
+ <el-table-column align="left" label="计划门幅" prop="计划门幅" width="115"/>
|
|
|
+ <el-table-column align="left" label="定额门幅" prop="定额门幅" width="115"/>
|
|
|
+ <el-table-column align="left" label="款式" prop="款式" width="115" />
|
|
|
+
|
|
|
+ <el-table-column fixed="right" label="操作" width="120">
|
|
|
+ <template #default="{ row, $index }">
|
|
|
+ <el-button @click="edit_deleteRow($index)" type="text" size="small">
|
|
|
+ 移除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+
|
|
|
+ </el-table> -->
|
|
|
+ <!-- 底部操作按钮 -->
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer" style="text-align: right;">
|
|
|
+ <el-button @click="dd_closeDialog">取消</el-button>
|
|
|
+ <el-button type="primary" @click="dd_edit_Dialog">确定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+
|
|
|
+ <!-- 新增颜色资料弹窗 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="add_gdyjdialogFormVisible"
|
|
|
+ :before-close="add_gdyjcloseDialog"
|
|
|
+ style="width: 73%; max-height: 80%; overflow-y: auto; margin-top: 4%;"
|
|
|
+ :title="'新增颜色资料'"
|
|
|
+ destroy-on-close>
|
|
|
+ <el-form label-width="100px" :model="add_yszlformdata">
|
|
|
+ <el-row :gutter="24" class="form-row">
|
|
|
+ <el-col :span="10">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号 {{_ddhval}}</h3>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form-item label="订单子编号:" class="mab" prop="keyOrder" id ='订单子编号' label-width='110'>
|
|
|
+ <el-input v-model="add_yszlformdata.ddzbh" disabled style="width: 250px;" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="24" class="form-row">
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form-item label="色系名称:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
+ <el-select
|
|
|
+ v-model="add_yszlformdata.sxmc" style="width: 150px;" id="色系名称"
|
|
|
+ @keydown="add_gdzlent($event, '', '色系名称', '款号:')">
|
|
|
+ <el-option
|
|
|
+ v-for="color in getSuborderscolor.colorlist"
|
|
|
+ :key="color.id"
|
|
|
+ :label="color.colorname"
|
|
|
+ :value="color.colorname"
|
|
|
+ @click="xz_sxhandleSizeChange(color.colorname,color.colorcode)">
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form-item label="PO号:" class="mab" prop="keyOrder" label-width="110">
|
|
|
+ <el-input v-model="add_yszlformdata.kh" style="width: 250px;" id ='款号:' @keydown="add_gdzlent($event, '色系名称', '款号:', '颜色备注')"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="24" class="form-row">
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="颜色备注:" prop="joinDate" label-width='110'>
|
|
|
+ <el-input v-model="add_yszlformdata.ysbz" style="width: 250px;" id ='颜色备注' @keydown="add_gdzlent($event, '款号:', '颜色备注', '是否船样')"/>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+
|
|
|
+ <el-col :span="8">
|
|
|
+ <el-form-item label="是否船样:" prop="joinDate" label-width='230'>
|
|
|
+ <el-select v-model="add_yszlformdata.sfcy" style="width: 150px;" id ='是否船样' @keydown="add_gdzlent($event, '颜色备注', '是否船样', 'cm1')">
|
|
|
+ <el-option label="是" value="是" @click="cyChange('是')"></el-option>
|
|
|
+ <el-option label="否" value="否" @click="cyChange('否')"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="24" class="form-row">
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="尺码:" class="mab" prop="keyOrder" label-width="110">
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm1"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm1"
|
|
|
+ @input="handleSizeInput('cm1')"
|
|
|
+ @keydown="add_gdzlent($event, '', 'cm1', 'cm2')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm2"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm2"
|
|
|
+ @input="handleSizeInput('cm2')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm1', 'cm2', 'cm3')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm3"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm3"
|
|
|
+ @input="handleSizeInput('cm3')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm2', 'cm3', 'cm4')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm4"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm4"
|
|
|
+ @input="handleSizeInput('cm4')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm3', 'cm4', 'cm5')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm5"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm5"
|
|
|
+ @input="handleSizeInput('cm5')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm4', 'cm5', 'cm6')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm6"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm6"
|
|
|
+ @input="handleSizeInput('cm6')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm5', 'cm6', 'cm7')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm7"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm7"
|
|
|
+ @input="handleSizeInput('cm7')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm6', 'cm7', 'cm8')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm8"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm8"
|
|
|
+ @input="handleSizeInput('cm8')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm7', 'cm8', 'cm9')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm9"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm9"
|
|
|
+ @input="handleSizeInput('cm9')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm8', 'cm9', 'cm10')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm10"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm10"
|
|
|
+ @input="handleSizeInput('cm10')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm9', 'cm10', 'cm11')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm11"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm11"
|
|
|
+ @input="handleSizeInput('cm11')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm10', 'cm11', 'cm12')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm12"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm12"
|
|
|
+ @input="handleSizeInput('cm12')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm11', 'cm12', 'cm13')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm13"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm13"
|
|
|
+ @input="handleSizeInput('cm13')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm12', 'cm13', 'cm14')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.cm14"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="cm14"
|
|
|
+ @input="handleSizeInput('cm14')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm13', 'cm14', 'sctotal')"
|
|
|
+ />
|
|
|
+ <el-input
|
|
|
+ v-model="cmformdata.sctotal"
|
|
|
+ style="width: 80px;"
|
|
|
+ id="sctotal"
|
|
|
+ @input="handleSizeInput('sctotal')"
|
|
|
+ @keydown="add_gdzlent($event, 'cm14', 'sctotal', 'zds1')"
|
|
|
+ />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+ <el-row :gutter="24" class="form-row">
|
|
|
+ <el-col :span="24">
|
|
|
+ <el-form-item label="制单数:" class="mab" prop="keyOrder" label-width='110'>
|
|
|
+ <el-input v-model="zdsformdata.zds1" @input="updateTotal" style="width: 80px;" id ='zds1' @keydown="add_gdzlent($event, 'cm14', 'zds1', 'zds2')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds2" @input="updateTotal" style="width: 80px;" id ='zds2' @keydown="add_gdzlent($event, 'zds1', 'zds2', 'zds3')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds3" @input="updateTotal" style="width: 80px;" id ='zds3' @keydown="add_gdzlent($event, 'zds2', 'zds3', 'zds4')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds4" @input="updateTotal" style="width: 80px;" id ='zds4' @keydown="add_gdzlent($event, 'zds3', 'zds4', 'zds5')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds5" @input="updateTotal" style="width: 80px;" id ='zds5' @keydown="add_gdzlent($event, 'zds4', 'zds5', 'zds6')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds6" @input="updateTotal" style="width: 80px;" id ='zds6' @keydown="add_gdzlent($event, 'zds5', 'zds6', 'zds7')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds7" @input="updateTotal" style="width: 80px;" id ='zds7' @keydown="add_gdzlent($event, 'zds6', 'zds7', 'zds8')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds8" @input="updateTotal" style="width: 80px;" id ='zds8' @keydown="add_gdzlent($event, 'zds7', 'zds8', 'zds9')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds9" @input="updateTotal" style="width: 80px;" id ='zds9' @keydown="add_gdzlent($event, 'zds8', 'zds9', 'zds10')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds10" @input="updateTotal" style="width: 80px;" id ='zds10' @keydown="add_gdzlent($event, 'zds9', 'zds10', 'zds11')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds11" @input="updateTotal" style="width: 80px;" id ='zds11' @keydown="add_gdzlent($event, 'zds10', 'zds11', 'zds12')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds12" @input="updateTotal" style="width: 80px;" id ='zds12' @keydown="add_gdzlent($event, 'zds11', 'zds12', 'zds13')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds13" @input="updateTotal" style="width: 80px;" id ='zds13' @keydown="add_gdzlent($event, 'zds12', 'zds13', 'zds14')"/>
|
|
|
+ <el-input v-model="zdsformdata.zds14" @input="updateTotal" style="width: 80px;" id ='zds14' @keydown="add_gdzlent($event, 'zds13', 'zds14', '色系名称')"/>
|
|
|
+ <el-input v-model="zdsformdata.zdtotal" readonly style="width: 80px;" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+
|
|
|
+
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer" style="display: flex; justify-content: flex-end; padding: 10px;">
|
|
|
+ <el-button type="primary" @click="add_dyjcloseDialog">取消</el-button>
|
|
|
+ <el-button type="primary" @click="add_gdyjenterDialog">确定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 新增工序资料-->
|
|
|
+ <el-dialog v-model="visible" :before-close="()=> visible = false" style="width: 25%;margin: 10% auto" :title="'新增工序资料'" destroy-on-close>
|
|
|
+ <el-form>
|
|
|
+ <div>
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <h3 style="color:red;font-size: 24px;margin:0px 0px 0px 15px;">订单号 {{_ddhval}}</h3>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="仓库出库:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
+ <el-checkbox v-model="form['仓库出库']"></el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="裁切:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
+ <el-checkbox v-model="form['裁切']"></el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="车缝:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
+ <el-checkbox v-model="form['车缝']"></el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="后道收样:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
+ <el-checkbox v-model="form['后道收样']"></el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="大烫:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
+ <el-checkbox v-model="form['大烫']"></el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="总检:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
+ <el-checkbox v-model="form['总检']"></el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <el-form-item label="包装:" class="mab" prop="isBanciSelected" label-width="110">
|
|
|
+ <el-checkbox v-model="form['包装']"></el-checkbox>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer" style="text-align: right;top: auto;">
|
|
|
+ <el-button @click="add_gxcloseDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="add_gxenterDialog">确 定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 新增部件资料弹窗 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="partAddDialogVisible"
|
|
|
+ :title="partIsEdit ? '修改部件' : '新增部件'"
|
|
|
+ width="900px"
|
|
|
+ top="5%"
|
|
|
+ :fullscreen="false"
|
|
|
+ class="part-add-dialog"
|
|
|
+ destroy-on-close
|
|
|
+ >
|
|
|
+ <div v-if="_Gd_gdbh" class="list-dialog-context-header" style="margin-bottom: 15px;">
|
|
|
+ <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0" style="width: 100%;">
|
|
|
+ <tbody>
|
|
|
+ <tr>
|
|
|
+ <th scope="row" style="width: 80px;">订单编号</th>
|
|
|
+ <td>{{ _Gd_gdbh }}</td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ <el-form
|
|
|
+ v-if="partIsEdit"
|
|
|
+ ref="partFormRef"
|
|
|
+ :model="partAddForm"
|
|
|
+ label-width="0"
|
|
|
+ class="list-part-edit-form"
|
|
|
+ >
|
|
|
+ <div class="list-part-edit-table-wrap">
|
|
|
+ <el-table
|
|
|
+ :data="[partAddForm]"
|
|
|
+ border
|
|
|
+ class="list-part-add-table"
|
|
|
+ style="width: 100%;"
|
|
|
+ >
|
|
|
+ <el-table-column label="部件序号" width="120" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件序号" disabled placeholder="已保存序号" style="width: 80px;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件编号" width="150">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件名称" min-width="200">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-select
|
|
|
+ v-model="row.部件名称"
|
|
|
+ placeholder="请选择或输入部件名称"
|
|
|
+ filterable
|
|
|
+ allow-create
|
|
|
+ reserve-keyword
|
|
|
+ clearable
|
|
|
+ style="width: 100%;"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="opt in partNameOptions"
|
|
|
+ :key="opt"
|
|
|
+ :label="opt"
|
|
|
+ :value="opt"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件类型" width="150">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件备注" min-width="150">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" width="80" align="center">
|
|
|
+ <template #default="{ $index }">
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="small"
|
|
|
+ @click="removePartRow($index)"
|
|
|
+ :disabled="partAddRows.length <= 1"
|
|
|
+ >
|
|
|
+ 移除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </el-form>
|
|
|
+ <div v-else class="list-part-add-batch">
|
|
|
+ <p class="list-part-hint" style="color:red; margin-bottom: 15px;">在选择部件名称后会自动增加新行。</p>
|
|
|
+ <el-table
|
|
|
+ :data="partAddRows"
|
|
|
+ border
|
|
|
+ style="width: 100%;"
|
|
|
+ >
|
|
|
+ <el-table-column label="部件序号" width="120" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件序号" disabled placeholder="部件序号" style="width: 80px;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件编号" width="150">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件编号" placeholder="部件编号" style="width: 100%;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件名称" min-width="200">
|
|
|
+ <template #default="{ row, $index }">
|
|
|
+ <el-select
|
|
|
+ v-model="row.部件名称"
|
|
|
+ placeholder="请选择或输入部件名称"
|
|
|
+ filterable
|
|
|
+ allow-create
|
|
|
+ reserve-keyword
|
|
|
+ clearable
|
|
|
+ style="width: 100%;"
|
|
|
+ @change="onPartNameChange($index)"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="opt in partNameOptions"
|
|
|
+ :key="opt"
|
|
|
+ :label="opt"
|
|
|
+ :value="opt"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件类型" width="150">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件类型" placeholder="部件类型" style="width: 100%;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="部件备注" min-width="150">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input v-model="row.部件备注" placeholder="部件备注" style="width: 100%;" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" width="80" align="center">
|
|
|
+ <template #default="{ $index }">
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="small"
|
|
|
+ @click="removePartRow($index)"
|
|
|
+ :disabled="partAddRows.length <= 1"
|
|
|
+ >
|
|
|
+ 移除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer" style="text-align: right;">
|
|
|
+ <el-button @click="partAddCloseDialog">取消</el-button>
|
|
|
+ <el-button type="primary" @click="partAddConfirm">{{ partIsEdit ? '保存' : '确定' }}</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 新增工艺资料弹窗 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="processAddDialogVisible"
|
|
|
+ :title="processIsEdit ? '修改工艺' : '新增工艺'"
|
|
|
+ :width="'min(1280px, 90vw)'"
|
|
|
+ align-center
|
|
|
+ destroy-on-close
|
|
|
+ append-to-body
|
|
|
+ :class="['list-unified-dialog', 'list-process-add-dialog']"
|
|
|
+ @closed="resetProcessLibForm"
|
|
|
+ >
|
|
|
+ <div v-if="_Gd_gdbh" class="list-dialog-context-header">
|
|
|
+ <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
|
|
|
+ <tbody>
|
|
|
+ <tr>
|
|
|
+ <th scope="row">订单编号</th>
|
|
|
+ <td>{{ _Gd_gdbh }}</td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ <p class="list-process-add-split-hint">
|
|
|
+ <strong>车缝工艺选部件</strong>,工艺与部件绑定;<strong>其余工序工艺不选部件</strong>。选择查询工艺名称后自动带出标准工时、标准工分。
|
|
|
+ </p>
|
|
|
+ <div class="list-process-add-scroll-body">
|
|
|
+ <div class="list-process-add-split">
|
|
|
+ <div class="list-process-add-sidebar">
|
|
|
+ <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
|
|
|
+ <div class="list-process-add-part-list list-process-add-stage-list">
|
|
|
+ <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="st">
|
|
|
+ <div
|
|
|
+ class="list-process-add-stage-item"
|
|
|
+ :class="{
|
|
|
+ 'is-active':
|
|
|
+ processAddSelectedStage === st && (st !== '车缝' || !processAddPartList.length),
|
|
|
+ }"
|
|
|
+ @click="onProcessAddSelectStage(st)"
|
|
|
+ >
|
|
|
+ {{ st }}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ v-if="st === '车缝' && processAddPartList.length"
|
|
|
+ class="list-process-add-sewing-nest"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ v-for="(part, pi) in processAddPartList"
|
|
|
+ :key="processAddPartBlockKey(part, pi)"
|
|
|
+ class="list-process-add-part-item list-process-add-part-item--nest"
|
|
|
+ :class="{
|
|
|
+ 'is-active':
|
|
|
+ processAddSelectedStage === '车缝' &&
|
|
|
+ processAddSelectedPartKey === processAddPartBlockKey(part, pi),
|
|
|
+ }"
|
|
|
+ @click.stop="onProcessAddSelectSewingPart(part, pi)"
|
|
|
+ >
|
|
|
+ <div class="list-process-add-part-item-text">
|
|
|
+ <span class="list-process-add-part-sort">序号 {{ part.part_sort ?? part['部件序号'] ?? '—' }}</span>
|
|
|
+ <span
|
|
|
+ class="list-process-add-part-name"
|
|
|
+ :title="String(part.part_name ?? part['部件名称'] ?? '')"
|
|
|
+ >
|
|
|
+ {{ part.part_name ?? part['部件名称'] ?? '—' }}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="list-process-add-main-panel">
|
|
|
+ <template v-if="processAddCurrentRowKey">
|
|
|
+ <div v-if="processAddSelectedStage !== '车缝'" class="list-process-add-main-head">
|
|
|
+ 当前工序:<strong>{{ processAddSelectedStage }}</strong>
|
|
|
+ <span class="list-process-add-main-head-sub">(不关联部件)</span>
|
|
|
+ </div>
|
|
|
+ <div v-else class="list-process-add-main-head">
|
|
|
+ 车缝 · 当前部件:<strong>{{
|
|
|
+ processAddActivePart?.part_name ?? processAddActivePart?.['部件名称'] ?? '—'
|
|
|
+ }}</strong>
|
|
|
+ <span class="list-process-add-main-head-sub">
|
|
|
+ (序号 {{ processAddActivePart?.part_sort ?? processAddActivePart?.['部件序号'] ?? '—' }})
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div class="list-process-add-table-wrap">
|
|
|
+ <el-table
|
|
|
+ :data="processAddByPartRows[processAddCurrentRowKey] ?? []"
|
|
|
+ border
|
|
|
+ class="list-process-add-table"
|
|
|
+ :row-key="(row) => row._key"
|
|
|
+ :height="processAddDialogTableHeight"
|
|
|
+ >
|
|
|
+ <el-table-column label="工艺序号" width="120" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span class="list-serial-cell-text">{{ row['工艺序号'] || '—' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="工艺名称" min-width="200">
|
|
|
+ <template #default="{ row, $index }">
|
|
|
+ <el-select
|
|
|
+ v-model="row['工艺名称']"
|
|
|
+ class="list-lib-name-select"
|
|
|
+ popper-class="process-lib-select-dropdown"
|
|
|
+ placeholder="请选择或输入工艺名称"
|
|
|
+ filterable
|
|
|
+ remote
|
|
|
+ reserve-keyword
|
|
|
+ allow-create
|
|
|
+ default-first-option
|
|
|
+ clearable
|
|
|
+ :remote-method="onProcessLibSelectFilter"
|
|
|
+ @visible-change="onProcessLibSelectVisible"
|
|
|
+ @change="onProcessLibNameSelectChangeForPart(processAddCurrentRowKey, $index)"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="opt in filteredProcessLibNameOptionsForProcessAdd"
|
|
|
+ :key="opt.value"
|
|
|
+ :label="opt.value"
|
|
|
+ :value="opt.value"
|
|
|
+ >
|
|
|
+ <div class="process-lib-opt-two-col">
|
|
|
+ <span class="process-lib-opt-name" :title="String(opt.value)">{{ opt.value }}</span>
|
|
|
+ <span class="process-lib-opt-stage">{{ processLibOptStageText(opt) }}</span>
|
|
|
+ </div>
|
|
|
+ </el-option>
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="生产工序" min-width="120" show-overflow-tooltip>
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span class="list-process-cell-plain">{{ row['生产工序'] || '—' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="标准工时" width="118">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input-number v-model="row['标准工时']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="标准工分" width="118">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input-number v-model="row['标准工分']" :min="0" :precision="2" :step="0.5" controls-position="right" style="width: 100%" />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="难度系数" width="110">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-input-number
|
|
|
+ v-model="row['难度系数']"
|
|
|
+ :min="0"
|
|
|
+ :precision="2"
|
|
|
+ :step="0.1"
|
|
|
+ controls-position="right"
|
|
|
+ style="width: 100%"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" width="72" align="center">
|
|
|
+ <template #default="{ row, $index }">
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ link
|
|
|
+ size="small"
|
|
|
+ @click="removeProcessLibRowForPart(processAddCurrentRowKey, row, $index)"
|
|
|
+ >
|
|
|
+ 移除
|
|
|
+ </el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <template v-else-if="processAddSelectedStage === '车缝' && !processAddPartList.length">
|
|
|
+ <el-empty
|
|
|
+ description="车缝需先有部件。请先在「部件资料」中新增部件后再编辑车缝工艺"
|
|
|
+ :image-size="72"
|
|
|
+ class="list-process-add-main-empty"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <el-empty
|
|
|
+ v-else
|
|
|
+ description="请在左侧选择生产工序;车缝时请选择具体部件"
|
|
|
+ :image-size="72"
|
|
|
+ class="list-process-add-main-empty"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="list-process-meta">将提交 {{ processLibAddSubmitCount }} 条</div>
|
|
|
+ <template #footer>
|
|
|
+ <el-button @click="processAddCloseDialog">取消</el-button>
|
|
|
+ <el-button type="primary" :loading="processSubmitLoading" @click="processAddConfirm">确定</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 部件与工艺排序弹窗 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="sortPartGyDialogVisible"
|
|
|
+ title="调整部件 / 工艺序号排序"
|
|
|
+ :width="'min(1280px, 90vw)'"
|
|
|
+ :max-height="'85vh'"
|
|
|
+ align-center
|
|
|
+ destroy-on-close
|
|
|
+ append-to-body
|
|
|
+ :class="['list-unified-dialog', 'list-process-add-dialog', 'sort-part-gy-dialog']"
|
|
|
+ @closed="onSortPartGyDialogClosed"
|
|
|
+ >
|
|
|
+ <div v-if="_Gd_gdbh" class="list-dialog-context-header">
|
|
|
+ <table class="list-dialog-kv-table" cellspacing="0" cellpadding="0">
|
|
|
+ <tbody>
|
|
|
+ <tr>
|
|
|
+ <th scope="row">订单编号</th>
|
|
|
+ <td>{{ _Gd_gdbh }}</td>
|
|
|
+ </tr>
|
|
|
+ </tbody>
|
|
|
+ </table>
|
|
|
+ </div>
|
|
|
+ <div class="sort-part-gy-hint" role="note">
|
|
|
+ <ul class="sort-part-gy-hint-list">
|
|
|
+ <li>
|
|
|
+ <strong>左侧</strong>:与「新增工艺」一致,一级为生产工序(裁剪 → 车缝 → 手工 → 大烫 → 总检);仅<strong>车缝</strong>下可拖拽调整部件先后,点击部件后右侧排该车缝工艺。
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <strong>非车缝工序</strong>:点选后右侧为该工单下、不关联部件的工艺;<strong>右侧工艺表</strong>可拖拽「拖」列、改工艺名等。
|
|
|
+ </li>
|
|
|
+ <li>
|
|
|
+ <strong>保存</strong>:按当前顺序重编部件号与工艺号,并提交变更。
|
|
|
+ </li>
|
|
|
+ </ul>
|
|
|
+ </div>
|
|
|
+ <div v-loading="sortDialogLoading" class="sort-part-gy-body">
|
|
|
+ <template v-if="!sortDialogLoading && !sortDialogHasData">
|
|
|
+ <el-empty description="当前工单下暂无工艺数据" />
|
|
|
+ </template>
|
|
|
+ <div v-else class="sort-part-gy-split list-process-add-split">
|
|
|
+ <div class="list-process-add-sidebar sort-gy-left-nav">
|
|
|
+ <div class="list-process-add-sidebar-title">生产工序 / 部件</div>
|
|
|
+ <div class="list-process-add-part-list list-process-add-stage-list list-sort-gy-nav-list">
|
|
|
+ <template v-for="st in PROCESS_ADD_STAGE_ORDER" :key="'sort-nav-' + st">
|
|
|
+ <div
|
|
|
+ class="list-process-add-stage-item"
|
|
|
+ :class="{
|
|
|
+ 'is-active': sortDialogViewStage === st && (st !== '车缝' || !sortDialogSewingGroups.length),
|
|
|
+ }"
|
|
|
+ @click="onSortDialogViewStageSelect(st)"
|
|
|
+ >
|
|
|
+ {{ st }}
|
|
|
+ </div>
|
|
|
+ <div
|
|
|
+ v-if="st === '车缝' && sortDialogSewingGroups.length"
|
|
|
+ class="list-process-add-sewing-nest list-sort-gy-sewing-parts"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ v-for="(sg, spi) in sortDialogSewingGroups"
|
|
|
+ :key="String(sg.part?.id ?? `sg-${spi}`)"
|
|
|
+ class="list-process-add-part-item list-process-add-part-item--nest sort-part-gy-part-item"
|
|
|
+ :class="{
|
|
|
+ 'is-active':
|
|
|
+ sortDialogViewStage === '车缝' &&
|
|
|
+ sortDialogSelectedPartId != null &&
|
|
|
+ String(sortDialogSelectedPartId) === String(sg.part?.id),
|
|
|
+ }"
|
|
|
+ title="拖拽或点击"
|
|
|
+ @click.stop="onSortDialogSelectSewingPart(sg.part?.id)"
|
|
|
+ >
|
|
|
+ <span class="sort-part-gy-part-item-grip" aria-hidden="true">
|
|
|
+ <el-icon><Rank /></el-icon>
|
|
|
+ </span>
|
|
|
+ <div class="list-process-add-part-item-text">
|
|
|
+ <span class="list-process-add-part-sort">序号 {{ sg.part?.part_sort ?? '—' }}</span>
|
|
|
+ <span
|
|
|
+ class="list-process-add-part-name"
|
|
|
+ :title="String(sg.part?.部件名称 ?? '')"
|
|
|
+ >
|
|
|
+ {{ sg.part?.部件名称 ?? '—' }}
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <div class="sort-part-gy-main-panel">
|
|
|
+ <template v-if="sortDialogViewStage && sortDialogRightPanelReady">
|
|
|
+ <div v-if="sortDialogViewStage !== '车缝'" class="sort-part-gy-main-head list-process-add-main-head">
|
|
|
+ 当前工序:<strong>{{ sortDialogViewStage }}</strong>
|
|
|
+ <span class="list-process-add-main-head-sub">(不关联部件)</span>
|
|
|
+ </div>
|
|
|
+ <div v-else-if="sortDialogRightActiveSewingGroup" class="sort-part-gy-main-head list-process-add-main-head">
|
|
|
+ 车缝 · 当前部件:<strong>{{
|
|
|
+ sortDialogRightActiveSewingGroup.part?.部件名称 ?? '—'
|
|
|
+ }}</strong>
|
|
|
+ <span class="list-process-add-main-head-sub">
|
|
|
+ (序号 {{ sortDialogRightActiveSewingGroup.part?.part_sort ?? '—' }})
|
|
|
+ </span>
|
|
|
+ </div>
|
|
|
+ <div v-else class="sort-part-gy-main-head list-process-add-main-head--warn">请在「车缝」下选择一个部件,或先维护部件资料。</div>
|
|
|
+ <el-table
|
|
|
+ v-if="sortDialogActiveGysList.length"
|
|
|
+ :data="sortDialogActiveGysList"
|
|
|
+ border
|
|
|
+ size="small"
|
|
|
+ class="sort-gy-table"
|
|
|
+ :row-key="(row) => String(row.id ?? `${row.gy_sort}-${row.gy_name}`)"
|
|
|
+ >
|
|
|
+ <el-table-column width="44" align="center" fixed="left">
|
|
|
+ <template #header><span class="sort-drag-col-hint">拖</span></template>
|
|
|
+ <template #default>
|
|
|
+ <span class="sort-drag-handle" title="拖拽调整工艺顺序">
|
|
|
+ <el-icon><Rank /></el-icon>
|
|
|
+ </span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="工艺序号" width="88" align="center">
|
|
|
+ <template #default="{ row: r }"> {{ r.gy_sort ?? r['工艺序号'] ?? '—' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="工艺名称" min-width="220">
|
|
|
+ <template #default="{ row: r }">
|
|
|
+ <span :title="r['工艺名称'] || ''">{{ r['工艺名称'] || '—' }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="标准工时" width="100" align="center">
|
|
|
+ <template #default="{ row: r }"> {{ r['标准工时'] || '—' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="标准工分" width="100" align="center">
|
|
|
+ <template #default="{ row: r }"> {{ r['标准公分'] || r['标准工分'] || '—' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="难度系数" width="120" align="center">
|
|
|
+ <template #default="{ row: r }"> {{ r['系数'] || r['难度系数'] || '—' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="生产工序" width="100" align="center" prop="big_process" show-overflow-tooltip />
|
|
|
+ </el-table>
|
|
|
+ <el-empty
|
|
|
+ v-else
|
|
|
+ :description="sortDialogViewStage === '车缝' ? '该部件下暂无车缝工艺' : '该工序下暂无工艺'"
|
|
|
+ :image-size="64"
|
|
|
+ class="sort-part-gy-main-empty"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ <el-empty
|
|
|
+ v-else
|
|
|
+ description="请先在左侧选择生产工序,车缝时请选择具体部件"
|
|
|
+ :image-size="72"
|
|
|
+ class="sort-part-gy-main-empty"
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer" style="text-align: right;">
|
|
|
+ <el-button @click="sortCloseDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" :loading="sortDialogSubmitLoading" @click="submitSortPartGy">保存排序</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 附件上传 -->
|
|
|
+ <el-dialog v-model="jsfjdialogFormVisible" :before-close="jsfjcloseDialog"
|
|
|
+ style="margin-top: 40px" height="500px" width="700px" destroy-on-close>
|
|
|
+ <el-form :model="jsfjformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
|
|
|
+ <el-row :gutter="24">
|
|
|
+ <el-col :span="10">
|
|
|
+ <div style="display: flex; gap: 0px;">
|
|
|
+ <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号 {{_ddhval}}</h3>
|
|
|
+ </div>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <br />
|
|
|
+ <el-row :gutter="24">
|
|
|
+ <el-col :span="16">
|
|
|
+ <el-form-item label="附件备注:" prop="address" class="mab">
|
|
|
+ <el-select v-model="jsfjformdata.附件备注" placeholder="请选择附件类型" id="附件备注">
|
|
|
+ <el-option label="订单附件" value="订单资料附件"></el-option>
|
|
|
+ <el-option label="技术附件" value="技术附件"></el-option>
|
|
|
+ <el-option label="发货单附件" value="发货单附件"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ <br>
|
|
|
+ <el-row :gutter="24">
|
|
|
+ <!-- <el-col :span="8">
|
|
|
+ <br>
|
|
|
+ <p>s</p>
|
|
|
+ </el-col> -->
|
|
|
+ <el-col :span="12">
|
|
|
+ <!-- <br> -->
|
|
|
+ <el-form-item label="附件备注:" prop="address" class="mab">
|
|
|
+ <input style="font-size:16px;" type="file" @change="uploadExcel" >
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <!-- <el-col :span="4">
|
|
|
+ <br>
|
|
|
+ <el-button @click="yulan">预览</el-button>
|
|
|
+ </el-col> -->
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <br>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="jsfjcloseDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="jsfjenterDialog">确 定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 复制工艺资料弹窗 -->
|
|
|
+ <el-dialog v-model="copyProductDialogVisible" title="复制工艺资料">
|
|
|
+ <div style=" padding: 0px; align-items: center; display: flex; flex-wrap: wrap;">
|
|
|
+ <el-form-item label="当前订单" prop="processName" class="mab">
|
|
|
+ <el-input v-model="copyProductFormData['gdbh']" disabled style="width: 150px;" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="生产款号" prop="生产款号" class="mab">
|
|
|
+ <el-input v-model="copyProductFormData['生产款号']" disabled style="width: 200px;" />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="搜索订单" prop="processName" class="mab" style="width: 50%;">
|
|
|
+ <el-input v-model="copyProductSearchText" placeholder="请输入订单编号或生产款号搜索" style="width: 70%;" @keydown.enter.prevent="copyProductSearch" />
|
|
|
+ <el-button type="primary" @click="copyProductSearch" style="margin-left: 10px;">搜索</el-button>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item prop="processName" class="mab" style="width: 100%;">
|
|
|
+ <span style="color:red">请选择要复制工艺的源订单</span>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ <div slot="footer" class="dialog-footer" style="text-align: right;margin-left: 25%">
|
|
|
+ <el-button @click="copyProductHandleCancel">放弃</el-button>
|
|
|
+ <el-button type="primary" @click="copyProductHandleConfirm" :disabled="!copyProductSelectedRow">复制</el-button>
|
|
|
+ </div>
|
|
|
+ <el-table ref="copyProductTableRef"
|
|
|
+ :show-overflow-tooltip="true"
|
|
|
+ :row-style="{ height: '0px' }"
|
|
|
+ :cell-style="{ padding: '0px' }"
|
|
|
+ :header-row-style="{ height: '0px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ @row-click="copyProductTableRowClick"
|
|
|
+ highlight-current-row="true"
|
|
|
+ style="width: 100%;height: 30vh;" border tooltip-effect="dark"
|
|
|
+ :data="copyProductTableData" row-key="订单编号">
|
|
|
+ <el-table-column align="left" label="订单编号" width="120">
|
|
|
+ <template v-slot="{ row }"><span>{{ row.订单编号 }}</span></template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column align="left" label="生产款号" width="200">
|
|
|
+ <template v-slot="{ row }"><span>{{ row.生产款号 }}</span></template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column align="left" label="客户编号" width="100">
|
|
|
+ <template v-slot="{ row }"><span>{{ row.客户编号 }}</span></template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column align="left" label="款式" width="150">
|
|
|
+ <template v-slot="{ row }"><span>{{ row.款式 }}</span></template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 面料库存弹窗 -->
|
|
|
+ <el-dialog v-model="mlinventoryVisible" :before-close="mlcloseDialog" title="面料库存出入库记录"
|
|
|
+ style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
|
|
|
+ <el-form :model="mlformdata" label-position="right" ref="elFormRef" :rules="rule" label-width="90px">
|
|
|
+ <el-table
|
|
|
+ ref="table"
|
|
|
+ highlight-current-row
|
|
|
+ show-overflow-tooltip
|
|
|
+ border
|
|
|
+ :data="historytableData"
|
|
|
+ :row-style="{ height: '25px' }"
|
|
|
+ :cell-style="{ padding: '0px' }"
|
|
|
+ :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ style="width: 100%;height: 75vh;" >
|
|
|
+
|
|
|
+ <el-table-column label="订单编号" prop="订单编号"width="110" ></el-table-column>
|
|
|
+ <el-table-column label="面料" prop="面料" width="110"></el-table-column>
|
|
|
+ <el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
|
|
|
+ <el-table-column label="入库数量" prop="入库数量" width="110"></el-table-column>
|
|
|
+ <el-table-column label="出库数量" prop="出库数量" width="110"></el-table-column>
|
|
|
+ <el-table-column label="领料部门" prop="领料部门" width="110"></el-table-column>
|
|
|
+ <el-table-column label="领料时间" prop="领料时间" width="110"></el-table-column>
|
|
|
+ </el-table>
|
|
|
+ <br>
|
|
|
+ </el-form>
|
|
|
+ <template #footer>
|
|
|
+ <br>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="mlcloseDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="mlenterDialog">确 定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+
|
|
|
+ <!-- 发货单页面 -->
|
|
|
+
|
|
|
+ <el-dialog v-model="InvoiceVisible" :before-close="InvoiceDialog" title="AI获取发货单出货信息"
|
|
|
+ style="margin-top: 40px" height="300px" width="1000px" destroy-on-close>
|
|
|
+
|
|
|
+ <h3 style="color:red;font-size: 24px;margin:-5px 0px 8px 12px;" >订单编号 {{_ddhval}} {{_mesval}}</h3>
|
|
|
+
|
|
|
+ <el-table
|
|
|
+ ref="table" highlight-current-row
|
|
|
+ show-overflow-tooltip border
|
|
|
+ :data="InvoicetableData"
|
|
|
+ :row-style="{ height: '25px' }"
|
|
|
+ :cell-style="{ padding: '0px' }"
|
|
|
+ :header-row-style="{ height: '20px' }"
|
|
|
+ :header-cell-style="{ padding: '0px' }"
|
|
|
+ style="width: 100%;height: 65vh;" >
|
|
|
+
|
|
|
+ <el-table-column label="子订单编号" prop="子订单编号" width="160"></el-table-column>
|
|
|
+ <el-table-column label="颜色" prop="颜色" width="110"></el-table-column>
|
|
|
+ <el-table-column label="尺码" prop="尺码" width="110"></el-table-column>
|
|
|
+ <el-table-column label="制单数量" prop="制单数量" width="110"></el-table-column>
|
|
|
+ <el-table-column label="发货箱数" prop="发货箱数" width="110">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.发货箱数"
|
|
|
+ size="mini"
|
|
|
+ @change="handleQuantityChange(scope.row)"
|
|
|
+ @blur="handleQuantityBlur(scope.row)"
|
|
|
+ placeholder="请输入数量"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="每箱件数" prop="每箱件数" width="110">
|
|
|
+ <template #default="scope">
|
|
|
+ <el-input
|
|
|
+ v-model="scope.row.每箱件数"
|
|
|
+ size="mini"
|
|
|
+ @change="handleQuantityChange(scope.row)"
|
|
|
+ @blur="handleQuantityBlur(scope.row)"
|
|
|
+ placeholder="请输入数量"
|
|
|
+ />
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="发货数量" prop="发货数量" width="110"></el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <template #footer>
|
|
|
+ <br>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="InvoiceDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="InvoiceenterDialog">确 定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+
|
|
|
+ </el-main>
|
|
|
+ </layout-content>
|
|
|
+ </layout>
|
|
|
+ </layout>
|
|
|
+
|
|
|
+ <!-- 打印订单表预览 -->
|
|
|
+ <PrintPage ref="printPageRef" />
|
|
|
+ <!-- 子订单详情页 -->
|
|
|
+ <luckyexcelPage ref="luckyexcelPageRef" />
|
|
|
+
|
|
|
+ <!-- 工序产量核查 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="processProductionVisible"
|
|
|
+ width="100%"
|
|
|
+ style="height: 100%;margin: 0px;"
|
|
|
+ top="2vh"
|
|
|
+ :close-on-click-modal="true"
|
|
|
+ :show-close="false"
|
|
|
+ destroy-on-close
|
|
|
+ class="process-production-dialog"
|
|
|
+ >
|
|
|
+ <template #header>
|
|
|
+ <div class="process-production-dialog-header">
|
|
|
+ <span class="process-production-dialog-title">工序产量核查</span>
|
|
|
+ <el-button
|
|
|
+ type="danger"
|
|
|
+ size="small"
|
|
|
+ class="process-production-dialog-close"
|
|
|
+ @click="processProductionVisible = false"
|
|
|
+ >
|
|
|
+ 关闭
|
|
|
+ </el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <ProcessProduction
|
|
|
+ :key="processProductionDialogKey"
|
|
|
+ :initial-workorder="processProductionWorkorder"
|
|
|
+ in-dialog
|
|
|
+ hide-amount-columns
|
|
|
+ />
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 导入工艺资料弹窗 -->
|
|
|
+ <el-dialog
|
|
|
+ title="导入工艺资料"
|
|
|
+ v-model="importProcessDialogVisible"
|
|
|
+ width="520px"
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ destroy-on-close
|
|
|
+ class="import-process-dialog"
|
|
|
+ >
|
|
|
+ <div class="import-process-body">
|
|
|
+ <el-form
|
|
|
+ :model="importProcessForm"
|
|
|
+ label-position="right"
|
|
|
+ class="import-process-form"
|
|
|
+ >
|
|
|
+ <el-form-item label="订单编号" label-width="96px">
|
|
|
+ <el-input v-model="importProcessForm.workorderNo" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="款号" label-width="96px">
|
|
|
+ <el-input v-model="importProcessForm.styleNo" disabled />
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="Excel文件" label-width="96px">
|
|
|
+ <el-upload
|
|
|
+ ref="importProcessUploadRef"
|
|
|
+ class="upload-demo import-process-upload"
|
|
|
+ action="#"
|
|
|
+ :auto-upload="false"
|
|
|
+ :show-file-list="true"
|
|
|
+ :file-list="importProcessFileList"
|
|
|
+ accept=".xlsx,.xls"
|
|
|
+ :on-change="handleImportProcessFileChange"
|
|
|
+ :on-remove="handleImportProcessFileRemove"
|
|
|
+ :before-upload="beforeImportProcessUpload"
|
|
|
+ list-type="text"
|
|
|
+ >
|
|
|
+ <el-button type="primary" icon="upload">选择文件</el-button>
|
|
|
+ </el-upload>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <div class="dialog-footer">
|
|
|
+ <el-button @click="closeImportProcessDialog">取 消</el-button>
|
|
|
+ <el-button type="primary" @click="submitImportProcess">确 定</el-button>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ <!-- 导入冲突对照:import_append_only,单表左右字段对比 -->
|
|
|
+ <el-dialog
|
|
|
+ v-model="importConflictDialogVisible"
|
|
|
+ :title="importConflictTitle"
|
|
|
+ width="1100px"
|
|
|
+ top="6vh"
|
|
|
+ append-to-body
|
|
|
+ :close-on-click-modal="false"
|
|
|
+ destroy-on-close
|
|
|
+ class="import-process-conflict-dialog"
|
|
|
+ >
|
|
|
+ <div
|
|
|
+ v-if="importConflictMeta.suggest_min_new_code != null"
|
|
|
+ class="import-conflict-summary"
|
|
|
+ >
|
|
|
+ </div>
|
|
|
+ <div class="import-process-tip">
|
|
|
+ <div>1、Excel 中的工序号及工序名称必须和系统已有工序档案完全匹配,匹配不一致时不可导入。</div>
|
|
|
+ <div>2、仅支持在工序列表末尾追加新工序,不支持在列表中间插入工序。</div>
|
|
|
+ </div>
|
|
|
+ <el-table
|
|
|
+ :data="importConflictMergedList"
|
|
|
+ border
|
|
|
+ size="small"
|
|
|
+ height="460"
|
|
|
+ empty-text="暂无对照数据"
|
|
|
+ :row-class-name="importConflictRowClassName"
|
|
|
+ >
|
|
|
+ <el-table-column prop="old_part_name" label="原部件名称" min-width="110" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="old_process_code" label="原工序号" width="88" align="center" />
|
|
|
+ <el-table-column prop="old_process_name" label="原工序名称" min-width="150" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="new_part_name" label="本次导入部件名称" min-width="120" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="new_process_code" label="本次导入工序号" width="120" align="center" />
|
|
|
+ <el-table-column prop="new_process_name" label="本次导入工序名称" min-width="160" show-overflow-tooltip />
|
|
|
+ </el-table>
|
|
|
+ <template #footer>
|
|
|
+ <el-button type="primary" @click="importConflictDialogVisible = false">关闭</el-button>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <script>
|
|
|
+ //点击按钮显示下方表格
|
|
|
+ export default {
|
|
|
+ data() {
|
|
|
+ return {
|
|
|
+ currentTable: '', // 当前展示的表格
|
|
|
+ activeName: 'first',
|
|
|
+ _ddhval:'',
|
|
|
+ size: '',
|
|
|
+ add_gddialogFormVisible: true,
|
|
|
+ };
|
|
|
+ }
|
|
|
+ };
|
|
|
+ </script>
|
|
|
+
|
|
|
+ <script setup>
|
|
|
+ // 全量引入格式化工具 请按需保留
|
|
|
+ import $script from 'scriptjs'
|
|
|
+ import $ from 'jquery';
|
|
|
+ import LuckyExcel from 'luckyexcel';
|
|
|
+ import { toRaw } from 'vue';
|
|
|
+ import { Layout, LayoutSider, LayoutContent } from '@arco-design/web-vue';
|
|
|
+ import { ElMessage, ElMessageBox, ElUpload, ElButton, ElLoading } from 'element-plus'
|
|
|
+ // 生产环境为按需引入,手动 import 组件不会带样式;补全 Upload,避免 picture-card 退化成原生「选择文件」
|
|
|
+ import 'element-plus/es/components/upload/style/css'
|
|
|
+ import 'element-plus/es/components/button/style/css'
|
|
|
+ import 'element-plus/es/components/image-viewer/style/css'
|
|
|
+ import { Plus } from '@element-plus/icons-vue'
|
|
|
+ import { ref, reactive, computed, nextTick, watch, onMounted, onBeforeUnmount, isRef } from 'vue'
|
|
|
+ import axios from 'axios';
|
|
|
+ import * as XLSX from 'xlsx';
|
|
|
+ import jsPDF from 'jspdf';
|
|
|
+ import 'vxe-table/lib/style.css';
|
|
|
+ import { VxeTable, VxeColumn } from 'vxe-table';
|
|
|
+ import Sortable from '@/utils/vendor/sortable.esm.js'
|
|
|
+ import {Datalist,WorkOrderList,WorkOrderAdd,PrintListData,
|
|
|
+ printDetailAdd,PrintDetailDel,orderDataDel,getWorkOrder,
|
|
|
+ getSuborder,PrintDataEdit,WorkOrderEdit,gdAnnexAdd,upload,OrderAttachments,
|
|
|
+ getPonumber,FabricEdit,orderBomList,FabricDetail,fabricList,Bomdel,delfujian,Read_File,Read_Add,PartList,GetProcessList,
|
|
|
+ AddPart,UpdatePartInfo,DeletePart,AddProcess,UpdateProcess,DeleteProcess,getproducttype,workorderprocessCopy,sortProcess,getProductStyleList,copyProcessToCurrentWorkOrder,
|
|
|
+ importProcess,getWorkOrderProcess,updateWorkOrderPlanManufacture,checkProcessReport,confirmProcessSplit,updateOrderRemarkAndFinishDate} from '@/api/mes/job'
|
|
|
+ import {ParList,ProcessList} from '@/api/yunyin/product'
|
|
|
+ import PrintPage from './components/print.vue'
|
|
|
+ import luckyexcelPage from './components/luckyexcel.vue'
|
|
|
+ import AddGongYi from './components/addGongYi.vue'
|
|
|
+ import ProcessProduction from '@/view/SalaryManage/ProcessProduction.vue'
|
|
|
+ import { ensureProcessProductionData } from '@/utils/processProductionDialog'
|
|
|
+ import { useUserStore } from '@/pinia/modules/user';
|
|
|
+ defineOptions({name: 'Company'})
|
|
|
+ //定义打印跳转页面
|
|
|
+ const printPageRef = ref()
|
|
|
+ const luckyexcelPageRef = ref()
|
|
|
+ //获取登录用户信息
|
|
|
+ const userStore = useUserStore()
|
|
|
+ const _username = ref('')
|
|
|
+ _username.value = userStore.userInfo.userName + '/' + userStore.userInfo.nickName
|
|
|
+ console.log('获取用户名称',_username.value)
|
|
|
+ //全局获取当前日期
|
|
|
+ const today = new Date();
|
|
|
+ const year = today.getFullYear();
|
|
|
+ const month = String(today.getMonth() + 1).padStart(2, '0'); // 月份从 0 开始,需要补零
|
|
|
+ const day = String(today.getDate()).padStart(2, '0');
|
|
|
+ const hours = String(today.getHours()).padStart(2, '0');
|
|
|
+ const minutes = String(today.getMinutes()).padStart(2, '0');
|
|
|
+ const seconds = String(today.getSeconds()).padStart(2, '0');
|
|
|
+ const currentDate = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`;
|
|
|
+ const currentDates = `${year}-${month}-${day}`;
|
|
|
+
|
|
|
+ //==============图片上传=============
|
|
|
+ //测试环境前端
|
|
|
+ // const uploadUrl = ref('http://mes-dacheng-api:8083/index.php/api/work_order/ImgUpload')
|
|
|
+
|
|
|
+ // 获取环境变量
|
|
|
+ const basePath = import.meta.env.VITE_BASE_PATH;
|
|
|
+ const uploadsPort = import.meta.env.VITE_UPLOADS_PORT;
|
|
|
+ // 动态生成路径
|
|
|
+ let path = basePath && uploadsPort ? `${basePath}:${uploadsPort}` : undefined;
|
|
|
+ // 如果 path 是 undefined,则使用默认地址
|
|
|
+ if (!path || path.includes("undefined")) {
|
|
|
+ console.log("第一路径获取失败,尝试使用备用地址 http://192.168.28.22:8082");
|
|
|
+ path = "http://192.168.28.22:8082";
|
|
|
+ }
|
|
|
+ // 如果还是 undefined,再降级到本地地址
|
|
|
+ if (path.includes("undefined")) {
|
|
|
+ console.log("备用地址获取失败,使用本地地址 http://127.0.0.1:58082");
|
|
|
+ path = "http://127.0.0.1:58082";
|
|
|
+ }
|
|
|
+ console.log("最终获取地址:", path);
|
|
|
+
|
|
|
+ /** 将接口返回的相对路径 img 转为可预览的完整 URL(与上传服务同源) */
|
|
|
+ const buildFullImageUrl = (imgRel) => {
|
|
|
+ if (!imgRel || typeof imgRel !== 'string') return '';
|
|
|
+ const trimmed = imgRel.trim();
|
|
|
+ if (/^https?:\/\//i.test(trimmed)) return trimmed;
|
|
|
+ const base = String(path).replace(/\/$/, '');
|
|
|
+ const rel = trimmed.startsWith('/') ? trimmed : `/${trimmed}`;
|
|
|
+ return `${base}${rel}`;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 上传的URL
|
|
|
+ const uploadUrl = ref(`${path}/api/work_order/ImgUpload`);
|
|
|
+ // const uploadUrl = ref("http://192.168.28.22:8082/api/work_order/ImgUpload");
|
|
|
+ const uploadHeaders = { 'Content-Type': 'multipart/form-data' };
|
|
|
+ const fileList = reactive([]);
|
|
|
+ const uploadRef = ref(null);
|
|
|
+
|
|
|
+ /** 根据 img 相对/绝对路径同步 el-upload 展示列表(修改订单回显图片) */
|
|
|
+ const syncUploadFileList = (imgRel) => {
|
|
|
+ fileList.splice(0, fileList.length);
|
|
|
+ if (!imgRel || typeof imgRel !== 'string') return;
|
|
|
+ const url = buildFullImageUrl(imgRel);
|
|
|
+ if (!url) return;
|
|
|
+ fileList.push({
|
|
|
+ uid: Date.now(),
|
|
|
+ name: imgRel.split('/').pop() || 'image.jpg',
|
|
|
+ url,
|
|
|
+ status: 'success',
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+ // 预览图片(页内放大,不新开标签页)
|
|
|
+ const imgPreviewVisible = ref(false)
|
|
|
+ const imgPreviewList = ref([])
|
|
|
+ const handlePreview = (file) => {
|
|
|
+ const previewUrl = file.url || buildFullImageUrl(file.response?.data?.data?.url)
|
|
|
+ if (!previewUrl) {
|
|
|
+ ElMessage.warning('暂无可预览的图片')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ imgPreviewList.value = [previewUrl]
|
|
|
+ imgPreviewVisible.value = true
|
|
|
+ }
|
|
|
+ const closeImgPreview = () => {
|
|
|
+ imgPreviewVisible.value = false
|
|
|
+ imgPreviewList.value = []
|
|
|
+ }
|
|
|
+ // 移除图片
|
|
|
+ const handleRemove = () => {
|
|
|
+ fileList.splice(0, fileList.length);
|
|
|
+ add_gdscgdformData.img = '';
|
|
|
+ if (edit_ddformData.value) edit_ddformData.value.img = '';
|
|
|
+ };
|
|
|
+ // 上传错误处理
|
|
|
+ const handleError = (err, file, fileList) => {
|
|
|
+ console.error('上传失败:', err);
|
|
|
+ ElMessage.error(`图片上传失败: ${err.message || '未知错误'}`);
|
|
|
+ };
|
|
|
+ // 上传前的检查与图片压缩
|
|
|
+ const beforeUpload = (file) => {
|
|
|
+ const isJPGOrPNG = file.type === 'image/jpeg' || file.type === 'image/png';
|
|
|
+ const isLt500K = file.size / 1024 < 500;
|
|
|
+ if (!isJPGOrPNG) {
|
|
|
+ ElMessage.error('上传图片只能是 JPG 或 PNG 格式!');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if (!isLt500K) {
|
|
|
+ ElMessage.error('上传图片大小不能超过 500KB!');
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ // 图片格式和大小符合,压缩图片
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
+ const reader = new FileReader();
|
|
|
+ reader.readAsDataURL(file);
|
|
|
+ reader.onload = () => {
|
|
|
+ const img = new Image();
|
|
|
+ img.src = reader.result;
|
|
|
+ img.onload = () => {
|
|
|
+ const canvas = document.createElement('canvas');
|
|
|
+ const ctx = canvas.getContext('2d');
|
|
|
+ const fixedWidth = 300;
|
|
|
+ const fixedHeight = 300;
|
|
|
+ canvas.width = fixedWidth;
|
|
|
+ canvas.height = fixedHeight;
|
|
|
+ ctx.drawImage(img, 0, 0, fixedWidth, fixedHeight);
|
|
|
+ canvas.toBlob((blob) => {
|
|
|
+ const compressedFile = new File([blob], file.name, { type: file.type });
|
|
|
+ resolve(compressedFile);
|
|
|
+ }, file.type);
|
|
|
+ };
|
|
|
+ };
|
|
|
+ reader.onerror = (error) => {
|
|
|
+ ElMessage.error('图片处理失败');
|
|
|
+ reject(error);
|
|
|
+ };
|
|
|
+ });
|
|
|
+ };
|
|
|
+ // 上传成功处理
|
|
|
+ const handleSuccess = (response, file, fileList) => {
|
|
|
+ console.log('上传成功:', response, file, fileList);
|
|
|
+ };
|
|
|
+ // 自定义上传逻辑
|
|
|
+ const customUpload = async (options) => {
|
|
|
+ try {
|
|
|
+ const formData = new FormData();
|
|
|
+ formData.append('image', options.file);
|
|
|
+ const response = await axios.post(uploadUrl.value, formData, {
|
|
|
+ headers: uploadHeaders,
|
|
|
+ onUploadProgress: (progressEvent) => {
|
|
|
+ options.onProgress({
|
|
|
+ percent: Math.round((progressEvent.loaded * 100) / progressEvent.total),
|
|
|
+ });
|
|
|
+ },
|
|
|
+ });
|
|
|
+ if (response.data.code === 0) {
|
|
|
+ const imgUrl = response.data.data.url;
|
|
|
+ options.onSuccess(response.data);
|
|
|
+ ElMessage.success('图片上传成功');
|
|
|
+ add_gdscgdformData.img = imgUrl;
|
|
|
+ if (edit_ddformData.value) edit_ddformData.value.img = imgUrl;
|
|
|
+ syncUploadFileList(imgUrl);
|
|
|
+ } else {
|
|
|
+ throw new Error(response.data.msg);
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('上传失败:', error);
|
|
|
+ options.onError(error);
|
|
|
+ ElMessage.error(`上传失败: ${error.message}`);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // =========== 左侧树侧形结构 ===========
|
|
|
+ const treeData = ref([])
|
|
|
+ const tableData = ref([])
|
|
|
+ const _Gd_khdh = ref(null)
|
|
|
+ const defaultProps = {
|
|
|
+ children: 'children',
|
|
|
+ label: 'label'
|
|
|
+ };
|
|
|
+ const Datalistdata = async () => {
|
|
|
+ try {
|
|
|
+ const Datalists = await Datalist();
|
|
|
+ console.log(Datalists)
|
|
|
+ Datalists.data.forEach(id => {
|
|
|
+ treeData.value.push({
|
|
|
+ label: id,
|
|
|
+ });
|
|
|
+ });
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ Datalistdata();
|
|
|
+
|
|
|
+ //点击左侧树形获取编号
|
|
|
+ const handleNodeClick = async (node) => {
|
|
|
+ ystableData.splice(0, ystableData.length);
|
|
|
+ parttableData.splice(0, parttableData.length);
|
|
|
+ gytableData.splice(0, gytableData.length);
|
|
|
+ ddtableData.splice(0, ddtableData.length);
|
|
|
+ jstableData.splice(0, jstableData.length);
|
|
|
+ fhdtableData.splice(0, fhdtableData.length);
|
|
|
+ // 取消所有节点的颜色
|
|
|
+ const allNodes = document.querySelectorAll('.treecolor .el-tree-node');
|
|
|
+ allNodes.forEach(node => {
|
|
|
+ node.querySelector('.el-tree-node__label').style.color = '';
|
|
|
+ });
|
|
|
+ // 获取点击的节点 给当前点击的节点改变颜色【红色】
|
|
|
+ const clickedNodeId = node['$treeNodeId'];
|
|
|
+ const clickedNode = document.querySelector(`.treecolor .el-tree-node[data-key="${clickedNodeId}"]`);
|
|
|
+ if (clickedNode) {
|
|
|
+ clickedNode.querySelector('.el-tree-node__label').style.color = 'red';
|
|
|
+ }
|
|
|
+ ystableData.length = 0
|
|
|
+ searchInfo.value = '';
|
|
|
+ _Gd_khdh.value = node.label.split('【')[0];
|
|
|
+ _WorkList_page();
|
|
|
+ };
|
|
|
+
|
|
|
+ const InvoiceVisible = ref(false)
|
|
|
+ const InvoicetableData = ref([])
|
|
|
+ const _mesval = ref('')
|
|
|
+
|
|
|
+ const fahuodan = async(row)=>{
|
|
|
+
|
|
|
+ const Read_Filelist = await Read_File({
|
|
|
+ UniqId: row['UniqId'],
|
|
|
+ order: row['关联编号'],
|
|
|
+ url: path
|
|
|
+ })
|
|
|
+ if(Read_Filelist.code === 0){
|
|
|
+ console.log(Read_Filelist)
|
|
|
+ InvoiceVisible.value = true
|
|
|
+ const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
+ sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
|
|
|
+ InvoicetableData.value = Read_Filelist.data
|
|
|
+ _mesval.value = Read_Filelist.msg
|
|
|
+ console.log(_mesval)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //取消
|
|
|
+ const InvoiceDialog = () => {
|
|
|
+ InvoiceVisible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ const InvoiceenterDialog = async() => {
|
|
|
+ console.log(InvoicetableData.value)
|
|
|
+ // InvoiceVisible.value = false
|
|
|
+
|
|
|
+ const rawValueArray = InvoicetableData.value;
|
|
|
+ const formattedData = rawValueArray
|
|
|
+ .map(item => {
|
|
|
+ return {
|
|
|
+ sys_id: _username.value,
|
|
|
+ 订单编号: item.订单编号,
|
|
|
+ 子订单编号: item.子订单编号,
|
|
|
+ 尺码: item.尺码,
|
|
|
+ 制单数量: item.制单数量,
|
|
|
+ 发货数量: item.发货数量,
|
|
|
+ 发货箱数: item.发货箱数,
|
|
|
+ 每箱件数: item.每箱件数
|
|
|
+ }
|
|
|
+ });
|
|
|
+ console.log(formattedData);
|
|
|
+ const Read_Addres = await Read_Add(formattedData)
|
|
|
+ console.log(Read_Addres)
|
|
|
+ if(Read_Addres.msg === '成功'){
|
|
|
+ ElMessage({type: 'success',message: '处理成功'})
|
|
|
+ InvoiceVisible.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 删除
|
|
|
+ const deleteItem = async (row) => {
|
|
|
+ console.log(_username.value.split('/')[1])
|
|
|
+ console.log(row.sys_id.split('/')[1])
|
|
|
+
|
|
|
+ const delfujian_del = await delfujian({UniqId:row['UniqId'],登录用户:_username.value.split('/')[1],建档用户:row.sys_id.split('/')[1]});
|
|
|
+ if(delfujian_del.code === 0){
|
|
|
+ ElMessage({type: 'success',message: '删除成功'})
|
|
|
+ }else{
|
|
|
+ ElMessage({type: 'error',message: '删除失败'})
|
|
|
+ }
|
|
|
+ tableRowClick (row)
|
|
|
+ }
|
|
|
+
|
|
|
+ const showPdf = async (row) => {
|
|
|
+ luckyexcelPageRef.value.open(row)
|
|
|
+ };
|
|
|
+ //调用订单资料列表
|
|
|
+ const _WorkList_page = async () => {
|
|
|
+ console.log("page",page.value)
|
|
|
+ console.log("pageSize",pageSize.value)
|
|
|
+ try {
|
|
|
+ //通过客户编号获取
|
|
|
+ const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
|
|
|
+ tableData.value = WorkListdata.data.data
|
|
|
+ total.value = WorkListdata.data.total
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //调用订单资料列表
|
|
|
+ const page_WorkList_page = async () => {
|
|
|
+ console.log("page",page.value)
|
|
|
+ console.log("pageSize",pageSize.value)
|
|
|
+ try {
|
|
|
+ //通过客户编号获取
|
|
|
+ const WorkListdata = await WorkOrderList({search:_Gd_khdh.value,page:page.value,limit:pageSize.value});
|
|
|
+ tableData.value = WorkListdata.data.data
|
|
|
+ total.value = WorkListdata.data.total
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //============订单资料============
|
|
|
+ //订单资料修改
|
|
|
+ const ddzl_dialogFormVisible = ref(false)
|
|
|
+ const edit_ddformData = ref({
|
|
|
+ 合并: false,
|
|
|
+ })
|
|
|
+ // 双击订单表格
|
|
|
+ const updateCompanyFunc = async (row) => {
|
|
|
+ await getProductStyleData();
|
|
|
+ if (row.water === '1') {
|
|
|
+ edit_ddformData.value = { 合并: true };
|
|
|
+ } else {
|
|
|
+ edit_ddformData.value = { 合并: false };
|
|
|
+ }
|
|
|
+ Object.assign(edit_ddformData.value, row);
|
|
|
+ ddzl_dialogFormVisible.value = true;
|
|
|
+ await nextTick();
|
|
|
+ syncUploadFileList(edit_ddformData.value.img);
|
|
|
+ }
|
|
|
+
|
|
|
+ // Sys_id 形如「账号/角色」,安全取「/」后一段,避免空值或格式异常导致白屏
|
|
|
+ const getSysIdPart = (sysId) => {
|
|
|
+ const parts = String(sysId ?? '').split('/')
|
|
|
+ return parts.length > 1 ? parts[1] : ''
|
|
|
+ }
|
|
|
+
|
|
|
+ //订单资料修改确认
|
|
|
+ const dd_edit_Dialog = async () => {
|
|
|
+ const orderSysPart = getSysIdPart(edit_ddformData.value?.Sys_id)
|
|
|
+ const userSysPart = getSysIdPart(_username.value)
|
|
|
+ if (orderSysPart !== userSysPart && userSysPart !== '超级管理员') {
|
|
|
+ return ElMessage({ type: 'error', message: '无法修改其他用户订单数据' })
|
|
|
+ }
|
|
|
+ //日期转换
|
|
|
+ let lhrq_formattedDeliveryDate = '';
|
|
|
+ if (edit_ddformData.value.落货日期) {
|
|
|
+ const date = new Date(edit_ddformData.value.落货日期);
|
|
|
+ lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
|
|
|
+ }
|
|
|
+ let params = {};
|
|
|
+ params.订单编号 = edit_ddformData.value.订单编号
|
|
|
+ params.生产款号 = edit_ddformData.value.生产款号
|
|
|
+ params.客户编号 = edit_ddformData.value.客户编号
|
|
|
+ params.款式 = edit_ddformData.value.款式
|
|
|
+ params.箱唛要求 = edit_ddformData.value.箱唛要求
|
|
|
+ params.面料 = edit_ddformData.value.面料
|
|
|
+ params.要求 = edit_ddformData.value.要求
|
|
|
+ params.船样描述 = edit_ddformData.value.船样描述
|
|
|
+ params.船样合计 = edit_ddformData.value.船样合计
|
|
|
+ params.粘衬 = edit_ddformData.value.粘衬
|
|
|
+ params.订单数量 = edit_ddformData.value.订单数量
|
|
|
+ params.单位 = edit_ddformData.value.单位
|
|
|
+ params.接单日期 = edit_ddformData.value.接单日期
|
|
|
+ params.落货日期 = lhrq_formattedDeliveryDate
|
|
|
+ params.Sys_id = edit_ddformData.value.Sys_id
|
|
|
+ params.id = edit_ddformData.value.Uniqid
|
|
|
+ params.img = edit_ddformData.value.img
|
|
|
+ console.log(params)
|
|
|
+ try {
|
|
|
+ const WorkOrderEdit_list = await WorkOrderEdit(params);
|
|
|
+ if (WorkOrderEdit_list.code === 0) {
|
|
|
+ ddzl_dialogFormVisible.value = false;
|
|
|
+ _WorkList_page()
|
|
|
+ ElMessage({ type: 'success', message: '修改成功' })
|
|
|
+ } else {
|
|
|
+ ElMessage({ type: 'error', message: WorkOrderEdit_list.msg || WorkOrderEdit_list.message || '修改失败' })
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '修改失败,请重试'
|
|
|
+ ElMessage({ type: 'error', message: msg })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //订单资料修改取消
|
|
|
+ const dd_closeDialog = async () => {
|
|
|
+ ddzl_dialogFormVisible.value = false;
|
|
|
+ syncUploadFileList('');
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //=============颜色资料============
|
|
|
+ //颜色资料修改
|
|
|
+ const dialogFormVisible = ref(false)
|
|
|
+ //尺码
|
|
|
+ const edit_cmformdata = reactive({
|
|
|
+ cm1:'',
|
|
|
+ cm2:'',
|
|
|
+ cm3:'',
|
|
|
+ cm4:'',
|
|
|
+ cm5:'',
|
|
|
+ cm6:'',
|
|
|
+ cm7:'',
|
|
|
+ cm8:'',
|
|
|
+ cm9:'',
|
|
|
+ cm10:'',
|
|
|
+ cm11:'',
|
|
|
+ cm12:'',
|
|
|
+ cm13:'',
|
|
|
+ cm14:'',
|
|
|
+ sctotal:'总计',
|
|
|
+ });
|
|
|
+ //制单数
|
|
|
+ const edit_zdsformdata = reactive({
|
|
|
+ zds1:'',
|
|
|
+ zds2:'',
|
|
|
+ zds3:'',
|
|
|
+ zds4:'',
|
|
|
+ zds5:'',
|
|
|
+ zds6:'',
|
|
|
+ zds7:'',
|
|
|
+ zds8:'',
|
|
|
+ zds9:'',
|
|
|
+ zds10:'',
|
|
|
+ zds11:'',
|
|
|
+ zds12:'',
|
|
|
+ zds13:'',
|
|
|
+ zds14:'',
|
|
|
+ zdtotal:'',
|
|
|
+ });
|
|
|
+ const Uniqid = ref('')//颜色资料Uniqid
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //颜色资料表格双击
|
|
|
+ const ysupdateCompanyFunc = async (row) => {
|
|
|
+ dialogFormVisible.value = true;
|
|
|
+ edit_formData.value = { ...row };
|
|
|
+ console.log(row)
|
|
|
+ edit_formData['子订单编号'] = row['子订单编号']
|
|
|
+ edit_formData['颜色备注'] = row['颜色备注']
|
|
|
+ edit_formData['款号'] = row['款号']
|
|
|
+ edit_formData['船样'] = row['船样']
|
|
|
+ edit_formData['颜色'] = row['颜色']
|
|
|
+ edit_colorcode.value =row['color_id']
|
|
|
+ Uniqid.value = row['Uniqid']
|
|
|
+ //获取色系名称列表
|
|
|
+ const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
|
|
|
+ getSuborderscolor.colorlist = getSuborders.data.colorlist;
|
|
|
+ let index = 1;
|
|
|
+ // 创建一个函数来构建尺码和数量的映射
|
|
|
+ function buildSizeQuantitiesMap(sizes, formData) {
|
|
|
+ const sizeQuantitiesMap = {};
|
|
|
+ sizes.forEach(size => {
|
|
|
+ // 使用逻辑或操作符确保所有尺码都有数量(默认为0,但如果有值则使用那个值)
|
|
|
+ const quantity = formData[size] || 0;
|
|
|
+ sizeQuantitiesMap[size] = quantity;
|
|
|
+ });
|
|
|
+ return sizeQuantitiesMap;
|
|
|
+ }
|
|
|
+ // 使用函数构建映射
|
|
|
+ let sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);
|
|
|
+ let edit_params = {};
|
|
|
+ for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {
|
|
|
+ edit_params[`cm${index}`] = size;
|
|
|
+ edit_params[`cmsl${index++}`] = quantity;
|
|
|
+ }
|
|
|
+ for (let i = 1; i <= 14; i++) {
|
|
|
+ edit_cmformdata[`cm${i}`] = edit_params[`cm${i}`] || '';
|
|
|
+ edit_zdsformdata[`zds${i}`] = (edit_params[`cmsl${i}`] === 0 || edit_params[`cmsl${i}`] === null) ? '' : edit_params[`cmsl${i}`];
|
|
|
+ }
|
|
|
+ //计算尺码数量总数合计
|
|
|
+ updateTotal()
|
|
|
+ };
|
|
|
+
|
|
|
+ //自动计算制单数总计(仅数字,自动去掉空格及其他字符)
|
|
|
+ function updateTotal() {
|
|
|
+ const relevantKeys = ['zds1', 'zds2', 'zds3', 'zds4', 'zds5', 'zds6', 'zds7', 'zds8', 'zds9', 'zds10', 'zds11', 'zds12', 'zds13', 'zds14'];
|
|
|
+ relevantKeys.forEach((key) => {
|
|
|
+ zdsformdata[key] = String(zdsformdata[key] ?? '').replace(/[^\d]/g, '')
|
|
|
+ edit_zdsformdata[key] = String(edit_zdsformdata[key] ?? '').replace(/[^\d]/g, '')
|
|
|
+ })
|
|
|
+ const values = relevantKeys.map(key => parseInt(zdsformdata[key], 10) || 0);
|
|
|
+ zdsformdata.zdtotal = values.reduce((sum, value) => sum + value, 0);
|
|
|
+ const valuess = relevantKeys.map(key => parseInt(edit_zdsformdata[key], 10) || 0);
|
|
|
+ edit_zdsformdata.zdtotal = valuess.reduce((sum, value) => sum + value, 0);
|
|
|
+ }
|
|
|
+
|
|
|
+ //点击是否船样 改变子订单编号
|
|
|
+ const edit_cyChange = async (value) => {
|
|
|
+ if (value === '是') {
|
|
|
+ const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:edit_formData['颜色']});
|
|
|
+ edit_formData['子订单编号'] = getSuborders.data;
|
|
|
+ }else if(value === '否'){
|
|
|
+ const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:edit_formData['颜色']});
|
|
|
+ edit_formData['子订单编号'] = getSuborders.data.order;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //修改颜色资料确认
|
|
|
+ const ys_edit_Dialog = async () => {
|
|
|
+ updateTotal()
|
|
|
+ if (!edit_formData.value) return;
|
|
|
+
|
|
|
+ //获取颜色编号id
|
|
|
+ const getPonumberdata = await getSuborder({colorname:edit_formData['颜色'],order:_ddhval.value,cy:edit_formData['船样']});
|
|
|
+ // 从返回中提取 colorlist
|
|
|
+ const colorlist = getPonumberdata.data.colorlist || [];
|
|
|
+ // 获取匹配的颜色项
|
|
|
+ const match = colorlist.find(item => item.colorname === edit_formData['颜色']);
|
|
|
+ if (match) {
|
|
|
+ edit_colorcode.value = match.colorcode;
|
|
|
+ } else {
|
|
|
+ console.warn('未找到匹配的颜色');
|
|
|
+ }
|
|
|
+
|
|
|
+ function buildSizeQuantitiesMap(sizes, formData) {
|
|
|
+ const sizeQuantitiesMap = {};
|
|
|
+ sizes.forEach(size => {
|
|
|
+ // 使用逻辑或操作符确保所有尺码的数量
|
|
|
+ const quantity = formData[size] || 0;
|
|
|
+ sizeQuantitiesMap[size] = quantity;
|
|
|
+ });
|
|
|
+ return sizeQuantitiesMap;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 使用函数构建映射
|
|
|
+ const sizeQuantitiesMap = buildSizeQuantitiesMap(sizeDatas, edit_formData.value);
|
|
|
+ let index = 1;
|
|
|
+ const params = {
|
|
|
+ 订单编号: edit_formData.value.订单编号,
|
|
|
+ 子订单编号: edit_formData.子订单编号,
|
|
|
+ 款号: edit_formData.款号,
|
|
|
+ 颜色备注: edit_formData.颜色备注,
|
|
|
+ 船样: edit_formData.船样 === '是' ? '1' : '0', // 转换船样字段
|
|
|
+ 颜色: edit_formData.颜色,
|
|
|
+ color_id:edit_colorcode.value,
|
|
|
+ zdtotal: edit_zdsformdata.zdtotal,
|
|
|
+ Sys_id: edit_formData.value.Sys_id,
|
|
|
+ id: Uniqid.value,
|
|
|
+ };
|
|
|
+ for (const [size, quantity] of Object.entries(sizeQuantitiesMap)) {
|
|
|
+ params[`cm${index}`] = size;
|
|
|
+ const cmslValue = +edit_zdsformdata[`zds${index}`]; // 获取对应的数量
|
|
|
+ params[`cmsl${index++}`] = cmslValue === 0 ? "" : cmslValue; // 如果为0,赋值为空字符串
|
|
|
+ }
|
|
|
+ console.log(params)
|
|
|
+ //颜色资料修改接口
|
|
|
+ const PrintDataEdit_list = await PrintDataEdit(params);
|
|
|
+ if(PrintDataEdit_list.code === 0){
|
|
|
+ dialogFormVisible.value = false;
|
|
|
+ ElMessage({type: 'success',message: '修改成功'})
|
|
|
+ //数据列表显示
|
|
|
+ const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
+ const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
|
|
|
+ const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
|
|
|
+ //颜色资料
|
|
|
+ if(PrintListDatas.data.列表.length === 0 ){
|
|
|
+ ystableData.length = 0
|
|
|
+ }else{
|
|
|
+ sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//型号数据
|
|
|
+ ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
|
|
|
+ // 使用 map 方法创建一个新数组,并转换船样字段
|
|
|
+ const newData = PrintListDatas.data.列表.map(item => ({
|
|
|
+ ...item,
|
|
|
+ 船样: item.船样 === 1 ? '是' : '否'
|
|
|
+ }));
|
|
|
+ // 将新数组赋值给 ystableData,这会触发视图更新,清空旧数据(可选,如果不需要保留旧数据的话)
|
|
|
+ ystableData.length = 0;
|
|
|
+ ystableData.push(...newData);
|
|
|
+ }
|
|
|
+ tableRowClick(params)
|
|
|
+ }else{
|
|
|
+ ElMessage({type: 'error',message: '修改失败'})
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //颜色资料修改取消
|
|
|
+ const ys_edit_closeDialog = async (row) => {
|
|
|
+ dialogFormVisible.value = false;
|
|
|
+ };
|
|
|
+
|
|
|
+ const mlinventoryVisible = ref(false)
|
|
|
+ const historytableData = ref([])
|
|
|
+ // //双击面料库存
|
|
|
+ // const mlupdateCompanyFunc = async (row) => {
|
|
|
+ // mlinventoryVisible.value = true;
|
|
|
+ // }
|
|
|
+
|
|
|
+ //库存测试
|
|
|
+ const CSclick = async (row) => {
|
|
|
+ mlinventoryVisible.value = true;
|
|
|
+ }
|
|
|
+
|
|
|
+ //技术附件弹窗取消
|
|
|
+ const mlcloseDialog = () => {
|
|
|
+ mlinventoryVisible.value = false
|
|
|
+ }
|
|
|
+ // 分页
|
|
|
+ const page = ref(1)
|
|
|
+ const total = ref(0)
|
|
|
+ const pageSize = ref(50)
|
|
|
+ const handleCurrentChange = (val) => {
|
|
|
+ page.value = val;
|
|
|
+ _WorkList_page();
|
|
|
+ };
|
|
|
+
|
|
|
+ // 修改页面容量 点击多少条/页
|
|
|
+ const handleSizeChange = (val) => {
|
|
|
+ pageSize.value = val;
|
|
|
+ _WorkList_page();
|
|
|
+ };
|
|
|
+
|
|
|
+ // 款式列表数据
|
|
|
+ const productStyleList = ref([]);
|
|
|
+
|
|
|
+ // 获取款式列表
|
|
|
+ const getProductStyleData = async () => {
|
|
|
+ try {
|
|
|
+ const result = await getProductStyleList();
|
|
|
+ if (result.code === 0) {
|
|
|
+ productStyleList.value = result.data;
|
|
|
+ } else {
|
|
|
+ ElMessage.error('获取款式列表失败');
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取款式列表出错:', error);
|
|
|
+ ElMessage.error('获取款式列表失败');
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // =========== 新增订单资料 ===========
|
|
|
+ const add_gdscgdformData = reactive({
|
|
|
+ 订单编号: '',
|
|
|
+ 生产款号: '',
|
|
|
+ 款式: '',
|
|
|
+ 客户编号: '',
|
|
|
+ 落货日期: '',
|
|
|
+ 箱唛要求: '',
|
|
|
+ 面料: '',
|
|
|
+ 要求: '',
|
|
|
+ 船样描述: '',
|
|
|
+ 船样合计: '',
|
|
|
+ 粘衬: '',
|
|
|
+ 订单数量: '',
|
|
|
+ 单位: '件',
|
|
|
+ Sys_id: '',
|
|
|
+ 制单日期: '',
|
|
|
+ 审核日期: '',
|
|
|
+ 合并: false,
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ const add_gddialogFormVisible = ref(false)
|
|
|
+ //点击新增订单资料按钮
|
|
|
+ const addgd_onclick = async () => {
|
|
|
+
|
|
|
+ console.log("用户信息", _username.value);
|
|
|
+ // 判断客户代号是否为空
|
|
|
+ if (!_Gd_khdh.value) {
|
|
|
+ ElMessage({ type: 'warning', message: '请选择具体的客户后,再操作此功能' });
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ syncUploadFileList('');
|
|
|
+ add_gdscgdformData.img = '';
|
|
|
+ add_gddialogFormVisible.value = true;
|
|
|
+ zsglddtableData.value = [];
|
|
|
+ await getProductStyleData();
|
|
|
+ //获取订单编号接口
|
|
|
+ const getWorkOrder_list = await getWorkOrder();
|
|
|
+ add_gdscgdformData['订单编号'] = getWorkOrder_list.data;
|
|
|
+ add_gdscgdformData['客户编号'] = _Gd_khdh.value
|
|
|
+ add_gdscgdformData['Sys_id'] = _username.value
|
|
|
+ add_gdscgdformData['制单日期'] = currentDates
|
|
|
+ }
|
|
|
+
|
|
|
+ //操作移除按钮
|
|
|
+ const deleteRow = (index) => {
|
|
|
+ //当前点击索引值
|
|
|
+ console.log(index)
|
|
|
+ console.log(zsglddtableData)
|
|
|
+ //移除当前行
|
|
|
+ zsglddtableData.value.splice(index, 1);
|
|
|
+ }
|
|
|
+ const fullscreenLoading = ref(false); // 控制全屏加载
|
|
|
+ const isClickable = ref(true); // 控制按钮是否可点击
|
|
|
+
|
|
|
+ const resetAddOrderForm = () => {
|
|
|
+ Object.assign(add_gdscgdformData, {
|
|
|
+ 订单编号: '',
|
|
|
+ 生产款号: '',
|
|
|
+ 款式: '',
|
|
|
+ 客户编号: '',
|
|
|
+ 落货日期: '',
|
|
|
+ 箱唛要求: '',
|
|
|
+ 面料: '',
|
|
|
+ 要求: '',
|
|
|
+ 备注: '',
|
|
|
+ 船样描述: '',
|
|
|
+ 船样合计: '',
|
|
|
+ 粘衬: '',
|
|
|
+ 订单数量: '',
|
|
|
+ 单位: '件',
|
|
|
+ Sys_id: '',
|
|
|
+ 制单日期: '',
|
|
|
+ 审核日期: '',
|
|
|
+ 合并: false,
|
|
|
+ img: '',
|
|
|
+ });
|
|
|
+ zsglddtableData.value = [];
|
|
|
+ syncUploadFileList('');
|
|
|
+ };
|
|
|
+
|
|
|
+ //新增工单资料确定
|
|
|
+ const add_gdenterDialog = async () => {
|
|
|
+ if (!isClickable.value) return;
|
|
|
+
|
|
|
+ // 先校验,通过后再 Loading,避免未填完就全屏卡住
|
|
|
+ const fields = [
|
|
|
+ { key: '款式', message: '款式不能为空' },
|
|
|
+ { key: '订单编号', message: '网络异常, 请重新打开' },
|
|
|
+ { key: '客户编号', message: '网络异常, 请重新打开' },
|
|
|
+ { key: '落货日期', message: '落货日期不能为空' },
|
|
|
+ { key: '订单数量', message: '订单数量不能为空' },
|
|
|
+ { key: '面料', message: '缺少面料信息,无法完成提交,请提供面料数据以便获取BOM资料数据' },
|
|
|
+ ];
|
|
|
+ for (const field of fields) {
|
|
|
+ if (!add_gdscgdformData[field.key]) {
|
|
|
+ ElMessage({ type: 'warning', message: field.message });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ if (!add_gdscgdformData['制单日期']) {
|
|
|
+ ElMessage({ type: 'warning', message: '制单日期不能为空' });
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ isClickable.value = false;
|
|
|
+ const loadingInstance = ElLoading.service({
|
|
|
+ lock: true,
|
|
|
+ text: '正在自动获取生成BOM面料资料,请稍候...',
|
|
|
+ background: 'rgba(0, 0, 0, 0.8)',
|
|
|
+ spinner: 'el-icon-loading',
|
|
|
+ });
|
|
|
+
|
|
|
+ try {
|
|
|
+ let lhrq_formattedDeliveryDate = '';
|
|
|
+ if (add_gdscgdformData['落货日期']) {
|
|
|
+ const date = new Date(add_gdscgdformData['落货日期']);
|
|
|
+ lhrq_formattedDeliveryDate = `${date.getFullYear()}-${('0' + (date.getMonth() + 1)).slice(-2)}-${('0' + date.getDate()).slice(-2)}`;
|
|
|
+ }
|
|
|
+
|
|
|
+ const ids = zsglddtableData.value.map(item => item.UNIQID);
|
|
|
+ const dds = zsglddtableData.value.map(item => item.订单编号);
|
|
|
+ const uniqueIds = [...new Set(ids)];
|
|
|
+ const uniqueDds = [...new Set(dds)];
|
|
|
+ const formattedIds = uniqueIds.join(',');
|
|
|
+ const formattedDds = uniqueDds.join(',');
|
|
|
+
|
|
|
+ console.log('关联订单编号:', formattedDds);
|
|
|
+ console.log('关联订单UNIQID:', formattedIds);
|
|
|
+
|
|
|
+ const formattedData = {
|
|
|
+ 订单编号: add_gdscgdformData['订单编号'],
|
|
|
+ 生产款号: add_gdscgdformData['生产款号'],
|
|
|
+ 款式: add_gdscgdformData['款式'],
|
|
|
+ 客户编号: add_gdscgdformData['客户编号'],
|
|
|
+ 落货日期: lhrq_formattedDeliveryDate,
|
|
|
+ 箱唛要求: add_gdscgdformData['箱唛要求'],
|
|
|
+ 面料: add_gdscgdformData['面料'],
|
|
|
+ 要求: add_gdscgdformData['备注'],
|
|
|
+ 船样描述: add_gdscgdformData['船样描述'],
|
|
|
+ 船样合计: add_gdscgdformData['船样合计'],
|
|
|
+ 粘衬: add_gdscgdformData['粘衬'],
|
|
|
+ 订单数量: add_gdscgdformData['订单数量'],
|
|
|
+ 单位: add_gdscgdformData['单位'],
|
|
|
+ Sys_id: _username.value,
|
|
|
+ 接单日期: currentDates,
|
|
|
+ img: add_gdscgdformData.img,
|
|
|
+ 关联订单: formattedDds,
|
|
|
+ 关联面料ID: formattedIds,
|
|
|
+ };
|
|
|
+
|
|
|
+ console.log(formattedData);
|
|
|
+
|
|
|
+ const edit_gdformdata_list = await WorkOrderAdd(formattedData);
|
|
|
+ if (edit_gdformdata_list.code === 0) {
|
|
|
+ resetAddOrderForm();
|
|
|
+ add_gddialogFormVisible.value = false;
|
|
|
+ ElMessage({ type: 'success', message: '新增成功' });
|
|
|
+ const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: 1, limit: 50 });
|
|
|
+ tableData.value = WorkListdata.data.data;
|
|
|
+ } else {
|
|
|
+ ElMessage({ type: 'error', message: edit_gdformdata_list.msg || edit_gdformdata_list.message || '新增失败' });
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('Error:', error);
|
|
|
+ const msg = error?.response?.data?.msg || error?.response?.data?.message || error?.message || '操作失败,请重试'
|
|
|
+ ElMessage({ type: 'error', message: msg });
|
|
|
+ } finally {
|
|
|
+ isClickable.value = true;
|
|
|
+ loadingInstance.close();
|
|
|
+ }
|
|
|
+ };
|
|
|
+ //新增工单资料取消 / 关闭
|
|
|
+ const add_gdcloseDialog = (done) => {
|
|
|
+ resetAddOrderForm();
|
|
|
+ add_gddialogFormVisible.value = false;
|
|
|
+ if (typeof done === 'function') done();
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // =========== 关联订单资料 ===========
|
|
|
+ const Related_fabricsVisible = ref(false)
|
|
|
+ const glddzl_keyword = ref('')
|
|
|
+ const glddtableData = reactive([])
|
|
|
+ // 关联订单面料按钮
|
|
|
+ const Related_fabrics = () => {
|
|
|
+ Related_fabricsVisible.value = true
|
|
|
+ // glddtableData.splice(0, glddtableData.length);//清空表格
|
|
|
+ ddsearchHandle()
|
|
|
+ }
|
|
|
+
|
|
|
+ //实时触发input
|
|
|
+ const real_handleInput = async ()=>{
|
|
|
+ glddtableData.splice(0, glddtableData.length);//清空表格
|
|
|
+ ddsearchHandle()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关联订单面料搜索
|
|
|
+ const ddsearchHandle = async (v) => {
|
|
|
+ console.log(v)
|
|
|
+ glddtableData.splice(0, glddtableData.length);//清空表格
|
|
|
+
|
|
|
+ //搜索面料库存数据列表接口
|
|
|
+ const response = await fabricList({order:v});
|
|
|
+ if (response.data && response.data.length === 0) {
|
|
|
+ ElMessage({type: 'warning',message: '未查询到搜索条件'})
|
|
|
+ }else{
|
|
|
+ // 确保 response.data 和 response.data.table 存在
|
|
|
+ if (response?.data?.table) {
|
|
|
+ glddtableData.value = response.data.table.map(item => ({
|
|
|
+ ...item,
|
|
|
+ checked: false, // 初始化时默认未勾选
|
|
|
+ }));
|
|
|
+ glddtableData.splice(0, response.data.table.total, ...response.data.table);
|
|
|
+ } else {
|
|
|
+ console.error("response.data.table 不存在或为空:", response.data);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const gldd_Selection = ref('') // 存储选中Uniqid
|
|
|
+ const gldd_Selection_ddbh = ref('') // 存储选中订单编号
|
|
|
+ const zsglddtableData = ref([]) // 存储最终选择的订单数据
|
|
|
+ const currentSelectedRows = ref([]) // 新增:存储当前选中的行数据
|
|
|
+
|
|
|
+ const glddSelectionChange = (selection) => {
|
|
|
+ console.log("当前选中的数据:", selection)
|
|
|
+ currentSelectedRows.value = selection // 存储当前选中的行数据
|
|
|
+ // 更新 glddtableData 中每一行的 checked 状态
|
|
|
+ glddtableData.value = glddtableData.value.map(item => {
|
|
|
+ return {
|
|
|
+ ...item,
|
|
|
+ checked: selection.some(selectedItem => selectedItem.UNIQID === item.UNIQID)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关联订单取消
|
|
|
+ const Related_fabricscloseDialog = () => {
|
|
|
+ gldd_Selection.value = ''
|
|
|
+ Related_fabricsVisible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关联订单确定
|
|
|
+ const Related_fabricsenterDialog = () => {
|
|
|
+ if (currentSelectedRows.value.length === 0) {
|
|
|
+ ElMessage.warning('请至少选择一条数据')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ console.log("确定选择的数据:", currentSelectedRows.value)
|
|
|
+
|
|
|
+ // 将选中的数据添加到 zsglddtableData
|
|
|
+ zsglddtableData.value = [...zsglddtableData.value, ...currentSelectedRows.value]
|
|
|
+
|
|
|
+ // 提取UNIQID和订单编号
|
|
|
+ gldd_Selection.value = currentSelectedRows.value.map(item => item.UNIQID).join(',')
|
|
|
+ gldd_Selection_ddbh.value = currentSelectedRows.value.map(item => item.订单编号).join(',')
|
|
|
+
|
|
|
+ // 关闭弹窗
|
|
|
+ Related_fabricsVisible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // =========== 新增颜色资料 ===========
|
|
|
+ const add_gdyjdialogFormVisible = ref(false)
|
|
|
+ const add_yszlformdata = reactive({
|
|
|
+ ddh: '',
|
|
|
+ ddzbh: '',
|
|
|
+ sxmc: '',
|
|
|
+ cmgg: '',
|
|
|
+ sfcy: '',
|
|
|
+ ysbz: '',
|
|
|
+ });
|
|
|
+ const cmformdata = reactive({
|
|
|
+ cm1:'32',
|
|
|
+ cm2:'34',
|
|
|
+ cm3:'36',
|
|
|
+ cm4:'38',
|
|
|
+ cm5:'40',
|
|
|
+ cm6:'42',
|
|
|
+ cm7:'44',
|
|
|
+ cm8:'46',
|
|
|
+ cm9:'48',
|
|
|
+ cm10:'',
|
|
|
+ cm11:'',
|
|
|
+ cm12:'',
|
|
|
+ cm13:'',
|
|
|
+ cm14:'',
|
|
|
+ sctotal:'总计',
|
|
|
+ });
|
|
|
+ const zdsformdata = reactive({
|
|
|
+ zds1:'',
|
|
|
+ zds2:'',
|
|
|
+ zds3:'',
|
|
|
+ zds4:'',
|
|
|
+ zds5:'',
|
|
|
+ zds6:'',
|
|
|
+ zds7:'',
|
|
|
+ zds8:'',
|
|
|
+ zds9:'',
|
|
|
+ zds10:'',
|
|
|
+ zds11:'',
|
|
|
+ zds12:'',
|
|
|
+ zds13:'',
|
|
|
+ zds14:'',
|
|
|
+ zdtotal:'',
|
|
|
+ });
|
|
|
+ //记录色系编号
|
|
|
+ const add_colorcode = ref('')
|
|
|
+
|
|
|
+ //选择色系名称获取子订单编号
|
|
|
+ const xz_sxhandleSizeChange = async (value,color_id) => {
|
|
|
+
|
|
|
+ //获取子订单编号
|
|
|
+ const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:add_yszlformdata.sfcy});
|
|
|
+ console.log("获取子订单编号",getPonumberdata)
|
|
|
+ add_yszlformdata.ddzbh = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
|
|
|
+
|
|
|
+ if (value === '红色系') {
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ } else if(value === '黄色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '蓝色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '绿色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '紫色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '灰色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '咖啡色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '黑色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '经典色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }else if(value === '白色系'){
|
|
|
+ add_yszlformdata.sxmc = value
|
|
|
+ add_colorcode.value = color_id
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const edit_formData = reactive({
|
|
|
+ '颜色': ''
|
|
|
+ });
|
|
|
+
|
|
|
+ //记录色系编号
|
|
|
+ const edit_colorcode = ref('')
|
|
|
+ const xg_sxhandleSizeChange = async (value,color_id) => {
|
|
|
+
|
|
|
+ const getPonumberdata = await getSuborder({colorname:value,order:_ddhval.value,cy:edit_formData['船样']});
|
|
|
+ console.log(edit_formData.value)
|
|
|
+ if(edit_formData.value['颜色'] === edit_formData['颜色']){
|
|
|
+ edit_formData['子订单编号'] = edit_formData.value['子订单编号']
|
|
|
+ }else{
|
|
|
+ edit_formData['子订单编号'] = getPonumberdata.data.order ? getPonumberdata.data.order : getPonumberdata.data;
|
|
|
+ }
|
|
|
+ if (value === '红色系') {
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ } else if(value === '黄色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ }else if(value === '蓝色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ }else if(value === '绿色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ }else if(value === '紫色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ }else if(value === '灰色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ }else if(value === '咖啡色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ }else if(value === '黑色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ edit_colorcode.value = color_id
|
|
|
+ }else if(value === '经典色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ }else if(value === '白色系'){
|
|
|
+ edit_formData['颜色'] = value
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ //清空对象的属性值
|
|
|
+ const gdyj_clearFormData = () => {
|
|
|
+ Object.keys(zdsformdata).forEach(key => {
|
|
|
+ zdsformdata[key] = '';
|
|
|
+ });
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ //点击是否船样 改变子订单编号
|
|
|
+ const cyChange = async (value) => {
|
|
|
+ if (value === '是') {
|
|
|
+ add_yszlformdata.ddzbh = _Gd_gdbh.value + '-99'
|
|
|
+ const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'是',colorname:add_yszlformdata['sxmc']});
|
|
|
+ add_yszlformdata['ddzbh'] = getSuborders.data;
|
|
|
+ }else if(value === '否'){
|
|
|
+ const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:add_yszlformdata['sxmc']});
|
|
|
+ add_yszlformdata['ddzbh'] = getSuborders.data.order;
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const getSuborderscolor = reactive({
|
|
|
+ colorlist: []
|
|
|
+ });
|
|
|
+
|
|
|
+ //新增颜色资料按钮
|
|
|
+ const addgdyj_onclick = async () => {
|
|
|
+ if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
+ ElMessage({type: 'warning',message: '请选择具体的订单后,再操作此功能'})
|
|
|
+ return false;
|
|
|
+ }else{
|
|
|
+ add_gdyjdialogFormVisible.value = true
|
|
|
+ add_yszlformdata['sxmc'] = '红色系';
|
|
|
+ const getSuborders = await getSuborder({order:_Gd_gdbh.value,cy:'否',colorname:'红色系'});
|
|
|
+ console.log(getSuborders)
|
|
|
+
|
|
|
+
|
|
|
+ getSuborderscolor.colorlist = getSuborders.data.colorlist;
|
|
|
+
|
|
|
+ add_yszlformdata['ddzbh'] = getSuborders.data.order;
|
|
|
+ // 假设获取的数据是 getSuborders.data
|
|
|
+ if (getSuborders.data.cm) {
|
|
|
+ // 判断并赋值
|
|
|
+ cmformdata.cm1 = getSuborders.data.cm.cm1 || '';
|
|
|
+ cmformdata.cm2 = getSuborders.data.cm.cm2 || '';
|
|
|
+ cmformdata.cm3 = getSuborders.data.cm.cm3 || '';
|
|
|
+ cmformdata.cm4 = getSuborders.data.cm.cm4 || '';
|
|
|
+ cmformdata.cm5 = getSuborders.data.cm.cm5 || '';
|
|
|
+ cmformdata.cm6 = getSuborders.data.cm.cm6 || '';
|
|
|
+ cmformdata.cm7 = getSuborders.data.cm.cm7 || '';
|
|
|
+ cmformdata.cm8 = getSuborders.data.cm.cm8 || '';
|
|
|
+ cmformdata.cm9 = getSuborders.data.cm.cm9 || '';
|
|
|
+ cmformdata.cm10 = getSuborders.data.cm.cm10 || '';
|
|
|
+ cmformdata.cm11 = getSuborders.data.cm.cm11 || '';
|
|
|
+ cmformdata.cm12 = getSuborders.data.cm.cm12 || '';
|
|
|
+ cmformdata.cm13 = getSuborders.data.cm.cm13 || '';
|
|
|
+ cmformdata.cm14 = getSuborders.data.cm.cm14 || '';
|
|
|
+ cmformdata.sctotal = '合计';
|
|
|
+ }
|
|
|
+
|
|
|
+ add_yszlformdata['ddh'] = _Gd_gdbh.value;
|
|
|
+ add_yszlformdata['ys'] = '';
|
|
|
+ add_yszlformdata['kh'] = '';
|
|
|
+ add_yszlformdata['sfcy'] = '否';
|
|
|
+ add_yszlformdata['颜色备注'] = '否';
|
|
|
+ add_yszlformdata['kdy'] = _username.value;
|
|
|
+ gdyj_clearFormData();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ const child_order = ref('')
|
|
|
+ //单机颜色资料表格
|
|
|
+ const ystableclick = async (row) => {
|
|
|
+ // console.log(row.子订单编号)
|
|
|
+ // child_order.value = row.子订单编号
|
|
|
+ }
|
|
|
+
|
|
|
+ //部件资料行点击
|
|
|
+ const partTableRowClick = async (row) => {
|
|
|
+ // console.log(row.部件编号)
|
|
|
+ }
|
|
|
+
|
|
|
+ //部件资料行双击
|
|
|
+ const partRowDblclick = async (row) => {
|
|
|
+ // console.log(row.部件编号)
|
|
|
+ }
|
|
|
+
|
|
|
+//限制尺码输入规则
|
|
|
+function handleSizeInput(field) {
|
|
|
+ // 获取当前字段的值
|
|
|
+ let value = cmformdata[field];
|
|
|
+ // 使用正则表达式过滤,只保留字母和数字,并将字母转换为大写
|
|
|
+ const filteredValue = value.replace(/[^a-zA-Z0-9]/g, '').replace(/[a-z]/g, (match) => match.toUpperCase());
|
|
|
+ // 更新字段值
|
|
|
+ cmformdata[field] = filteredValue; // 直接更新 reactive 对象的属性
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+function Input_handle() {
|
|
|
+ add_gdscgdformData['订单数量'] = add_gdscgdformData['订单数量'].replace(/[^\d]/g, '')
|
|
|
+ add_gdscgdformData['船样合计'] = add_gdscgdformData['船样合计'].replace(/[^\d]/g, '')
|
|
|
+
|
|
|
+ edit_ddformData.value['订单数量'] = String(edit_ddformData.value['订单数量'] ?? '').replace(/[^\d]/g, '')
|
|
|
+ edit_ddformData.value['船样合计'] = String(edit_ddformData.value['船样合计'] ?? '').replace(/[^\d]/g, '')
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ //新增颜色资料确定
|
|
|
+ const add_gdyjenterDialog = async () => {
|
|
|
+ updateTotal()
|
|
|
+ //必填
|
|
|
+ if(add_yszlformdata['kh'] === ''){
|
|
|
+ ElMessage({type: 'warning',message: '款号不能为空'})
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if(add_yszlformdata['ysbz'] === ''){
|
|
|
+ ElMessage({type: 'warning',message: '颜色备注不能为空'})
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ if(add_yszlformdata['sxmc'] === ''){
|
|
|
+ ElMessage({type: 'warning',message: '色系名称不能为空'})
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+
|
|
|
+ let cy = '';
|
|
|
+ if(add_yszlformdata['sfcy'] === '是'){
|
|
|
+ cy = '1'
|
|
|
+ }else if(add_yszlformdata['sfcy'] === '否'){
|
|
|
+ cy = '0'
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //获取颜色编号id
|
|
|
+ const getPonumberdata = await getSuborder({colorname:add_yszlformdata['sxmc'],order:_ddhval.value,cy:add_yszlformdata['sfcy']});
|
|
|
+ // 从返回中提取 colorlist
|
|
|
+ const colorlist = getPonumberdata.data.colorlist || [];
|
|
|
+ // 获取匹配的颜色项
|
|
|
+ const match = colorlist.find(item => item.colorname === add_yszlformdata['sxmc']);
|
|
|
+ if (match) {
|
|
|
+ add_colorcode.value = match.colorcode;
|
|
|
+ } else {
|
|
|
+ console.warn('未找到匹配的颜色');
|
|
|
+ }
|
|
|
+
|
|
|
+ const addyszltable = {
|
|
|
+ 订单编号: add_yszlformdata['ddh'],
|
|
|
+ 子订单编号: add_yszlformdata['ddzbh'],
|
|
|
+ 颜色: add_yszlformdata['sxmc'],
|
|
|
+ 款号: add_yszlformdata['kh'],
|
|
|
+ 颜色备注:add_yszlformdata.ysbz,
|
|
|
+ 船样: cy,
|
|
|
+ Sys_id:add_yszlformdata['kdy'],
|
|
|
+ color_id:add_colorcode.value,
|
|
|
+ //尺码
|
|
|
+ cm1: cmformdata['cm1'],
|
|
|
+ cm2: cmformdata['cm2'],
|
|
|
+ cm3: cmformdata['cm3'],
|
|
|
+ cm4: cmformdata['cm4'],
|
|
|
+ cm5: cmformdata['cm5'],
|
|
|
+ cm6: cmformdata['cm6'],
|
|
|
+ cm7: cmformdata['cm7'],
|
|
|
+ cm8: cmformdata['cm8'],
|
|
|
+ cm9: cmformdata['cm9'],
|
|
|
+ cm10: cmformdata['cm10'],
|
|
|
+ cm11: cmformdata['cm11'],
|
|
|
+ cm12: cmformdata['cm12'],
|
|
|
+ cm13: cmformdata['cm13'],
|
|
|
+ cm14: cmformdata['cm14'],
|
|
|
+ sctotal: cmformdata['sctotal'],
|
|
|
+ //尺码数量
|
|
|
+ cmsl1: zdsformdata['zds1'],
|
|
|
+ cmsl2: zdsformdata['zds2'],
|
|
|
+ cmsl3: zdsformdata['zds3'],
|
|
|
+ cmsl4: zdsformdata['zds4'],
|
|
|
+ cmsl5: zdsformdata['zds5'],
|
|
|
+ cmsl6: zdsformdata['zds6'],
|
|
|
+ cmsl7: zdsformdata['zds7'],
|
|
|
+ cmsl8: zdsformdata['zds8'],
|
|
|
+ cmsl9: zdsformdata['zds9'],
|
|
|
+ cmsl10: zdsformdata['zds10'],
|
|
|
+ cmsl11: zdsformdata['zds11'],
|
|
|
+ cmsl12: zdsformdata['zds12'],
|
|
|
+ cmsl13: zdsformdata['zds13'],
|
|
|
+ cmsl14: zdsformdata['zds14'],
|
|
|
+ zdtotal: zdsformdata['zdtotal'],
|
|
|
+ };
|
|
|
+ console.log(addyszltable)
|
|
|
+ // return;
|
|
|
+ const printDetailAdds = await printDetailAdd(addyszltable);
|
|
|
+ if (printDetailAdds.code === 0) {
|
|
|
+ add_gdyjdialogFormVisible.value = false;
|
|
|
+ ElMessage({type: 'success',message: '新增成功'})
|
|
|
+ }
|
|
|
+ const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
+ if(PrintListDatas.data.列表.length === 0){
|
|
|
+ ystableData.length = 0
|
|
|
+ }else{
|
|
|
+ sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);
|
|
|
+ ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);
|
|
|
+
|
|
|
+ const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
+ bomtableData.value = orderBomListdata.data
|
|
|
+ bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
|
|
|
+
|
|
|
+ const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
|
|
|
+ console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
|
|
|
+
|
|
|
+ if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
|
|
|
+ // 如果 data.table 是数组且不为空,更新表格数据
|
|
|
+ mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
|
|
|
+ } else {
|
|
|
+ // 如果 data.table 为空或无效,清空表格数据
|
|
|
+ mltableData.splice(0, mltableData.length);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //新增颜色资料取消
|
|
|
+ const add_dyjcloseDialog = () => {
|
|
|
+ add_gdyjdialogFormVisible.value = false
|
|
|
+ }
|
|
|
+ //键盘input框跳转
|
|
|
+ const add_gdzlent = async (event,id1,id2,id3,idx) => {
|
|
|
+ if(event.keyCode === 40){
|
|
|
+ if(id3!=''){
|
|
|
+ document.getElementById(id3).focus()
|
|
|
+ }
|
|
|
+ }else if (event.keyCode === 13) { // Enter 或向下箭头
|
|
|
+ if(id3!=''){
|
|
|
+ document.getElementById(id3).focus()
|
|
|
+ }
|
|
|
+ } else if (event.keyCode === 38) { // 向上箭头
|
|
|
+ if(id1!=''){
|
|
|
+ document.getElementById(id1).focus()
|
|
|
+ }
|
|
|
+ }else if (event.keyCode === 8) { // 删除箭头
|
|
|
+ if(id1!='' && document.getElementById(id2).value==''){
|
|
|
+ document.getElementById(id1).focus()
|
|
|
+ }
|
|
|
+ }else if (event.keyCode === 37) { // 向左箭头
|
|
|
+ if(id1!='' && document.getElementById(id2).selectionStart==0){
|
|
|
+ document.getElementById(id1).focus()
|
|
|
+ }
|
|
|
+ }else if (event.keyCode === 39) { // 向右箭头
|
|
|
+ if(id3!='' && document.getElementById(id2).selectionStart == document.getElementById(id2).value.length){
|
|
|
+ document.getElementById(id3).focus()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // =========== 新增工序资料 ===========
|
|
|
+ const visible = ref(false)
|
|
|
+ // 新增部件资料相关
|
|
|
+ const partAddDialogVisible = ref(false)
|
|
|
+ const partIsEdit = ref(false)
|
|
|
+ const partAddForm = reactive({
|
|
|
+ 部件序号: '',
|
|
|
+ 部件名称: ''
|
|
|
+ })
|
|
|
+ const partAddRows = ref([])
|
|
|
+ const partAddExistingNames = ref(new Set())
|
|
|
+ const partAddMaxExistingSort = ref(0)
|
|
|
+ const partNameOptions = ref([])
|
|
|
+
|
|
|
+ // 排序相关状态
|
|
|
+const sortPartGyDialogVisible = ref(false)
|
|
|
+const sortDialogLoading = ref(false)
|
|
|
+const sortDialogSewingGroups = ref([])
|
|
|
+const sortDialogStageGys = ref({ 裁剪: [], 手工: [], 大烫: [], 总检: [] })
|
|
|
+const sortDialogViewStage = ref('裁剪')
|
|
|
+const sortDialogSelectedPartId = ref(null)
|
|
|
+const sortDialogInitialSnapshot = ref(null)
|
|
|
+const sortDialogSubmitLoading = ref(false)
|
|
|
+
|
|
|
+// 排序弹窗相关计算属性
|
|
|
+const sortDialogRightPanelReady = computed(() => {
|
|
|
+ const vs = sortDialogViewStage.value
|
|
|
+ if (!vs) return false
|
|
|
+ if (vs === '车缝') return sortDialogSelectedPartId.value != null
|
|
|
+ return true
|
|
|
+})
|
|
|
+
|
|
|
+const sortDialogRightActiveSewingGroup = computed(() => {
|
|
|
+ if (sortDialogViewStage.value !== '车缝' || sortDialogSelectedPartId.value == null) return null
|
|
|
+ return (
|
|
|
+ sortDialogSewingGroups.value.find(
|
|
|
+ (g) => String(g.part?.id) === String(sortDialogSelectedPartId.value)
|
|
|
+ ) ?? null
|
|
|
+ )
|
|
|
+})
|
|
|
+
|
|
|
+const sortDialogActiveGysList = computed(() => {
|
|
|
+ const vs = sortDialogViewStage.value
|
|
|
+ if (vs && vs !== '车缝') {
|
|
|
+ return sortDialogStageGys.value[vs] ?? []
|
|
|
+ }
|
|
|
+ if (vs === '车缝' && sortDialogRightActiveSewingGroup.value) {
|
|
|
+ return sortDialogRightActiveSewingGroup.value.gys ?? []
|
|
|
+ }
|
|
|
+ return []
|
|
|
+})
|
|
|
+
|
|
|
+
|
|
|
+// 复制产品资料相关状态
|
|
|
+const copyProductDialogVisible = ref(false)
|
|
|
+const copyProductFormData = ref({
|
|
|
+ gdbh: '',
|
|
|
+ ks: ''
|
|
|
+})
|
|
|
+const copyProductTableData = ref([])
|
|
|
+const copyProductSelectedRow = ref(null)
|
|
|
+const copyProductTableRef = ref(null)
|
|
|
+const copyProductSearchText = ref('')
|
|
|
+
|
|
|
+// 排序相关常量
|
|
|
+const PROCESS_ADD_STAGE_ORDER = ['裁剪', '车缝', '手工', '大烫', '总检']
|
|
|
+const SORT_NON_SEWING_STAGES = ['裁剪', '手工', '大烫', '总检']
|
|
|
+
|
|
|
+// 排序相关状态
|
|
|
+const sortDialogVisible = ref(false)
|
|
|
+const sortTableData = ref([])
|
|
|
+
|
|
|
+ // 新增工艺资料相关
|
|
|
+ const processAddDialogVisible = ref(false)
|
|
|
+
|
|
|
+ watch(processAddDialogVisible, async (visible) => {
|
|
|
+ if (!visible && gyDetailDialogVisible.value) {
|
|
|
+ await refreshGyDetailProcessList()
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ const processIsEdit = ref(false)
|
|
|
+ const processSubmitLoading = ref(false)
|
|
|
+ const processFormRef = ref(null)
|
|
|
+ const processForm = reactive({
|
|
|
+ id: undefined,
|
|
|
+ 工艺序号: '',
|
|
|
+ 工艺名称: '',
|
|
|
+ 生产工序: '',
|
|
|
+ 标准工时: undefined,
|
|
|
+ 标准工分: undefined,
|
|
|
+ 难度系数: 1,
|
|
|
+ })
|
|
|
+ const processFormRules = {
|
|
|
+ 工艺名称: [{ required: true, message: '请选择或输入工艺名称', trigger: 'change' }],
|
|
|
+ 生产工序: [{ required: true, message: '请选择生产工序', trigger: 'change' }],
|
|
|
+ }
|
|
|
+
|
|
|
+ const processAddPartList = ref([])
|
|
|
+ const processAddSelectedStage = ref('裁剪')
|
|
|
+ const processAddSelectedPartKey = ref(null)
|
|
|
+ const processAddByPartRows = ref({})
|
|
|
+ const processAddActivePart = ref(null)
|
|
|
+ const processAddCurrentRowKey = ref(null)
|
|
|
+ const processLibAddSubmitCount = ref(0)
|
|
|
+
|
|
|
+ const processAddDialogTableHeight = ref(460)
|
|
|
+
|
|
|
+ function processAddStageKey(bigProcess) {
|
|
|
+ return `stg_${String(bigProcess ?? '').trim()}`
|
|
|
+ }
|
|
|
+ function isProcessAddStageListKey(k) {
|
|
|
+ return typeof k === 'string' && k.startsWith('stg_')
|
|
|
+ }
|
|
|
+
|
|
|
+ const PROCESS_LIB_LIST_LIMIT = 200
|
|
|
+ const processLibNameOptions = ref([])
|
|
|
+ const processLibByName = ref({})
|
|
|
+ const processLibFilterQuery = ref('')
|
|
|
+
|
|
|
+ const filteredProcessLibNameOptions = computed(() => {
|
|
|
+ const q = processLibFilterQuery.value.trim().toLowerCase()
|
|
|
+ const list = processLibNameOptions.value
|
|
|
+ if (!q) return list
|
|
|
+ return list.filter((opt) => {
|
|
|
+ const name = String(opt.value ?? '').toLowerCase()
|
|
|
+ const code = String(opt.code ?? '').toLowerCase()
|
|
|
+ const bp = String(opt.big_process ?? '').toLowerCase()
|
|
|
+ return name.includes(q) || code.includes(q) || bp.includes(q) || `${code} ${name}`.trim().includes(q)
|
|
|
+ })
|
|
|
+ })
|
|
|
+
|
|
|
+ const filteredProcessLibNameOptionsForProcessAdd = computed(() => filteredProcessLibNameOptions.value)
|
|
|
+
|
|
|
+ async function loadProcessLibNameOptions(req) {
|
|
|
+ const toNum = (v) => {
|
|
|
+ if (v === undefined || v === null || v === '') return undefined
|
|
|
+ const n = Number(v)
|
|
|
+ return Number.isFinite(n) ? n : undefined
|
|
|
+ }
|
|
|
+ const q = String(req?.search ?? '').trim()
|
|
|
+ try {
|
|
|
+ // 使用 GetProcessList 获取当前工单的工艺数据
|
|
|
+ const res = await GetProcessList({ workorder: _Gd_gdbh.value })
|
|
|
+ if (res?.code !== 0) {
|
|
|
+ processLibNameOptions.value = []
|
|
|
+ processLibByName.value = {}
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const list = res?.data ?? []
|
|
|
+
|
|
|
+ // 根据大工艺筛选数据
|
|
|
+ let filteredList = list
|
|
|
+ if (q) {
|
|
|
+ filteredList = list.filter((row) => {
|
|
|
+ const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
|
|
|
+ // 车缝包含车缝和烫工(小烫按部件算)
|
|
|
+ if (q === '车缝') {
|
|
|
+ return bp === '车缝' || bp === '烫工'
|
|
|
+ }
|
|
|
+ // 其他工序直接匹配
|
|
|
+ return bp === q
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ const seen = new Set()
|
|
|
+ const opts = []
|
|
|
+ const byName = {}
|
|
|
+ for (const row of filteredList) {
|
|
|
+ const name = String(row.gy_name ?? row['工艺名称'] ?? '').trim()
|
|
|
+ if (!name || seen.has(name)) continue
|
|
|
+ seen.add(name)
|
|
|
+ const sort = String(row.gy_sort ?? row.gy_code ?? row['工艺序号'] ?? row['工艺编号'] ?? '').trim()
|
|
|
+ const bp = String(row.big_process ?? row['大工艺'] ?? row['生产工序'] ?? '').trim()
|
|
|
+ opts.push({ value: name, code: sort, big_process: bp })
|
|
|
+ byName[name] = {
|
|
|
+ gy_sort: sort,
|
|
|
+ gy_code: String(row.gy_code ?? row['工艺编号'] ?? '').trim(),
|
|
|
+ big_process: bp,
|
|
|
+ standard_hour: toNum(row.standard_hour ?? row['标准工时']),
|
|
|
+ standard_score: toNum(row.standard_score ?? row['标准公分'] ?? row['标准工分']),
|
|
|
+ difficulty_coef: toNum(row.difficulty_coef ?? row['系数'] ?? row['难度系数']) ?? 1,
|
|
|
+ }
|
|
|
+ }
|
|
|
+ processLibNameOptions.value = opts
|
|
|
+ processLibByName.value = byName
|
|
|
+ } catch (e) {
|
|
|
+ console.error(e)
|
|
|
+ processLibNameOptions.value = []
|
|
|
+ processLibByName.value = {}
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function processLibOptStageText(opt) {
|
|
|
+ const s = String(opt?.big_process ?? '').trim()
|
|
|
+ return s || '—'
|
|
|
+ }
|
|
|
+ function onProcessLibSelectFilter(query) {
|
|
|
+ processLibFilterQuery.value = query == null ? '' : String(query)
|
|
|
+ }
|
|
|
+ function onProcessLibSelectVisible(visible) {
|
|
|
+ if (visible) processLibFilterQuery.value = ''
|
|
|
+ }
|
|
|
+
|
|
|
+ function processAddPartBlockKey(part, index) {
|
|
|
+ return `p_${String(part?.id ?? part?.part_sort ?? part?.['部件序号'] ?? index)}`
|
|
|
+ }
|
|
|
+
|
|
|
+ function onProcessAddSelectStage(stage) {
|
|
|
+ processAddSelectedStage.value = stage
|
|
|
+ if (stage !== '车缝') {
|
|
|
+ processAddSelectedPartKey.value = null
|
|
|
+ processAddActivePart.value = null
|
|
|
+ const stgKey = processAddStageKey(stage)
|
|
|
+ processAddCurrentRowKey.value = stgKey
|
|
|
+ if (!processAddByPartRows.value[stgKey]) {
|
|
|
+ processAddByPartRows.value[stgKey] = [newProcessLibRow()]
|
|
|
+ }
|
|
|
+ loadProcessLibNameOptions({ search: stage })
|
|
|
+ } else {
|
|
|
+ const parts = processAddPartList.value
|
|
|
+ if (parts.length) {
|
|
|
+ const first = parts[0]
|
|
|
+ const key = processAddPartBlockKey(first, 0)
|
|
|
+ onProcessAddSelectSewingPart(first, 0)
|
|
|
+ } else {
|
|
|
+ processAddSelectedPartKey.value = null
|
|
|
+ processAddActivePart.value = null
|
|
|
+ processAddCurrentRowKey.value = null
|
|
|
+ }
|
|
|
+ }
|
|
|
+ syncProcessAddSubmitCount()
|
|
|
+ }
|
|
|
+
|
|
|
+ function onProcessAddSelectSewingPart(part, index) {
|
|
|
+ processAddSelectedStage.value = '车缝'
|
|
|
+ const key = processAddPartBlockKey(part, index)
|
|
|
+ processAddSelectedPartKey.value = key
|
|
|
+ processAddActivePart.value = part
|
|
|
+ processAddCurrentRowKey.value = key
|
|
|
+ if (!processAddByPartRows.value[key]) {
|
|
|
+ processAddByPartRows.value[key] = [newProcessLibRow()]
|
|
|
+ }
|
|
|
+ loadProcessLibNameOptions({ search: '车缝' })
|
|
|
+ syncProcessAddSubmitCount()
|
|
|
+ }
|
|
|
+
|
|
|
+ function newProcessLibRow() {
|
|
|
+ return {
|
|
|
+ _key: `proc_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`,
|
|
|
+ 工艺序号: '',
|
|
|
+ 工艺名称: '',
|
|
|
+ 生产工序: '',
|
|
|
+ 标准工时: undefined,
|
|
|
+ 标准工分: undefined,
|
|
|
+ 难度系数: 1,
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ function onProcessLibNameSelectChangeForPart(key, index) {
|
|
|
+ const rows = processAddByPartRows.value[key]
|
|
|
+ if (!rows) return
|
|
|
+ const row = rows[index]
|
|
|
+ if (!row) return
|
|
|
+ const name = String(row['工艺名称'] ?? '').trim()
|
|
|
+ if (!name) {
|
|
|
+ row['生产工序'] = ''
|
|
|
+ row['标准工时'] = undefined
|
|
|
+ row['标准工分'] = undefined
|
|
|
+ row['难度系数'] = 1
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const lib = processLibByName.value[name]
|
|
|
+ if (lib) {
|
|
|
+ row['生产工序'] = lib.big_process
|
|
|
+ row['标准工时'] = lib.standard_hour
|
|
|
+ row['标准工分'] = lib.standard_score
|
|
|
+ row['难度系数'] = lib.difficulty_coef ?? 1
|
|
|
+ } else {
|
|
|
+ row['生产工序'] = ''
|
|
|
+ row['标准工时'] = undefined
|
|
|
+ row['标准工分'] = undefined
|
|
|
+ row['难度系数'] = 1
|
|
|
+ }
|
|
|
+ if (index === rows.length - 1) {
|
|
|
+ rows.push(newProcessLibRow())
|
|
|
+ }
|
|
|
+ syncProcessAddSubmitCount()
|
|
|
+ }
|
|
|
+
|
|
|
+ function removeProcessLibRowForPart(key, row, index) {
|
|
|
+ const rows = processAddByPartRows.value[key]
|
|
|
+ if (!rows) return
|
|
|
+ if (rows.length <= 1) {
|
|
|
+ ElMessage.warning('至少保留一行')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ rows.splice(index, 1)
|
|
|
+ syncProcessAddSubmitCount()
|
|
|
+ }
|
|
|
+
|
|
|
+ function syncProcessAddSubmitCount() {
|
|
|
+ let n = 0
|
|
|
+ for (const k in processAddByPartRows.value) {
|
|
|
+ const rows = processAddByPartRows.value[k]
|
|
|
+ if (!Array.isArray(rows)) continue
|
|
|
+ for (const r of rows) {
|
|
|
+ const name = String(r['工艺名称'] ?? '').trim()
|
|
|
+ if (name) n++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ processLibAddSubmitCount.value = n
|
|
|
+ }
|
|
|
+
|
|
|
+ function resetProcessLibForm() {
|
|
|
+ processIsEdit.value = false
|
|
|
+ processForm.id = undefined
|
|
|
+ processForm['工艺序号'] = ''
|
|
|
+ processForm['工艺名称'] = ''
|
|
|
+ processForm['生产工序'] = ''
|
|
|
+ processForm['标准工时'] = undefined
|
|
|
+ processForm['标准工分'] = undefined
|
|
|
+ processForm['难度系数'] = 1
|
|
|
+ processAddPartList.value = []
|
|
|
+ processAddByPartRows.value = {}
|
|
|
+ processAddSelectedStage.value = '裁剪'
|
|
|
+ processAddSelectedPartKey.value = null
|
|
|
+ processAddActivePart.value = null
|
|
|
+ processAddCurrentRowKey.value = null
|
|
|
+ processLibAddSubmitCount.value = 0
|
|
|
+ processFormRef.value?.clearValidate?.()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 打开新增工艺资料弹窗
|
|
|
+ const addgdgy_onclick = async () => {
|
|
|
+ if(!_Gd_gdbh.value){
|
|
|
+ ElMessage.warning('请先选择具体的工单后,再操作此功能')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ // 初始化工艺添加相关数据
|
|
|
+ resetProcessLibForm()
|
|
|
+ try {
|
|
|
+ // 获取部件列表
|
|
|
+ const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
+ if (partRes?.code !== 0 || !Array.isArray(partRes.data)) {
|
|
|
+ ElMessage.error('获取部件列表失败')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const parts = partRes.data
|
|
|
+ processAddPartList.value = parts
|
|
|
+
|
|
|
+ // 加载工艺库
|
|
|
+ await loadProcessLibNameOptions({ search: '裁剪' })
|
|
|
+
|
|
|
+ // 设置默认选中的工序
|
|
|
+ processAddSelectedStage.value = '裁剪'
|
|
|
+ const stgKey = processAddStageKey('裁剪')
|
|
|
+ processAddCurrentRowKey.value = stgKey
|
|
|
+ processAddByPartRows.value[stgKey] = [newProcessLibRow()]
|
|
|
+
|
|
|
+ // 如果有部件,设置默认选中的部件
|
|
|
+ if (parts.length) {
|
|
|
+ const first = parts[0]
|
|
|
+ const key = processAddPartBlockKey(first, 0)
|
|
|
+ processAddByPartRows.value[key] = [newProcessLibRow()]
|
|
|
+ }
|
|
|
+
|
|
|
+ processAddDialogVisible.value = true
|
|
|
+ } catch (e) {
|
|
|
+ console.error('获取工艺名称列表失败', e)
|
|
|
+ ElMessage.error('获取工艺名称列表失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 打开新增工艺资料弹窗
|
|
|
+ const openProcessAdd = async () => {
|
|
|
+ await addgdgy_onclick()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 部件列表数据
|
|
|
+ const partListData = ref([])
|
|
|
+
|
|
|
+ // 打开新增部件资料弹窗
|
|
|
+ const openPartAdd = async () => {
|
|
|
+ if(!_Gd_gdbh.value){
|
|
|
+ ElMessage.warning('请先选择具体的工单后,再操作此功能')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ resetPartLibForm()
|
|
|
+ // 获取部件名称下拉列表
|
|
|
+ try {
|
|
|
+ // 调用ParList获取部件列表
|
|
|
+ const parRes = await ParList({ page: 1, limit: 100 })
|
|
|
+ console.log('ParList接口返回数据:', parRes)
|
|
|
+ if (parRes?.code === 0) {
|
|
|
+ const list = parRes?.data?.list ?? []
|
|
|
+ console.log('部件列表数据:', list)
|
|
|
+ partListData.value = list
|
|
|
+ // 提取部件名称
|
|
|
+ const seen = new Set()
|
|
|
+ const opts = []
|
|
|
+ for (const row of list) {
|
|
|
+ const name = String(row.part_name ?? row['部件名称'] ?? '').trim()
|
|
|
+ if (!name || seen.has(name)) continue
|
|
|
+ seen.add(name)
|
|
|
+ opts.push(name)
|
|
|
+ }
|
|
|
+ partNameOptions.value = opts
|
|
|
+ console.log('部件名称选项:', partNameOptions.value)
|
|
|
+ }
|
|
|
+ // 获取已存在的部件名称和最大序号
|
|
|
+ const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
+ if (partRes?.code === 0 && Array.isArray(partRes.data)) {
|
|
|
+ partAddExistingNames.value = new Set(partRes.data.map(p => p.部件名称))
|
|
|
+ // 计算已存在的最大部件序号
|
|
|
+ let maxSort = 0
|
|
|
+ for (const part of partRes.data) {
|
|
|
+ const sort = Number(part.部件序号) || 0
|
|
|
+ if (sort > maxSort) {
|
|
|
+ maxSort = sort
|
|
|
+ }
|
|
|
+ }
|
|
|
+ partAddMaxExistingSort.value = maxSort
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('获取部件名称列表失败', e)
|
|
|
+ ElMessage.error('获取部件名称列表失败')
|
|
|
+ }
|
|
|
+ // 初始化新增行
|
|
|
+ partAddRows.value = [newPartLibRow()]
|
|
|
+ syncPartAddRowSorts()
|
|
|
+ partAddDialogVisible.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重置部件表单
|
|
|
+ const resetPartLibForm = () => {
|
|
|
+ partIsEdit.value = false
|
|
|
+ partAddForm.部件序号 = ''
|
|
|
+ partAddForm.部件名称 = ''
|
|
|
+ partAddForm.部件编号 = ''
|
|
|
+ partAddForm.部件类型 = ''
|
|
|
+ partAddForm.部件备注 = ''
|
|
|
+ partAddRows.value = []
|
|
|
+ partAddMaxExistingSort.value = 0
|
|
|
+ partAddExistingNames.value = new Set()
|
|
|
+ // 不要清空partNameOptions,因为它是通过ParList接口获取的
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新建部件行
|
|
|
+ const newPartLibRow = () => {
|
|
|
+ return {
|
|
|
+ _key: Date.now() + Math.random(),
|
|
|
+ 部件序号: '',
|
|
|
+ 部件名称: '',
|
|
|
+ 部件编号: '',
|
|
|
+ 部件类型: '',
|
|
|
+ 部件备注: ''
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 同步部件行序号
|
|
|
+ const syncPartAddRowSorts = () => {
|
|
|
+ const rows = partAddRows.value
|
|
|
+ const base = partAddMaxExistingSort.value
|
|
|
+ for (let i = 0; i < rows.length; i++) {
|
|
|
+ rows[i].部件序号 = String(base + i + 1)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 部件名称变化处理
|
|
|
+ const onPartNameChange = (index) => {
|
|
|
+ const row = partAddRows.value[index]
|
|
|
+ if (!row) return
|
|
|
+ const name = String(row.部件名称 ?? '').trim()
|
|
|
+ if (name) {
|
|
|
+ // 检查是否重复
|
|
|
+ if (partAddExistingNames.value.has(name)) {
|
|
|
+ ElMessage.warning('该工单下已存在该部件名称,请勿重复添加')
|
|
|
+ row.部件名称 = ''
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 检查同批添加中是否重复
|
|
|
+ for (let i = 0; i < partAddRows.value.length; i++) {
|
|
|
+ if (i === index) continue
|
|
|
+ if (String(partAddRows.value[i].部件名称 ?? '').trim() === name) {
|
|
|
+ ElMessage.warning('该部件名称已在其他行选择,请勿重复')
|
|
|
+ row.部件名称 = ''
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 根据部件名称填充部件编号、部件类型和部件备注
|
|
|
+ const part = partListData.value.find(p => {
|
|
|
+ return String(p.part_name ?? p['部件名称'] ?? '').trim() === name
|
|
|
+ })
|
|
|
+ if (part) {
|
|
|
+ row.部件编号 = String(part.part_code ?? part['部件编码'] ?? '').trim()
|
|
|
+ row.部件类型 = ''
|
|
|
+ row.部件备注 = '' // 默认为空
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自动添加新行
|
|
|
+ if (index === partAddRows.value.length - 1) {
|
|
|
+ partAddRows.value.push(newPartLibRow())
|
|
|
+ syncPartAddRowSorts()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ // 清空相关字段
|
|
|
+ row.部件编号 = ''
|
|
|
+ row.部件类型 = ''
|
|
|
+ row.部件备注 = ''
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除部件行
|
|
|
+ const removePartRow = (index) => {
|
|
|
+ if (partAddRows.value.length <= 1) {
|
|
|
+ ElMessage.warning('至少保留一行')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ partAddRows.value.splice(index, 1)
|
|
|
+ syncPartAddRowSorts()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关闭新增部件资料弹窗
|
|
|
+ const partAddCloseDialog = () => {
|
|
|
+ partAddDialogVisible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 确认新增部件资料
|
|
|
+ const partAddConfirm = async () => {
|
|
|
+ // 收集有效行
|
|
|
+ const validRows = []
|
|
|
+ for (const row of partAddRows.value) {
|
|
|
+ const name = String(row.部件名称 ?? '').trim()
|
|
|
+ if (name) {
|
|
|
+ validRows.push({
|
|
|
+ part_name: name,
|
|
|
+ part_code: String(row.部件编号 ?? '').trim(),
|
|
|
+ part_type: String(row.部件类型 ?? '').trim(),
|
|
|
+ remark: String(row.部件备注 ?? '').trim(),
|
|
|
+ part_sort: String(row.部件序号 ?? '').trim()
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (validRows.length === 0) {
|
|
|
+ ElMessage.warning('请至少填写一个部件')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ for (const row of validRows) {
|
|
|
+ const res = await AddPart({
|
|
|
+ workorder: _Gd_sckh.value,
|
|
|
+ part_name: row.part_name,
|
|
|
+ part_code: row.part_code,
|
|
|
+ part_type: row.part_type,
|
|
|
+ remark: row.remark,
|
|
|
+ sys_id: userStore.userInfo.nickName
|
|
|
+ })
|
|
|
+ if (res?.code !== 0) {
|
|
|
+ throw new Error(res.msg || '新增部件资料失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ElMessage.success('新增部件资料成功')
|
|
|
+ partAddDialogVisible.value = false
|
|
|
+ // 刷新部件资料列表
|
|
|
+ await loadPartAndProcessData()
|
|
|
+ } catch (e) {
|
|
|
+ console.error('新增部件资料失败', e)
|
|
|
+ ElMessage.error(e.message || '新增部件资料失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关闭新增工艺资料弹窗
|
|
|
+ const processAddCloseDialog = () => {
|
|
|
+ processAddDialogVisible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 确认新增工艺资料
|
|
|
+ const processAddConfirm = async () => {
|
|
|
+ // 收集有效行
|
|
|
+ const validRows = []
|
|
|
+ for (const key in processAddByPartRows.value) {
|
|
|
+ const rows = processAddByPartRows.value[key]
|
|
|
+ if (!Array.isArray(rows)) continue
|
|
|
+ for (const row of rows) {
|
|
|
+ const name = String(row.工艺名称 ?? '').trim()
|
|
|
+ const stage = String(row.生产工序 ?? '').trim()
|
|
|
+ if (name && stage) {
|
|
|
+ validRows.push({
|
|
|
+ key: key,
|
|
|
+ process_name: name,
|
|
|
+ big_process: stage,
|
|
|
+ process_code: String(row.工艺序号 ?? '').trim(),
|
|
|
+ standard_hour: row.标准工时,
|
|
|
+ standard_score: row.标准工分,
|
|
|
+ coefficient: row.难度系数
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (validRows.length === 0) {
|
|
|
+ ElMessage.warning('请至少填写一个工艺')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ for (const row of validRows) {
|
|
|
+ // 确定部件号:如果是车缝工序,从部件中获取部件编号作为部件号
|
|
|
+ let part_code = ''
|
|
|
+ if (row.big_process === '车缝' && processAddActivePart.value) {
|
|
|
+ part_code = String(processAddActivePart.value.part_code ?? processAddActivePart.value['部件编号'] ?? '').trim()
|
|
|
+ }
|
|
|
+
|
|
|
+ const res = await AddProcess({
|
|
|
+ workorder: _Gd_gdbh.value,
|
|
|
+ part_code: part_code,
|
|
|
+ process_name: row.process_name,
|
|
|
+ process_code: row.process_code,
|
|
|
+ big_process: row.big_process,
|
|
|
+ standard_hour: row.standard_hour,
|
|
|
+ standard_score: row.standard_score,
|
|
|
+ coefficient: row.coefficient,
|
|
|
+ remark: '',
|
|
|
+ sys_id: userStore.userInfo?.nickName || ''
|
|
|
+ })
|
|
|
+ if (res?.code !== 0) {
|
|
|
+ throw new Error(res.msg || '新增工艺资料失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ElMessage.success('新增工艺资料成功')
|
|
|
+ processAddDialogVisible.value = false
|
|
|
+ // 刷新工艺资料列表
|
|
|
+ await loadPartAndProcessData()
|
|
|
+ } catch (e) {
|
|
|
+ console.error('新增工艺资料失败', e)
|
|
|
+ ElMessage.error(e.message || '新增工艺资料失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 打开排序弹窗
|
|
|
+ const openSortDialog = async () => {
|
|
|
+ await openSortPartGyDialog()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 打开排序弹窗(新)
|
|
|
+ const openSortPartGyDialog = async () => {
|
|
|
+ if(!_Gd_gdbh.value){
|
|
|
+ ElMessage.warning('请先选择具体的工单后,再操作此功能')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ sortPartGyDialogVisible.value = true
|
|
|
+ sortDialogLoading.value = true
|
|
|
+ sortDialogSewingGroups.value = []
|
|
|
+ sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
|
|
|
+ try {
|
|
|
+ // 获取部件列表
|
|
|
+ const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
+ const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
|
|
|
+
|
|
|
+ // 获取工艺列表
|
|
|
+ const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
|
|
|
+ const rawGy = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
|
|
|
+ const gyNorm = rawGy.map((r) => normalizeGyRow(r))
|
|
|
+
|
|
|
+ // 构建排序数据
|
|
|
+ sortDialogSewingGroups.value = buildSortSewingGroups(parts, rawGy)
|
|
|
+ sortDialogStageGys.value = buildSortStageGys(gyNorm)
|
|
|
+ reindexSortDialogGroupsDisplay()
|
|
|
+ sortDialogViewStage.value = '裁剪'
|
|
|
+ sortDialogSelectedPartId.value = sortDialogSewingGroups.value[0]?.part?.id ?? null
|
|
|
+ sortDialogInitialSnapshot.value = JSON.stringify(snapshotSortDialogStateV2())
|
|
|
+
|
|
|
+ // 加载工艺库数据
|
|
|
+ // await loadProcessLibNameOptions({ search: '裁剪' })
|
|
|
+ } catch (e) {
|
|
|
+ console.error('加载排序数据失败', e)
|
|
|
+ ElMessage.error('加载排序数据失败')
|
|
|
+ } finally {
|
|
|
+ sortDialogLoading.value = false
|
|
|
+ }
|
|
|
+ bindSortPartGyDrag()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 关闭排序弹窗
|
|
|
+ const sortCloseDialog = () => {
|
|
|
+ sortPartGyDialogVisible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序弹窗关闭时的清理
|
|
|
+ const onSortPartGyDialogClosed = () => {
|
|
|
+ destroySortPartGySortables()
|
|
|
+ sortDialogSewingGroups.value = []
|
|
|
+ sortDialogStageGys.value = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
|
|
|
+ sortDialogViewStage.value = '裁剪'
|
|
|
+ sortDialogSelectedPartId.value = null
|
|
|
+ sortDialogInitialSnapshot.value = null
|
|
|
+ }
|
|
|
+
|
|
|
+ // 数字排序键
|
|
|
+ const numSortKey = (v) => {
|
|
|
+ if (v === undefined || v === null || v === '') return 0
|
|
|
+ const n = Number(v)
|
|
|
+ return Number.isFinite(n) ? n : 0
|
|
|
+ }
|
|
|
+
|
|
|
+ // 按部件序号升序排序
|
|
|
+ const sortByPartSortAsc = (parts) => {
|
|
|
+ return [...parts].sort((a, b) => numSortKey(a.部件序号) - numSortKey(b.部件序号))
|
|
|
+ }
|
|
|
+
|
|
|
+ // 标准化工艺行数据
|
|
|
+ const normalizeGyRow = (row) => {
|
|
|
+ return {
|
|
|
+ id: row.工艺ID || row.id,
|
|
|
+ gy_name: row.工艺名称 || row.gy_name,
|
|
|
+ '工艺名称': row.工艺名称 || row.gy_name,
|
|
|
+ big_process: row.大工艺 || row.生产工序 || row.big_process,
|
|
|
+ '大工艺': row.大工艺 || row.生产工序 || row.big_process,
|
|
|
+ part_sort: row.部件序号 || row.part_sort,
|
|
|
+ '部件序号': row.部件序号 || row.part_sort,
|
|
|
+ part_name: row.部件名称 || row.part_name,
|
|
|
+ '部件名称': row.部件名称 || row.part_name,
|
|
|
+ part_code: row.部件编号 || row.part_code,
|
|
|
+ '部件编号': row.部件编号 || row.part_code,
|
|
|
+ gy_sort: row.工艺序号 || row.gy_sort,
|
|
|
+ '工艺序号': row.工艺序号 || row.gy_sort,
|
|
|
+ gy_code: row.工艺编号 || row.gy_code,
|
|
|
+ '工艺编号': row.工艺编号 || row.gy_code,
|
|
|
+ standard_hour: row.标准工时 || row.standard_hour,
|
|
|
+ '标准工时': row.标准工时 || row.standard_hour,
|
|
|
+ standard_score: row.标准公分 || row.标准工分 || row.standard_score,
|
|
|
+ '标准公分': row.标准公分 || row.标准工分 || row.standard_score,
|
|
|
+ '标准工分': row.标准公分 || row.标准工分 || row.standard_score,
|
|
|
+ difficulty_coef: row.系数 || row.难度系数 || row.difficulty_coef,
|
|
|
+ '系数': row.系数 || row.难度系数 || row.difficulty_coef,
|
|
|
+ '难度系数': row.系数 || row.难度系数 || row.difficulty_coef,
|
|
|
+ remark: row.备注 || row.remark,
|
|
|
+ '备注': row.备注 || row.remark
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建车缝工序的部件-工艺分组(包含车缝和烫工)
|
|
|
+ const buildSortSewingGroups = (parts, processes) => {
|
|
|
+ const list = sortByPartSortAsc(Array.isArray(parts) ? parts : [])
|
|
|
+ console.log('部件列表:', list)
|
|
|
+ console.log('工艺列表:', processes)
|
|
|
+ return list.map((part) => {
|
|
|
+ const partName = String(part.部件名称 || '').trim()
|
|
|
+ console.log('处理部件:', partName)
|
|
|
+ const gys = processes
|
|
|
+ .map((g) => {
|
|
|
+ const normalized = normalizeGyRow(g)
|
|
|
+ // 保留原始字段
|
|
|
+ return {
|
|
|
+ ...g,
|
|
|
+ ...normalized
|
|
|
+ }
|
|
|
+ })
|
|
|
+ .filter((g) => {
|
|
|
+ const bigProcess = String(g.big_process ?? g.大工艺 ?? '').trim()
|
|
|
+ const processPartName = String(g.part_name ?? g.部件名称 ?? '').trim()
|
|
|
+ // 车缝包含车缝和烫工(小烫按部件算)
|
|
|
+ const match = (bigProcess === '车缝' || bigProcess === '烫工') && processPartName === partName
|
|
|
+ console.log('过滤工艺:', { bigProcess, processPartName, partName, match })
|
|
|
+ return match
|
|
|
+ })
|
|
|
+ .sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
|
|
|
+ console.log('匹配的工艺:', gys)
|
|
|
+ return { part: { ...part, id: part.部件ID || part.id }, gys }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 构建非车缝工序的工艺列表
|
|
|
+ const buildSortStageGys = (processes) => {
|
|
|
+ const stages = { 裁剪: [], 手工: [], 大烫: [], 总检: [] }
|
|
|
+ for (const raw of processes) {
|
|
|
+ const g = normalizeGyRow({ ...raw })
|
|
|
+ const bp = String(g.big_process ?? '').trim()
|
|
|
+ if (bp === '车缝' || !SORT_NON_SEWING_STAGES.includes(bp)) continue
|
|
|
+ stages[bp].push(g)
|
|
|
+ }
|
|
|
+ for (const st of SORT_NON_SEWING_STAGES) {
|
|
|
+ stages[st] = (stages[st] || []).sort((a, b) => numSortKey(a.gy_sort) - numSortKey(b.gy_sort))
|
|
|
+ }
|
|
|
+ return stages
|
|
|
+ }
|
|
|
+
|
|
|
+ // 重新索引排序对话框中的显示序号
|
|
|
+ const reindexSortDialogGroupsDisplay = () => {
|
|
|
+ sortDialogSewingGroups.value.forEach((grp, i) => {
|
|
|
+ const partSortStr = String(i + 1)
|
|
|
+ if (grp.part && typeof grp.part === 'object') {
|
|
|
+ grp.part.part_sort = partSortStr
|
|
|
+ }
|
|
|
+ const partName = String(grp.part?.部件名称 ?? '').trim()
|
|
|
+ const gys = grp.gys
|
|
|
+ if (!Array.isArray(gys)) return
|
|
|
+ gys.forEach((row, j) => {
|
|
|
+ const gyStr = String(j + 1)
|
|
|
+ row.gy_sort = gyStr
|
|
|
+ row['工艺序号'] = gyStr
|
|
|
+ row.part_sort = partSortStr
|
|
|
+ row['部件序号'] = partSortStr
|
|
|
+ row.part_name = partName
|
|
|
+ row['部件名称'] = partName
|
|
|
+ row.big_process = '车缝'
|
|
|
+ row['生产工序'] = '车缝'
|
|
|
+ // 确保工艺名称等属性存在
|
|
|
+ if (!row['工艺名称']) {
|
|
|
+ row['工艺名称'] = row.gy_name || row.工艺名称 || ''
|
|
|
+ }
|
|
|
+ if (!row['标准工时']) {
|
|
|
+ row['标准工时'] = row.standard_hour || row.标准工时 || ''
|
|
|
+ }
|
|
|
+ if (!row['标准工分']) {
|
|
|
+ row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
|
|
|
+ }
|
|
|
+ if (!row['难度系数']) {
|
|
|
+ row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ for (const st of SORT_NON_SEWING_STAGES) {
|
|
|
+ const gys = sortDialogStageGys.value[st] || []
|
|
|
+ gys.forEach((row, j) => {
|
|
|
+ const gyStr = String(j + 1)
|
|
|
+ row.gy_sort = gyStr
|
|
|
+ row['工艺序号'] = gyStr
|
|
|
+ row.part_sort = ''
|
|
|
+ row['部件序号'] = ''
|
|
|
+ row.part_name = ''
|
|
|
+ row['部件名称'] = ''
|
|
|
+ row.big_process = st
|
|
|
+ row['生产工序'] = st
|
|
|
+ // 确保工艺名称等属性存在
|
|
|
+ if (!row['工艺名称']) {
|
|
|
+ row['工艺名称'] = row.gy_name || row.工艺名称 || ''
|
|
|
+ }
|
|
|
+ if (!row['标准工时']) {
|
|
|
+ row['标准工时'] = row.standard_hour || row.标准工时 || ''
|
|
|
+ }
|
|
|
+ if (!row['标准工分']) {
|
|
|
+ row['标准工分'] = row.standard_score || row['标准公分'] || row.标准工分 || ''
|
|
|
+ }
|
|
|
+ if (!row['难度系数']) {
|
|
|
+ row['难度系数'] = row.difficulty_coef || row['系数'] || row.难度系数 || ''
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 快照排序对话框状态
|
|
|
+ const snapshotSortDialogStateV2 = () => {
|
|
|
+ return {
|
|
|
+ sewing: sortDialogSewingGroups.value.map((g) => ({
|
|
|
+ partId: g.part?.id,
|
|
|
+ partCode: g.part?.部件编号,
|
|
|
+ gyIds: g.gys.map((gy) => gy.id)
|
|
|
+ })),
|
|
|
+ stages: Object.fromEntries(
|
|
|
+ SORT_NON_SEWING_STAGES.map((st) => [
|
|
|
+ st,
|
|
|
+ sortDialogStageGys.value[st]?.map((gy) => gy.id) || []
|
|
|
+ ])
|
|
|
+ )
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 绑定部件和工艺的拖拽功能
|
|
|
+ const bindSortPartGyDrag = () => {
|
|
|
+ destroySortPartGySortables()
|
|
|
+ if (!sortPartGyDialogVisible.value) return
|
|
|
+
|
|
|
+ // 绑定部件拖拽
|
|
|
+ const partListEl = document.querySelector('.sort-part-gy-sewing-parts')
|
|
|
+ if (partListEl) {
|
|
|
+ new Sortable(partListEl, {
|
|
|
+ draggable: '.sort-part-gy-part-item',
|
|
|
+ animation: 180,
|
|
|
+ onEnd: (event) => {
|
|
|
+ if (event.oldIndex !== event.newIndex) {
|
|
|
+ // 重新排序部件
|
|
|
+ const groups = [...sortDialogSewingGroups.value]
|
|
|
+ const [moved] = groups.splice(event.oldIndex, 1)
|
|
|
+ groups.splice(event.newIndex, 0, moved)
|
|
|
+ sortDialogSewingGroups.value = groups
|
|
|
+ // 重新索引
|
|
|
+ reindexSortDialogGroupsDisplay()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 绑定工艺拖拽
|
|
|
+ const processTableEl = document.querySelector('.sort-gy-table .el-table__body-wrapper tbody')
|
|
|
+ if (processTableEl) {
|
|
|
+ new Sortable(processTableEl, {
|
|
|
+ handle: '.sort-drag-handle',
|
|
|
+ animation: 180,
|
|
|
+ onEnd: (event) => {
|
|
|
+ if (event.oldIndex !== event.newIndex) {
|
|
|
+ const stage = sortDialogViewStage.value
|
|
|
+ if (stage === '车缝' && sortDialogSelectedPartId.value) {
|
|
|
+ // 车缝工艺排序
|
|
|
+ const group = sortDialogSewingGroups.value.find(
|
|
|
+ g => String(g.part?.id) === String(sortDialogSelectedPartId.value)
|
|
|
+ )
|
|
|
+ if (group && Array.isArray(group.gys)) {
|
|
|
+ const gys = [...group.gys]
|
|
|
+ const [moved] = gys.splice(event.oldIndex, 1)
|
|
|
+ gys.splice(event.newIndex, 0, moved)
|
|
|
+ group.gys = gys
|
|
|
+ // 重新索引
|
|
|
+ reindexSortDialogGroupsDisplay()
|
|
|
+ }
|
|
|
+ } else if (stage && SORT_NON_SEWING_STAGES.includes(stage)) {
|
|
|
+ // 非车缝工艺排序
|
|
|
+ const gys = [...sortDialogStageGys.value[stage]]
|
|
|
+ const [moved] = gys.splice(event.oldIndex, 1)
|
|
|
+ gys.splice(event.newIndex, 0, moved)
|
|
|
+ sortDialogStageGys.value[stage] = gys
|
|
|
+ // 重新索引
|
|
|
+ reindexSortDialogGroupsDisplay()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 销毁拖拽实例
|
|
|
+ const destroySortPartGySortables = () => {
|
|
|
+ // 这里可以添加销毁拖拽实例的代码
|
|
|
+ // 由于我们使用的是局部变量创建Sortable实例,不需要显式销毁
|
|
|
+ }
|
|
|
+
|
|
|
+ // 选择排序对话框的视图工序
|
|
|
+ const onSortDialogViewStageSelect = async (stage) => {
|
|
|
+ sortDialogViewStage.value = stage
|
|
|
+ if (stage !== '车缝') {
|
|
|
+ sortDialogSelectedPartId.value = null
|
|
|
+ }
|
|
|
+ // 加载工艺库数据
|
|
|
+ const loadSt = stage === '车缝' ? '车缝' : stage
|
|
|
+ await loadProcessLibNameOptions({ search: loadSt })
|
|
|
+ // 重新绑定拖拽
|
|
|
+ nextTick(() => {
|
|
|
+ destroySortPartGySortables()
|
|
|
+ bindSortPartGyDrag()
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 选择车缝工序的部件
|
|
|
+ const onSortDialogSelectSewingPart = async (partId) => {
|
|
|
+ sortDialogSelectedPartId.value = partId
|
|
|
+ sortDialogViewStage.value = '车缝'
|
|
|
+ // 加载工艺库数据
|
|
|
+ await loadProcessLibNameOptions({ search: '车缝' })
|
|
|
+ // 重新绑定拖拽
|
|
|
+ nextTick(() => {
|
|
|
+ destroySortPartGySortables()
|
|
|
+ bindSortPartGyDrag()
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序弹窗中工艺名称变化处理
|
|
|
+ const onSortDialogGyNameChange = (row) => {
|
|
|
+ const name = String(row['工艺名称'] ?? '').trim()
|
|
|
+ if (!name) return
|
|
|
+ const info = processLibByName.value[name]
|
|
|
+ if (info) {
|
|
|
+ row['标准工时'] = info.standard_hour
|
|
|
+ row['标准工分'] = info.standard_score
|
|
|
+ row['难度系数'] = info.difficulty_coef ?? 1
|
|
|
+ if (!row['生产工序'] && info.big_process) {
|
|
|
+ row['生产工序'] = info.big_process
|
|
|
+ row.big_process = info.big_process
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 复制产品资料 - 打开弹窗
|
|
|
+ const copyProductData = () => {
|
|
|
+ if(!_Gd_gdbh.value){
|
|
|
+ ElMessage.warning('请先选择具体的工单')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ copyProductTableData.value = []
|
|
|
+ copyProductFormData.value.gdbh = _Gd_gdbh.value
|
|
|
+ copyProductFormData.value.ks = ''
|
|
|
+ copyProductSelectedRow.value = null
|
|
|
+ copyProductSearchText.value = ''
|
|
|
+ copyProductDialogVisible.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 复制产品资料搜索
|
|
|
+ const copyProductSearch = async () => {
|
|
|
+ if(!copyProductSearchText.value.trim()){
|
|
|
+ ElMessage.warning('请输入搜索内容')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ const res = await WorkOrderList({ search: copyProductSearchText.value, page: 1, limit: 100 })
|
|
|
+ if (res?.code === 0 && res.data && Array.isArray(res.data.data)) {
|
|
|
+ copyProductTableData.value = res.data.data
|
|
|
+ copyProductSelectedRow.value = null
|
|
|
+ } else {
|
|
|
+ copyProductTableData.value = []
|
|
|
+ ElMessage.info('未找到匹配的工单')
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('搜索工单失败', e)
|
|
|
+ ElMessage.error('搜索工单失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 复制产品资料表格行点击
|
|
|
+ const copyProductTableRowClick = (row) => {
|
|
|
+ copyProductSelectedRow.value = row
|
|
|
+ copyProductFormData.value['生产款号'] = row.生产款号 || ''
|
|
|
+ }
|
|
|
+
|
|
|
+ // 复制产品资料确认
|
|
|
+ const copyProductHandleConfirm = async () => {
|
|
|
+ if(!copyProductSelectedRow.value) {
|
|
|
+ ElMessage.warning('请选择要复制的工单')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 调用copyProcessToCurrentWorkOrder接口
|
|
|
+ const res = await copyProcessToCurrentWorkOrder({
|
|
|
+ target_workorder: copyProductSelectedRow.value.订单编号,
|
|
|
+ current_workorder: _Gd_gdbh.value,
|
|
|
+ sys_id: userStore.userInfo.nickName
|
|
|
+ })
|
|
|
+
|
|
|
+ if (res?.code === 0) {
|
|
|
+ ElMessage.success('复制工艺资料成功')
|
|
|
+ copyProductDialogVisible.value = false
|
|
|
+ // 刷新数据
|
|
|
+ await loadPartAndProcessData()
|
|
|
+ } else {
|
|
|
+ ElMessage.error('复制工艺资料失败')
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('复制工艺资料失败', e)
|
|
|
+ ElMessage.error('复制工艺资料失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 复制产品资料取消
|
|
|
+ const copyProductHandleCancel = () => {
|
|
|
+ copyProductDialogVisible.value = false
|
|
|
+ copyProductSelectedRow.value = null
|
|
|
+ }
|
|
|
+
|
|
|
+ // 保存排序
|
|
|
+ const submitSortPartGy = async () => {
|
|
|
+ if (!_Gd_gdbh.value) return
|
|
|
+
|
|
|
+ sortDialogSubmitLoading.value = true
|
|
|
+ try {
|
|
|
+ // 构建工艺排序数据
|
|
|
+ const process_list = []
|
|
|
+
|
|
|
+ // 处理车缝工艺
|
|
|
+ sortDialogSewingGroups.value.forEach((g) => {
|
|
|
+ const rows = g.gys || []
|
|
|
+ for (let j = 0; j < rows.length; j++) {
|
|
|
+ const r = rows[j]
|
|
|
+ if (r.id == null) continue
|
|
|
+ process_list.push({
|
|
|
+ id: r.id,
|
|
|
+ process_code: j + 1
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ // 处理非车缝工艺
|
|
|
+ for (const st of SORT_NON_SEWING_STAGES) {
|
|
|
+ const rows = sortDialogStageGys.value[st] || []
|
|
|
+ for (let j = 0; j < rows.length; j++) {
|
|
|
+ const r = rows[j]
|
|
|
+ if (r.id == null) continue
|
|
|
+ process_list.push({
|
|
|
+ id: r.id,
|
|
|
+ process_code: j + 1
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (process_list.length === 0) {
|
|
|
+ ElMessage.warning('无工艺数据可保存')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 调用保存接口
|
|
|
+ const res = await sortProcess(process_list)
|
|
|
+
|
|
|
+ if (res?.code === 0) {
|
|
|
+ ElMessage.success('排序保存成功')
|
|
|
+ sortPartGyDialogVisible.value = false
|
|
|
+ // 刷新数据
|
|
|
+ await loadPartAndProcessData()
|
|
|
+ } else {
|
|
|
+ ElMessage.error(res?.msg || '保存失败')
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('保存排序失败', e)
|
|
|
+ ElMessage.error('保存排序失败')
|
|
|
+ } finally {
|
|
|
+ sortDialogSubmitLoading.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 排序对话框是否有数据
|
|
|
+ const sortDialogHasData = computed(() => {
|
|
|
+ return sortDialogSewingGroups.value.length > 0 ||
|
|
|
+ Object.values(sortDialogStageGys.value).some(gys => gys.length > 0)
|
|
|
+ })
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ // 加载排序表格数据
|
|
|
+ const loadSortTableData = async () => {
|
|
|
+ try {
|
|
|
+ // 获取部件列表
|
|
|
+ const partRes = await PartList({ workorder: _Gd_gdbh.value })
|
|
|
+ const parts = partRes?.code === 0 && Array.isArray(partRes.data) ? partRes.data : []
|
|
|
+
|
|
|
+ // 获取工艺列表
|
|
|
+ const processRes = await GetProcessList({ workorder: _Gd_gdbh.value })
|
|
|
+ const processes = processRes?.code === 0 && Array.isArray(processRes.data) ? processRes.data : []
|
|
|
+
|
|
|
+ // 构建排序表格数据
|
|
|
+ sortTableData.value = parts.map(part => ({
|
|
|
+ 部件ID: part.部件ID || part.id,
|
|
|
+ 部件编号: part.部件编号,
|
|
|
+ 部件名称: part.部件名称,
|
|
|
+ gyList: processes.filter(gy => String(gy.部件编号) === String(part.部件编号))
|
|
|
+ }))
|
|
|
+ } catch (e) {
|
|
|
+ console.error('加载排序数据失败', e)
|
|
|
+ ElMessage.error('加载排序数据失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // 确认排序
|
|
|
+ const sortConfirm = async () => {
|
|
|
+ try {
|
|
|
+ // 按顺序更新部件序号
|
|
|
+ for (let i = 0; i < sortTableData.value.length; i++) {
|
|
|
+ const part = sortTableData.value[i]
|
|
|
+ await UpdatePartInfo({
|
|
|
+ workorder: _Gd_gdbh.value,
|
|
|
+ part_code: part.部件编号,
|
|
|
+ part_sort: i + 1
|
|
|
+ })
|
|
|
+ // 按顺序更新工艺序号
|
|
|
+ const gyList = part.gyList
|
|
|
+ for (let j = 0; j < gyList.length; j++) {
|
|
|
+ const gy = gyList[j]
|
|
|
+ await UpdateProcess({
|
|
|
+ workorder: _Gd_gdbh.value,
|
|
|
+ part_code: part.部件编号,
|
|
|
+ process_code: gy.工艺编号,
|
|
|
+ process_sort: j + 1
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ElMessage.success('排序保存成功')
|
|
|
+ sortDialogVisible.value = false
|
|
|
+ // 刷新部件和工艺列表
|
|
|
+ await loadPartAndProcessData()
|
|
|
+ } catch (e) {
|
|
|
+ console.error('保存排序失败', e)
|
|
|
+ ElMessage.error('保存排序失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 刷新部件和工艺数据
|
|
|
+ const loadPartAndProcessData = async () => {
|
|
|
+ const partListData = await PartList({ workorder: _Gd_gdbh.value });
|
|
|
+ if (partListData?.code === 0 && Array.isArray(partListData.data)) {
|
|
|
+ parttableData.splice(0, parttableData.length, ...partListData.data);
|
|
|
+ } else {
|
|
|
+ parttableData.splice(0, parttableData.length);
|
|
|
+ }
|
|
|
+
|
|
|
+ const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
+ if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
+ gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
+ } else {
|
|
|
+ gytableData.splice(0, gytableData.length);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //新增工序资料确定按钮
|
|
|
+ const add_gxenterDialog = () => {
|
|
|
+ console.log(form)
|
|
|
+ const formattedData = {
|
|
|
+ ckck: form['仓库出库'],
|
|
|
+ cq: form['裁剪'],
|
|
|
+ cf: form['车缝'],
|
|
|
+ hdsy: form['手工'],
|
|
|
+ dt: form['大烫'],
|
|
|
+ zj: form['总检'],
|
|
|
+ bz: form['包装']
|
|
|
+ };
|
|
|
+ // true 选择 fasle 未选择
|
|
|
+ for (let key in formattedData) {
|
|
|
+ if (formattedData[key] === true) {
|
|
|
+ formattedData[key] = 1;
|
|
|
+ } else if (formattedData[key] === false) {
|
|
|
+ formattedData[key] = 2;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ console.log(formattedData)
|
|
|
+ }
|
|
|
+
|
|
|
+ //新增工序资料取消按钮
|
|
|
+ const add_gxcloseDialog = () => {
|
|
|
+ visible.value = false;
|
|
|
+ }
|
|
|
+
|
|
|
+ // =========== 工艺资料详情弹窗 ===========
|
|
|
+ const gyDetailDialogVisible = ref(false)
|
|
|
+ const gyDetailFormData = reactive({
|
|
|
+ 订单编号: '',
|
|
|
+ 客户编号: '',
|
|
|
+ 生产款号: '',
|
|
|
+ 款式: '',
|
|
|
+ 落货日期: '',
|
|
|
+ 审核日期: '',
|
|
|
+ 接单日期: '',
|
|
|
+ 审核: '',
|
|
|
+ 订单数量: '',
|
|
|
+ 计划制造工分: '',
|
|
|
+ 工单完工日期: null,
|
|
|
+ 备注: '',
|
|
|
+ Sys_id: '',
|
|
|
+ Sys_rq: '',
|
|
|
+ img: '',
|
|
|
+ 工艺列表: []
|
|
|
+ })
|
|
|
+
|
|
|
+ // 工艺详情列筛选
|
|
|
+ const dagongxuFilters = computed(() => {
|
|
|
+ const processes = new Set(
|
|
|
+ gyDetailFormData.工艺列表
|
|
|
+ .filter((item) => !item._gyDetailNew)
|
|
|
+ .map((item) => item.大工序)
|
|
|
+ .filter(Boolean)
|
|
|
+ )
|
|
|
+ return Array.from(processes).map((process) => ({ text: process, value: process }))
|
|
|
+ })
|
|
|
+
|
|
|
+ const gyDetailBuJianMingChengFilterOptions = computed(() => {
|
|
|
+ const names = new Set(
|
|
|
+ gyDetailFormData.工艺列表
|
|
|
+ .filter((item) => !item._gyDetailNew)
|
|
|
+ .map((item) => item.部件名称)
|
|
|
+ .filter(Boolean)
|
|
|
+ )
|
|
|
+ return Array.from(names).map((name) => ({ text: name, value: name }))
|
|
|
+ })
|
|
|
+
|
|
|
+ const gyDetailDifficultyFilterOptions = computed(() => {
|
|
|
+ const values = new Set(gyDetailDifficultyOptions)
|
|
|
+ for (const item of gyDetailFormData.工艺列表 || []) {
|
|
|
+ if (item._gyDetailNew) continue
|
|
|
+ const v = normalizeGyDetailField(item?.难度系数)
|
|
|
+ if (v) values.add(v)
|
|
|
+ }
|
|
|
+ return Array.from(values).map((v) => ({ text: v, value: v }))
|
|
|
+ })
|
|
|
+
|
|
|
+ const gyDetailStatusFilterOptions = [
|
|
|
+ { text: '正常', value: '0' },
|
|
|
+ { text: '被拆分', value: '1' },
|
|
|
+ ]
|
|
|
+
|
|
|
+ const getGyDetailRowStatusFilterValue = (row) => {
|
|
|
+ const code = Number(row?.状态)
|
|
|
+ if (code === 1) return '1'
|
|
|
+ if (code === 0) return '0'
|
|
|
+ return normalizeGyDetailField(row?.状态)
|
|
|
+ }
|
|
|
+
|
|
|
+ const gdgyupdateCompanyFunc = async (row) => {
|
|
|
+ const workorder = _Gd_gdbh.value || row['订单编号'] || ''
|
|
|
+ if (!workorder) {
|
|
|
+ ElMessage.warning('请先选择订单')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 获取订单信息
|
|
|
+ const orderInfoRes = await WorkOrderList({ search: workorder, page: 1, limit: 1 })
|
|
|
+ if (orderInfoRes.code === 0 && orderInfoRes.data && orderInfoRes.data.data && orderInfoRes.data.data.length > 0) {
|
|
|
+ const data = orderInfoRes.data.data[0]
|
|
|
+ gyDetailFormData.订单编号 = data['订单编号'] || ''
|
|
|
+ gyDetailFormData.客户编号 = data['客户编号'] || ''
|
|
|
+ gyDetailFormData.生产款号 = data['生产款号'] || ''
|
|
|
+ gyDetailFormData.款式 = data['款式'] || ''
|
|
|
+ gyDetailFormData.落货日期 = data['落货日期'] || ''
|
|
|
+ gyDetailFormData.制单日期 = data['Sys_rq'] || ''
|
|
|
+ gyDetailFormData.接单日期 = data['接单日期'] || ''
|
|
|
+ // 制单人:如果有/则显示/后的值,否则全部显示
|
|
|
+ const sysId = data['Sys_id'] || ''
|
|
|
+ gyDetailFormData.制单人 = sysId.includes('/') ? sysId.split('/')[1] : sysId
|
|
|
+ gyDetailFormData.订单数量 = data['订单数量'] || ''
|
|
|
+ gyDetailFormData.计划制造工分 = data['计划制造工分'] || ''
|
|
|
+ const finishDateRaw = String(data['工单完工日期'] || '').trim()
|
|
|
+ gyDetailFormData.工单完工日期 = finishDateRaw || null
|
|
|
+ gyDetailFormData.备注 = data['remark'] || ''
|
|
|
+ gyDetailFormData.Sys_id = data['Sys_id'] || data['sys_id'] || row?.['Sys_id'] || row?.['sys_id'] || ''
|
|
|
+ gyDetailFormData.Sys_rq = data['Sys_rq'] || data['sys_rq'] || ''
|
|
|
+ gyDetailFormData.Uniqid = data['Uniqid'] || ''
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取工艺列表
|
|
|
+ const processRes = await getWorkOrderProcess({ workorder })
|
|
|
+ if (processRes.code === 0 && Array.isArray(processRes.data)) {
|
|
|
+ gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
|
|
|
+ } else {
|
|
|
+ gyDetailFormData.工艺列表 = []
|
|
|
+ }
|
|
|
+
|
|
|
+ initGyDetailFilters()
|
|
|
+ gyDetailPlanManufactureEditing.value = false
|
|
|
+ gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分
|
|
|
+ gyDetailDialogVisible.value = true
|
|
|
+ await nextTick()
|
|
|
+ updateGyDetailTableHeight()
|
|
|
+ } catch (error) {
|
|
|
+ console.error('获取工艺资料详情失败', error)
|
|
|
+ ElMessage.error('获取工艺资料详情失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const gyDetailSelection = ref([])
|
|
|
+ const gyDetailDeleting = ref(false)
|
|
|
+ const gyDetailSaving = ref(false)
|
|
|
+ const gyDetailTableWrapRef = ref(null)
|
|
|
+ const gyDetailTableRef = ref(null)
|
|
|
+ const gyDetailTableHeight = ref(480)
|
|
|
+ const gyDetailTableMinWidth = 1320
|
|
|
+ let gyDetailResizeObserver = null
|
|
|
+
|
|
|
+ const gyDetailReadonly = computed(() => userStore.userInfo?.nickName === '邢科芳')
|
|
|
+
|
|
|
+ const isGyDetailCellEditable = (column) => {
|
|
|
+ const editableColumns = ['部件名称', '工序名称', '大工序', '工分', '定额分']
|
|
|
+ if (editableColumns.includes(column)) {
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ return !gyDetailReadonly.value
|
|
|
+ }
|
|
|
+ const gyDetailEditingCell = ref(null)
|
|
|
+ const gyDetailCellInputRef = ref(null)
|
|
|
+ const gyDetailLastEditingField = ref(null)
|
|
|
+ const isGyDetailNavigating = ref(false)
|
|
|
+
|
|
|
+ const gyDetailDaGongXuOptions = ['裁剪', '车缝', '手工', '大烫', '总检', '包装']
|
|
|
+ const gyDetailDifficultyOptions = ['A', 'B', 'C']
|
|
|
+
|
|
|
+ const sanitizeGyDetailDecimalInput = (val) => {
|
|
|
+ if (val === null || val === undefined) return ''
|
|
|
+ let s = String(val).replace(/[^\d.]/g, '')
|
|
|
+ const dotIndex = s.indexOf('.')
|
|
|
+ if (dotIndex !== -1) {
|
|
|
+ s = s.slice(0, dotIndex + 1) + s.slice(dotIndex + 1).replace(/\./g, '')
|
|
|
+ }
|
|
|
+ return s
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 四舍五入保留两位;空/非法返回空串 */
|
|
|
+ const roundGyDetail2 = (n) => {
|
|
|
+ if (!Number.isFinite(n)) return ''
|
|
|
+ return (Math.round(n * 100) / 100).toFixed(2)
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 工分 ↔ 金额 ↔ 秒/分 联动
|
|
|
+ * 秒 = 60/0.25 * 金额;分 = 秒/60
|
|
|
+ * 金额 = 工分 * 0.067;工分 = 金额 / 0.067
|
|
|
+ * (两式互为倒数;若都乘 0.067 无法双向换算)
|
|
|
+ */
|
|
|
+ const applyGyDetailScoreMoneyCalc = (row, sourceField) => {
|
|
|
+ if (!row || (sourceField !== '定额分' && sourceField !== '金额')) return
|
|
|
+ const raw = String(row[sourceField] ?? '').trim()
|
|
|
+ if (raw === '' || raw === '.') {
|
|
|
+ if (sourceField === '定额分') {
|
|
|
+ row.金额 = ''
|
|
|
+ row.秒 = ''
|
|
|
+ row.分 = ''
|
|
|
+ } else {
|
|
|
+ row.定额分 = ''
|
|
|
+ row.秒 = ''
|
|
|
+ row.分 = ''
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const num = parseFloat(raw)
|
|
|
+ if (!Number.isFinite(num)) return
|
|
|
+
|
|
|
+ if (sourceField === '定额分') {
|
|
|
+ const money = num * 0.067
|
|
|
+ const seconds = (60 / 0.25) * money
|
|
|
+ row.金额 = roundGyDetail2(money)
|
|
|
+ row.秒 = roundGyDetail2(seconds)
|
|
|
+ row.分 = roundGyDetail2(seconds / 60)
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const score = num / 0.067
|
|
|
+ const seconds = (60 / 0.25) * num
|
|
|
+ row.定额分 = roundGyDetail2(score)
|
|
|
+ row.秒 = roundGyDetail2(seconds)
|
|
|
+ row.分 = roundGyDetail2(seconds / 60)
|
|
|
+ }
|
|
|
+
|
|
|
+ const onGyDetailDecimalInput = (row, field, val) => {
|
|
|
+ row[field] = sanitizeGyDetailDecimalInput(val)
|
|
|
+ applyGyDetailScoreMoneyCalc(row, field)
|
|
|
+ refreshGyDetailTableFooter()
|
|
|
+ }
|
|
|
+
|
|
|
+ const formatGyDetailCellText = (val) => {
|
|
|
+ if (val === null || val === undefined) return ''
|
|
|
+ return String(val)
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 工艺状态:0 正常,1 被拆分(接口可能为字符串) */
|
|
|
+ const formatGyDetailStatus = (status) => {
|
|
|
+ const code = Number(status)
|
|
|
+ if (code === 1) return '被拆分'
|
|
|
+ if (code === 0) return '正常'
|
|
|
+ return ''
|
|
|
+ }
|
|
|
+
|
|
|
+ const isGyDetailRowSplit = (row) => Number(row?.状态) === 1
|
|
|
+
|
|
|
+ const isGyDetailCellEditing = (row, field) => {
|
|
|
+ if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return false
|
|
|
+ const editing = gyDetailEditingCell.value
|
|
|
+ return editing?.rowKey === row._rowKey && editing?.field === field
|
|
|
+ }
|
|
|
+
|
|
|
+ const setGyDetailCellInputRef = (el) => {
|
|
|
+ gyDetailCellInputRef.value = el
|
|
|
+ }
|
|
|
+
|
|
|
+ const startGyDetailCellEdit = (row, field) => {
|
|
|
+ if (gyDetailReadonly.value && !isGyDetailCellEditable(field)) return
|
|
|
+ // 先清除之前的输入框引用,确保新输入框能正确获取焦点
|
|
|
+ gyDetailCellInputRef.value = null
|
|
|
+ gyDetailEditingCell.value = { rowKey: row._rowKey, field }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 键盘导航字段顺序
|
|
|
+ const navFields = ['部件名称', '工序名称', '秒', '分', '定额分', '金额']
|
|
|
+
|
|
|
+ // 处理单元格键盘事件
|
|
|
+ const handleGyDetailCellKeydown = async (event, row, field) => {
|
|
|
+ const key = event.key
|
|
|
+
|
|
|
+ // 只处理方向键
|
|
|
+ if (!['ArrowRight', 'ArrowLeft', 'ArrowDown', 'ArrowUp'].includes(key)) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 阻止浏览器默认行为(页面滚动)
|
|
|
+ event.preventDefault()
|
|
|
+
|
|
|
+ const fieldIndex = navFields.indexOf(field)
|
|
|
+
|
|
|
+ // 如果不是导航字段,不处理
|
|
|
+ if (fieldIndex === -1) return
|
|
|
+
|
|
|
+ const processList = gyDetailFormData.工艺列表
|
|
|
+ const rowIndex = processList.findIndex(r => r._rowKey === row._rowKey)
|
|
|
+
|
|
|
+ if (rowIndex === -1) return
|
|
|
+
|
|
|
+ let targetRow = row
|
|
|
+ let targetField = field
|
|
|
+ let shouldMove = false
|
|
|
+
|
|
|
+ switch (key) {
|
|
|
+ case 'ArrowRight':
|
|
|
+ // 向右移动到下一个字段
|
|
|
+ if (fieldIndex < navFields.length - 1) {
|
|
|
+ targetField = navFields[fieldIndex + 1]
|
|
|
+ shouldMove = true
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case 'ArrowLeft':
|
|
|
+ // 向左移动到上一个字段
|
|
|
+ if (fieldIndex > 0) {
|
|
|
+ targetField = navFields[fieldIndex - 1]
|
|
|
+ shouldMove = true
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case 'ArrowDown':
|
|
|
+ // 向下移动到下一行
|
|
|
+ if (rowIndex < processList.length - 1) {
|
|
|
+ targetRow = processList[rowIndex + 1]
|
|
|
+ shouldMove = true
|
|
|
+ }
|
|
|
+ break
|
|
|
+ case 'ArrowUp':
|
|
|
+ // 向上移动到上一行
|
|
|
+ if (rowIndex > 0) {
|
|
|
+ targetRow = processList[rowIndex - 1]
|
|
|
+ shouldMove = true
|
|
|
+ }
|
|
|
+ break
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果需要移动,切换焦点
|
|
|
+ if (shouldMove) {
|
|
|
+ // 先完成当前单元格的编辑(保存数据)
|
|
|
+ await finishGyDetailCellEdit(row)
|
|
|
+ // 然后移动到新单元格
|
|
|
+ startGyDetailCellEdit(targetRow, targetField)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const clearGyDetailCellEdit = () => {
|
|
|
+ gyDetailEditingCell.value = null
|
|
|
+ gyDetailCellInputRef.value = null
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ const finishGyDetailCellEdit = async (row) => {
|
|
|
+ if (!gyDetailEditingCell.value) return
|
|
|
+ const editingField = gyDetailEditingCell.value.field
|
|
|
+ gyDetailLastEditingField.value = editingField
|
|
|
+
|
|
|
+ // 检查当前编辑字段的值是否变化
|
|
|
+ const currentValue = normalizeGyDetailField(row[editingField])
|
|
|
+ const originValue = normalizeGyDetailField(row._gyDetailOrigin?.[editingField])
|
|
|
+ const isFieldChanged = currentValue !== originValue
|
|
|
+
|
|
|
+ clearGyDetailCellEdit()
|
|
|
+
|
|
|
+ // 如果字段值没有变化,直接返回,不做任何操作
|
|
|
+ if (!isFieldChanged && !row._gyDetailNew) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 失焦时再按工分/金额公式落一次(四舍五入两位),并带上联动字段一起保存
|
|
|
+ if (editingField === '定额分' || editingField === '金额') {
|
|
|
+ applyGyDetailScoreMoneyCalc(row, editingField)
|
|
|
+ if (editingField === '定额分' && String(row.定额分 ?? '').trim() !== '') {
|
|
|
+ row.定额分 = roundGyDetail2(parseFloat(row.定额分))
|
|
|
+ }
|
|
|
+ if (editingField === '金额' && String(row.金额 ?? '').trim() !== '') {
|
|
|
+ row.金额 = roundGyDetail2(parseFloat(row.金额))
|
|
|
+ }
|
|
|
+ refreshGyDetailTableFooter()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新行:未齐三个必填时,工分等字段暂不提交;已齐则继续(可能已新增过,由 handleUpdateProcess 决定增/改)
|
|
|
+ if (row._gyDetailNew && editingField !== '工序名称' && editingField !== '部件名称') {
|
|
|
+ const buJianMingCheng = String(row.部件名称 || '').trim()
|
|
|
+ const gongXuMingCheng = String(row.工序名称 || '').trim()
|
|
|
+ const daGongXu = String(row.大工序 || '').trim()
|
|
|
+ if (!buJianMingCheng || !gongXuMingCheng || !daGongXu) {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (editingField === '部件名称') {
|
|
|
+ const buJianMingCheng = String(row.部件名称 || '').trim()
|
|
|
+ if (!buJianMingCheng) {
|
|
|
+ row.部件编号 = ''
|
|
|
+ } else {
|
|
|
+ ensureGyDetailPartCode(row)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 自动填写生产工序
|
|
|
+ const autoFillOptions = ['裁剪', '手工', '大烫', '总检', '包装']
|
|
|
+ if (autoFillOptions.includes(buJianMingCheng)) {
|
|
|
+ row.大工序 = buJianMingCheng
|
|
|
+ } else if (buJianMingCheng) {
|
|
|
+ row.大工序 = '车缝'
|
|
|
+ }
|
|
|
+
|
|
|
+ // 新行编辑部件名称时,检查工序名称是否已填写
|
|
|
+ if (row._gyDetailNew) {
|
|
|
+ const gongXuMingCheng = String(row.工序名称 || '').trim()
|
|
|
+ if (!gongXuMingCheng) {
|
|
|
+ ElMessage.warning('请先填写工序名称')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (editingField === '定额分') {
|
|
|
+ // 获取所有未拆分的数据
|
|
|
+ const unsplitData = gyDetailDisplayProcessList.value.filter(
|
|
|
+ row => !isGyDetailRowSplit(row)
|
|
|
+ );
|
|
|
+
|
|
|
+ // 计算未拆分工序的总工分
|
|
|
+ const unsplitTotalScore = unsplitData.reduce(
|
|
|
+ (sum, row) => sum + (parseFloat(row.定额分) || 0),
|
|
|
+ 0
|
|
|
+ );
|
|
|
+
|
|
|
+ // 获取计划制造工分
|
|
|
+ const planManufactureScore = parseFloat(gyDetailFormData.计划制造工分) || 0;
|
|
|
+
|
|
|
+ // 如果未拆分工序的总工分超过计划制造工分,回退并提示
|
|
|
+ if (unsplitTotalScore > planManufactureScore) {
|
|
|
+ ElMessage.warning(`未拆分工序总工分(${unsplitTotalScore.toFixed(2)})不能大于计划制造工分(${planManufactureScore.toFixed(2)})`);
|
|
|
+ row.定额分 = row._gyDetailOrigin?.定额分 ?? row.定额分;
|
|
|
+ refreshGyDetailTableFooter();
|
|
|
+ return;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+ await handleUpdateProcess(row)
|
|
|
+ refreshGyDetailTableFooter()
|
|
|
+ }
|
|
|
+
|
|
|
+ watch(gyDetailEditingCell, async (cell) => {
|
|
|
+ if (!cell) return
|
|
|
+ await nextTick()
|
|
|
+ await nextTick() // 多等一个tick确保DOM更新
|
|
|
+
|
|
|
+ // 优先使用ref引用
|
|
|
+ const comp = gyDetailCellInputRef.value
|
|
|
+ if (comp?.focus) {
|
|
|
+ comp.focus()
|
|
|
+ comp.select?.()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 如果ref没有值,尝试从DOM中查找当前编辑单元格的输入框
|
|
|
+ const inputEl = comp?.input || comp?.$el?.querySelector?.('input')
|
|
|
+ if (inputEl) {
|
|
|
+ inputEl.focus?.()
|
|
|
+ inputEl.select?.()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ // 最后的备选方案:查找所有可见的输入框
|
|
|
+ const allInputs = document.querySelectorAll('.gy-detail-cell-input input')
|
|
|
+ if (allInputs.length > 0) {
|
|
|
+ const lastInput = allInputs[allInputs.length - 1]
|
|
|
+ lastInput.focus()
|
|
|
+ lastInput.select()
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ const normalizeGyDetailField = (val) => String(val ?? '').trim()
|
|
|
+
|
|
|
+ const snapshotGyDetailRow = (row) => ({
|
|
|
+ 部件编号: normalizeGyDetailField(row?.部件编号),
|
|
|
+ 部件名称: normalizeGyDetailField(row?.部件名称),
|
|
|
+ 工序编号: normalizeGyDetailField(row?.工序编号),
|
|
|
+ 工序名称: normalizeGyDetailField(row?.工序名称),
|
|
|
+ 大工序: normalizeGyDetailField(row?.大工序),
|
|
|
+ 秒: normalizeGyDetailField(row?.秒),
|
|
|
+ 分: normalizeGyDetailField(row?.分),
|
|
|
+ 定额分: normalizeGyDetailField(row?.定额分),
|
|
|
+ 金额: normalizeGyDetailField(row?.金额),
|
|
|
+ 难度系数: normalizeGyDetailField(row?.难度系数),
|
|
|
+ 备注: normalizeGyDetailField(row?.备注),
|
|
|
+ })
|
|
|
+
|
|
|
+ const isGyDetailRowChanged = (row) => {
|
|
|
+ const current = snapshotGyDetailRow(row)
|
|
|
+ const origin = row?._gyDetailOrigin || {}
|
|
|
+ return Object.keys(current).some((key) => current[key] !== origin[key])
|
|
|
+ }
|
|
|
+
|
|
|
+ const attachGyDetailRowMeta = (row, index) => {
|
|
|
+ const item = {
|
|
|
+ ...row,
|
|
|
+ _rowKey: row.id ? `id_${row.id}` : `idx_${index}_${row.工序编号 ?? ''}`,
|
|
|
+ }
|
|
|
+ item._gyDetailOrigin = snapshotGyDetailRow(item)
|
|
|
+ return item
|
|
|
+ }
|
|
|
+
|
|
|
+ const assignGyDetailRowKeys = (list) => {
|
|
|
+ if (!Array.isArray(list)) return []
|
|
|
+ return list.map((row, index) => attachGyDetailRowMeta(row, index))
|
|
|
+ }
|
|
|
+
|
|
|
+ const updateGyDetailTableHeight = () => {
|
|
|
+ const el = gyDetailTableWrapRef.value
|
|
|
+ if (el?.clientHeight > 0) {
|
|
|
+ // 预留底部横向滚动条高度
|
|
|
+ gyDetailTableHeight.value = Math.max(240, el.clientHeight - 16)
|
|
|
+ }
|
|
|
+ nextTick(() => {
|
|
|
+ gyDetailTableRef.value?.recalculate?.()
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ const gyDetailBuJianMingChengFilter = ref([])
|
|
|
+ const gyDetailDaGongXuFilter = ref([])
|
|
|
+ const gyDetailNanDuXiShuFilter = ref([])
|
|
|
+ const gyDetailZhuangTaiFilter = ref([])
|
|
|
+
|
|
|
+ // 跟踪每个筛选是否被用户手动设置过
|
|
|
+ const gyDetailBuJianMingChengFilterManuallySet = ref(false)
|
|
|
+ const gyDetailDaGongXuFilterManuallySet = ref(false)
|
|
|
+ const gyDetailNanDuXiShuFilterManuallySet = ref(false)
|
|
|
+ const gyDetailZhuangTaiFilterManuallySet = ref(false)
|
|
|
+
|
|
|
+ const isGyDetailFilterActive = (selectedRef, options) => {
|
|
|
+ const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
+ const allValues = optionList.map((item) => item.value)
|
|
|
+ const selected = selectedRef?.value ?? selectedRef ?? []
|
|
|
+ if (!allValues.length) return false
|
|
|
+ return selected.length < allValues.length
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 模板里 ref 会自动解包为数组,脚本里传的是 ref,需兼容两种写法 */
|
|
|
+ const setGyDetailFilterSelected = (filterRef, values) => {
|
|
|
+ const next = [...values]
|
|
|
+ if (isRef(filterRef)) {
|
|
|
+ filterRef.value = next
|
|
|
+ return
|
|
|
+ }
|
|
|
+ if (Array.isArray(filterRef)) {
|
|
|
+ filterRef.splice(0, filterRef.length, ...next)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const selectAllGyDetailFilter = (filterRef, options) => {
|
|
|
+ const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
+ setGyDetailFilterSelected(filterRef, optionList.map((item) => item.value))
|
|
|
+ }
|
|
|
+
|
|
|
+ const clearGyDetailFilter = (filterRef) => {
|
|
|
+ setGyDetailFilterSelected(filterRef, [])
|
|
|
+ }
|
|
|
+
|
|
|
+ // 部件名称筛选操作
|
|
|
+ const selectAllGyDetailBuJianMingChengFilter = () => {
|
|
|
+ gyDetailBuJianMingChengFilterManuallySet.value = true
|
|
|
+ selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
|
+ }
|
|
|
+ const clearGyDetailBuJianMingChengFilter = () => {
|
|
|
+ gyDetailBuJianMingChengFilterManuallySet.value = true
|
|
|
+ clearGyDetailFilter(gyDetailBuJianMingChengFilter)
|
|
|
+ }
|
|
|
+ const handleGyDetailBuJianMingChengFilterChange = () => {
|
|
|
+ gyDetailBuJianMingChengFilterManuallySet.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 大工序筛选操作
|
|
|
+ const selectAllGyDetailDaGongXuFilter = () => {
|
|
|
+ gyDetailDaGongXuFilterManuallySet.value = true
|
|
|
+ selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
|
+ }
|
|
|
+ const clearGyDetailDaGongXuFilter = () => {
|
|
|
+ gyDetailDaGongXuFilterManuallySet.value = true
|
|
|
+ clearGyDetailFilter(gyDetailDaGongXuFilter)
|
|
|
+ }
|
|
|
+ const handleGyDetailDaGongXuFilterChange = () => {
|
|
|
+ gyDetailDaGongXuFilterManuallySet.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 难度系数筛选操作
|
|
|
+ const selectAllGyDetailNanDuXiShuFilter = () => {
|
|
|
+ gyDetailNanDuXiShuFilterManuallySet.value = true
|
|
|
+ selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
|
+ }
|
|
|
+ const clearGyDetailNanDuXiShuFilter = () => {
|
|
|
+ gyDetailNanDuXiShuFilterManuallySet.value = true
|
|
|
+ clearGyDetailFilter(gyDetailNanDuXiShuFilter)
|
|
|
+ }
|
|
|
+ const handleGyDetailNanDuXiShuFilterChange = () => {
|
|
|
+ gyDetailNanDuXiShuFilterManuallySet.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 状态筛选操作
|
|
|
+ const selectAllGyDetailZhuangTaiFilter = () => {
|
|
|
+ gyDetailZhuangTaiFilterManuallySet.value = true
|
|
|
+ selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
|
|
|
+ }
|
|
|
+ const clearGyDetailZhuangTaiFilter = () => {
|
|
|
+ gyDetailZhuangTaiFilterManuallySet.value = true
|
|
|
+ clearGyDetailFilter(gyDetailZhuangTaiFilter)
|
|
|
+ }
|
|
|
+ const handleGyDetailZhuangTaiFilterChange = () => {
|
|
|
+ gyDetailZhuangTaiFilterManuallySet.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ const applyGyDetailColumnFilter = (list, filterRef, options, matchRow, isManuallySet) => {
|
|
|
+ // 如果没有被用户手动设置过筛选,直接返回所有数据
|
|
|
+ if (!isManuallySet) {
|
|
|
+ return list
|
|
|
+ }
|
|
|
+ const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
+ const selected = filterRef.value
|
|
|
+ if (!selected.length) return list
|
|
|
+ if (!optionList.length || selected.length >= optionList.length) return list
|
|
|
+ const set = new Set(selected.map((v) => normalizeGyDetailField(v)))
|
|
|
+ return list.filter((row) => row._gyDetailNew || set.has(matchRow(row)))
|
|
|
+ }
|
|
|
+
|
|
|
+ const gyDetailDisplayProcessList = computed(() => {
|
|
|
+ let list = gyDetailFormData.工艺列表 || []
|
|
|
+ list = applyGyDetailColumnFilter(
|
|
|
+ list,
|
|
|
+ gyDetailBuJianMingChengFilter,
|
|
|
+ gyDetailBuJianMingChengFilterOptions.value,
|
|
|
+ (row) => normalizeGyDetailField(row.部件名称),
|
|
|
+ gyDetailBuJianMingChengFilterManuallySet.value,
|
|
|
+ )
|
|
|
+ list = applyGyDetailColumnFilter(
|
|
|
+ list,
|
|
|
+ gyDetailDaGongXuFilter,
|
|
|
+ dagongxuFilters.value,
|
|
|
+ (row) => normalizeGyDetailField(row.大工序),
|
|
|
+ gyDetailDaGongXuFilterManuallySet.value,
|
|
|
+ )
|
|
|
+ list = applyGyDetailColumnFilter(
|
|
|
+ list,
|
|
|
+ gyDetailNanDuXiShuFilter,
|
|
|
+ gyDetailDifficultyFilterOptions.value,
|
|
|
+ (row) => normalizeGyDetailField(row.难度系数),
|
|
|
+ gyDetailNanDuXiShuFilterManuallySet.value,
|
|
|
+ )
|
|
|
+ list = applyGyDetailColumnFilter(
|
|
|
+ list,
|
|
|
+ gyDetailZhuangTaiFilter,
|
|
|
+ gyDetailStatusFilterOptions,
|
|
|
+ (row) => getGyDetailRowStatusFilterValue(row),
|
|
|
+ gyDetailZhuangTaiFilterManuallySet.value,
|
|
|
+ )
|
|
|
+ return list
|
|
|
+ })
|
|
|
+
|
|
|
+ const syncGyDetailFilterAfterDataChange = (filterRef, options) => {
|
|
|
+ // 禁用自动同步筛选,只在用户手动点击时才触发
|
|
|
+ // const optionList = Array.isArray(options) ? options : (options?.value || [])
|
|
|
+ // const allValues = optionList.map((item) => item.value)
|
|
|
+ // const selected = filterRef.value
|
|
|
+ // if (!selected.length) {
|
|
|
+ // filterRef.value = [...allValues]
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // const wasAllSelected = allValues.length > 0 && allValues.every((v) => selected.includes(v))
|
|
|
+ // if (wasAllSelected) {
|
|
|
+ // filterRef.value = [...allValues]
|
|
|
+ // return
|
|
|
+ // }
|
|
|
+ // filterRef.value = selected.filter((v) => allValues.includes(v))
|
|
|
+ }
|
|
|
+
|
|
|
+ /** 打开详情或刷新后:默认全选各列筛选项 */
|
|
|
+ const initGyDetailFilters = () => {
|
|
|
+ // 重置手动设置标志位为 false
|
|
|
+ gyDetailBuJianMingChengFilterManuallySet.value = false
|
|
|
+ gyDetailDaGongXuFilterManuallySet.value = false
|
|
|
+ gyDetailNanDuXiShuFilterManuallySet.value = false
|
|
|
+ gyDetailZhuangTaiFilterManuallySet.value = false
|
|
|
+ // 初始化筛选选项
|
|
|
+ selectAllGyDetailFilter(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
|
+ selectAllGyDetailFilter(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
|
+ selectAllGyDetailFilter(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
|
+ selectAllGyDetailFilter(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
|
|
|
+ }
|
|
|
+
|
|
|
+ const syncGyDetailFiltersAfterDataChange = () => {
|
|
|
+ syncGyDetailFilterAfterDataChange(gyDetailBuJianMingChengFilter, gyDetailBuJianMingChengFilterOptions)
|
|
|
+ syncGyDetailFilterAfterDataChange(gyDetailDaGongXuFilter, dagongxuFilters)
|
|
|
+ syncGyDetailFilterAfterDataChange(gyDetailNanDuXiShuFilter, gyDetailDifficultyFilterOptions)
|
|
|
+ syncGyDetailFilterAfterDataChange(gyDetailZhuangTaiFilter, gyDetailStatusFilterOptions)
|
|
|
+ }
|
|
|
+
|
|
|
+ const sumGyDetailDisplayField = (field) => {
|
|
|
+ let total = 0
|
|
|
+ let count = 0
|
|
|
+ for (const item of gyDetailDisplayProcessList.value || []) {
|
|
|
+ const val = Number(item?.[field])
|
|
|
+ if (!Number.isNaN(val)) {
|
|
|
+ total += val
|
|
|
+ count++
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return count > 0 ? total.toFixed(2) : '0.00'
|
|
|
+ }
|
|
|
+
|
|
|
+ const gyDetailFooterSums = computed(() => ({
|
|
|
+ 秒: sumGyDetailDisplayField('秒'),
|
|
|
+ 分: sumGyDetailDisplayField('分'),
|
|
|
+ 定额分: sumGyDetailDisplayField('定额分'),
|
|
|
+ 金额: sumGyDetailDisplayField('金额'),
|
|
|
+ }))
|
|
|
+
|
|
|
+ const gyDetailFooterMethod = () => {
|
|
|
+ // 与拆分判断一致:状态 1 为被拆分,其余(含数字 0 / 字符串 '0')都计入合计
|
|
|
+ const normalData = (gyDetailDisplayProcessList.value || []).filter(
|
|
|
+ (row) => !isGyDetailRowSplit(row)
|
|
|
+ )
|
|
|
+
|
|
|
+ // 如果没有正常数据,合计全部为0
|
|
|
+ if (normalData.length === 0) {
|
|
|
+ return [['合计', '', '', '', '', '', '0.00', '0.00', '0.00', '0.00', '', '', '', '']]
|
|
|
+ }
|
|
|
+
|
|
|
+ // 计算各项合计
|
|
|
+ const sums = {
|
|
|
+ 秒: normalData.reduce((sum, row) => sum + (Number(row.秒) || 0), 0),
|
|
|
+ 分: normalData.reduce((sum, row) => sum + (Number(row.分) || 0), 0),
|
|
|
+ 定额分: normalData.reduce((sum, row) => sum + (Number(row.定额分) || 0), 0),
|
|
|
+ 金额: normalData.reduce((sum, row) => sum + (Number(row.金额) || 0), 0),
|
|
|
+ }
|
|
|
+
|
|
|
+ return [[
|
|
|
+ '合计',
|
|
|
+ '',
|
|
|
+ '',
|
|
|
+ '',
|
|
|
+ '',
|
|
|
+ '',
|
|
|
+ sums.秒.toFixed(2),
|
|
|
+ sums.分.toFixed(2),
|
|
|
+ sums.定额分.toFixed(2),
|
|
|
+ sums.金额.toFixed(2),
|
|
|
+ '',
|
|
|
+ '',
|
|
|
+ '',
|
|
|
+ '',
|
|
|
+ ]]
|
|
|
+}
|
|
|
+
|
|
|
+ const refreshGyDetailTableFooter = () => {
|
|
|
+ nextTick(() => {
|
|
|
+ const $table = gyDetailTableRef.value
|
|
|
+ $table?.updateFooter?.()
|
|
|
+ $table?.recalculate?.()
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ watch(
|
|
|
+ [gyDetailBuJianMingChengFilter, gyDetailDaGongXuFilter, gyDetailNanDuXiShuFilter, gyDetailZhuangTaiFilter],
|
|
|
+ refreshGyDetailTableFooter,
|
|
|
+ { deep: true },
|
|
|
+ )
|
|
|
+ watch(gyDetailDisplayProcessList, refreshGyDetailTableFooter)
|
|
|
+
|
|
|
+ const gyDetailPrintTableData = computed(() => {
|
|
|
+ return (gyDetailFormData.工艺列表 || []).map((row) => ({
|
|
|
+ 部位编号: row.部件编号 ?? '',
|
|
|
+ 部位名称: row.部件名称 ?? '',
|
|
|
+ 工序编号: row.工序编号 ?? '',
|
|
|
+ 工序名称: row.工序名称 ?? '',
|
|
|
+ 生产工序: row.大工序 ?? '',
|
|
|
+ }))
|
|
|
+ })
|
|
|
+
|
|
|
+ const getNextGyDetailProcessCode = () => {
|
|
|
+ const list = gyDetailFormData.工艺列表 || []
|
|
|
+ let max = 0
|
|
|
+ for (const row of list) {
|
|
|
+ const n = parseInt(String(row.工序编号 ?? '').trim(), 10)
|
|
|
+ if (!Number.isNaN(n) && n > max) {
|
|
|
+ max = n
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return max + 1
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleGyDetailCheckboxChange = ({ records }) => {
|
|
|
+ gyDetailSelection.value = records || []
|
|
|
+ }
|
|
|
+
|
|
|
+ watch(gyDetailDialogVisible, async (visible) => {
|
|
|
+ if (visible) {
|
|
|
+ await nextTick()
|
|
|
+ updateGyDetailTableHeight()
|
|
|
+ if (!gyDetailResizeObserver && gyDetailTableWrapRef.value) {
|
|
|
+ gyDetailResizeObserver = new ResizeObserver(() => updateGyDetailTableHeight())
|
|
|
+ gyDetailResizeObserver.observe(gyDetailTableWrapRef.value)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ onBeforeUnmount(() => {
|
|
|
+ gyDetailResizeObserver?.disconnect()
|
|
|
+ gyDetailResizeObserver = null
|
|
|
+ })
|
|
|
+
|
|
|
+ const clearGyDetailTableSelection = async () => {
|
|
|
+ gyDetailSelection.value = []
|
|
|
+ await nextTick()
|
|
|
+ const $table = gyDetailTableRef.value
|
|
|
+ if ($table?.clearCheckboxRow) {
|
|
|
+ $table.clearCheckboxRow()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const refreshGyDetailProcessList = async () => {
|
|
|
+ const workorder = gyDetailFormData.订单编号
|
|
|
+ if (!workorder) return
|
|
|
+ const processRes = await getWorkOrderProcess({ workorder })
|
|
|
+ if (processRes.code === 0 && Array.isArray(processRes.data)) {
|
|
|
+ gyDetailFormData.工艺列表 = assignGyDetailRowKeys(processRes.data)
|
|
|
+ } else {
|
|
|
+ gyDetailFormData.工艺列表 = []
|
|
|
+ }
|
|
|
+ await clearGyDetailTableSelection()
|
|
|
+ // syncGyDetailFiltersAfterDataChange() // 禁用自动同步筛选,只在用户手动点击时才触发
|
|
|
+ await nextTick()
|
|
|
+ updateGyDetailTableHeight()
|
|
|
+ }
|
|
|
+
|
|
|
+ const scrollGyDetailTableToBottom = async (row) => {
|
|
|
+ await nextTick()
|
|
|
+ const $table = gyDetailTableRef.value
|
|
|
+ const visibleList = gyDetailDisplayProcessList.value
|
|
|
+ const targetRow = row && visibleList.includes(row) ? row : visibleList[visibleList.length - 1]
|
|
|
+ if (!targetRow) return
|
|
|
+
|
|
|
+ const scrollToTarget = () => {
|
|
|
+ if ($table?.scrollToRow) {
|
|
|
+ $table.scrollToRow(targetRow)
|
|
|
+ } else {
|
|
|
+ const body = gyDetailTableWrapRef.value?.querySelector('.vxe-table--body-wrapper')
|
|
|
+ if (body) body.scrollTop = body.scrollHeight
|
|
|
+ }
|
|
|
+ $table?.setCurrentRow?.(targetRow)
|
|
|
+ }
|
|
|
+
|
|
|
+ scrollToTarget()
|
|
|
+ requestAnimationFrame(scrollToTarget)
|
|
|
+ }
|
|
|
+
|
|
|
+ const openGyDetailProcessAdd = async () => {
|
|
|
+ const orderNo = String(gyDetailFormData.订单编号 || '').trim()
|
|
|
+ if (!orderNo) {
|
|
|
+ ElMessage.warning('无订单编号,无法新增工艺')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const batchCount = 10
|
|
|
+ const startIndex = gyDetailFormData.工艺列表.length
|
|
|
+ for (let i = 0; i < batchCount; i++) {
|
|
|
+ const nextCode = getNextGyDetailProcessCode()
|
|
|
+ const newRow = {
|
|
|
+ id: '',
|
|
|
+ 部件编号: '',
|
|
|
+ 部件名称: '',
|
|
|
+ 工序编号: String(nextCode),
|
|
|
+ 工序名称: '',
|
|
|
+ 大工序: '',
|
|
|
+ 秒: '',
|
|
|
+ 分: '',
|
|
|
+ 定额分: '',
|
|
|
+ 金额: '',
|
|
|
+ 难度系数: 'C',
|
|
|
+ 备注: '',
|
|
|
+ 状态: 0,
|
|
|
+ _gyDetailNew: true,
|
|
|
+ _rowKey: `new_${Date.now()}_${nextCode}_${i}`,
|
|
|
+ }
|
|
|
+ gyDetailFormData.工艺列表.push(newRow)
|
|
|
+ newRow._gyDetailOrigin = snapshotGyDetailRow(newRow)
|
|
|
+ }
|
|
|
+ // 聚焦本次新增的第一条空白行(不是最后一条)
|
|
|
+ const firstNewRow = gyDetailFormData.工艺列表[startIndex]
|
|
|
+ await scrollGyDetailTableToBottom(firstNewRow)
|
|
|
+ if (!gyDetailReadonly.value && firstNewRow) {
|
|
|
+ startGyDetailCellEdit(firstNewRow, '工序名称')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ const handleGyDetailBatchDelete = async () => {
|
|
|
+ if (gyDetailDeleting.value) return
|
|
|
+ if (!gyDetailSelection.value.length) {
|
|
|
+ ElMessage.warning('请先勾选要删除的工序')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ const selectedRows = [...gyDetailSelection.value]
|
|
|
+ try {
|
|
|
+ await ElMessageBox.confirm('确定删除选中的工序吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ appendTo: document.body,
|
|
|
+ })
|
|
|
+ } catch {
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ gyDetailDeleting.value = true
|
|
|
+ let failCount = 0
|
|
|
+ try {
|
|
|
+ for (const row of selectedRows) {
|
|
|
+ if (!row.id || row._gyDetailNew) {
|
|
|
+ const index = gyDetailFormData.工艺列表.indexOf(row)
|
|
|
+ if (index > -1) {
|
|
|
+ gyDetailFormData.工艺列表.splice(index, 1)
|
|
|
+ }
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ const result = await DeleteProcess({ id: row.id })
|
|
|
+ if (result?.code !== 0) {
|
|
|
+ failCount += 1
|
|
|
+ }
|
|
|
+ }
|
|
|
+ await refreshGyDetailProcessList()
|
|
|
+ if (failCount > 0) {
|
|
|
+ ElMessage.warning(`有 ${failCount} 条删除失败,列表已刷新`)
|
|
|
+ } else {
|
|
|
+ ElMessage.success('删除成功')
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('批量删除工艺失败', e)
|
|
|
+ ElMessage.error('删除失败')
|
|
|
+ try {
|
|
|
+ await refreshGyDetailProcessList()
|
|
|
+ } catch {
|
|
|
+ /* ignore */
|
|
|
+ }
|
|
|
+ } finally {
|
|
|
+ gyDetailDeleting.value = false
|
|
|
+ document.body.classList.remove('el-popup-parent--hidden')
|
|
|
+ document.body.style.overflow = ''
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const escapeGyPrintHtml = (val) => {
|
|
|
+ return String(val ?? '')
|
|
|
+ .replace(/&/g, '&')
|
|
|
+ .replace(/</g, '<')
|
|
|
+ .replace(/>/g, '>')
|
|
|
+ .replace(/"/g, '"')
|
|
|
+ }
|
|
|
+
|
|
|
+ const GY_DETAIL_PRINT_PAGE_STYLE = `
|
|
|
+ @page { size: A4 portrait; margin: 5mm 6mm; }
|
|
|
+ * { box-sizing: border-box; }
|
|
|
+ body {
|
|
|
+ margin: 0;
|
|
|
+ padding: 0;
|
|
|
+ font-family: "Microsoft YaHei", SimSun, sans-serif;
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 1.25;
|
|
|
+ color: #000;
|
|
|
+ }
|
|
|
+ .gy-print-table {
|
|
|
+ width: 100%;
|
|
|
+ border-collapse: collapse;
|
|
|
+ table-layout: fixed;
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+ .gy-print-table th,
|
|
|
+ .gy-print-table td {
|
|
|
+ border: 1px solid #000;
|
|
|
+ padding: 2px 4px;
|
|
|
+ text-align: center;
|
|
|
+ vertical-align: middle;
|
|
|
+ word-break: break-word;
|
|
|
+ overflow-wrap: anywhere;
|
|
|
+ }
|
|
|
+ .gy-print-table th { font-weight: bold; padding: 3px 4px; }
|
|
|
+ .gy-print-sheet-head td {
|
|
|
+ border: none;
|
|
|
+ padding: 0 4px;
|
|
|
+ text-align: center;
|
|
|
+ vertical-align: middle;
|
|
|
+ }
|
|
|
+ .gy-print-sheet-head--company-cn td {
|
|
|
+ padding-top: 2px;
|
|
|
+ padding-bottom: 2px;
|
|
|
+ font-size: 18px;
|
|
|
+ font-weight: bold;
|
|
|
+ line-height: 1.35;
|
|
|
+ letter-spacing: 2px;
|
|
|
+ }
|
|
|
+ .gy-print-sheet-head--company-en td {
|
|
|
+ padding-bottom: 6px;
|
|
|
+ font-size: 11px;
|
|
|
+ font-weight: normal;
|
|
|
+ line-height: 1.3;
|
|
|
+ letter-spacing: 0.5px;
|
|
|
+ }
|
|
|
+ .gy-print-sheet-head--title td {
|
|
|
+ font-size: 24px;
|
|
|
+ font-weight: bold;
|
|
|
+ letter-spacing: 6px;
|
|
|
+ padding-bottom: 8px;
|
|
|
+ line-height: 1.2;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+ .gy-print-sheet-head--meta td {
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: normal;
|
|
|
+ padding-bottom: 2px;
|
|
|
+ letter-spacing: 0.5px;
|
|
|
+ }
|
|
|
+ .gy-print-sheet-head--meta-last td {
|
|
|
+ padding-bottom: 6px;
|
|
|
+ }
|
|
|
+ .gy-print-meta-row {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+ .gy-print-table col.col-part-no { width: 80px; }
|
|
|
+ .gy-print-table col.col-part-name { width: 80px; }
|
|
|
+ .gy-print-table col.col-process-no { width: 80px; }
|
|
|
+ .gy-print-table col.col-workshop { width: 12%; }
|
|
|
+ .gy-print-table col.col-process-name { width: auto; }
|
|
|
+ .gy-print-table .col-part-no,
|
|
|
+ .gy-print-table .col-part-name,
|
|
|
+ .gy-print-table .col-process-no {
|
|
|
+ padding: 2px 3px;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ .gy-print-table .col-process-name { text-align: left; }
|
|
|
+ thead { display: table-header-group; }
|
|
|
+ tr { page-break-inside: avoid; }
|
|
|
+ `
|
|
|
+
|
|
|
+ const buildGyDetailPrintHtml = () => {
|
|
|
+ const rows = gyDetailPrintTableData.value
|
|
|
+ const rowHtml = rows.length
|
|
|
+ ? rows
|
|
|
+ .map(
|
|
|
+ (item) => `<tr>
|
|
|
+ <td class="col-part-no">${escapeGyPrintHtml(item.部位编号)}</td>
|
|
|
+ <td class="col-part-name">${escapeGyPrintHtml(item.部位名称)}</td>
|
|
|
+ <td class="col-process-no">${escapeGyPrintHtml(item.工序编号)}</td>
|
|
|
+ <td class="col-process-name">${escapeGyPrintHtml(item.工序名称)}</td>
|
|
|
+ <td class="col-workshop">${escapeGyPrintHtml(item.生产工序)}</td>
|
|
|
+ </tr>`
|
|
|
+ )
|
|
|
+ .join('')
|
|
|
+ : '<tr><td colspan="5" style="padding:16px;text-align:center;">暂无数据</td></tr>'
|
|
|
+ const orderNo = escapeGyPrintHtml(gyDetailFormData.订单编号)
|
|
|
+ const styleNo = escapeGyPrintHtml(gyDetailFormData.生产款号)
|
|
|
+ const customerNo = escapeGyPrintHtml(gyDetailFormData.客户编号)
|
|
|
+ const productStyle = escapeGyPrintHtml(gyDetailFormData.款式)
|
|
|
+
|
|
|
+ return `
|
|
|
+ <table class="gy-print-table">
|
|
|
+ <colgroup>
|
|
|
+ <col class="col-part-no" />
|
|
|
+ <col class="col-part-name" />
|
|
|
+ <col class="col-process-no" />
|
|
|
+ <col class="col-process-name" />
|
|
|
+ <col class="col-workshop" />
|
|
|
+ </colgroup>
|
|
|
+ <thead>
|
|
|
+ <tr class="gy-print-sheet-head gy-print-sheet-head--company-cn">
|
|
|
+ <td colspan="5">浙 江 达 成 凯 悦 纺 织 服 装 有 限 公 司</td>
|
|
|
+ </tr>
|
|
|
+ <tr class="gy-print-sheet-head gy-print-sheet-head--company-en">
|
|
|
+ <td colspan="5">ZHE JIANG REACHING KAYO TEXTILE & GARMENTS CO LTD</td>
|
|
|
+ </tr>
|
|
|
+ <tr class="gy-print-sheet-head gy-print-sheet-head--title">
|
|
|
+ <td colspan="5">工序表</td>
|
|
|
+ </tr>
|
|
|
+ <tr class="gy-print-sheet-head gy-print-sheet-head--meta">
|
|
|
+ <td colspan="5">
|
|
|
+ <div class="gy-print-meta-row">
|
|
|
+ <span>订单编号:${orderNo}</span>
|
|
|
+ <span>生产款号:${styleNo}</span>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr class="gy-print-sheet-head gy-print-sheet-head--meta gy-print-sheet-head--meta-last">
|
|
|
+ <td colspan="5">
|
|
|
+ <div class="gy-print-meta-row">
|
|
|
+ <span>客户编号:${customerNo}</span>
|
|
|
+ <span>款式:${productStyle}</span>
|
|
|
+ </div>
|
|
|
+ </td>
|
|
|
+ </tr>
|
|
|
+ <tr>
|
|
|
+ <th class="col-part-no">部位编号</th>
|
|
|
+ <th class="col-part-name">部件名称</th>
|
|
|
+ <th class="col-process-no">工序编号</th>
|
|
|
+ <th class="col-process-name">工序名称</th>
|
|
|
+ <th class="col-workshop">生产工序</th>
|
|
|
+ </tr>
|
|
|
+ </thead>
|
|
|
+ <tbody>${rowHtml}</tbody>
|
|
|
+ </table>
|
|
|
+ `
|
|
|
+ }
|
|
|
+
|
|
|
+ let gyDetailPrintIframe = null
|
|
|
+ let gyDetailPrintMql = null
|
|
|
+
|
|
|
+ const showGyDetailPrintMask = () => {
|
|
|
+ if (document.getElementById('gy-detail-print-mask')) return
|
|
|
+ const mask = document.createElement('div')
|
|
|
+ mask.id = 'gy-detail-print-mask'
|
|
|
+ mask.style.cssText = 'position:fixed;inset:0;background:#fff;z-index:99999;'
|
|
|
+ document.body.appendChild(mask)
|
|
|
+ document.body.style.overflow = 'hidden'
|
|
|
+ }
|
|
|
+
|
|
|
+ const cleanupGyDetailPrint = (restoreDetail = false) => {
|
|
|
+ document.getElementById('gy-detail-print-mask')?.remove()
|
|
|
+ document.body.style.overflow = ''
|
|
|
+ if (gyDetailPrintMql) {
|
|
|
+ if (gyDetailPrintMql.removeListener) {
|
|
|
+ gyDetailPrintMql.removeListener(gyDetailPrintMqlHandler)
|
|
|
+ } else {
|
|
|
+ gyDetailPrintMql.removeEventListener('change', gyDetailPrintMqlHandler)
|
|
|
+ }
|
|
|
+ gyDetailPrintMql = null
|
|
|
+ }
|
|
|
+ if (gyDetailPrintIframe) {
|
|
|
+ gyDetailPrintIframe.remove()
|
|
|
+ gyDetailPrintIframe = null
|
|
|
+ }
|
|
|
+ if (restoreDetail) {
|
|
|
+ gyDetailDialogVisible.value = true
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const gyDetailPrintMqlHandler = (e) => {
|
|
|
+ if (!e.matches) {
|
|
|
+ cleanupGyDetailPrint(true)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleGyDetailSave = async () => {
|
|
|
+ if (gyDetailReadonly.value || gyDetailSaving.value) return
|
|
|
+ gyDetailSaving.value = true
|
|
|
+ try {
|
|
|
+ // 先结束当前单元格编辑(原先保存按钮只 blur,没有真正提交)
|
|
|
+ let hadEditingCell = false
|
|
|
+ if (gyDetailEditingCell.value) {
|
|
|
+ hadEditingCell = true
|
|
|
+ const editing = gyDetailEditingCell.value
|
|
|
+ const editingRow = (gyDetailFormData.工艺列表 || []).find((r) => r._rowKey === editing.rowKey)
|
|
|
+ if (editingRow) {
|
|
|
+ await finishGyDetailCellEdit(editingRow)
|
|
|
+ } else {
|
|
|
+ clearGyDetailCellEdit()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const pendingRows = (gyDetailFormData.工艺列表 || []).filter((row) => {
|
|
|
+ if (!isGyDetailRowChanged(row)) return false
|
|
|
+ // 完全空白的新行不提交
|
|
|
+ if (row._gyDetailNew && !row.id) {
|
|
|
+ const filled =
|
|
|
+ String(row.部件名称 || '').trim() ||
|
|
|
+ String(row.工序名称 || '').trim() ||
|
|
|
+ String(row.定额分 || '').trim() ||
|
|
|
+ String(row.金额 || '').trim() ||
|
|
|
+ String(row.秒 || '').trim() ||
|
|
|
+ String(row.分 || '').trim()
|
|
|
+ if (!filled) return false
|
|
|
+ }
|
|
|
+ return true
|
|
|
+ })
|
|
|
+
|
|
|
+ if (!pendingRows.length) {
|
|
|
+ // 编辑中的格子已在 finish 时保存并提示过,这里不再重复弹
|
|
|
+ if (!hadEditingCell) {
|
|
|
+ ElMessage.success('没有需要保存的修改')
|
|
|
+ }
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ let successCount = 0
|
|
|
+ let failCount = 0
|
|
|
+ let skipIncomplete = 0
|
|
|
+
|
|
|
+ for (const row of pendingRows) {
|
|
|
+ const requiredReady = !!(
|
|
|
+ String(row.部件名称 || '').trim() &&
|
|
|
+ String(row.工序名称 || '').trim() &&
|
|
|
+ String(row.大工序 || '').trim()
|
|
|
+ )
|
|
|
+ if (!row.id && !requiredReady) {
|
|
|
+ skipIncomplete++
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ const ok = await handleUpdateProcess(row, { silent: true })
|
|
|
+ if (ok) successCount++
|
|
|
+ else failCount++
|
|
|
+ }
|
|
|
+
|
|
|
+ if (successCount > 0 && failCount === 0 && skipIncomplete === 0) {
|
|
|
+ ElMessage.success(successCount === 1 ? '保存成功' : `已保存 ${successCount} 条工序`)
|
|
|
+ } else if (successCount > 0) {
|
|
|
+ const parts = [`成功 ${successCount} 条`]
|
|
|
+ if (failCount) parts.push(`失败 ${failCount} 条`)
|
|
|
+ if (skipIncomplete) parts.push(`未填齐必填 ${skipIncomplete} 条`)
|
|
|
+ ElMessage.warning(parts.join(','))
|
|
|
+ } else if (skipIncomplete > 0 && failCount === 0) {
|
|
|
+ ElMessage.warning('请先填写部件名称、工序名称、生产工序后再保存')
|
|
|
+ } else {
|
|
|
+ ElMessage.error('保存失败')
|
|
|
+ }
|
|
|
+
|
|
|
+ refreshGyDetailTableFooter()
|
|
|
+ } catch (e) {
|
|
|
+ console.error('工艺资料保存失败', e)
|
|
|
+ ElMessage.error('保存失败')
|
|
|
+ } finally {
|
|
|
+ gyDetailSaving.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleGyDetailPrintPreview = async () => {
|
|
|
+ if (!gyDetailFormData.工艺列表?.length) {
|
|
|
+ ElMessage.warning('暂无工艺数据,无法打印预览')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ gyDetailDialogVisible.value = false
|
|
|
+ await nextTick()
|
|
|
+ showGyDetailPrintMask()
|
|
|
+
|
|
|
+ try {
|
|
|
+ gyDetailPrintIframe = document.createElement('iframe')
|
|
|
+ gyDetailPrintIframe.setAttribute(
|
|
|
+ 'style',
|
|
|
+ 'position:fixed;right:0;bottom:0;width:0;height:0;border:0;visibility:hidden;'
|
|
|
+ )
|
|
|
+ document.body.appendChild(gyDetailPrintIframe)
|
|
|
+
|
|
|
+ const printWin = gyDetailPrintIframe.contentWindow
|
|
|
+ if (!printWin) {
|
|
|
+ throw new Error('print iframe unavailable')
|
|
|
+ }
|
|
|
+
|
|
|
+ const html = `<!DOCTYPE html><html><head><meta charset="utf-8"><title>工艺资料</title>
|
|
|
+ <style>${GY_DETAIL_PRINT_PAGE_STYLE}</style></head><body>${buildGyDetailPrintHtml()}</body></html>`
|
|
|
+
|
|
|
+ const startPrint = () => {
|
|
|
+ printWin.focus()
|
|
|
+ printWin.print()
|
|
|
+ }
|
|
|
+
|
|
|
+ const onAfterPrint = () => cleanupGyDetailPrint(true)
|
|
|
+ printWin.addEventListener('afterprint', onAfterPrint, { once: true })
|
|
|
+
|
|
|
+ if (printWin.matchMedia) {
|
|
|
+ gyDetailPrintMql = printWin.matchMedia('print')
|
|
|
+ if (gyDetailPrintMql.addListener) {
|
|
|
+ gyDetailPrintMql.addListener(gyDetailPrintMqlHandler)
|
|
|
+ } else {
|
|
|
+ gyDetailPrintMql.addEventListener('change', gyDetailPrintMqlHandler)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ printWin.document.open()
|
|
|
+ printWin.document.write(html)
|
|
|
+ printWin.document.close()
|
|
|
+
|
|
|
+ if (printWin.document.readyState === 'complete') {
|
|
|
+ startPrint()
|
|
|
+ } else {
|
|
|
+ gyDetailPrintIframe.onload = startPrint
|
|
|
+ }
|
|
|
+ } catch {
|
|
|
+ cleanupGyDetailPrint(true)
|
|
|
+ ElMessage.error('打印失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const gyDetailPlanManufactureEditing = ref(false)
|
|
|
+ const gyDetailPlanManufactureBackup = ref('')
|
|
|
+ const gyDetailRemarkBackup = ref('')
|
|
|
+ const gyDetailFinishDateBackup = ref('')
|
|
|
+ const gyDetailPlanManufactureSaving = ref(false)
|
|
|
+
|
|
|
+ const onGyDetailPlanManufactureInput = (val) => {
|
|
|
+ let s = String(val ?? '').replace(/[^\d.]/g, '')
|
|
|
+ const dot = s.indexOf('.')
|
|
|
+ if (dot !== -1) {
|
|
|
+ s = s.slice(0, dot + 1) + s.slice(dot + 1).replace(/\./g, '')
|
|
|
+ }
|
|
|
+ gyDetailFormData.计划制造工分 = s
|
|
|
+ }
|
|
|
+
|
|
|
+ const startGyDetailPlanManufactureEdit = () => {
|
|
|
+ if (gyDetailPlanManufactureEditing.value) return
|
|
|
+ // 邢科芳账号不能修改计划制造工分
|
|
|
+ if (gyDetailReadonly.value) {
|
|
|
+ // ElMessage.warning('您没有权限修改计划制造工分')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
|
|
|
+ gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
|
|
|
+ gyDetailPlanManufactureEditing.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ const cancelGyDetailPlanManufactureEdit = () => {
|
|
|
+ gyDetailFormData.计划制造工分 = gyDetailPlanManufactureBackup.value
|
|
|
+ gyDetailFormData.备注 = gyDetailRemarkBackup.value
|
|
|
+ gyDetailPlanManufactureEditing.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ const confirmGyDetailPlanManufactureEdit = async () => {
|
|
|
+ gyDetailPlanManufactureSaving.value = true
|
|
|
+ try {
|
|
|
+ const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
|
|
|
+
|
|
|
+ const updatePromises = []
|
|
|
+
|
|
|
+ if (gyDetailFormData.计划制造工分 !== gyDetailPlanManufactureBackup.value) {
|
|
|
+ updatePromises.push(updateWorkOrderPlanManufacture({
|
|
|
+ id: gyDetailFormData.Uniqid,
|
|
|
+ number: gyDetailFormData.计划制造工分,
|
|
|
+ sys_id: userStore.userInfo.nickName
|
|
|
+ }))
|
|
|
+ }
|
|
|
+
|
|
|
+ if (gyDetailFormData.备注 !== gyDetailRemarkBackup.value || finishDate) {
|
|
|
+ updatePromises.push(updateOrderRemarkAndFinishDate({
|
|
|
+ id: gyDetailFormData.Uniqid,
|
|
|
+ remark: gyDetailFormData.备注,
|
|
|
+ 工单完工日期: finishDate,
|
|
|
+ sys_id: userStore.userInfo.nickName
|
|
|
+ }))
|
|
|
+ }
|
|
|
+
|
|
|
+ if (updatePromises.length === 0) {
|
|
|
+ ElMessage.success('没有修改任何内容')
|
|
|
+ gyDetailPlanManufactureEditing.value = false
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const results = await Promise.all(updatePromises)
|
|
|
+
|
|
|
+ const allSuccess = results.every(res => res?.code === 0)
|
|
|
+
|
|
|
+ if (allSuccess) {
|
|
|
+ ElMessage.success('保存成功')
|
|
|
+ gyDetailPlanManufactureBackup.value = gyDetailFormData.计划制造工分 ?? ''
|
|
|
+ gyDetailRemarkBackup.value = gyDetailFormData.备注 ?? ''
|
|
|
+ gyDetailPlanManufactureEditing.value = false
|
|
|
+ } else {
|
|
|
+ ElMessage.error('保存失败')
|
|
|
+ }
|
|
|
+ } catch (e) {
|
|
|
+ console.error('保存失败', e)
|
|
|
+ ElMessage.error('保存失败')
|
|
|
+ } finally {
|
|
|
+ gyDetailPlanManufactureSaving.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 工单完工日期仅前端选择,不在失焦时调接口(随保存一并提交)
|
|
|
+ const handleGyDetailFinishDateBlur = async () => {}
|
|
|
+
|
|
|
+ const handleGyDetailRemarkBlur = async () => {
|
|
|
+ try {
|
|
|
+ // 格式化日期为 YYYY-MM-DD 格式
|
|
|
+ const finishDate = String(gyDetailFormData.工单完工日期 || '').trim()
|
|
|
+
|
|
|
+ await updateOrderRemarkAndFinishDate({
|
|
|
+ id: gyDetailFormData.Uniqid,
|
|
|
+ remark: gyDetailFormData.备注,
|
|
|
+ 工单完工日期: finishDate,
|
|
|
+ sys_id: userStore.userInfo.nickName
|
|
|
+ })
|
|
|
+ } catch (e) {
|
|
|
+ console.error('更新备注和完工日期失败', e)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const closeGyDetailDialog = () => {
|
|
|
+ clearGyDetailCellEdit()
|
|
|
+ gyDetailPlanManufactureEditing.value = false
|
|
|
+ gyDetailBuJianMingChengFilter.value = []
|
|
|
+ gyDetailDaGongXuFilter.value = []
|
|
|
+ gyDetailNanDuXiShuFilter.value = []
|
|
|
+ gyDetailZhuangTaiFilter.value = []
|
|
|
+ gyDetailDialogVisible.value = false
|
|
|
+ gyDetailSelection.value = []
|
|
|
+ gyDetailDeleting.value = false
|
|
|
+ document.body.classList.remove('el-popup-parent--hidden')
|
|
|
+ document.body.style.overflow = ''
|
|
|
+ }
|
|
|
+
|
|
|
+ // 修改计划制造工分
|
|
|
+ const handleUpdatePlanManufacture = async () => {
|
|
|
+ gyDetailPlanManufactureSaving.value = true
|
|
|
+ try {
|
|
|
+ const result = await updateWorkOrderPlanManufacture({
|
|
|
+ id: gyDetailFormData.Uniqid,
|
|
|
+ number: gyDetailFormData.计划制造工分,
|
|
|
+ sys_id: userStore.userInfo.nickName
|
|
|
+ })
|
|
|
+ if (result.code === 0) {
|
|
|
+ ElMessage.success('修改成功')
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ ElMessage.error(result.msg || '修改失败')
|
|
|
+ return false
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.error('修改失败')
|
|
|
+ return false
|
|
|
+ } finally {
|
|
|
+ gyDetailPlanManufactureSaving.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 拆分弹窗相关
|
|
|
+ const splitDialogVisible = ref(false)
|
|
|
+ const splitQuantity = ref(1)
|
|
|
+ const currentSplitRow = ref(null)
|
|
|
+ const hasReportData = ref(false)
|
|
|
+ const splitSubmitting = ref(false)
|
|
|
+
|
|
|
+ const submitProcessSplit = async (row, number) => {
|
|
|
+ if (!row?.id) {
|
|
|
+ ElMessage.warning('工序数据无效,无法操作')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ splitSubmitting.value = true
|
|
|
+ try {
|
|
|
+ const result = await confirmProcessSplit({
|
|
|
+ id: row.id,
|
|
|
+ number,
|
|
|
+ sys_id: userStore.userInfo.nickName,
|
|
|
+ })
|
|
|
+ if (result.code === 0) {
|
|
|
+ ElMessage.success(number === 0 ? '撤销拆分成功' : '拆分成功')
|
|
|
+ await refreshGyDetailProcessList()
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ ElMessage.error(result.msg || (number === 0 ? '撤销拆分失败' : '拆分失败'))
|
|
|
+ return false
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.error(number === 0 ? '撤销拆分失败' : '拆分失败')
|
|
|
+ return false
|
|
|
+ } finally {
|
|
|
+ splitSubmitting.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 处理拆分工艺
|
|
|
+ const handleSplitProcess = async (row) => {
|
|
|
+ if (isGyDetailRowSplit(row)) return
|
|
|
+ currentSplitRow.value = row
|
|
|
+ splitQuantity.value = 1
|
|
|
+
|
|
|
+ try {
|
|
|
+ const result = await checkProcessReport({
|
|
|
+ workorder: gyDetailFormData.订单编号,
|
|
|
+ process_code: row.工序编号,
|
|
|
+ })
|
|
|
+
|
|
|
+ if (result.code === 0) {
|
|
|
+ hasReportData.value = false
|
|
|
+ } else if (result.code === 1) {
|
|
|
+ hasReportData.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ splitDialogVisible.value = true
|
|
|
+ } catch (error) {
|
|
|
+ ElMessage.error('检查工序报工状态失败')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const buildGySplitProcessLabel = (row) =>
|
|
|
+ `${row?.工序编号 || ''}-${row?.工序名称 || ''}`
|
|
|
+
|
|
|
+ const buildUndoSplitConfirmMessage = (row) => {
|
|
|
+ const label = escapeGyPrintHtml(buildGySplitProcessLabel(row))
|
|
|
+ return `确定撤销工序 <span class="gy-split-process-name" style="color:#f56c6c;font-weight:600;">${label}</span> 的拆分吗?`
|
|
|
+ }
|
|
|
+
|
|
|
+ // 撤销拆分
|
|
|
+ const handleUndoSplitProcess = async (row) => {
|
|
|
+ if (!isGyDetailRowSplit(row)) return
|
|
|
+ try {
|
|
|
+ await ElMessageBox.confirm(buildUndoSplitConfirmMessage(row), '撤销拆分', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ dangerouslyUseHTMLString: true,
|
|
|
+ appendTo: document.body,
|
|
|
+ })
|
|
|
+ } catch {
|
|
|
+ return
|
|
|
+ }
|
|
|
+ await submitProcessSplit(row, 0)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 确认拆分
|
|
|
+ const confirmSplitProcess = async () => {
|
|
|
+ const qty = Number(splitQuantity.value)
|
|
|
+ if (!Number.isFinite(qty) || qty < 1 || !Number.isInteger(qty)) {
|
|
|
+ ElMessage.warning('拆分数量必须为大于等于 1 的整数,不能为 0')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const ok = await submitProcessSplit(currentSplitRow.value, qty)
|
|
|
+ if (ok) {
|
|
|
+ splitDialogVisible.value = false
|
|
|
+ currentSplitRow.value = null
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 修改工艺(未改动不请求接口)
|
|
|
+ // 新行填齐必填项后会先新增;再改工分等字段应走修改。若新增成功但未带回 id,或再次新增报工序编号已存在,则绑定 id 后改为 UpdateProcess。
|
|
|
+ const resolveGyDetailProcessId = (payload) => {
|
|
|
+ if (payload == null || payload === '') return ''
|
|
|
+ if (typeof payload === 'number' || typeof payload === 'string') return payload
|
|
|
+ return payload.id ?? payload.ID ?? payload.Id ?? ''
|
|
|
+ }
|
|
|
+
|
|
|
+ const isGyProcessCodeExistsError = (res) => {
|
|
|
+ const msg = String(res?.msg || res?.message || '')
|
|
|
+ return /工序编号/.test(msg) && /(已存在|已经有|重复)/.test(msg)
|
|
|
+ }
|
|
|
+
|
|
|
+ const bindGyDetailRowIdByProcessCode = async (row) => {
|
|
|
+ const orderNo = String(gyDetailFormData.订单编号 || '').trim()
|
|
|
+ const code = String(row?.工序编号 ?? '').trim()
|
|
|
+ if (!orderNo || !code) return false
|
|
|
+ try {
|
|
|
+ const processRes = await getWorkOrderProcess({ workorder: orderNo })
|
|
|
+ if (processRes?.code !== 0 || !Array.isArray(processRes.data)) return false
|
|
|
+ const found = processRes.data.find(
|
|
|
+ (item) => String(item.工序编号 ?? item.process_code ?? '').trim() === code
|
|
|
+ )
|
|
|
+ const id = resolveGyDetailProcessId(found)
|
|
|
+ if (!id) return false
|
|
|
+ row.id = id
|
|
|
+ row._gyDetailNew = false
|
|
|
+ return true
|
|
|
+ } catch {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 按部件名称补齐部件编号:同名复用已有编号,否则取当前列表最大编号+1。
|
|
|
+ * 提交 Add/Update 前必须调用,避免后端报「部件编号不能为空」。
|
|
|
+ */
|
|
|
+ const ensureGyDetailPartCode = (row) => {
|
|
|
+ if (!row) return ''
|
|
|
+ const partName = String(row.部件名称 || '').trim()
|
|
|
+ if (!partName) {
|
|
|
+ row.部件编号 = ''
|
|
|
+ return ''
|
|
|
+ }
|
|
|
+ const currentCode = String(row.部件编号 || '').trim()
|
|
|
+ if (currentCode) return currentCode
|
|
|
+
|
|
|
+ const existingRow = (gyDetailFormData.工艺列表 || []).find(
|
|
|
+ (r) => r !== row && String(r.部件名称 || '').trim() === partName && String(r.部件编号 || '').trim()
|
|
|
+ )
|
|
|
+ if (existingRow) {
|
|
|
+ row.部件编号 = String(existingRow.部件编号).trim()
|
|
|
+ return row.部件编号
|
|
|
+ }
|
|
|
+
|
|
|
+ let maxCode = 0
|
|
|
+ ;(gyDetailFormData.工艺列表 || []).forEach((r) => {
|
|
|
+ const code = parseInt(String(r.部件编号 || ''), 10)
|
|
|
+ if (!isNaN(code) && code > maxCode) {
|
|
|
+ maxCode = code
|
|
|
+ }
|
|
|
+ })
|
|
|
+ row.部件编号 = String(maxCode + 1).padStart(2, '0')
|
|
|
+ return row.部件编号
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleUpdateProcess = async (row, options = {}) => {
|
|
|
+ const silent = !!options.silent
|
|
|
+ const orderNo = String(gyDetailFormData.订单编号 || '').trim()
|
|
|
+ if (!orderNo) return false
|
|
|
+ if (!isGyDetailRowChanged(row)) return false
|
|
|
+
|
|
|
+ if (row._gyDetailSaving) {
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ const buJianMingCheng = String(row.部件名称 || '').trim()
|
|
|
+ const gongXuMingCheng = String(row.工序名称 || '').trim()
|
|
|
+ const daGongXu = String(row.大工序 || '').trim()
|
|
|
+ const requiredReady = !!(buJianMingCheng && gongXuMingCheng && daGongXu)
|
|
|
+
|
|
|
+ // 有部件名称时提交前补齐部件编号,避免偶发「部件编号不能为空」
|
|
|
+ if (buJianMingCheng) {
|
|
|
+ ensureGyDetailPartCode(row)
|
|
|
+ }
|
|
|
+
|
|
|
+ const runUpdate = async () => {
|
|
|
+ const partCode = ensureGyDetailPartCode(row) || String(row.部件编号 || '').trim()
|
|
|
+ if (buJianMingCheng && !partCode) {
|
|
|
+ if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ const result = await UpdateProcess({
|
|
|
+ id: row.id,
|
|
|
+ process_name: row.工序名称 || '',
|
|
|
+ big_process: row.大工序 || '',
|
|
|
+ standard_hour: row.秒 || '',
|
|
|
+ standard_minutes: row.分 || '',
|
|
|
+ standard_score: row.定额分 || '',
|
|
|
+ money: row.金额 || '',
|
|
|
+ coefficient: row.难度系数 || '',
|
|
|
+ remark: row.备注 || '',
|
|
|
+ mod_id: userStore.userInfo.nickName,
|
|
|
+ part_code: partCode,
|
|
|
+ part_name: row.部件名称 || '',
|
|
|
+ process_code: row.工序编号 || '',
|
|
|
+ })
|
|
|
+ if (result.code === 0) {
|
|
|
+ row._gyDetailNew = false
|
|
|
+ row._gyDetailOrigin = snapshotGyDetailRow(row)
|
|
|
+ if (!silent) ElMessage.success('修改成功')
|
|
|
+ return true
|
|
|
+ }
|
|
|
+ if (!silent) ElMessage.error(result.msg || '修改失败')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ try {
|
|
|
+ // 已有 id:一律修改
|
|
|
+ if (row.id) {
|
|
|
+ row._gyDetailSaving = true
|
|
|
+ row._gyDetailNew = false
|
|
|
+ return await runUpdate()
|
|
|
+ }
|
|
|
+
|
|
|
+ // 无 id:需三个必填齐全才能新增
|
|
|
+ if (!requiredReady) {
|
|
|
+ if (!silent && (gyDetailLastEditingField.value === '工序名称' || gyDetailLastEditingField.value === '部件名称')) {
|
|
|
+ ElMessage.warning('部件名称、工序名称、生产工序三个字段都必须填写')
|
|
|
+ }
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ const partCode = ensureGyDetailPartCode(row)
|
|
|
+ if (!partCode) {
|
|
|
+ if (!silent) ElMessage.warning('部件编号不能为空,请重新填写部件名称')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+
|
|
|
+ row._gyDetailSaving = true
|
|
|
+
|
|
|
+ const addRes = await AddProcess({
|
|
|
+ workorder: orderNo,
|
|
|
+ part_code: partCode,
|
|
|
+ part_name: row.部件名称 || '',
|
|
|
+ process_name: row.工序名称 || '',
|
|
|
+ process_code: String(row.工序编号 ?? ''),
|
|
|
+ big_process: row.大工序 || '',
|
|
|
+ standard_hour: row.秒 || '',
|
|
|
+ standard_minutes: row.分 || '',
|
|
|
+ standard_score: row.定额分 || '',
|
|
|
+ money: row.金额 || '',
|
|
|
+ coefficient: row.难度系数 || '',
|
|
|
+ remark: row.备注 || '',
|
|
|
+ sys_id: userStore.userInfo?.nickName || '',
|
|
|
+ })
|
|
|
+
|
|
|
+ if (addRes?.code === 0) {
|
|
|
+ row._gyDetailNew = false
|
|
|
+ row.id = resolveGyDetailProcessId(addRes.data)
|
|
|
+ if (!row.id) {
|
|
|
+ await bindGyDetailRowIdByProcessCode(row)
|
|
|
+ }
|
|
|
+ row._gyDetailOrigin = snapshotGyDetailRow(row)
|
|
|
+ if (!silent) ElMessage.success('保存成功')
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ // 工序已在库中(例如必填项保存时已新增):改为修改
|
|
|
+ if (isGyProcessCodeExistsError(addRes)) {
|
|
|
+ const bound = await bindGyDetailRowIdByProcessCode(row)
|
|
|
+ if (bound && row.id) {
|
|
|
+ return await runUpdate()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (!silent) ElMessage.error(addRes?.msg || '保存失败')
|
|
|
+ return false
|
|
|
+ } catch {
|
|
|
+ return false
|
|
|
+ } finally {
|
|
|
+ row._gyDetailSaving = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // =========== 订单打印 ===========
|
|
|
+ //弹窗
|
|
|
+ const order_viewVisible = ref(false)
|
|
|
+ // 默认选择竖向
|
|
|
+ const printDirection = ref('纵向')
|
|
|
+ const cp_gdprintonClick = () => {
|
|
|
+ order_viewVisible.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ //确定打印
|
|
|
+ const confirmPrintDirection = () => {
|
|
|
+
|
|
|
+ console.log(_Gd_gdbh.value)
|
|
|
+ console.log(printDirection.value)
|
|
|
+
|
|
|
+ if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
+ ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
|
|
|
+ return false;
|
|
|
+ }else{
|
|
|
+ if(ystableData.length >=1){
|
|
|
+ printPageRef.value.open(_Gd_gdbh.value,printDirection.value)
|
|
|
+ }else{
|
|
|
+ ElMessage({type: 'warning',message: '请新增颜色资料,再操作此功能'})
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const order_viewCloseDialog = () => {
|
|
|
+ order_viewVisible.value = false
|
|
|
+ }
|
|
|
+
|
|
|
+ // =========== BOM资料 ===========
|
|
|
+ const res_bomdialogFormVisible = ref(false)
|
|
|
+ const resbomtableData = ref([]);
|
|
|
+ const ddhformData = reactive({
|
|
|
+ ddh: '',
|
|
|
+ kh: '',
|
|
|
+ sckh: '',
|
|
|
+ ks: '',
|
|
|
+ ml: '',
|
|
|
+ });
|
|
|
+ const getTodayYmd = () => {
|
|
|
+ const t = new Date()
|
|
|
+ return `${t.getFullYear()}-${String(t.getMonth() + 1).padStart(2, '0')}-${String(t.getDate()).padStart(2, '0')}`
|
|
|
+ }
|
|
|
+ const fillDefaultPlanRuku = (rows) => {
|
|
|
+ if (!Array.isArray(rows)) return
|
|
|
+ rows.forEach((row) => {
|
|
|
+ const v = row['计划入库时间']
|
|
|
+ if (v === undefined || v === null || String(v).trim() === '') {
|
|
|
+ row['计划入库时间'] = getTodayYmd()
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const resbom_tableColumns = ref(
|
|
|
+ [
|
|
|
+ { label: '物料分类', prop: '物料分类', width: '130' },
|
|
|
+ { label: '物料名称', prop: '物料名称', width: '300' },
|
|
|
+ { label: '计划入库时间', prop: '计划入库时间', width: '160' },
|
|
|
+ { label: '计划用料', prop: '计划用料', width: '130' },
|
|
|
+ { label: '计划门幅', prop: '计划门幅', width: '130' },
|
|
|
+ { label: '定额用料', prop: '定额用料', width: '130' },
|
|
|
+ { label: '定额门幅', prop: '定额门幅', width: '130' },
|
|
|
+ { label: '备注', prop: '备注', width: '240' },
|
|
|
+ ]
|
|
|
+ )
|
|
|
+ //批量修改BOM资料
|
|
|
+ const BOMclick = () => {
|
|
|
+ if(bomtableData.value === ''){
|
|
|
+ ElMessage({type: 'warning',message: 'BOM数据为空'})
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
+ ElMessage({type: 'warning',message: '请选择订单后,再操作此功能'})
|
|
|
+ return;
|
|
|
+ }else{
|
|
|
+ res_bomdialogFormVisible.value = true
|
|
|
+ ddhformData.ddh = _Gd_gdbh.value
|
|
|
+ ddhformData.kh = _Gd_kh.value
|
|
|
+ ddhformData.sckh = _Gd_sckh.value
|
|
|
+ ddhformData.ks = _Gd_ks.value
|
|
|
+ ddhformData.ml = _Gd_ML.value
|
|
|
+ _TestCoefficient();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleInput = (value, row, prop) => {
|
|
|
+ if(prop != "物料名称" && prop != "备注" && prop != "物料分类" && prop != "计划入库时间" ){
|
|
|
+ // 使用正则表达式过滤非数字和小数点的字符
|
|
|
+ let filteredValue = value.replace(/[^\d.]/g, '');
|
|
|
+
|
|
|
+ // 不允许以 . 开头
|
|
|
+ if (filteredValue.startsWith('.')) {
|
|
|
+ filteredValue = filteredValue.slice(1); // 去掉开头的 .
|
|
|
+ }
|
|
|
+
|
|
|
+ // 确保只有一个小数点
|
|
|
+ const parts = filteredValue.split('.');
|
|
|
+ if (parts.length > 2) {
|
|
|
+ // 如果超过一个小数点,只保留第一个
|
|
|
+ row[prop] = `${parts[0]}.${parts.slice(1).join('')}`;
|
|
|
+ } else {
|
|
|
+ // 否则直接赋值
|
|
|
+ row[prop] = filteredValue;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ //bom数据获取
|
|
|
+ const _TestCoefficient = async ()=>{
|
|
|
+ try {
|
|
|
+ const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
+ console.log(orderBomListdata)
|
|
|
+ resbomtableData.value = orderBomListdata.data;
|
|
|
+ const formattedData = orderBomListdata.data.map(item=>{
|
|
|
+ item.BOM_desc = item.BOM_desc;
|
|
|
+ item.物料名称 = item.物料名称;
|
|
|
+ item.计划用料 = item.计划用料;
|
|
|
+ item.定额用料 = item.定额用料;
|
|
|
+ item.裁床实际用料 = item.裁床实际用料;
|
|
|
+ item.裁床领用面料 = item.裁床领用面料;
|
|
|
+ item.裁床退回仓库面料 = item.裁床退回仓库面料;
|
|
|
+ item.备注 = item.备注;
|
|
|
+ item.投料单位 = "米";
|
|
|
+ // item.UNIQID = item.UNIQID;
|
|
|
+ return item
|
|
|
+ });
|
|
|
+ fillDefaultPlanRuku(resbomtableData.value)
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const resbom_handleKeyDown = (event, x, y, prop) => {
|
|
|
+ const currentElement = document.getElementById(`input${x}${y}`);
|
|
|
+ if (currentElement === null && currentElement === undefined) return
|
|
|
+ let move = 0
|
|
|
+ switch (event.keyCode) {
|
|
|
+ case 13: // Enter
|
|
|
+ case 40: // 向下箭头
|
|
|
+ if (y < resbomtableData.value.length )
|
|
|
+ document.getElementById(`input${x}${y + 1}`).focus();
|
|
|
+ break;
|
|
|
+ case 38: // 向上箭头
|
|
|
+ if ( y > 0) {
|
|
|
+ document.getElementById(`input${x}${y - 1}`).focus();
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case 39: // 向左箭头
|
|
|
+ if (x >= 0 && x <=6) {
|
|
|
+ move = x + 1
|
|
|
+ }
|
|
|
+ document.getElementById(`input${move}${y}`).focus();
|
|
|
+ break;
|
|
|
+ case 37: // 向右箭头
|
|
|
+ if (x = 0 && x <=6) {
|
|
|
+ move = x - 1
|
|
|
+ }
|
|
|
+ document.getElementById(`input${move}${y}`).focus();
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const scfjfpxsCellClass = ({row, column, rowIndex, columnIndex}) =>{
|
|
|
+ if (
|
|
|
+ column.label === '物料分类' ||
|
|
|
+ column.label === '计划门幅' ||
|
|
|
+ column.label === '定额门幅' ||
|
|
|
+ column.label === '计划用料' ||
|
|
|
+ column.label === '备注' ||
|
|
|
+ column.label === '物料名称' ||
|
|
|
+ column.label === '计划用量' ||
|
|
|
+ column.label === '定额用料' ||
|
|
|
+ column.label === '计划入库时间' ) {
|
|
|
+ return 'background-plan-usage-low';
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //新增
|
|
|
+ const add_bomenterDialog = async() => {
|
|
|
+ // 创建一行空数据,字段值可以根据需求初始化
|
|
|
+ const newRow = {
|
|
|
+ 'BOM_desc': '',
|
|
|
+ '物料名称': '',
|
|
|
+ '计划入库时间': getTodayYmd(),
|
|
|
+ '计划用料': '',
|
|
|
+ '定额用料': '',
|
|
|
+ '裁床实际用料': '',
|
|
|
+ '裁床领用面料': '',
|
|
|
+ '裁床退回仓库面料': '',
|
|
|
+ '备注': '',
|
|
|
+ '投料单位': '米',
|
|
|
+ 'UNIQID':''
|
|
|
+ };
|
|
|
+ if (!resbomtableData.value || !Array.isArray(resbomtableData.value)) {
|
|
|
+ resbomtableData.value = []; // 重新初始化
|
|
|
+ }
|
|
|
+ // 将新增的行数据推入到表格数据中
|
|
|
+ resbomtableData.value.push(newRow);
|
|
|
+ }
|
|
|
+
|
|
|
+ // BOM删除
|
|
|
+ const record_deleteRow = async (row, index) => {
|
|
|
+ console.log(row.UNIQID);
|
|
|
+
|
|
|
+ // 使用 ElMessageBox 提示确认删除
|
|
|
+ ElMessageBox.confirm('确定删除此行数据吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning'
|
|
|
+ }).then(async () => {
|
|
|
+ // 确认删除,检查UNIQID是否为空
|
|
|
+ if (row.UNIQID === '' || row.UNIQID === null || row.UNIQID === undefined) {
|
|
|
+ // 删除当前行数据
|
|
|
+ resbomtableData.value.splice(index, 1);
|
|
|
+ ElMessage({
|
|
|
+ type: 'success',
|
|
|
+ message: '删除成功'
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ // 调用接口删除
|
|
|
+ const Bomdel_del = await Bomdel({ UNIQID: row.UNIQID });
|
|
|
+ console.log(Bomdel_del)
|
|
|
+ if (Bomdel_del.code === 0) {
|
|
|
+ ElMessage({
|
|
|
+ type: 'success',
|
|
|
+ message: '删除成功'
|
|
|
+ });
|
|
|
+ } else {
|
|
|
+ const msg = Bomdel_del.msg || '';
|
|
|
+ console.log('msg:', msg);
|
|
|
+
|
|
|
+ // 初始化标题和内容
|
|
|
+ let title = '提示';
|
|
|
+ let content = msg;
|
|
|
+
|
|
|
+ // 截取中文句号(。)分割
|
|
|
+ const splitIndex = msg.indexOf('。');
|
|
|
+ if (splitIndex !== -1) {
|
|
|
+ title = msg.substring(0, splitIndex + 1); // 截取第一个句号前的作为标题(含句号)
|
|
|
+ content = msg.substring(splitIndex + 1); // 后面的作为内容
|
|
|
+ }
|
|
|
+
|
|
|
+ // 弹窗提示(注意参数顺序)
|
|
|
+ ElMessageBox.confirm(
|
|
|
+ `<p style="font-size:14px;">${content}</p>`, // 内容
|
|
|
+ title, // 标题
|
|
|
+ {
|
|
|
+ type: 'warning',
|
|
|
+ dangerouslyUseHTMLString: true
|
|
|
+ }
|
|
|
+ );
|
|
|
+
|
|
|
+ }
|
|
|
+ // 重新获取BOM列表数据
|
|
|
+ const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
+ //BOM资料列表
|
|
|
+ bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
|
|
|
+ //批量新增/更新BOM数据列表
|
|
|
+ resbomtableData.value = orderBomListdata.data;
|
|
|
+ fillDefaultPlanRuku(resbomtableData.value)
|
|
|
+ }
|
|
|
+ }).catch(() => {
|
|
|
+ // 取消删除
|
|
|
+ // ElMessage({
|
|
|
+ // type: 'info',
|
|
|
+ // message: '已取消删除'
|
|
|
+ // });
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ //修改
|
|
|
+ const res_bomenterDialog = async () => {
|
|
|
+ const rawValueArray = resbomtableData._rawValue;
|
|
|
+ const formattedData = rawValueArray
|
|
|
+ .filter(item => item.物料名称 !== null && item.物料名称 !== "") // 过滤掉物料名称为空的行
|
|
|
+ .map(item => {
|
|
|
+ return {
|
|
|
+ BOM_工单编号: ddhformData['ddh'],
|
|
|
+ UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
|
|
|
+ 物料分类: item.物料分类 !== null ? item.物料分类 : "",
|
|
|
+ BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
|
|
|
+ BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
|
|
|
+ BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
|
|
|
+ BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
|
|
|
+ Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
|
|
|
+ BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
|
|
|
+ BOM_desc: item.备注 !== null ? item.备注 : "",
|
|
|
+ BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
|
|
|
+ BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
|
|
|
+ BOM_投料单位: "",
|
|
|
+ Sys_ID: userStore.userInfo.nickName,
|
|
|
+ Sys_rq: currentDate,
|
|
|
+ 计划入库时间: item['计划入库时间'] != null && String(item['计划入库时间']).trim() !== ''
|
|
|
+ ? String(item['计划入库时间']).trim()
|
|
|
+ : getTodayYmd(),
|
|
|
+ 计划入库操作人:userStore.userInfo.nickName,
|
|
|
+ }
|
|
|
+ });
|
|
|
+ console.log(formattedData);
|
|
|
+ const add_FabricEditdata = await FabricEdit(formattedData);
|
|
|
+ if (add_FabricEditdata.code === 0) {
|
|
|
+ res_bomdialogFormVisible.value = false;
|
|
|
+ ElMessage({type: 'success',message: '修改成功'})
|
|
|
+ const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
+ bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
|
|
|
+ } else {
|
|
|
+ ElMessage({ type: 'error',message: '修改失败'})
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ // 取消
|
|
|
+ const
|
|
|
+ res_bomcloseDialog = () => {
|
|
|
+ res_bomdialogFormVisible.value = false;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ //BOM资料表格双击
|
|
|
+ const edit_bomdialogFormVisible = ref(false)
|
|
|
+ const edit_resbomtableData = ref([]);
|
|
|
+ const edit_resbom_tableColumns = ref(
|
|
|
+ [
|
|
|
+ { label: '物料名称', prop: '物料名称', width: '170' },
|
|
|
+ { label: '计划用料', prop: '计划用料', width: '130' },
|
|
|
+ { label: '定额用料', prop: '定额用料', width: '130' },
|
|
|
+ { label: '计划门幅', prop: '计划门幅', width: '170' },
|
|
|
+ { label: '定额门幅', prop: '定额门幅', width: '170' },
|
|
|
+ // { label: '裁床实际用料', prop: '裁床实际用料', width: '130' },
|
|
|
+ // { label: '裁床领用面料', prop: '裁床领用面料', width: '130' },
|
|
|
+ // { label: '裁床退回仓库面料', prop: '裁床退回仓库面料', width: '170' },
|
|
|
+ { label: '备注', prop: '备注', width: '170' },
|
|
|
+ { label: '投料单位', prop: '投料单位', width: '100' },
|
|
|
+ ]
|
|
|
+ )
|
|
|
+
|
|
|
+ const UNIQID = ref('')
|
|
|
+ const bombomupdateCompanyFunc = async (row) => {
|
|
|
+ BOMclick()
|
|
|
+ // edit_bomdialogFormVisible.value = true
|
|
|
+ // ddhformData.ddh = _Gd_gdbh.value
|
|
|
+ // ddhformData.kh = _Gd_kh.value
|
|
|
+ // ddhformData.sckh = _Gd_sckh.value
|
|
|
+ // ddhformData.ks = _Gd_ks.value
|
|
|
+ // UNIQID.value = row.UNIQID
|
|
|
+ // _editTestCoefficient()
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // BOM数据获取
|
|
|
+ const _editTestCoefficient = async () => {
|
|
|
+ try {
|
|
|
+ // 获取 BOM 数据
|
|
|
+ const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
+ console.log(orderBomListdata);
|
|
|
+
|
|
|
+ // 过滤数据,只保留 UNIQID 相同的项
|
|
|
+ const filteredData = orderBomListdata.data.filter(item => item.UNIQID === UNIQID.value);
|
|
|
+
|
|
|
+ // 处理数据
|
|
|
+ edit_resbomtableData.value = filteredData.map(item => ({
|
|
|
+ 物料名称: item.物料名称,
|
|
|
+ 计划用料: item.计划用料,
|
|
|
+ 定额用料: item.定额用料,
|
|
|
+ 裁床实际用料: item.裁床实际用料,
|
|
|
+ 裁床领用面料: item.裁床领用面料,
|
|
|
+ 裁床退回仓库面料: item.裁床退回仓库面料,
|
|
|
+ 备注: item.备注,
|
|
|
+ 计划门幅: item.计划门幅,
|
|
|
+ 定额门幅: item.定额门幅,
|
|
|
+ UNIQID: item.UNIQID // 保留 UNIQID 以便后续使用
|
|
|
+ }));
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ //一键修改
|
|
|
+ const editres_bomenterDialog = async () => {
|
|
|
+ const rawValueArray = edit_resbomtableData._rawValue;
|
|
|
+ const formattedData = rawValueArray
|
|
|
+ .filter(item => item.物料名称 !== null && item.物料名称 !== "") // 过滤掉物料名称为空的行
|
|
|
+ .map(item => {
|
|
|
+ return {
|
|
|
+ BOM_工单编号: ddhformData['ddh'],
|
|
|
+ UNIQID: item.UNIQID !== undefined ? item.UNIQID : "",
|
|
|
+ BOM_物料名称: item.物料名称 !== null ? item.物料名称 : "",
|
|
|
+ BOM_计划用量: item.计划用料 !== null ? item.计划用料 : "",
|
|
|
+ BOM_标准用量: item.定额用料 !== null ? item.定额用料 : "",
|
|
|
+ BOM_实际用量: item.裁床实际用料 !== null ? item.裁床实际用料 : "",
|
|
|
+ Bom_领用数量: item.裁床领用面料 !== null ? item.裁床领用面料 : "",
|
|
|
+ BOM_退还数量: item.裁床退回仓库面料 !== null ? item.裁床退回仓库面料 : "",
|
|
|
+ BOM_desc: item.备注 !== null ? item.备注 : "",
|
|
|
+ BOM_计划门幅: item.计划门幅 !== null ? item.计划门幅 : "",
|
|
|
+ BOM_定额门幅: item.定额门幅 !== null ? item.定额门幅 : "",
|
|
|
+ BOM_投料单位: "米",
|
|
|
+ Sys_ID: userStore.userInfo.nickName,
|
|
|
+ Sys_rq: currentDate
|
|
|
+ }
|
|
|
+ });
|
|
|
+ console.log(formattedData);
|
|
|
+
|
|
|
+ const add_FabricEditdata = await FabricEdit(formattedData);
|
|
|
+ if (add_FabricEditdata.code === 0) {
|
|
|
+ edit_bomdialogFormVisible.value = false;
|
|
|
+ ElMessage({type: 'success',message: '修改成功'})
|
|
|
+ const orderBomListdata = await orderBomList({order:_Gd_gdbh.value});
|
|
|
+ bomtableData.splice(0,orderBomListdata.data.length,...orderBomListdata.data);//bom表格数据
|
|
|
+ } else {
|
|
|
+ ElMessage({ type: 'error',message: '修改失败'})
|
|
|
+ }
|
|
|
+ }
|
|
|
+ // 取消
|
|
|
+ const editres_bomcloseDialog = () => {
|
|
|
+ edit_bomdialogFormVisible.value = false;
|
|
|
+ }
|
|
|
+ //点击表格行获取下方表格数据列表
|
|
|
+ // =========== 颜色资料、工艺资料、技术资料附件 ===========
|
|
|
+ //全局调用订单号编号
|
|
|
+ const _Gd_gdbh = ref('')
|
|
|
+ const _ddhval = ref('')
|
|
|
+ const _Gd_kh = ref('')
|
|
|
+ const _Gd_sckh = ref('')
|
|
|
+ const _Gd_ks = ref('')
|
|
|
+ const _Gd_ML = ref('')
|
|
|
+ //颜色资料
|
|
|
+ const ystableData = reactive([])
|
|
|
+ //尺寸列表
|
|
|
+ const sizeDatas = reactive([])
|
|
|
+ //部件资料
|
|
|
+ const parttableData = reactive([])
|
|
|
+ //工艺资料
|
|
|
+ const gytableData = reactive([])
|
|
|
+ //订单资料表
|
|
|
+ const ddtableData = reactive([])
|
|
|
+ //技术附件
|
|
|
+ const jstableData = reactive([])
|
|
|
+
|
|
|
+ const fhdtableData = reactive([])
|
|
|
+ //BOM附件
|
|
|
+ const bomtableData = reactive([])
|
|
|
+ //面料附件
|
|
|
+ const mltableData = reactive([])
|
|
|
+
|
|
|
+ // 工序产量核查
|
|
|
+ const processProductionVisible = ref(false)
|
|
|
+ const processProductionWorkorder = ref('')
|
|
|
+ const processProductionDialogKey = ref(0)
|
|
|
+ const processProductionChecking = ref(false)
|
|
|
+ const openProcessProductionDialog = async () => {
|
|
|
+ if (!_Gd_gdbh.value) {
|
|
|
+ ElMessage.warning('请先在表格中点击选择订单')
|
|
|
+ return
|
|
|
+ }
|
|
|
+ processProductionChecking.value = true
|
|
|
+ try {
|
|
|
+ const result = await ensureProcessProductionData(_Gd_gdbh.value)
|
|
|
+ if (!result.ok) return
|
|
|
+ processProductionWorkorder.value = result.workorder
|
|
|
+ processProductionDialogKey.value += 1
|
|
|
+ processProductionVisible.value = true
|
|
|
+ } finally {
|
|
|
+ processProductionChecking.value = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 导入工艺资料相关变量
|
|
|
+ const importProcessDialogVisible = ref(false)
|
|
|
+ const importProcessForm = reactive({
|
|
|
+ workorderNo: '',
|
|
|
+ styleNo: ''
|
|
|
+ })
|
|
|
+ const importProcessFileList = reactive([])
|
|
|
+ const importProcessUploadRef = ref(null)
|
|
|
+ let importProcessFile = null
|
|
|
+
|
|
|
+ // 导入冲突对照弹窗(error_type === import_append_only)
|
|
|
+ const importConflictDialogVisible = ref(false)
|
|
|
+ const importConflictTitle = ref('导入失败')
|
|
|
+ const importConflictOldList = ref([])
|
|
|
+ const importConflictNewList = ref([])
|
|
|
+ const importConflictMeta = reactive({
|
|
|
+ conflict_count: null,
|
|
|
+ suggest_min_new_code: null,
|
|
|
+ })
|
|
|
+
|
|
|
+ const mapImportCompareRow = (item = {}) => ({
|
|
|
+ process_code: item.process_code ?? item.序号 ?? '',
|
|
|
+ process_name: item.process_name ?? item.工序名称 ?? '',
|
|
|
+ part_name: item.part_name ?? item.部件名称 ?? '',
|
|
|
+ diff: item.diff === true || item.diff === 1 || item.diff === 'true',
|
|
|
+ })
|
|
|
+
|
|
|
+ const alignImportCompareLists = (oldList, newList) => {
|
|
|
+ const oldArr = (Array.isArray(oldList) ? oldList : []).map(mapImportCompareRow)
|
|
|
+ const newArr = (Array.isArray(newList) ? newList : []).map(mapImportCompareRow)
|
|
|
+ if (!oldArr.length && !newArr.length) {
|
|
|
+ return { oldAligned: [], newAligned: [] }
|
|
|
+ }
|
|
|
+ // 两边序号集合一致时,按返回顺序展示;否则按序号对齐
|
|
|
+ const sameLen = oldArr.length === newArr.length
|
|
|
+ const sameCodes = sameLen && oldArr.every((row, i) => String(row.process_code) === String(newArr[i]?.process_code))
|
|
|
+ if (sameCodes) {
|
|
|
+ return { oldAligned: oldArr, newAligned: newArr }
|
|
|
+ }
|
|
|
+ const oldMap = new Map(oldArr.map((row) => [String(row.process_code), row]))
|
|
|
+ const newMap = new Map(newArr.map((row) => [String(row.process_code), row]))
|
|
|
+ const codes = [...new Set([...oldMap.keys(), ...newMap.keys()])]
|
|
|
+ codes.sort((a, b) => {
|
|
|
+ const na = Number(a)
|
|
|
+ const nb = Number(b)
|
|
|
+ if (Number.isFinite(na) && Number.isFinite(nb)) return na - nb
|
|
|
+ return String(a).localeCompare(String(b))
|
|
|
+ })
|
|
|
+ const emptyRow = (code) => ({
|
|
|
+ process_code: code,
|
|
|
+ process_name: '',
|
|
|
+ part_name: '',
|
|
|
+ diff: false,
|
|
|
+ })
|
|
|
+ return {
|
|
|
+ oldAligned: codes.map((code) => oldMap.get(code) || emptyRow(code)),
|
|
|
+ newAligned: codes.map((code) => newMap.get(code) || emptyRow(code)),
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const buildCompareListsFromConflicts = (conflicts = []) => {
|
|
|
+ const oldAligned = []
|
|
|
+ const newAligned = []
|
|
|
+ conflicts.forEach((item) => {
|
|
|
+ const code = item?.process_code ?? item?.序号 ?? ''
|
|
|
+ oldAligned.push({
|
|
|
+ process_code: code,
|
|
|
+ process_name: item?.old_value ?? item?.原值 ?? '',
|
|
|
+ part_name: item?.part_name ?? item?.部件名称 ?? '',
|
|
|
+ diff: true,
|
|
|
+ })
|
|
|
+ newAligned.push({
|
|
|
+ process_code: code,
|
|
|
+ process_name: item?.new_value ?? item?.新值 ?? '',
|
|
|
+ part_name: item?.part_name ?? item?.部件名称 ?? '',
|
|
|
+ diff: true,
|
|
|
+ })
|
|
|
+ })
|
|
|
+ return { oldAligned, newAligned }
|
|
|
+ }
|
|
|
+
|
|
|
+ const importConflictRowClassName = ({ row }) =>
|
|
|
+ row?.diff ? 'import-conflict-diff-row' : ''
|
|
|
+
|
|
|
+ const importConflictMergedList = computed(() => {
|
|
|
+ const oldArr = importConflictOldList.value || []
|
|
|
+ const newArr = importConflictNewList.value || []
|
|
|
+ const len = Math.max(oldArr.length, newArr.length)
|
|
|
+ const rows = []
|
|
|
+ for (let i = 0; i < len; i++) {
|
|
|
+ const oldRow = oldArr[i] || {}
|
|
|
+ const newRow = newArr[i] || {}
|
|
|
+ const diff =
|
|
|
+ oldRow.diff === true ||
|
|
|
+ newRow.diff === true ||
|
|
|
+ String(oldRow.part_name ?? '') !== String(newRow.part_name ?? '') ||
|
|
|
+ String(oldRow.process_code ?? '') !== String(newRow.process_code ?? '') ||
|
|
|
+ String(oldRow.process_name ?? '') !== String(newRow.process_name ?? '')
|
|
|
+ rows.push({
|
|
|
+ old_part_name: oldRow.part_name ?? '',
|
|
|
+ old_process_code: oldRow.process_code ?? '',
|
|
|
+ old_process_name: oldRow.process_name ?? '',
|
|
|
+ new_part_name: newRow.part_name ?? '',
|
|
|
+ new_process_code: newRow.process_code ?? '',
|
|
|
+ new_process_name: newRow.process_name ?? '',
|
|
|
+ diff,
|
|
|
+ })
|
|
|
+ }
|
|
|
+ return rows
|
|
|
+ })
|
|
|
+
|
|
|
+ const openImportAppendOnlyConflictDialog = (payload = {}) => {
|
|
|
+ const data = payload?.data && typeof payload.data === 'object' ? payload.data : {}
|
|
|
+ const conflicts = Array.isArray(data.conflicts) ? data.conflicts : []
|
|
|
+ importConflictTitle.value = payload?.msg || '该工单已有报工,仅允许末尾追加工序'
|
|
|
+ importConflictMeta.conflict_count = data.conflict_count ?? conflicts.length
|
|
|
+ importConflictMeta.suggest_min_new_code = data.suggest_min_new_code ?? null
|
|
|
+
|
|
|
+ let aligned
|
|
|
+ if ((Array.isArray(data.old_list) && data.old_list.length) || (Array.isArray(data.new_list) && data.new_list.length)) {
|
|
|
+ aligned = alignImportCompareLists(data.old_list, data.new_list)
|
|
|
+ } else {
|
|
|
+ aligned = buildCompareListsFromConflicts(conflicts)
|
|
|
+ }
|
|
|
+ importConflictOldList.value = aligned.oldAligned
|
|
|
+ importConflictNewList.value = aligned.newAligned
|
|
|
+ importConflictDialogVisible.value = true
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleImportProcessFail = (payload) => {
|
|
|
+ const data = payload?.data
|
|
|
+ if (data && typeof data === 'object' && data.error_type === 'import_append_only') {
|
|
|
+ openImportAppendOnlyConflictDialog(payload)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ ElMessage.error(payload?.msg || '导入失败')
|
|
|
+ }
|
|
|
+
|
|
|
+ //点击订单资料行
|
|
|
+ const tableRowClick = async (row) => {
|
|
|
+ //清空尺寸列表、颜色资料、部件资料、工艺资料、订单资料附件、技术附件
|
|
|
+ sizeDatas.length = 0
|
|
|
+ ystableData.splice(0, ystableData.length);
|
|
|
+ parttableData.splice(0, parttableData.length);
|
|
|
+ gytableData.splice(0, gytableData.length);
|
|
|
+ ddtableData.splice(0, ddtableData.length);
|
|
|
+ fhdtableData.splice(0, fhdtableData.length);
|
|
|
+ jstableData.splice(0, jstableData.length);
|
|
|
+ bomtableData.splice(0, bomtableData.length);
|
|
|
+ mltableData.splice(0, mltableData.length);
|
|
|
+ _Gd_gdbh.value = row.订单编号
|
|
|
+ _ddhval.value = row.订单编号
|
|
|
+ _Gd_kh.value = row.客户编号
|
|
|
+ _Gd_sckh.value = row.生产款号
|
|
|
+ _Gd_ks.value = row.款式
|
|
|
+ _Gd_ML.value = row.面料
|
|
|
+
|
|
|
+ //数据列表显示
|
|
|
+ const PrintListDatas = await PrintListData({order:_Gd_gdbh.value})
|
|
|
+ const jsOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'})
|
|
|
+ const ddOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'订单资料附件'})
|
|
|
+ const fhdOrderAttachments = await OrderAttachments({order:_Gd_gdbh.value,desc:'发货单附件'})
|
|
|
+
|
|
|
+ const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
+ // console.log("orderBomListdata:", orderBomListdata); // 打印接口返回的数据
|
|
|
+ // 确保 orderBomListdata.data 是数组,避免 undefined 错误
|
|
|
+ if (orderBomListdata?.data && Array.isArray(orderBomListdata.data)) {
|
|
|
+ bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
|
|
|
+ } else {
|
|
|
+ bomtableData.splice(0, bomtableData.length); // 如果数据无效,清空表格
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取部件资料
|
|
|
+ const partListData = await PartList({ workorder: _Gd_gdbh.value });
|
|
|
+ if (partListData?.code === 0 && Array.isArray(partListData.data)) {
|
|
|
+ parttableData.splice(0, parttableData.length, ...partListData.data);
|
|
|
+ } else {
|
|
|
+ parttableData.splice(0, parttableData.length);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取工艺资料
|
|
|
+ const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
+ if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
+ gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
+ } else {
|
|
|
+ gytableData.splice(0, gytableData.length);
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ const fabricListdata = await fabricList({ order: _Gd_gdbh.value });
|
|
|
+ // console.log("fabricListdata:", fabricListdata); // 打印接口返回的数据
|
|
|
+
|
|
|
+ if (fabricListdata.code === 0 && Array.isArray(fabricListdata.data.table)) {
|
|
|
+ // 如果 data.table 是数组且不为空,更新表格数据
|
|
|
+ mltableData.splice(0, mltableData.length, ...fabricListdata.data.table);
|
|
|
+ } else {
|
|
|
+ // 如果 data.table 为空或无效,清空表格数据
|
|
|
+ mltableData.splice(0, mltableData.length);
|
|
|
+ }
|
|
|
+
|
|
|
+ //颜色资料
|
|
|
+ if(PrintListDatas.data.列表.length === 0 ){
|
|
|
+ ystableData.length = 0
|
|
|
+ }else{
|
|
|
+ sizeDatas.splice(0,PrintListDatas.data.型号.length,...PrintListDatas.data.型号);//表格尺码投数据
|
|
|
+ ystableData.splice(0,PrintListDatas.data.列表.length,...PrintListDatas.data.列表);//表格数据
|
|
|
+ const newData = PrintListDatas.data.列表.map(item => ({
|
|
|
+ ...item,
|
|
|
+ 船样: item.船样 === 1 ? '是' : '否'
|
|
|
+ }));
|
|
|
+ ystableData.length = 0;
|
|
|
+ ystableData.push(...newData);
|
|
|
+ }
|
|
|
+ //技术附件
|
|
|
+ if(jsOrderAttachments.data === ''){
|
|
|
+ const WorkListdata = [];
|
|
|
+ jstableData.splice(0,jstableData.length,...WorkListdata);
|
|
|
+ }
|
|
|
+ if(jsOrderAttachments.code === 0 && ddOrderAttachments.code === 0){
|
|
|
+ jstableData.splice(0,jsOrderAttachments.data.list.length,...jsOrderAttachments.data.list);
|
|
|
+ ddtableData.splice(0,ddOrderAttachments.data.list.length,...ddOrderAttachments.data.list);
|
|
|
+ if(fhdOrderAttachments.data && fhdOrderAttachments.data.list && fhdOrderAttachments.data.list.length > 0){
|
|
|
+ if(_username.value === fhdOrderAttachments.data.list[0]['sys_id'] || _username.value === 'admin/超级管理员'){
|
|
|
+ fhdtableData.splice(0,fhdOrderAttachments.data.list.length,...fhdOrderAttachments.data.list);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ // //pdf
|
|
|
+ // const showPdfModal = ref(false);
|
|
|
+ // const pdfContainer = ref(null);
|
|
|
+
|
|
|
+ // const closeModal = () => {
|
|
|
+ // showPdfModal.value = false;
|
|
|
+ // };
|
|
|
+
|
|
|
+ // const fetchAndConvertFile = async () => {
|
|
|
+ // try {
|
|
|
+ // // 从后端获取 Base64 编码的 XLSX 文件数据
|
|
|
+ // const responses = await OrderAttachments({order:_Gd_gdbh.value,desc:'技术附件'});
|
|
|
+ // const response= responses.data[0].附件内容
|
|
|
+ // const base64Data = response.match(/base64,(.*)$/)?.[1];
|
|
|
+
|
|
|
+ // if (!base64Data) {
|
|
|
+ // throw new Error('Invalid Base64 data');
|
|
|
+ // }
|
|
|
+
|
|
|
+ // const binaryString = atob(base64Data);
|
|
|
+ // const binaryLen = binaryString.length;
|
|
|
+ // const bytes = new Uint8Array(binaryLen);
|
|
|
+
|
|
|
+ // for (let i = 0; i < binaryLen; i++) {
|
|
|
+ // bytes[i] = binaryString.charCodeAt(i);
|
|
|
+ // }
|
|
|
+
|
|
|
+ // // 解析 XLSX 文件
|
|
|
+ // const workbook = XLSX.read(bytes, { type: 'array' });
|
|
|
+ // const worksheet = workbook.Sheets[workbook.SheetNames[0]];
|
|
|
+ // console.log(121212,worksheet)
|
|
|
+ // const jsonData = XLSX.utils.sheet_to_json(worksheet);
|
|
|
+
|
|
|
+ // let base64 = XLSX.write(worksheet, { type: 'base64' });
|
|
|
+
|
|
|
+ // generatePdf(base64);
|
|
|
+ // } catch (error) {
|
|
|
+ // console.error('Error fetching and converting file:', error);
|
|
|
+ // }
|
|
|
+ // };
|
|
|
+
|
|
|
+ // const generatePdf = (data) => {
|
|
|
+ // console/log('pdf data', data)
|
|
|
+ // const pdfDoc = new jsPDF()
|
|
|
+ // pdfDoc.text(data)
|
|
|
+ // pdfDoc.save(a4.pdf)
|
|
|
+ // };
|
|
|
+
|
|
|
+ // const previewPdf = (blob) => {
|
|
|
+ // const fileURL = URL.createObjectURL(blob);
|
|
|
+
|
|
|
+ // // 通过 ref 引用 pdfContainer 来在指定容器中显示 PDF
|
|
|
+ // const iframe = document.createElement('iframe');
|
|
|
+ // iframe.src = fileURL;
|
|
|
+ // iframe.width = '100%';
|
|
|
+ // iframe.height = '600px';
|
|
|
+
|
|
|
+ // if (pdfContainer.value) {
|
|
|
+ // pdfContainer.value.innerHTML = ''; // 清空之前的内容
|
|
|
+ // pdfContainer.value.appendChild(iframe);
|
|
|
+ // }
|
|
|
+ // };
|
|
|
+
|
|
|
+ //表格复选框
|
|
|
+ const ddzlTableRowKey = (row) => {
|
|
|
+ const u = row.Uniqid
|
|
|
+ const id = row?.ID ?? row?.id
|
|
|
+ if (id != null && id !== '') return String(id)
|
|
|
+ return `dd-${row?.['订单编号'] ?? 'x'}-${row?.['生产款号'] ?? ''}-${row?.['客户编号'] ?? ''}`
|
|
|
+ }
|
|
|
+ const ysColorTableRowKey = (row) => {
|
|
|
+ const u = row.Uniqid
|
|
|
+ const id = row?.ID ?? row?.id
|
|
|
+ if (id != null && id !== '') return String(id)
|
|
|
+ return `ys-${row?.['子订单编号'] ?? ''}-${String(row?.['款号'] ?? '')}-${String(row?.['颜色'] ?? '')}`
|
|
|
+ }
|
|
|
+ const table_del = ref(true)//删除订单资料
|
|
|
+ const table_Selection = ref('')//存储选中Uniqid
|
|
|
+ const ddzlSelectionChange = (selection, type) => {
|
|
|
+ const ids = selection.map(item => {
|
|
|
+ return item.Uniqid ?? item.UniqID ?? item.UniqId
|
|
|
+ })
|
|
|
+ console.log('[订单资料] 勾选 Uniqid:', ids)
|
|
|
+ table_Selection.value = ids.filter((v) => v != null && v !== '').join(',')
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除按钮
|
|
|
+ const del_ddzlClick = async () => {
|
|
|
+ try {
|
|
|
+ // 显示确认弹窗
|
|
|
+ await ElMessageBox.confirm('确定要删除这条记录吗?', '提示', {
|
|
|
+ confirmButtonText: '确定',
|
|
|
+ cancelButtonText: '取消',
|
|
|
+ type: 'warning',
|
|
|
+ });
|
|
|
+
|
|
|
+ // 如果用户点击了确定
|
|
|
+ let params = {};
|
|
|
+ params.Uniqid = table_Selection._value;
|
|
|
+ console.log(params);
|
|
|
+ const res1 = await orderDataDel(params);
|
|
|
+ if (res1.code === 0) {
|
|
|
+ ElMessage.success('删除成功');
|
|
|
+
|
|
|
+ // 重新加载工单列表
|
|
|
+ const WorkListdata = await WorkOrderList({ search: _Gd_khdh.value, page: "1", limit: "10" });
|
|
|
+ tableData.value = WorkListdata.data.data;
|
|
|
+
|
|
|
+ // 清空相关数据
|
|
|
+ ystableData.splice(0, ystableData.length); // 颜色资料清空
|
|
|
+ parttableData.splice(0, parttableData.length); // 部件资料清空
|
|
|
+ gytableData.splice(0, gytableData.length); // 工艺资料清空
|
|
|
+ ddtableData.splice(0, ddtableData.length); // 订单资料附件清空
|
|
|
+ jstableData.splice(0, jstableData.length); // 技术附件清空
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ // 用户点击了取消或关闭了弹窗
|
|
|
+ ElMessage.info('删除操作已取消');
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ const delall = ref(true)
|
|
|
+ //颜色复选框
|
|
|
+ const ysSelection = ref('')
|
|
|
+ //工艺复选框
|
|
|
+ const gySelection = ref('')
|
|
|
+ // 颜色资料多选、工艺资料多选
|
|
|
+ const selectionChange = (selection, type) => {
|
|
|
+ if (type === '颜色资料') {
|
|
|
+ const ids = selection.map(item => item.Uniqid ?? item.UniqID ?? item.UniqId)
|
|
|
+ console.log('[颜色资料] 勾选 Uniqid:', ids)
|
|
|
+ ysSelection.value = ids.filter((v) => v != null && v !== '').join(',')
|
|
|
+ }
|
|
|
+ if (type === '工艺资料') {
|
|
|
+ const ids = selection.map(item => item.id)
|
|
|
+ console.log('[工艺资料] 勾选 id:', ids)
|
|
|
+ gySelection.value = ids.filter((v) => v != null && v !== '').join(',')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // ===========删除颜色资料、工艺资料 ===========
|
|
|
+ const delgd_delclick = async () => {
|
|
|
+ let changed = false;
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (ysSelection.value !== '') {
|
|
|
+ const res1 = await PrintDetailDel({ UniqId: ysSelection.value });
|
|
|
+ if (res1.code === 0) {
|
|
|
+ ElMessage.success('颜色资料删除成功');
|
|
|
+ changed = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (gySelection.value !== '') {
|
|
|
+ const res2 = await PrintDetailDel({ UniqId: gySelection.value });
|
|
|
+ if (res2.code === 0) {
|
|
|
+ ElMessage.success('工艺资料删除成功');
|
|
|
+ changed = true;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (changed) {
|
|
|
+ const PrintListDatas = await PrintListData({ order: _Gd_gdbh.value });
|
|
|
+ sizeDatas.splice(0, sizeDatas.length, ...PrintListDatas.data.型号);
|
|
|
+ ystableData.splice(0, ystableData.length, ...PrintListDatas.data.列表);
|
|
|
+ }
|
|
|
+ } catch (err) {
|
|
|
+ ElMessage.error(err);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ // 删除工艺资料
|
|
|
+ const delgy_delclick = async () => {
|
|
|
+ try {
|
|
|
+ if (gySelection.value !== '') {
|
|
|
+ const res = await DeleteProcess({ id: gySelection.value });
|
|
|
+ if (res.code === 0) {
|
|
|
+ ElMessage.success('工艺资料删除成功');
|
|
|
+ // 刷新工艺资料表格
|
|
|
+ const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
+ if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
+ gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
+ } else {
|
|
|
+ gytableData.splice(0, gytableData.length);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } catch (err) {
|
|
|
+ ElMessage.error(err);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+ const fj_Selection = ref('')//存储选中Uniqid
|
|
|
+ const fjSelection = ref('')
|
|
|
+ const fjdelall = ref(true)
|
|
|
+ const fjSelectionChange = (selection, type) => {
|
|
|
+ // console.log(selection)
|
|
|
+ const ids = selection.map(item => {
|
|
|
+ return item.UniqId
|
|
|
+ })
|
|
|
+ fj_Selection.value = ids.join(',')
|
|
|
+ console.log("附件复选框",fj_Selection.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ // //删除附件按钮
|
|
|
+ const fj_delclick = async () => {
|
|
|
+ let params = {};
|
|
|
+ params.UniqId = fj_Selection._value;
|
|
|
+ res1.code === 0 && ElMessage.success('删除成功')
|
|
|
+ }
|
|
|
+
|
|
|
+ //BOM表格复选框
|
|
|
+ const del_bom = ref(true)//删除BOM资料
|
|
|
+ const bom_Selection = ref('')//存储选中Uniqid
|
|
|
+ const bomSelectionChange = (selection, type) => {
|
|
|
+ const ids = selection.map(item => {
|
|
|
+ return item.UNIQID
|
|
|
+ })
|
|
|
+ bom_Selection.value = ids.join(',')
|
|
|
+ console.log("bom复选框",bom_Selection.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 删除BOM资料按钮
|
|
|
+ // const delbom_delclick = async () => {
|
|
|
+ // try {
|
|
|
+ // // 弹出确认框
|
|
|
+ // await ElMessageBox.confirm('此操作将永久删除该文件, 是否继续?', '提示', {
|
|
|
+ // confirmButtonText: '确定',
|
|
|
+ // cancelButtonText: '取消',
|
|
|
+ // type: 'warning',
|
|
|
+ // });
|
|
|
+ // // 用户点击“确定”后执行以下逻辑
|
|
|
+ // const params = {
|
|
|
+ // UNIQID: bom_Selection._value,
|
|
|
+ // };
|
|
|
+ // console.log('删除参数:', params);
|
|
|
+ // // 调用删除接口
|
|
|
+ // const res1 = await Bomdel(params);
|
|
|
+ // if (res1.code === 0) {
|
|
|
+ // ElMessage.success('删除成功');
|
|
|
+ // } else {
|
|
|
+ // ElMessage.error('删除失败');
|
|
|
+ // return; // 如果删除失败,直接返回
|
|
|
+ // }
|
|
|
+ // // 重新获取BOM列表数据
|
|
|
+ // const orderBomListdata = await orderBomList({ order: _Gd_gdbh.value });
|
|
|
+ // bomtableData.splice(0, bomtableData.length, ...orderBomListdata.data);
|
|
|
+ // } catch (error) {
|
|
|
+ // // 用户点击“取消”或弹框关闭
|
|
|
+ // console.log('用户取消删除操作');
|
|
|
+ // }
|
|
|
+ // };
|
|
|
+
|
|
|
+ //合计
|
|
|
+ const getSummaries = (param) => {
|
|
|
+ const { columns, data } = param;
|
|
|
+ const sums = {};
|
|
|
+ //选择你希望合计的列
|
|
|
+ const summableLabels = [...sizeDatas, "制单总数"];
|
|
|
+ columns.forEach((column, index) => {
|
|
|
+ if (index === 1) {
|
|
|
+ sums[index] = '总数量合计';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (summableLabels.includes(column.label)) {
|
|
|
+ const values = data.map(item => Number(item[column.property]));
|
|
|
+
|
|
|
+ // 检查数组中是否所有值都是 NaN
|
|
|
+ if (!values.every(value => isNaN(value))) {
|
|
|
+ sums[index] = values.reduce((prev, curr) => {
|
|
|
+ const value = Number(curr);
|
|
|
+ if (!isNaN(value)) {
|
|
|
+ return prev + value;
|
|
|
+ }
|
|
|
+ return prev;
|
|
|
+ }, 0);
|
|
|
+ // 如果需要,可以在这里添加单位
|
|
|
+ // sums[index] += ' 件';
|
|
|
+ } else {
|
|
|
+ sums[index] = 'N/A';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return sums;
|
|
|
+ };
|
|
|
+
|
|
|
+ //工艺资料合计
|
|
|
+ const gySummaries = ({ columns, data }) => {
|
|
|
+ // 只合计状态为0(正常)的行
|
|
|
+ const normalData = data.filter(item => String(item.状态) === '0');
|
|
|
+ const sums = [];
|
|
|
+ columns.forEach((column, index) => {
|
|
|
+ if (index === 1) {
|
|
|
+ sums[index] = '合计';
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (column.label === '工分') {
|
|
|
+ const values = normalData.map(item => Number(item[column.property]));
|
|
|
+
|
|
|
+ if (!values.every(value => isNaN(value))) {
|
|
|
+ const total = values.reduce((prev, curr) => {
|
|
|
+ const value = Number(curr);
|
|
|
+ if (!isNaN(value)) {
|
|
|
+ return prev + value;
|
|
|
+ }
|
|
|
+ return prev;
|
|
|
+ }, 0);
|
|
|
+ sums[index] = total.toFixed(2);
|
|
|
+ } else {
|
|
|
+ sums[index] = 'N/A';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return sums;
|
|
|
+ };
|
|
|
+
|
|
|
+ //工艺详情弹窗合计
|
|
|
+ const gyDetailSummaries = (param) => {
|
|
|
+ const { columns, data } = param;
|
|
|
+ const sums = [];
|
|
|
+ let total = 0;
|
|
|
+ let count = 0;
|
|
|
+
|
|
|
+ data.forEach(item => {
|
|
|
+ if (item && item['定额分'] !== undefined) {
|
|
|
+ const val = Number(item['定额分']);
|
|
|
+ if (!isNaN(val)) {
|
|
|
+ total += val;
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ columns.forEach((column, index) => {
|
|
|
+ if (column.prop === '工序名称') {
|
|
|
+ sums[index] = '合计';
|
|
|
+ } else if (column.label === '工分') {
|
|
|
+ sums[index] = count > 0 ? total.toFixed(2) : '0.00';
|
|
|
+ } else {
|
|
|
+ sums[index] = '';
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ return sums;
|
|
|
+ };
|
|
|
+
|
|
|
+ // 面料合计
|
|
|
+ // const mlgetSummaries = (param) => {
|
|
|
+ // const { columns, data } = param;
|
|
|
+ // const sums = {};
|
|
|
+ // //选择你希望合计的列
|
|
|
+ // const summableLabels = ["库存总量"];
|
|
|
+ // columns.forEach((column, index) => {
|
|
|
+ // if (index === 0) {
|
|
|
+ // sums[index] = '总数量合计';
|
|
|
+ // return;
|
|
|
+ // }
|
|
|
+ // if (summableLabels.includes(column.label)) {
|
|
|
+ // const values = data.map(item => Number(item[column.property]));
|
|
|
+ // if (!values.every(value => isNaN(value))) {
|
|
|
+ // sums[index] = values.reduce((prev, curr) => {
|
|
|
+ // const value = Number(curr);
|
|
|
+ // if (!isNaN(value)) {
|
|
|
+ // return prev + value;
|
|
|
+ // }
|
|
|
+ // return prev;
|
|
|
+ // }, 0);
|
|
|
+ // } else {
|
|
|
+ // sums[index] = 'N/A';
|
|
|
+ // }
|
|
|
+ // }
|
|
|
+ // });
|
|
|
+ // return sums;
|
|
|
+ // };
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+ //=========查询========
|
|
|
+ const searchInfo = ref('')
|
|
|
+
|
|
|
+ //查询按钮
|
|
|
+ const onSubmit = async () => {
|
|
|
+ if(searchInfo.value === ''){
|
|
|
+ ElMessage({type: 'warning',message: '请输入搜索的订单编号'})
|
|
|
+ return false;
|
|
|
+ }else{
|
|
|
+ const WorkListdata = await WorkOrderList({search:searchInfo.value,page:page.value,limit:pageSize.value});
|
|
|
+ tableData.value= WorkListdata.data.data
|
|
|
+ ystableData.splice(0, ystableData.length);//颜色资料清空
|
|
|
+ parttableData.splice(0, parttableData.length);//部件资料清空
|
|
|
+ gytableData.splice(0, gytableData.length);//工艺资料情空
|
|
|
+ ddtableData.splice(0, ddtableData.length);//订单资料附件清空
|
|
|
+ jstableData.splice(0, jstableData.length);//技术附件清空
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ // 调用查询数据接口
|
|
|
+ const _cha_WorkList = async (node) => {
|
|
|
+ if(searchInfo.value === ''){
|
|
|
+ ElMessage({type: 'warning',message: '请输入搜索的信息'})
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ const search = searchInfo.value;
|
|
|
+ var regex = /^[a-zA-Z0-9]+$/;
|
|
|
+ try {
|
|
|
+ if (regex.test(search)) {
|
|
|
+ // 符合条件,执行搜索操作
|
|
|
+ console.log('搜索内容为纯数字加字母');
|
|
|
+ // const WorkListdata = await WorkList({search:search,limit:100,page:1});//接口调用函数
|
|
|
+ if(WorkListdata.data.total === 0){
|
|
|
+ ElMessage({type: 'warning',message: '未搜索具体查询条件'})
|
|
|
+ }
|
|
|
+ tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
|
|
|
+ total.value = WorkListdata.data.total;//共多少条
|
|
|
+ } else {
|
|
|
+ // 不符合条件,给出提示
|
|
|
+ console.log('搜索内容包含非字母和数字的字符');
|
|
|
+ // const WorkListdata = await WorkList({Gd_khdh:'',search:search,limit:100,page:1});//接口调用函数
|
|
|
+ if(WorkListdata.data.total === 0){
|
|
|
+ ElMessage({type: 'warning',message: '未搜索具体查询条件'})
|
|
|
+ }
|
|
|
+ tableData.splice(0,tableData.length,...WorkListdata.data.data);//表格数据
|
|
|
+ total.value = WorkListdata.data.total;//共多少条
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error(error);
|
|
|
+ }
|
|
|
+ };
|
|
|
+
|
|
|
+
|
|
|
+ //===============附件上传===============
|
|
|
+ //附件上传按钮
|
|
|
+ const jsfjClick = () => {
|
|
|
+ if(_Gd_gdbh.value === '' || _Gd_gdbh.value === null){
|
|
|
+ ElMessage({type: 'warning',message: '请选择具体的工单后,再操作此功能'})
|
|
|
+ }else{
|
|
|
+ jsfjdialogFormVisible.value = true
|
|
|
+ initJsfjformdata();
|
|
|
+ jsfjformdata.value.关联编号 = _Gd_gdbh.value
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //技术附件弹窗
|
|
|
+ const jsfjdialogFormVisible = ref(false)
|
|
|
+ const jsfjformdata = ref({
|
|
|
+ sys_id: _username.value,
|
|
|
+ 附件备注: '',
|
|
|
+ 附件内容: '',
|
|
|
+ 附件类型: '',
|
|
|
+ 关联编号: '',
|
|
|
+ });
|
|
|
+ //技术附件弹窗取消
|
|
|
+ const initJsfjformdata = () => {
|
|
|
+ jsfjformdata.value = {
|
|
|
+ sys_id: _username.value,
|
|
|
+ 附件备注: '',
|
|
|
+ 附件内容: '',
|
|
|
+ 附件类型: '',
|
|
|
+ 关联编号: '',
|
|
|
+ }
|
|
|
+ }
|
|
|
+ //技术附件弹窗取消
|
|
|
+ const jsfjcloseDialog = () => {
|
|
|
+ jsfjdialogFormVisible.value = false
|
|
|
+ }
|
|
|
+ const uploadExcel = (event) =>{
|
|
|
+ const files = event.target.files;
|
|
|
+ console.log(files)
|
|
|
+ let suffixArr = name.split("."), suffix = suffixArr[suffixArr.length-1];
|
|
|
+ jsfjformdata.value.附件内容 = files[0]
|
|
|
+ jsfjformdata.value.附件类型 = files[0].name.split('.')[1]
|
|
|
+ }
|
|
|
+
|
|
|
+ //技术附件弹窗确定
|
|
|
+ const jsfjenterDialog = () => {
|
|
|
+ if(jsfjformdata.value.附件备注==''){
|
|
|
+ ElMessage({type: 'error',message: '请选择附件备注'});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(jsfjformdata.value.附件内容==''){
|
|
|
+ ElMessage({type: 'error',message: '请上传文件'});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ if(jsfjformdata.value.关联编号==''){
|
|
|
+ ElMessage({type: 'error',message: '请关闭重新打开'});
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ let fr = new FileReader();
|
|
|
+ fr.readAsDataURL(jsfjformdata.value.附件内容);
|
|
|
+ fr.onload = function () {
|
|
|
+ const restoredData = new FormData();
|
|
|
+ restoredData.append('附件备注', jsfjformdata.value.附件备注);
|
|
|
+ restoredData.append('附件内容', fr.result);
|
|
|
+ restoredData.append('附件类型', jsfjformdata.value.附件类型);
|
|
|
+ restoredData.append('关联编号', jsfjformdata.value.关联编号);
|
|
|
+ restoredData.append('sys_id', jsfjformdata.value.sys_id);
|
|
|
+
|
|
|
+ //将restoredDta数据新增到接口
|
|
|
+ gdAnnexAdd(restoredData).then(response => {
|
|
|
+ if(response.code==0){
|
|
|
+ ElMessage({type: 'success',message: '新增成功',})
|
|
|
+ jsfjdialogFormVisible.value = false
|
|
|
+ let row = {
|
|
|
+ '订单编号':_Gd_gdbh.value,
|
|
|
+ // '产品代号':_Gd_cpdh.value,
|
|
|
+ // '产品名称':_Gd_cpmc.value,
|
|
|
+ }
|
|
|
+ tableRowClick (row)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ // 导入工艺资料弹窗相关方法
|
|
|
+ const openImportProcessDialog = () => {
|
|
|
+ importProcessForm.workorderNo = _Gd_gdbh.value
|
|
|
+ importProcessForm.styleNo = _Gd_sckh.value
|
|
|
+ importProcessFileList.length = 0
|
|
|
+ importProcessFile = null
|
|
|
+ importProcessDialogVisible.value = true
|
|
|
+ console.log(importProcessDialogVisible.value)
|
|
|
+ }
|
|
|
+
|
|
|
+ const closeImportProcessDialog = () => {
|
|
|
+ importProcessDialogVisible.value = false
|
|
|
+ importProcessFileList.length = 0
|
|
|
+ importProcessFile = null
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleImportProcessFileChange = (file, fileList) => {
|
|
|
+ if (fileList.length > 0) {
|
|
|
+ const lastFile = fileList[fileList.length - 1]
|
|
|
+ importProcessFile = lastFile.raw || lastFile
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const handleImportProcessFileRemove = () => {
|
|
|
+ importProcessFile = null
|
|
|
+ }
|
|
|
+
|
|
|
+ const beforeImportProcessUpload = (file) => {
|
|
|
+ const isExcel = file.type === 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' ||
|
|
|
+ file.type === 'application/vnd.ms-excel'
|
|
|
+ if (!isExcel) {
|
|
|
+ ElMessage.error('请选择Excel文件')
|
|
|
+ return false
|
|
|
+ }
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ const submitImportProcess = async () => {
|
|
|
+ if (!importProcessFile) {
|
|
|
+ ElMessage.error('请选择Excel文件')
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ const formData = new FormData()
|
|
|
+ formData.append('workorder', _Gd_gdbh.value)
|
|
|
+ formData.append('file', importProcessFile)
|
|
|
+ formData.append('sys_id', userStore.userInfo.nickName)
|
|
|
+
|
|
|
+ try {
|
|
|
+ const baseURL = import.meta.env.VITE_BASE_API || ''
|
|
|
+ const response = await axios.post(`${baseURL}/mes_server/work_order_process/importProcess`, formData, {
|
|
|
+ headers: {
|
|
|
+ 'x-token': userStore.token
|
|
|
+ }
|
|
|
+ })
|
|
|
+ const res = response?.data || {}
|
|
|
+ if (res.code === 0) {
|
|
|
+ ElMessage.success('导入成功')
|
|
|
+ closeImportProcessDialog()
|
|
|
+ const processListData = await GetProcessList({ workorder: _Gd_gdbh.value });
|
|
|
+ if (processListData?.code === 0 && Array.isArray(processListData.data)) {
|
|
|
+ gytableData.splice(0, gytableData.length, ...processListData.data);
|
|
|
+ } else {
|
|
|
+ gytableData.splice(0, gytableData.length);
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ handleImportProcessFail(res)
|
|
|
+ }
|
|
|
+ } catch (error) {
|
|
|
+ console.error('导入工艺资料失败:', error)
|
|
|
+ const res = error?.response?.data
|
|
|
+ if (res && typeof res === 'object') {
|
|
|
+ handleImportProcessFail(res)
|
|
|
+ return
|
|
|
+ }
|
|
|
+ ElMessage.error(error?.message || '导入失败,请稍后重试')
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ </script>
|
|
|
+ <style scoped>
|
|
|
+ /* 在样式表中使用媒体查询 */
|
|
|
+ @media (max-width: 768px) {
|
|
|
+ /* 在小屏幕下的样式设置 */
|
|
|
+ .dialog-footer {
|
|
|
+ text-align: center;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ .import-conflict-summary {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #606266;
|
|
|
+ line-height: 1.5;
|
|
|
+ }
|
|
|
+ .import-conflict-summary strong {
|
|
|
+ color: #e6a23c;
|
|
|
+ }
|
|
|
+ .import-process-tip {
|
|
|
+ margin: 0 0 14px;
|
|
|
+ padding: 0;
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 1.7;
|
|
|
+ color: #f56c6c;
|
|
|
+ background: none;
|
|
|
+ border: none;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+ /*背景颜色*/
|
|
|
+ /*印件背景颜色变黄*/
|
|
|
+ :deep(.el-table__body .warning-row) {
|
|
|
+ background: #FFFF80 !important;
|
|
|
+ }
|
|
|
+ /*bom参数背景*/
|
|
|
+ :deep(.el-table__body .background-plan-usage-low div div div) {
|
|
|
+ background: #80FA80 !important;
|
|
|
+ }
|
|
|
+ /* 选中某行时的背景色 */
|
|
|
+ :deep(.el-table__body tr.current-row) > td {
|
|
|
+ background: #ff80ff !important;
|
|
|
+ }
|
|
|
+ :deep(.statusy-plan-usage-low div) {
|
|
|
+ color: #8c939d !important;
|
|
|
+ }
|
|
|
+ /* 在样式表中添加以下样式 */
|
|
|
+ .el-input__textarea {
|
|
|
+ resize: none; /* 禁止调整大小 */
|
|
|
+ }
|
|
|
+ .JKWTree-container {
|
|
|
+ display: flex;
|
|
|
+ }
|
|
|
+ .JKWTree-tree {
|
|
|
+ /*width: 300px;*/
|
|
|
+ background-color: #fff;
|
|
|
+ padding: 10px;
|
|
|
+ margin-right: 20px;
|
|
|
+ }
|
|
|
+ .JKWTree-tree h3 {
|
|
|
+ font-size: 15px;
|
|
|
+ font-weight: 700;
|
|
|
+ margin: 10px 0;
|
|
|
+ }
|
|
|
+ .JKWTree-content {
|
|
|
+ flex: 1;
|
|
|
+ }
|
|
|
+ /*关闭拖拽功能*/
|
|
|
+ .el-textarea textarea {
|
|
|
+ resize: none !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 新增/修改订单资料弹窗 - 16/8 栅格布局(与原版一致,小屏自动换行) */
|
|
|
+ .add-order-dialog :deep(.el-dialog) {
|
|
|
+ width: min(90%, 1200px) !important;
|
|
|
+ max-height: 92vh;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ margin: 4vh auto !important;
|
|
|
+ }
|
|
|
+ .add-order-dialog :deep(.el-dialog__body) {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ overflow-x: hidden;
|
|
|
+ overflow-y: auto;
|
|
|
+ padding: 12px 20px 8px;
|
|
|
+ }
|
|
|
+ .add-order-dialog-body {
|
|
|
+ min-width: 0;
|
|
|
+ }
|
|
|
+ .add-order-dialog-main,
|
|
|
+ .add-order-dialog-side {
|
|
|
+ min-width: 0;
|
|
|
+ }
|
|
|
+ .add-order-upload-wrap {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: center;
|
|
|
+ margin-bottom: 16px;
|
|
|
+ }
|
|
|
+ .add-order-dialog-side :deep(.el-upload-list--picture-card) {
|
|
|
+ margin-left: 0;
|
|
|
+ }
|
|
|
+ .add-order-upload-title {
|
|
|
+ font-size: 16px;
|
|
|
+ margin-top: 8px;
|
|
|
+ text-align: center;
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
+ }
|
|
|
+ /* 去掉「按 Delete 键可删除」及角标关闭,仅保留 picture-card 悬停放大/垃圾桶 */
|
|
|
+ .add-order-upload :deep(.el-icon--close-tip),
|
|
|
+ .add-order-upload :deep(.el-upload-list__item .el-icon--close),
|
|
|
+ .add-order-upload :deep(.el-upload-list__item-status-label) {
|
|
|
+ display: none !important;
|
|
|
+ }
|
|
|
+ .add-order-bottom-row {
|
|
|
+ margin-top: 4px;
|
|
|
+ }
|
|
|
+ .add-order-dialog-main :deep(.el-input),
|
|
|
+ .add-order-dialog-main :deep(.el-select),
|
|
|
+ .add-order-dialog-main :deep(.el-date-editor),
|
|
|
+ .add-order-dialog-side :deep(.el-input),
|
|
|
+ .add-order-dialog-side :deep(.el-date-editor) {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ .add-order-dialog-main :deep(.el-form-item__content),
|
|
|
+ .add-order-dialog-side :deep(.el-form-item__content) {
|
|
|
+ min-width: 0;
|
|
|
+ }
|
|
|
+ @media (max-width: 768px) {
|
|
|
+ .add-order-dialog-side {
|
|
|
+ margin-top: 12px;
|
|
|
+ padding-top: 12px;
|
|
|
+ border-top: 1px solid var(--el-border-color-lighter);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 新增部件弹窗样式 */
|
|
|
+ .part-add-dialog {
|
|
|
+ max-height: 95vh;
|
|
|
+ height: 95vh;
|
|
|
+ }
|
|
|
+
|
|
|
+ .part-add-dialog .el-dialog__body {
|
|
|
+ max-height: 85vh;
|
|
|
+ height: 85vh;
|
|
|
+ overflow-y: auto;
|
|
|
+ padding: 20px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .part-add-dialog .list-part-hint {
|
|
|
+ margin-bottom: 20px;
|
|
|
+ font-size: 14px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .part-add-dialog .el-table {
|
|
|
+ margin-bottom: 20px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .part-add-dialog .el-table th {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ font-weight: bold;
|
|
|
+ }
|
|
|
+
|
|
|
+ .part-add-dialog .el-table td {
|
|
|
+ padding: 12px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .part-add-dialog .dialog-footer {
|
|
|
+ margin-top: 20px;
|
|
|
+ padding-top: 15px;
|
|
|
+ border-top: 1px solid #ebeef5;
|
|
|
+ }
|
|
|
+ </style>
|
|
|
+ <style scoped>
|
|
|
+ :deep(.el-table td .cell) {
|
|
|
+ line-height: 20px !important;
|
|
|
+ }
|
|
|
+ :deep(.el-tabs__header){
|
|
|
+ margin-bottom: 0;
|
|
|
+ }
|
|
|
+ .search{
|
|
|
+ margin-left: 0px !important;
|
|
|
+ margin-right: 10px !important;
|
|
|
+ }
|
|
|
+ .bt{
|
|
|
+ margin-left: 2px !important;
|
|
|
+ padding: 3px !important;
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
+ .el-tabs__header{
|
|
|
+ margin: 0px !important;
|
|
|
+ }
|
|
|
+ .gva-table-box{
|
|
|
+ padding: 0px !important;
|
|
|
+ }
|
|
|
+ .el-pagination{
|
|
|
+ margin-top: 0px !important;
|
|
|
+ }
|
|
|
+ /* .upload-demo .el-upload {
|
|
|
+ border: 1px dashed #d9d9d9;
|
|
|
+ border-radius: 6px;
|
|
|
+ cursor: pointer;
|
|
|
+ position: relative;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .upload-demo .el-upload:hover {
|
|
|
+ border-color: #409EFF;
|
|
|
+ } */
|
|
|
+
|
|
|
+ .mab{
|
|
|
+ margin-bottom: 5px;
|
|
|
+ }
|
|
|
+ .fj-col-header {
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 2px;
|
|
|
+ cursor: help;
|
|
|
+ }
|
|
|
+ .fj-col-help {
|
|
|
+ font-size: 14px;
|
|
|
+ color: #909399;
|
|
|
+ }
|
|
|
+ /* 上下表头统一浅色 */
|
|
|
+ :deep(.el-table) {
|
|
|
+ --el-table-header-bg-color: #fafafa;
|
|
|
+ }
|
|
|
+ :deep(.el-table__header th.el-table__cell) {
|
|
|
+ background-color: #fafafa !important;
|
|
|
+ }
|
|
|
+ ::v-deep(.input_style .el-input__inner) {
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+ ::v-deep(.el-form-item__label) {
|
|
|
+ font-size: 18px;
|
|
|
+ }
|
|
|
+
|
|
|
+ ::v-deep(.el-upload-list--picture-card) {
|
|
|
+ margin-left: 0;
|
|
|
+ }
|
|
|
+ ::v-deep(.add-order-upload .el-upload__input),
|
|
|
+ ::v-deep(.import-process-upload .el-upload__input) {
|
|
|
+ display: none !important;
|
|
|
+ }
|
|
|
+ ::v-deep(.el-checkbox__inner) {
|
|
|
+ width: 20px;
|
|
|
+ height: 20px;
|
|
|
+ }
|
|
|
+ ::v-deep(.el-checkbox__input.is-checked .el-checkbox__inner::after) {
|
|
|
+ top: 30%;
|
|
|
+ left: 30%;
|
|
|
+ }
|
|
|
+ ::v-deep(.el-descriptions__table tbody tr .is-bordered-label){
|
|
|
+ width: 40px;
|
|
|
+ }
|
|
|
+ ::v-deep(.el-descriptions__table tbody tr .el-descriptions__content){
|
|
|
+ width: 120px;
|
|
|
+ }
|
|
|
+ :deep(.el-descriptions__content) {
|
|
|
+ width: 80px !important;
|
|
|
+ min-width: 80px !important;
|
|
|
+ max-width: 100px !important;
|
|
|
+ overflow: hidden !important;
|
|
|
+ text-overflow: ellipsis !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .big-error-message {
|
|
|
+ padding: 20px 30px !important; /* 整体弹窗变大 */
|
|
|
+ font-size: 20px !important; /* 文字更大 */
|
|
|
+ animation: scaleFadeIn 0.3s ease-out; /* 放大淡入动画 */
|
|
|
+ }
|
|
|
+
|
|
|
+ .big-error-message .el-message__icon {
|
|
|
+ font-size: 26px !important; /* 图标变大 */
|
|
|
+ }
|
|
|
+
|
|
|
+ @keyframes scaleFadeIn {
|
|
|
+ 0% {
|
|
|
+ transform: scale(0.8);
|
|
|
+ opacity: 0;
|
|
|
+ }
|
|
|
+ 100% {
|
|
|
+ transform: scale(1);
|
|
|
+ opacity: 1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 排序弹窗样式 */
|
|
|
+ .list-unified-dialog :deep(.el-dialog) {
|
|
|
+ max-height: 90vh;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ margin-top: 5vh !important;
|
|
|
+ margin-bottom: 5vh;
|
|
|
+ }
|
|
|
+ .list-unified-dialog :deep(.el-dialog__header) {
|
|
|
+ flex-shrink: 0;
|
|
|
+ padding-bottom: 12px;
|
|
|
+ }
|
|
|
+ .list-unified-dialog :deep(.el-dialog__body) {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 320px;
|
|
|
+ max-height: min(720px, calc(90vh - 130px));
|
|
|
+ overflow-y: auto;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+ .list-unified-dialog :deep(.el-dialog__footer) {
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+ .list-process-add-dialog.list-unified-dialog :deep(.el-dialog) {
|
|
|
+ width: min(1280px, 96vw) !important;
|
|
|
+ min-width: min(1280px, 96vw) !important;
|
|
|
+ max-width: min(1280px, 96vw) !important;
|
|
|
+ height: min(620px, 78vh) !important;
|
|
|
+ min-height: min(620px, 78vh) !important;
|
|
|
+ max-height: min(620px, 78vh) !important;
|
|
|
+ box-sizing: border-box !important;
|
|
|
+ }
|
|
|
+ .list-process-add-dialog.list-unified-dialog :deep(.el-dialog__body) {
|
|
|
+ max-height: none !important;
|
|
|
+ min-height: 0 !important;
|
|
|
+ flex: 1 1 auto !important;
|
|
|
+ display: flex !important;
|
|
|
+ flex-direction: column !important;
|
|
|
+ overflow: hidden !important;
|
|
|
+ }
|
|
|
+ .list-process-add-dialog.list-unified-dialog .list-process-add-by-part {
|
|
|
+ flex: 1 1 auto;
|
|
|
+ min-height: 0;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .list-process-add-dialog.list-unified-dialog .list-dialog-context-header {
|
|
|
+ flex-shrink: 0;
|
|
|
+ }
|
|
|
+ .list-dialog-context-header {
|
|
|
+ margin-bottom: 14px;
|
|
|
+ }
|
|
|
+ .list-dialog-kv-table {
|
|
|
+ width: 100%;
|
|
|
+ border-collapse: collapse;
|
|
|
+ font-size: 13px;
|
|
|
+ table-layout: fixed;
|
|
|
+ }
|
|
|
+ .list-dialog-kv-table th,
|
|
|
+ .list-dialog-kv-table td {
|
|
|
+ border: 1px solid var(--el-border-color);
|
|
|
+ padding: 8px 12px;
|
|
|
+ text-align: left;
|
|
|
+ vertical-align: middle;
|
|
|
+ line-height: 1.45;
|
|
|
+ }
|
|
|
+ .list-dialog-kv-table th {
|
|
|
+ width: 92px;
|
|
|
+ background: #f5f7fa;
|
|
|
+ font-weight: 500;
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ .list-dialog-kv-table td {
|
|
|
+ background: #fff;
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
+ word-break: break-word;
|
|
|
+ }
|
|
|
+ .list-process-add-split {
|
|
|
+ display: flex;
|
|
|
+ gap: 14px;
|
|
|
+ align-items: stretch;
|
|
|
+ flex: 1 1 auto;
|
|
|
+ min-height: 0;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .list-process-add-sidebar {
|
|
|
+ flex: 0 0 240px;
|
|
|
+ max-width: 42%;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ min-height: 0;
|
|
|
+ border: 1px solid var(--el-border-color-lighter);
|
|
|
+ border-radius: 8px;
|
|
|
+ background: var(--el-fill-color-blank);
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .list-process-add-sidebar-title {
|
|
|
+ padding: 10px 12px;
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
+ border-bottom: 1px solid var(--el-border-color-lighter);
|
|
|
+ background: #f5f7fa;
|
|
|
+ }
|
|
|
+ .list-process-add-part-list {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ overflow-y: auto;
|
|
|
+ padding: 8px;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 6px;
|
|
|
+ }
|
|
|
+ .list-process-add-stage-list {
|
|
|
+ gap: 2px;
|
|
|
+ }
|
|
|
+ .list-process-add-stage-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ padding: 9px 10px;
|
|
|
+ border-radius: 6px;
|
|
|
+ border: 1px solid var(--el-border-color-lighter);
|
|
|
+ background: var(--el-bg-color);
|
|
|
+ cursor: pointer;
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
+ user-select: none;
|
|
|
+ -webkit-user-select: none;
|
|
|
+ transition: border-color 0.15s, background 0.15s;
|
|
|
+ }
|
|
|
+ .list-process-add-stage-item:hover {
|
|
|
+ border-color: var(--el-color-primary-light-5);
|
|
|
+ }
|
|
|
+ .list-process-add-stage-item.is-active {
|
|
|
+ border-color: var(--el-color-primary);
|
|
|
+ background: var(--el-color-primary-light-9);
|
|
|
+ color: var(--el-color-primary);
|
|
|
+ }
|
|
|
+ .list-process-add-sewing-nest {
|
|
|
+ margin: 0 0 8px 0;
|
|
|
+ padding: 0 0 0 10px;
|
|
|
+ border-left: 2px solid var(--el-border-color-lighter);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 5px;
|
|
|
+ }
|
|
|
+ .list-process-add-part-item--nest {
|
|
|
+ padding: 6px 8px;
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
+ .list-process-add-part-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ gap: 8px;
|
|
|
+ padding: 8px 10px;
|
|
|
+ border-radius: 6px;
|
|
|
+ border: 1px solid var(--el-border-color-lighter);
|
|
|
+ background: var(--el-bg-color);
|
|
|
+ cursor: pointer;
|
|
|
+ user-select: none;
|
|
|
+ -webkit-user-select: none;
|
|
|
+ transition: border-color 0.15s, background 0.15s;
|
|
|
+ }
|
|
|
+ .list-process-add-part-item:hover {
|
|
|
+ border-color: var(--el-color-primary-light-5);
|
|
|
+ }
|
|
|
+ .list-process-add-part-item.is-active {
|
|
|
+ border-color: var(--el-color-primary);
|
|
|
+ background: var(--el-color-primary-light-9);
|
|
|
+ }
|
|
|
+ .list-process-add-part-item-text {
|
|
|
+ flex: 1;
|
|
|
+ min-width: 0;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 2px;
|
|
|
+ }
|
|
|
+ .list-process-add-part-sort {
|
|
|
+ font-size: 12px;
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
+ }
|
|
|
+ .list-process-add-part-name {
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ .list-process-add-main-panel {
|
|
|
+ flex: 1;
|
|
|
+ min-width: 0;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ min-height: 0;
|
|
|
+ border: 1px solid var(--el-border-color-lighter);
|
|
|
+ border-radius: 8px;
|
|
|
+ padding: 10px 12px;
|
|
|
+ background: var(--el-bg-color);
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .list-process-add-main-head {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ font-size: 13px;
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
+ }
|
|
|
+ .list-process-add-main-head-sub {
|
|
|
+ margin-left: 6px;
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
+ font-weight: normal;
|
|
|
+ }
|
|
|
+ .list-process-add-main-empty {
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ min-height: 200px;
|
|
|
+ }
|
|
|
+ .sort-part-gy-part-item.is-active {
|
|
|
+ border-color: var(--el-color-primary);
|
|
|
+ background: var(--el-color-primary-light-9);
|
|
|
+ }
|
|
|
+ .sort-part-gy-body {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .sort-part-gy-hint {
|
|
|
+ margin-bottom: 12px;
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 1.55;
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
+ }
|
|
|
+ .sort-part-gy-hint-list {
|
|
|
+ margin: 0;
|
|
|
+ padding-left: 20px;
|
|
|
+ }
|
|
|
+ .sort-part-gy-hint-list li {
|
|
|
+ margin-bottom: 6px;
|
|
|
+ }
|
|
|
+ .sort-part-gy-split {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ display: flex;
|
|
|
+ gap: 14px;
|
|
|
+ align-items: stretch;
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .sort-gy-left-nav {
|
|
|
+ flex: 0 0 240px;
|
|
|
+ max-width: 42%;
|
|
|
+ }
|
|
|
+ .list-sort-gy-nav-list {
|
|
|
+ gap: 2px;
|
|
|
+ }
|
|
|
+ .list-sort-gy-sewing-parts {
|
|
|
+ margin: 0 0 8px 0;
|
|
|
+ padding: 0 0 0 10px;
|
|
|
+ border-left: 2px solid var(--el-border-color-lighter);
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ gap: 5px;
|
|
|
+ }
|
|
|
+ .sort-part-gy-part-item {
|
|
|
+ display: flex;
|
|
|
+ align-items: flex-start;
|
|
|
+ gap: 8px;
|
|
|
+ padding: 8px 10px;
|
|
|
+ border-radius: 6px;
|
|
|
+ border: 1px solid var(--el-border-color-lighter);
|
|
|
+ background: var(--el-bg-color);
|
|
|
+ cursor: pointer;
|
|
|
+ user-select: none;
|
|
|
+ -webkit-user-select: none;
|
|
|
+ transition: border-color 0.15s, background 0.15s;
|
|
|
+ }
|
|
|
+ .sort-part-gy-part-item:hover {
|
|
|
+ border-color: var(--el-color-primary-light-5);
|
|
|
+ }
|
|
|
+ .sort-part-gy-part-item.is-active {
|
|
|
+ border-color: var(--el-color-primary);
|
|
|
+ background: var(--el-color-primary-light-9);
|
|
|
+ }
|
|
|
+ .sort-part-gy-part-item-grip {
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
+ margin-top: 2px;
|
|
|
+ }
|
|
|
+ .sort-part-gy-main-panel {
|
|
|
+ flex: 1;
|
|
|
+ min-width: 0;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ min-height: 0;
|
|
|
+ border: 1px solid var(--el-border-color-lighter);
|
|
|
+ border-radius: 8px;
|
|
|
+ padding: 10px 12px;
|
|
|
+ background: var(--el-bg-color);
|
|
|
+ overflow: hidden;
|
|
|
+ }
|
|
|
+ .sort-part-gy-main-head {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ font-size: 13px;
|
|
|
+ color: var(--el-text-color-regular);
|
|
|
+ }
|
|
|
+ .sort-part-gy-main-head--warn {
|
|
|
+ color: var(--el-color-warning);
|
|
|
+ }
|
|
|
+ .sort-part-gy-main-empty {
|
|
|
+ flex: 1;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ min-height: 200px;
|
|
|
+ }
|
|
|
+ .sort-gy-table {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ }
|
|
|
+ .sort-drag-col-hint {
|
|
|
+ font-size: 12px;
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
+ }
|
|
|
+ .sort-drag-handle {
|
|
|
+ color: var(--el-text-color-secondary);
|
|
|
+ cursor: move;
|
|
|
+ }
|
|
|
+ .list-lib-name-select {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ .sort-gy-num-input {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ :deep(.gy-detail-dialog.el-dialog) {
|
|
|
+ max-width: 100vw;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-dialog .el-dialog__header) {
|
|
|
+ padding: 12px 20px 8px;
|
|
|
+ margin-right: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-dialog .el-dialog__body) {
|
|
|
+ padding: 0;
|
|
|
+ overflow: hidden;
|
|
|
+ max-width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-header {
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ align-items: stretch;
|
|
|
+ gap: 12px;
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-title-row {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-title {
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-toolbar-row {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-actions-left {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ flex-wrap: nowrap;
|
|
|
+ gap: 10px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-exit {
|
|
|
+ flex-shrink: 0;
|
|
|
+ margin-left: auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-body {
|
|
|
+ width: 100%;
|
|
|
+ max-width: 100%;
|
|
|
+ height: calc(100vh - 80px);
|
|
|
+ padding: 20px;
|
|
|
+ overflow: auto;
|
|
|
+ box-sizing: border-box;
|
|
|
+ display: flex;
|
|
|
+ flex-direction: column;
|
|
|
+ min-width: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-dialog-body > .gy-detail-table-wrap {
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-table-wrap {
|
|
|
+ width: 100%;
|
|
|
+ max-width: 100%;
|
|
|
+ min-width: 0;
|
|
|
+ height: calc(100vh - 250px);
|
|
|
+ overflow: auto;
|
|
|
+ border: 1px solid #ebeef5;
|
|
|
+ border-radius: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-vxe-table {
|
|
|
+ width: 100%;
|
|
|
+ flex: 1;
|
|
|
+ min-height: 0;
|
|
|
+ --vxe-table-row-current-background-color: #ff80ff;
|
|
|
+ --vxe-table-row-hover-current-background-color: #ff80ff;
|
|
|
+ --vxe-ui-table-row-current-background-color: #ff80ff;
|
|
|
+ --vxe-table-row-height: 28px;
|
|
|
+ --vxe-table-cell-padding-left: 4px;
|
|
|
+ --vxe-table-cell-padding-right: 4px;
|
|
|
+ font-size: 13px;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--row),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--row),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--row) {
|
|
|
+ height: 28px !important;
|
|
|
+ line-height: 28px !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-header--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-footer--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--body-wrapper .vxe-body--cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--header-wrapper .vxe-header--cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--footer-wrapper .vxe-footer--cell) {
|
|
|
+ font-size: 13px;
|
|
|
+ height: 28px !important;
|
|
|
+ line-height: 28px !important;
|
|
|
+ padding: 0 4px !important;
|
|
|
+ vertical-align: middle !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 单元格内容垂直居中,编辑框贴齐格子 */
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--column .vxe-cell) {
|
|
|
+ display: flex !important;
|
|
|
+ align-items: center !important;
|
|
|
+ height: 100% !important;
|
|
|
+ min-height: 28px !important;
|
|
|
+ max-height: 28px !important;
|
|
|
+ overflow: hidden !important;
|
|
|
+ box-sizing: border-box !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* align=center / 固定操作列:水平居中 */
|
|
|
+ :deep(.gy-detail-vxe-table .col--center .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-header--column.col--center .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--column.col--center .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-footer--column.col--center .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .col--fixed-right .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-header--column.col--fixed-right .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--column.col--fixed-right .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-footer--column.col--fixed-right .vxe-cell) {
|
|
|
+ justify-content: center !important;
|
|
|
+ text-align: center !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-status-cell,
|
|
|
+ .gy-detail-action-cell {
|
|
|
+ width: 100%;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell),
|
|
|
+ :deep(.gy-detail-vxe-table .col--checkbox) {
|
|
|
+ text-align: center !important;
|
|
|
+ justify-content: center !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--checkbox),
|
|
|
+ :deep(.gy-detail-vxe-table .col--checkbox .vxe-checkbox--icon),
|
|
|
+ :deep(.gy-detail-vxe-table .col--checkbox .vxe-cell--title) {
|
|
|
+ margin-left: auto !important;
|
|
|
+ margin-right: auto !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-table-wrap ::-webkit-scrollbar,
|
|
|
+ .gy-detail-vxe-table ::-webkit-scrollbar,
|
|
|
+ .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar,
|
|
|
+ .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar {
|
|
|
+ display: block !important;
|
|
|
+ width: 14px;
|
|
|
+ height: 14px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-table-wrap ::-webkit-scrollbar-track,
|
|
|
+ .gy-detail-vxe-table ::-webkit-scrollbar-track,
|
|
|
+ .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-track,
|
|
|
+ .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-track {
|
|
|
+ background: #f1f1f1;
|
|
|
+ border-radius: 7px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-table-wrap ::-webkit-scrollbar-thumb,
|
|
|
+ .gy-detail-vxe-table ::-webkit-scrollbar-thumb,
|
|
|
+ .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb,
|
|
|
+ .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb {
|
|
|
+ background: #ccc;
|
|
|
+ border-radius: 7px;
|
|
|
+ border: 3px solid #f1f1f1;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-table-wrap ::-webkit-scrollbar-thumb:hover,
|
|
|
+ .gy-detail-vxe-table ::-webkit-scrollbar-thumb:hover,
|
|
|
+ .gy-detail-vxe-table .vxe-table--body-wrapper::-webkit-scrollbar-thumb:hover,
|
|
|
+ .gy-detail-vxe-table .vxe-table--header-wrapper::-webkit-scrollbar-thumb:hover {
|
|
|
+ background: #999;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper) {
|
|
|
+ z-index: 4;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .col--fixed-right) {
|
|
|
+ background-color: #fff;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-right),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-footer--row .col--fixed-left) {
|
|
|
+ background-color: #f5f7fa;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-cell {
|
|
|
+ min-height: 24px;
|
|
|
+ height: 24px;
|
|
|
+ line-height: 24px;
|
|
|
+ padding: 0 4px;
|
|
|
+ cursor: text;
|
|
|
+ border-radius: 2px;
|
|
|
+ overflow: hidden;
|
|
|
+ text-overflow: ellipsis;
|
|
|
+ white-space: nowrap;
|
|
|
+ text-align: center;
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
+ box-sizing: border-box;
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-cell--wide {
|
|
|
+ white-space: nowrap;
|
|
|
+ line-height: 24px;
|
|
|
+ min-height: 24px;
|
|
|
+ height: 24px;
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: flex-start;
|
|
|
+ text-align: left;
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-cell:hover {
|
|
|
+ background: #f5f7fa;
|
|
|
+ box-shadow: inset 0 0 0 1px #dcdfe6;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-split-process-name {
|
|
|
+ color: #f56c6c;
|
|
|
+ font-weight: 600;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-cell-input {
|
|
|
+ width: 100%;
|
|
|
+ flex: 1;
|
|
|
+ min-width: 0;
|
|
|
+ position: relative;
|
|
|
+ z-index: 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-cell-select {
|
|
|
+ display: block;
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-vxe-table .gy-detail-cell-select .el-select__wrapper {
|
|
|
+ min-height: 24px !important;
|
|
|
+ height: 24px !important;
|
|
|
+ padding: 0 6px;
|
|
|
+ box-shadow: 0 0 0 1px var(--el-color-primary) inset;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-vxe-table .gy-detail-cell-input .el-input__wrapper {
|
|
|
+ min-height: 24px !important;
|
|
|
+ height: 24px !important;
|
|
|
+ padding: 0 6px;
|
|
|
+ box-shadow: 0 0 0 1px var(--el-color-primary) inset;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-vxe-table .gy-detail-cell-input .el-input__inner {
|
|
|
+ height: 22px !important;
|
|
|
+ line-height: 22px !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .el-button--small) {
|
|
|
+ --el-button-size: 20px;
|
|
|
+ height: 20px;
|
|
|
+ padding: 0 6px;
|
|
|
+ font-size: 12px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-vxe-table .vxe-body--row.row--current .gy-detail-cell:hover {
|
|
|
+ background: rgba(255, 255, 255, 0.35);
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 仅点击当前行显示 #ff80ff,勾选复选框不高亮行背景 */
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.row--current),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.is--current) {
|
|
|
+ background-color: #ff80ff !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.row--current > .vxe-body--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.row--current.row--hover > .vxe-body--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.is--current > .vxe-body--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--fixed-left-wrapper .vxe-body--row.row--current > .vxe-body--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-table--fixed-right-wrapper .vxe-body--row.row--current > .vxe-body--column) {
|
|
|
+ background-color: #ff80ff !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.row--checked:not(.row--current) > .vxe-body--column),
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.is--checked:not(.is--current) > .vxe-body--column) {
|
|
|
+ background-color: #fff !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ :deep(.gy-detail-vxe-table .vxe-body--row.row--current .el-input__wrapper) {
|
|
|
+ background-color: transparent !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-col-header {
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ gap: 4px;
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-btn {
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ justify-content: center;
|
|
|
+ width: 22px;
|
|
|
+ height: 22px;
|
|
|
+ cursor: pointer;
|
|
|
+ color: #909399;
|
|
|
+ border-radius: 2px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-btn:hover,
|
|
|
+ .gy-detail-filter-btn.is-active {
|
|
|
+ color: var(--el-color-primary);
|
|
|
+ background: #ecf5ff;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-options {
|
|
|
+ max-height: 220px;
|
|
|
+ overflow-x: hidden;
|
|
|
+ overflow-y: auto;
|
|
|
+ margin-bottom: 4px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-panel .el-checkbox {
|
|
|
+ display: flex;
|
|
|
+ margin-right: 0;
|
|
|
+ margin-bottom: 6px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-actions {
|
|
|
+ display: flex;
|
|
|
+ justify-content: space-between;
|
|
|
+ align-items: center;
|
|
|
+ margin-top: 4px;
|
|
|
+ padding-top: 8px;
|
|
|
+ border-top: 1px solid #ebeef5;
|
|
|
+ background: #fff;
|
|
|
+ position: relative;
|
|
|
+ z-index: 2;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-link {
|
|
|
+ color: var(--el-color-primary);
|
|
|
+ font-size: 12px;
|
|
|
+ line-height: 1;
|
|
|
+ cursor: pointer;
|
|
|
+ user-select: none;
|
|
|
+ padding: 4px 2px;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-link:hover {
|
|
|
+ opacity: 0.85;
|
|
|
+ }
|
|
|
+
|
|
|
+</style>
|
|
|
+
|
|
|
+<style>
|
|
|
+ /* 导入工艺资料弹窗:标签与输入紧凑排列,避免 label 宽 + content margin-left 叠成大空隙 */
|
|
|
+ .import-process-dialog .el-dialog__body {
|
|
|
+ padding: 12px 24px 8px;
|
|
|
+ }
|
|
|
+ .import-process-dialog .import-process-body {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ .import-process-dialog .import-process-form {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ .import-process-dialog .import-process-form .el-form-item {
|
|
|
+ display: flex;
|
|
|
+ margin-bottom: 16px;
|
|
|
+ align-items: flex-start;
|
|
|
+ }
|
|
|
+ .import-process-dialog .import-process-form .el-form-item__label {
|
|
|
+ flex: 0 0 96px !important;
|
|
|
+ width: 96px !important;
|
|
|
+ max-width: 96px !important;
|
|
|
+ justify-content: flex-end;
|
|
|
+ text-align: right;
|
|
|
+ padding-right: 8px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ white-space: nowrap;
|
|
|
+ }
|
|
|
+ .import-process-dialog .import-process-form .el-form-item__content,
|
|
|
+ .import-process-form .el-form-item__content {
|
|
|
+ margin-left: 0 !important;
|
|
|
+ flex: 1;
|
|
|
+ min-width: 0;
|
|
|
+ }
|
|
|
+ .import-process-dialog .import-process-upload {
|
|
|
+ width: 100%;
|
|
|
+ }
|
|
|
+ .import-process-dialog .import-process-upload .el-upload-list {
|
|
|
+ margin-top: 6px;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* 导入冲突左右对照弹窗(append-to-body):提示在表格上方通栏 */
|
|
|
+ .import-process-conflict-dialog .import-conflict-summary:empty {
|
|
|
+ display: none;
|
|
|
+ }
|
|
|
+ .import-process-conflict-dialog .import-conflict-summary {
|
|
|
+ margin-bottom: 12px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: #606266;
|
|
|
+ line-height: 1.5;
|
|
|
+ }
|
|
|
+ .import-process-conflict-dialog .import-conflict-summary strong {
|
|
|
+ color: #e6a23c;
|
|
|
+ font-size: 15px;
|
|
|
+ }
|
|
|
+ .import-process-conflict-dialog .import-process-tip {
|
|
|
+ width: 100%;
|
|
|
+ margin: 0 0 12px;
|
|
|
+ padding: 0;
|
|
|
+ font-size: 13px;
|
|
|
+ line-height: 1.7;
|
|
|
+ color: #f56c6c;
|
|
|
+ text-align: left;
|
|
|
+ }
|
|
|
+ .import-process-conflict-dialog .el-table .import-conflict-diff-row > td.el-table__cell {
|
|
|
+ background-color: #fef0f0 !important;
|
|
|
+ }
|
|
|
+ .import-process-conflict-dialog .el-table .import-conflict-diff-row:hover > td.el-table__cell {
|
|
|
+ background-color: #fde2e2 !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .process-production-dialog .el-dialog__header {
|
|
|
+ display: block;
|
|
|
+ width: 100%;
|
|
|
+ margin-right: 0;
|
|
|
+ padding: 16px 20px 12px;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+
|
|
|
+ .process-production-dialog .el-dialog__body {
|
|
|
+ padding: 0;
|
|
|
+ background: #fff;
|
|
|
+ }
|
|
|
+
|
|
|
+ .process-production-dialog-header {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ width: 100%;
|
|
|
+ box-sizing: border-box;
|
|
|
+ }
|
|
|
+
|
|
|
+ .process-production-dialog-title {
|
|
|
+ flex: 1;
|
|
|
+ font-size: 16px;
|
|
|
+ font-weight: 600;
|
|
|
+ color: #303133;
|
|
|
+ }
|
|
|
+
|
|
|
+ .process-production-dialog-close {
|
|
|
+ flex-shrink: 0;
|
|
|
+ margin-left: auto;
|
|
|
+ min-width: 56px;
|
|
|
+ font-weight: 500;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-popper {
|
|
|
+ z-index: 10050 !important;
|
|
|
+ pointer-events: auto;
|
|
|
+ padding: 8px 10px !important;
|
|
|
+ }
|
|
|
+
|
|
|
+ .gy-detail-filter-popper .gy-detail-filter-panel {
|
|
|
+ pointer-events: auto;
|
|
|
+ }
|
|
|
+
|
|
|
+ .el-message-box .gy-split-process-name {
|
|
|
+ color: #f56c6c;
|
|
|
+ font-weight: 600;
|
|
|
+ }
|
|
|
+</style>
|
|
|
|