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.

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