plm前端
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1816 lines
58 KiB

3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
3 years ago
  1. <template>
  2. <div class="mod-config">
  3. <!-- 查询条件 -->
  4. <el-form :inline="true" label-position="top" :model="searchData" @keyup.enter.native="getDataList()">
  5. <el-form-item :label="'物料编码'">
  6. <el-input v-model="searchData.partNo" clearable style="width: 120px"></el-input>
  7. </el-form-item>
  8. <el-form-item :label="'物料名称'">
  9. <el-input v-model="searchData.partDesc" clearable style="width: 120px"></el-input>
  10. </el-form-item>
  11. <el-form-item :label="' '">
  12. <el-button @click="getDataList()">查询</el-button>
  13. <el-button type="primary" @click="addModal()">新增</el-button>
  14. <el-button type="primary" @click="delModal()">删除</el-button>
  15. <download-excel
  16. :fields="fields()"
  17. :data="exportData"
  18. type="xls"
  19. :name="exportName"
  20. :header="exportHeader"
  21. :footer="exportFooter"
  22. :fetch="createExportData"
  23. :before-generate="startDownload"
  24. :before-finish="finishDownload"
  25. worksheet="导出信息"
  26. class="el-button el-button--primary el-button--medium">
  27. {{ "导出" }}
  28. </download-excel>
  29. </el-form-item>
  30. </el-form>
  31. <!-- 材料列表 -->
  32. <el-table
  33. :height="height"
  34. :data="dataList"
  35. border
  36. @selection-change="selectionBom"
  37. v-loading="dataListLoading"
  38. style="width: 100%;">
  39. <el-table-column
  40. type="selection"
  41. header-align="center"
  42. align="center"
  43. :selectable="selectFlag"
  44. width="50">
  45. </el-table-column>
  46. <el-table-column
  47. v-for="(item,index) in columnList" :key="index"
  48. :sortable="item.columnSortable"
  49. :prop="item.columnProp"
  50. :header-align="item.headerAlign"
  51. :show-overflow-tooltip="item.showOverflowTooltip"
  52. :align="item.align"
  53. :fixed="item.fixed === ''?false:item.fixed"
  54. :min-width="item.columnWidth"
  55. :label="item.columnLabel">
  56. <template slot-scope="scope">
  57. <span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  58. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  59. </template>
  60. </el-table-column>
  61. <el-table-column
  62. fixed="right"
  63. header-align="center"
  64. align="center"
  65. width="100"
  66. label="操作">
  67. <template slot-scope="scope">
  68. <a type="text" size="small" @click="updateModal(scope.row)">编辑</a>
  69. </template>
  70. </el-table-column>
  71. </el-table>
  72. <!-- 复选统计 -->
  73. <selectDiv ref="selectDiv"></selectDiv>
  74. <!-- 分页插件 -->
  75. <el-pagination style="margin-top: 0px"
  76. @size-change="sizeChangeHandle"
  77. @current-change="currentChangeHandle"
  78. :current-page="pageIndex"
  79. :page-sizes="[20, 50, 100, 200, 500]"
  80. :page-size="pageSize"
  81. :total="totalPage"
  82. layout="total, sizes, prev, pager, next, jumper">
  83. </el-pagination>
  84. <!-- bom新增/编辑模态框 -->
  85. <el-dialog :close-on-click-modal="false" v-drag :visible.sync="modalFlag" width="1000px">
  86. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 5px">
  87. <el-form-item prop="partNo" :rules="rules.partNo">
  88. <span v-if="!modalDisableFlag" slot="label" @click="queryPartList()"><a herf="#">物料编码</a></span>
  89. <span v-if="modalDisableFlag" slot="label">物料编码</span>
  90. <el-input v-model="modalData.partNo" :disabled="modalDisableFlag" style="width: 221px"></el-input>
  91. </el-form-item>
  92. <el-form-item :label="'物料名称'" prop="partDesc" :rules="rules.partDesc">
  93. <el-input v-model="modalData.partDesc" disabled style="width: 221px"></el-input>
  94. </el-form-item>
  95. <el-form-item :label="'制造类型'" prop="bomType" :rules="rules.bomType">
  96. <el-select v-model="modalData.bomType" :disabled="modalDisableFlag" style="width: 142px">
  97. <el-option label="制造" value="manufacturing"></el-option>
  98. </el-select>
  99. </el-form-item>
  100. <el-form-item :label="'类型'" prop="typeFlag" :rules="rules.typeFlag">
  101. <el-select v-model="modalData.typeFlag" style="width: 142px">
  102. <el-option label="BOM" value="B"></el-option>
  103. <el-option label="配方" value="F"></el-option>
  104. </el-select>
  105. </el-form-item>
  106. <el-form-item v-if="!modalDisableFlag">
  107. <el-button type="primary" @click="saveBomHeader()" style="margin-top: 23px;width: 142px">保存</el-button>
  108. </el-form-item>
  109. </el-form>
  110. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  111. <el-form-item label="开始时间" prop="effPhaseInDate" :rules="rules.effPhaseInDate">
  112. <el-date-picker
  113. style="width: 221px"
  114. v-model="modalData.effPhaseInDate"
  115. type="datetime"
  116. value-format="yyyy-MM-dd HH:mm:ss"
  117. format="yyyy-MM-dd HH:mm:ss"
  118. placeholder="请选择时间"
  119. :editable=false>
  120. </el-date-picker>
  121. </el-form-item>
  122. <el-form-item label="结束时间" prop="effPhaseOutDate" :rules="rules.effPhaseOutDate">
  123. <el-date-picker
  124. style="width: 221px"
  125. v-model="modalData.effPhaseOutDate"
  126. type="datetime"
  127. value-format="yyyy-MM-dd HH:mm:ss"
  128. format="yyyy-MM-dd HH:mm:ss"
  129. placeholder="请选择时间"
  130. :editable=false>
  131. </el-date-picker>
  132. </el-form-item>
  133. <el-form-item :label="'BOM版本号'" prop="engChgLevel" :rules="rules.engChgLevel">
  134. <el-input v-model="modalData.engChgLevel" :disabled="modalDisableFlag" style="width: 142px"></el-input>
  135. </el-form-item>
  136. <el-form-item :label="'工程版本号'">
  137. <el-input v-model="modalData.engRevision" style="width: 142px"></el-input>
  138. </el-form-item>
  139. <el-form-item :label="'净重'">
  140. <el-input v-model="modalData.netWeight" type="number" style="width: 141px"></el-input>
  141. </el-form-item>
  142. </el-form>
  143. <el-form :inline="true" label-position="top" :model="modalData" style="margin-left: 7px;margin-top: -5px;">
  144. <el-form-item label="备注">
  145. <el-input type="textarea" v-model="modalData.noteText" :rows="3" resize='none' maxlength="300" show-word-limit style="width: 925px;height: 20px"></el-input>
  146. </el-form-item>
  147. </el-form>
  148. <el-tabs v-model="detailTable" style="margin-top: 65px; width: 100%; min-height: 120px" type="border-card" @tab-click="tabDetailClick" class="detail-tab">
  149. <!-- BOM明细信息页签 -->
  150. <el-tab-pane label="Product Structure" name="bom_detail">
  151. <el-form label-position="top" style="margin-top: -10px">
  152. <el-form-item>
  153. <el-button type="primary" @click="saveBomDetail()" style="margin-left: 7px">新增</el-button>
  154. <el-button type="primary" @click="deleteBomDetail()">删除</el-button>
  155. </el-form-item>
  156. </el-form>
  157. <el-form :inline="true" label-position="top" :model="detailData" :rules="rules" style="margin-left: 7px">
  158. <el-form-item :label="'替代编码'" prop="alternativeNo" :rules="rules.alternativeNo">
  159. <el-select v-model="detailData.alternativeNo" @change="alternativeChange()" style="width: 221px">
  160. <el-option
  161. v-for = "(i, index) in detailDataList"
  162. :key = "index"
  163. :label = "i.alternativeNo"
  164. :value = "i.alternativeNo">
  165. </el-option>
  166. </el-select>
  167. </el-form-item>
  168. <el-form-item :label="'替代名称'">
  169. <el-input v-model="detailData.alternativeDescription" disabled style="width: 221px"></el-input>
  170. </el-form-item>
  171. <el-form-item :label="'最小订单数'">
  172. <el-input v-model="detailData.minLotQty" type="number" style="width: 221px"></el-input>
  173. </el-form-item>
  174. </el-form>
  175. <el-form :inline="true" label-position="top" :model="detailData" style="margin-left: 7px">
  176. <el-form-item label="备注">
  177. <el-input type="textarea" v-model="detailData.detailNoteText" :rows="3" resize='none' maxlength="300" show-word-limit style="width: 925px;height: 20px"></el-input>
  178. </el-form-item>
  179. </el-form>
  180. </el-tab-pane>
  181. </el-tabs>
  182. <el-tabs v-model="subDetailTable" style="width: 100%; min-height: 330px" type="border-card" @tab-click="tabSubDetailClick" class="sub_detail-tab">
  183. <!-- BOM子明细信息页签 -->
  184. <el-tab-pane label="Components" name="bom_sub_detail">
  185. <el-form label-position="top" style="margin-top: 5px">
  186. <el-form-item>
  187. <el-button type="primary" @click="queryComponentPartList()" style="margin-left: 7px">新增</el-button>
  188. <el-button type="primary" @click="deleteComponentPart()">删除</el-button>
  189. </el-form-item>
  190. </el-form>
  191. <!-- <div class="rq">-->
  192. <el-table
  193. :data="subDetailList"
  194. height="256px"
  195. border
  196. ref="componentTable"
  197. v-loading="dataListLoading"
  198. @row-click="componentClickRow"
  199. :row-class-name="rowClassName"
  200. @selection-change="componentSelectionChange"
  201. style="width:100%">
  202. <el-table-column type="selection" align="center" width="50"></el-table-column>
  203. <el-table-column
  204. v-for="(item,index) in columnSubDetailList" :key="index"
  205. :sortable="item.columnSortable"
  206. :prop="item.columnProp"
  207. :header-align="item.headerAlign"
  208. :show-overflow-tooltip="item.showOverflowTooltip"
  209. :align="item.align"
  210. :fixed="item.fixed===''?false:item.fixed"
  211. :min-width="item.columnWidth"
  212. :label="item.columnLabel">
  213. <template slot-scope="scope">
  214. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  215. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  216. </template>
  217. </el-table-column>
  218. <el-table-column
  219. fixed="right"
  220. header-align="center"
  221. align="center"
  222. width="100"
  223. label="操作">
  224. <template slot-scope="scope">
  225. <a type="text" size="small" @click="updateModal(scope.row)">编辑</a>
  226. </template>
  227. </el-table-column>
  228. <!-- <el-table-column-->
  229. <!-- prop=""-->
  230. <!-- header-align="center"-->
  231. <!-- align="right"-->
  232. <!-- min-width="80"-->
  233. <!-- label="单位用量">-->
  234. <!-- <template slot-scope="scope">-->
  235. <!-- <el-input :ref="`qtyPerAssembly${scope.$index}`" v-model="scope.row.qtyPerAssembly" @keyup.enter.native="focusNextInput(scope.$index, 'qtyPerAssembly')" type="number"></el-input>-->
  236. <!-- </template>-->
  237. <!-- </el-table-column>-->
  238. <!-- <el-table-column-->
  239. <!-- prop=""-->
  240. <!-- header-align="center"-->
  241. <!-- align="right"-->
  242. <!-- min-width="80"-->
  243. <!-- label="调机量">-->
  244. <!-- <template slot-scope="scope">-->
  245. <!-- <el-input :ref="`componentScrap${scope.$index}`" v-model="scope.row.componentScrap" @keyup.enter.native="focusNextInput(scope.$index, 'componentScrap')" type="number"></el-input>-->
  246. <!-- </template>-->
  247. <!-- </el-table-column>-->
  248. <!-- <el-table-column-->
  249. <!-- prop=""-->
  250. <!-- header-align="center"-->
  251. <!-- align="right"-->
  252. <!-- min-width="80"-->
  253. <!-- label="损耗率">-->
  254. <!-- <template slot-scope="scope">-->
  255. <!-- <el-input :ref="`shrinkageFactor${scope.$index}`" v-model="scope.row.shrinkageFactor" @keyup.enter.native="focusNextInput(scope.$index, 'shrinkageFactor')" type="number"></el-input>-->
  256. <!-- </template>-->
  257. <!-- </el-table-column>-->
  258. <!-- <el-table-column-->
  259. <!-- prop="printUnitName"-->
  260. <!-- header-align="center"-->
  261. <!-- align="center"-->
  262. <!-- min-width="60"-->
  263. <!-- label="单位">-->
  264. <!-- </el-table-column>-->
  265. <!-- <el-table-column-->
  266. <!-- prop=""-->
  267. <!-- header-align="center"-->
  268. <!-- align="right"-->
  269. <!-- min-width="80"-->
  270. <!-- label="生产属性">-->
  271. <!-- <template slot-scope="scope">-->
  272. <!-- <el-select v-model="scope.row.issueType">-->
  273. <!-- <el-option label="领退料倒冲" value="A"></el-option>-->
  274. <!-- <el-option label="工单倒冲" value="B"></el-option>-->
  275. <!-- <el-option label="生产订单倒冲" value="C"></el-option>-->
  276. <!-- <el-option label="投料倒冲" value="D"></el-option>-->
  277. <!-- <el-option label="批次倒冲" value="E"></el-option>-->
  278. <!-- <el-option label="销售订单倒冲" value="F"></el-option>-->
  279. <!-- <el-option label="项目倒冲" value="G"></el-option>-->
  280. <!-- </el-select>-->
  281. <!-- </template>-->
  282. <!-- </el-table-column>-->
  283. </el-table>
  284. <!-- </div>-->
  285. </el-tab-pane>
  286. </el-tabs>
  287. <el-footer style="height:30px;margin-top:20px;text-align:center">
  288. <el-button type="primary" @click="saveData()">保存</el-button>
  289. <el-button type="primary" @click="closeModal()">关闭</el-button>
  290. </el-footer>
  291. </el-dialog>
  292. <el-dialog title="新增替代" :close-on-click-modal="false" v-drag :visible.sync="saveDetailModalFlag" width="650px">
  293. <el-form :inline="true" label-position="top" :model="saveDetailData" :rules="detailRules" style="margin-left: 5px">
  294. <el-form-item :label="'替代编码'" prop="alternativeNo" :rules="detailRules.alternativeNo">
  295. <el-input v-model="saveDetailData.alternativeNo" style="width: 221px"></el-input>
  296. </el-form-item>
  297. <el-form-item :label="'替代名称'" prop="alternativeDescription" :rules="detailRules.alternativeDescription">
  298. <el-input v-model="saveDetailData.alternativeDescription" style="width: 221px"></el-input>
  299. </el-form-item>
  300. <el-form-item :label="'最小订单数'" prop="minLotQty" :rules="detailRules.minLotQty">
  301. <el-input v-model="saveDetailData.minLotQty" type="number" style="width: 120px"></el-input>
  302. </el-form-item>
  303. </el-form>
  304. <el-form :inline="true" label-position="top" :model="saveDetailData" style="margin-left: 5px">
  305. <el-form-item label="备注">
  306. <el-input type="textarea" v-model="saveDetailData.detailNoteText" :rows="3" resize='none' maxlength="300" show-word-limit style="width: 600px;height: 20px"></el-input>
  307. </el-form-item>
  308. </el-form>
  309. <el-footer style="height:35px;margin-top:65px;text-align:center">
  310. <el-button type="primary" @click="detailDataSave()">保存</el-button>
  311. <el-button type="primary" @click="saveDetailModalFlag = false">关闭</el-button>
  312. </el-footer>
  313. </el-dialog>
  314. <!-- 物料模态框 -->
  315. <el-dialog title="物料清单" :close-on-click-modal="false" v-drag :visible.sync="partModelFlag" width="520px">
  316. <div class="rq">
  317. <el-form :inline="true" label-position="top" :model="partData">
  318. <el-form-item :label="'物料编码'">
  319. <el-input v-model="partData.partNo" clearable style="width: 120px"></el-input>
  320. </el-form-item>
  321. <el-form-item :label="'物料名称'">
  322. <el-input v-model="partData.partDesc" clearable style="width: 120px"></el-input>
  323. </el-form-item>
  324. <el-form-item :label="' '">
  325. <el-button type="primary" @click="queryPartList()">查询</el-button>
  326. </el-form-item>
  327. </el-form>
  328. <el-table
  329. :height="300"
  330. :data="partList"
  331. @row-dblclick="getRowData"
  332. border
  333. v-loading="dataListLoading"
  334. style="width: 100%;">
  335. <el-table-column
  336. v-for="(item,index) in partColumnList" :key="index"
  337. :sortable="item.columnSortable"
  338. :prop="item.columnProp"
  339. :header-align="item.headerAlign"
  340. :show-overflow-tooltip="item.showOverflowTooltip"
  341. :align="item.align"
  342. :fixed="item.fixed==''?false:item.fixed"
  343. :min-width="item.columnWidth"
  344. :label="item.columnLabel">
  345. <template slot-scope="scope">
  346. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  347. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  348. </template>
  349. </el-table-column>
  350. </el-table>
  351. </div>
  352. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  353. <el-button type="primary" @click="partModelFlag=false">关闭</el-button>
  354. </el-footer>
  355. </el-dialog>
  356. <!-- 子明细物料模态框 -->
  357. <el-dialog title="物料清单" :close-on-click-modal="false" v-drag :visible.sync="componentPartModelFlag" width="520px">
  358. <div class="rq">
  359. <el-form :inline="true" label-position="top" :model="componentPartData">
  360. <el-form-item :label="'物料编码'">
  361. <el-input v-model="componentPartData.partNo" clearable style="width: 120px"></el-input>
  362. </el-form-item>
  363. <el-form-item :label="'物料名称'">
  364. <el-input v-model="componentPartData.partDesc" clearable style="width: 120px"></el-input>
  365. </el-form-item>
  366. <el-form-item :label="' '">
  367. <el-button type="primary" @click="queryComponentPartList()">查询</el-button>
  368. </el-form-item>
  369. </el-form>
  370. <el-table
  371. :height="300"
  372. :data="componentPartList"
  373. ref="componentPartTable"
  374. @row-click="componentPartClickRow"
  375. @selection-change="selectionComponentPart"
  376. :row-key="getRowKeys"
  377. border
  378. v-loading="dataListLoading"
  379. style="width: 100%;">
  380. <el-table-column
  381. type="selection"
  382. header-align="center"
  383. align="center"
  384. :reserve-selection="true"
  385. width="50">
  386. </el-table-column>
  387. <el-table-column
  388. v-for="(item,index) in componentPartColumnList" :key="index"
  389. :sortable="item.columnSortable"
  390. :prop="item.columnProp"
  391. :header-align="item.headerAlign"
  392. :show-overflow-tooltip="item.showOverflowTooltip"
  393. :align="item.align"
  394. :fixed="item.fixed==''?false:item.fixed"
  395. :min-width="item.columnWidth"
  396. :label="item.columnLabel">
  397. <template slot-scope="scope">
  398. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  399. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  400. </template>
  401. </el-table-column>
  402. </el-table>
  403. </div>
  404. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  405. <el-button type="primary" @click="confirmComponentPart()">确认</el-button>
  406. <el-button type="primary" @click="componentPartModelFlag=false">关闭</el-button>
  407. </el-footer>
  408. </el-dialog>
  409. <!-- chooseList模态框 -->
  410. <ChooseList ref="baseList" @getBaseData="getBaseData"></ChooseList>
  411. </div>
  412. </template>
  413. <script>
  414. import {
  415. bomManagementSearch, // bom列表查询
  416. bomManagementSave, // bom新增
  417. bomManagementEdit, // bom编辑
  418. bomManagementDelete, // bom删除
  419. queryBomHeader, // 查询bom主信息
  420. saveBomHeader, // 新增bom主信息
  421. queryBomDetail, // 查bom明细
  422. bomDetailSave, // bom明细新增
  423. bomDetailDelete, // bom明细删除
  424. queryPartList, // 查询物料清单
  425. queryBomComponent, // 查bom子明细
  426. saveBomComponent, // 新增bom子明细
  427. deleteBomComponent, // 删除bom子明细
  428. } from '@/api/part/bomManagement.js'
  429. import ChooseList from '@/views/modules/common/Chooselist'
  430. import dayjs from "dayjs";
  431. export default {
  432. // 组件
  433. components: {
  434. ChooseList
  435. },
  436. // 监听
  437. watch: {
  438. searchData: {
  439. deep: true,
  440. handler: function (newV, oldV) {
  441. this.searchData.partNo = this.searchData.partNo.toUpperCase()
  442. }
  443. },
  444. saveDetailData: {
  445. deep: true,
  446. handler: function (newV, oldV) {
  447. this.saveDetailData.alternativeNo = this.saveDetailData.alternativeNo.toUpperCase()
  448. }
  449. }
  450. },
  451. // 对象
  452. data () {
  453. return {
  454. // 导出
  455. exportData: [],
  456. exportName: 'bom物料列表' + this.dayjs().format('YYYYMMDDHHmmss'),
  457. exportHeader: ['bom物料列表'],
  458. exportFooter: [],
  459. resultList: [],
  460. // ======== 行高 ========
  461. height: 200,
  462. // ======== 分页 ========
  463. pageIndex: 1,
  464. pageSize: 50,
  465. totalPage: 0,
  466. selectedDataNum: 0,
  467. // 条件查询
  468. searchData: {
  469. site: this.$store.state.user.site,
  470. partNo: '',
  471. partDesc: '',
  472. page: 1,
  473. limit: 10
  474. },
  475. // 其它
  476. dataListLoading: false,
  477. // 初始页签
  478. detailTable: 'bom_detail',
  479. subDetailTable: 'bom_sub_detail',
  480. // ======== 数据对象 ========
  481. modalData: {
  482. flag: '',
  483. title: '',
  484. site: this.$store.state.user.site,
  485. partNo: '',
  486. partDesc: '',
  487. engChgLevel: '',
  488. bomType: '',
  489. noteText: '',
  490. effPhaseInDate: '',
  491. effPhaseOutDate: '',
  492. engRevision: '',
  493. typeFlag: '',
  494. netWeight: '',
  495. createDate: '',
  496. createBy: '',
  497. updateDate: '',
  498. updateBy: ''
  499. },
  500. detailData: {
  501. site: this.$store.state.user.site,
  502. partNo: '',
  503. engChgLevel: '',
  504. bomType: '',
  505. alternativeNo: '',
  506. alternativeDescription: '',
  507. minLotQty: '',
  508. defaultFlag: '',
  509. detailNoteText: '',
  510. createDate: '',
  511. createBy: '',
  512. updateDate: '',
  513. updateBy: ''
  514. },
  515. subDetailData: {
  516. site: this.$store.state.user.site,
  517. partNo: '',
  518. engChgLevel: '',
  519. bomType: '',
  520. alternativeNo: '',
  521. componentPart: '',
  522. componentPartDesc: '',
  523. printUnit: '',
  524. qtyPerAssembly: '',
  525. componentScrap: '',
  526. issueType: '',
  527. shrinkageFactor: '',
  528. lineItemNo: '',
  529. operationNo: '',
  530. issueToLoc: '',
  531. noteText: '',
  532. createDate: '',
  533. createBy: '',
  534. updateDate: '',
  535. updateBy: ''
  536. },
  537. partData: {
  538. site: this.$store.state.user.site,
  539. partNo: '',
  540. partDesc: '',
  541. },
  542. componentPartData: {
  543. site: this.$store.state.user.site,
  544. partNo: '',
  545. partDesc: '',
  546. },
  547. saveDetailData: {
  548. site: this.$store.state.user.site,
  549. partNo: '',
  550. engChgLevel: '',
  551. bomType: '',
  552. alternativeNo: '',
  553. alternativeDescription: '',
  554. minLotQty: '',
  555. defaultFlag: '',
  556. detailNoteText: '',
  557. createDate: '',
  558. createBy: '',
  559. updateDate: '',
  560. updateBy: ''
  561. },
  562. // ======== 数据列表 ========
  563. dataList: [],
  564. partList: [],
  565. componentPartList: [],
  566. componentPartSelections: [],
  567. subDetailList: [],
  568. detailDataList: [],
  569. checkedDetail: [],
  570. // ======== 列表表头 ========
  571. columnList: [
  572. {
  573. userId: this.$store.state.user.name,
  574. functionId: 104002,
  575. serialNumber: '104002Table1PartNo',
  576. tableId: '104002Table1',
  577. tableName: 'BOM信息表',
  578. columnProp: 'partNo',
  579. headerAlign: 'center',
  580. align: 'center',
  581. columnLabel: '物料编码',
  582. columnHidden: false,
  583. columnImage: false,
  584. columnSortable: false,
  585. sortLv: 0,
  586. status: true,
  587. fixed: '',
  588. columnWidth: 120
  589. },
  590. {
  591. userId: this.$store.state.user.name,
  592. functionId: 104002,
  593. serialNumber: '104002Table1PartDesc',
  594. tableId: '104002Table1',
  595. tableName: 'BOM信息表',
  596. columnProp: 'partDesc',
  597. headerAlign: 'center',
  598. align: 'left',
  599. columnLabel: '物料名称',
  600. columnHidden: false,
  601. columnImage: false,
  602. columnSortable: false,
  603. sortLv: 0,
  604. status: true,
  605. fixed: '',
  606. columnWidth: 120
  607. },
  608. {
  609. userId: this.$store.state.user.name,
  610. functionId: 104002,
  611. serialNumber: '104002Table1CreateDate',
  612. tableId: '104002Table1',
  613. tableName: 'BOM信息表',
  614. columnProp: 'createDate',
  615. headerAlign: 'center',
  616. align: 'center',
  617. columnLabel: '创建时间',
  618. columnHidden: false,
  619. columnImage: false,
  620. columnSortable: false,
  621. sortLv: 0,
  622. status: true,
  623. fixed: '',
  624. columnWidth: 160
  625. },
  626. {
  627. userId: this.$store.state.user.name,
  628. functionId: 104002,
  629. serialNumber: '104002Table1CreateBy',
  630. tableId: '104002Table1',
  631. tableName: 'BOM信息表',
  632. columnProp: 'createBy',
  633. headerAlign: 'center',
  634. align: 'center',
  635. columnLabel: '创建人',
  636. columnHidden: false,
  637. columnImage: false,
  638. columnSortable: false,
  639. sortLv: 0,
  640. status: true,
  641. fixed: '',
  642. columnWidth: 80
  643. },
  644. {
  645. userId: this.$store.state.user.name,
  646. functionId: 104002,
  647. serialNumber: '104002Table1UpdateDate',
  648. tableId: '104002Table1',
  649. tableName: 'BOM信息表',
  650. columnProp: 'updateDate',
  651. headerAlign: 'center',
  652. align: 'center',
  653. columnLabel: '更新时间',
  654. columnHidden: false,
  655. columnImage: false,
  656. columnSortable: false,
  657. sortLv: 0,
  658. status: true,
  659. fixed: '',
  660. columnWidth: 160
  661. },
  662. {
  663. userId: this.$store.state.user.name,
  664. functionId: 104002,
  665. serialNumber: '104002Table1UpdateBy',
  666. tableId: '104002Table1',
  667. tableName: 'BOM信息表',
  668. columnProp: 'updateBy',
  669. headerAlign: 'center',
  670. align: 'center',
  671. columnLabel: '更新人',
  672. columnHidden: false,
  673. columnImage: false,
  674. columnSortable: false,
  675. sortLv: 0,
  676. status: true,
  677. fixed: '',
  678. columnWidth: 80
  679. }
  680. ],
  681. partColumnList: [
  682. {
  683. columnProp: 'partNo',
  684. headerAlign: "center",
  685. align: "center",
  686. columnLabel: '物料编码',
  687. columnHidden: false,
  688. columnImage: false,
  689. columnSortable: false,
  690. sortLv: 0,
  691. status: true,
  692. fixed: '',
  693. },
  694. {
  695. columnProp: 'partDesc',
  696. headerAlign: "center",
  697. align: "center",
  698. columnLabel: '物料名称',
  699. columnHidden: false,
  700. columnImage: false,
  701. columnSortable: false,
  702. sortLv: 0,
  703. status: true,
  704. fixed: '',
  705. },
  706. ],
  707. componentPartColumnList: [
  708. {
  709. columnProp: 'partNo',
  710. headerAlign: "center",
  711. align: "center",
  712. columnLabel: '物料编码',
  713. columnHidden: false,
  714. columnImage: false,
  715. columnSortable: false,
  716. sortLv: 0,
  717. status: true,
  718. fixed: '',
  719. },
  720. {
  721. columnProp: 'partDesc',
  722. headerAlign: "center",
  723. align: "center",
  724. columnLabel: '物料名称',
  725. columnHidden: false,
  726. columnImage: false,
  727. columnSortable: false,
  728. sortLv: 0,
  729. status: true,
  730. fixed: '',
  731. }
  732. ],
  733. columnSubDetailList: [
  734. {
  735. userId: this.$store.state.user.name,
  736. functionId: 104002,
  737. serialNumber: '104002Table2ComponentPart',
  738. tableId: '104002Table2',
  739. tableName: 'BOM子物料表',
  740. columnProp: 'componentPart',
  741. headerAlign: 'center',
  742. align: 'center',
  743. columnLabel: '物料编码',
  744. columnHidden: false,
  745. columnImage: false,
  746. columnSortable: false,
  747. sortLv: 0,
  748. status: true,
  749. fixed: '',
  750. columnWidth: 120
  751. },
  752. {
  753. userId: this.$store.state.user.name,
  754. functionId: 104002,
  755. serialNumber: '104002Table2ComponentPartDesc',
  756. tableId: '104002Table2',
  757. tableName: 'BOM子物料表',
  758. columnProp: 'componentPartDesc',
  759. headerAlign: 'center',
  760. align: 'left',
  761. columnLabel: '物料名称',
  762. columnHidden: false,
  763. columnImage: false,
  764. columnSortable: false,
  765. sortLv: 0,
  766. status: true,
  767. fixed: '',
  768. columnWidth: 120
  769. },
  770. {
  771. userId: this.$store.state.user.name,
  772. functionId: 104002,
  773. serialNumber: '104002Table2QtyPerAssembly',
  774. tableId: '104002Table2',
  775. tableName: 'BOM子物料表',
  776. columnProp: 'qtyPerAssembly',
  777. headerAlign: 'center',
  778. align: 'right',
  779. columnLabel: '单位用量',
  780. columnHidden: false,
  781. columnImage: false,
  782. columnSortable: false,
  783. sortLv: 0,
  784. status: true,
  785. fixed: '',
  786. columnWidth: 80
  787. },
  788. {
  789. userId: this.$store.state.user.name,
  790. functionId: 104002,
  791. serialNumber: '104002Table2ComponentScrap',
  792. tableId: '104002Table2',
  793. tableName: 'BOM子物料表',
  794. columnProp: 'componentScrap',
  795. headerAlign: 'center',
  796. align: 'right',
  797. columnLabel: '调机量',
  798. columnHidden: false,
  799. columnImage: false,
  800. columnSortable: false,
  801. sortLv: 0,
  802. status: true,
  803. fixed: '',
  804. columnWidth: 80
  805. },
  806. {
  807. userId: this.$store.state.user.name,
  808. functionId: 104002,
  809. serialNumber: '104002Table2ShrinkageFactor',
  810. tableId: '104002Table2',
  811. tableName: 'BOM子物料表',
  812. columnProp: 'shrinkageFactor',
  813. headerAlign: 'center',
  814. align: 'right',
  815. columnLabel: '损耗率',
  816. columnHidden: false,
  817. columnImage: false,
  818. columnSortable: false,
  819. sortLv: 0,
  820. status: true,
  821. fixed: '',
  822. columnWidth: 80
  823. },
  824. {
  825. userId: this.$store.state.user.name,
  826. functionId: 104002,
  827. serialNumber: '104002Table2PrintUnitName',
  828. tableId: '104002Table2',
  829. tableName: 'BOM子物料表',
  830. columnProp: 'printUnitName',
  831. headerAlign: 'center',
  832. align: 'left',
  833. columnLabel: '单位',
  834. columnHidden: false,
  835. columnImage: false,
  836. columnSortable: false,
  837. sortLv: 0,
  838. status: true,
  839. fixed: '',
  840. columnWidth: 60
  841. },
  842. {
  843. userId: this.$store.state.user.name,
  844. functionId: 104002,
  845. serialNumber: '104002Table2IssueType',
  846. tableId: '104002Table2',
  847. tableName: 'BOM子物料表',
  848. columnProp: 'issueType',
  849. headerAlign: 'center',
  850. align: 'left',
  851. columnLabel: '生产属性',
  852. columnHidden: false,
  853. columnImage: false,
  854. columnSortable: false,
  855. sortLv: 0,
  856. status: true,
  857. fixed: '',
  858. columnWidth: 80
  859. },
  860. {
  861. userId: this.$store.state.user.name,
  862. functionId: 104002,
  863. serialNumber: '104002Table2OperationDesc',
  864. tableId: '104002Table2',
  865. tableName: 'BOM子物料表',
  866. columnProp: 'operationNo',
  867. headerAlign: 'center',
  868. align: 'left',
  869. columnLabel: '工序',
  870. columnHidden: false,
  871. columnImage: false,
  872. columnSortable: false,
  873. sortLv: 0,
  874. status: true,
  875. fixed: '',
  876. columnWidth: 80
  877. },
  878. {
  879. userId: this.$store.state.user.name,
  880. functionId: 104002,
  881. serialNumber: '104002Table2IssueToLoc',
  882. tableId: '104002Table2',
  883. tableName: 'BOM子物料表',
  884. columnProp: 'issueToLoc',
  885. headerAlign: 'center',
  886. align: 'left',
  887. columnLabel: '发料库位',
  888. columnHidden: false,
  889. columnImage: false,
  890. columnSortable: false,
  891. sortLv: 0,
  892. status: true,
  893. fixed: '',
  894. columnWidth: 80
  895. },
  896. {
  897. userId: this.$store.state.user.name,
  898. functionId: 104002,
  899. serialNumber: '104002Table2NoteText',
  900. tableId: '104002Table2',
  901. tableName: 'BOM子物料表',
  902. columnProp: 'componentNoteText',
  903. headerAlign: 'center',
  904. align: 'left',
  905. columnLabel: '备注',
  906. columnHidden: false,
  907. columnImage: false,
  908. columnSortable: false,
  909. sortLv: 0,
  910. status: true,
  911. fixed: '',
  912. columnWidth: 150
  913. },
  914. ],
  915. // ======== 必填规则 ========
  916. rules: {
  917. partNo: [
  918. {
  919. required: true,
  920. message: ' ',
  921. trigger: 'change'
  922. }
  923. ],
  924. partDesc: [
  925. {
  926. required: true,
  927. message: ' ',
  928. trigger: 'change'
  929. }
  930. ],
  931. bomType: [
  932. {
  933. required: true,
  934. message: ' ',
  935. trigger: 'change'
  936. }
  937. ],
  938. effPhaseInDate: [
  939. {
  940. required: true,
  941. message: ' ',
  942. trigger: 'change'
  943. }
  944. ],
  945. effPhaseOutDate: [
  946. {
  947. required: true,
  948. message: ' ',
  949. trigger: 'change'
  950. }
  951. ],
  952. engChgLevel: [
  953. {
  954. required: true,
  955. message: ' ',
  956. trigger: 'change'
  957. }
  958. ],
  959. alternativeNo: [
  960. {
  961. required: true,
  962. message: ' ',
  963. trigger: 'change'
  964. }
  965. ],
  966. typeFlag: [
  967. {
  968. required: true,
  969. message: ' ',
  970. trigger: 'change'
  971. }
  972. ]
  973. },
  974. detailRules: {
  975. alternativeNo: [
  976. {
  977. required: true,
  978. message: ' ',
  979. trigger: 'change'
  980. }
  981. ],
  982. alternativeDescription: [
  983. {
  984. required: true,
  985. message: ' ',
  986. trigger: 'change'
  987. }
  988. ],
  989. minLotQty: [
  990. {
  991. required: true,
  992. message: ' ',
  993. trigger: 'change'
  994. }
  995. ],
  996. },
  997. // ======== 复选数据集 ========
  998. bomSelections: [],
  999. // ======== 模态框开关控制 ========
  1000. modalFlag: false,
  1001. modalDisableFlag: false,
  1002. partModelFlag: false,
  1003. componentPartModelFlag: false,
  1004. saveDetailModalFlag :false
  1005. }
  1006. },
  1007. mounted () {
  1008. this.$nextTick(() => {
  1009. this.height = window.innerHeight - 180
  1010. })
  1011. },
  1012. created () {
  1013. this.getDataList()
  1014. },
  1015. // js
  1016. methods: {
  1017. // ======== 分页相关方法 ========
  1018. /**
  1019. * 每页数
  1020. * @param val
  1021. */
  1022. sizeChangeHandle (val) {
  1023. this.pageSize = val
  1024. this.pageIndex = 1
  1025. this.getDataList()
  1026. },
  1027. /**
  1028. * 当前页
  1029. * @param val
  1030. */
  1031. currentChangeHandle (val) {
  1032. this.pageIndex = val
  1033. this.getDataList()
  1034. },
  1035. // ======== 页签切换相关方法 ========
  1036. /**
  1037. * 明细页签选择替换
  1038. * @param tab
  1039. * @param event
  1040. */
  1041. tabDetailClick (tab, event) {
  1042. // 刷新列表数据
  1043. this.refreshDetailTable()
  1044. },
  1045. /**
  1046. * 子明细页签选择替换
  1047. * @param tab
  1048. * @param event
  1049. */
  1050. tabSubDetailClick (tab, event) {
  1051. // 刷新列表数据
  1052. this.refreshSubDetailTable()
  1053. },
  1054. /**
  1055. * 刷新明细页签的table数据
  1056. */
  1057. refreshDetailTable () {
  1058. if (this.detailTable === 'bom_detail') {
  1059. }
  1060. },
  1061. /**
  1062. * 刷新子明细页签的table数据
  1063. */
  1064. refreshSubDetailTable () {
  1065. if (this.subDetailTable === 'bom_sub_detail') {
  1066. }
  1067. },
  1068. // ======== 列表数据操作方法 ========
  1069. /**
  1070. * 未知
  1071. * @returns {boolean}
  1072. */
  1073. selectFlag () {
  1074. return true
  1075. },
  1076. /**
  1077. * 获取数据列表
  1078. */
  1079. getDataList () {
  1080. this.searchData.limit = this.pageSize
  1081. this.searchData.page = this.pageIndex
  1082. bomManagementSearch(this.searchData).then(({data}) => {
  1083. if (data.code === 0) {
  1084. this.dataList = data.page.list
  1085. this.pageIndex = data.page.currPage
  1086. this.pageSize = data.page.pageSize
  1087. this.totalPage = data.page.totalCount
  1088. this.$refs.selectDiv.setLengthAll( this.dataList.length)
  1089. }
  1090. this.dataListLoading = false
  1091. })
  1092. },
  1093. /**
  1094. * 复选列表信息
  1095. * @param val
  1096. */
  1097. selectionBom (val) {
  1098. this.bomSelections = val
  1099. this.$refs.selectDiv.setLengthselected(this.bomSelections.length)
  1100. },
  1101. // ======== 新增/编辑模态框 ========
  1102. /**
  1103. * bom新增模态框
  1104. */
  1105. addModal () {
  1106. this.modalData = {
  1107. flag: '1',
  1108. title: 'bom新增',
  1109. site: this.$store.state.user.site,
  1110. partNo: '',
  1111. partDesc: '',
  1112. engChgLevel: '',
  1113. bomType: '',
  1114. noteText: '',
  1115. effPhaseInDate: '',
  1116. effPhaseOutDate: '',
  1117. engRevision: '',
  1118. typeFlag: 'B',
  1119. netWeight: 0,
  1120. createBy: this.$store.state.user.name
  1121. }
  1122. this.detailData = {
  1123. site: this.$store.state.user.site,
  1124. partNo: '',
  1125. engChgLevel: '',
  1126. bomType: '',
  1127. alternativeNo: '',
  1128. alternativeDescription: '',
  1129. minLotQty: '',
  1130. defaultFlag: '',
  1131. detailNoteText: '',
  1132. createDate: '',
  1133. createBy: '',
  1134. updateDate: '',
  1135. updateBy: ''
  1136. }
  1137. this.subDetailList = []
  1138. this.modalDisableFlag = false
  1139. this.modalFlag = true
  1140. },
  1141. /**
  1142. * bom编辑模态框
  1143. */
  1144. async updateModal (row) {
  1145. this.modalData = {
  1146. flag: '2',
  1147. site: row.site,
  1148. partNo: row.partNo,
  1149. partDesc: row.partDesc,
  1150. engChgLevel: row.engChgLevel,
  1151. bomType: row.bomType,
  1152. noteText: row.noteText,
  1153. effPhaseInDate: row.effPhaseInDate,
  1154. effPhaseOutDate: row.effPhaseOutDate,
  1155. engRevision: row.engRevision,
  1156. typeFlag: row.typeFlag,
  1157. netWeight: row.netWeight,
  1158. updateBy: this.$store.state.user.name
  1159. }
  1160. // 查bom明细
  1161. queryBomDetail(this.modalData).then(({data}) => {
  1162. if (data && data.code === 0) {
  1163. this.detailDataList = data.rows.detailList
  1164. this.subDetailList = data.rows.componentList
  1165. this.detailData = data.rows.detailData
  1166. this.modalDisableFlag = true
  1167. this.modalFlag = true
  1168. } else {
  1169. this.$alert(data.msg, '错误', {
  1170. confirmButtonText: '确定'
  1171. })
  1172. }
  1173. })
  1174. },
  1175. // ======== 新增/编辑/删除方法 ========
  1176. /**
  1177. * bom新增/编辑
  1178. */
  1179. saveData () {
  1180. if (this.modalData.partNo === '' || this.modalData.partNo == null) {
  1181. this.$message.warning('请选择物料编码!')
  1182. return
  1183. }
  1184. if (this.modalData.partDesc === '' || this.modalData.partDesc == null) {
  1185. this.$message.warning('请选择物料名称!')
  1186. return
  1187. }
  1188. if (this.modalData.bomType === '' || this.modalData.bomType == null) {
  1189. this.$message.warning('请选择制造类型!')
  1190. return
  1191. }
  1192. if (this.modalData.effPhaseInDate === '' || this.modalData.effPhaseInDate == null) {
  1193. this.$message.warning('请选择开始时间!')
  1194. return
  1195. }
  1196. if (this.modalData.effPhaseOutDate === '' || this.modalData.effPhaseOutDate == null) {
  1197. this.$message.warning('请选择结束时间!')
  1198. return
  1199. }
  1200. if (this.modalData.engChgLevel === '' || this.modalData.engChgLevel == null) {
  1201. this.$message.warning('请填写BOM版本号!')
  1202. return
  1203. }
  1204. if (this.detailData.alternativeNo === '' || this.detailData.alternativeNo == null) {
  1205. this.$message.warning('请选择替代!')
  1206. return
  1207. }
  1208. let tempData = {
  1209. site: this.$store.state.user.site,
  1210. partNo: this.modalData.partNo,
  1211. partDesc: this.modalData.partDesc,
  1212. engChgLevel: this.modalData.engChgLevel,
  1213. bomType: this.modalData.bomType,
  1214. noteText: this.modalData.noteText,
  1215. effPhaseInDate: this.modalData.effPhaseInDate,
  1216. effPhaseOutDate: this.modalData.effPhaseOutDate,
  1217. engRevision: this.modalData.engRevision,
  1218. typeFlag: this.modalData.typeFlag,
  1219. netWeight: this.modalData.netWeight,
  1220. alternativeNo: this.detailData.alternativeNo,
  1221. alternativeDescription: this.detailData.alternativeDescription,
  1222. minLotQty: this.detailData.minLotQty,
  1223. defaultFlag: this.detailData.defaultFlag,
  1224. detailNoteText: this.detailData.detailNoteText,
  1225. createBy: this.$store.state.user.name,
  1226. updateBy: this.$store.state.user.name,
  1227. informationList: this.subDetailList
  1228. }
  1229. if (this.modalData.flag === '1') {
  1230. bomManagementSave(tempData).then(({data}) => {
  1231. if (data && data.code === 0) {
  1232. this.getDataList()
  1233. this.modalFlag = false
  1234. this.$message({
  1235. message: '操作成功',
  1236. type: 'success',
  1237. duration: 1500,
  1238. onClose: () => {}
  1239. })
  1240. } else {
  1241. this.$alert(data.msg, '错误', {
  1242. confirmButtonText: '确定'
  1243. })
  1244. }
  1245. })
  1246. } else {
  1247. bomManagementEdit(tempData).then(({data}) => {
  1248. if (data && data.code === 0) {
  1249. this.getDataList()
  1250. this.modalFlag = false
  1251. this.$message({
  1252. message: '操作成功',
  1253. type: 'success',
  1254. duration: 1500,
  1255. onClose: () => {}
  1256. })
  1257. } else {
  1258. this.$alert(data.msg, '错误', {
  1259. confirmButtonText: '确定'
  1260. })
  1261. }
  1262. })
  1263. }
  1264. },
  1265. /**
  1266. * 新增编辑模态框关闭
  1267. */
  1268. closeModal () {
  1269. let tempArr = []
  1270. tempArr.push(this.modalData)
  1271. if (this.modalData.flag === '1') {
  1272. this.$confirm(`是否不保存且删除该条BOM记录?`, '提示', {
  1273. confirmButtonText: '确定',
  1274. cancelButtonText: '取消',
  1275. type: 'warning'
  1276. }).then(() => {
  1277. let tempData = {
  1278. informationList: tempArr
  1279. }
  1280. bomManagementDelete(tempData).then(({data}) => {
  1281. if (data && data.code === 0) {
  1282. this.getDataList()
  1283. this.modalFlag = false
  1284. this.$message({
  1285. message: '操作成功',
  1286. type: 'success',
  1287. duration: 1500,
  1288. onClose: () => {}
  1289. })
  1290. } else {
  1291. this.$alert(data.msg, '错误', {
  1292. confirmButtonText: '确定'
  1293. })
  1294. }
  1295. })
  1296. }).catch(() => {
  1297. })
  1298. } else {
  1299. this.modalFlag = false
  1300. }
  1301. },
  1302. /**
  1303. * bom删除
  1304. */
  1305. delModal () {
  1306. if(this.bomSelections.length === 0){
  1307. this.$message.warning('请勾选要删除的BOM!')
  1308. return
  1309. }
  1310. this.$confirm(`是否删除这 `+ this.bomSelections.length +` 条BOM?`, '提示', {
  1311. confirmButtonText: '确定',
  1312. cancelButtonText: '取消',
  1313. type: 'warning'
  1314. }).then(() => {
  1315. let tempData = {
  1316. informationList: this.bomSelections
  1317. }
  1318. bomManagementDelete(tempData).then(({data}) => {
  1319. if (data && data.code === 0) {
  1320. this.getDataList()
  1321. this.bomSelections = []
  1322. this.$message({
  1323. message: '操作成功',
  1324. type: 'success',
  1325. duration: 1500,
  1326. onClose: () => {}
  1327. })
  1328. } else {
  1329. this.$alert(data.msg, '错误', {
  1330. confirmButtonText: '确定'
  1331. })
  1332. }
  1333. })
  1334. }).catch(() => {
  1335. })
  1336. },
  1337. /**
  1338. * 查询未建 bom 的物料
  1339. */
  1340. queryPartList () {
  1341. queryPartList(this.partData).then(({data}) => {
  1342. if (data && data.code === 0) {
  1343. this.partList = data.rows
  1344. this.partModelFlag = true
  1345. } else {
  1346. this.$alert(data.msg, '错误', {
  1347. confirmButtonText: '确定'
  1348. })
  1349. }
  1350. })
  1351. },
  1352. /**
  1353. * 双击选中物料
  1354. * @param row
  1355. */
  1356. getRowData (row) {
  1357. this.modalData.partNo = row.partNo
  1358. this.modalData.partDesc = row.partDesc
  1359. this.partModelFlag = false
  1360. },
  1361. /**
  1362. * 新增子明细
  1363. */
  1364. queryComponentPartList () {
  1365. if (this.detailData.alternativeNo === '' || this.detailData.alternativeNo == null) {
  1366. this.$message.warning('请先选择替代!')
  1367. return
  1368. }
  1369. // 查询所有物料
  1370. queryPartList(this.componentPartData).then(({data}) => {
  1371. if (data && data.code === 0) {
  1372. this.componentPartList = data.rows
  1373. this.componentPartModelFlag = true
  1374. } else {
  1375. this.$alert(data.msg, '错误', {
  1376. confirmButtonText: '确定'
  1377. })
  1378. }
  1379. })
  1380. },
  1381. /**
  1382. * 表格的新增
  1383. * @param row
  1384. * @param rowIndex
  1385. */
  1386. rowClassName({ row, rowIndex }) {
  1387. row.xh = rowIndex + 1;
  1388. },
  1389. /**
  1390. * 单选框选中数据
  1391. * @param selection
  1392. */
  1393. componentSelectionChange(selection) {
  1394. this.checkedDetail = selection
  1395. },
  1396. /**
  1397. * 删除子物料
  1398. */
  1399. deleteComponentPart () {
  1400. if (this.checkedDetail.length === 0) {
  1401. this.$message.warning('请选择要删除子物料!')
  1402. return
  1403. } else {
  1404. this.$confirm("请是否确认删除该子明细记录?", "提示", {
  1405. confirmButtonText: "确定",
  1406. cancelButtonText: "取消",
  1407. type: "warning"
  1408. // callback: (action) => {
  1409. // if (action === "confirm") {
  1410. // let val = this.checkedDetail
  1411. // val.forEach((val, index) => {
  1412. // this.subDetailList.forEach((v, i) => {
  1413. // if (val.xh === v.xh) {
  1414. // this.subDetailList.splice(i, 1)
  1415. // }
  1416. // })
  1417. // })
  1418. // this.$message({message: "删除成功!", type: "success",})
  1419. // return
  1420. // } else {
  1421. // this.$message({message: "已取消删除操作", type: "warning",})
  1422. // return
  1423. // }
  1424. // },
  1425. }).then(() => {
  1426. let tempData = {
  1427. informationList: this.checkedDetail
  1428. }
  1429. deleteBomComponent(tempData).then(({data}) => {
  1430. if (data && data.code === 0) {
  1431. this.subDetailList = data.rows
  1432. this.$message({
  1433. message: '操作成功',
  1434. type: 'success',
  1435. duration: 1500,
  1436. onClose: () => {}
  1437. })
  1438. } else {
  1439. this.$alert(data.msg, '错误', {
  1440. confirmButtonText: '确定'
  1441. })
  1442. }
  1443. })
  1444. }).catch(() => {
  1445. })
  1446. }
  1447. },
  1448. /**
  1449. * 子物料
  1450. * @param row
  1451. */
  1452. componentPartClickRow (row) {
  1453. this.$refs.componentPartTable.toggleRowSelection(row)
  1454. },
  1455. componentClickRow (row) {
  1456. this.$refs.componentTable.toggleRowSelection(row)
  1457. },
  1458. /**
  1459. * 多选子物料
  1460. * @param val
  1461. */
  1462. selectionComponentPart (val) {
  1463. this.componentPartSelections = val
  1464. },
  1465. getRowKeys(row) {
  1466. // 唯一值,一般都为id
  1467. return row.partNo
  1468. },
  1469. /**
  1470. * 提交选中的子物料
  1471. */
  1472. confirmComponentPart () {
  1473. // for (let i = 0; i < this.componentPartSelections.length; i++) {
  1474. // let obj = {}
  1475. // obj.site = this.$store.state.user.site
  1476. // obj.partNo = this.modalData.partNo
  1477. // obj.engChgLevel = this.modalData.engChgLevel
  1478. // obj.bomType = this.modalData.bomType
  1479. // obj.alternativeNo = this.detailData.alternativeNo
  1480. // obj.componentPart = this.componentPartSelections[i].partNo
  1481. // obj.componentPartDesc = this.componentPartSelections[i].partDesc
  1482. // obj.qtyPerAssembly = ''
  1483. // obj.printUnit = this.componentPartSelections[i].umId
  1484. // obj.printUnitName = this.componentPartSelections[i].umName
  1485. // this.subDetailList.push(obj)
  1486. // }
  1487. let tempData = {
  1488. site: this.$store.state.user.site,
  1489. partNo: this.modalData.partNo,
  1490. engChgLevel: this.modalData.engChgLevel,
  1491. bomType: this.modalData.bomType,
  1492. alternativeNo: this.detailData.alternativeNo,
  1493. createBy: this.$store.state.user.name,
  1494. informationList: this.componentPartSelections
  1495. }
  1496. saveBomComponent(tempData).then(({data}) => {
  1497. if (data && data.code === 0) {
  1498. this.subDetailList = data.rows
  1499. this.componentPartModelFlag = false
  1500. } else {
  1501. this.$alert(data.msg, '错误', {
  1502. confirmButtonText: '确定'
  1503. })
  1504. }
  1505. })
  1506. },
  1507. /**
  1508. * 回车事件
  1509. */
  1510. focusNextInput (index, type) {
  1511. let aaa = ''
  1512. if (this.subDetailList.length - 1 === index) {
  1513. aaa = `${type}0`
  1514. } else {
  1515. aaa = `${type}${index + 1}`
  1516. }
  1517. this.$nextTick(() => {
  1518. this.$refs[aaa].focus()
  1519. })
  1520. },
  1521. /**
  1522. * 保存主表信息
  1523. */
  1524. saveBomHeader () {
  1525. if (this.modalData.partNo === '' || this.modalData.partNo == null) {
  1526. this.$message.warning('请先选择Bom物料!')
  1527. return
  1528. }
  1529. if (this.modalData.engChgLevel === '' || this.modalData.engChgLevel == null) {
  1530. this.$message.warning('请先填写Bom版本号!')
  1531. return
  1532. }
  1533. if (this.modalData.bomType === '' || this.modalData.bomType == null) {
  1534. this.$message.warning('请先选择制造类型!')
  1535. return
  1536. }
  1537. if (this.modalData.typeFlag === '' || this.modalData.typeFlag == null) {
  1538. this.$message.warning('请先选择类型!')
  1539. return
  1540. }
  1541. // 新增主表信息
  1542. saveBomHeader(this.modalData).then(({data}) => {
  1543. if (data && data.code === 0) {
  1544. this.modalData = {
  1545. flag: '1',
  1546. title: 'bom新增',
  1547. site: data.rows.modalData.site,
  1548. partNo: data.rows.modalData.partNo,
  1549. partDesc: data.rows.modalData.partDesc,
  1550. engChgLevel: data.rows.modalData.engChgLevel,
  1551. bomType: data.rows.modalData.bomType,
  1552. noteText: data.rows.modalData.noteText,
  1553. effPhaseInDate: data.rows.modalData.effPhaseInDate,
  1554. effPhaseOutDate: data.rows.modalData.effPhaseOutDate,
  1555. engRevision: data.rows.modalData.engRevision,
  1556. typeFlag: data.rows.modalData.typeFlag,
  1557. netWeight: data.rows.modalData.netWeight,
  1558. }
  1559. this.detailDataList = data.rows.detailDataList
  1560. this.detailData = data.rows.detailData
  1561. this.subDetailList = []
  1562. this.modalDisableFlag = true
  1563. this.$message({
  1564. message: '操作成功',
  1565. type: 'success',
  1566. duration: 1500,
  1567. onClose: () => {}
  1568. })
  1569. } else {
  1570. this.$alert(data.msg, '错误', {
  1571. confirmButtonText: '确定'
  1572. })
  1573. }
  1574. })
  1575. },
  1576. /**
  1577. * 新增替代模态框
  1578. */
  1579. saveBomDetail () {
  1580. if (this.modalData.partNo === '' || this.modalData.partNo == null) {
  1581. this.$message.warning('请先选择Bom物料!')
  1582. return
  1583. }
  1584. if (this.modalData.engChgLevel === '' || this.modalData.engChgLevel == null) {
  1585. this.$message.warning('请先填写Bom版本号!')
  1586. return
  1587. }
  1588. if (this.modalData.bomType === '' || this.modalData.bomType == null) {
  1589. this.$message.warning('请先选择制造类型!')
  1590. return
  1591. }
  1592. this.saveDetailData = {
  1593. site: this.$store.state.user.site,
  1594. partNo: this.modalData.partNo,
  1595. engChgLevel: this.modalData.engChgLevel,
  1596. bomType: this.modalData.bomType,
  1597. alternativeNo: '',
  1598. alternativeDescription: '',
  1599. minLotQty: '',
  1600. defaultFlag: '',
  1601. detailNoteText: '',
  1602. createDate: '',
  1603. createBy: this.$store.state.user.name,
  1604. }
  1605. // 查询bom主信息
  1606. queryBomHeader(this.modalData).then(({data}) => {
  1607. if (data && data.code === 0) {
  1608. if (data.rows.length > 0) {
  1609. this.saveDetailModalFlag = true
  1610. } else {
  1611. this.$message.warning('请先保存BOM主记录!')
  1612. }
  1613. } else {
  1614. this.$alert(data.msg, '提示', {
  1615. confirmButtonText: '确定'
  1616. })
  1617. }
  1618. })
  1619. },
  1620. /**
  1621. * 新增替代方法
  1622. */
  1623. detailDataSave () {
  1624. if (this.saveDetailData.partNo === '' || this.saveDetailData.partNo == null) {
  1625. this.$message.warning('请先选择Bom物料!')
  1626. return
  1627. }
  1628. if (this.saveDetailData.engChgLevel === '' || this.saveDetailData.engChgLevel == null) {
  1629. this.$message.warning('请先填写Bom版本号!')
  1630. return
  1631. }
  1632. if (this.saveDetailData.bomType === '' || this.saveDetailData.bomType == null) {
  1633. this.$message.warning('请先选择制造类型!')
  1634. return
  1635. }
  1636. if (this.saveDetailData.alternativeNo === '' || this.saveDetailData.alternativeNo == null) {
  1637. this.$message.warning('请填写替代编码!')
  1638. return
  1639. }
  1640. if (this.saveDetailData.alternativeDescription === '' || this.saveDetailData.alternativeDescription == null) {
  1641. this.$message.warning('请填写替代名称!')
  1642. return
  1643. }
  1644. if (this.saveDetailData.minLotQty === '' || this.saveDetailData.minLotQty == null) {
  1645. this.$message.warning('请填写最小订单数!')
  1646. return
  1647. }
  1648. bomDetailSave(this.saveDetailData).then(({data}) => {
  1649. if (data && data.code === 0) {
  1650. this.detailDataList = data.rows
  1651. this.detailData = this.saveDetailData
  1652. this.subDetailList = []
  1653. this.saveDetailModalFlag = false
  1654. this.$message({
  1655. message: '操作成功',
  1656. type: 'success',
  1657. duration: 1500,
  1658. onClose: () => {}
  1659. })
  1660. } else {
  1661. this.$alert(data.msg, '错误', {
  1662. confirmButtonText: '确定'
  1663. })
  1664. }
  1665. })
  1666. },
  1667. /**
  1668. * 删除替代
  1669. */
  1670. deleteBomDetail () {
  1671. if (this.detailData.alternativeNo === '' || this.detailData.alternativeNo == null) {
  1672. this.$message.warning('请选择要删除的替代编码!')
  1673. return
  1674. }
  1675. if (this.detailData.alternativeNo === '*') {
  1676. this.$message.warning('当前为默认替代,不可以删除!')
  1677. return
  1678. }
  1679. this.$confirm(`是否删除这项替代?`, '提示', {
  1680. confirmButtonText: '确定',
  1681. cancelButtonText: '取消',
  1682. type: 'warning'
  1683. }).then(() => {
  1684. bomDetailDelete(this.detailData).then(({data}) => {
  1685. if (data && data.code === 0) {
  1686. this.detailData = data.rows.detailData
  1687. this.detailDataList = data.rows.detailDataList
  1688. this.subDetailList = data.rows.subDetailList
  1689. this.$message({
  1690. message: '操作成功',
  1691. type: 'success',
  1692. duration: 1500,
  1693. onClose: () => {}
  1694. })
  1695. } else {
  1696. this.$alert(data.msg, '错误', {
  1697. confirmButtonText: '确定'
  1698. })
  1699. }
  1700. })
  1701. }).catch(() => {
  1702. })
  1703. },
  1704. /**
  1705. * 替代改变事件
  1706. */
  1707. alternativeChange () {
  1708. queryBomComponent(this.detailData).then(({data}) => {
  1709. if (data && data.code === 0) {
  1710. this.detailData = data.rows.detailData
  1711. this.subDetailList = data.rows.componentList
  1712. } else {
  1713. this.$alert(data.msg, '错误', {
  1714. confirmButtonText: '确定'
  1715. })
  1716. }
  1717. })
  1718. },
  1719. // ======== chooseList相关方法 ========
  1720. /**
  1721. * 获取基础数据列表S
  1722. * @param val
  1723. * @param type
  1724. */
  1725. getBaseList (val, type) {
  1726. this.tagNo = val
  1727. this.$nextTick(() => {
  1728. let strVal = ''
  1729. if (val === 116) {
  1730. strVal = this.modalData.partNo
  1731. }
  1732. this.$refs.baseList.init(val, strVal)
  1733. })
  1734. },
  1735. /**
  1736. * 列表方法的回调
  1737. * @param val
  1738. */
  1739. getBaseData (val) {
  1740. if (this.tagNo === 116) {
  1741. this.modalData.partNo = val.part_no
  1742. this.modalData.partDesc = val.part_desc
  1743. }
  1744. },
  1745. // ======== 导出相关方法 ========
  1746. /**
  1747. * 导出excel
  1748. */
  1749. async createExportData () {
  1750. this.searchData.limit = -1
  1751. this.searchData.page = 1
  1752. await bomManagementSearch(this.searchData).then(({data}) => {
  1753. this.resultList = data.page.list
  1754. })
  1755. return this.resultList
  1756. },
  1757. startDownload () {
  1758. },
  1759. finishDownload () {
  1760. },
  1761. fields () {
  1762. let json = '{'
  1763. this.columnList.forEach((item, index) => {
  1764. if (index == this.columnList.length - 1) {
  1765. json += '"' + item.columnLabel + '"' + ':' + '"' + item.columnProp + '"'
  1766. } else {
  1767. json += '"' + item.columnLabel + '"' + ':' + '"' + item.columnProp + '"' + ','
  1768. }
  1769. })
  1770. json += '}'
  1771. let s = eval('(' + json + ')')
  1772. return s
  1773. }
  1774. }
  1775. }
  1776. </script>
  1777. <style scoped lang="scss">
  1778. /deep/ .detail-tab .el-tabs__content {
  1779. height: 180px;
  1780. padding: 15px 0px 0px 0px;
  1781. }
  1782. /deep/ .sub_detail-tab .el-tabs__content {
  1783. height: 280px;
  1784. padding: 0px;
  1785. }
  1786. </style>