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.

1073 lines
35 KiB

  1. <template>
  2. <div class="mod-config">
  3. <!-- 查询表单 - rqrq -->
  4. <el-form :inline="true" label-position="top">
  5. <el-form-item label="条码号">
  6. <el-input style="width: 120px;" v-model="queryHeaderData.unitId" placeholder="请输入条码号" @keyup.enter.native="getDataList()"></el-input>
  7. </el-form-item>
  8. <el-form-item label="物料编号">
  9. <el-input style="width: 120px;" v-model="queryHeaderData.partNo" placeholder="请输入物料编号" @keyup.enter.native="getDataList()"></el-input>
  10. </el-form-item>
  11. <el-form-item label="批次号">
  12. <el-input style="width: 120px;" v-model="queryHeaderData.batchNo" placeholder="请输入批次号" @keyup.enter.native="getDataList()"></el-input>
  13. </el-form-item>
  14. <el-form-item label="库位">
  15. <el-input style="width: 120px;" v-model="queryHeaderData.locationId" placeholder="请输入库位" @keyup.enter.native="getDataList()"></el-input>
  16. </el-form-item>
  17. <el-form-item label="仓库">
  18. <el-input style="width: 120px;" v-model="queryHeaderData.warehouseId" placeholder="请输入仓库" @keyup.enter.native="getDataList()"></el-input>
  19. </el-form-item>
  20. <el-form-item style="margin-top: 20px;">
  21. <el-button @click="getDataList()" type="primary">查询</el-button>
  22. <el-button @click="resetQuery()" type="default">重置</el-button>
  23. </el-form-item>
  24. </el-form>
  25. <!-- 功能按钮区 - rqrq -->
  26. <el-form :inline="true" label-position="top" style="margin-top: 3px">
  27. <el-button @click="openChangeWdrDialog()" type="primary" :disabled="dataListSelections.length === 0">Change W/D/R</el-button>
  28. <el-button @click="openChangeExpDateDialog()" type="primary" :disabled="dataListSelections.length === 0">Change Expiration Date</el-button>
  29. <el-button @click="openChangeAvailDialog()" type="primary" :disabled="dataListSelections.length === 0">Change Availability Control ID</el-button>
  30. </el-form>
  31. <!-- 主表格 - rqrq -->
  32. <el-table
  33. :height="height"
  34. :data="dataList"
  35. border
  36. v-loading="dataListLoading"
  37. @selection-change="selectionChangeHandle"
  38. style="width: 100%; margin-bottom: 15px;margin-top:3px">
  39. <!-- 选择列 - rqrq -->
  40. <el-table-column
  41. type="selection"
  42. header-align="center"
  43. align="center"
  44. width="50"
  45. :selectable="checkSelectable">
  46. </el-table-column>
  47. <!-- 动态列配置 - rqrq -->
  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.columnProp === 'inStockFlag'">
  60. <span v-if="scope.row.inStockFlag === 'Y'">在库</span>
  61. <span v-else-if="scope.row.inStockFlag === 'N'">已出库</span>
  62. <span v-else-if="scope.row.inStockFlag === 'X'">未入库</span>
  63. <span v-else>{{ scope.row.inStockFlag }}</span>
  64. </span>
  65. <span v-else-if="item.columnProp === 'reserveFlag'">
  66. {{ scope.row.reserveFlag === 'Y' ? '是' : '否' }}
  67. </span>
  68. <span v-else-if="item.columnProp === 'freezeFlag'">
  69. {{ scope.row.freezeFlag === 'Y' ? '是' : '否' }}
  70. </span>
  71. <span v-else-if="item.columnProp === 'mergedFlag'">
  72. {{ scope.row.mergedFlag === 'Y' ? '是' : '否' }}
  73. </span>
  74. <span v-else-if="item.columnProp === 'manufactureDate' || item.columnProp === 'expiredDate' || item.columnProp === 'receiveDate' || item.columnProp === 'createdDate' || item.columnProp === 'modifiedDate' || item.columnProp === 'lastPrintDate'">
  75. {{ formatDate(scope.row[item.columnProp]) }}
  76. </span>
  77. <span v-else>{{ scope.row[item.columnProp] }}</span>
  78. </template>
  79. </el-table-column>
  80. <!-- 操作列 - rqrq -->
  81. <el-table-column label="操作" min-width="120" fixed="right" header-align="center" align="center">
  82. <template slot-scope="scope">
  83. <a @click="viewDetail(scope.row)" type="primary">查看详细</a>
  84. </template>
  85. </el-table-column>
  86. </el-table>
  87. <!-- 分页 - rqrq -->
  88. <el-pagination
  89. @size-change="sizeChangeHandle"
  90. @current-change="currentChangeHandle"
  91. :current-page="pageIndex"
  92. :page-sizes="[30, 100, 500]"
  93. :page-size="pageSize"
  94. :total="totalPage"
  95. layout="total, sizes, prev, pager, next, jumper">
  96. </el-pagination>
  97. <!-- 查看详细信息弹窗 - rqrq -->
  98. <el-dialog
  99. title="查看详细信息"
  100. :visible.sync="dialogVisible"
  101. :close-on-click-modal="false"
  102. v-drag
  103. width="900px">
  104. <el-form :model="formData" ref="dataForm" label-position="top" style="margin-top: 1px; margin-left: 0px;">
  105. <!-- 基本信息只读- rqrq -->
  106. <el-row :gutter="20">
  107. <el-col :span="6">
  108. <el-form-item label="条码号">
  109. <el-input v-model="formData.unitId" readonly></el-input>
  110. </el-form-item>
  111. </el-col>
  112. <el-col :span="6">
  113. <el-form-item label="物料编号">
  114. <el-input v-model="formData.partNo" readonly></el-input>
  115. </el-form-item>
  116. </el-col>
  117. <el-col :span="6">
  118. <el-form-item label="批次号">
  119. <el-input v-model="formData.batchNo" readonly></el-input>
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="6">
  123. <el-form-item label="数量">
  124. <el-input v-model="formData.qty" readonly></el-input>
  125. </el-form-item>
  126. </el-col>
  127. </el-row>
  128. <!-- 订单参考信息 - rqrq -->
  129. <el-row :gutter="20">
  130. <el-col :span="8">
  131. <el-form-item label="订单参考1">
  132. <el-input v-model="formData.orderRef1" readonly></el-input>
  133. </el-form-item>
  134. </el-col>
  135. <el-col :span="8">
  136. <el-form-item label="订单参考2">
  137. <el-input v-model="formData.orderRef2" readonly></el-input>
  138. </el-form-item>
  139. </el-col>
  140. <el-col :span="8">
  141. <el-form-item label="订单参考3">
  142. <el-input v-model="formData.orderRef3" readonly></el-input>
  143. </el-form-item>
  144. </el-col>
  145. </el-row>
  146. <!-- 供应商/客户信息 - rqrq -->
  147. <el-row :gutter="20">
  148. <el-col :span="12">
  149. <el-form-item label="供应商ID">
  150. <el-input v-model="formData.supplierId" readonly></el-input>
  151. </el-form-item>
  152. </el-col>
  153. <el-col :span="12">
  154. <el-form-item label="客户ID">
  155. <el-input v-model="formData.customerId" readonly></el-input>
  156. </el-form-item>
  157. </el-col>
  158. </el-row>
  159. <!-- 日期信息 - rqrq -->
  160. <el-row :gutter="20">
  161. <el-col :span="12">
  162. <el-form-item label="生产日期">
  163. <el-input v-model="formData.manufactureDate" readonly></el-input>
  164. </el-form-item>
  165. </el-col>
  166. <el-col :span="12">
  167. <el-form-item label="失效日期">
  168. <el-input v-model="formData.expiredDate" readonly></el-input>
  169. </el-form-item>
  170. </el-col>
  171. </el-row>
  172. <!-- 来源信息 - rqrq -->
  173. <el-row :gutter="20">
  174. <el-col :span="12">
  175. <el-form-item label="来源类型">
  176. <el-input v-model="formData.sourceType" readonly></el-input>
  177. </el-form-item>
  178. </el-col>
  179. <el-col :span="12">
  180. <el-form-item label="来源参考">
  181. <el-input v-model="formData.sourceRef" readonly></el-input>
  182. </el-form-item>
  183. </el-col>
  184. </el-row>
  185. <!-- 重量/体积信息 - rqrq -->
  186. <el-row :gutter="20">
  187. <el-col :span="6">
  188. <el-form-item label="毛重">
  189. <el-input v-model="formData.grossWeight" readonly></el-input>
  190. </el-form-item>
  191. </el-col>
  192. <el-col :span="6">
  193. <el-form-item label="净重">
  194. <el-input v-model="formData.netWeight" readonly></el-input>
  195. </el-form-item>
  196. </el-col>
  197. <el-col :span="6">
  198. <el-form-item label="重量单位">
  199. <el-input v-model="formData.weightUnit" readonly></el-input>
  200. </el-form-item>
  201. </el-col>
  202. <el-col :span="6">
  203. <el-form-item label="EngChgLevel">
  204. <el-input v-model="formData.engChgLevel" readonly></el-input>
  205. </el-form-item>
  206. </el-col>
  207. </el-row>
  208. <el-row :gutter="20">
  209. <el-col :span="12">
  210. <el-form-item label="体积">
  211. <el-input v-model="formData.volume" readonly></el-input>
  212. </el-form-item>
  213. </el-col>
  214. <el-col :span="12">
  215. <el-form-item label="体积单位">
  216. <el-input v-model="formData.volumeUnit" readonly></el-input>
  217. </el-form-item>
  218. </el-col>
  219. </el-row>
  220. <!-- 预留信息 - rqrq -->
  221. <el-row :gutter="20">
  222. <el-col :span="8">
  223. <el-form-item label="预留订单参考1">
  224. <el-input v-model="formData.reserveOrderRef1" readonly></el-input>
  225. </el-form-item>
  226. </el-col>
  227. <el-col :span="8">
  228. <el-form-item label="预留订单参考2">
  229. <el-input v-model="formData.reserveOrderRef2" readonly></el-input>
  230. </el-form-item>
  231. </el-col>
  232. <el-col :span="8">
  233. <el-form-item label="预留订单参考3">
  234. <el-input v-model="formData.reserveOrderRef3" readonly></el-input>
  235. </el-form-item>
  236. </el-col>
  237. </el-row>
  238. <!-- 备注 - rqrq -->
  239. <el-row>
  240. <el-col :span="24">
  241. <el-form-item label="备注">
  242. <el-input v-model="formData.remark" type="textarea" :rows="3" resize='none' readonly></el-input>
  243. </el-form-item>
  244. </el-col>
  245. </el-row>
  246. </el-form>
  247. <div slot="footer" class="dialog-footer" style="margin-top: 52px">
  248. <el-button type="primary" @click="dialogVisible = false">关闭</el-button>
  249. </div>
  250. </el-dialog>
  251. <!-- Change W/D/R 弹窗 - rqrq -->
  252. <el-dialog
  253. title="Change W/D/R"
  254. :visible.sync="wdrDialogVisible"
  255. :close-on-click-modal="false"
  256. v-drag
  257. width="400px">
  258. <el-form label-position="top" style="margin-top: 1px; margin-left: 0px;">
  259. <el-form-item label="To W/D/R">
  260. <el-input v-model="wdrFormData.toWdr" placeholder="请输入W/D/R"></el-input>
  261. </el-form-item>
  262. </el-form>
  263. <div slot="footer" class="dialog-footer">
  264. <el-button type="primary" @click="saveWdrChange" :disabled="wdrSaveLoading">
  265. {{ wdrSaveLoading ? 'Save中...' : 'Save' }}
  266. </el-button>
  267. <el-button @click="closeWdrDialog" :disabled="wdrSaveLoading">Close</el-button>
  268. </div>
  269. </el-dialog>
  270. <!-- Change Expiration Date 弹窗 - rqrq -->
  271. <el-dialog
  272. title="Change Expiration Date"
  273. :visible.sync="expDateDialogVisible"
  274. :close-on-click-modal="false"
  275. v-drag
  276. width="400px">
  277. <el-form label-position="top" style="margin-top: 1px; margin-left: 0px;">
  278. <el-form-item label="New Expiration Date">
  279. <el-date-picker
  280. v-model="expDateFormData.newExpDate"
  281. type="date"
  282. value-format="yyyy-MM-dd"
  283. placeholder="请选择失效日期"
  284. style="width: 100%">
  285. </el-date-picker>
  286. </el-form-item>
  287. </el-form>
  288. <div slot="footer" class="dialog-footer">
  289. <el-button type="primary" @click="saveExpDateChange" :disabled="expDateSaveLoading">
  290. {{ expDateSaveLoading ? 'Save中...' : 'Save' }}
  291. </el-button>
  292. <el-button @click="closeExpDateDialog" :disabled="expDateSaveLoading">Close</el-button>
  293. </div>
  294. </el-dialog>
  295. <!-- Change Availability Control ID 弹窗 - rqrq -->
  296. <el-dialog
  297. title="Change Availability Control ID"
  298. :visible.sync="availDialogVisible"
  299. :close-on-click-modal="false"
  300. v-drag
  301. width="400px">
  302. <el-form label-position="top" style="margin-top: 1px; margin-left: 0px;">
  303. <el-form-item label="New Availability Control ID">
  304. <el-input v-model="availFormData.newAvailId" placeholder="请输入Availability Control ID" @blur="handleAvailIdBlur">
  305. <el-button slot="append" @click="showAvailList">List</el-button>
  306. </el-input>
  307. </el-form-item>
  308. <el-form-item label="New Availability Control Desc">
  309. <el-input v-model="availFormData.newAvailDesc" disabled placeholder="描述(自动填充)"></el-input>
  310. </el-form-item>
  311. </el-form>
  312. <div slot="footer" class="dialog-footer">
  313. <el-button type="primary" @click="saveAvailChange" :disabled="availSaveLoading">
  314. {{ availSaveLoading ? 'Save中...' : 'Save' }}
  315. </el-button>
  316. <el-button @click="closeAvailDialog" :disabled="availSaveLoading">Close</el-button>
  317. </div>
  318. </el-dialog>
  319. <!-- Availability Control ID 选择弹窗 - rqrq -->
  320. <el-dialog
  321. title="选择 Availability Control ID"
  322. :visible.sync="availListDialogVisible"
  323. :close-on-click-modal="false"
  324. v-drag
  325. width="600px"
  326. append-to-body>
  327. <!-- 搜索区域 - rqrq -->
  328. <el-form :inline="true" label-position="top" style="margin-bottom: 10px;">
  329. <el-form-item label="ID">
  330. <el-input style="width: 150px;" v-model="availListQueryData.searchAvailabilityControlId" placeholder="请输入" @keyup.enter.native="getAvailList()" clearable></el-input>
  331. </el-form-item>
  332. <el-form-item label="描述">
  333. <el-input style="width: 150px;" v-model="availListQueryData.searchAvailabilityControlDesc" placeholder="请输入" @keyup.enter.native="getAvailList()" clearable></el-input>
  334. </el-form-item>
  335. <el-form-item style="margin-top: 20px;">
  336. <el-button @click="getAvailList()" type="primary">查询</el-button>
  337. </el-form-item>
  338. </el-form>
  339. <!-- 列表 - rqrq -->
  340. <el-table
  341. :data="availListData"
  342. border
  343. highlight-current-row
  344. v-loading="availListLoading"
  345. @row-dblclick="handleAvailListDblClick"
  346. height="300"
  347. style="width: 100%;">
  348. <el-table-column
  349. prop="availabilityControlId"
  350. header-align="center"
  351. align="center"
  352. label="Availability Control ID"
  353. min-width="180">
  354. </el-table-column>
  355. <el-table-column
  356. prop="availabilityControlDesc"
  357. header-align="center"
  358. align="left"
  359. label="描述"
  360. min-width="250"
  361. show-overflow-tooltip>
  362. </el-table-column>
  363. </el-table>
  364. <div slot="footer" class="dialog-footer">
  365. <el-button @click="availListDialogVisible = false">关闭</el-button>
  366. </div>
  367. </el-dialog>
  368. </div>
  369. </template>
  370. <script>
  371. import { searchHandlingUnitList, batchChangeAvailabilityControlId, batchChangeExpiryDate, batchChangeWdr } from '@/api/warehouse/changeHUSpecialItem'
  372. import { activeList, getDescById } from '@/api/warehouse/availabilityControlId'
  373. export default {
  374. data() {
  375. return {
  376. // 页面状态 - rqrq
  377. height: 500,
  378. dataListLoading: false,
  379. // 弹窗状态 - rqrq
  380. dialogVisible: false,
  381. // 三个功能弹窗状态 - rqrq
  382. wdrDialogVisible: false,
  383. expDateDialogVisible: false,
  384. availDialogVisible: false,
  385. wdrSaveLoading: false,
  386. expDateSaveLoading: false,
  387. availSaveLoading: false,
  388. // Availability Control ID列表弹窗状态 - rqrq
  389. availListDialogVisible: false,
  390. availListLoading: false,
  391. availListData: [],
  392. availListQueryData: {
  393. searchAvailabilityControlId: '',
  394. searchAvailabilityControlDesc: ''
  395. },
  396. // 数据列表 - rqrq
  397. dataList: [],
  398. dataListSelections: [],
  399. // 查询条件 - rqrq
  400. queryHeaderData: {
  401. site: this.$store.state.user.site,
  402. unitId: '',
  403. partNo: '',
  404. batchNo: '',
  405. locationId: '',
  406. warehouseId: '',
  407. inStockFlag: 'Y'
  408. },
  409. // 表单数据 - rqrq
  410. formData: {},
  411. // 三个功能表单数据 - rqrq
  412. wdrFormData: {
  413. toWdr: ''
  414. },
  415. expDateFormData: {
  416. newExpDate: ''
  417. },
  418. availFormData: {
  419. newAvailId: '',
  420. newAvailDesc: ''
  421. },
  422. // 分页信息 - rqrq
  423. pageIndex: 1,
  424. pageSize: 30,
  425. totalPage: 0,
  426. // 表格列配置 - rqrq
  427. columnList: [
  428. {
  429. columnProp: "unitId",
  430. headerAlign: "center",
  431. align: "center",
  432. columnLabel: "条码号",
  433. columnWidth: 150,
  434. columnSortable: false,
  435. showOverflowTooltip: true,
  436. fixed: ""
  437. },
  438. {
  439. columnProp: "partNo",
  440. headerAlign: "center",
  441. align: "center",
  442. columnLabel: "物料编号",
  443. columnWidth: 100,
  444. columnSortable: false,
  445. showOverflowTooltip: true,
  446. fixed: ""
  447. },
  448. {
  449. columnProp: "batchNo",
  450. headerAlign: "center",
  451. align: "center",
  452. columnLabel: "批次号",
  453. columnWidth: 140,
  454. columnSortable: false,
  455. showOverflowTooltip: true,
  456. fixed: ""
  457. },
  458. {
  459. columnProp: "qty",
  460. headerAlign: "center",
  461. align: "right",
  462. columnLabel: "数量",
  463. columnWidth: 70,
  464. columnSortable: false,
  465. showOverflowTooltip: true,
  466. fixed: ""
  467. },
  468. {
  469. columnProp: "locationId",
  470. headerAlign: "center",
  471. align: "center",
  472. columnLabel: "库位",
  473. columnWidth: 90,
  474. columnSortable: false,
  475. showOverflowTooltip: true,
  476. fixed: ""
  477. },
  478. {
  479. columnProp: "warehouseId",
  480. headerAlign: "center",
  481. align: "center",
  482. columnLabel: "仓库",
  483. columnWidth: 60,
  484. columnSortable: false,
  485. showOverflowTooltip: true,
  486. fixed: ""
  487. },
  488. {
  489. columnProp: "wdr",
  490. headerAlign: "center",
  491. align: "center",
  492. columnLabel: "WDR",
  493. columnWidth: 100,
  494. columnSortable: false,
  495. showOverflowTooltip: true,
  496. fixed: ""
  497. },
  498. {
  499. columnProp: "availabilityControlId",
  500. headerAlign: "center",
  501. align: "center",
  502. columnLabel: "Availability Control Id",
  503. columnWidth: 150,
  504. columnSortable: false,
  505. showOverflowTooltip: true,
  506. fixed: ""
  507. },
  508. {
  509. columnProp: "expiredDate",
  510. headerAlign: "center",
  511. align: "center",
  512. columnLabel: "失效日期",
  513. columnWidth: 100,
  514. columnSortable: false,
  515. showOverflowTooltip: true,
  516. fixed: ""
  517. },
  518. {
  519. columnProp: "engChgLevel",
  520. headerAlign: "center",
  521. align: "center",
  522. columnLabel: "EngChgLevel",
  523. columnWidth: 90,
  524. columnSortable: false,
  525. showOverflowTooltip: true,
  526. fixed: ""
  527. },
  528. {
  529. columnProp: "manufactureDate",
  530. headerAlign: "center",
  531. align: "center",
  532. columnLabel: "生产日期",
  533. columnWidth: 100,
  534. columnSortable: false,
  535. showOverflowTooltip: true,
  536. fixed: ""
  537. },
  538. {
  539. columnProp: "partDesc",
  540. headerAlign: "center",
  541. align: "center",
  542. columnLabel: "物料描述",
  543. columnWidth: 200,
  544. columnSortable: false,
  545. showOverflowTooltip: true,
  546. fixed: ""
  547. },
  548. ]
  549. }
  550. },
  551. watch: {
  552. wdrFormData: {
  553. deep: true,
  554. handler: function (newV, oldV) {
  555. this.wdrFormData.toWdr = this.wdrFormData.toWdr.toUpperCase()
  556. }
  557. }
  558. },
  559. mounted() {
  560. this.$nextTick(() => {
  561. this.height = window.innerHeight - 220;
  562. })
  563. // 计算表格高度 - rqrq
  564. // 加载初始数据 - rqrq
  565. this.getDataList()
  566. },
  567. methods: {
  568. // 查询列表数据 - rqrq
  569. getDataList() {
  570. this.dataListLoading = true
  571. const params = {
  572. ...this.queryHeaderData,
  573. page: this.pageIndex,
  574. limit: this.pageSize
  575. }
  576. searchHandlingUnitList(params).then(({data}) => {
  577. this.dataListLoading = false
  578. if (data && data.code == 0) {
  579. this.dataList = data.page.list || []
  580. this.pageIndex = data.page.currPage
  581. this.totalPage = data.page.totalCount
  582. } else {
  583. this.dataList = []
  584. this.totalPage = 0
  585. this.$message.error(data.msg || '查询失败')
  586. }
  587. }).catch(() => {
  588. this.dataListLoading = false
  589. this.$message.error('查询失败')
  590. })
  591. },
  592. // 重置查询条件 - rqrq
  593. resetQuery() {
  594. this.queryHeaderData = {
  595. site: this.$store.state.user.site,
  596. unitId: '',
  597. partNo: '',
  598. batchNo: '',
  599. locationId: '',
  600. warehouseId: '',
  601. inStockFlag: ''
  602. }
  603. this.pageIndex = 1
  604. this.getDataList()
  605. },
  606. // 每页数变化 - rqrq
  607. sizeChangeHandle(val) {
  608. this.pageSize = val
  609. this.pageIndex = 1
  610. this.getDataList()
  611. },
  612. // 当前页变化 - rqrq
  613. currentChangeHandle(val) {
  614. this.pageIndex = val
  615. this.getDataList()
  616. },
  617. // 选择变化 - rqrq
  618. selectionChangeHandle(val) {
  619. this.dataListSelections = val
  620. },
  621. // 查看详细信息 - rqrq
  622. viewDetail(row) {
  623. this.formData = JSON.parse(JSON.stringify(row))
  624. this.dialogVisible = true
  625. },
  626. // 格式化日期 - rqrq
  627. formatDate(dateStr) {
  628. if (!dateStr) return ''
  629. const date = new Date(dateStr)
  630. const year = date.getFullYear()
  631. const month = String(date.getMonth() + 1).padStart(2, '0')
  632. const day = String(date.getDate()).padStart(2, '0')
  633. const hours = String(date.getHours()).padStart(2, '0')
  634. const minutes = String(date.getMinutes()).padStart(2, '0')
  635. const seconds = String(date.getSeconds()).padStart(2, '0')
  636. if (hours === '00' && minutes === '00' && seconds === '00') {
  637. return `${year}-${month}-${day}`
  638. }
  639. return `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
  640. },
  641. // 校验行是否可选择(必须有物料编号)- rqrq
  642. checkSelectable(row) {
  643. if (!row.partNo || row.partNo === '') {
  644. return false
  645. }
  646. return true
  647. },
  648. // ==================== Change W/D/R相关方法 - rqrq ====================
  649. // 打开Change W/D/R弹窗 - rqrq
  650. openChangeWdrDialog() {
  651. if (this.dataListSelections.length === 0) {
  652. this.$message.warning('请先选择要修改的记录')
  653. return
  654. }
  655. // 重置表单 - rqrq
  656. this.wdrFormData = {
  657. toWdr: ''
  658. }
  659. this.wdrDialogVisible = true
  660. },
  661. // 关闭W/D/R弹窗 - rqrq
  662. closeWdrDialog() {
  663. this.wdrDialogVisible = false
  664. this.wdrFormData = {
  665. toWdr: ''
  666. }
  667. },
  668. // 保存W/D/R修改 - rqrq
  669. saveWdrChange() {
  670. // 参数校验 - rqrq
  671. if (!this.wdrFormData.toWdr) {
  672. this.$message.warning('请输入W/D/R')
  673. return
  674. }
  675. // 构建提示信息,显示选中的标签数量 - rqrq
  676. const selectedCount = this.dataListSelections.length
  677. // 按库存关键字去重统计 - rqrq
  678. const inventoryKeySet = new Set()
  679. this.dataListSelections.forEach(item => {
  680. const key = `${item.site}|${item.partNo}|${item.locationId}|${item.batchNo}|${item.wdr}|${item.engChgLevel}`
  681. inventoryKeySet.add(key)
  682. })
  683. const inventoryCount = inventoryKeySet.size
  684. this.$confirm(`确认将选中的 ${selectedCount} 个标签(${inventoryCount}行库存)的W/D/R修改为 "${this.wdrFormData.toWdr}" 吗?`, '确认修改', {
  685. confirmButtonText: '确定',
  686. cancelButtonText: '取消',
  687. type: 'warning'
  688. }).then(() => {
  689. this.doSaveWdrChange()
  690. }).catch(() => {
  691. // 取消操作
  692. })
  693. },
  694. // 执行W/D/R修改 - rqrq
  695. doSaveWdrChange() {
  696. this.wdrSaveLoading = true
  697. const requestData = {
  698. selectedItems: this.dataListSelections,
  699. newWdr: this.wdrFormData.toWdr
  700. }
  701. batchChangeWdr(requestData).then(({ data }) => {
  702. if (data && data.code == 0) {
  703. const result = data.row
  704. this.showChangeResult(result, 'W/D/R修改', () => {
  705. this.closeWdrDialog()
  706. this.getDataList()
  707. })
  708. } else {
  709. this.$alert(data.msg || 'W/D/R修改失败', '错误')
  710. }
  711. }).catch(error => {
  712. this.$message.error('W/D/R修改失败:' + (error.message || '网络错误'))
  713. }).finally(() => {
  714. this.wdrSaveLoading = false
  715. })
  716. },
  717. // ==================== Change Expiration Date相关方法 - rqrq ====================
  718. // 打开Change Expiration Date弹窗 - rqrq
  719. openChangeExpDateDialog() {
  720. if (this.dataListSelections.length === 0) {
  721. this.$message.warning('请先选择要修改的记录')
  722. return
  723. }
  724. // 重置表单 - rqrq
  725. this.expDateFormData = {
  726. newExpDate: ''
  727. }
  728. this.expDateDialogVisible = true
  729. },
  730. // 关闭Expiration Date弹窗 - rqrq
  731. closeExpDateDialog() {
  732. this.expDateDialogVisible = false
  733. this.expDateFormData = {
  734. newExpDate: ''
  735. }
  736. },
  737. // 保存Expiration Date修改 - rqrq
  738. saveExpDateChange() {
  739. // 参数校验 - rqrq
  740. if (!this.expDateFormData.newExpDate) {
  741. this.$message.warning('请选择失效日期')
  742. return
  743. }
  744. // 构建提示信息,显示选中的标签数量和去重后的库存行数 - rqrq
  745. const selectedCount = this.dataListSelections.length
  746. // 按库存关键字去重统计 - rqrq
  747. const inventoryKeySet = new Set()
  748. this.dataListSelections.forEach(item => {
  749. const key = `${item.site}|${item.partNo}|${item.locationId}|${item.batchNo}|${item.wdr}|${item.engChgLevel}`
  750. inventoryKeySet.add(key)
  751. })
  752. const inventoryCount = inventoryKeySet.size
  753. // 确认提示 - rqrq
  754. const confirmMsg = `您选择了 ${selectedCount} 个标签,涉及 ${inventoryCount} 行ERP库存。\n\n` +
  755. `注意:同一行ERP库存下的所有标签将一起被修改为新的失效日期:${this.expDateFormData.newExpDate}\n\n` +
  756. `确定要执行此操作吗?`
  757. this.$confirm(confirmMsg, '确认修改', {
  758. confirmButtonText: '确定',
  759. cancelButtonText: '取消',
  760. type: 'warning'
  761. }).then(() => {
  762. this.doSaveExpDateChange()
  763. }).catch(() => {})
  764. },
  765. // 执行Expiration Date修改 - rqrq
  766. doSaveExpDateChange() {
  767. this.expDateSaveLoading = true
  768. const requestData = {
  769. selectedItems: this.dataListSelections,
  770. newExpiryDate: this.expDateFormData.newExpDate
  771. }
  772. batchChangeExpiryDate(requestData).then(({ data }) => {
  773. if (data && data.code == 0) {
  774. const result = data.row
  775. this.showChangeResult(result, '失效日期修改', () => {
  776. this.closeExpDateDialog()
  777. this.getDataList()
  778. })
  779. } else {
  780. this.$alert(data.msg || '修改失败', '提示', { type: 'error' })
  781. }
  782. }).catch((error) => {
  783. this.$message.error('修改失败:' + (error.message || '网络错误'))
  784. }).finally(() => {
  785. this.expDateSaveLoading = false
  786. })
  787. },
  788. // ==================== Change Availability Control ID相关方法 - rqrq ====================
  789. // 打开Change Availability Control ID弹窗 - rqrq
  790. openChangeAvailDialog() {
  791. if (this.dataListSelections.length === 0) {
  792. this.$message.warning('请先选择要修改的记录')
  793. return
  794. }
  795. // 重置表单 - rqrq
  796. this.availFormData = {
  797. newAvailId: '',
  798. newAvailDesc: ''
  799. }
  800. this.availDialogVisible = true
  801. },
  802. // 关闭Availability Control ID弹窗 - rqrq
  803. closeAvailDialog() {
  804. this.availDialogVisible = false
  805. this.availFormData = {
  806. newAvailId: '',
  807. newAvailDesc: ''
  808. }
  809. },
  810. // 显示Availability Control ID列表 - rqrq
  811. showAvailList() {
  812. this.availListQueryData = {
  813. searchAvailabilityControlId: '',
  814. searchAvailabilityControlDesc: ''
  815. }
  816. this.availListDialogVisible = true
  817. this.getAvailList()
  818. },
  819. // 查询Availability Control ID列表 - rqrq
  820. getAvailList() {
  821. this.availListLoading = true
  822. activeList().then(({ data }) => {
  823. this.availListLoading = false
  824. if (data && data.code == 0) {
  825. let list = data.rows || []
  826. // 前端过滤 - rqrq
  827. if (this.availListQueryData.searchAvailabilityControlId) {
  828. list = list.filter(item =>
  829. item.availabilityControlId &&
  830. item.availabilityControlId.toUpperCase().includes(this.availListQueryData.searchAvailabilityControlId.toUpperCase())
  831. )
  832. }
  833. if (this.availListQueryData.searchAvailabilityControlDesc) {
  834. list = list.filter(item =>
  835. item.availabilityControlDesc &&
  836. item.availabilityControlDesc.toUpperCase().includes(this.availListQueryData.searchAvailabilityControlDesc.toUpperCase())
  837. )
  838. }
  839. this.availListData = list
  840. } else {
  841. this.availListData = []
  842. this.$message.error(data.msg || '查询失败')
  843. }
  844. }).catch(() => {
  845. this.availListLoading = false
  846. this.$message.error('查询失败')
  847. })
  848. },
  849. // 双击选择Availability Control ID - rqrq
  850. handleAvailListDblClick(row) {
  851. this.availFormData.newAvailId = row.availabilityControlId
  852. this.availFormData.newAvailDesc = row.availabilityControlDesc || ''
  853. this.availListDialogVisible = false
  854. },
  855. // Availability Control ID失去焦点事件 - rqrq
  856. handleAvailIdBlur() {
  857. if (!this.availFormData.newAvailId) {
  858. this.availFormData.newAvailDesc = ''
  859. return
  860. }
  861. getDescById(this.availFormData.newAvailId).then(({ data }) => {
  862. if (data && data.code == 0) {
  863. // row可能是null或描述字符串 - rqrq
  864. this.availFormData.newAvailDesc = data.row || ''
  865. } else {
  866. this.availFormData.newAvailDesc = ''
  867. }
  868. }).catch(() => {
  869. this.availFormData.newAvailDesc = ''
  870. })
  871. },
  872. // 保存Availability Control ID修改 - rqrq
  873. saveAvailChange() {
  874. // 参数校验 - rqrq
  875. if (!this.availFormData.newAvailId) {
  876. this.$message.warning('请输入Availability Control ID')
  877. return
  878. }
  879. // 构建提示信息,显示选中的标签数量和去重后的库存行数 - rqrq
  880. const selectedCount = this.dataListSelections.length
  881. // 按库存关键字去重统计 - rqrq
  882. const inventoryKeySet = new Set()
  883. this.dataListSelections.forEach(item => {
  884. const key = `${item.site}|${item.partNo}|${item.locationId}|${item.batchNo}|${item.wdr}|${item.engChgLevel}`
  885. inventoryKeySet.add(key)
  886. })
  887. const inventoryCount = inventoryKeySet.size
  888. // 确认提示 - rqrq
  889. const confirmMsg = `您选择了 ${selectedCount} 个标签,涉及 ${inventoryCount} 行ERP库存。\n\n` +
  890. `注意:同一行ERP库存下的所有标签将一起被修改为新的 Availability Control ID:${this.availFormData.newAvailId}\n\n` +
  891. `确定要执行此操作吗?`
  892. this.$confirm(confirmMsg, '确认修改', {
  893. confirmButtonText: '确定',
  894. cancelButtonText: '取消',
  895. type: 'warning'
  896. }).then(() => {
  897. this.doSaveAvailChange()
  898. }).catch(() => {})
  899. },
  900. // 执行Availability Control ID修改 - rqrq
  901. doSaveAvailChange() {
  902. this.availSaveLoading = true
  903. const requestData = {
  904. selectedItems: this.dataListSelections,
  905. newAvailabilityControlId: this.availFormData.newAvailId
  906. }
  907. batchChangeAvailabilityControlId(requestData).then(({ data }) => {
  908. if (data && data.code == 0) {
  909. const result = data.row
  910. this.showChangeResult(result, 'Availability Control ID修改', () => {
  911. this.closeAvailDialog()
  912. this.getDataList()
  913. })
  914. } else {
  915. this.$alert(data.msg || '修改失败', '提示', { type: 'error' })
  916. }
  917. }).catch((error) => {
  918. this.$message.error('修改失败:' + (error.message || '网络错误'))
  919. }).finally(() => {
  920. this.availSaveLoading = false
  921. })
  922. },
  923. // ==================== 通用结果显示方法 - rqrq ====================
  924. /**
  925. * 显示修改结果弹窗 - rqrq
  926. * @param result 后端返回的结果对象
  927. * @param title 操作标题
  928. * @param callback 弹窗关闭后的回调
  929. */
  930. showChangeResult(result, title, callback) {
  931. const successCount = result.successCount || 0
  932. const failCount = result.failCount || 0
  933. const failedUnitIds = result.failedUnitIds || []
  934. const failedReasons = result.failedReasons || []
  935. // 构建弹窗内容 - rqrq
  936. let htmlContent = `<div style="line-height: 1.8;">`
  937. htmlContent += `<p><b>成功数量:</b>${successCount}</p>`
  938. htmlContent += `<p><b>失败数量:</b>${failCount}</p>`
  939. if (failCount > 0 && failedUnitIds.length > 0) {
  940. // 失败序列号(用逗号分隔)- rqrq
  941. htmlContent += `<p><b>失败序列号:</b>${failedUnitIds.join(', ')}</p>`
  942. // 失败报错(只显示第一个)- rqrq
  943. const firstError = failedReasons.length > 0 ? failedReasons[0] : '未知错误'
  944. htmlContent += `<p><b>失败报错:</b>${firstError}</p>`
  945. }
  946. htmlContent += `</div>`
  947. // 根据是否有失败决定弹窗类型 - rqrq
  948. const dialogType = failCount > 0 ? 'warning' : 'success'
  949. const dialogTitle = failCount > 0 ? `${title}结果(部分失败)` : `${title}结果`
  950. this.$alert(htmlContent, dialogTitle, {
  951. dangerouslyUseHTMLString: true,
  952. confirmButtonText: '确定',
  953. type: dialogType,
  954. callback: () => {
  955. if (callback) callback()
  956. }
  957. })
  958. }
  959. }
  960. }
  961. </script>
  962. <style scoped>
  963. /* 按钮禁用样式 - rqrq */
  964. .el-button:disabled {
  965. opacity: 0.6;
  966. cursor: not-allowed;
  967. }
  968. </style>