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.

1763 lines
62 KiB

9 months ago
9 months ago
2 years ago
2 years ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
9 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
12 months ago
8 months ago
12 months 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: 210px"></el-input>
  10. </el-form-item>
  11. <el-form-item :label="' '">
  12. <el-button @click="getDataList()">查询</el-button>
  13. <el-button v-if="isAuth('104001002:save')" 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. ref="partTable"
  37. :row-style="rowStyle"
  38. @row-click="partClickRow"
  39. @selection-change="selectionPart"
  40. @current-change="changeCurrentRow"
  41. style="width: 100%;">
  42. <el-table-column
  43. type="selection"
  44. header-align="center"
  45. align="center"
  46. width="50">
  47. </el-table-column>
  48. <el-table-column
  49. v-for="(item,index) in columnList" :key="index"
  50. :sortable="item.columnSortable"
  51. :prop="item.columnProp"
  52. :header-align="item.headerAlign"
  53. :show-overflow-tooltip="item.showOverflowTooltip"
  54. :align="item.align"
  55. :fixed="item.fixed === ''?false:item.fixed"
  56. :min-width="item.columnWidth"
  57. :label="item.columnLabel">
  58. <template slot-scope="scope">
  59. <span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  60. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  61. </template>
  62. </el-table-column>
  63. <el-table-column
  64. fixed="right"
  65. header-align="center"
  66. align="center"
  67. width="100"
  68. label="操作">
  69. <template slot-scope="scope">
  70. <el-link v-if="isAuth('104001002:update')" style="cursor: pointer" @click="updateModal(scope.row)">编辑</el-link>
  71. </template>
  72. </el-table-column>
  73. </el-table>
  74. <selectDiv ref="selectDiv"></selectDiv>
  75. <!-- 分页插件 -->
  76. <el-pagination style="margin-top: 0px"
  77. @size-change="sizeChangeHandle"
  78. @current-change="currentChangeHandle"
  79. :current-page="pageIndex"
  80. :page-sizes="[20, 50, 100, 200, 500]"
  81. :page-size="pageSize"
  82. :total="totalPage"
  83. layout="total, sizes, prev, pager, next, jumper">
  84. </el-pagination>
  85. <!-- 物料新增/编辑模态框 -->
  86. <el-dialog :title="modalData.title" top="29vh" :close-on-click-modal="false" v-drag :visible.sync="modalFlag" width="737px">
  87. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  88. <el-form-item label="物料编码" prop="partNo" :rules="rules.partNo">
  89. <el-input v-model="modalData.partNo" clearable style="width: 120px" :disabled="modalDisableFlag"></el-input>
  90. </el-form-item>
  91. <el-form-item label="物料名称" prop="partDesc" :rules="rules.partDesc" style="margin-left: -10px">
  92. <el-input v-model="modalData.partDesc" clearable style="width: 330px"></el-input>
  93. </el-form-item>
  94. <el-form-item style="margin-top: 20px">
  95. <el-checkbox v-model="modalData.conditionCodeUsageDb" true-label="Y">允许条件代码</el-checkbox><br>
  96. <el-checkbox v-model="modalData.multilevelTrackingDb" true-label="Y">多级跟踪</el-checkbox><br>
  97. <el-checkbox v-model="modalData.allowAsNotConsumedDb" true-label="Y">允许为未使用</el-checkbox>
  98. </el-form-item>
  99. <!-- <el-form-item v-if="modalData.flag === '2' && modalData.officialFlag !== 'Y'">-->
  100. <!-- <el-button type="primary" @click="toBecomeOfficialPart" style="margin-top: 62px;margin-left: 10px;width: 110px">转正式物料</el-button>-->
  101. <!-- </el-form-item>-->
  102. </el-form>
  103. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  104. <el-form-item prop="umId" :rules="rules.umId">
  105. <span style="cursor: pointer" slot="label" @click="getBaseList(1007)"><a herf="#">计量单位</a></span>
  106. <el-input v-model="modalData.umId" @blur="umIdBlur(1007)" style="width: 120px"></el-input>
  107. <el-input v-model="modalData.umName" disabled style="width: 330px"></el-input>
  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>
  112. <span style="cursor: pointer" slot="label" @click="getBaseList(22)"><a herf="#">属性模板</a></span>
  113. <el-input v-model="modalData.codeNo" @blur="codeNoBlur(22)" style="width: 120px"></el-input>
  114. <el-input v-model="modalData.codeDesc" disabled style="width: 330px"></el-input>
  115. </el-form-item>
  116. <el-form-item label="批次/批次跟踪">
  117. <el-select v-model="modalData.lotTrackingCode" style="width: 230px">
  118. <el-option label="Lot Tracking" value="Lot Tracking"></el-option>
  119. <el-option label="Not Lot Tracking" value="Not Lot Tracking"></el-option>
  120. <el-option label="Order Based" value="Order Based"></el-option>
  121. </el-select>
  122. </el-form-item>
  123. </el-form>
  124. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  125. <!-- 2025-05-31 Master part增加字段新增编辑主页面接口同步调整 -->
  126. <el-form-item>
  127. <span style="cursor: pointer" slot="label" @click="getBaseList(109)"><a herf="#">物料分组</a></span>
  128. <el-input v-model="modalData.partMainGroup" @blur="groupIdBlur(109)" style="width: 120px"></el-input>
  129. <el-input v-model="modalData.groupName" disabled style="width: 330px"></el-input>
  130. </el-form-item>
  131. <el-form-item label="批量规则">
  132. <el-select v-model="modalData.lotQuantityRule" :disabled="modalData.lotTrackingCode === 'Not Lot Tracking'" style="width: 230px">
  133. <el-option label="One Lot Per Production Order" value="One Lot Per Production Order"></el-option>
  134. <el-option label="Many Lots Per Production Order" value="Many Lots Per Production Order"></el-option>
  135. </el-select>
  136. </el-form-item>
  137. </el-form>
  138. <el-form :inline="true" label-position="top" :model="modalData" :rules="rules" style="margin-left: 7px;margin-top: -5px;">
  139. <el-form-item label="净重">
  140. <el-input-number :controls="false" :step="0" v-model="modalData.weightNet" style="width: 120px"></el-input-number>
  141. </el-form-item>
  142. <el-form-item label="净重单位" style="margin-left: -10px">
  143. <dict-data-select v-if="modalFlag" v-model="modalData.uomForWeightNet" style="width: 330px" :use-default-value="false" dict-type="part_uom_for_weight_net"></dict-data-select>
  144. </el-form-item>
  145. <el-form-item label="子批次规则">
  146. <el-select v-model="modalData.subLotRule" :disabled="modalData.lotTrackingCode === 'Not Lot Tracking'" style="width: 230px">
  147. <el-option label="Sub Lots Allowed" value="Sub Lots Allowed"></el-option>
  148. <el-option label="No Sub Lots Allowed" value="No Sub Lots Allowed"></el-option>
  149. </el-select>
  150. </el-form-item>
  151. </el-form>
  152. <el-form :inline="true" label-position="top" :model="modalData" style="margin-left: 7px;margin-top: -5px;">
  153. <el-form-item label="体积">
  154. <el-input-number :controls="false" :step="0" v-model="modalData.volumeNet" style="width: 120px"></el-input-number>
  155. </el-form-item>
  156. <el-form-item label="体积单位" style="margin-left: -10px">
  157. <dict-data-select v-if="modalFlag" v-model="modalData.uomForVolumeNet" style="width: 330px" dict-type="part_uom_for_volume_net"></dict-data-select>
  158. </el-form-item>
  159. <el-form-item label="组件批次规则">
  160. <el-select v-model="modalData.componentLotRule" :disabled="modalData.lotTrackingCode === 'Not Lot Tracking'" style="width: 230px">
  161. <el-option label="Many Lots Allowed" value="Many Lots Allowed"></el-option>
  162. <el-option label="One Lot Allowed" value="One Lot Allowed"></el-option>
  163. </el-select>
  164. </el-form-item>
  165. </el-form>
  166. <el-footer style="height:35px;margin-top: 25px;text-align:center">
  167. <el-button type="primary" @click="saveData()">保存</el-button>
  168. <el-button type="primary" @click="modalFlag = false">关闭</el-button>
  169. </el-footer>
  170. </el-dialog>
  171. <!-- 页签 -->
  172. <el-tabs v-model="activeTable" style="width: 100%" :style="{height: this.secondHeight + 'px'}" type="border-card" @tab-click="tabClick" class="customer-tab">
  173. <!-- 物料属性页签 -->
  174. <el-tab-pane label="物料属性" name="part_item">
  175. <el-form label-position="top" style="margin-top: 2px; margin-left: 2px;">
  176. <el-button v-if="isAuth('104001002:itemSave')" type="primary" @click="addOrDelItem">新增</el-button>
  177. <!-- <el-button type="primary" @click="updateItemValue">编辑</el-button>-->
  178. <el-button v-if="isAuth('104001002:itemUpdate') && partItemList.length > 0" type="primary" :loading="loading" @click="clickSave">{{ attributeDialog?'编辑':'保存' }}</el-button>
  179. </el-form>
  180. <div class="rq" v-if="attributeDialog">
  181. <el-table
  182. :data="partItemList"
  183. :height="secondHeight - 60"
  184. border
  185. style="width: 100%;">
  186. <el-table-column
  187. v-for="(item,index) in columnItemList" :key="index"
  188. :sortable="item.columnSortable"
  189. :prop="item.columnProp"
  190. :header-align="item.headerAlign"
  191. :show-overflow-tooltip="item.showOverflowTooltip"
  192. :align="item.align"
  193. :fixed="item.fixed==''?false:item.fixed"
  194. :min-width="item.columnWidth"
  195. :label="item.columnLabel">
  196. <template slot-scope="scope">
  197. <div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
  198. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  199. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  200. </div>
  201. <div v-else>
  202. {{scope.row.textValue?scope.row.textValue:scope.row.numValue}}
  203. </div>
  204. </template>
  205. </el-table-column>
  206. </el-table>
  207. </div>
  208. <div class="rq" v-else>
  209. <el-table
  210. :data="copyAttributeList"
  211. :height="secondHeight - 60"
  212. border
  213. style="width: 100%">
  214. <el-table-column
  215. v-for="(item,index) in columnItemList" :key="index"
  216. :sortable="item.columnSortable"
  217. :prop="item.columnProp"
  218. :header-align="item.headerAlign"
  219. :show-overflow-tooltip="item.showOverflowTooltip"
  220. :align="item.align"
  221. :fixed="item.fixed===''?false:item.fixed"
  222. :min-width="item.columnWidth"
  223. :label="item.columnLabel">
  224. <template slot-scope="scope">
  225. <div v-if="item.columnProp !== 'textValue' && item.columnProp !== 'numValue'">
  226. <span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  227. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  228. </div>
  229. <div v-else>
  230. <div v-if="scope.row.valueChooseFlag !== 'Y'">
  231. <el-input-number v-model="scope.row.numValue" style="padding: 0;width: 100%" v-if="scope.row.valueTypeDb === 'N'" :controls="false"></el-input-number>
  232. <el-input v-model="scope.row.textValue" v-else></el-input>
  233. </div>
  234. <div v-else>
  235. <el-select style="width: 100%;" v-if="scope.row.valueTypeDb === 'T'" v-model="scope.row.textValue" clearable>
  236. <el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
  237. </el-select>
  238. <el-select style="width: 100%;" v-else v-model="scope.row.numValue" clearable>
  239. <el-option :value="i.availableValue" :label="i.availableValue" v-for="(i,key) in scope.row.availableValueList" :key="key"></el-option>
  240. </el-select>
  241. </div>
  242. </div>
  243. </template>
  244. </el-table-column>
  245. </el-table>
  246. </div>
  247. </el-tab-pane>
  248. </el-tabs>
  249. <!-- 物料属性值编辑模态框 -->
  250. <el-dialog title="物料属性" :close-on-click-modal="false" v-drag :visible.sync="updateItemModelFlag" width="1000px">
  251. <div class="rq ">
  252. <el-table
  253. :data="updatePartItemList"
  254. height="350px"
  255. border
  256. style="width: 100%;">
  257. <el-table-column
  258. v-for="(item,index) in updateColumnItemList" :key="index"
  259. :sortable="item.columnSortable"
  260. :prop="item.columnProp"
  261. :header-align="item.headerAlign"
  262. :show-overflow-tooltip="item.showOverflowTooltip"
  263. :align="item.align"
  264. :fixed="item.fixed==''?false:item.fixed"
  265. :min-width="item.columnWidth"
  266. :label="item.columnLabel">
  267. <template slot-scope="scope">
  268. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  269. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  270. </template>
  271. </el-table-column>
  272. <el-table-column
  273. prop="textValue"
  274. header-align="center"
  275. align="right"
  276. min-width="80"
  277. label="文本值">
  278. <template slot-scope="scope">
  279. <el-input v-if="scope.row.valueTypeDb === 'T' && scope.row.valueChooseFlag === 'N'" v-model="scope.row.textValue" style="height: 11px;padding: 0px " allow-create>;width:98%"></el-input>
  280. <el-select v-if="scope.row.valueTypeDb === 'T' && scope.row.valueChooseFlag === 'Y'" v-model="scope.row.textValue" style="width: 180px" placeholder="请选择">
  281. <el-option v-for="item in scope.row.availableValueList" :key="index" :label="item.availableValue" :value="item.availableValue"></el-option>
  282. </el-select>
  283. <el-input v-if="scope.row.valueTypeDb !== 'T'" v-model="scope.row.textValue" disabled style="height: 11px;padding: 0px " allow-create>;width:98%"></el-input>
  284. </template>
  285. </el-table-column>
  286. <el-table-column
  287. prop="numValue"
  288. header-align="center"
  289. align="right"
  290. min-width="80"
  291. label="数字值">
  292. <template slot-scope="scope">
  293. <el-input v-if="scope.row.valueTypeDb === 'N' && scope.row.valueChooseFlag === 'N'" v-model="scope.row.numValue" style="height: 11px;padding: 0px " allow-create>;width:98%"></el-input>
  294. <el-select v-if="scope.row.valueTypeDb === 'N' && scope.row.valueChooseFlag === 'Y'" v-model="scope.row.numValue" style="width: 180px" placeholder="请选择">
  295. <el-option v-for="item in scope.row.availableValueList" :key="index" :label="item.availableValue" :value="item.availableValue"></el-option>
  296. </el-select>
  297. <el-input v-if="scope.row.valueTypeDb !== 'N'" v-model="scope.row.numValue" disabled style="height: 11px;padding: 0px " allow-create>;width:98%"></el-input>
  298. </template>
  299. </el-table-column>
  300. </el-table>
  301. </div>
  302. <span slot="footer" class="dialog-footer">
  303. <el-button type="primary" @click="commitItemValue()">保存</el-button>
  304. <el-button type="primary" @click="updateItemModelFlag=false">关闭</el-button>
  305. </span>
  306. </el-dialog>
  307. <el-dialog title="新增" :close-on-click-modal="false" v-drag :visible.sync="fastAddFlag" width="1000px">
  308. <div style="font-size: 12px">
  309. <el-form :inline="true" label-position="top" :model="itemData">
  310. <el-form-item :label="'属性编码'">
  311. <el-input v-model="itemData.propertiesItemNo" clearable style="width: 120px"></el-input>
  312. </el-form-item>
  313. <el-form-item :label="'属性名称'">
  314. <el-input v-model="itemData.itemDesc" clearable style="width: 150px"></el-input>
  315. </el-form-item>
  316. <el-form-item :label="' '">
  317. <el-button type="primary" @click="queryMasterPartItem()">查询</el-button>
  318. </el-form-item>
  319. </el-form>
  320. </div>
  321. <el-container style="margin-top: 0px;">
  322. <el-main style="width: 350px;padding: 1px">
  323. <span style="font-size: 12px" >可选属性</span>
  324. <el-table
  325. height="400px"
  326. :data="itemList1"
  327. border
  328. ref="itemTable1"
  329. @row-click="itemClickRow1"
  330. @selection-change="selectionItem1"
  331. highlight-current-row
  332. style="width: 100%">
  333. <!-- <el-table-column-->
  334. <!-- type="selection"-->
  335. <!-- header-align="center"-->
  336. <!-- align="center"-->
  337. <!-- width="50">-->
  338. <!-- </el-table-column>-->
  339. <el-table-column
  340. prop="itNo"
  341. header-align="center"
  342. align="left"
  343. min-width="80"
  344. label="属性编码">
  345. </el-table-column>
  346. <el-table-column
  347. prop="itemDesc"
  348. header-align="center"
  349. align="left"
  350. min-width="200"
  351. label="属性名称">
  352. </el-table-column>
  353. </el-table>
  354. </el-main>
  355. <el-main style="width: 10px;padding: 1px">
  356. <div style="margin-top: 200px;margin-left: 18px">
  357. <!-- <el-button type="primary" @click="addItem()">添加>></el-button>-->
  358. </div>
  359. <div style="margin-top: 15px;margin-left: 18px">
  360. <el-button type="primary" @click="deleteItem()">删除<<</el-button>
  361. </div>
  362. </el-main>
  363. <el-main style="width: 350px;padding: 1px">
  364. <span style="font-size: 12px" >已有属性</span>
  365. <el-table
  366. height="400px"
  367. :data="itemList2"
  368. border
  369. ref="itemTable2"
  370. @row-click="itemClickRow2"
  371. @selection-change="selectionItem2"
  372. highlight-current-row
  373. style="width: 100%">
  374. <el-table-column
  375. type="selection"
  376. header-align="center"
  377. align="center"
  378. width="50">
  379. </el-table-column>
  380. <el-table-column
  381. prop="itNo"
  382. header-align="center"
  383. align="left"
  384. min-width="80"
  385. label="属性编码">
  386. </el-table-column>
  387. <el-table-column
  388. prop="itemDesc"
  389. header-align="center"
  390. align="left"
  391. min-width="200"
  392. label="属性名称">
  393. </el-table-column>
  394. </el-table>
  395. </el-main>
  396. </el-container>
  397. <el-footer style="height:40px;margin-top: 20px;text-align:center">
  398. <el-button type="primary" @click="fastAddFlag = false">关闭</el-button>
  399. </el-footer>
  400. </el-dialog>
  401. <!-- chooseList模态框 -->
  402. <Chooselist ref="baseList" @getBaseData="getBaseData"></Chooselist>
  403. </div>
  404. </template>
  405. <script>
  406. import {
  407. masterPartSearch, // 物料信息列表查询
  408. masterPartInformationSave, // 物料信息新增
  409. masterPartInformationEdit, // 物料信息编辑
  410. masterPartInformationDelete, // 物料信息删除
  411. getMasterPartItem, // 查询物料属性
  412. commitItemValue, // 修改物料属性值
  413. getItemLists, // 获取模板属性
  414. addMasterPartItem, // 新增物料属性
  415. deleteMasterPartItem, // 删除物料属性
  416. queryMasterPartItem,
  417. toBecomeOfficialMasterPart, // 转正式物料
  418. } from '@/api/part/masterPartInformation.js'
  419. import {getChooselistData, verifyData} from "@/api/chooselist/chooselist.js"
  420. import {getProjectPartNo} from '@/api/part/partInformation.js'
  421. import Chooselist from '@/views/modules/common/Chooselist'
  422. import DictDataSelect from '../sys/dict-data-select.vue'
  423. export default {
  424. components: {
  425. DictDataSelect,
  426. Chooselist
  427. },
  428. watch: {
  429. searchData: {
  430. deep: true,
  431. handler: function (newV, oldV) {
  432. this.searchData.partNo = this.searchData.partNo.toUpperCase()
  433. }
  434. },
  435. modalData: {
  436. deep: true,
  437. handler: function (newV, oldV) {
  438. this.modalData.partNo = this.modalData.partNo.toUpperCase()
  439. //this.modalData.umId = this.modalData.umId.toUpperCase()
  440. this.modalData.codeNo = this.modalData.codeNo.toUpperCase()
  441. }
  442. },
  443. itemData: {
  444. deep: true,
  445. handler: function (newV, oldV) {
  446. this.itemData.propertiesItemNo = this.itemData.propertiesItemNo.toUpperCase()
  447. }
  448. }
  449. },
  450. data () {
  451. return {
  452. // 导出
  453. exportData: [],
  454. exportName: '物料档案管理' + this.dayjs().format('YYYYMMDDHHmmss'),
  455. exportHeader: ['物料档案管理'],
  456. exportFooter: [],
  457. resultList: [],
  458. // ======== 行高 ========
  459. height: 200,
  460. secondHeight: 200,
  461. // ======== 分页 ========
  462. pageIndex: 1,
  463. pageSize: 50,
  464. totalPage: 0,
  465. selectedDataNum: 0,
  466. tempCodeNo: '',
  467. // 条件查询
  468. searchData: {
  469. site: this.$store.state.user.site,
  470. partNo: '',
  471. partDesc: '',
  472. page: 1,
  473. limit: 10
  474. },
  475. // 其它
  476. // 初始页签
  477. activeTable: 'part_item',
  478. // ======== 数据对象 ========
  479. modalData: {
  480. flag: '',
  481. site: '',
  482. title: '',
  483. partNo: '',
  484. partDesc: '',
  485. umId: '',
  486. umName: '',
  487. partMainGroup: '',
  488. groupName: '',
  489. weightNet: '',
  490. uomForWeightNet: '',
  491. volumeNet: '',
  492. uomForVolumeNet: '',
  493. codeNo: '',
  494. codeDesc: '',
  495. conditionCodeUsageDb: '',
  496. multilevelTrackingDb: '',
  497. allowAsNotConsumedDb: '',
  498. lotTrackingCode: '',
  499. lotQuantityRule: '',
  500. subLotRule: '',
  501. componentLotRule: '',
  502. createDate: '',
  503. createBy: '',
  504. updateDate: '',
  505. updateBy: '',
  506. officialFlag: ''
  507. },
  508. itemData: {
  509. site: this.$store.state.user.site,
  510. partNo: '',
  511. propertiesItemNo: '',
  512. codeNo: '',
  513. itemDesc: '',
  514. textValue: '',
  515. numValue: '',
  516. recordType: 'MP'
  517. },
  518. // ======== 数据列表 ========
  519. dataList: [],
  520. partItemList: [],
  521. updatePartItemList: [],
  522. availableValueList:[],
  523. itemSelections1: [],
  524. itemSelections2: [],
  525. itemList1:[],
  526. itemList2:[],
  527. copyAttributeList: [],
  528. // ======== 列表表头 ========
  529. columnList: [
  530. {
  531. userId: this.$store.state.user.name,
  532. functionId: 104001,
  533. serialNumber: '104001Table1PartNo',
  534. tableId: '104001Table1',
  535. tableName: '物料信息表',
  536. columnProp: 'partNo',
  537. headerAlign: 'center',
  538. align: 'center',
  539. columnLabel: '物料编码',
  540. columnHidden: false,
  541. columnImage: false,
  542. columnSortable: false,
  543. sortLv: 0,
  544. status: true,
  545. fixed: '',
  546. columnWidth: 120
  547. },
  548. {
  549. userId: this.$store.state.user.name,
  550. functionId: 104001,
  551. serialNumber: '104001Table1PartDesc',
  552. tableId: '104001Table1',
  553. tableName: '物料信息表',
  554. columnProp: 'partDesc',
  555. headerAlign: 'center',
  556. align: 'left',
  557. columnLabel: '物料名称',
  558. columnHidden: false,
  559. columnImage: false,
  560. columnSortable: false,
  561. sortLv: 0,
  562. status: true,
  563. fixed: '',
  564. columnWidth: 150
  565. },
  566. {
  567. userId: this.$store.state.user.name,
  568. functionId: 104001,
  569. serialNumber: '104001Table1OfficialFlag',
  570. tableId: '104001Table1',
  571. tableName: '物料信息表',
  572. columnProp: 'officialFlagDesc',
  573. headerAlign: 'center',
  574. align: 'center',
  575. columnLabel: '物料状态',
  576. columnHidden: false,
  577. columnImage: false,
  578. columnSortable: false,
  579. sortLv: 0,
  580. status: true,
  581. fixed: '',
  582. columnWidth: 100
  583. },
  584. {
  585. userId: this.$store.state.user.name,
  586. functionId: 104001,
  587. serialNumber: '104001Table1OfficialFlag',
  588. tableId: '104001Table1',
  589. tableName: '物料信息表',
  590. columnProp: 'umId',
  591. headerAlign: 'center',
  592. align: 'left',
  593. columnLabel: '计量单位',
  594. columnHidden: false,
  595. columnImage: false,
  596. columnSortable: false,
  597. sortLv: 0,
  598. status: true,
  599. fixed: '',
  600. columnWidth: 100
  601. },
  602. {
  603. userId: this.$store.state.user.name,
  604. functionId: 104001,
  605. serialNumber: '104001Table1WeightNet',
  606. tableId: '104001Table1',
  607. tableName: '物料信息表',
  608. columnProp: 'weightNet',
  609. headerAlign: 'center',
  610. align: 'right',
  611. columnLabel: '净重',
  612. columnHidden: false,
  613. columnImage: false,
  614. columnSortable: false,
  615. sortLv: 0,
  616. status: true,
  617. fixed: '',
  618. columnWidth: 100
  619. },
  620. {
  621. userId: this.$store.state.user.name,
  622. functionId: 104001,
  623. serialNumber: '104001Table1UomForWeightNet',
  624. tableId: '104001Table1',
  625. tableName: '物料信息表',
  626. columnProp: 'uomForWeightNet',
  627. headerAlign: 'center',
  628. align: 'center',
  629. columnLabel: '净重单位',
  630. columnHidden: false,
  631. columnImage: false,
  632. columnSortable: false,
  633. sortLv: 0,
  634. status: true,
  635. fixed: '',
  636. columnWidth: 100
  637. },
  638. {
  639. userId: this.$store.state.user.name,
  640. functionId: 104001,
  641. serialNumber: '104001Table1VolumeNet',
  642. tableId: '104001Table1',
  643. tableName: '物料信息表',
  644. columnProp: 'volumeNet',
  645. headerAlign: 'center',
  646. align: 'right',
  647. columnLabel: '体积',
  648. columnHidden: false,
  649. columnImage: false,
  650. columnSortable: false,
  651. sortLv: 0,
  652. status: true,
  653. fixed: '',
  654. columnWidth: 100
  655. },
  656. {
  657. userId: this.$store.state.user.name,
  658. functionId: 104001,
  659. serialNumber: '104001Table1UomForVolumeNet',
  660. tableId: '104001Table1',
  661. tableName: '物料信息表',
  662. columnProp: 'uomForVolumeNet',
  663. headerAlign: 'center',
  664. align: 'center',
  665. columnLabel: '体积单位',
  666. columnHidden: false,
  667. columnImage: false,
  668. columnSortable: false,
  669. sortLv: 0,
  670. status: true,
  671. fixed: '',
  672. columnWidth: 100
  673. },
  674. // {
  675. // userId: this.$store.state.user.name,
  676. // functionId: 104001,
  677. // serialNumber: '104001Table1GroupName',
  678. // tableId: '104001Table1',
  679. // tableName: '物料信息表',
  680. // columnProp: 'groupName',
  681. // headerAlign: 'center',
  682. // align: 'center',
  683. // columnLabel: '物料分组',
  684. // columnHidden: false,
  685. // columnImage: false,
  686. // columnSortable: false,
  687. // sortLv: 0,
  688. // status: true,
  689. // fixed: '',
  690. // columnWidth: 100
  691. // },
  692. {
  693. userId: this.$store.state.user.name,
  694. functionId: 104001,
  695. serialNumber: '104001Table1CodeDesc',
  696. tableId: '104001Table1',
  697. tableName: '物料信息表',
  698. columnProp: 'codeDesc',
  699. headerAlign: 'center',
  700. align: 'center',
  701. columnLabel: '属性模板',
  702. columnHidden: false,
  703. columnImage: false,
  704. columnSortable: false,
  705. sortLv: 0,
  706. status: true,
  707. fixed: '',
  708. columnWidth: 100
  709. },
  710. {
  711. userId: this.$store.state.user.name,
  712. functionId: 104001,
  713. serialNumber: '104001Table1ConditionCodeUsageDb',
  714. tableId: '104001Table1',
  715. tableName: '物料信息表',
  716. columnProp: 'conditionCodeUsageDb',
  717. headerAlign: 'center',
  718. align: 'center',
  719. columnLabel: '允许条件代码',
  720. columnHidden: false,
  721. columnImage: false,
  722. columnSortable: false,
  723. sortLv: 0,
  724. status: true,
  725. fixed: '',
  726. columnWidth: 100
  727. },
  728. {
  729. userId: this.$store.state.user.name,
  730. functionId: 104001,
  731. serialNumber: '104001Table1MultilevelTrackingDb',
  732. tableId: '104001Table1',
  733. tableName: '物料信息表',
  734. columnProp: 'multilevelTrackingDb',
  735. headerAlign: 'center',
  736. align: 'center',
  737. columnLabel: '多级跟踪',
  738. columnHidden: false,
  739. columnImage: false,
  740. columnSortable: false,
  741. sortLv: 0,
  742. status: true,
  743. fixed: '',
  744. columnWidth: 100
  745. },
  746. {
  747. userId: this.$store.state.user.name,
  748. functionId: 104001,
  749. serialNumber: '104001Table1AllowAsNotConsumedDb',
  750. tableId: '104001Table1',
  751. tableName: '物料信息表',
  752. columnProp: 'allowAsNotConsumedDb',
  753. headerAlign: 'center',
  754. align: 'center',
  755. columnLabel: '允许为未使用',
  756. columnHidden: false,
  757. columnImage: false,
  758. columnSortable: false,
  759. sortLv: 0,
  760. status: true,
  761. fixed: '',
  762. columnWidth: 100
  763. },
  764. {
  765. userId: this.$store.state.user.name,
  766. functionId: 104001,
  767. serialNumber: '104001Table1LotTrackingCode',
  768. tableId: '104001Table1',
  769. tableName: '物料信息表',
  770. columnProp: 'lotTrackingCode',
  771. headerAlign: 'center',
  772. align: 'center',
  773. columnLabel: '批次/批次跟踪',
  774. columnHidden: false,
  775. columnImage: false,
  776. columnSortable: false,
  777. sortLv: 0,
  778. status: true,
  779. fixed: '',
  780. columnWidth: 120
  781. },
  782. {
  783. userId: this.$store.state.user.name,
  784. functionId: 104001,
  785. serialNumber: '104001Table1LotQuantityRule',
  786. tableId: '104001Table1',
  787. tableName: '物料信息表',
  788. columnProp: 'lotQuantityRule',
  789. headerAlign: 'center',
  790. align: 'center',
  791. columnLabel: '批量规则',
  792. columnHidden: false,
  793. columnImage: false,
  794. columnSortable: false,
  795. sortLv: 0,
  796. status: true,
  797. fixed: '',
  798. columnWidth: 120
  799. },
  800. {
  801. userId: this.$store.state.user.name,
  802. functionId: 104001,
  803. serialNumber: '104001Table1SubLotRule',
  804. tableId: '104001Table1',
  805. tableName: '物料信息表',
  806. columnProp: 'subLotRule',
  807. headerAlign: 'center',
  808. align: 'center',
  809. columnLabel: '子批次规则',
  810. columnHidden: false,
  811. columnImage: false,
  812. columnSortable: false,
  813. sortLv: 0,
  814. status: true,
  815. fixed: '',
  816. columnWidth: 120
  817. },
  818. {
  819. userId: this.$store.state.user.name,
  820. functionId: 104001,
  821. serialNumber: '104001Table1ComponentLotRule',
  822. tableId: '104001Table1',
  823. tableName: '物料信息表',
  824. columnProp: 'componentLotRule',
  825. headerAlign: 'center',
  826. align: 'center',
  827. columnLabel: '组件批次规则',
  828. columnHidden: false,
  829. columnImage: false,
  830. columnSortable: false,
  831. sortLv: 0,
  832. status: true,
  833. fixed: '',
  834. columnWidth: 120
  835. },
  836. {
  837. userId: this.$store.state.user.name,
  838. functionId: 104001,
  839. serialNumber: '104001Table1CreateDate',
  840. tableId: '104001Table1',
  841. tableName: '物料信息表',
  842. columnProp: 'createDate',
  843. headerAlign: 'center',
  844. align: 'center',
  845. columnLabel: '创建时间',
  846. columnHidden: false,
  847. columnImage: false,
  848. columnSortable: false,
  849. sortLv: 0,
  850. status: true,
  851. fixed: '',
  852. columnWidth: 160
  853. },
  854. {
  855. userId: this.$store.state.user.name,
  856. functionId: 104001,
  857. serialNumber: '104001Table1CreateBy',
  858. tableId: '104001Table1',
  859. tableName: '物料信息表',
  860. columnProp: 'createBy',
  861. headerAlign: 'center',
  862. align: 'center',
  863. columnLabel: '创建人',
  864. columnHidden: false,
  865. columnImage: false,
  866. columnSortable: false,
  867. sortLv: 0,
  868. status: true,
  869. fixed: '',
  870. columnWidth: 80
  871. },
  872. {
  873. userId: this.$store.state.user.name,
  874. functionId: 104001,
  875. serialNumber: '104001Table1UpdateDate',
  876. tableId: '104001Table1',
  877. tableName: '物料信息表',
  878. columnProp: 'updateDate',
  879. headerAlign: 'center',
  880. align: 'center',
  881. columnLabel: '更新时间',
  882. columnHidden: false,
  883. columnImage: false,
  884. columnSortable: false,
  885. sortLv: 0,
  886. status: true,
  887. fixed: '',
  888. columnWidth: 160
  889. },
  890. {
  891. userId: this.$store.state.user.name,
  892. functionId: 104001,
  893. serialNumber: '104001Table1UpdateBy',
  894. tableId: '104001Table1',
  895. tableName: '物料信息表',
  896. columnProp: 'updateBy',
  897. headerAlign: 'center',
  898. align: 'center',
  899. columnLabel: '更新人',
  900. columnHidden: false,
  901. columnImage: false,
  902. columnSortable: false,
  903. sortLv: 0,
  904. status: true,
  905. fixed: '',
  906. columnWidth: 80
  907. }
  908. ],
  909. columnItemList: [
  910. {
  911. userId: this.$store.state.user.name,
  912. functionId: 104001,
  913. serialNumber: '104001Table2PropertiesItemID',
  914. tableId: "104001Table2",
  915. tableName: "物料属性表",
  916. columnProp: 'propertiesItemNo',
  917. headerAlign: "center",
  918. align: "center",
  919. columnLabel: '属性编码',
  920. columnHidden: false,
  921. columnImage: false,
  922. columnSortable: true,
  923. sortLv: 0,
  924. status: true,
  925. fixed: '',
  926. columnWidth: 100,
  927. },
  928. {
  929. userId: this.$store.state.user.name,
  930. functionId: 104001,
  931. serialNumber: '104001Table2PropertiesItemDesc',
  932. tableId: "104001Table2",
  933. tableName: "物料属性表",
  934. columnProp: 'itemDesc',
  935. headerAlign: "center",
  936. align: "left",
  937. columnLabel: '属性名称',
  938. columnHidden: false,
  939. columnImage: false,
  940. columnSortable: true,
  941. sortLv: 0,
  942. status: true,
  943. fixed: '',
  944. columnWidth: 120,
  945. },
  946. {
  947. userId: this.$store.state.user.name,
  948. functionId: 104001,
  949. serialNumber: '104001Table2ValueType',
  950. tableId: "104001Table2",
  951. tableName: "物料属性表",
  952. columnProp: 'valueType',
  953. headerAlign: "center",
  954. align: "center",
  955. columnLabel: '属性类型',
  956. columnHidden: false,
  957. columnImage: false,
  958. columnSortable: true,
  959. sortLv: 0,
  960. status: true,
  961. fixed: '',
  962. columnWidth: 100,
  963. },
  964. {
  965. userId: this.$store.state.user.name,
  966. functionId: 104001,
  967. serialNumber: '104001Table2ValueChooseFlag',
  968. tableId: "104001Table2",
  969. tableName: "物料属性表",
  970. columnProp: 'textValue',
  971. headerAlign: "center",
  972. align: "left",
  973. columnLabel: '属性值',
  974. columnHidden: false,
  975. columnImage: false,
  976. columnSortable: true,
  977. sortLv: 0,
  978. status: true,
  979. fixed: '',
  980. columnWidth: 100,
  981. },
  982. // {
  983. // userId: this.$store.state.user.name,
  984. // functionId: 104001,
  985. // serialNumber: '104001Table2ValueChooseFlag',
  986. // tableId: "104001Table2",
  987. // tableName: "物料属性表",
  988. // columnProp: 'numValue',
  989. // headerAlign: "center",
  990. // align: "center",
  991. // columnLabel: '数字值',
  992. // columnHidden: false,
  993. // columnImage: false,
  994. // columnSortable: true,
  995. // sortLv: 0,
  996. // status: true,
  997. // fixed: '',
  998. // columnWidth: 70,
  999. // },
  1000. ],
  1001. updateColumnItemList: [
  1002. {
  1003. userId: this.$store.state.user.name,
  1004. functionId: 104001,
  1005. serialNumber: '104001Table6PropertiesItemID',
  1006. tableId: "104001Table6",
  1007. tableName: "物料属性表",
  1008. columnProp: 'propertiesItemNo',
  1009. headerAlign: "center",
  1010. align: "center",
  1011. columnLabel: '属性编码',
  1012. columnHidden: false,
  1013. columnImage: false,
  1014. columnSortable: true,
  1015. sortLv: 0,
  1016. status: true,
  1017. fixed: '',
  1018. columnWidth: 90,
  1019. },
  1020. {
  1021. userId: this.$store.state.user.name,
  1022. functionId: 104001,
  1023. serialNumber: '104001Table6PropertiesItemDesc',
  1024. tableId: "104001Table6",
  1025. tableName: "物料属性表",
  1026. columnProp: 'itemDesc',
  1027. headerAlign: "center",
  1028. align: "center",
  1029. columnLabel: '属性名称',
  1030. columnHidden: false,
  1031. columnImage: false,
  1032. columnSortable: true,
  1033. sortLv: 0,
  1034. status: true,
  1035. fixed: '',
  1036. columnWidth: 90,
  1037. },
  1038. {
  1039. userId: this.$store.state.user.name,
  1040. functionId: 104001,
  1041. serialNumber: '104001Table6ValueType',
  1042. tableId: "104001Table6",
  1043. tableName: "物料属性表",
  1044. columnProp: 'valueType',
  1045. headerAlign: "center",
  1046. align: "center",
  1047. columnLabel: '属性类型',
  1048. columnHidden: false,
  1049. columnImage: false,
  1050. columnSortable: true,
  1051. sortLv: 0,
  1052. status: true,
  1053. fixed: '',
  1054. columnWidth: 70,
  1055. },
  1056. ],
  1057. // ======== 必填规则 ========
  1058. rules: {
  1059. partNo: [
  1060. {
  1061. required: true,
  1062. message: ' ',
  1063. trigger: 'change'
  1064. }
  1065. ],
  1066. partDesc: [
  1067. {
  1068. required: true,
  1069. message: ' ',
  1070. trigger: 'change'
  1071. }
  1072. ],
  1073. umId: [
  1074. {
  1075. required: true,
  1076. message: ' ',
  1077. trigger: 'change'
  1078. }
  1079. ],
  1080. codeDesc: [
  1081. {
  1082. required: true,
  1083. message: ' ',
  1084. trigger: 'change'
  1085. }
  1086. ]
  1087. },
  1088. // ======== 复选数据集 ========
  1089. partSelections: [],
  1090. // ======== 选中的当前行数据 ========
  1091. partCurrentRow: {},
  1092. // ======== 模态框开关控制 ========
  1093. modalFlag: false,
  1094. modalDisableFlag: false,
  1095. itemChooseFlag: false,
  1096. itemTextDisableFlag: false,
  1097. itemNumberDisableFlag: false,
  1098. itemModalDisableFlag: false,
  1099. itemModalFlag: false,
  1100. agentModelFlag: false,
  1101. manufacturerModelFlag: false,
  1102. updateItemModelFlag: false,
  1103. fastAddFlag: false,
  1104. loading: false,
  1105. attributeDialog: true,
  1106. }
  1107. },
  1108. mounted () {
  1109. this.$nextTick(() => {
  1110. this.height = window.innerHeight / 2 - 30
  1111. /*第二个表格高度的动态调整*/
  1112. this.secondHeight = window.innerHeight - this.height - 175
  1113. })
  1114. },
  1115. created () {
  1116. this.getDataList()
  1117. },
  1118. methods: {
  1119. focusNextInput (index, type) {
  1120. let aaa = ''
  1121. if (this.updatePartItemList.length - 1 === index) {
  1122. aaa = `${type}0`
  1123. } else {
  1124. aaa = `${type}${index + 1}`
  1125. }
  1126. this.$nextTick(() => {
  1127. this.$refs[aaa].focus()
  1128. })
  1129. },
  1130. clickSave () {
  1131. if (this.partItemList.length === 0) {
  1132. return false
  1133. }
  1134. if (!this.attributeDialog) { // 保存
  1135. this.updateItemValue()
  1136. } else { // 编辑
  1137. this.copyAttributeList = JSON.parse(JSON.stringify(this.partItemList))
  1138. this.attributeDialog = false
  1139. }
  1140. },
  1141. // 编辑物料属性
  1142. updateItemValue () {
  1143. this.loading = true
  1144. let tempData = {
  1145. site: this.$store.state.user.site,
  1146. updateBy: this.$store.state.user.name,
  1147. itemList: JSON.parse(JSON.stringify(this.copyAttributeList))
  1148. }
  1149. commitItemValue(tempData).then(({data}) => {
  1150. if (data && data.code === 0) {
  1151. this.getMasterPartItem()
  1152. this.attributeDialog = true
  1153. this.$message({
  1154. message: '操作成功',
  1155. type: 'success',
  1156. duration: 1500,
  1157. onClose: () => {}
  1158. })
  1159. } else {
  1160. this.$alert(data.msg, '错误', {
  1161. confirmButtonText: '确定'
  1162. })
  1163. }
  1164. this.loading = false
  1165. }).catch((error) => {
  1166. this.$message.error(error)
  1167. this.loading = false
  1168. })
  1169. },
  1170. // 新增/删除物料属性
  1171. addOrDelItem () {
  1172. if (!this.attributeDialog) {
  1173. this.$message.warning('请保存更改!')
  1174. return
  1175. }
  1176. this.itemSelections1 = null
  1177. this.itemSelections2 = null
  1178. this.itemData.propertiesItemNo = ''
  1179. this.itemData.itemDesc = ''
  1180. let tempData = {
  1181. site: this.$store.state.user.site,
  1182. partNo: this.partCurrentRow.partNo,
  1183. codeNo: this.partCurrentRow.codeNo,
  1184. recordType: 'MP'
  1185. }
  1186. getItemLists(tempData).then(({data}) => {
  1187. this.itemList1 = data.rows.row1
  1188. this.itemList2 = data.rows.row2
  1189. })
  1190. this.fastAddFlag = true
  1191. },
  1192. // 可选属性
  1193. itemClickRow1 (row) {
  1194. this.$refs.itemTable1.toggleRowSelection(row)
  1195. },
  1196. // 已有属性
  1197. itemClickRow2 (row) {
  1198. this.$refs.itemTable2.toggleRowSelection(row)
  1199. },
  1200. selectionItem1 (val) {
  1201. this.itemSelections1 = val
  1202. },
  1203. selectionItem2 (val) {
  1204. this.itemSelections2 = val
  1205. },
  1206. // 物料项目新增
  1207. addItem () {
  1208. if (this.itemSelections1 == null || this.itemSelections1.length === 0) {
  1209. this.$message.warning('请选择可选属性!')
  1210. return
  1211. }
  1212. let inData = {
  1213. site: this.$store.state.user.site,
  1214. partNo: this.partCurrentRow.partNo,
  1215. codeNo: this.partCurrentRow.codeNo,
  1216. codeDesc: this.partCurrentRow.codeDesc,
  1217. recordType: 'MP',
  1218. updateBy: this.$store.state.user.name,
  1219. itemList: this.itemSelections1
  1220. }
  1221. addMasterPartItem(inData).then(({data}) => {
  1222. if (data && data.code === 0) {
  1223. getItemLists(inData).then(({data}) => {
  1224. this.itemList1 = data.rows.row1
  1225. this.itemList2 = data.rows.row2
  1226. })
  1227. this.getMasterPartItem()
  1228. this.itemSelections1 = []
  1229. } else {
  1230. this.$alert(data.msg, '错误', {
  1231. confirmButtonText: '确定'
  1232. })
  1233. }
  1234. })
  1235. },
  1236. // 物料项目删除
  1237. deleteItem () {
  1238. if (this.itemSelections2 == null || this.itemSelections2.length === 0) {
  1239. this.$message.warning('请选择已有属性!')
  1240. return
  1241. }
  1242. let inData = {
  1243. site: this.$store.state.user.site,
  1244. partNo: this.partCurrentRow.partNo,
  1245. codeNo: this.partCurrentRow.codeNo,
  1246. codeDesc: this.partCurrentRow.codeDesc,
  1247. recordType: 'MP',
  1248. updateBy: this.$store.state.user.name,
  1249. itemList: this.itemSelections2
  1250. }
  1251. deleteMasterPartItem(inData).then(({data}) => {
  1252. if (data && data.code === 0) {
  1253. getItemLists(inData).then(({data}) => {
  1254. this.itemList1 = data.rows.row1
  1255. this.itemList2 = data.rows.row2
  1256. })
  1257. this.getMasterPartItem()
  1258. this.itemSelections2 = []
  1259. } else {
  1260. this.$alert(data.msg, '错误', {
  1261. confirmButtonText: '确定'
  1262. })
  1263. }
  1264. })
  1265. },
  1266. // 查询物料项目
  1267. queryMasterPartItem () {
  1268. this.itemData.partNo = this.partCurrentRow.partNo
  1269. this.itemData.codeNo = this.partCurrentRow.codeNo
  1270. this.itemData.partNo = this.partCurrentRow.partNo
  1271. queryMasterPartItem(this.itemData).then(({data}) => {
  1272. if (data && data.code === 0) {
  1273. this.itemList1 = data.rows
  1274. } else {
  1275. this.itemList1 = []
  1276. }
  1277. })
  1278. },
  1279. // 确认修改物料属性
  1280. commitItemValue () {
  1281. let tempData = {
  1282. site: this.$store.state.user.site,
  1283. updateBy: this.$store.state.user.name,
  1284. itemList: JSON.parse(JSON.stringify(this.updatePartItemList))
  1285. }
  1286. commitItemValue(tempData).then(({data}) => {
  1287. if (data && data.code === 0) {
  1288. this.getMasterPartItem()
  1289. this.updateItemModelFlag = false
  1290. this.$message({
  1291. message: '操作成功',
  1292. type: 'success',
  1293. duration: 1500,
  1294. onClose: () => {}
  1295. })
  1296. } else {
  1297. this.$alert(data.msg, '错误', {
  1298. confirmButtonText: '确定'
  1299. })
  1300. }
  1301. })
  1302. },
  1303. // ======== 分页相关方法 ========
  1304. // 每页数
  1305. sizeChangeHandle (val) {
  1306. this.pageSize = val
  1307. this.pageIndex = 1
  1308. this.getDataList()
  1309. },
  1310. // 当前页
  1311. currentChangeHandle (val) {
  1312. this.pageIndex = val
  1313. this.getDataList()
  1314. },
  1315. // ======== 页签切换相关方法 ========
  1316. // 列表表格选择替换
  1317. tabClick (tab, event) {
  1318. // 刷新列表数据
  1319. this.refreshCurrentTabTable()
  1320. },
  1321. // 当前值发生变化的时候修改
  1322. changeCurrentRow (row, oldRow) {
  1323. // 判断是否是获取焦点的事件
  1324. if (row) {
  1325. this.partCurrentRow = JSON.parse(JSON.stringify(row))
  1326. // 刷新当前页表
  1327. this.refreshCurrentTabTable()
  1328. }
  1329. },
  1330. // 刷新页签的table数据
  1331. refreshCurrentTabTable () {
  1332. if (this.activeTable === 'part_item') {
  1333. this.getMasterPartItem()
  1334. }
  1335. },
  1336. // ======== 列表数据刷新方法 ========
  1337. // 查询物料属性
  1338. getMasterPartItem () {
  1339. let tempData = {
  1340. site: this.$store.state.user.site,
  1341. partNo: this.partCurrentRow.partNo,
  1342. codeNo: this.partCurrentRow.codeNo,
  1343. recordType: 'MP',
  1344. updateBy: this.$store.state.user.name,
  1345. }
  1346. getMasterPartItem(tempData).then(({data}) => {
  1347. if (data && data.code === 0) {
  1348. this.partItemList = data.rows
  1349. } else {
  1350. this.partItemList = []
  1351. }
  1352. })
  1353. },
  1354. // ======== 列表数据刷新方法 ========
  1355. // 获取数据列表
  1356. getDataList () {
  1357. this.searchData.limit = this.pageSize
  1358. this.searchData.page = this.pageIndex
  1359. masterPartSearch(this.searchData).then(({data}) => {
  1360. if (data.code === 0) {
  1361. this.dataList = data.page.list
  1362. this.pageIndex = data.page.currPage
  1363. this.pageSize = data.page.pageSize
  1364. this.totalPage = data.page.totalCount
  1365. this.$refs.selectDiv.setLengthAll( this.dataList.length)
  1366. // 判断是否全部存在数据
  1367. if (this.dataList.length > 0) {
  1368. // 设置选中行
  1369. this.$refs.partTable.setCurrentRow(this.dataList[0])
  1370. this.partClickRow(this.dataList[0])
  1371. } else {
  1372. this.partCurrentRow = {}
  1373. }
  1374. }
  1375. })
  1376. },
  1377. // ======== 新增/编辑模态框 ========
  1378. // 物料信息新增模态框
  1379. addModal () {
  1380. getProjectPartNo(this.searchData).then(({data}) => {
  1381. if (data && data.code === 0) {
  1382. this.modalData = {
  1383. flag: '1',
  1384. site: this.$store.state.user.site,
  1385. title: '物料新增',
  1386. partNo: data.partNo,
  1387. partDesc: '',
  1388. umId: '',
  1389. umName: '',
  1390. partMainGroup: '',
  1391. groupName: '',
  1392. weightNet: '',
  1393. uomForWeightNet: '',
  1394. volumeNet: '',
  1395. uomForVolumeNet: '',
  1396. codeNo: '',
  1397. codeDesc: '',
  1398. conditionCodeUsageDb: '',
  1399. multilevelTrackingDb: '',
  1400. allowAsNotConsumedDb: '',
  1401. lotTrackingCode: 'Order Based',
  1402. lotQuantityRule: 'Many Lots Per Production Order',
  1403. subLotRule: 'No Sub Lots Allowed',
  1404. componentLotRule: 'Many Lots Allowed',
  1405. createBy: this.$store.state.user.name,
  1406. officialFlag: 'N'
  1407. }
  1408. this.modalDisableFlag = false
  1409. this.modalFlag = true
  1410. } else {
  1411. this.$message.error(data.msg)
  1412. }
  1413. })
  1414. },
  1415. // 物料信息编辑模态框
  1416. updateModal (row) {
  1417. this.modalData = {
  1418. flag: '2',
  1419. title: '物料编辑',
  1420. site: this.$store.state.user.site,
  1421. partNo: row.partNo,
  1422. partDesc: row.partDesc,
  1423. umId: row.umId,
  1424. umName: row.umName,
  1425. partMainGroup: row.partMainGroup,
  1426. groupName: row.groupName,
  1427. weightNet: row.weightNet,
  1428. uomForWeightNet: row.uomForWeightNet,
  1429. volumeNet: row.volumeNet,
  1430. uomForVolumeNet: row.uomForVolumeNet,
  1431. codeNo: row.codeNo,
  1432. codeDesc: row.codeDesc,
  1433. conditionCodeUsageDb: row.conditionCodeUsageDb,
  1434. multilevelTrackingDb: row.multilevelTrackingDb,
  1435. allowAsNotConsumedDb: row.allowAsNotConsumedDb,
  1436. lotTrackingCode: row.lotTrackingCode,
  1437. lotQuantityRule: row.lotQuantityRule,
  1438. subLotRule: row.subLotRule,
  1439. componentLotRule: row.componentLotRule,
  1440. updateBy: this.$store.state.user.name,
  1441. officialFlag: row.officialFlag
  1442. }
  1443. this.modalDisableFlag = true
  1444. this.modalFlag = true
  1445. },
  1446. // ======== 新增/编辑/删除方法 ========
  1447. // 物料信息新增/编辑
  1448. saveData () {
  1449. if (this.modalData.partNo === '' || this.modalData.partNo == null) {
  1450. this.$message.warning('请填写物料编码!')
  1451. return
  1452. }
  1453. if (this.modalData.partDesc === '' || this.modalData.partDesc == null) {
  1454. this.$message.warning('请填写物料描述!')
  1455. return
  1456. }
  1457. if (this.modalData.umId === '' || this.modalData.umId == null) {
  1458. this.$message.warning('请选择计量单位!')
  1459. return
  1460. }
  1461. if (this.modalData.flag === '1') {
  1462. masterPartInformationSave(this.modalData).then(({data}) => {
  1463. if (data && data.code === 0) {
  1464. this.getDataList()
  1465. this.modalFlag = false
  1466. this.$message({
  1467. message: '操作成功',
  1468. type: 'success',
  1469. duration: 1500,
  1470. onClose: () => {}
  1471. })
  1472. } else {
  1473. this.$alert(data.msg, '错误', {
  1474. confirmButtonText: '确定'
  1475. })
  1476. }
  1477. })
  1478. } else {
  1479. masterPartInformationEdit(this.modalData).then(({data}) => {
  1480. if (data && data.code === 0) {
  1481. this.getDataList()
  1482. this.modalFlag = false
  1483. this.$message({
  1484. message: '操作成功',
  1485. type: 'success',
  1486. duration: 1500,
  1487. onClose: () => {}
  1488. })
  1489. } else {
  1490. this.$alert(data.msg, '错误', {
  1491. confirmButtonText: '确定'
  1492. })
  1493. }
  1494. })
  1495. }
  1496. },
  1497. // 物料信息删除
  1498. delModal () {
  1499. if (this.partSelections.length === 0) {
  1500. this.$message.warning('请勾选要删除的物料信息!')
  1501. return
  1502. }
  1503. this.$confirm(`是否删除这 `+ this.partSelections.length +` 条物料信息?`, '提示', {
  1504. confirmButtonText: '确定',
  1505. cancelButtonText: '取消',
  1506. type: 'warning'
  1507. }).then(() => {
  1508. let tempData = {
  1509. informationList: this.partSelections
  1510. }
  1511. masterPartInformationDelete(tempData).then(({data}) => {
  1512. if (data && data.code === 0) {
  1513. this.getDataList()
  1514. this.partSelections = []
  1515. this.$message({
  1516. message: '操作成功',
  1517. type: 'success',
  1518. duration: 1500,
  1519. onClose: () => {}
  1520. })
  1521. } else {
  1522. this.$alert(data.msg, '错误', {
  1523. confirmButtonText: '确定'
  1524. })
  1525. }
  1526. })
  1527. })
  1528. },
  1529. // ======== 列表操作方法 ========
  1530. // 单机选中物料信息
  1531. partClickRow (row) {
  1532. // this.$refs.partTable.toggleRowSelection(row)
  1533. this.partCurrentRow = JSON.parse(JSON.stringify(row))
  1534. },
  1535. // 复选物料信息
  1536. selectionPart (val) {
  1537. this.partSelections = val
  1538. this.$refs.selectDiv.setLengthselected(this.partSelections.length)
  1539. },
  1540. // 转正式物料
  1541. toBecomeOfficialPart () {
  1542. toBecomeOfficialMasterPart(this.modalData).then(({data}) => {
  1543. if (data && data.code === 0) {
  1544. this.getDataList()
  1545. this.modalFlag = false
  1546. this.$message({
  1547. message: '操作成功',
  1548. type: 'success',
  1549. duration: 1500,
  1550. onClose: () => {}
  1551. })
  1552. } else {
  1553. this.$alert(data.msg, '错误', {
  1554. confirmButtonText: '确定'
  1555. })
  1556. }
  1557. })
  1558. },
  1559. // ======== chooseList相关方法 ========
  1560. // 获取基础数据列表S
  1561. getBaseList (val, type) {
  1562. this.tagNo = val
  1563. this.tempCodeNo = this.modalData.codeNo
  1564. this.$nextTick(() => {
  1565. let strVal = ''
  1566. if (val === 1007) {
  1567. strVal = this.modalData.umId
  1568. } else if (val === 109) {
  1569. strVal = this.modalData.partMainGroup
  1570. } else if (val === 22) {
  1571. strVal = this.modalData.codeNo
  1572. }
  1573. this.$refs.baseList.init(val, strVal)
  1574. })
  1575. },
  1576. // 列表方法的回调
  1577. getBaseData (val) {
  1578. if (this.tagNo === 1007) {
  1579. this.modalData.umId = val.um_id
  1580. this.modalData.umName = val.um_name
  1581. } else if (this.tagNo === 109) {
  1582. this.modalData.partMainGroup = val.group_id
  1583. this.modalData.groupName = val.group_name
  1584. } else if (this.tagNo === 22) {
  1585. if (this.modalData.flag === '2') {
  1586. if (val.Code_no != this.tempCodeNo) {
  1587. this.$confirm(`更换属性模板将替换下方物料属性数据,请确认?`, '提示', {
  1588. confirmButtonText: '确定',
  1589. cancelButtonText: '取消',
  1590. type: 'warning'
  1591. }).then(() => {
  1592. this.modalData.codeNo = val.Code_no
  1593. this.$set(this.modalData, 'codeDesc', val.Code_desc)
  1594. }).catch(() => {
  1595. })
  1596. }
  1597. } else {
  1598. this.modalData.codeNo = val.Code_no
  1599. this.$set(this.modalData, 'codeDesc', val.Code_desc)
  1600. }
  1601. }
  1602. },
  1603. // 计量单位输入校验
  1604. umIdBlur (tagNo) {
  1605. if (this.modalData.umId != null && this.modalData.umId !== '') {
  1606. let tempData = {
  1607. tagno: tagNo,
  1608. conditionSql: " and um_id = '" + this.modalData.umId + "'"
  1609. }
  1610. verifyData(tempData).then(({data}) => {
  1611. if (data && data.code === 0) {
  1612. if (data.baseListData.length > 0) {
  1613. this.modalData.umId = data.baseListData[0].um_id
  1614. this.modalData.umName = data.baseListData[0].um_name
  1615. return
  1616. }
  1617. }
  1618. })
  1619. }
  1620. this.modalData.umName = ''
  1621. },
  1622. // 产品代码输入校验
  1623. groupIdBlur (tagNo) {
  1624. if (this.modalData.partMainGroup != null && this.modalData.partMainGroup !== '') {
  1625. let tempData = {
  1626. tagno: tagNo,
  1627. conditionSql: " and group_id = '" + this.modalData.partMainGroup + "'"
  1628. }
  1629. verifyData(tempData).then(({data}) => {
  1630. if (data && data.code === 0) {
  1631. if (data.baseListData.length > 0) {
  1632. this.modalData.partMainGroup = data.baseListData[0].group_id
  1633. this.modalData.groupName = data.baseListData[0].group_name
  1634. return
  1635. }
  1636. }
  1637. })
  1638. }
  1639. this.modalData.groupName = ''
  1640. },
  1641. // 属性模板输入校验
  1642. codeNoBlur (tagNo) {
  1643. if (this.modalData.codeNo != null && this.modalData.codeNo !== '') {
  1644. let tempData = {
  1645. tagno: tagNo,
  1646. conditionSql: " and Code_no = '" + this.modalData.codeNo + "'"
  1647. }
  1648. verifyData(tempData).then(({data}) => {
  1649. if (data && data.code === 0) {
  1650. if (data.baseListData.length > 0) {
  1651. this.modalData.codeNo = data.baseListData[0].Code_no
  1652. this.modalData.codeDesc = data.baseListData[0].Code_desc
  1653. return
  1654. }
  1655. }
  1656. })
  1657. }
  1658. this.modalData.codeDesc = ''
  1659. },
  1660. // ======== 导出相关方法 ========
  1661. // 导出excel
  1662. async createExportData () {
  1663. this.searchData.limit = -1
  1664. this.searchData.page = 1
  1665. await masterPartSearch(this.searchData).then(({data}) => {
  1666. this.resultList = data.page.list
  1667. })
  1668. return this.resultList
  1669. },
  1670. startDownload () {},
  1671. finishDownload () {},
  1672. fields () {
  1673. let json = '{'
  1674. this.columnList.forEach((item, index) => {
  1675. if (index == this.columnList.length - 1) {
  1676. json += '"' + item.columnLabel + '"' + ':' + '"' + item.columnProp + '"'
  1677. } else {
  1678. json += '"' + item.columnLabel + '"' + ':' + '"' + item.columnProp + '"' + ','
  1679. }
  1680. })
  1681. json += '}'
  1682. let s = eval('(' + json + ')')
  1683. return s
  1684. },
  1685. rowStyle ({row}) {
  1686. if (this.partCurrentRow.partNo === row.partNo) {
  1687. return { 'background-color': '#E8F7F6', cursor: 'pointer' };
  1688. }
  1689. },
  1690. }
  1691. }
  1692. </script>
  1693. <style scoped lang="scss">
  1694. /deep/ .customer-tab .el-tabs__content {
  1695. padding: 0px !important;
  1696. height: 459px;
  1697. }
  1698. /deep/ .customer-tab .el-tabs__content {
  1699. height: 294px;
  1700. }
  1701. .numInput /deep/ .el-input__inner{
  1702. text-align: right;
  1703. }
  1704. /deep/ .inlineNumber input::-webkit-outer-spin-button,
  1705. /deep/ .inlineNumber input::-webkit-inner-spin-button {
  1706. -webkit-appearance: none;
  1707. }
  1708. /deep/ .inlineNumber input[type="number"]{
  1709. -moz-appearance: textfield;
  1710. padding-right: 5px !important;
  1711. }
  1712. </style>