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.

280 lines
9.2 KiB

4 weeks ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
4 weeks ago
4 weeks ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
4 weeks ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
4 weeks ago
​
​
​
​
4 weeks ago
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
​
  1. <template>
  2. <div>
  3. <div class="pda-container">
  4. <!-- 头部栏 - rqrq -->
  5. <div class="header-bar">
  6. <div class="header-left" @click="handleBack">
  7. <i class="el-icon-arrow-left"></i>
  8. <span>Call料</span>
  9. </div>
  10. <div class="header-right" @click="$router.push({ path: '/' })">
  11. 首页
  12. </div>
  13. </div>
  14. <div class="table-body" style="max-height: 500px; overflow-y: auto;">
  15. <div class="main-content form-section">
  16. <!-- 查询条件区域:保持与海安立库取货一致 - rqrq -->
  17. <div class="input-group">
  18. <label class="input-label">物料编码</label>
  19. <el-input
  20. v-model="formData.partNo"
  21. placeholder="请输入物料编码"
  22. class="form-input"
  23. ref="partNoInput"
  24. clearable
  25. />
  26. </div>
  27. <div class="input-group">
  28. <label class="input-label">栈板编码</label>
  29. <el-input
  30. v-model="formData.palletId"
  31. placeholder="请输入栈板编码"
  32. class="form-input"
  33. clearable
  34. />
  35. </div>
  36. <div class="input-group">
  37. <label class="input-label">批号</label>
  38. <el-input
  39. v-model="formData.batchNo"
  40. class="form-input"
  41. clearable
  42. />
  43. </div>
  44. <!-- 固定整托出库口提示:此页面下达目标固定,不允许页面改写 - rqrq -->
  45. <div class="input-group">
  46. <label class="input-label">固定目标</label>
  47. <el-input
  48. :value="fixedTargetArea"
  49. class="form-input"
  50. readonly
  51. />
  52. </div>
  53. <div class="bottom-actions" style="display: flex; gap: 10px; flex-wrap: nowrap;">
  54. <button class="action-btn secondary" @click="confirmDo" style="flex: 1;" :disabled="dispatchLoading">
  55. 查询
  56. </button>
  57. <button class="action-btn secondary" @click="cleanData" style="flex: 1;" :disabled="dispatchLoading">
  58. 清空
  59. </button>
  60. <button
  61. class="action-btn secondary"
  62. @click="handleDispatch"
  63. :disabled="dispatchLoading || !selectedPallet"
  64. style="flex: 1;"
  65. >
  66. {{ dispatchLoading ? '下达中...' : '下达' }}
  67. </button>
  68. </div>
  69. </div>
  70. <!-- 单选栈板列表:保持海安立库取货交互一致 - rqrq -->
  71. <div v-if="palletList.length > 0" class="rma-list">
  72. <div class="list-title" style="flex: 0.75">可用栈板列表(单选)</div>
  73. <el-form>
  74. <el-row v-for="(pallet, index) in palletList" :key="index" class="rma-row">
  75. <el-col :span="24">
  76. <div class="rma-item" @click="selectPallet(pallet)" :class="{ 'selected': isSelected(pallet) }">
  77. <div class="item-info">
  78. <span class="part-no">栈板号: {{ pallet.palletId }}</span>
  79. <span class="batch-qty" v-if="pallet.partNo">
  80. 物料: {{ pallet.partNo }} | 数量: {{ pallet.qty }}
  81. </span>
  82. <span class="batch-qty" v-if="pallet.partNo && pallet.batchNo">
  83. | 批号: {{ pallet.batchNo }}
  84. </span>
  85. <span class="batch-qty" v-if="pallet.partNo && pallet.receiveDate">
  86. | 接收日期: {{ pallet.receiveDate }}
  87. </span>
  88. </div>
  89. <div class="item-status">
  90. <i class="el-icon-check" v-if="isSelected(pallet)"></i>
  91. </div>
  92. </div>
  93. </el-col>
  94. </el-row>
  95. </el-form>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. </template>
  101. <script>
  102. import {
  103. getPalletList,
  104. callOutToOutboundPort
  105. } from '../../../api/haianAutoWarehouse/callOut'
  106. export default {
  107. name: 'haianCallOut',
  108. data() {
  109. return {
  110. // 固定目标展示:后端实际下发整托出库口,页面只读不允许改 - rqrq
  111. fixedTargetArea: '整托出库口',
  112. formData: {
  113. palletId: '',
  114. partNo: '',
  115. batchNo: ''
  116. },
  117. palletList: [],
  118. selectedPallet: null,
  119. dispatchLoading: false
  120. }
  121. },
  122. computed: {
  123. // 海安业务site必须从store读取,缺失时前端直接阻断并提示 - rqrq
  124. site() {
  125. return this.$store.state.user.site
  126. }
  127. },
  128. methods: {
  129. handleBack() {
  130. this.resetPage(false)
  131. this.$router.back()
  132. },
  133. // 页面统一重置:适配keep-alive重进清理规范 - rqrq
  134. resetPage(needFocus = true) {
  135. this.formData = {
  136. palletId: '',
  137. partNo: '',
  138. batchNo: ''
  139. }
  140. this.palletList = []
  141. this.selectedPallet = null
  142. this.dispatchLoading = false
  143. if (needFocus) {
  144. this.$nextTick(() => {
  145. if (this.$refs.partNoInput) {
  146. this.$refs.partNoInput.focus()
  147. }
  148. })
  149. }
  150. },
  151. confirmDo() {
  152. if ((!this.formData.partNo || this.formData.partNo === '') &&
  153. (!this.formData.palletId || this.formData.palletId === '')) {
  154. this.$alert('请输入物料编码或栈板编码', '提示', {
  155. confirmButtonText: '确定'
  156. })
  157. return
  158. }
  159. if (!this.site) {
  160. this.$alert('当前用户缺少site,无法查询', '提示', {
  161. confirmButtonText: '确定'
  162. })
  163. return
  164. }
  165. const queryParams = {
  166. site: this.site
  167. }
  168. if (this.formData.palletId && this.formData.palletId.trim()) {
  169. queryParams.palletId = this.formData.palletId.trim()
  170. }
  171. if (this.formData.partNo && this.formData.partNo.trim()) {
  172. queryParams.partNo = this.formData.partNo.trim()
  173. }
  174. if (this.formData.batchNo && this.formData.batchNo.trim()) {
  175. queryParams.batchNo = this.formData.batchNo.trim()
  176. }
  177. getPalletList(queryParams).then(({ data }) => {
  178. if (data && data.code === 0) {
  179. this.palletList = data.rows || []
  180. this.selectedPallet = null
  181. if (this.palletList.length === 0) {
  182. this.$message.warning('未找到满足条件的栈板')
  183. } else {
  184. this.$message.success(`找到 ${this.palletList.length} 个栈板`)
  185. }
  186. } else {
  187. this.$alert(data.msg || '查询失败', '错误', { confirmButtonText: '确定' })
  188. this.palletList = []
  189. this.selectedPallet = null
  190. }
  191. }).catch(error => {
  192. this.$alert(error.message || '查询失败', '错误', { confirmButtonText: '确定' })
  193. this.palletList = []
  194. this.selectedPallet = null
  195. })
  196. },
  197. selectPallet(pallet) {
  198. if (this.selectedPallet && this.selectedPallet.palletId === pallet.palletId) {
  199. this.selectedPallet = null
  200. this.$message.success('已取消选择')
  201. } else {
  202. this.selectedPallet = {
  203. palletId: pallet.palletId,
  204. partNo: pallet.partNo || '',
  205. qty: pallet.qty || 0,
  206. batchNo: pallet.batchNo || this.formData.batchNo || ''
  207. }
  208. this.$message.success(`已选择栈板: ${pallet.palletId}`)
  209. }
  210. },
  211. isSelected(pallet) {
  212. return this.selectedPallet && this.selectedPallet.palletId === pallet.palletId
  213. },
  214. // 下达动作:固定目标整托出库口,其余参数沿用海安立库取货流程 - rqrq
  215. handleDispatch() {
  216. if (!this.selectedPallet) {
  217. this.$alert('请选择一个栈板', '提示', { confirmButtonText: '确定' })
  218. return
  219. }
  220. this.$confirm('确定下达Call料任务到整托出库口?', '提示', {
  221. confirmButtonText: '确认',
  222. cancelButtonText: '取消',
  223. type: 'warning'
  224. }).then(() => {
  225. this.dispatchLoading = true
  226. callOutToOutboundPort({
  227. site: this.site,
  228. palletId: this.selectedPallet.palletId,
  229. partNo: this.selectedPallet.partNo,
  230. qty: this.selectedPallet.qty,
  231. batchNo: this.selectedPallet.batchNo,
  232. targetArea: this.fixedTargetArea
  233. }).then(({ data }) => {
  234. if (data && data.code === 0) {
  235. this.$message.success('任务下达成功')
  236. this.resetPage(true)
  237. } else {
  238. this.$alert(data.msg || '任务下达失败', '错误', { confirmButtonText: '确定' })
  239. }
  240. }).catch(error => {
  241. this.$alert(error.message || '任务下达失败', '错误', { confirmButtonText: '确定' })
  242. }).finally(() => {
  243. this.dispatchLoading = false
  244. })
  245. }).catch(() => {
  246. // 用户取消确认时保持当前选中状态,便于继续操作 - rqrq
  247. })
  248. },
  249. cleanData() {
  250. this.resetPage(true)
  251. }
  252. },
  253. activated() {
  254. this.resetPage(true)
  255. },
  256. beforeRouteLeave(to, from, next) {
  257. this.resetPage(false)
  258. next()
  259. },
  260. mounted() {
  261. this.resetPage(true)
  262. }
  263. }
  264. </script>
  265. <style scoped>
  266. .action-btn:disabled {
  267. opacity: 0.6;
  268. cursor: not-allowed;
  269. background-color: #ccc !important;
  270. border-color: #ccc !important;
  271. }
  272. </style>