Commit c410144579feb22b61fd120d0fbbad7235cc9cf8
1 parent
836b91c8
1. 开发空托盘组入库、出库。 托盘跨站功能
2. 开发任务取消功能
Showing
44 changed files
with
4152 additions
and
265 deletions
jeecg-boot-master/ant-design-vue-jeecg/src/api/api.js
... | ... | @@ -125,6 +125,8 @@ export const createReceiptTask = (params)=>postAction('/receipt/receiptContainer |
125 | 125 | export const completeTaskByWMS = (params)=>postAction('/task/taskHeader/completeTaskByWMS', params); |
126 | 126 | //下发任务给WCS |
127 | 127 | export const execute = (params)=>postAction('/task/taskHeader/execute', params); |
128 | +//取消任务 | |
129 | +export const cancelTask = (params)=>postAction('/task/taskHeader/cancelTask?1', params); | |
128 | 130 | //自动配盘 |
129 | 131 | export const autoCombination = (params)=>postAction('/shipment/shipmentCombination/autoCombination', params); |
130 | 132 | //创建出库任务 |
... | ... | @@ -133,6 +135,26 @@ export const createShipmentTask = (params)=>postAction('/shipment/shipmentCombin |
133 | 135 | export const selectSortingPort = (params)=>postAction('/shipment/shipmentCombination/selectSortingPort', params); |
134 | 136 | //选择入库分拣口 |
135 | 137 | export const selectSupplePort = (params)=>postAction('/receipt/receiptContainerHeader/selectSupplePort', params); |
138 | +//创建空托盘入库任务 | |
139 | +export const createEmptyIn = (params)=>postAction('/task/taskHeader/createEmptyIn', params); | |
140 | +//创建空托盘出库任务 | |
141 | +export const createEmptyOut = (params)=>postAction('/task/taskHeader/createEmptyOut', params); | |
142 | +//选择出库整出口 | |
143 | +export const selectOutPort = (params)=>postAction('/task/taskHeader/selectOutPort', params); | |
144 | +//选择出库分拣口 | |
145 | +export const selectPickPort = (params)=>postAction('/task/taskHeader/selectPickPort', params); | |
146 | +//创建移库任务 | |
147 | +export const createTransferTask = (params)=>postAction('/task/taskHeader/createTransferTask', params); | |
148 | +//创建出库查看任务 | |
149 | +export const createCheckOutTask = (params)=>postAction('/task/taskHeader/createCheckOutTask', params); | |
150 | +//选择站台 | |
151 | +export const selectPort = (params)=>postAction('/task/taskHeader/selectPort', params); | |
152 | +//创建跨站任务 | |
153 | +export const createOverStationTask = (params)=>postAction('/task/taskHeader/createOverStationTask', params); | |
154 | +//创建空托盘组入库任务 | |
155 | +export const createManyEmptyIn = (params)=>postAction('/task/taskHeader/createManyEmptyIn', params); | |
156 | +//创建空托盘组出库任务 | |
157 | +export const createManyEmptyOut = (params)=>postAction('/task/taskHeader/createManyEmptyOut', params); | |
136 | 158 | |
137 | 159 | // 中转HTTP请求 |
138 | 160 | export const transitRESTful = { |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/config/LocationList.vue
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/inventory/InventoryDetailList.vue
... | ... | @@ -41,6 +41,12 @@ |
41 | 41 | :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" |
42 | 42 | @change="handleTableChange"> |
43 | 43 | |
44 | + <span slot="companyCode" slot-scope="companyCode"> | |
45 | + <a-tag :key="companyCode" color=blue> | |
46 | + {{ solutionCompany(companyCode) }} | |
47 | + </a-tag> | |
48 | + </span> | |
49 | + | |
44 | 50 | <template slot="htmlSlot" slot-scope="text"> |
45 | 51 | <div v-html="text"></div> |
46 | 52 | </template> |
... | ... | @@ -80,6 +86,7 @@ |
80 | 86 | |
81 | 87 | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
82 | 88 | import InventoryDetailModal from './modules/InventoryDetailModal' |
89 | + import {getCompanyList} from '@/api/api' | |
83 | 90 | |
84 | 91 | export default { |
85 | 92 | name: "InventoryDetailList", |
... | ... | @@ -109,6 +116,7 @@ |
109 | 116 | return { |
110 | 117 | description: '库存表管理页面', |
111 | 118 | disableMixinCreated:true, |
119 | + companyList:[], | |
112 | 120 | // 表头 |
113 | 121 | columns: [ |
114 | 122 | { |
... | ... | @@ -119,7 +127,9 @@ |
119 | 127 | { |
120 | 128 | title:'货主', |
121 | 129 | align:"center", |
122 | - dataIndex: 'companyCode' | |
130 | + dataIndex: 'companyCode', | |
131 | + key: 'companyCode', | |
132 | + scopedSlots: { customRender: 'companyCode' } | |
123 | 133 | }, |
124 | 134 | { |
125 | 135 | title:'库区', |
... | ... | @@ -233,6 +243,7 @@ |
233 | 243 | } |
234 | 244 | }, |
235 | 245 | created() { |
246 | + this.loadFrom(); | |
236 | 247 | }, |
237 | 248 | computed: { |
238 | 249 | importExcelUrl(){ |
... | ... | @@ -240,6 +251,23 @@ |
240 | 251 | } |
241 | 252 | }, |
242 | 253 | methods: { |
254 | + loadFrom() { | |
255 | + getCompanyList().then((res) => { | |
256 | + if (res.success) { | |
257 | + this.companyList = res.result | |
258 | + } | |
259 | + }); | |
260 | + }, | |
261 | + solutionCompany(value) { | |
262 | + var actions = [] | |
263 | + Object.keys(this.companyList).some((key) => { | |
264 | + if (this.companyList[key].code == ('' + value)) { | |
265 | + actions.push(this.companyList[key].name) | |
266 | + return true | |
267 | + } | |
268 | + }) | |
269 | + return actions.join('') | |
270 | + }, | |
243 | 271 | clearList(){ |
244 | 272 | this.dataSource=[] |
245 | 273 | this.selectedRowKeys=[] |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue
... | ... | @@ -6,7 +6,14 @@ |
6 | 6 | <a-row :gutter="24"> |
7 | 7 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
8 | 8 | <a-form-item label="货主"> |
9 | - <a-input placeholder="请输入货主" v-model="queryParam.companyCode"></a-input> | |
9 | + <a-select | |
10 | + show-search | |
11 | + placeholder="请选择货主" | |
12 | + option-filter-prop="children" | |
13 | + :filter-option="filterOption" | |
14 | + v-model="queryParam.companyCode"> | |
15 | + <a-select-option v-for="item in companyList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
16 | + </a-select> | |
10 | 17 | </a-form-item> |
11 | 18 | </a-col> |
12 | 19 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
... | ... | @@ -121,6 +128,12 @@ |
121 | 128 | class="j-table-force-nowrap" |
122 | 129 | @change="handleTableChange"> |
123 | 130 | |
131 | + <span slot="companyCode" slot-scope="companyCode"> | |
132 | + <a-tag :key="companyCode" color=blue> | |
133 | + {{ solutionCompany(companyCode) }} | |
134 | + </a-tag> | |
135 | + </span> | |
136 | + | |
124 | 137 | <template slot="htmlSlot" slot-scope="text"> |
125 | 138 | <div v-html="text"></div> |
126 | 139 | </template> |
... | ... | @@ -174,6 +187,7 @@ |
174 | 187 | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
175 | 188 | import InventoryTransactionModal from './modules/InventoryTransactionModal' |
176 | 189 | import {filterMultiDictText} from '@/components/dict/JDictSelectUtil' |
190 | + import {getCompanyList} from '@/api/api' | |
177 | 191 | |
178 | 192 | export default { |
179 | 193 | name: 'InventoryTransactionList', |
... | ... | @@ -184,6 +198,7 @@ |
184 | 198 | data () { |
185 | 199 | return { |
186 | 200 | description: '库存交易记录管理页面', |
201 | + companyList:[], | |
187 | 202 | // 表头 |
188 | 203 | columns: [ |
189 | 204 | { |
... | ... | @@ -194,7 +209,9 @@ |
194 | 209 | { |
195 | 210 | title:'货主', |
196 | 211 | align:"center", |
197 | - dataIndex: 'companyCode' | |
212 | + dataIndex: 'companyCode', | |
213 | + key: 'companyCode', | |
214 | + scopedSlots: { customRender: 'companyCode' } | |
198 | 215 | }, |
199 | 216 | { |
200 | 217 | title:'容器编码', |
... | ... | @@ -202,9 +219,14 @@ |
202 | 219 | dataIndex: 'containerCode' |
203 | 220 | }, |
204 | 221 | { |
205 | - title:'库位编码', | |
222 | + title:'起始库位编码', | |
223 | + align:"center", | |
224 | + dataIndex: 'fromLocationCode' | |
225 | + }, | |
226 | + { | |
227 | + title:'目标库位编码', | |
206 | 228 | align:"center", |
207 | - dataIndex: 'locationCode' | |
229 | + dataIndex: 'toLocationCode' | |
208 | 230 | }, |
209 | 231 | { |
210 | 232 | title:'交易类型', |
... | ... | @@ -234,7 +256,7 @@ |
234 | 256 | { |
235 | 257 | title:'库存状态', |
236 | 258 | align:"center", |
237 | - dataIndex: 'inventoryStatus' | |
259 | + dataIndex: 'inventoryStatus_dictText' | |
238 | 260 | }, |
239 | 261 | { |
240 | 262 | title:'数量', |
... | ... | @@ -288,7 +310,8 @@ |
288 | 310 | } |
289 | 311 | }, |
290 | 312 | created() { |
291 | - this.getSuperFieldList(); | |
313 | + this.getSuperFieldList(); | |
314 | + this.loadFrom(); | |
292 | 315 | }, |
293 | 316 | computed: { |
294 | 317 | importExcelUrl: function(){ |
... | ... | @@ -298,6 +321,24 @@ |
298 | 321 | methods: { |
299 | 322 | initDictConfig(){ |
300 | 323 | }, |
324 | + loadFrom() { | |
325 | + console.log("loadFrom 11"); | |
326 | + getCompanyList().then((res) => { | |
327 | + if (res.success) { | |
328 | + this.companyList = res.result | |
329 | + } | |
330 | + }); | |
331 | + }, | |
332 | + solutionCompany(value) { | |
333 | + var actions = [] | |
334 | + Object.keys(this.companyList).some((key) => { | |
335 | + if (this.companyList[key].code == ('' + value)) { | |
336 | + actions.push(this.companyList[key].name) | |
337 | + return true | |
338 | + } | |
339 | + }) | |
340 | + return actions.join('') | |
341 | + }, | |
301 | 342 | getSuperFieldList(){ |
302 | 343 | let fieldList=[]; |
303 | 344 | fieldList.push({type:'string',value:'companyCode',text:'货主',dictCode:''}) |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/ReceiptContainerHeaderList.vue
... | ... | @@ -114,7 +114,8 @@ |
114 | 114 | <span slot="action" slot-scope="text, record"> |
115 | 115 | <a @click="handleEdit(record)">编辑</a> |
116 | 116 | <a-divider type="vertical" /> |
117 | - <a v-if="record.status == 0 && record.taskType == 200" @click="selectPort(record)">生成任务</a> | |
117 | + <a v-if="record.status == 0 && record.taskType == 200" @click="selectPort(record)" >生成任务</a> | |
118 | + <a v-else-if="record.status == 0" @click="createTask(record)">生成任务</a> | |
118 | 119 | <a-divider type="vertical" /> |
119 | 120 | <a-dropdown> |
120 | 121 | <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> |
... | ... | @@ -290,10 +291,8 @@ |
290 | 291 | }, |
291 | 292 | createTask(record) { |
292 | 293 | this.loading = true; |
293 | - const that = this; | |
294 | 294 | this.model = Object.assign({}, record); |
295 | - that.querySource.id = record.id; | |
296 | - createReceiptTask(that.querySource).then((res) => { | |
295 | + createReceiptTask(this.model).then((res) => { | |
297 | 296 | this.loading = false; |
298 | 297 | if (res.success) { |
299 | 298 | this.$message.success(res.message); |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiptContainerSelectModal.vue
... | ... | @@ -33,7 +33,7 @@ |
33 | 33 | |
34 | 34 | import { httpAction } from '@/api/manage' |
35 | 35 | import { validateDuplicateValue } from '@/utils/util' |
36 | - import {createShipmentTask} from '@/api/api' | |
36 | + import {createReceiptTask} from '@/api/api' | |
37 | 37 | import {selectSupplePort} from '@/api/api' |
38 | 38 | |
39 | 39 | export default { |
... | ... | @@ -51,7 +51,7 @@ |
51 | 51 | data () { |
52 | 52 | return { |
53 | 53 | title:"操作", |
54 | - width:800, | |
54 | + width:500, | |
55 | 55 | visible: false, |
56 | 56 | model:{ |
57 | 57 | }, |
... | ... | @@ -96,7 +96,7 @@ |
96 | 96 | this.$refs.form.validate(valid => { |
97 | 97 | if (valid) { |
98 | 98 | that.confirmLoading = true; |
99 | - createShipmentTask(this.model).then((res) => { | |
99 | + createReceiptTask(this.model).then((res) => { | |
100 | 100 | if(res.success){ |
101 | 101 | that.$message.success(res.message); |
102 | 102 | that.$emit('ok'); |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/shipment/ShipmentHeaderList.vue
... | ... | @@ -166,7 +166,8 @@ |
166 | 166 | </template> |
167 | 167 | |
168 | 168 | <span slot="action" slot-scope="text, record"> |
169 | - <a @click="autoShipmentCombine(record)">自动配盘</a> | |
169 | + <a-divider type="vertical" /> | |
170 | + <a v-if="record.lastStatus < 800" @click="autoShipmentCombine(record)">自动配盘</a> | |
170 | 171 | <a-divider type="vertical" /> |
171 | 172 | <a @click="handleEdit(record)">编辑</a> |
172 | 173 | |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/shipment/modules/ShipmentContainerSelectModal.vue
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/CircleTaskHeaderList.vue
0 → 100644
1 | +<template> | |
2 | + <a-card :bordered="false"> | |
3 | + <!-- 查询区域 --> | |
4 | + <div class="table-page-search-wrapper"> | |
5 | + <a-form layout="inline" @keyup.enter.native="searchQuery"> | |
6 | + <a-row :gutter="24"> | |
7 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
8 | + <a-form-item label="任务类型"> | |
9 | + <j-dict-select-tag placeholder="请选择任务类型" v-model="queryParam.taskType" dictCode="task_type"/> | |
10 | + </a-form-item> | |
11 | + </a-col> | |
12 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
13 | + <a-form-item label="容器号"> | |
14 | + <a-input placeholder="请输入容器号" v-model="queryParam.containerCode"></a-input> | |
15 | + </a-form-item> | |
16 | + </a-col> | |
17 | + <template v-if="toggleSearchStatus"> | |
18 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
19 | + <a-form-item label="库区"> | |
20 | + <a-select | |
21 | + show-search | |
22 | + placeholder="请选择库区" | |
23 | + option-filter-prop="children" | |
24 | + :filter-option="filterOption" | |
25 | + v-model="queryParam.zoneCode" | |
26 | + style="width: 200px"> | |
27 | + <a-select-option v-for="item in zoneList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-item> | |
30 | + </a-col> | |
31 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
32 | + <a-form-item label="起始库位"> | |
33 | + <a-input placeholder="请输入起始库位" v-model="queryParam.fromLocationCode"></a-input> | |
34 | + </a-form-item> | |
35 | + </a-col> | |
36 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
37 | + <a-form-item label="目标库位"> | |
38 | + <a-input placeholder="请输入目标库位" v-model="queryParam.toLocationCode"></a-input> | |
39 | + </a-form-item> | |
40 | + </a-col> | |
41 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
42 | + <a-form-item label="是否空出"> | |
43 | + <j-dict-select-tag placeholder="请选择是否空出" v-model="queryParam.isEmptyOut" dictCode="is_or_not"/> | |
44 | + </a-form-item> | |
45 | + </a-col> | |
46 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
47 | + <a-form-item label="起始出入口"> | |
48 | + <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPortCode"></a-input> | |
49 | + </a-form-item> | |
50 | + </a-col> | |
51 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
52 | + <a-form-item label="目标出入口"> | |
53 | + <a-input placeholder="请输入目标出入口" v-model="queryParam.toPortCode"></a-input> | |
54 | + </a-form-item> | |
55 | + </a-col> | |
56 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
57 | + <a-form-item label="任务状态"> | |
58 | + <j-dict-select-tag placeholder="请选择任务状态" v-model="queryParam.status" dictCode="task_header_status"/> | |
59 | + </a-form-item> | |
60 | + </a-col> | |
61 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
62 | + <a-form-item label="是否重入"> | |
63 | + <j-dict-select-tag placeholder="请选择是否重入" v-model="queryParam.isDoubleIn" dictCode="is_or_not"/> | |
64 | + </a-form-item> | |
65 | + </a-col> | |
66 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
67 | + <a-form-item label="重入库位号"> | |
68 | + <a-input placeholder="请输入重入库位号" v-model="queryParam.originLocationCode"></a-input> | |
69 | + </a-form-item> | |
70 | + </a-col> | |
71 | + <a-col :xl="10" :lg="11" :md="12" :sm="24"> | |
72 | + <a-form-item label="创建日期"> | |
73 | + <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开始时间" class="query-group-cust" v-model="queryParam.createTime_begin"></j-date> | |
74 | + <span class="query-group-split-cust"></span> | |
75 | + <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择结束时间" class="query-group-cust" v-model="queryParam.createTime_end"></j-date> | |
76 | + </a-form-item> | |
77 | + </a-col> | |
78 | + </template> | |
79 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
80 | + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> | |
81 | + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> | |
82 | + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> | |
83 | + <a @click="handleToggleSearch" style="margin-left: 8px"> | |
84 | + {{ toggleSearchStatus ? '收起' : '展开' }} | |
85 | + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> | |
86 | + </a> | |
87 | + </span> | |
88 | + </a-col> | |
89 | + </a-row> | |
90 | + </a-form> | |
91 | + </div> | |
92 | + <!-- 查询区域-END --> | |
93 | + | |
94 | + <!-- 操作按钮区域 --> | |
95 | + <div class="table-operator"> | |
96 | + <a-button @click="createCheckOut()" type="primary">出库查看</a-button> | |
97 | +<!-- <a-button type="primary" icon="download" @click="handleExportXls('任务表')">导出</a-button>--> | |
98 | +<!-- <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">--> | |
99 | +<!-- <a-button type="primary" icon="import">导入</a-button>--> | |
100 | +<!-- </a-upload>--> | |
101 | +<!-- <!– 高级查询区域 –>--> | |
102 | +<!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>--> | |
103 | + </div> | |
104 | + | |
105 | + <!-- table区域-begin --> | |
106 | + <div> | |
107 | + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> | |
108 | + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 | |
109 | + <a style="margin-left: 24px" @click="onClearSelected">清空</a> | |
110 | + </div> | |
111 | + | |
112 | + <a-table | |
113 | + ref="table" | |
114 | + size="middle" | |
115 | + bordered | |
116 | + rowKey="id" | |
117 | + class="j-table-force-nowrap" | |
118 | + :scroll="{x:true}" | |
119 | + :columns="columns" | |
120 | + :dataSource="dataSource" | |
121 | + :pagination="ipagination" | |
122 | + :loading="loading" | |
123 | + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}" | |
124 | + :customRow="clickThenSelect" | |
125 | + @change="handleTableChange"> | |
126 | + | |
127 | + <span slot="zoneCode" slot-scope="zoneCode"> | |
128 | + <a-tag :key="zoneCode" color=blue> | |
129 | + {{ solutionZoneCode(zoneCode) }} | |
130 | + </a-tag> | |
131 | + </span> | |
132 | + | |
133 | + <template slot="htmlSlot" slot-scope="text"> | |
134 | + <div v-html="text"></div> | |
135 | + </template> | |
136 | + <template slot="imgSlot" slot-scope="text"> | |
137 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> | |
138 | + <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/> | |
139 | + </template> | |
140 | + <template slot="fileSlot" slot-scope="text"> | |
141 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> | |
142 | + <a-button | |
143 | + v-else | |
144 | + :ghost="true" | |
145 | + type="primary" | |
146 | + icon="download" | |
147 | + size="small" | |
148 | + @click="downloadFile(text)"> | |
149 | + 下载 | |
150 | + </a-button> | |
151 | + </template> | |
152 | + | |
153 | + <span slot="action" slot-scope="text, record"> | |
154 | + <a v-if="record.status == 1" @click="executeTask(record)">执行</a> | |
155 | + <a-divider type="vertical" /> | |
156 | + <a v-if="record.status < 100" @click="completeTask(record)">完成</a> | |
157 | + <a-divider type="vertical" /> | |
158 | + <a-dropdown> | |
159 | + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> | |
160 | + <a-menu slot="overlay"> | |
161 | + <a-menu-item> | |
162 | + <a @click="handleEdit(record)">编辑</a> | |
163 | + </a-menu-item> | |
164 | + <a-menu-item> | |
165 | + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> | |
166 | + <a>删除</a> | |
167 | + </a-popconfirm> | |
168 | + </a-menu-item> | |
169 | + </a-menu> | |
170 | + </a-dropdown> | |
171 | + </span> | |
172 | + | |
173 | + </a-table> | |
174 | + </div> | |
175 | + | |
176 | + <a-tabs defaultActiveKey="1"> | |
177 | + <a-tab-pane tab="任务详情" key="1" > | |
178 | + <TaskDetailList :mainId="selectedMainId" /> | |
179 | + </a-tab-pane> | |
180 | + </a-tabs> | |
181 | + | |
182 | + <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal> | |
183 | + <check-out-task-modal ref="checkOutModal" @ok="modalFormOk"></check-out-task-modal> | |
184 | + </a-card> | |
185 | +</template> | |
186 | + | |
187 | +<script> | |
188 | + | |
189 | + import { JeecgListMixin } from '@/mixins/JeecgListMixin' | |
190 | + import TaskHeaderModal from './modules/TaskHeaderModal' | |
191 | + import { getAction } from '@/api/manage' | |
192 | + import TaskDetailList from './TaskDetailList' | |
193 | + import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil' | |
194 | + import '@/assets/less/TableExpand.less' | |
195 | + import {completeTaskByWMS} from '@/api/api' | |
196 | + import {execute} from '@/api/api' | |
197 | + import {getZoneList} from '@/api/api' | |
198 | + import EmptyInTaskModal from './modules/EmptyInTaskModal' | |
199 | + import CheckOutTaskModal from "./modules/CheckOutTaskModal"; | |
200 | + | |
201 | + export default { | |
202 | + name: "TaskHeaderList", | |
203 | + mixins:[JeecgListMixin], | |
204 | + components: { | |
205 | + CheckOutTaskModal, | |
206 | + EmptyInTaskModal, | |
207 | + TaskDetailList, | |
208 | + TaskHeaderModal | |
209 | + }, | |
210 | + data () { | |
211 | + return { | |
212 | + description: '任务表管理页面', | |
213 | + zoneList:[], | |
214 | + // 表头 | |
215 | + columns: [ | |
216 | + { | |
217 | + title:'任务ID', | |
218 | + align:"center", | |
219 | + dataIndex: 'id', | |
220 | + }, | |
221 | + { | |
222 | + title:'任务类型', | |
223 | + align:"center", | |
224 | + dataIndex: 'taskType_dictText', | |
225 | + }, | |
226 | + { | |
227 | + title:'容器号', | |
228 | + align:"center", | |
229 | + dataIndex: 'containerCode' | |
230 | + }, | |
231 | + { | |
232 | + title:'库区', | |
233 | + align:"center", | |
234 | + dataIndex: 'zoneCode', | |
235 | + key: 'zoneCode', | |
236 | + scopedSlots: { customRender: 'zoneCode' } | |
237 | + }, | |
238 | + { | |
239 | + title:'起始库位', | |
240 | + align:"center", | |
241 | + dataIndex: 'fromLocationCode' | |
242 | + }, | |
243 | + { | |
244 | + title:'目标库位', | |
245 | + align:"center", | |
246 | + dataIndex: 'toLocationCode' | |
247 | + }, | |
248 | + { | |
249 | + title:'目标出入口', | |
250 | + align:"center", | |
251 | + dataIndex: 'toPortCode' | |
252 | + }, | |
253 | + { | |
254 | + title:'任务状态', | |
255 | + align:"center", | |
256 | + dataIndex: 'status_dictText', | |
257 | + }, | |
258 | + { | |
259 | + title:'是否重入', | |
260 | + align:"center", | |
261 | + dataIndex: 'isDoubleIn_dictText', | |
262 | + }, | |
263 | + { | |
264 | + title:'重入库位号', | |
265 | + align:"center", | |
266 | + dataIndex: 'originLocationCode' | |
267 | + }, | |
268 | + { | |
269 | + title:'创建人', | |
270 | + align:"center", | |
271 | + dataIndex: 'createBy' | |
272 | + }, | |
273 | + { | |
274 | + title:'创建日期', | |
275 | + align:"center", | |
276 | + dataIndex: 'createTime' | |
277 | + }, | |
278 | + { | |
279 | + title:'更新人', | |
280 | + align:"center", | |
281 | + dataIndex: 'updateBy' | |
282 | + }, | |
283 | + { | |
284 | + title:'更新日期', | |
285 | + align:"center", | |
286 | + dataIndex: 'updateTime' | |
287 | + }, | |
288 | + { | |
289 | + title: '操作', | |
290 | + dataIndex: 'action', | |
291 | + align:"center", | |
292 | + fixed:"right", | |
293 | + width:147, | |
294 | + scopedSlots: { customRender: 'action' }, | |
295 | + } | |
296 | + ], | |
297 | + url: { | |
298 | + list: "/task/taskHeader/list", | |
299 | + delete: "/task/taskHeader/delete", | |
300 | + deleteBatch: "/task/taskHeader/deleteBatch", | |
301 | + exportXlsUrl: "/task/taskHeader/exportXls", | |
302 | + importExcelUrl: "task/taskHeader/importExcel", | |
303 | + }, | |
304 | + dictOptions:{ | |
305 | + taskType:[], | |
306 | + isEmptyOut:[], | |
307 | + isDoubleIn:[], | |
308 | + status:[], | |
309 | + }, | |
310 | + /* 分页参数 */ | |
311 | + ipagination:{ | |
312 | + current: 1, | |
313 | + pageSize: 5, | |
314 | + pageSizeOptions: ['5', '10', '50'], | |
315 | + showTotal: (total, range) => { | |
316 | + return range[0] + "-" + range[1] + " 共" + total + "条" | |
317 | + }, | |
318 | + showQuickJumper: true, | |
319 | + showSizeChanger: true, | |
320 | + total: 0 | |
321 | + }, | |
322 | + selectedMainId:'', | |
323 | + superFieldList:[], | |
324 | + } | |
325 | + }, | |
326 | + created() { | |
327 | + this.getSuperFieldList(); | |
328 | + this.loadFrom(); | |
329 | + }, | |
330 | + computed: { | |
331 | + importExcelUrl: function(){ | |
332 | + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; | |
333 | + } | |
334 | + }, | |
335 | + methods: { | |
336 | + initDictConfig(){ | |
337 | + }, | |
338 | + clickThenSelect(record) { | |
339 | + return { | |
340 | + on: { | |
341 | + click: () => { | |
342 | + this.onSelectChange(record.id.split(","), [record]); | |
343 | + } | |
344 | + } | |
345 | + } | |
346 | + }, | |
347 | + onClearSelected() { | |
348 | + this.selectedRowKeys = []; | |
349 | + this.selectionRows = []; | |
350 | + this.selectedMainId='' | |
351 | + }, | |
352 | + onSelectChange(selectedRowKeys, selectionRows) { | |
353 | + this.selectedMainId=selectedRowKeys[0] | |
354 | + this.selectedRowKeys = selectedRowKeys; | |
355 | + this.selectionRows = selectionRows; | |
356 | + }, | |
357 | + loadData(arg) { | |
358 | + if(!this.url.list){ | |
359 | + this.$message.error("请设置url.list属性!") | |
360 | + return | |
361 | + } | |
362 | + //加载数据 若传入参数1则加载第一页的内容 | |
363 | + if (arg === 1) { | |
364 | + this.ipagination.current = 1; | |
365 | + } | |
366 | + this.onClearSelected() | |
367 | + var params = this.getQueryParams();//查询条件 | |
368 | + params.innernalTaskType = 400; | |
369 | + this.loading = true; | |
370 | + getAction(this.url.list, params).then((res) => { | |
371 | + if (res.success) { | |
372 | + this.dataSource = res.result.records; | |
373 | + this.ipagination.total = res.result.total; | |
374 | + } | |
375 | + if(res.code===510){ | |
376 | + this.$message.warning(res.message) | |
377 | + } | |
378 | + this.loading = false; | |
379 | + }) | |
380 | + }, | |
381 | + loadFrom() { | |
382 | + getZoneList().then((res) => { | |
383 | + if (res.success) { | |
384 | + this.zoneList = res.result | |
385 | + } | |
386 | + }); | |
387 | + }, | |
388 | + createCheckOut() { | |
389 | + this.$refs.checkOutModal.edit(); | |
390 | + this.$refs.checkOutModal.title = "创建出库查看任务"; | |
391 | + }, | |
392 | + solutionZoneCode(value) { | |
393 | + var actions = [] | |
394 | + Object.keys(this.zoneList).some((key) => { | |
395 | + if (this.zoneList[key].code == ('' + value)) { | |
396 | + actions.push(this.zoneList[key].name) | |
397 | + return true | |
398 | + } | |
399 | + }) | |
400 | + return actions.join('') | |
401 | + }, | |
402 | + completeTask(record) { | |
403 | + this.loading = true; | |
404 | + this.model = Object.assign({}, record); | |
405 | + completeTaskByWMS(this.model).then((res) => { | |
406 | + this.loading = false; | |
407 | + if (res.success) { | |
408 | + this.$message.success(res.message); | |
409 | + } | |
410 | + else { | |
411 | + this.$message.error(res.message); | |
412 | + } | |
413 | + this.searchQuery(); | |
414 | + }); | |
415 | + }, | |
416 | + executeTask(record) { | |
417 | + this.loading = true; | |
418 | + this.model = Object.assign({}, record); | |
419 | + execute(this.model).then((res) => { | |
420 | + this.loading = false; | |
421 | + if (res.success) { | |
422 | + this.$message.success(res.message); | |
423 | + } | |
424 | + else { | |
425 | + this.$message.error(res.message); | |
426 | + } | |
427 | + this.searchQuery(); | |
428 | + }); | |
429 | + }, | |
430 | + getSuperFieldList(){ | |
431 | + let fieldList=[]; | |
432 | + fieldList.push({type:'int',value:'taskType',text:'任务类型',dictCode:'task_type'}) | |
433 | + fieldList.push({type:'string',value:'containerCode',text:'容器号',dictCode:''}) | |
434 | + fieldList.push({type:'string',value:'fromLocationCode',text:'起始库位',dictCode:''}) | |
435 | + fieldList.push({type:'string',value:'toLocationCode',text:'目标库位',dictCode:''}) | |
436 | + fieldList.push({type:'string',value:'isEmptyOut',text:'是否空出',dictCode:'is_or_not'}) | |
437 | + fieldList.push({type:'int',value:'isDoubleIn',text:'是否重入',dictCode:'is_or_not'}) | |
438 | + fieldList.push({type:'string',value:'originLocationCode',text:'重入库位号',dictCode:''}) | |
439 | + fieldList.push({type:'int',value:'status',text:'任务状态',dictCode:'task_header_status'}) | |
440 | + fieldList.push({type:'string',value:'fromPortCode',text:'起始出入口',dictCode:''}) | |
441 | + fieldList.push({type:'string',value:'toPortCode',text:'目标出入口',dictCode:''}) | |
442 | + fieldList.push({type:'string',value:'createBy',text:'创建人',dictCode:''}) | |
443 | + fieldList.push({type:'datetime',value:'createTime',text:'创建日期'}) | |
444 | + fieldList.push({type:'string',value:'updateBy',text:'更新人',dictCode:''}) | |
445 | + fieldList.push({type:'datetime',value:'updateTime',text:'更新日期'}) | |
446 | + this.superFieldList = fieldList | |
447 | + } | |
448 | + } | |
449 | + } | |
450 | +</script> | |
451 | +<style scoped> | |
452 | + @import '~@assets/less/common.less' | |
453 | +</style> | |
0 | 454 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/ReceiptTaskHeaderList.vue
... | ... | @@ -15,6 +15,19 @@ |
15 | 15 | </a-form-item> |
16 | 16 | </a-col> |
17 | 17 | <template v-if="toggleSearchStatus"> |
18 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
19 | + <a-form-item label="库区"> | |
20 | + <a-select | |
21 | + show-search | |
22 | + placeholder="请选择库区" | |
23 | + option-filter-prop="children" | |
24 | + :filter-option="filterOption" | |
25 | + v-model="queryParam.zoneCode" | |
26 | + style="width: 200px"> | |
27 | + <a-select-option v-for="item in zoneList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-item> | |
30 | + </a-col> | |
18 | 31 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
19 | 32 | <a-form-item label="起始库位"> |
20 | 33 | <a-input placeholder="请输入起始库位" v-model="queryParam.fromLocationCode"></a-input> |
... | ... | @@ -32,12 +45,12 @@ |
32 | 45 | </a-col> |
33 | 46 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
34 | 47 | <a-form-item label="起始出入口"> |
35 | - <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPort"></a-input> | |
48 | + <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPortCode"></a-input> | |
36 | 49 | </a-form-item> |
37 | 50 | </a-col> |
38 | 51 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
39 | 52 | <a-form-item label="目标出入口"> |
40 | - <a-input placeholder="请输入目标出入口" v-model="queryParam.toPort"></a-input> | |
53 | + <a-input placeholder="请输入目标出入口" v-model="queryParam.toPortCode"></a-input> | |
41 | 54 | </a-form-item> |
42 | 55 | </a-col> |
43 | 56 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
... | ... | @@ -79,15 +92,10 @@ |
79 | 92 | <!-- 查询区域-END --> |
80 | 93 | |
81 | 94 | <!-- 操作按钮区域 --> |
82 | -<!-- <div class="table-operator">--> | |
83 | -<!-- <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>--> | |
84 | -<!-- <a-button type="primary" icon="download" @click="handleExportXls('任务表')">导出</a-button>--> | |
85 | -<!-- <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">--> | |
86 | -<!-- <a-button type="primary" icon="import">导入</a-button>--> | |
87 | -<!-- </a-upload>--> | |
88 | -<!-- <!– 高级查询区域 –>--> | |
89 | -<!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>--> | |
90 | -<!-- </div>--> | |
95 | + <div class="table-operator"> | |
96 | + <a-button @click="createEmptyIn()" type="primary">空托入库</a-button> | |
97 | + <a-button @click="createManyEmptyIn()" type="primary">空托组入库</a-button> | |
98 | + </div> | |
91 | 99 | |
92 | 100 | <!-- table区域-begin --> |
93 | 101 | <div> |
... | ... | @@ -111,6 +119,12 @@ |
111 | 119 | :customRow="clickThenSelect" |
112 | 120 | @change="handleTableChange"> |
113 | 121 | |
122 | + <span slot="zoneCode" slot-scope="zoneCode"> | |
123 | + <a-tag :key="zoneCode" color=blue> | |
124 | + {{ solutionZoneCode(zoneCode) }} | |
125 | + </a-tag> | |
126 | + </span> | |
127 | + | |
114 | 128 | <template slot="htmlSlot" slot-scope="text"> |
115 | 129 | <div v-html="text"></div> |
116 | 130 | </template> |
... | ... | @@ -134,6 +148,8 @@ |
134 | 148 | <span slot="action" slot-scope="text, record"> |
135 | 149 | <a v-if="record.status == 1" @click="executeTask(record)">执行</a> |
136 | 150 | <a-divider type="vertical" /> |
151 | + <a v-if="record.status < 100" @click="cancelTask(record)">取消</a> | |
152 | + <a-divider type="vertical" /> | |
137 | 153 | <a v-if="record.status < 100" @click="completeTask(record)">完成</a> |
138 | 154 | <a-divider type="vertical" /> |
139 | 155 | <a-dropdown> |
... | ... | @@ -161,6 +177,8 @@ |
161 | 177 | </a-tabs> |
162 | 178 | |
163 | 179 | <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal> |
180 | + <empty-in-task-modal ref="emptyInModal" @ok="modalFormOk"></empty-in-task-modal> | |
181 | + <many-empty-in-task-modal ref="manyEmptyInModal" @ok="modalFormOk"></many-empty-in-task-modal> | |
164 | 182 | </a-card> |
165 | 183 | </template> |
166 | 184 | |
... | ... | @@ -172,19 +190,25 @@ |
172 | 190 | import TaskDetailList from './TaskDetailList' |
173 | 191 | import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil' |
174 | 192 | import '@/assets/less/TableExpand.less' |
175 | - import {completeTaskByWMS} from '@/api/api' | |
193 | + import {completeTaskByWMS, cancelTask} from '@/api/api' | |
176 | 194 | import {execute} from '@/api/api' |
195 | + import {getZoneList} from '@/api/api' | |
196 | + import EmptyInTaskModal from './modules/EmptyInTaskModal' | |
197 | + import ManyEmptyInTaskModal from "./modules/ManyEmptyInTaskModal"; | |
177 | 198 | |
178 | 199 | export default { |
179 | 200 | name: "TaskHeaderList", |
180 | 201 | mixins:[JeecgListMixin], |
181 | 202 | components: { |
203 | + ManyEmptyInTaskModal, | |
204 | + EmptyInTaskModal, | |
182 | 205 | TaskDetailList, |
183 | 206 | TaskHeaderModal |
184 | 207 | }, |
185 | 208 | data () { |
186 | 209 | return { |
187 | 210 | description: '任务表管理页面', |
211 | + zoneList:[], | |
188 | 212 | // 表头 |
189 | 213 | columns: [ |
190 | 214 | { |
... | ... | @@ -203,6 +227,13 @@ |
203 | 227 | dataIndex: 'containerCode' |
204 | 228 | }, |
205 | 229 | { |
230 | + title:'库区', | |
231 | + align:"center", | |
232 | + dataIndex: 'zoneCode', | |
233 | + key: 'zoneCode', | |
234 | + scopedSlots: { customRender: 'zoneCode' } | |
235 | + }, | |
236 | + { | |
206 | 237 | title:'起始库位', |
207 | 238 | align:"center", |
208 | 239 | dataIndex: 'fromLocationCode' |
... | ... | @@ -215,7 +246,7 @@ |
215 | 246 | { |
216 | 247 | title:'目标出入口', |
217 | 248 | align:"center", |
218 | - dataIndex: 'toPort' | |
249 | + dataIndex: 'toPortCode' | |
219 | 250 | }, |
220 | 251 | { |
221 | 252 | title:'任务状态', |
... | ... | @@ -292,6 +323,7 @@ |
292 | 323 | }, |
293 | 324 | created() { |
294 | 325 | this.getSuperFieldList(); |
326 | + this.loadFrom(); | |
295 | 327 | }, |
296 | 328 | computed: { |
297 | 329 | importExcelUrl: function(){ |
... | ... | @@ -344,6 +376,45 @@ |
344 | 376 | this.loading = false; |
345 | 377 | }) |
346 | 378 | }, |
379 | + loadFrom() { | |
380 | + getZoneList().then((res) => { | |
381 | + if (res.success) { | |
382 | + this.zoneList = res.result | |
383 | + } | |
384 | + }); | |
385 | + }, | |
386 | + createEmptyIn() { | |
387 | + this.$refs.emptyInModal.edit(); | |
388 | + this.$refs.emptyInModal.title = "创建空托盘入库"; | |
389 | + }, | |
390 | + createManyEmptyIn() { | |
391 | + this.$refs.manyEmptyInModal.edit(); | |
392 | + this.$refs.manyEmptyInModal.title = "创建空托盘组入库"; | |
393 | + }, | |
394 | + solutionZoneCode(value) { | |
395 | + var actions = [] | |
396 | + Object.keys(this.zoneList).some((key) => { | |
397 | + if (this.zoneList[key].code == ('' + value)) { | |
398 | + actions.push(this.zoneList[key].name) | |
399 | + return true | |
400 | + } | |
401 | + }) | |
402 | + return actions.join('') | |
403 | + }, | |
404 | + cancelTask(record) { | |
405 | + this.loading = true; | |
406 | + this.model = Object.assign({}, record); | |
407 | + cancelTask(this.model.id).then((res) => { | |
408 | + this.loading = false; | |
409 | + if (res.success) { | |
410 | + this.$message.success(res.message); | |
411 | + } | |
412 | + else { | |
413 | + this.$message.error(res.message); | |
414 | + } | |
415 | + this.searchQuery(); | |
416 | + }); | |
417 | + }, | |
347 | 418 | completeTask(record) { |
348 | 419 | this.loading = true; |
349 | 420 | this.model = Object.assign({}, record); |
... | ... | @@ -382,8 +453,8 @@ |
382 | 453 | fieldList.push({type:'int',value:'isDoubleIn',text:'是否重入',dictCode:'is_or_not'}) |
383 | 454 | fieldList.push({type:'string',value:'originLocationCode',text:'重入库位号',dictCode:''}) |
384 | 455 | fieldList.push({type:'int',value:'status',text:'任务状态',dictCode:'task_header_status'}) |
385 | - fieldList.push({type:'string',value:'fromPort',text:'起始出入口',dictCode:''}) | |
386 | - fieldList.push({type:'string',value:'toPort',text:'目标出入口',dictCode:''}) | |
456 | + fieldList.push({type:'string',value:'fromPortCode',text:'起始出入口',dictCode:''}) | |
457 | + fieldList.push({type:'string',value:'toPortCode',text:'目标出入口',dictCode:''}) | |
387 | 458 | fieldList.push({type:'string',value:'createBy',text:'创建人',dictCode:''}) |
388 | 459 | fieldList.push({type:'datetime',value:'createTime',text:'创建日期'}) |
389 | 460 | fieldList.push({type:'string',value:'updateBy',text:'更新人',dictCode:''}) |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/ShipmentTaskHeaderList.vue
... | ... | @@ -16,6 +16,19 @@ |
16 | 16 | </a-col> |
17 | 17 | <template v-if="toggleSearchStatus"> |
18 | 18 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
19 | + <a-form-item label="库区"> | |
20 | + <a-select | |
21 | + show-search | |
22 | + placeholder="请选择库区" | |
23 | + option-filter-prop="children" | |
24 | + :filter-option="filterOption" | |
25 | + v-model="queryParam.zoneCode" | |
26 | + style="width: 200px"> | |
27 | + <a-select-option v-for="item in zoneList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-item> | |
30 | + </a-col> | |
31 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
19 | 32 | <a-form-item label="起始库位"> |
20 | 33 | <a-input placeholder="请输入起始库位" v-model="queryParam.fromLocationCode"></a-input> |
21 | 34 | </a-form-item> |
... | ... | @@ -47,12 +60,12 @@ |
47 | 60 | </a-col> |
48 | 61 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
49 | 62 | <a-form-item label="起始出入口"> |
50 | - <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPort"></a-input> | |
63 | + <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPortCode"></a-input> | |
51 | 64 | </a-form-item> |
52 | 65 | </a-col> |
53 | 66 | <a-col :xl="6" :lg="7" :md="8" :sm="24"> |
54 | 67 | <a-form-item label="目标出入口"> |
55 | - <a-input placeholder="请输入目标出入口" v-model="queryParam.toPort"></a-input> | |
68 | + <a-input placeholder="请输入目标出入口" v-model="queryParam.toPortCode"></a-input> | |
56 | 69 | </a-form-item> |
57 | 70 | </a-col> |
58 | 71 | <a-col :xl="10" :lg="11" :md="12" :sm="24"> |
... | ... | @@ -79,15 +92,10 @@ |
79 | 92 | <!-- 查询区域-END --> |
80 | 93 | |
81 | 94 | <!-- 操作按钮区域 --> |
82 | -<!-- <div class="table-operator">--> | |
83 | -<!-- <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button>--> | |
84 | -<!-- <a-button type="primary" icon="download" @click="handleExportXls('任务表')">导出</a-button>--> | |
85 | -<!-- <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">--> | |
86 | -<!-- <a-button type="primary" icon="import">导入</a-button>--> | |
87 | -<!-- </a-upload>--> | |
88 | -<!-- <!– 高级查询区域 –>--> | |
89 | -<!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>--> | |
90 | -<!-- </div>--> | |
95 | + <div class="table-operator"> | |
96 | + <a-button @click="createEmptyOut()" type="primary" >空托出库</a-button> | |
97 | + <a-button @click="createManyEmptyOut()" type="primary" >空托组出库</a-button> | |
98 | + </div> | |
91 | 99 | |
92 | 100 | <!-- table区域-begin --> |
93 | 101 | <div> |
... | ... | @@ -111,6 +119,12 @@ |
111 | 119 | :customRow="clickThenSelect" |
112 | 120 | @change="handleTableChange"> |
113 | 121 | |
122 | + <span slot="zoneCode" slot-scope="zoneCode"> | |
123 | + <a-tag :key="zoneCode" color=blue> | |
124 | + {{ solutionZoneCode(zoneCode) }} | |
125 | + </a-tag> | |
126 | + </span> | |
127 | + | |
114 | 128 | <template slot="htmlSlot" slot-scope="text"> |
115 | 129 | <div v-html="text"></div> |
116 | 130 | </template> |
... | ... | @@ -161,6 +175,9 @@ |
161 | 175 | </a-tabs> |
162 | 176 | |
163 | 177 | <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal> |
178 | + <empty-out-task-modal ref="emptyOutModal" @ok="modalFormOk"></empty-out-task-modal> | |
179 | + <many-empty-out-task-modal ref="manyEmptyOutModal" @ok="modalFormOk"></many-empty-out-task-modal> | |
180 | + | |
164 | 181 | </a-card> |
165 | 182 | </template> |
166 | 183 | |
... | ... | @@ -174,11 +191,16 @@ |
174 | 191 | import '@/assets/less/TableExpand.less' |
175 | 192 | import {completeTaskByWMS} from '@/api/api' |
176 | 193 | import {execute} from '@/api/api' |
194 | + import {getZoneList} from '@/api/api' | |
195 | + import EmptyOutTaskModal from './modules/EmptyOutTaskModal' | |
196 | + import ManyEmptyOutTaskModal from "./modules/ManyEmptyOutTaskModal"; | |
177 | 197 | |
178 | 198 | export default { |
179 | 199 | name: "TaskHeaderList", |
180 | 200 | mixins:[JeecgListMixin], |
181 | 201 | components: { |
202 | + ManyEmptyOutTaskModal, | |
203 | + EmptyOutTaskModal, | |
182 | 204 | TaskDetailList, |
183 | 205 | TaskHeaderModal |
184 | 206 | }, |
... | ... | @@ -203,6 +225,13 @@ |
203 | 225 | dataIndex: 'containerCode' |
204 | 226 | }, |
205 | 227 | { |
228 | + title:'库区', | |
229 | + align:"center", | |
230 | + dataIndex: 'zoneCode', | |
231 | + key: 'zoneCode', | |
232 | + scopedSlots: { customRender: 'zoneCode' } | |
233 | + }, | |
234 | + { | |
206 | 235 | title:'起始库位', |
207 | 236 | align:"center", |
208 | 237 | dataIndex: 'fromLocationCode' |
... | ... | @@ -215,7 +244,7 @@ |
215 | 244 | { |
216 | 245 | title:'目标出入口', |
217 | 246 | align:"center", |
218 | - dataIndex: 'toPort' | |
247 | + dataIndex: 'toPortCode' | |
219 | 248 | }, |
220 | 249 | { |
221 | 250 | title:'任务状态', |
... | ... | @@ -287,6 +316,7 @@ |
287 | 316 | }, |
288 | 317 | created() { |
289 | 318 | this.getSuperFieldList(); |
319 | + this.loadFrom(); | |
290 | 320 | }, |
291 | 321 | computed: { |
292 | 322 | importExcelUrl: function(){ |
... | ... | @@ -315,6 +345,31 @@ |
315 | 345 | this.selectedRowKeys = selectedRowKeys; |
316 | 346 | this.selectionRows = selectionRows; |
317 | 347 | }, |
348 | + loadFrom() { | |
349 | + getZoneList().then((res) => { | |
350 | + if (res.success) { | |
351 | + this.zoneList = res.result | |
352 | + } | |
353 | + }); | |
354 | + }, | |
355 | + createEmptyOut() { | |
356 | + this.$refs.emptyOutModal.edit(); | |
357 | + this.$refs.emptyOutModal.title = "创建空托盘出库"; | |
358 | + }, | |
359 | + createManyEmptyOut() { | |
360 | + this.$refs.manyEmptyOutModal.edit(); | |
361 | + this.$refs.manyEmptyOutModal.title = "创建空托盘组出库"; | |
362 | + }, | |
363 | + solutionZoneCode(value) { | |
364 | + var actions = [] | |
365 | + Object.keys(this.zoneList).some((key) => { | |
366 | + if (this.zoneList[key].code == ('' + value)) { | |
367 | + actions.push(this.zoneList[key].name) | |
368 | + return true | |
369 | + } | |
370 | + }) | |
371 | + return actions.join('') | |
372 | + }, | |
318 | 373 | loadData(arg) { |
319 | 374 | if(!this.url.list){ |
320 | 375 | this.$message.error("请设置url.list属性!") |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/TransferTaskHeaderList.vue
0 → 100644
1 | +<template> | |
2 | + <a-card :bordered="false"> | |
3 | + <!-- 查询区域 --> | |
4 | + <div class="table-page-search-wrapper"> | |
5 | + <a-form layout="inline" @keyup.enter.native="searchQuery"> | |
6 | + <a-row :gutter="24"> | |
7 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
8 | + <a-form-item label="任务类型"> | |
9 | + <j-dict-select-tag placeholder="请选择任务类型" v-model="queryParam.taskType" dictCode="task_type"/> | |
10 | + </a-form-item> | |
11 | + </a-col> | |
12 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
13 | + <a-form-item label="容器号"> | |
14 | + <a-input placeholder="请输入容器号" v-model="queryParam.containerCode"></a-input> | |
15 | + </a-form-item> | |
16 | + </a-col> | |
17 | + <template v-if="toggleSearchStatus"> | |
18 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
19 | + <a-form-item label="库区"> | |
20 | + <a-select | |
21 | + show-search | |
22 | + placeholder="请选择库区" | |
23 | + option-filter-prop="children" | |
24 | + :filter-option="filterOption" | |
25 | + v-model="queryParam.zoneCode" | |
26 | + style="width: 200px"> | |
27 | + <a-select-option v-for="item in zoneList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-item> | |
30 | + </a-col> | |
31 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
32 | + <a-form-item label="起始库位"> | |
33 | + <a-input placeholder="请输入起始库位" v-model="queryParam.fromLocationCode"></a-input> | |
34 | + </a-form-item> | |
35 | + </a-col> | |
36 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
37 | + <a-form-item label="目标库位"> | |
38 | + <a-input placeholder="请输入目标库位" v-model="queryParam.toLocationCode"></a-input> | |
39 | + </a-form-item> | |
40 | + </a-col> | |
41 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
42 | + <a-form-item label="是否空出"> | |
43 | + <j-dict-select-tag placeholder="请选择是否空出" v-model="queryParam.isEmptyOut" dictCode="is_or_not"/> | |
44 | + </a-form-item> | |
45 | + </a-col> | |
46 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
47 | + <a-form-item label="起始出入口"> | |
48 | + <a-input placeholder="请输入起始出入口" v-model="queryParam.fromPortCode"></a-input> | |
49 | + </a-form-item> | |
50 | + </a-col> | |
51 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
52 | + <a-form-item label="目标出入口"> | |
53 | + <a-input placeholder="请输入目标出入口" v-model="queryParam.toPortCode"></a-input> | |
54 | + </a-form-item> | |
55 | + </a-col> | |
56 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
57 | + <a-form-item label="任务状态"> | |
58 | + <j-dict-select-tag placeholder="请选择任务状态" v-model="queryParam.status" dictCode="task_header_status"/> | |
59 | + </a-form-item> | |
60 | + </a-col> | |
61 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
62 | + <a-form-item label="是否重入"> | |
63 | + <j-dict-select-tag placeholder="请选择是否重入" v-model="queryParam.isDoubleIn" dictCode="is_or_not"/> | |
64 | + </a-form-item> | |
65 | + </a-col> | |
66 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
67 | + <a-form-item label="重入库位号"> | |
68 | + <a-input placeholder="请输入重入库位号" v-model="queryParam.originLocationCode"></a-input> | |
69 | + </a-form-item> | |
70 | + </a-col> | |
71 | + <a-col :xl="10" :lg="11" :md="12" :sm="24"> | |
72 | + <a-form-item label="创建日期"> | |
73 | + <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择开始时间" class="query-group-cust" v-model="queryParam.createTime_begin"></j-date> | |
74 | + <span class="query-group-split-cust"></span> | |
75 | + <j-date :show-time="true" date-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择结束时间" class="query-group-cust" v-model="queryParam.createTime_end"></j-date> | |
76 | + </a-form-item> | |
77 | + </a-col> | |
78 | + </template> | |
79 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
80 | + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> | |
81 | + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> | |
82 | + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> | |
83 | + <a @click="handleToggleSearch" style="margin-left: 8px"> | |
84 | + {{ toggleSearchStatus ? '收起' : '展开' }} | |
85 | + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> | |
86 | + </a> | |
87 | + </span> | |
88 | + </a-col> | |
89 | + </a-row> | |
90 | + </a-form> | |
91 | + </div> | |
92 | + <!-- 查询区域-END --> | |
93 | + | |
94 | + <!-- 操作按钮区域 --> | |
95 | + <div class="table-operator"> | |
96 | + <a-button @click="createTransfer()" type="primary">移库任务</a-button> | |
97 | + <a-button @click="createOverStation()" type="primary">跨站任务</a-button> | |
98 | +<!-- <a-button type="primary" icon="download" @click="handleExportXls('任务表')">导出</a-button>--> | |
99 | +<!-- <a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">--> | |
100 | +<!-- <a-button type="primary" icon="import">导入</a-button>--> | |
101 | +<!-- </a-upload>--> | |
102 | +<!-- <!– 高级查询区域 –>--> | |
103 | +<!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>--> | |
104 | + </div> | |
105 | + | |
106 | + <!-- table区域-begin --> | |
107 | + <div> | |
108 | + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> | |
109 | + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 | |
110 | + <a style="margin-left: 24px" @click="onClearSelected">清空</a> | |
111 | + </div> | |
112 | + | |
113 | + <a-table | |
114 | + ref="table" | |
115 | + size="middle" | |
116 | + bordered | |
117 | + rowKey="id" | |
118 | + class="j-table-force-nowrap" | |
119 | + :scroll="{x:true}" | |
120 | + :columns="columns" | |
121 | + :dataSource="dataSource" | |
122 | + :pagination="ipagination" | |
123 | + :loading="loading" | |
124 | + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}" | |
125 | + :customRow="clickThenSelect" | |
126 | + @change="handleTableChange"> | |
127 | + | |
128 | + <span slot="zoneCode" slot-scope="zoneCode"> | |
129 | + <a-tag :key="zoneCode" color=blue> | |
130 | + {{ solutionZoneCode(zoneCode) }} | |
131 | + </a-tag> | |
132 | + </span> | |
133 | + | |
134 | + <template slot="htmlSlot" slot-scope="text"> | |
135 | + <div v-html="text"></div> | |
136 | + </template> | |
137 | + <template slot="imgSlot" slot-scope="text"> | |
138 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> | |
139 | + <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/> | |
140 | + </template> | |
141 | + <template slot="fileSlot" slot-scope="text"> | |
142 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> | |
143 | + <a-button | |
144 | + v-else | |
145 | + :ghost="true" | |
146 | + type="primary" | |
147 | + icon="download" | |
148 | + size="small" | |
149 | + @click="downloadFile(text)"> | |
150 | + 下载 | |
151 | + </a-button> | |
152 | + </template> | |
153 | + | |
154 | + <span slot="action" slot-scope="text, record"> | |
155 | + <a v-if="record.status == 1" @click="executeTask(record)">执行</a> | |
156 | + <a-divider type="vertical" /> | |
157 | + <a v-if="record.status < 100" @click="completeTask(record)">完成</a> | |
158 | + <a-divider type="vertical" /> | |
159 | + <a-dropdown> | |
160 | + <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> | |
161 | + <a-menu slot="overlay"> | |
162 | + <a-menu-item> | |
163 | + <a @click="handleEdit(record)">编辑</a> | |
164 | + </a-menu-item> | |
165 | + <a-menu-item> | |
166 | + <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> | |
167 | + <a>删除</a> | |
168 | + </a-popconfirm> | |
169 | + </a-menu-item> | |
170 | + </a-menu> | |
171 | + </a-dropdown> | |
172 | + </span> | |
173 | + | |
174 | + </a-table> | |
175 | + </div> | |
176 | + | |
177 | + <a-tabs defaultActiveKey="1"> | |
178 | + <a-tab-pane tab="任务详情" key="1" > | |
179 | + <TaskDetailList :mainId="selectedMainId" /> | |
180 | + </a-tab-pane> | |
181 | + </a-tabs> | |
182 | + | |
183 | + <taskHeader-modal ref="modalForm" @ok="modalFormOk"></taskHeader-modal> | |
184 | + <transfer-task-modal ref="transferModal" @ok="modalFormOk"></transfer-task-modal> | |
185 | + <over-station-task-modal ref="overStationModal" @ok="modalFormOk"></over-station-task-modal> | |
186 | + </a-card> | |
187 | +</template> | |
188 | + | |
189 | +<script> | |
190 | + | |
191 | + import { JeecgListMixin } from '@/mixins/JeecgListMixin' | |
192 | + import TaskHeaderModal from './modules/TaskHeaderModal' | |
193 | + import { getAction } from '@/api/manage' | |
194 | + import TaskDetailList from './TaskDetailList' | |
195 | + import {initDictOptions,filterMultiDictText} from '@/components/dict/JDictSelectUtil' | |
196 | + import '@/assets/less/TableExpand.less' | |
197 | + import {completeTaskByWMS} from '@/api/api' | |
198 | + import {execute} from '@/api/api' | |
199 | + import {getZoneList} from '@/api/api' | |
200 | + import EmptyInTaskModal from './modules/EmptyInTaskModal' | |
201 | + import TransferTaskModal from "./modules/TransferTaskModal"; | |
202 | + import OverStationTaskModal from "./modules/OverStationTaskModal"; | |
203 | + | |
204 | + export default { | |
205 | + name: "TaskHeaderList", | |
206 | + mixins:[JeecgListMixin], | |
207 | + components: { | |
208 | + OverStationTaskModal, | |
209 | + TransferTaskModal, | |
210 | + EmptyInTaskModal, | |
211 | + TaskDetailList, | |
212 | + TaskHeaderModal | |
213 | + }, | |
214 | + data () { | |
215 | + return { | |
216 | + description: '任务表管理页面', | |
217 | + zoneList:[], | |
218 | + // 表头 | |
219 | + columns: [ | |
220 | + { | |
221 | + title:'任务ID', | |
222 | + align:"center", | |
223 | + dataIndex: 'id', | |
224 | + }, | |
225 | + { | |
226 | + title:'任务类型', | |
227 | + align:"center", | |
228 | + dataIndex: 'taskType_dictText', | |
229 | + }, | |
230 | + { | |
231 | + title:'容器号', | |
232 | + align:"center", | |
233 | + dataIndex: 'containerCode' | |
234 | + }, | |
235 | + { | |
236 | + title:'库区', | |
237 | + align:"center", | |
238 | + dataIndex: 'zoneCode', | |
239 | + key: 'zoneCode', | |
240 | + scopedSlots: { customRender: 'zoneCode' } | |
241 | + }, | |
242 | + { | |
243 | + title:'起始库位', | |
244 | + align:"center", | |
245 | + dataIndex: 'fromLocationCode' | |
246 | + }, | |
247 | + { | |
248 | + title:'目标库位', | |
249 | + align:"center", | |
250 | + dataIndex: 'toLocationCode' | |
251 | + }, | |
252 | + { | |
253 | + title:'起始出入口', | |
254 | + align:"center", | |
255 | + dataIndex: 'fromPortCode' | |
256 | + }, | |
257 | + { | |
258 | + title:'目标出入口', | |
259 | + align:"center", | |
260 | + dataIndex: 'toPortCode' | |
261 | + }, | |
262 | + { | |
263 | + title:'任务状态', | |
264 | + align:"center", | |
265 | + dataIndex: 'status_dictText', | |
266 | + }, | |
267 | + { | |
268 | + title:'是否重入', | |
269 | + align:"center", | |
270 | + dataIndex: 'isDoubleIn_dictText', | |
271 | + }, | |
272 | + { | |
273 | + title:'重入库位号', | |
274 | + align:"center", | |
275 | + dataIndex: 'originLocationCode' | |
276 | + }, | |
277 | + { | |
278 | + title:'创建人', | |
279 | + align:"center", | |
280 | + dataIndex: 'createBy' | |
281 | + }, | |
282 | + { | |
283 | + title:'创建日期', | |
284 | + align:"center", | |
285 | + dataIndex: 'createTime' | |
286 | + }, | |
287 | + { | |
288 | + title:'更新人', | |
289 | + align:"center", | |
290 | + dataIndex: 'updateBy' | |
291 | + }, | |
292 | + { | |
293 | + title:'更新日期', | |
294 | + align:"center", | |
295 | + dataIndex: 'updateTime' | |
296 | + }, | |
297 | + { | |
298 | + title: '操作', | |
299 | + dataIndex: 'action', | |
300 | + align:"center", | |
301 | + fixed:"right", | |
302 | + width:147, | |
303 | + scopedSlots: { customRender: 'action' }, | |
304 | + } | |
305 | + ], | |
306 | + url: { | |
307 | + list: "/task/taskHeader/list", | |
308 | + delete: "/task/taskHeader/delete", | |
309 | + deleteBatch: "/task/taskHeader/deleteBatch", | |
310 | + exportXlsUrl: "/task/taskHeader/exportXls", | |
311 | + importExcelUrl: "task/taskHeader/importExcel", | |
312 | + }, | |
313 | + dictOptions:{ | |
314 | + taskType:[], | |
315 | + isEmptyOut:[], | |
316 | + isDoubleIn:[], | |
317 | + status:[], | |
318 | + }, | |
319 | + /* 分页参数 */ | |
320 | + ipagination:{ | |
321 | + current: 1, | |
322 | + pageSize: 5, | |
323 | + pageSizeOptions: ['5', '10', '50'], | |
324 | + showTotal: (total, range) => { | |
325 | + return range[0] + "-" + range[1] + " 共" + total + "条" | |
326 | + }, | |
327 | + showQuickJumper: true, | |
328 | + showSizeChanger: true, | |
329 | + total: 0 | |
330 | + }, | |
331 | + selectedMainId:'', | |
332 | + superFieldList:[], | |
333 | + } | |
334 | + }, | |
335 | + created() { | |
336 | + this.getSuperFieldList(); | |
337 | + this.loadFrom(); | |
338 | + }, | |
339 | + computed: { | |
340 | + importExcelUrl: function(){ | |
341 | + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; | |
342 | + } | |
343 | + }, | |
344 | + methods: { | |
345 | + initDictConfig(){ | |
346 | + }, | |
347 | + clickThenSelect(record) { | |
348 | + return { | |
349 | + on: { | |
350 | + click: () => { | |
351 | + this.onSelectChange(record.id.split(","), [record]); | |
352 | + } | |
353 | + } | |
354 | + } | |
355 | + }, | |
356 | + onClearSelected() { | |
357 | + this.selectedRowKeys = []; | |
358 | + this.selectionRows = []; | |
359 | + this.selectedMainId='' | |
360 | + }, | |
361 | + onSelectChange(selectedRowKeys, selectionRows) { | |
362 | + this.selectedMainId=selectedRowKeys[0] | |
363 | + this.selectedRowKeys = selectedRowKeys; | |
364 | + this.selectionRows = selectionRows; | |
365 | + }, | |
366 | + loadData(arg) { | |
367 | + if(!this.url.list){ | |
368 | + this.$message.error("请设置url.list属性!") | |
369 | + return | |
370 | + } | |
371 | + //加载数据 若传入参数1则加载第一页的内容 | |
372 | + if (arg === 1) { | |
373 | + this.ipagination.current = 1; | |
374 | + } | |
375 | + this.onClearSelected() | |
376 | + var params = this.getQueryParams();//查询条件 | |
377 | + params.innernalTaskType = 300; | |
378 | + this.loading = true; | |
379 | + getAction(this.url.list, params).then((res) => { | |
380 | + if (res.success) { | |
381 | + this.dataSource = res.result.records; | |
382 | + this.ipagination.total = res.result.total; | |
383 | + } | |
384 | + if(res.code===510){ | |
385 | + this.$message.warning(res.message) | |
386 | + } | |
387 | + this.loading = false; | |
388 | + }) | |
389 | + }, | |
390 | + loadFrom() { | |
391 | + getZoneList().then((res) => { | |
392 | + if (res.success) { | |
393 | + this.zoneList = res.result | |
394 | + } | |
395 | + }); | |
396 | + }, | |
397 | + createTransfer() { | |
398 | + this.$refs.transferModal.edit(); | |
399 | + this.$refs.transferModal.title = "创建移库任务"; | |
400 | + }, | |
401 | + createOverStation() { | |
402 | + this.$refs.overStationModal.edit(); | |
403 | + this.$refs.overStationModal.title = "创建跨站任务"; | |
404 | + }, | |
405 | + solutionZoneCode(value) { | |
406 | + var actions = [] | |
407 | + Object.keys(this.zoneList).some((key) => { | |
408 | + if (this.zoneList[key].code == ('' + value)) { | |
409 | + actions.push(this.zoneList[key].name) | |
410 | + return true | |
411 | + } | |
412 | + }) | |
413 | + return actions.join('') | |
414 | + }, | |
415 | + completeTask(record) { | |
416 | + this.loading = true; | |
417 | + this.model = Object.assign({}, record); | |
418 | + completeTaskByWMS(this.model).then((res) => { | |
419 | + this.loading = false; | |
420 | + if (res.success) { | |
421 | + this.$message.success(res.message); | |
422 | + } | |
423 | + else { | |
424 | + this.$message.error(res.message); | |
425 | + } | |
426 | + this.searchQuery(); | |
427 | + }); | |
428 | + }, | |
429 | + executeTask(record) { | |
430 | + this.loading = true; | |
431 | + this.model = Object.assign({}, record); | |
432 | + execute(this.model).then((res) => { | |
433 | + this.loading = false; | |
434 | + if (res.success) { | |
435 | + this.$message.success(res.message); | |
436 | + } | |
437 | + else { | |
438 | + this.$message.error(res.message); | |
439 | + } | |
440 | + this.searchQuery(); | |
441 | + }); | |
442 | + }, | |
443 | + getSuperFieldList(){ | |
444 | + let fieldList=[]; | |
445 | + fieldList.push({type:'int',value:'taskType',text:'任务类型',dictCode:'task_type'}) | |
446 | + fieldList.push({type:'string',value:'containerCode',text:'容器号',dictCode:''}) | |
447 | + fieldList.push({type:'string',value:'fromLocationCode',text:'起始库位',dictCode:''}) | |
448 | + fieldList.push({type:'string',value:'toLocationCode',text:'目标库位',dictCode:''}) | |
449 | + fieldList.push({type:'string',value:'isEmptyOut',text:'是否空出',dictCode:'is_or_not'}) | |
450 | + fieldList.push({type:'int',value:'isDoubleIn',text:'是否重入',dictCode:'is_or_not'}) | |
451 | + fieldList.push({type:'string',value:'originLocationCode',text:'重入库位号',dictCode:''}) | |
452 | + fieldList.push({type:'int',value:'status',text:'任务状态',dictCode:'task_header_status'}) | |
453 | + fieldList.push({type:'string',value:'fromPortCode',text:'起始出入口',dictCode:''}) | |
454 | + fieldList.push({type:'string',value:'toPortCode',text:'目标出入口',dictCode:''}) | |
455 | + fieldList.push({type:'string',value:'createBy',text:'创建人',dictCode:''}) | |
456 | + fieldList.push({type:'datetime',value:'createTime',text:'创建日期'}) | |
457 | + fieldList.push({type:'string',value:'updateBy',text:'更新人',dictCode:''}) | |
458 | + fieldList.push({type:'datetime',value:'updateTime',text:'更新日期'}) | |
459 | + this.superFieldList = fieldList | |
460 | + } | |
461 | + } | |
462 | + } | |
463 | +</script> | |
464 | +<style scoped> | |
465 | + @import '~@assets/less/common.less' | |
466 | +</style> | |
0 | 467 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/CheckOutTaskModal.vue
0 → 100644
1 | +<template> | |
2 | + <j-modal | |
3 | + :title="title" | |
4 | + :width="width" | |
5 | + :visible="visible" | |
6 | + :confirmLoading="confirmLoading" | |
7 | + switchFullscreen | |
8 | + @ok="handleOk" | |
9 | + @cancel="handleCancel" | |
10 | + cancelText="关闭"> | |
11 | + <a-spin :spinning="confirmLoading"> | |
12 | + <a-form-model ref="form" :model="model" :rules="validatorRules"> | |
13 | + <a-row> | |
14 | + <a-col :span="24"> | |
15 | + <a-form-model-item label="容器编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode"> | |
16 | + <a-input v-model="model.containerCode" placeholder="请输入容器编码" @keyup="getPortList"></a-input> | |
17 | + </a-form-model-item> | |
18 | + </a-col> | |
19 | + <a-col :span="24"> | |
20 | + <a-form-model-item label="出库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toPortCode"> | |
21 | + <a-select | |
22 | + show-search | |
23 | + placeholder="请选择出库口" | |
24 | + option-filter-prop="children" | |
25 | + :filter-option="filterOption" | |
26 | + v-model="model.toPortCode"> | |
27 | + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-model-item> | |
30 | + </a-col> | |
31 | + </a-row> | |
32 | + </a-form-model> | |
33 | + </a-spin> | |
34 | + </j-modal> | |
35 | +</template> | |
36 | + | |
37 | +<script> | |
38 | + | |
39 | + import { httpAction } from '@/api/manage' | |
40 | + import { validateDuplicateValue } from '@/utils/util' | |
41 | + import {createCheckOutTask} from '@/api/api' | |
42 | + import {selectPickPort} from '@/api/api' | |
43 | + | |
44 | + export default { | |
45 | + name: "CheckOutTaskModal", | |
46 | + components: { | |
47 | + }, | |
48 | + data () { | |
49 | + return { | |
50 | + title:"操作", | |
51 | + width:500, | |
52 | + portList:[], | |
53 | + querySource:{}, | |
54 | + visible: false, | |
55 | + model:{ | |
56 | + }, | |
57 | + labelCol: { | |
58 | + xs: { span: 24 }, | |
59 | + sm: { span: 5 }, | |
60 | + }, | |
61 | + wrapperCol: { | |
62 | + xs: { span: 24 }, | |
63 | + sm: { span: 16 }, | |
64 | + }, | |
65 | + | |
66 | + confirmLoading: false, | |
67 | + validatorRules: { | |
68 | + containerCode: [ | |
69 | + { required: true, message: '请输入容器编码!'}, | |
70 | + ], | |
71 | + toPortCode: [ | |
72 | + { required: true, message: '请选择出库口!'}, | |
73 | + ], | |
74 | + }, | |
75 | + url: { | |
76 | + add: "/task/taskHeader/createEmptyOut", | |
77 | + } | |
78 | + | |
79 | + } | |
80 | + }, | |
81 | + created () { | |
82 | + //备份model原始值 | |
83 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
84 | + }, | |
85 | + methods: { | |
86 | + add () { | |
87 | + this.edit(this.modelDefault); | |
88 | + }, | |
89 | + edit () { | |
90 | + // this.getPortList(); | |
91 | + // this.model = Object.assign({}, record); | |
92 | + this.visible = true; | |
93 | + }, | |
94 | + close () { | |
95 | + this.$emit('close'); | |
96 | + this.visible = false; | |
97 | + this.$refs.form.clearValidate(); | |
98 | + }, | |
99 | + getPortList() { | |
100 | + this.querySource.containerCode = this.model.containerCode; | |
101 | + selectPickPort(this.querySource).then((res) => { | |
102 | + if (res.success) { | |
103 | + this.portList = res.result; | |
104 | + this.visible = true; | |
105 | + } | |
106 | + }); | |
107 | + }, | |
108 | + handleOk () { | |
109 | + const that = this; | |
110 | + // 触发表单验证 | |
111 | + this.$refs.form.validate(valid => { | |
112 | + if (valid) { | |
113 | + that.confirmLoading = true; | |
114 | + createCheckOutTask(this.model).then((res)=>{ | |
115 | + if(res.success){ | |
116 | + that.$message.success(res.message); | |
117 | + that.$emit('ok'); | |
118 | + that.model.containerCode = ''; | |
119 | + that.model.toPortCode = ''; | |
120 | + }else{ | |
121 | + that.$message.warning(res.message); | |
122 | + } | |
123 | + }).finally(() => { | |
124 | + that.confirmLoading = false; | |
125 | + that.close(); | |
126 | + }) | |
127 | + }else{ | |
128 | + return false | |
129 | + } | |
130 | + }) | |
131 | + }, | |
132 | + handleCancel () { | |
133 | + this.close() | |
134 | + }, | |
135 | + | |
136 | + | |
137 | + } | |
138 | + } | |
139 | +</script> | |
0 | 140 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/EmptyInTaskModal.vue
0 → 100644
1 | +<template> | |
2 | + <j-modal | |
3 | + :title="title" | |
4 | + :width="width" | |
5 | + :visible="visible" | |
6 | + :confirmLoading="confirmLoading" | |
7 | + switchFullscreen | |
8 | + @ok="handleOk" | |
9 | + @cancel="handleCancel" | |
10 | + cancelText="关闭"> | |
11 | + <a-spin :spinning="confirmLoading"> | |
12 | + <a-form-model ref="form" :model="model" :rules="validatorRules"> | |
13 | + <a-row> | |
14 | + <a-col :span="24"> | |
15 | + <a-form-model-item label="容器号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode"> | |
16 | + <a-input v-model="model.containerCode" placeholder="请输入容器号" ></a-input> | |
17 | + </a-form-model-item> | |
18 | + </a-col> | |
19 | + <a-col :span="24"> | |
20 | + <a-form-model-item label="目标库位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toLocationCode"> | |
21 | + <a-input v-model="model.toLocationCode" placeholder="请输入目标库位" ></a-input> | |
22 | + </a-form-model-item> | |
23 | + </a-col> | |
24 | + </a-row> | |
25 | + </a-form-model> | |
26 | + </a-spin> | |
27 | + </j-modal> | |
28 | +</template> | |
29 | + | |
30 | +<script> | |
31 | + | |
32 | + import { httpAction } from '@/api/manage' | |
33 | + import { validateDuplicateValue } from '@/utils/util' | |
34 | + import {createEmptyIn} from '@/api/api' | |
35 | + | |
36 | + export default { | |
37 | + name: "EmptyInTaskModal", | |
38 | + components: { | |
39 | + }, | |
40 | + data () { | |
41 | + return { | |
42 | + title:"操作", | |
43 | + width:500, | |
44 | + visible: false, | |
45 | + model:{ | |
46 | + }, | |
47 | + labelCol: { | |
48 | + xs: { span: 24 }, | |
49 | + sm: { span: 5 }, | |
50 | + }, | |
51 | + wrapperCol: { | |
52 | + xs: { span: 24 }, | |
53 | + sm: { span: 16 }, | |
54 | + }, | |
55 | + | |
56 | + confirmLoading: false, | |
57 | + validatorRules: { | |
58 | + containerCode: [ | |
59 | + { required: true, message: '请输入容器编码!'}, | |
60 | + ], | |
61 | + }, | |
62 | + url: { | |
63 | + add: "/task/taskHeader/createEmptyIn", | |
64 | + } | |
65 | + | |
66 | + } | |
67 | + }, | |
68 | + created () { | |
69 | + //备份model原始值 | |
70 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
71 | + }, | |
72 | + methods: { | |
73 | + add () { | |
74 | + this.edit(this.modelDefault); | |
75 | + }, | |
76 | + edit () { | |
77 | + this.visible = true; | |
78 | + }, | |
79 | + close () { | |
80 | + this.$emit('close'); | |
81 | + this.visible = false; | |
82 | + this.$refs.form.clearValidate(); | |
83 | + }, | |
84 | + handleOk () { | |
85 | + const that = this; | |
86 | + // 触发表单验证 | |
87 | + this.$refs.form.validate(valid => { | |
88 | + if (valid) { | |
89 | + that.confirmLoading = true; | |
90 | + createEmptyIn(this.model).then((res)=>{ | |
91 | + if(res.success){ | |
92 | + that.$message.success(res.message); | |
93 | + that.$emit('ok'); | |
94 | + that.model.containerCode = ''; | |
95 | + that.model.toLocationCode = ''; | |
96 | + }else{ | |
97 | + that.$message.warning(res.message); | |
98 | + } | |
99 | + }).finally(() => { | |
100 | + that.confirmLoading = false; | |
101 | + that.close(); | |
102 | + }) | |
103 | + }else{ | |
104 | + return false | |
105 | + } | |
106 | + }) | |
107 | + }, | |
108 | + handleCancel () { | |
109 | + this.close() | |
110 | + }, | |
111 | + | |
112 | + | |
113 | + } | |
114 | + } | |
115 | +</script> | |
0 | 116 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/EmptyOutTaskModal.vue
0 → 100644
1 | +<template> | |
2 | + <j-modal | |
3 | + :title="title" | |
4 | + :width="width" | |
5 | + :visible="visible" | |
6 | + :confirmLoading="confirmLoading" | |
7 | + switchFullscreen | |
8 | + @ok="handleOk" | |
9 | + @cancel="handleCancel" | |
10 | + cancelText="关闭"> | |
11 | + <a-spin :spinning="confirmLoading"> | |
12 | + <a-form-model ref="form" :model="model" :rules="validatorRules"> | |
13 | + <a-row> | |
14 | + <a-col :span="24"> | |
15 | + <a-form-model-item label="容器编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode"> | |
16 | + <a-input v-model="model.containerCode" placeholder="请输入容器编码" @keyup="getPortList"></a-input> | |
17 | + </a-form-model-item> | |
18 | + </a-col> | |
19 | + <a-col :span="24"> | |
20 | + <a-form-model-item label="出库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toPortCode"> | |
21 | + <a-select | |
22 | + show-search | |
23 | + placeholder="请选择出库口" | |
24 | + option-filter-prop="children" | |
25 | + :filter-option="filterOption" | |
26 | + v-model="model.toPortCode"> | |
27 | + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-model-item> | |
30 | + </a-col> | |
31 | + </a-row> | |
32 | + </a-form-model> | |
33 | + </a-spin> | |
34 | + </j-modal> | |
35 | +</template> | |
36 | + | |
37 | +<script> | |
38 | + | |
39 | + import { httpAction } from '@/api/manage' | |
40 | + import { validateDuplicateValue } from '@/utils/util' | |
41 | + import {createEmptyOut} from '@/api/api' | |
42 | + import {selectOutPort} from '@/api/api' | |
43 | + | |
44 | + export default { | |
45 | + name: "EmptyOutTaskModal", | |
46 | + components: { | |
47 | + }, | |
48 | + data () { | |
49 | + return { | |
50 | + title:"操作", | |
51 | + width:500, | |
52 | + portList:[], | |
53 | + querySource:{}, | |
54 | + visible: false, | |
55 | + model:{ | |
56 | + }, | |
57 | + labelCol: { | |
58 | + xs: { span: 24 }, | |
59 | + sm: { span: 5 }, | |
60 | + }, | |
61 | + wrapperCol: { | |
62 | + xs: { span: 24 }, | |
63 | + sm: { span: 16 }, | |
64 | + }, | |
65 | + | |
66 | + confirmLoading: false, | |
67 | + validatorRules: { | |
68 | + containerCode: [ | |
69 | + { required: true, message: '请输入容器编码!'}, | |
70 | + ], | |
71 | + toPortCode: [ | |
72 | + { required: true, message: '请选择出库口!'}, | |
73 | + ], | |
74 | + }, | |
75 | + url: { | |
76 | + add: "/task/taskHeader/createEmptyOut", | |
77 | + } | |
78 | + | |
79 | + } | |
80 | + }, | |
81 | + created () { | |
82 | + //备份model原始值 | |
83 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
84 | + }, | |
85 | + methods: { | |
86 | + add () { | |
87 | + this.edit(this.modelDefault); | |
88 | + }, | |
89 | + edit () { | |
90 | + // this.getPortList(); | |
91 | + // this.model = Object.assign({}, record); | |
92 | + this.visible = true; | |
93 | + }, | |
94 | + close () { | |
95 | + this.$emit('close'); | |
96 | + this.visible = false; | |
97 | + this.$refs.form.clearValidate(); | |
98 | + }, | |
99 | + getPortList() { | |
100 | + this.querySource.containerCode = this.model.containerCode; | |
101 | + selectOutPort(this.querySource).then((res) => { | |
102 | + if (res.success) { | |
103 | + this.portList = res.result; | |
104 | + this.visible = true; | |
105 | + } | |
106 | + }); | |
107 | + }, | |
108 | + handleOk () { | |
109 | + const that = this; | |
110 | + // 触发表单验证 | |
111 | + this.$refs.form.validate(valid => { | |
112 | + if (valid) { | |
113 | + that.confirmLoading = true; | |
114 | + createEmptyOut(this.model).then((res)=>{ | |
115 | + if(res.success){ | |
116 | + that.$message.success(res.message); | |
117 | + that.$emit('ok'); | |
118 | + that.model.containerCode = ''; | |
119 | + that.model.toPortCode = ''; | |
120 | + }else{ | |
121 | + that.$message.warning(res.message); | |
122 | + } | |
123 | + }).finally(() => { | |
124 | + that.confirmLoading = false; | |
125 | + that.close(); | |
126 | + }) | |
127 | + }else{ | |
128 | + return false | |
129 | + } | |
130 | + }) | |
131 | + }, | |
132 | + handleCancel () { | |
133 | + this.close() | |
134 | + }, | |
135 | + | |
136 | + | |
137 | + } | |
138 | + } | |
139 | +</script> | |
0 | 140 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/ManyEmptyInTaskModal.vue
0 → 100644
1 | +<template> | |
2 | + <j-modal | |
3 | + :title="title" | |
4 | + :width="width" | |
5 | + :visible="visible" | |
6 | + :confirmLoading="confirmLoading" | |
7 | + switchFullscreen | |
8 | + @ok="handleOk" | |
9 | + @cancel="handleCancel" | |
10 | + cancelText="关闭"> | |
11 | + <a-spin :spinning="confirmLoading"> | |
12 | + <a-form-model ref="form" :model="model" :rules="validatorRules"> | |
13 | + <a-row> | |
14 | + <a-col :span="24"> | |
15 | + <a-form-model-item label="容器号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode"> | |
16 | + <a-input v-model="model.containerCode" placeholder="请输入容器号" ></a-input> | |
17 | + </a-form-model-item> | |
18 | + </a-col> | |
19 | + <a-col :span="24"> | |
20 | + <a-form-model-item label="目标库位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toLocationCode"> | |
21 | + <a-input v-model="model.toLocationCode" placeholder="请输入目标库位" ></a-input> | |
22 | + </a-form-model-item> | |
23 | + </a-col> | |
24 | + </a-row> | |
25 | + </a-form-model> | |
26 | + </a-spin> | |
27 | + </j-modal> | |
28 | +</template> | |
29 | + | |
30 | +<script> | |
31 | + | |
32 | + import { httpAction } from '@/api/manage' | |
33 | + import { validateDuplicateValue } from '@/utils/util' | |
34 | + import {createManyEmptyIn} from '@/api/api' | |
35 | + | |
36 | + export default { | |
37 | + name: "ManyEmptyInTaskModal", | |
38 | + components: { | |
39 | + }, | |
40 | + data () { | |
41 | + return { | |
42 | + title:"操作", | |
43 | + width:500, | |
44 | + visible: false, | |
45 | + model:{ | |
46 | + }, | |
47 | + labelCol: { | |
48 | + xs: { span: 24 }, | |
49 | + sm: { span: 5 }, | |
50 | + }, | |
51 | + wrapperCol: { | |
52 | + xs: { span: 24 }, | |
53 | + sm: { span: 16 }, | |
54 | + }, | |
55 | + | |
56 | + confirmLoading: false, | |
57 | + validatorRules: { | |
58 | + containerCode: [ | |
59 | + { required: true, message: '请输入容器编码!'}, | |
60 | + ], | |
61 | + }, | |
62 | + url: { | |
63 | + add: "/task/taskHeader/createManyEmptyIn", | |
64 | + } | |
65 | + | |
66 | + } | |
67 | + }, | |
68 | + created () { | |
69 | + //备份model原始值 | |
70 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
71 | + }, | |
72 | + methods: { | |
73 | + add () { | |
74 | + this.edit(this.modelDefault); | |
75 | + }, | |
76 | + edit () { | |
77 | + this.visible = true; | |
78 | + }, | |
79 | + close () { | |
80 | + this.$emit('close'); | |
81 | + this.visible = false; | |
82 | + this.$refs.form.clearValidate(); | |
83 | + }, | |
84 | + handleOk () { | |
85 | + const that = this; | |
86 | + // 触发表单验证 | |
87 | + this.$refs.form.validate(valid => { | |
88 | + if (valid) { | |
89 | + that.confirmLoading = true; | |
90 | + createManyEmptyIn(this.model).then((res)=>{ | |
91 | + if(res.success){ | |
92 | + that.$message.success(res.message); | |
93 | + that.$emit('ok'); | |
94 | + that.model.containerCode = ''; | |
95 | + that.model.toLocationCode = ''; | |
96 | + }else{ | |
97 | + that.$message.warning(res.message); | |
98 | + } | |
99 | + }).finally(() => { | |
100 | + that.confirmLoading = false; | |
101 | + that.close(); | |
102 | + }) | |
103 | + }else{ | |
104 | + return false | |
105 | + } | |
106 | + }) | |
107 | + }, | |
108 | + handleCancel () { | |
109 | + this.close() | |
110 | + }, | |
111 | + | |
112 | + | |
113 | + } | |
114 | + } | |
115 | +</script> | |
0 | 116 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/ManyEmptyOutTaskModal.vue
0 → 100644
1 | +<template> | |
2 | + <j-modal | |
3 | + :title="title" | |
4 | + :width="width" | |
5 | + :visible="visible" | |
6 | + :confirmLoading="confirmLoading" | |
7 | + switchFullscreen | |
8 | + @ok="handleOk" | |
9 | + @cancel="handleCancel" | |
10 | + cancelText="关闭"> | |
11 | + <a-spin :spinning="confirmLoading"> | |
12 | + <a-form-model ref="form" :model="model" :rules="validatorRules"> | |
13 | + <a-row> | |
14 | + <a-col :span="24"> | |
15 | + <a-form-model-item label="容器编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode"> | |
16 | + <a-input v-model="model.containerCode" placeholder="请输入容器编码" @keyup="getPortList"></a-input> | |
17 | + </a-form-model-item> | |
18 | + </a-col> | |
19 | + <a-col :span="24"> | |
20 | + <a-form-model-item label="出库口" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toPortCode"> | |
21 | + <a-select | |
22 | + show-search | |
23 | + placeholder="请选择出库口" | |
24 | + option-filter-prop="children" | |
25 | + :filter-option="filterOption" | |
26 | + v-model="model.toPortCode"> | |
27 | + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-model-item> | |
30 | + </a-col> | |
31 | + </a-row> | |
32 | + </a-form-model> | |
33 | + </a-spin> | |
34 | + </j-modal> | |
35 | +</template> | |
36 | + | |
37 | +<script> | |
38 | + | |
39 | + import { httpAction } from '@/api/manage' | |
40 | + import { validateDuplicateValue } from '@/utils/util' | |
41 | + import {createManyEmptyOut} from '@/api/api' | |
42 | + import {selectOutPort} from '@/api/api' | |
43 | + | |
44 | + export default { | |
45 | + name: "ManyEmptyOutTaskModal", | |
46 | + components: { | |
47 | + }, | |
48 | + data () { | |
49 | + return { | |
50 | + title:"操作", | |
51 | + width:500, | |
52 | + portList:[], | |
53 | + querySource:{}, | |
54 | + visible: false, | |
55 | + model:{ | |
56 | + }, | |
57 | + labelCol: { | |
58 | + xs: { span: 24 }, | |
59 | + sm: { span: 5 }, | |
60 | + }, | |
61 | + wrapperCol: { | |
62 | + xs: { span: 24 }, | |
63 | + sm: { span: 16 }, | |
64 | + }, | |
65 | + | |
66 | + confirmLoading: false, | |
67 | + validatorRules: { | |
68 | + containerCode: [ | |
69 | + { required: true, message: '请输入容器编码!'}, | |
70 | + ], | |
71 | + toPortCode: [ | |
72 | + { required: true, message: '请选择出库口!'}, | |
73 | + ], | |
74 | + }, | |
75 | + url: { | |
76 | + add: "/task/taskHeader/createManyEmptyOut", | |
77 | + } | |
78 | + | |
79 | + } | |
80 | + }, | |
81 | + created () { | |
82 | + //备份model原始值 | |
83 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
84 | + }, | |
85 | + methods: { | |
86 | + add () { | |
87 | + this.edit(this.modelDefault); | |
88 | + }, | |
89 | + edit () { | |
90 | + this.visible = true; | |
91 | + }, | |
92 | + close () { | |
93 | + this.$emit('close'); | |
94 | + this.visible = false; | |
95 | + this.$refs.form.clearValidate(); | |
96 | + }, | |
97 | + getPortList() { | |
98 | + this.querySource.containerCode = this.model.containerCode; | |
99 | + selectOutPort(this.querySource).then((res) => { | |
100 | + if (res.success) { | |
101 | + this.portList = res.result; | |
102 | + this.visible = true; | |
103 | + } | |
104 | + }); | |
105 | + }, | |
106 | + handleOk () { | |
107 | + const that = this; | |
108 | + // 触发表单验证 | |
109 | + this.$refs.form.validate(valid => { | |
110 | + if (valid) { | |
111 | + that.confirmLoading = true; | |
112 | + createManyEmptyOut(this.model).then((res)=>{ | |
113 | + if(res.success){ | |
114 | + that.$message.success(res.message); | |
115 | + that.$emit('ok'); | |
116 | + that.model.containerCode = ''; | |
117 | + that.model.toPortCode = ''; | |
118 | + }else{ | |
119 | + that.$message.warning(res.message); | |
120 | + } | |
121 | + }).finally(() => { | |
122 | + that.confirmLoading = false; | |
123 | + that.close(); | |
124 | + }) | |
125 | + }else{ | |
126 | + return false | |
127 | + } | |
128 | + }) | |
129 | + }, | |
130 | + handleCancel () { | |
131 | + this.close() | |
132 | + }, | |
133 | + | |
134 | + | |
135 | + } | |
136 | + } | |
137 | +</script> | |
0 | 138 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/OverStationTaskModal.vue
0 → 100644
1 | +<template> | |
2 | + <j-modal | |
3 | + :title="title" | |
4 | + :width="width" | |
5 | + :visible="visible" | |
6 | + :confirmLoading="confirmLoading" | |
7 | + switchFullscreen | |
8 | + @ok="handleOk" | |
9 | + @cancel="handleCancel" | |
10 | + cancelText="关闭"> | |
11 | + <a-spin :spinning="confirmLoading"> | |
12 | + <a-form-model ref="form" :model="model" :rules="validatorRules"> | |
13 | + <a-row> | |
14 | + <a-col :span="24"> | |
15 | + <a-form-model-item label="容器编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="containerCode"> | |
16 | + <a-input v-model="model.containerCode" placeholder="请输入容器编码" @keyup="getPortList"></a-input> | |
17 | + </a-form-model-item> | |
18 | + </a-col> | |
19 | + <a-col :span="24"> | |
20 | + <a-form-model-item label="起始站台" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fromPortCode"> | |
21 | + <a-select | |
22 | + show-search | |
23 | + placeholder="请选择起始站台" | |
24 | + option-filter-prop="children" | |
25 | + :filter-option="filterOption" | |
26 | + v-model="model.fromPortCode"> | |
27 | + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-model-item> | |
30 | + </a-col> | |
31 | + <a-col :span="24"> | |
32 | + <a-form-model-item label="目标站台" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toPortCode"> | |
33 | + <a-select | |
34 | + show-search | |
35 | + placeholder="请选择目标站台" | |
36 | + option-filter-prop="children" | |
37 | + :filter-option="filterOption" | |
38 | + v-model="model.toPortCode"> | |
39 | + <a-select-option v-for="item in portList" :key="item.name" :value="item.code">{{ item.name }}</a-select-option> | |
40 | + </a-select> | |
41 | + </a-form-model-item> | |
42 | + </a-col> | |
43 | + </a-row> | |
44 | + </a-form-model> | |
45 | + </a-spin> | |
46 | + </j-modal> | |
47 | +</template> | |
48 | + | |
49 | +<script> | |
50 | + | |
51 | + import { httpAction } from '@/api/manage' | |
52 | + import { validateDuplicateValue } from '@/utils/util' | |
53 | + import {createOverStationTask} from '@/api/api' | |
54 | + import {selectPort} from '@/api/api' | |
55 | + | |
56 | + export default { | |
57 | + name: "OverStationTaskModal", | |
58 | + components: { | |
59 | + }, | |
60 | + data () { | |
61 | + return { | |
62 | + title:"操作", | |
63 | + width:500, | |
64 | + portList:[], | |
65 | + querySource:{}, | |
66 | + visible: false, | |
67 | + model:{ | |
68 | + }, | |
69 | + labelCol: { | |
70 | + xs: { span: 24 }, | |
71 | + sm: { span: 5 }, | |
72 | + }, | |
73 | + wrapperCol: { | |
74 | + xs: { span: 24 }, | |
75 | + sm: { span: 16 }, | |
76 | + }, | |
77 | + | |
78 | + confirmLoading: false, | |
79 | + validatorRules: { | |
80 | + containerCode: [ | |
81 | + { required: true, message: '请输入容器编码!'}, | |
82 | + ], | |
83 | + fromPortCode: [ | |
84 | + { required: true, message: '请选择起始入口!'}, | |
85 | + ], | |
86 | + toPortCode: [ | |
87 | + { required: true, message: '请选择目标出口!'}, | |
88 | + ], | |
89 | + }, | |
90 | + url: { | |
91 | + add: "/task/taskHeader/createEmptyOut", | |
92 | + } | |
93 | + | |
94 | + } | |
95 | + }, | |
96 | + created () { | |
97 | + //备份model原始值 | |
98 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
99 | + }, | |
100 | + methods: { | |
101 | + add () { | |
102 | + this.edit(this.modelDefault); | |
103 | + }, | |
104 | + edit () { | |
105 | + // this.getPortList(); | |
106 | + // this.model = Object.assign({}, record); | |
107 | + this.visible = true; | |
108 | + }, | |
109 | + close () { | |
110 | + this.$emit('close'); | |
111 | + this.visible = false; | |
112 | + this.$refs.form.clearValidate(); | |
113 | + }, | |
114 | + getPortList() { | |
115 | + this.querySource.containerCode = this.model.containerCode; | |
116 | + selectPort(this.querySource).then((res) => { | |
117 | + if (res.success) { | |
118 | + this.portList = res.result; | |
119 | + this.visible = true; | |
120 | + } | |
121 | + }); | |
122 | + }, | |
123 | + handleOk () { | |
124 | + const that = this; | |
125 | + // 触发表单验证 | |
126 | + this.$refs.form.validate(valid => { | |
127 | + if (valid) { | |
128 | + that.confirmLoading = true; | |
129 | + createOverStationTask(this.model).then((res)=>{ | |
130 | + if(res.success){ | |
131 | + that.$message.success(res.message); | |
132 | + that.$emit('ok'); | |
133 | + that.model.containerCode = ''; | |
134 | + that.model.toPortCode = ''; | |
135 | + }else{ | |
136 | + that.$message.warning(res.message); | |
137 | + } | |
138 | + }).finally(() => { | |
139 | + that.confirmLoading = false; | |
140 | + that.close(); | |
141 | + }) | |
142 | + }else{ | |
143 | + return false | |
144 | + } | |
145 | + }) | |
146 | + }, | |
147 | + handleCancel () { | |
148 | + this.close() | |
149 | + }, | |
150 | + | |
151 | + | |
152 | + } | |
153 | + } | |
154 | +</script> | |
0 | 155 | \ No newline at end of file |
... | ... |
jeecg-boot-master/ant-design-vue-jeecg/src/views/system/task/modules/TransferTaskModal.vue
0 → 100644
1 | +<template> | |
2 | + <j-modal | |
3 | + :title="title" | |
4 | + :width="width" | |
5 | + :visible="visible" | |
6 | + :confirmLoading="confirmLoading" | |
7 | + switchFullscreen | |
8 | + @ok="handleOk" | |
9 | + @cancel="handleCancel" | |
10 | + cancelText="关闭"> | |
11 | + <a-spin :spinning="confirmLoading"> | |
12 | + <a-form-model ref="form" :model="model" :rules="validatorRules"> | |
13 | + <a-row> | |
14 | + <a-col :span="24"> | |
15 | + <a-form-model-item label="起始库位号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="fromLocationCode"> | |
16 | + <a-input v-model="model.fromLocationCode" placeholder="请输入起始库位号" ></a-input> | |
17 | + </a-form-model-item> | |
18 | + </a-col> | |
19 | + <a-col :span="24"> | |
20 | + <a-form-model-item label="目标库位号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="toLocationCode"> | |
21 | + <a-input v-model="model.toLocationCode" placeholder="请输入目标库位号" ></a-input> | |
22 | + </a-form-model-item> | |
23 | + </a-col> | |
24 | + </a-row> | |
25 | + </a-form-model> | |
26 | + </a-spin> | |
27 | + </j-modal> | |
28 | +</template> | |
29 | + | |
30 | +<script> | |
31 | + | |
32 | + import { httpAction } from '@/api/manage' | |
33 | + import { validateDuplicateValue } from '@/utils/util' | |
34 | + import {createTransferTask} from '@/api/api' | |
35 | + | |
36 | + export default { | |
37 | + name: "TransferTaskModal", | |
38 | + components: { | |
39 | + }, | |
40 | + data () { | |
41 | + return { | |
42 | + title:"操作", | |
43 | + width:500, | |
44 | + portList:[], | |
45 | + querySource:{}, | |
46 | + visible: false, | |
47 | + model:{ | |
48 | + }, | |
49 | + labelCol: { | |
50 | + xs: { span: 24 }, | |
51 | + sm: { span: 5 }, | |
52 | + }, | |
53 | + wrapperCol: { | |
54 | + xs: { span: 24 }, | |
55 | + sm: { span: 16 }, | |
56 | + }, | |
57 | + | |
58 | + confirmLoading: false, | |
59 | + validatorRules: { | |
60 | + fromLocationCode: [ | |
61 | + { required: true, message: '请输入起始库位号!'}, | |
62 | + ], | |
63 | + toLocationCode: [ | |
64 | + { required: true, message: '请输入目标库位号!'}, | |
65 | + ], | |
66 | + }, | |
67 | + url: { | |
68 | + add: "/task/taskHeader/createTransferTask", | |
69 | + } | |
70 | + | |
71 | + } | |
72 | + }, | |
73 | + created () { | |
74 | + //备份model原始值 | |
75 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
76 | + }, | |
77 | + methods: { | |
78 | + add () { | |
79 | + this.edit(this.modelDefault); | |
80 | + }, | |
81 | + edit () { | |
82 | + // this.getPortList(); | |
83 | + // this.model = Object.assign({}, record); | |
84 | + this.visible = true; | |
85 | + }, | |
86 | + close () { | |
87 | + this.$emit('close'); | |
88 | + this.visible = false; | |
89 | + this.$refs.form.clearValidate(); | |
90 | + }, | |
91 | + handleOk () { | |
92 | + const that = this; | |
93 | + // 触发表单验证 | |
94 | + this.$refs.form.validate(valid => { | |
95 | + if (valid) { | |
96 | + that.confirmLoading = true; | |
97 | + createTransferTask(this.model).then((res)=>{ | |
98 | + if(res.success){ | |
99 | + that.$message.success(res.message); | |
100 | + that.$emit('ok'); | |
101 | + that.model.fromLocationCode = ''; | |
102 | + that.model.toLocationCode = ''; | |
103 | + }else{ | |
104 | + that.$message.warning(res.message); | |
105 | + } | |
106 | + }).finally(() => { | |
107 | + that.confirmLoading = false; | |
108 | + that.close(); | |
109 | + }) | |
110 | + }else{ | |
111 | + return false | |
112 | + } | |
113 | + }) | |
114 | + }, | |
115 | + handleCancel () { | |
116 | + this.close() | |
117 | + }, | |
118 | + | |
119 | + | |
120 | + } | |
121 | + } | |
122 | +</script> | |
0 | 123 | \ No newline at end of file |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/wcs/controller/WcsController.java
... | ... | @@ -4,14 +4,20 @@ package org.jeecg.modules.wms.api.wcs.controller; |
4 | 4 | import io.swagger.annotations.ApiOperation; |
5 | 5 | import org.jeecg.common.api.vo.Result; |
6 | 6 | import org.jeecg.common.aspect.annotation.AutoLog; |
7 | +import org.jeecg.common.system.base.controller.JeecgController; | |
8 | +import org.jeecg.common.system.util.JwtUtil; | |
9 | +import org.jeecg.modules.wms.api.wcs.entity.ManyEmptyDomain; | |
7 | 10 | import org.jeecg.modules.wms.api.wcs.entity.WarecellDomain; |
8 | 11 | import org.jeecg.modules.wms.api.wcs.service.WcsService; |
9 | 12 | import org.jeecg.modules.wms.framework.aspectj.lang.annotation.ApiLogger; |
10 | 13 | import org.jeecg.modules.wms.framework.controller.BaseController; |
14 | +import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; | |
11 | 15 | import org.jeecg.utils.StringUtils; |
16 | +import org.springframework.transaction.annotation.Transactional; | |
12 | 17 | import org.springframework.web.bind.annotation.*; |
13 | 18 | |
14 | 19 | import javax.annotation.Resource; |
20 | +import javax.servlet.http.HttpServletRequest; | |
15 | 21 | |
16 | 22 | @RestController |
17 | 23 | @RequestMapping("/API/WMS/v2") |
... | ... | @@ -19,6 +25,8 @@ public class WcsController extends BaseController { |
19 | 25 | |
20 | 26 | @Resource |
21 | 27 | private WcsService wcsService; |
28 | + @Resource | |
29 | + private ITaskHeaderService taskHeaderService; | |
22 | 30 | |
23 | 31 | /* |
24 | 32 | WCS给的长,宽,高,重在有不同规格库位才有用,destination是区域, locationType库位类型 |
... | ... | @@ -28,17 +36,22 @@ public class WcsController extends BaseController { |
28 | 36 | @ApiOperation(value="wcs仓位分配", notes="wcs仓位分配", httpMethod = "POST") |
29 | 37 | @ResponseBody |
30 | 38 | @ApiLogger(apiName = "仓位分配", from="WCS") |
31 | - public Result warecellAllocation(@RequestBody WarecellDomain warecellDomain) { | |
39 | + public Result warecellAllocation(@RequestBody WarecellDomain warecellDomain, HttpServletRequest req) { | |
40 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
41 | + if (StringUtils.isEmpty(warehouseCode)) { | |
42 | + return Result.error("仓位分配, 仓库号为空"); | |
43 | + } | |
32 | 44 | if (StringUtils.isEmpty(warecellDomain.getTaskNo())) { |
33 | - return Result.error("任务号为空"); | |
45 | + return Result.error("仓位分配, 任务号为空"); | |
34 | 46 | } |
35 | 47 | if (StringUtils.isEmpty(warecellDomain.getZoneCode())) { |
36 | - return Result.error("目的区域为空"); | |
48 | + return Result.error("仓位分配, 目的区域为空"); | |
37 | 49 | } |
38 | 50 | if (StringUtils.isEmpty(warecellDomain.getHeight())) { |
39 | - return Result.error("高度为空"); | |
51 | + return Result.error("仓位分配, 高度为空"); | |
40 | 52 | } |
41 | - Result result = handleMultiProcess(new MultiProcessListener() { | |
53 | + warecellDomain.setWarehouseCode(warehouseCode); | |
54 | + Result result = handleMultiProcess("warecellAllocation", new JeecgController.MultiProcessListener() { | |
42 | 55 | @Override |
43 | 56 | public Result doProcess() { |
44 | 57 | Result result = wcsService.warecellAllocation(warecellDomain); |
... | ... | @@ -47,4 +60,53 @@ public class WcsController extends BaseController { |
47 | 60 | }); |
48 | 61 | return result; |
49 | 62 | } |
63 | + | |
64 | + /** | |
65 | + * WCS申请空托盘组入库 | |
66 | + * @return | |
67 | + */ | |
68 | + @AutoLog(value = "WCS申请空托盘组入库") | |
69 | + @PostMapping("/manyEmptyIn") | |
70 | + @ApiOperation(value="WCS申请空托盘组入库", notes="WCS申请空托盘组入库", httpMethod = "POST") | |
71 | + @ResponseBody | |
72 | + @ApiLogger(apiName = "manyEmptyIn", from="WCS") | |
73 | + public Result manyEmptyIn(@RequestBody ManyEmptyDomain manyEmptyDomain, HttpServletRequest req) { | |
74 | + String containerCode = manyEmptyDomain.getContainerCode(); | |
75 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
76 | + String zoneCode = manyEmptyDomain.getZoneCode(); | |
77 | + String height = manyEmptyDomain.getHeight(); | |
78 | + String roadWay = manyEmptyDomain.getRoadWay(); | |
79 | + | |
80 | + Result result = handleMultiProcess("manyEmptyIn", new JeecgController.MultiProcessListener() { | |
81 | + @Override | |
82 | + public Result doProcess() { | |
83 | + Result result = taskHeaderService.createManyEmptyInTask(containerCode, zoneCode, roadWay, height, warehouseCode); | |
84 | + return result; | |
85 | + } | |
86 | + }); | |
87 | + return result; | |
88 | + } | |
89 | + | |
90 | + /** | |
91 | + * WCS申请空托盘组出库 | |
92 | + * @return | |
93 | + */ | |
94 | + @AutoLog(value = "WCS申请空托盘组出库") | |
95 | + @PostMapping("/manyEmptyOut") | |
96 | + @ApiOperation(value="WCS申请空托盘组出库", notes="WCS申请空托盘组出库", httpMethod = "POST") | |
97 | + @ResponseBody | |
98 | + @ApiLogger(apiName = "manyEmptyOut", from="WCS") | |
99 | + public Result manyEmptyOut(@RequestBody ManyEmptyDomain manyEmptyDomain, HttpServletRequest req) { | |
100 | + String containerCode = manyEmptyDomain.getContainerCode(); | |
101 | + String toPortCode = manyEmptyDomain.getPort(); | |
102 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
103 | + Result result = handleMultiProcess("manyEmptyOut", new JeecgController.MultiProcessListener() { | |
104 | + @Override | |
105 | + public Result doProcess() { | |
106 | + Result result = taskHeaderService.createManyEmptyOutTask(containerCode, toPortCode, warehouseCode); | |
107 | + return result; | |
108 | + } | |
109 | + }); | |
110 | + return result; | |
111 | + } | |
50 | 112 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/wcs/entity/ManyEmptyDomain.java
0 → 100644
1 | +package org.jeecg.modules.wms.api.wcs.entity; | |
2 | + | |
3 | +import lombok.Data; | |
4 | + | |
5 | +@Data | |
6 | +public class ManyEmptyDomain { | |
7 | + | |
8 | + private String containerCode; | |
9 | + private String length; | |
10 | + private String width; | |
11 | + private String height; | |
12 | + private String weight; | |
13 | + //可用巷道 | |
14 | + private String roadWay; | |
15 | + private String zoneCode; | |
16 | + private String port; | |
17 | + | |
18 | +} | |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java
... | ... | @@ -270,7 +270,7 @@ public class WcsServiceImpl implements WcsService { |
270 | 270 | case QuantityConstant.TASK_TYPE_EMPTYSHIPMENT: |
271 | 271 | case QuantityConstant.TASK_TYPE_CYCLECOUNT: |
272 | 272 | case QuantityConstant.TASK_TYPE_TRANSFER: |
273 | - case QuantityConstant.TASK_TYPE_VIEW: | |
273 | + case QuantityConstant.TASK_TYPE_CHECK_OUT: | |
274 | 274 | case QuantityConstant.TASK_TYPE_MANY_EMPTYSHIPMENT: |
275 | 275 | if(fromLocation == null) { |
276 | 276 | return Result.error("起始库位为空"); |
... | ... | @@ -280,9 +280,6 @@ public class WcsServiceImpl implements WcsService { |
280 | 280 | case QuantityConstant.TASK_TYPE_WHOLERECEIPT: |
281 | 281 | case QuantityConstant.TASK_TYPE_EMPTYRECEIPT: |
282 | 282 | case QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT: |
283 | - if(toLocation == null) { | |
284 | - return Result.error("终点库位为空"); | |
285 | - } | |
286 | 283 | direction = true; |
287 | 284 | break; |
288 | 285 | default: |
... | ... | @@ -347,8 +344,8 @@ public class WcsServiceImpl implements WcsService { |
347 | 344 | wcsTask.setTaskNo(taskHeader.getId().toString()); |
348 | 345 | wcsTask.setWarehouseCode(warehouseCode); |
349 | 346 | wcsTask.setTaskType(taskType); |
350 | - wcsTask.setFromPort(taskHeader.getFromPort()); | |
351 | - wcsTask.setToPort(taskHeader.getToPort()); | |
347 | + wcsTask.setFromPort(taskHeader.getFromPortCode()); | |
348 | + wcsTask.setToPort(taskHeader.getToPortCode()); | |
352 | 349 | wcsTask.setContainerCode(taskHeader.getContainerCode()); |
353 | 350 | if (preTaskNo != 0) { |
354 | 351 | wcsTask.setPreTaskNo(String.valueOf(preTaskNo)); |
... | ... | @@ -418,7 +415,7 @@ public class WcsServiceImpl implements WcsService { |
418 | 415 | case QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT: |
419 | 416 | case QuantityConstant.TASK_TYPE_SORTINGSHIPMENT: |
420 | 417 | case QuantityConstant.TASK_TYPE_CYCLECOUNT: |
421 | - case QuantityConstant.TASK_TYPE_VIEW: | |
418 | + case QuantityConstant.TASK_TYPE_CHECK_OUT: | |
422 | 419 | wcsTask.setTaskType(400); |
423 | 420 | break; |
424 | 421 | case QuantityConstant.TASK_TYPE_TRANSFER: |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/entity/Container.java
... | ... | @@ -5,6 +5,7 @@ import java.io.UnsupportedEncodingException; |
5 | 5 | import java.util.Date; |
6 | 6 | import java.math.BigDecimal; |
7 | 7 | import com.baomidou.mybatisplus.annotation.IdType; |
8 | +import com.baomidou.mybatisplus.annotation.TableField; | |
8 | 9 | import com.baomidou.mybatisplus.annotation.TableId; |
9 | 10 | import com.baomidou.mybatisplus.annotation.TableName; |
10 | 11 | import lombok.Data; |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/IContainerService.java
... | ... | @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService; |
4 | 4 | import org.jeecg.common.api.vo.Result; |
5 | 5 | import org.jeecg.modules.wms.config.container.entity.Container; |
6 | 6 | |
7 | +import java.util.List; | |
8 | + | |
7 | 9 | /** |
8 | 10 | * @Description: 容器管理 |
9 | 11 | * @Author: jeecg-boot |
... | ... | @@ -22,4 +24,6 @@ public interface IContainerService extends IService<Container> { |
22 | 24 | String status, String warehouseCode); |
23 | 25 | //创建零时容器 |
24 | 26 | Container createLSContainer(String warehouseCode); |
27 | + | |
28 | + List<Container> getContainerListByStatus(String status, String warehouseCode); | |
25 | 29 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/container/service/impl/ContainerServiceImpl.java
... | ... | @@ -103,6 +103,15 @@ public class ContainerServiceImpl extends ServiceImpl<ContainerMapper, Container |
103 | 103 | return container; |
104 | 104 | } |
105 | 105 | |
106 | + @Override | |
107 | + public List<Container> getContainerListByStatus(String status, String warehouseCode) { | |
108 | + LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
109 | + containerLambdaQueryWrapper.eq(Container::getStatus, status) | |
110 | + .eq(Container::getWarehouseCode, warehouseCode); | |
111 | + List<Container> containerList = list(containerLambdaQueryWrapper); | |
112 | + return containerList; | |
113 | + } | |
114 | + | |
106 | 115 | |
107 | 116 | private int getStartNumber(String containerTypeCode, String warehouseCode) { |
108 | 117 | LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/locationHigh/service/ILocationHighService.java
... | ... | @@ -3,6 +3,8 @@ package org.jeecg.modules.wms.config.locationHigh.service; |
3 | 3 | import com.baomidou.mybatisplus.extension.service.IService; |
4 | 4 | import org.jeecg.modules.wms.config.locationHigh.entity.LocationHigh; |
5 | 5 | |
6 | +import java.util.List; | |
7 | + | |
6 | 8 | /** |
7 | 9 | * @Description: 库位高度管理 |
8 | 10 | * @Author: jeecg-boot |
... | ... | @@ -11,4 +13,6 @@ import org.jeecg.modules.wms.config.locationHigh.entity.LocationHigh; |
11 | 13 | */ |
12 | 14 | public interface ILocationHighService extends IService<LocationHigh> { |
13 | 15 | |
16 | + LocationHigh getLocationHighByHighLevel(int highHeight, | |
17 | + List<String> locationTypeCodeList, String warehouseCode); | |
14 | 18 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/locationHigh/service/impl/LocationHighServiceImpl.java
1 | 1 | package org.jeecg.modules.wms.config.locationHigh.service.impl; |
2 | 2 | |
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
4 | +import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |
3 | 5 | import org.jeecg.modules.wms.config.locationHigh.entity.LocationHigh; |
4 | 6 | import org.jeecg.modules.wms.config.locationHigh.mapper.LocationHighMapper; |
5 | 7 | import org.jeecg.modules.wms.config.locationHigh.service.ILocationHighService; |
... | ... | @@ -7,6 +9,8 @@ import org.springframework.stereotype.Service; |
7 | 9 | |
8 | 10 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
9 | 11 | |
12 | +import java.util.List; | |
13 | + | |
10 | 14 | /** |
11 | 15 | * @Description: 库位高度管理 |
12 | 16 | * @Author: jeecg-boot |
... | ... | @@ -16,4 +20,14 @@ import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
16 | 20 | @Service |
17 | 21 | public class LocationHighServiceImpl extends ServiceImpl<LocationHighMapper, LocationHigh> implements ILocationHighService { |
18 | 22 | |
23 | + @Override | |
24 | + public LocationHigh getLocationHighByHighLevel(int highHeight, | |
25 | + List<String> locationTypeCodeList, String warehouseCode) { | |
26 | + LambdaQueryWrapper<LocationHigh> locationHighLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
27 | + locationHighLambdaQueryWrapper.eq(LocationHigh::getHighLevel, highHeight) | |
28 | + .eq(LocationHigh::getWarehouseCode, warehouseCode) | |
29 | + .in(LocationHigh::getLocationTypeCode, locationTypeCodeList); | |
30 | + LocationHigh locationHigh = getOne(locationHighLambdaQueryWrapper); | |
31 | + return locationHigh; | |
32 | + } | |
19 | 33 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/locationType/service/ILocationTypeService.java
... | ... | @@ -4,6 +4,8 @@ import com.baomidou.mybatisplus.extension.service.IService; |
4 | 4 | import org.jeecg.modules.wms.config.locationType.entity.LocationType; |
5 | 5 | import org.jeecg.modules.wms.config.zone.entity.Zone; |
6 | 6 | |
7 | +import java.util.List; | |
8 | + | |
7 | 9 | /** |
8 | 10 | * @Description: 库位类型 |
9 | 11 | * @Author: jeecg-boot |
... | ... | @@ -13,4 +15,6 @@ import org.jeecg.modules.wms.config.zone.entity.Zone; |
13 | 15 | public interface ILocationTypeService extends IService<LocationType> { |
14 | 16 | |
15 | 17 | LocationType getLocationTypeByCode(String locationTypeCode, String wareohuseCode); |
18 | + | |
19 | + List<LocationType> getLocationTypeListByZoneCode(String zoneCode, String warehouseCode); | |
16 | 20 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/locationType/service/impl/LocationTypeServiceImpl.java
... | ... | @@ -9,6 +9,8 @@ import org.springframework.stereotype.Service; |
9 | 9 | |
10 | 10 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
11 | 11 | |
12 | +import java.util.List; | |
13 | + | |
12 | 14 | /** |
13 | 15 | * @Description: 库位类型 |
14 | 16 | * @Author: jeecg-boot |
... | ... | @@ -26,4 +28,13 @@ public class LocationTypeServiceImpl extends ServiceImpl<LocationTypeMapper, Loc |
26 | 28 | LocationType locationType = getOne(locationTypeMapperLambdaQueryWrapper); |
27 | 29 | return locationType; |
28 | 30 | } |
31 | + | |
32 | + @Override | |
33 | + public List<LocationType> getLocationTypeListByZoneCode(String zoneCode, String warehouseCode) { | |
34 | + LambdaQueryWrapper<LocationType> locationTypeLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
35 | + locationTypeLambdaQueryWrapper.eq(LocationType::getZoneCode, zoneCode) | |
36 | + .eq(LocationType::getWarehouseCode, warehouseCode); | |
37 | + List<LocationType> locationTypeList = list(locationTypeLambdaQueryWrapper); | |
38 | + return locationTypeList; | |
39 | + } | |
29 | 40 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/port/service/IPortService.java
... | ... | @@ -15,4 +15,8 @@ import java.util.List; |
15 | 15 | public interface IPortService extends IService<Port> { |
16 | 16 | |
17 | 17 | List<Port> getPortListByType(int type, String zoneCode, String warehouseCode); |
18 | + | |
19 | + Port getPortByCode(String code, String zoneCode, String warehouseCode); | |
20 | + | |
21 | + Port getPortByCode(String code, String warehouseCode); | |
18 | 22 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/config/port/service/impl/PortServiceImpl.java
... | ... | @@ -31,4 +31,23 @@ public class PortServiceImpl extends ServiceImpl<PortMapper, Port> implements IP |
31 | 31 | List<Port> portList = list(portLambdaQueryWrapper); |
32 | 32 | return portList; |
33 | 33 | } |
34 | + | |
35 | + @Override | |
36 | + public Port getPortByCode(String code, String zoneCode, String warehouseCode) { | |
37 | + LambdaQueryWrapper<Port> portLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
38 | + portLambdaQueryWrapper.eq(Port::getCode, code) | |
39 | + .eq(Port::getZoneCode, zoneCode) | |
40 | + .eq(Port::getWarehouseCode, warehouseCode); | |
41 | + Port port = getOne(portLambdaQueryWrapper); | |
42 | + return port; | |
43 | + } | |
44 | + | |
45 | + @Override | |
46 | + public Port getPortByCode(String code, String warehouseCode) { | |
47 | + LambdaQueryWrapper<Port> portLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
48 | + portLambdaQueryWrapper.eq(Port::getCode, code) | |
49 | + .eq(Port::getWarehouseCode, warehouseCode); | |
50 | + Port port = getOne(portLambdaQueryWrapper); | |
51 | + return port; | |
52 | + } | |
34 | 53 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/framework/controller/BaseController.java
1 | 1 | package org.jeecg.modules.wms.framework.controller; |
2 | 2 | |
3 | +import org.apache.commons.collections.MapUtils; | |
3 | 4 | import org.jeecg.common.api.vo.Result; |
5 | +import org.jeecg.common.system.base.controller.JeecgController; | |
4 | 6 | |
7 | +import java.util.HashMap; | |
8 | +import java.util.Map; | |
5 | 9 | import java.util.concurrent.Semaphore; |
6 | 10 | |
7 | 11 | /** |
... | ... | @@ -9,28 +13,51 @@ import java.util.concurrent.Semaphore; |
9 | 13 | */ |
10 | 14 | public class BaseController { |
11 | 15 | |
16 | + //下发任务并发控制 | |
17 | + Map<String, Boolean> runningTaskMap = new HashMap<>(); | |
18 | + | |
19 | + //并发控制,一次只允许一个请求 | |
20 | + public Result handleQuest(String taskKey, JeecgController.MultiProcessListener multiProcessListener) { | |
21 | + Result result = null; | |
22 | + if(MapUtils.getBoolean(runningTaskMap, taskKey, false)) { | |
23 | + return Result.error("重复请求,清稍后重试"); | |
24 | + } | |
25 | + runningTaskMap.put(taskKey, true); | |
26 | + try { | |
27 | + result = multiProcessListener.doProcess(); | |
28 | + } catch (Exception e) { | |
29 | + e.printStackTrace(); | |
30 | + throw new RuntimeException(e); | |
31 | + } finally { | |
32 | + runningTaskMap.put(taskKey, false); | |
33 | + } | |
34 | + return result; | |
35 | + } | |
36 | + | |
12 | 37 | Semaphore semaphore=new Semaphore(1); |
38 | + //下发任务并发控制 | |
39 | + Map<String, Boolean> multiProcessMap = new HashMap<>(); | |
13 | 40 | |
14 | - public Result handleMultiProcess(MultiProcessListener multiProcessListener) { | |
41 | + public Result handleMultiProcess(String taskKey, JeecgController.MultiProcessListener multiProcessListener) { | |
15 | 42 | Result result = null; |
16 | 43 | int max_time = 30 * 1000; |
17 | 44 | int now = 0; |
18 | 45 | boolean avail = true; |
19 | 46 | while(avail) { |
20 | - int availablePermits = semaphore.availablePermits(); | |
21 | - if(availablePermits >0) { | |
47 | + boolean availablePermits = MapUtils.getBoolean(multiProcessMap, taskKey, false); | |
48 | + if(!availablePermits) { | |
22 | 49 | avail = false; |
23 | 50 | try { |
24 | - semaphore.acquire(1); | |
51 | + multiProcessMap.put(taskKey, true); | |
25 | 52 | result = multiProcessListener.doProcess(); |
26 | 53 | } catch (Exception e) { |
27 | 54 | e.printStackTrace(); |
28 | - result = Result.error(e.getMessage()); | |
55 | + throw new RuntimeException(e); | |
29 | 56 | } finally { |
30 | - semaphore.release(1); | |
57 | + multiProcessMap.put(taskKey, false); | |
31 | 58 | } |
32 | 59 | } else { |
33 | - result = Result.error("多线程处理异常"); | |
60 | + result = Result.error("多线程处理异常, 待处理现场太多,等待时间超出30秒"); | |
34 | 61 | try { |
35 | 62 | now = now + 200; |
36 | 63 | Thread.sleep(200); |
... | ... | @@ -45,7 +72,4 @@ public class BaseController { |
45 | 72 | return result; |
46 | 73 | } |
47 | 74 | |
48 | - public interface MultiProcessListener { | |
49 | - Result doProcess(); | |
50 | - } | |
51 | 75 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/inventory/inventoryTransaction/entity/InventoryTransaction.java
... | ... | @@ -47,10 +47,14 @@ public class InventoryTransaction implements Serializable { |
47 | 47 | @Excel(name = "容器编码", width = 15) |
48 | 48 | @ApiModelProperty(value = "容器编码") |
49 | 49 | private String containerCode; |
50 | - /**库位编码*/ | |
51 | - @Excel(name = "库位编码", width = 15) | |
52 | - @ApiModelProperty(value = "库位编码") | |
53 | - private String locationCode; | |
50 | + /**起始库位编码*/ | |
51 | + @Excel(name = "起始库位编码", width = 15) | |
52 | + @ApiModelProperty(value = "起始库位编码") | |
53 | + private String fromLocationCode; | |
54 | + /**目标库位编码*/ | |
55 | + @Excel(name = "目标库位编码", width = 15) | |
56 | + @ApiModelProperty(value = "目标库位编码") | |
57 | + private String toLocationCode; | |
54 | 58 | /**交易类型*/ |
55 | 59 | @Excel(name = "交易类型", width = 15, dicCode = "inventory_transaction_type") |
56 | 60 | @Dict(dicCode = "inventory_transaction_type") |
... | ... | @@ -99,6 +103,7 @@ public class InventoryTransaction implements Serializable { |
99 | 103 | /**库存状态*/ |
100 | 104 | @Excel(name = "库存状态", width = 15) |
101 | 105 | @ApiModelProperty(value = "库存状态") |
106 | + @Dict(dicCode = "inventory_status") | |
102 | 107 | private String inventoryStatus; |
103 | 108 | /**数量*/ |
104 | 109 | @Excel(name = "数量", width = 15) |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/IReceiptContainerHeaderService.java
... | ... | @@ -37,5 +37,17 @@ public interface IReceiptContainerHeaderService extends IService<ReceiptContaine |
37 | 37 | // 获取没有完成的入库组盘 |
38 | 38 | List<ReceiptContainerHeader> getUnCompleteCombineList(); |
39 | 39 | |
40 | - boolean havaUnCompleteCombine(String containerCode, String warehouseCode); | |
40 | + boolean havaUnCompleteCombineByContainerCode(String containerCode, String warehouseCode); | |
41 | + | |
42 | + boolean havaUnCompleteCombineByLocationCode(String locationCode, String warehouseCode); | |
43 | + | |
44 | + boolean havaUnCompleteCombineByFromLocationCode(String fromLocationCode, String warehouseCode); | |
45 | + | |
46 | + boolean havaUnCompleteCombineByToLocationCode(String toLocationCode, String warehouseCode); | |
47 | + | |
48 | + /** | |
49 | + * 取消入库任务 | |
50 | + * @return | |
51 | + */ | |
52 | + boolean cancelReceiptTask(Integer receiptContainerHeaderId); | |
41 | 53 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
... | ... | @@ -92,15 +92,10 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
92 | 92 | } |
93 | 93 | |
94 | 94 | @Override |
95 | - @Transactional | |
95 | + @Transactional(rollbackFor = ServiceException.class) | |
96 | 96 | public Result createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) { |
97 | - int id = receiptContainerHeader.getId(); | |
98 | - receiptContainerHeader = this.getById(id); | |
99 | - if (receiptContainerHeader == null) { | |
100 | - return Result.error("id:" + id + "的入库组盘不存在!"); | |
101 | - } | |
102 | 97 | if (!receiptContainerHeader.getWarehouseCode().equals(warehouseCode)) { |
103 | - return Result.error("id:" + id + "的入库组盘不能在" + warehouseCode + "仓库操作"); | |
98 | + return Result.error("id:" + receiptContainerHeader.getId() + "的入库组盘不能在" + warehouseCode + "仓库操作"); | |
104 | 99 | } |
105 | 100 | String containerCode = receiptContainerHeader.getContainerCode(); |
106 | 101 | Container container = containerService.getContainerByCode(containerCode, warehouseCode); |
... | ... | @@ -110,27 +105,27 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
110 | 105 | List<ReceiptContainerDetail> receiptContainerDetailList = |
111 | 106 | receiptContainerDetailService.getReceiptContainerDetailListByHeaderId(receiptContainerHeader.getId()); |
112 | 107 | if(receiptContainerDetailList.size() == 0) { |
113 | - return Result.error("id:" + id + "的入库组盘,没有组盘明细,请先组盘!"); | |
108 | + return Result.error("id:" + receiptContainerHeader.getId() + "的入库组盘,没有组盘明细,请先组盘!"); | |
114 | 109 | } |
115 | - boolean result = containerService.updateStatus(containerCode, | |
110 | + boolean success = containerService.updateStatus(containerCode, | |
116 | 111 | QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); |
117 | - if(!result) { | |
112 | + if(!success) { | |
118 | 113 | throw new ServiceException("更新容器状态失败"); |
119 | 114 | } |
120 | 115 | String fromLocationCode = receiptContainerHeader.getFromLocationCode(); |
121 | 116 | String toLocaitonCode = receiptContainerHeader.getToLocationCode(); |
122 | 117 | if(StringUtils.isNotEmpty(fromLocationCode)) { |
123 | - result = locationService.updateStatus(fromLocationCode, | |
118 | + success = locationService.updateStatus(fromLocationCode, | |
124 | 119 | QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); |
125 | - if(!result) { | |
120 | + if(!success) { | |
126 | 121 | throw new ServiceException("更新起始库位状态失败"); |
127 | 122 | } |
128 | 123 | } |
129 | 124 | String zoneCode = null; |
130 | 125 | if(StringUtils.isNotEmpty(toLocaitonCode)) { |
131 | - result = locationService.updateStatus(toLocaitonCode, | |
126 | + success = locationService.updateStatus(toLocaitonCode, | |
132 | 127 | QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); |
133 | - if(!result) { | |
128 | + if(!success) { | |
134 | 129 | throw new ServiceException("更新目标库位状态失败"); |
135 | 130 | } |
136 | 131 | Location toLocation = locationService.getLocationByCode(toLocaitonCode, warehouseCode); |
... | ... | @@ -148,8 +143,8 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
148 | 143 | throw new ServiceException("入库组盘状态不是创建状态"); |
149 | 144 | } |
150 | 145 | receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK); |
151 | - result = receiptContainerHeaderService.updateById(receiptContainerHeader); | |
152 | - if(!result) { | |
146 | + success = receiptContainerHeaderService.updateById(receiptContainerHeader); | |
147 | + if(!success) { | |
153 | 148 | throw new ServiceException("更新入库组盘头状态失败"); |
154 | 149 | } |
155 | 150 | TaskHeader taskHeader = new TaskHeader(); |
... | ... | @@ -163,9 +158,9 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
163 | 158 | taskHeader.setReceiptContainerHeaderId(receiptContainerHeader.getId()); |
164 | 159 | taskHeader.setWarehouseCode(warehouseCode); |
165 | 160 | taskHeader.setZoneCode(zoneCode); |
166 | - taskHeader.setToPort(receiptContainerHeader.getToPort()); | |
167 | - result = taskHeaderService.save(taskHeader); | |
168 | - if(!result) { | |
161 | + taskHeader.setToPortCode(receiptContainerHeader.getToPort()); | |
162 | + success = taskHeaderService.save(taskHeader); | |
163 | + if(!success) { | |
169 | 164 | throw new ServiceException("任务生成失败"); |
170 | 165 | } |
171 | 166 | List<TaskDetail> taskDetailList = new ArrayList<>(); |
... | ... | @@ -196,24 +191,24 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
196 | 191 | receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_WAIT_SHELF); |
197 | 192 | receiptDetailList.add(receiptDetail); |
198 | 193 | } |
199 | - result = taskDetailService.saveBatch(taskDetailList); | |
200 | - if(!result) { | |
194 | + success = taskDetailService.saveBatch(taskDetailList); | |
195 | + if(!success) { | |
201 | 196 | throw new ServiceException("任务详情生成失败"); |
202 | 197 | } |
203 | 198 | receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_TASK); |
204 | - result = this.updateById(receiptContainerHeader); | |
205 | - if(!result) { | |
199 | + success = this.updateById(receiptContainerHeader); | |
200 | + if(!success) { | |
206 | 201 | throw new ServiceException("生成任务时,更新入库组盘头失败"); |
207 | 202 | } |
208 | - result = receiptDetailService.updateBatchById(receiptDetailList); | |
209 | - if(!result) { | |
203 | + success = receiptDetailService.updateBatchById(receiptDetailList); | |
204 | + if(!success) { | |
210 | 205 | throw new ServiceException("更新入库单明细失败"); |
211 | 206 | } |
212 | 207 | List<Integer> receiptIdList =receiptDetailList.stream() |
213 | 208 | .map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList()); |
214 | 209 | for(Integer receiptId : receiptIdList) { |
215 | - result = receiptHeaderService.updateReceiptHeaderStatus(receiptId); | |
216 | - if (!result) { | |
210 | + success = receiptHeaderService.updateReceiptHeaderStatus(receiptId); | |
211 | + if (!success) { | |
217 | 212 | throw new ServiceException("更新入库单明细失败"); |
218 | 213 | } |
219 | 214 | } |
... | ... | @@ -241,7 +236,7 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
241 | 236 | } |
242 | 237 | |
243 | 238 | @Override |
244 | - public boolean havaUnCompleteCombine(String containerCode, String warehouseCode) { | |
239 | + public boolean havaUnCompleteCombineByContainerCode(String containerCode, String warehouseCode) { | |
245 | 240 | LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); |
246 | 241 | receiptContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getContainerCode, containerCode) |
247 | 242 | .eq(ReceiptContainerHeader::getWarehouseCode, warehouseCode) |
... | ... | @@ -253,4 +248,87 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
253 | 248 | return false; |
254 | 249 | } |
255 | 250 | |
251 | + @Override | |
252 | + public boolean havaUnCompleteCombineByLocationCode(String locationCode, String warehouseCode) { | |
253 | + boolean success = havaUnCompleteCombineByFromLocationCode(locationCode, warehouseCode); | |
254 | + if(!success) { | |
255 | + success = havaUnCompleteCombineByToLocationCode(locationCode, warehouseCode); | |
256 | + } | |
257 | + return success; | |
258 | + } | |
259 | + | |
260 | + @Override | |
261 | + public boolean havaUnCompleteCombineByFromLocationCode(String fromLocationCode, String warehouseCode) { | |
262 | + LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
263 | + receiptContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getFromLocationCode, fromLocationCode) | |
264 | + .eq(ReceiptContainerHeader::getWarehouseCode, warehouseCode) | |
265 | + .lt(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_FINISHED); | |
266 | + ReceiptContainerHeader receiptContainerHeader = getOne(receiptContainerHeaderLambdaQueryWrapper); | |
267 | + if(receiptContainerHeader != null) { | |
268 | + return true; | |
269 | + } | |
270 | + return false; | |
271 | + } | |
272 | + | |
273 | + @Override | |
274 | + public boolean havaUnCompleteCombineByToLocationCode(String toLocationCode, String warehouseCode) { | |
275 | + LambdaQueryWrapper<ReceiptContainerHeader> receiptContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
276 | + receiptContainerHeaderLambdaQueryWrapper.eq(ReceiptContainerHeader::getToLocationCode, toLocationCode) | |
277 | + .eq(ReceiptContainerHeader::getWarehouseCode, warehouseCode) | |
278 | + .lt(ReceiptContainerHeader::getStatus, QuantityConstant.RECEIPT_CONTAINER_FINISHED); | |
279 | + ReceiptContainerHeader receiptContainerHeader = getOne(receiptContainerHeaderLambdaQueryWrapper); | |
280 | + if(receiptContainerHeader != null) { | |
281 | + return true; | |
282 | + } | |
283 | + return false; | |
284 | + } | |
285 | + | |
286 | + | |
287 | + @Override | |
288 | + @Transactional(rollbackFor = ServiceException.class) | |
289 | + public boolean cancelReceiptTask(Integer receiptContainerHeaderId) { | |
290 | + ReceiptContainerHeader receiptContainerHeader = getById(receiptContainerHeaderId); | |
291 | + if(receiptContainerHeader == null) { | |
292 | + return false; | |
293 | + } | |
294 | + int receiptContainerStatus = receiptContainerHeader.getStatus(); | |
295 | + if(receiptContainerStatus == QuantityConstant.RECEIPT_CONTAINER_TASK) { | |
296 | + throw new ServiceException("取消入库任务时, "); | |
297 | + } | |
298 | + receiptContainerHeader.setStatus(QuantityConstant.RECEIPT_CONTAINER_BUILD); | |
299 | + boolean success = receiptContainerHeaderService.updateById(receiptContainerHeader); | |
300 | + if(!success) { | |
301 | + throw new ServiceException("取消入库任务时, 更新入库组盘头失败"); | |
302 | + } | |
303 | + | |
304 | + List<ReceiptContainerDetail> receiptContainerDetailList = receiptContainerDetailService. | |
305 | + getReceiptContainerDetailListByHeaderId(receiptContainerHeader.getId()); | |
306 | + List<ReceiptDetail> receiptDetailList = new ArrayList<>(); | |
307 | + for(ReceiptContainerDetail receiptContainerDetail : receiptContainerDetailList) { | |
308 | + ReceiptDetail receiptDetail = receiptDetailService.getById(receiptContainerDetail.getReceiptDetailId()); | |
309 | + if(receiptDetail == null) { | |
310 | + throw new ServiceException("取消入库任务时, 没有找到入库单详情" + receiptContainerDetail.getReceiptDetailId()); | |
311 | + } | |
312 | + receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_RECEIVING); | |
313 | + receiptDetailList.add(receiptDetail); | |
314 | + } | |
315 | + if(receiptDetailList.size() != 0) { | |
316 | + success = receiptDetailService.updateBatchById(receiptDetailList); | |
317 | + if(!success) { | |
318 | + throw new ServiceException("取消入库任务时, 更新入库单详情头失败"); | |
319 | + } | |
320 | + | |
321 | + List<Integer> receiptIdList = receiptDetailList.stream() | |
322 | + .map(ReceiptDetail::getReceiptId).distinct().collect(Collectors.toList()); | |
323 | + for(Integer receiptId : receiptIdList) { | |
324 | + success = receiptHeaderService.updateReceiptHeaderStatus(receiptId); | |
325 | + if (!success) { | |
326 | + throw new ServiceException("更新入库单明细失败"); | |
327 | + } | |
328 | + } | |
329 | + } | |
330 | + | |
331 | + return true; | |
332 | + } | |
333 | + | |
256 | 334 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/controller/shipmentCombinationController.java
... | ... | @@ -122,6 +122,10 @@ public class shipmentCombinationController { |
122 | 122 | return Result.error("选择分拣口时, 库区为空"); |
123 | 123 | } |
124 | 124 | int type = QuantityConstant.PORT_TYPE_PICK; |
125 | + int tasktType = shipmentContainerHeader.getTaskType(); | |
126 | + if(tasktType == QuantityConstant.TASK_TYPE_WHOLESHIPMENT || tasktType == QuantityConstant.TASK_TYPE_EMPTYSHIPMENT) { | |
127 | + type = QuantityConstant.PORT_TYPE_OUT; | |
128 | + } | |
125 | 129 | List<Port> portList = portService.getPortListByType(type, zoneCode, warehouseCode); |
126 | 130 | if(portList.size() == 0) { |
127 | 131 | return Result.error("选择分拣口时, 没有找到合适的分拣口"); |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java
... | ... | @@ -234,7 +234,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi |
234 | 234 | if(!warehouseCode.equals(shipmentDetail.getWarehouseCode())) { |
235 | 235 | return Result.error("配盘时,库存仓库编码和出库单仓库编码不一致"); |
236 | 236 | } |
237 | - boolean success = receiptContainerHeaderService.havaUnCompleteCombine(containerCode, warehouseCode); | |
237 | + boolean success = receiptContainerHeaderService.havaUnCompleteCombineByContainerCode(containerCode, warehouseCode); | |
238 | 238 | if(success) { |
239 | 239 | return Result.error("配盘时, 容器:" + containerCode + " 已经用于入库组盘"); |
240 | 240 | } |
... | ... | @@ -500,7 +500,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi |
500 | 500 | taskHeader.setWarehouseCode(warehouseCode); |
501 | 501 | taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); |
502 | 502 | taskHeader.setContainerCode(containerCode); |
503 | - taskHeader.setToPort(shipmentContainerHeader.getToPort()); | |
503 | + taskHeader.setToPortCode(shipmentContainerHeader.getToPort()); | |
504 | 504 | taskHeader.setFromLocationCode(fromLocationCode); |
505 | 505 | if(taskType == QuantityConstant.TASK_TYPE_SORTINGSHIPMENT) { |
506 | 506 | taskHeader.setToLocationCode(toLocationCode); |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/IShipmentContainerHeaderService.java
... | ... | @@ -28,6 +28,11 @@ public interface IShipmentContainerHeaderService extends IService<ShipmentContai |
28 | 28 | |
29 | 29 | public List<ShipmentContainerHeader> getUnCompleteCombineList(); |
30 | 30 | |
31 | - boolean havaUnCompleteCombine(String containerCode, String warehouseCode); | |
31 | + boolean havaUnCompleteCombineByContainerCode(String containerCode, String warehouseCode); | |
32 | 32 | |
33 | + boolean havaUnCompleteCombineByLocationCode(String locationCode, String warehouseCode); | |
34 | + | |
35 | + boolean havaUnCompleteCombineByFromLocationCode(String fromLocationCode, String warehouseCode); | |
36 | + | |
37 | + boolean havaUnCompleteCombineByToLocationCode(String toLocationCode, String warehouseCode); | |
33 | 38 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/shipment/shipmentContainerHeader/service/impl/ShipmentContainerHeaderServiceImpl.java
... | ... | @@ -68,10 +68,31 @@ public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentCont |
68 | 68 | } |
69 | 69 | |
70 | 70 | @Override |
71 | - public boolean havaUnCompleteCombine(String containerCode, String warehouseCode) { | |
71 | + public boolean havaUnCompleteCombineByContainerCode(String containerCode, String warehouseCode) { | |
72 | 72 | LambdaQueryWrapper<ShipmentContainerHeader> shipmentContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); |
73 | - shipmentContainerHeaderLambdaQueryWrapper | |
74 | - .eq(ShipmentContainerHeader::getContainerCode, containerCode) | |
73 | + shipmentContainerHeaderLambdaQueryWrapper.eq(ShipmentContainerHeader::getContainerCode, containerCode) | |
74 | + .eq(ShipmentContainerHeader::getWarehouseCode, warehouseCode) | |
75 | + .lt(ShipmentContainerHeader::getStatus, QuantityConstant.SHIPMENT_CONTAINER_FINISHED); | |
76 | + ShipmentContainerHeader shipmentContainerHeader = getOne(shipmentContainerHeaderLambdaQueryWrapper); | |
77 | + if(shipmentContainerHeader != null) { | |
78 | + return true; | |
79 | + } | |
80 | + return false; | |
81 | + } | |
82 | + | |
83 | + @Override | |
84 | + public boolean havaUnCompleteCombineByLocationCode(String locationCode, String warehouseCode) { | |
85 | + boolean success = havaUnCompleteCombineByFromLocationCode(locationCode, warehouseCode); | |
86 | + if(!success) { | |
87 | + success = havaUnCompleteCombineByToLocationCode(locationCode, warehouseCode); | |
88 | + } | |
89 | + return success; | |
90 | + } | |
91 | + | |
92 | + @Override | |
93 | + public boolean havaUnCompleteCombineByFromLocationCode(String fromLocationCode, String warehouseCode) { | |
94 | + LambdaQueryWrapper<ShipmentContainerHeader> shipmentContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
95 | + shipmentContainerHeaderLambdaQueryWrapper.eq(ShipmentContainerHeader::getFromLocationCode, fromLocationCode) | |
75 | 96 | .eq(ShipmentContainerHeader::getWarehouseCode, warehouseCode) |
76 | 97 | .lt(ShipmentContainerHeader::getStatus, QuantityConstant.SHIPMENT_CONTAINER_FINISHED); |
77 | 98 | ShipmentContainerHeader shipmentContainerHeader = getOne(shipmentContainerHeaderLambdaQueryWrapper); |
... | ... | @@ -81,6 +102,18 @@ public class ShipmentContainerHeaderServiceImpl extends ServiceImpl<ShipmentCont |
81 | 102 | return false; |
82 | 103 | } |
83 | 104 | |
105 | + @Override | |
106 | + public boolean havaUnCompleteCombineByToLocationCode(String toLocationCode, String warehouseCode) { | |
107 | + LambdaQueryWrapper<ShipmentContainerHeader> shipmentContainerHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
108 | + shipmentContainerHeaderLambdaQueryWrapper.eq(ShipmentContainerHeader::getToLocationCode, toLocationCode) | |
109 | + .eq(ShipmentContainerHeader::getWarehouseCode, warehouseCode) | |
110 | + .lt(ShipmentContainerHeader::getStatus, QuantityConstant.SHIPMENT_CONTAINER_FINISHED); | |
111 | + ShipmentContainerHeader shipmentContainerHeader = getOne(shipmentContainerHeaderLambdaQueryWrapper); | |
112 | + if(shipmentContainerHeader != null) { | |
113 | + return true; | |
114 | + } | |
115 | + return false; | |
116 | + } | |
84 | 117 | |
85 | 118 | |
86 | 119 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/controller/TaskHeaderController.java
1 | 1 | package org.jeecg.modules.wms.task.taskHeader.controller; |
2 | 2 | |
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
4 | +import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |
3 | 5 | import org.apache.shiro.authz.annotation.RequiresPermissions; |
4 | 6 | import org.jeecg.common.system.query.QueryGenerator; |
5 | 7 | import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; |
... | ... | @@ -8,14 +10,28 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
8 | 10 | import lombok.extern.slf4j.Slf4j; |
9 | 11 | import org.jeecg.common.system.base.controller.JeecgController; |
10 | 12 | import org.jeecg.common.api.vo.Result; |
13 | +import org.jeecg.common.system.util.JwtUtil; | |
14 | +import org.jeecg.modules.wms.config.container.entity.Container; | |
15 | +import org.jeecg.modules.wms.config.container.service.IContainerService; | |
16 | +import org.jeecg.modules.wms.config.location.entity.Location; | |
17 | +import org.jeecg.modules.wms.config.location.service.ILocationService; | |
18 | +import org.jeecg.modules.wms.config.port.entity.Port; | |
19 | +import org.jeecg.modules.wms.config.port.service.IPortService; | |
20 | +import org.jeecg.modules.wms.config.zone.entity.Zone; | |
21 | +import org.jeecg.modules.wms.config.zone.service.IZoneService; | |
22 | +import org.jeecg.modules.wms.framework.Convert; | |
11 | 23 | import org.jeecg.modules.wms.framework.controller.BaseController; |
24 | +import org.jeecg.modules.wms.shipment.shipmentContainerHeader.entity.ShipmentContainerHeader; | |
12 | 25 | import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; |
13 | 26 | import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; |
14 | 27 | import org.jeecg.modules.wms.task.taskHeader.service.ITaskDetailService; |
15 | 28 | import org.jeecg.modules.wms.task.taskHeader.service.ITaskHeaderService; |
16 | 29 | import org.jeecg.utils.StringUtils; |
30 | +import org.jeecg.utils.constant.QuantityConstant; | |
17 | 31 | import org.springframework.beans.factory.annotation.Autowired; |
18 | 32 | import org.springframework.web.bind.annotation.*; |
33 | + | |
34 | +import javax.annotation.Resource; | |
19 | 35 | import javax.servlet.http.HttpServletRequest; |
20 | 36 | import javax.servlet.http.HttpServletResponse; |
21 | 37 | import org.springframework.web.servlet.ModelAndView; |
... | ... | @@ -55,6 +71,14 @@ public class TaskHeaderController extends JeecgController<TaskHeader, ITaskHeade |
55 | 71 | |
56 | 72 | @Autowired |
57 | 73 | private ITaskDetailService taskDetailService; |
74 | + @Resource | |
75 | + private ILocationService locationService; | |
76 | + @Resource | |
77 | + private IContainerService containerService; | |
78 | + @Resource | |
79 | + private IPortService portService; | |
80 | + @Resource | |
81 | + private IZoneService zoneService; | |
58 | 82 | |
59 | 83 | |
60 | 84 | /*---------------------------------主表处理-begin-------------------------------------*/ |
... | ... | @@ -316,6 +340,31 @@ public class TaskHeaderController extends JeecgController<TaskHeader, ITaskHeade |
316 | 340 | } |
317 | 341 | |
318 | 342 | /** |
343 | + * 取消任务 | |
344 | + */ | |
345 | + @AutoLog(value = "任务表-取消任务") | |
346 | + @ApiOperation(value="任务表-取消任务", notes="任务表-取消任务") | |
347 | + @PostMapping( "/cancelTask") | |
348 | + @ResponseBody | |
349 | + public Result cancelTask(String ids) { | |
350 | + if (StringUtils.isEmpty(ids)) { | |
351 | + return Result.error("taskId不能为空"); | |
352 | + } | |
353 | + Result result = null; | |
354 | + Integer[] idList = Convert.toIntArray(ids); | |
355 | + for (int taskId : idList) { | |
356 | + result = handleMultiProcess("cancelTask", new MultiProcessListener() { | |
357 | + @Override | |
358 | + public Result doProcess() { | |
359 | + Result result = taskHeaderService.cancelTask(taskId); | |
360 | + return result; | |
361 | + } | |
362 | + }); | |
363 | + } | |
364 | + return result; | |
365 | + } | |
366 | + | |
367 | + /** | |
319 | 368 | * 执行任务 |
320 | 369 | */ |
321 | 370 | @AutoLog(value = "任务表-执行任务") |
... | ... | @@ -337,4 +386,258 @@ public class TaskHeaderController extends JeecgController<TaskHeader, ITaskHeade |
337 | 386 | return result; |
338 | 387 | } |
339 | 388 | } |
389 | + | |
390 | + /** | |
391 | + * 创建空托入库任务 | |
392 | + */ | |
393 | + @AutoLog(value = "任务表-创建空托入库任务") | |
394 | + @ApiOperation(value="任务表-创建空托入库任务", notes="任务表-创建空托入库任务") | |
395 | + @PostMapping( "/createEmptyIn") | |
396 | + public Result createEmptyIn(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
397 | + String contaienrCode = taskHeader.getContainerCode(); | |
398 | + String toLocationCode = taskHeader.getToLocationCode(); | |
399 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
400 | + Result result = handleMultiProcess("createEmptyIn", new MultiProcessListener() { | |
401 | + @Override | |
402 | + public Result doProcess() { | |
403 | + Result result = taskHeaderService.createEmptyIn(contaienrCode, | |
404 | + toLocationCode, warehouseCode); | |
405 | + return result; | |
406 | + } | |
407 | + }); | |
408 | + return result; | |
409 | + } | |
410 | + | |
411 | + /** | |
412 | + * 创建空托出库任务 | |
413 | + */ | |
414 | + @AutoLog(value = "任务表-创建空托出库任务") | |
415 | + @ApiOperation(value="任务表-创建空托出库任务", notes="任务表-创建空托出库任务") | |
416 | + @PostMapping( "/createEmptyOut") | |
417 | + public Result createEmptyOut(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
418 | + String contaienrCode = taskHeader.getContainerCode(); | |
419 | + String toPortCode = taskHeader.getToPortCode(); | |
420 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
421 | + Result result = handleMultiProcess("createEmptyOut", new MultiProcessListener() { | |
422 | + @Override | |
423 | + public Result doProcess() { | |
424 | + Result result = taskHeaderService.createEmptyOut(contaienrCode, | |
425 | + toPortCode, warehouseCode); | |
426 | + return result; | |
427 | + } | |
428 | + }); | |
429 | + return result; | |
430 | + } | |
431 | + | |
432 | + /** | |
433 | + * 创建移库任务 | |
434 | + */ | |
435 | + @AutoLog(value = "任务表-创建移库任务") | |
436 | + @ApiOperation(value="任务表-创建移库任务", notes="任务表-创建移库任务") | |
437 | + @PostMapping( "/createTransferTask") | |
438 | + public Result createTransferTask(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
439 | + String fromLocationCode = taskHeader.getFromLocationCode(); | |
440 | + String toLocationCode = taskHeader.getToLocationCode(); | |
441 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
442 | + Result result = handleMultiProcess("createTransferTask", new MultiProcessListener() { | |
443 | + @Override | |
444 | + public Result doProcess() { | |
445 | + Result result = taskHeaderService.createTransferTask(fromLocationCode, | |
446 | + toLocationCode, warehouseCode); | |
447 | + return result; | |
448 | + } | |
449 | + }); | |
450 | + return result; | |
451 | + } | |
452 | + | |
453 | + /** | |
454 | + * 创建出库查看任务 | |
455 | + */ | |
456 | + @AutoLog(value = "任务表-创建出库查看任务") | |
457 | + @ApiOperation(value="任务表-创建出库查看任务", notes="任务表-创建出库查看任务") | |
458 | + @PostMapping( "/createCheckOutTask") | |
459 | + public Result createCheckOutTask(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
460 | + String containerCode = taskHeader.getContainerCode(); | |
461 | + String toPortCode = taskHeader.getToPortCode(); | |
462 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
463 | + Result result = handleMultiProcess("createCheckOutTask", new MultiProcessListener() { | |
464 | + @Override | |
465 | + public Result doProcess() { | |
466 | + Result result = taskHeaderService.createCheckOutTask(containerCode, | |
467 | + toPortCode, warehouseCode); | |
468 | + return result; | |
469 | + } | |
470 | + }); | |
471 | + return result; | |
472 | + } | |
473 | + | |
474 | + /** | |
475 | + * 创建跨站任务 | |
476 | + */ | |
477 | + @AutoLog(value = "任务表-创建跨站任务") | |
478 | + @ApiOperation(value="任务表-创建跨站任务", notes="任务表-创建跨站任务") | |
479 | + @PostMapping( "/createOverStationTask") | |
480 | + public Result createOverStationTask(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
481 | + String containerCode = taskHeader.getContainerCode(); | |
482 | + String fromPortCode = taskHeader.getFromPortCode(); | |
483 | + String toPortCode = taskHeader.getToPortCode(); | |
484 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
485 | + Result result = handleMultiProcess("createOverStationTask", new MultiProcessListener() { | |
486 | + @Override | |
487 | + public Result doProcess() { | |
488 | + Result result = taskHeaderService.createOverStationTask(containerCode, | |
489 | + fromPortCode, toPortCode, warehouseCode); | |
490 | + return result; | |
491 | + } | |
492 | + }); | |
493 | + return result; | |
494 | + } | |
495 | + | |
496 | + /** | |
497 | + * 创建空托盘组入库 | |
498 | + */ | |
499 | + @AutoLog(value = "任务表-创建空托盘组入库") | |
500 | + @ApiOperation(value="任务表-创建空托盘组入库", notes="任务表-创建空托盘组入库") | |
501 | + @PostMapping( "/createManyEmptyIn") | |
502 | + public Result createManyEmptyIn(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
503 | + String containerCode = taskHeader.getContainerCode(); | |
504 | + String toLocationCode = taskHeader.getToLocationCode(); | |
505 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
506 | + Result result = handleMultiProcess("createManyEmptyIn", new MultiProcessListener() { | |
507 | + @Override | |
508 | + public Result doProcess() { | |
509 | + Result result = taskHeaderService.createManyEmptyIn(containerCode, toLocationCode, warehouseCode); | |
510 | + return result; | |
511 | + } | |
512 | + }); | |
513 | + return result; | |
514 | + } | |
515 | + | |
516 | + /** | |
517 | + * 创建空托盘组出库 | |
518 | + */ | |
519 | + @AutoLog(value = "任务表-创建空托盘组出库") | |
520 | + @ApiOperation(value="任务表-创建空托盘组出库", notes="任务表-创建空托盘组出库") | |
521 | + @PostMapping( "/createManyEmptyOut") | |
522 | + public Result createManyEmptyOut(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
523 | + String containerCode = taskHeader.getContainerCode(); | |
524 | + String toPortCode = taskHeader.getToPortCode(); | |
525 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
526 | + Result result = handleMultiProcess("createManyEmptyOut", new MultiProcessListener() { | |
527 | + @Override | |
528 | + public Result doProcess() { | |
529 | + Result result = taskHeaderService.createManyEmptyOut(containerCode, toPortCode, warehouseCode); | |
530 | + return result; | |
531 | + } | |
532 | + }); | |
533 | + return result; | |
534 | + } | |
535 | + | |
536 | + /** | |
537 | + * 选择整出口 | |
538 | + * @return | |
539 | + */ | |
540 | + @ApiOperation(value="任务表-选择整出口", notes="任务表-选择整出口") | |
541 | + @PostMapping("/selectOutPort") | |
542 | + @ResponseBody | |
543 | + public Result selectOutPort(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
544 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
545 | + String containerCode = taskHeader.getContainerCode(); | |
546 | + if(StringUtils.isEmpty(containerCode)) { | |
547 | + return Result.error("选择整出口, 托盘号为空"); | |
548 | + } | |
549 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
550 | + if(container == null) { | |
551 | + return Result.error("选择整出口, 没有找到托盘" + containerCode); | |
552 | + } | |
553 | + String fromLocationCode = container.getLocationCode(); | |
554 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
555 | + return Result.error("选择整出口, 起始库位号为空"); | |
556 | + } | |
557 | + Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); | |
558 | + if(fromLocation == null) { | |
559 | + return Result.error("选择整出口, 根据库位号" + fromLocationCode + " 没有找到库位"); | |
560 | + } | |
561 | + String zoneCode = fromLocation.getZoneCode(); | |
562 | + if(StringUtils.isEmpty(zoneCode)) { | |
563 | + return Result.error("选择整出口, 库区编码为空"); | |
564 | + } | |
565 | + Zone zone = zoneService.getZoneByCode(zoneCode, warehouseCode); | |
566 | + if(zone == null) { | |
567 | + return Result.error("选择整出口, 库区为空"); | |
568 | + } | |
569 | + int type = QuantityConstant.PORT_TYPE_OUT; | |
570 | + List<Port> portList = portService.getPortListByType(type, zoneCode, warehouseCode); | |
571 | + if(portList.size() == 0) { | |
572 | + return Result.error("选择整出口, 没有找到合适的整出口"); | |
573 | + } | |
574 | + return Result.OK(portList); | |
575 | + } | |
576 | + | |
577 | + /** | |
578 | + * 选择分拣口 | |
579 | + * @return | |
580 | + */ | |
581 | + @ApiOperation(value="任务表-选择分拣口", notes="任务表-选择分拣口") | |
582 | + @PostMapping("/selectPickPort") | |
583 | + @ResponseBody | |
584 | + public Result selectPickPort(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
585 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
586 | + String containerCode = taskHeader.getContainerCode(); | |
587 | + if(StringUtils.isEmpty(containerCode)) { | |
588 | + return Result.error("选择分拣口, 托盘号为空"); | |
589 | + } | |
590 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
591 | + if(container == null) { | |
592 | + return Result.error("选择分拣口, 没有找到托盘" + containerCode); | |
593 | + } | |
594 | + String fromLocationCode = container.getLocationCode(); | |
595 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
596 | + return Result.error("选择整出口, 起始库位号为空"); | |
597 | + } | |
598 | + Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); | |
599 | + if(fromLocation == null) { | |
600 | + return Result.error("选择分拣口, 根据库位号" + fromLocationCode + " 没有找到库位"); | |
601 | + } | |
602 | + String zoneCode = fromLocation.getZoneCode(); | |
603 | + if(StringUtils.isEmpty(zoneCode)) { | |
604 | + return Result.error("选择分拣口, 库区编码为空"); | |
605 | + } | |
606 | + Zone zone = zoneService.getZoneByCode(zoneCode, warehouseCode); | |
607 | + if(zone == null) { | |
608 | + return Result.error("选择分拣口, 库区为空"); | |
609 | + } | |
610 | + int type = QuantityConstant.PORT_TYPE_PICK; | |
611 | + List<Port> portList = portService.getPortListByType(type, zoneCode, warehouseCode); | |
612 | + if(portList.size() == 0) { | |
613 | + return Result.error("选择分拣口, 没有找到合适的分拣口"); | |
614 | + } | |
615 | + return Result.OK(portList); | |
616 | + } | |
617 | + | |
618 | + /** | |
619 | + * 选择站台 | |
620 | + * @return | |
621 | + */ | |
622 | + @ApiOperation(value="任务表-选择站台", notes="任务表-选择站台") | |
623 | + @PostMapping("/selectPort") | |
624 | + @ResponseBody | |
625 | + public Result selectPort(@RequestBody TaskHeader taskHeader, HttpServletRequest req) { | |
626 | + String warehouseCode = JwtUtil.getWarehouseCodeByToken(req); | |
627 | + String containerCode = taskHeader.getContainerCode(); | |
628 | + if(StringUtils.isEmpty(containerCode)) { | |
629 | + return Result.error("选择站台, 托盘号为空"); | |
630 | + } | |
631 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
632 | + if(container == null) { | |
633 | + return Result.error("选择站台, 没有找到托盘" + containerCode); | |
634 | + } | |
635 | + LambdaQueryWrapper<Port> portLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
636 | + portLambdaQueryWrapper.eq(Port::getWarehouseCode, warehouseCode); | |
637 | + List<Port> portList = portService.list(portLambdaQueryWrapper); | |
638 | + if(portList.size() == 0) { | |
639 | + return Result.error("选择站台, 没有找到合适的选择站台"); | |
640 | + } | |
641 | + return Result.OK(portList); | |
642 | + } | |
340 | 643 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/entity/TaskHeader.java
... | ... | @@ -97,11 +97,11 @@ public class TaskHeader implements Serializable { |
97 | 97 | /**起始出入口*/ |
98 | 98 | @Excel(name = "起始出入口", width = 15) |
99 | 99 | @ApiModelProperty(value = "起始出入口") |
100 | - private String fromPort; | |
100 | + private String fromPortCode; | |
101 | 101 | /**目标出入口*/ |
102 | 102 | @Excel(name = "目标出入口", width = 15) |
103 | 103 | @ApiModelProperty(value = "目标出入口") |
104 | - private String toPort; | |
104 | + private String toPortCode; | |
105 | 105 | @Excel(name = "重量", width = 15) |
106 | 106 | @ApiModelProperty(value = "重量") |
107 | 107 | private Integer weight; |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/ITaskHeaderService.java
... | ... | @@ -27,18 +27,156 @@ public interface ITaskHeaderService extends IService<TaskHeader> { |
27 | 27 | */ |
28 | 28 | void delBatchMain (Collection<? extends Serializable> idList); |
29 | 29 | |
30 | + /** | |
31 | + * 判断旁边库位是否有未完成的任务,如果有 | |
32 | + * @param location | |
33 | + * @return | |
34 | + */ | |
30 | 35 | boolean haveUncompleteTaskInNear(Location location); |
31 | 36 | |
32 | - Result createTransferTask(String fromLocationCode, String toLocationCode, String warehouseCode); | |
33 | - | |
34 | - | |
37 | + /** | |
38 | + * 通过起始库位号,获取任务信息 | |
39 | + * @param fromLocationCode | |
40 | + * @param warehouseCode | |
41 | + * @return | |
42 | + */ | |
35 | 43 | TaskHeader getUnCompleteTaskByFromLocationCode(String fromLocationCode, String warehouseCode); |
36 | 44 | |
45 | + /** | |
46 | + * 通过目标库位号,获取任务信息 | |
47 | + * @param toLocationCode | |
48 | + * @param warehouseCode | |
49 | + * @return | |
50 | + */ | |
37 | 51 | TaskHeader getUnCompleteTaskByToLocationCode(String toLocationCode, String warehouseCode); |
38 | 52 | |
53 | + /** | |
54 | + * 通过库位号,获取任务信息 | |
55 | + * @param locationCode | |
56 | + * @param warehouseCode | |
57 | + * @return | |
58 | + */ | |
39 | 59 | TaskHeader getUnCompleteTaskByLocationCode(String locationCode, String warehouseCode); |
40 | 60 | |
61 | + /** | |
62 | + * 通过托盘号,获取未完成任务信息 | |
63 | + * @param containerCode | |
64 | + * @param warehouseCode | |
65 | + * @return | |
66 | + */ | |
67 | + TaskHeader getUnCompleteTaskByContainerCode(String containerCode, String warehouseCode); | |
68 | + | |
69 | + /** | |
70 | + * 通过前置任务号,获取未完成任务信息 | |
71 | + * @param preTaskNo | |
72 | + * @param warehouseCode | |
73 | + * @return | |
74 | + */ | |
75 | + TaskHeader getUnCompleteTaskByPreTaskNo(int preTaskNo, String warehouseCode); | |
76 | + | |
77 | + /** | |
78 | + * 完成WMS任务 | |
79 | + * @param taskId | |
80 | + * @return | |
81 | + */ | |
41 | 82 | Result completeTaskByWMS(Integer taskId); |
42 | 83 | |
84 | + /** | |
85 | + * 取消WMS任务 | |
86 | + * @param taskId | |
87 | + * @return | |
88 | + */ | |
89 | + Result cancelTask(Integer taskId); | |
90 | + | |
91 | + /** | |
92 | + * 下发任务给WCS | |
93 | + * @param taskId | |
94 | + * @return | |
95 | + */ | |
43 | 96 | Result sendTaskToWcs(Integer taskId); |
97 | + | |
98 | + /** | |
99 | + * 创建空托盘入库任务 | |
100 | + * @param containerCode | |
101 | + * @param toLocationCode | |
102 | + * @param warehouseCode | |
103 | + * @return | |
104 | + */ | |
105 | + Result createEmptyIn(String containerCode, String toLocationCode, String warehouseCode); | |
106 | + | |
107 | + /** | |
108 | + * 创建空托盘出库任务 | |
109 | + * @param containerCode | |
110 | + * @param toPortCode | |
111 | + * @param warehouseCode | |
112 | + * @return | |
113 | + */ | |
114 | + Result createEmptyOut(String containerCode, String toPortCode, String warehouseCode); | |
115 | + | |
116 | + /** | |
117 | + * 创建移库任务 | |
118 | + * @param fromLocationCode | |
119 | + * @param toLocationCode | |
120 | + * @param warehouseCode | |
121 | + * @return | |
122 | + */ | |
123 | + Result createTransferTask(String fromLocationCode, String toLocationCode, String warehouseCode); | |
124 | + | |
125 | + /** | |
126 | + * 创建出库查看任务 | |
127 | + * @param containerCode | |
128 | + * @param toPortCode | |
129 | + * @param warehouseCode | |
130 | + * @return | |
131 | + */ | |
132 | + Result createCheckOutTask(String containerCode, String toPortCode, String warehouseCode); | |
133 | + | |
134 | + /** | |
135 | + * 创建跨站任务任务 | |
136 | + * @param containerCode | |
137 | + * @param fromPortCode | |
138 | + * @param toPortCode | |
139 | + * @param warehouseCode | |
140 | + * @return | |
141 | + */ | |
142 | + Result createOverStationTask(String containerCode, String fromPortCode, String toPortCode, String warehouseCode); | |
143 | + | |
144 | + /** | |
145 | + * WCS申请空托盘组入库 | |
146 | + * @param containerCode | |
147 | + * @param zoneCode | |
148 | + * @param roadWay | |
149 | + * @parap height | |
150 | + * @param warehouseCode | |
151 | + * @return | |
152 | + */ | |
153 | + Result createManyEmptyInTask(String containerCode, String zoneCode, String roadWay, String height, String warehouseCode); | |
154 | + | |
155 | + /** | |
156 | + * 创建空托盘组入库 | |
157 | + * @param containerCode | |
158 | + * @param toLocationCode | |
159 | + * @param warehouseCode | |
160 | + * @return | |
161 | + */ | |
162 | + Result createManyEmptyIn(String containerCode, String toLocationCode, String warehouseCode); | |
163 | + | |
164 | + /** | |
165 | + * WCS申请空托盘组出库 | |
166 | + * @param zoneCode | |
167 | + * @param toPortCode | |
168 | + * @param warehouseCode | |
169 | + * @return | |
170 | + */ | |
171 | + Result createManyEmptyOutTask(String zoneCode, String toPortCode, String warehouseCode); | |
172 | + | |
173 | + /** | |
174 | + * 创建空托盘组出库 | |
175 | + * @param containerCode | |
176 | + * @param toPortCode | |
177 | + * @param warehouseCode | |
178 | + * @return | |
179 | + */ | |
180 | + Result createManyEmptyOut(String containerCode, String toPortCode, String warehouseCode); | |
181 | + | |
44 | 182 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
... | ... | @@ -5,19 +5,30 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
5 | 5 | import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
6 | 6 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
7 | 7 | import org.jeecg.common.api.vo.Result; |
8 | +import org.jeecg.modules.wms.api.wcs.service.LocationAllocationService; | |
8 | 9 | import org.jeecg.modules.wms.api.wcs.service.WcsService; |
9 | 10 | import org.jeecg.modules.wms.config.container.entity.Container; |
10 | 11 | import org.jeecg.modules.wms.config.container.service.IContainerService; |
11 | 12 | import org.jeecg.modules.wms.config.location.entity.Location; |
12 | 13 | import org.jeecg.modules.wms.config.location.service.ILocationService; |
14 | +import org.jeecg.modules.wms.config.locationHigh.entity.LocationHigh; | |
15 | +import org.jeecg.modules.wms.config.locationHigh.service.ILocationHighService; | |
16 | +import org.jeecg.modules.wms.config.locationType.entity.LocationType; | |
17 | +import org.jeecg.modules.wms.config.locationType.service.ILocationTypeService; | |
13 | 18 | import org.jeecg.modules.wms.config.material.entity.Material; |
14 | 19 | import org.jeecg.modules.wms.config.material.service.IMaterialService; |
20 | +import org.jeecg.modules.wms.config.parameterConfiguration.service.IParameterConfigurationService; | |
21 | +import org.jeecg.modules.wms.config.port.entity.Port; | |
22 | +import org.jeecg.modules.wms.config.port.service.IPortService; | |
23 | +import org.jeecg.modules.wms.config.zone.entity.Zone; | |
24 | +import org.jeecg.modules.wms.config.zone.service.IZoneService; | |
15 | 25 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; |
16 | 26 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; |
17 | 27 | import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailService; |
18 | 28 | import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService; |
19 | 29 | import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction; |
20 | 30 | import org.jeecg.modules.wms.inventory.inventoryTransaction.service.IInventoryTransactionService; |
31 | +import org.jeecg.modules.wms.receipt.receiptContainerHeader.entity.ReceiptContainerHeader; | |
21 | 32 | import org.jeecg.modules.wms.receipt.receiptContainerHeader.service.IReceiptContainerHeaderService; |
22 | 33 | import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; |
23 | 34 | import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService; |
... | ... | @@ -45,10 +56,7 @@ import org.springframework.transaction.annotation.Transactional; |
45 | 56 | import javax.annotation.Resource; |
46 | 57 | import java.io.Serializable; |
47 | 58 | import java.math.BigDecimal; |
48 | -import java.util.ArrayList; | |
49 | -import java.util.Date; | |
50 | -import java.util.List; | |
51 | -import java.util.Collection; | |
59 | +import java.util.*; | |
52 | 60 | import java.util.stream.Collectors; |
53 | 61 | |
54 | 62 | /** |
... | ... | @@ -96,6 +104,18 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
96 | 104 | private IMaterialService materialService; |
97 | 105 | @Resource |
98 | 106 | private WcsService wcsService; |
107 | + @Resource | |
108 | + private IPortService portService; | |
109 | + @Resource | |
110 | + private IParameterConfigurationService parameterConfigurationService; | |
111 | + @Resource | |
112 | + private IZoneService zoneService; | |
113 | + @Resource | |
114 | + private ILocationTypeService locationTypeService; | |
115 | + @Resource | |
116 | + private ILocationHighService locationHighService; | |
117 | + @Resource | |
118 | + private LocationAllocationService allocationService; | |
99 | 119 | |
100 | 120 | @Override |
101 | 121 | @Transactional |
... | ... | @@ -134,55 +154,76 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
134 | 154 | @Override |
135 | 155 | @Transactional(rollbackFor = Exception.class) |
136 | 156 | public Result createTransferTask(String fromLocationCode, String toLocationCode, String warehouseCode) { |
157 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
158 | + return Result.error("创建移库任务时,起始库位为空"); | |
159 | + } | |
160 | + if(StringUtils.isEmpty(toLocationCode)) { | |
161 | + return Result.error("创建移库任务时,目标库位为空"); | |
162 | + } | |
137 | 163 | Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); |
138 | 164 | Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); |
139 | 165 | Integer preTaskNo = 0; |
140 | 166 | // 1. 判断起点库位和终点库位是否满足移库条件 |
141 | 167 | if(fromLocation == null) { |
142 | - return Result.error("源库位:" + fromLocationCode + "未找到"); | |
168 | + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "未找到"); | |
143 | 169 | } |
144 | 170 | if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(fromLocation.getStatus())) { |
145 | - return Result.error("源库位:" + fromLocationCode + "状态非空闲"); | |
171 | + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "状态非空闲"); | |
146 | 172 | } |
147 | 173 | if (StringUtils.isEmpty(fromLocation.getContainerCode())) { |
148 | - return Result.error("源库位:" + fromLocationCode + "不存在托盘"); | |
174 | + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "不存在托盘"); | |
149 | 175 | } |
150 | 176 | //这里增加组盘校验,如果此托盘存在未完成的组盘数据,则不能移库 |
151 | 177 | //校验入库组盘 |
152 | -// if (inventoryHeaderService.getUncompleteReceiptContainer(fromLocationCode, warehouseCode) > 0) { | |
153 | -// return Result.error("源库位:" + fromLocationCode + "存在入库组盘,不能移库"); | |
154 | -// } | |
155 | -// if (inventoryHeaderService.getUncompleteShipmentContainer(toLocationCode, warehouseCode) > 0) { | |
156 | -// return Result.error("源库位:" + toLocationCode + "存在出库组盘,不能移库"); | |
157 | -// } | |
178 | + if (receiptContainerHeaderService.havaUnCompleteCombineByLocationCode(fromLocationCode, warehouseCode)) { | |
179 | + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "存在入库组盘,不能移库"); | |
180 | + } | |
181 | + //校验出库组盘 | |
182 | + if (shipmentContainerHeaderService.havaUnCompleteCombineByLocationCode(fromLocationCode, warehouseCode)) { | |
183 | + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "存在出库组盘,不能移库"); | |
184 | + } | |
185 | + | |
158 | 186 | if (toLocation == null) { |
159 | - return Result.error("目标库位:" + toLocationCode + "未找到"); | |
187 | + return Result.error("创建移库任务时,目标库位:" + toLocationCode + "未找到"); | |
160 | 188 | } |
161 | 189 | if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(toLocation.getStatus())) { |
162 | - return Result.error("目标库位:" + toLocationCode + "状态非空闲"); | |
190 | + return Result.error("创建移库任务时,目标库位:" + toLocationCode + "状态非空闲"); | |
163 | 191 | } |
164 | 192 | if (StringUtils.isNotEmpty(toLocation.getContainerCode())) { |
165 | - return Result.error("目标库位:" + toLocationCode + "存在托盘"); | |
193 | + return Result.error("创建移库任务时,目标库位:" + toLocationCode + "存在托盘"); | |
194 | + } | |
195 | + //校验入库组盘 | |
196 | + if (receiptContainerHeaderService.havaUnCompleteCombineByLocationCode(toLocationCode, warehouseCode)) { | |
197 | + return Result.error("创建移库任务时,目标库位:" + toLocationCode + "存在入库组盘,不能移库"); | |
198 | + } | |
199 | + //校验出库组盘 | |
200 | + if (shipmentContainerHeaderService.havaUnCompleteCombineByLocationCode(toLocationCode, warehouseCode)) { | |
201 | + return Result.error("创建移库任务时, 目标库位:" + toLocationCode + "存在出库组盘,不能移库"); | |
166 | 202 | } |
167 | 203 | if (taskHeaderService.haveUncompleteTaskInNear(toLocation)) { |
168 | - return Result.error("目标库位:" + toLocationCode + "旁边存在任务,请完成任务以后再分配"); | |
204 | + return Result.error("创建移库任务时,目标库位:" + toLocationCode + "旁边存在任务,请完成任务以后再分配"); | |
169 | 205 | } |
206 | + | |
170 | 207 | if(!fromLocation.getRoadWay().equals(toLocation.getRoadWay())) { |
171 | - return Result.error("目标库位和源库位不在同一个巷道"); | |
208 | + return Result.error("创建移库任务时,目标库位和源库位不在同一个巷道"); | |
172 | 209 | } |
173 | 210 | if(!fromLocation.getHigh().equals(toLocation.getHigh())) { |
174 | - return Result.error("目标库位和源库位高度不一样"); | |
211 | + return Result.error("创建移库任务时,目标库位和源库位高度不一样"); | |
175 | 212 | } |
176 | 213 | if(!fromLocation.getLocationTypeCode().equals(toLocation.getLocationTypeCode())) { |
177 | - return Result.error("目标库位和源库位库位类型不一样"); | |
214 | + return Result.error("创建移库任务时,目标库位和源库位库位类型不一样"); | |
178 | 215 | } |
179 | 216 | if(!fromLocation.getZoneCode().equals(toLocation.getZoneCode())) { |
180 | - return Result.error("目标库位和源库位不在同一个区域"); | |
217 | + return Result.error("创建移库任务时,目标库位和源库位不在同一个区域"); | |
181 | 218 | } |
219 | + | |
182 | 220 | // 2. 记住移库前的容器类型,因为空托盘组无法区分 |
183 | 221 | Container container = containerService.getContainerByCode(fromLocation.getContainerCode(), warehouseCode); |
184 | 222 | container.setLastStatus(container.getStatus()); |
185 | - containerService.updateById(container); | |
223 | + boolean success = containerService.updateById(container); | |
224 | + if(!success) { | |
225 | + throw new ServiceException("创建移库任务时,更新容器状态失败,容器号" + fromLocation.getContainerCode()); | |
226 | + } | |
186 | 227 | |
187 | 228 | // 3. 判断源库位旁边有托盘但是没有任务,那么不允许移库 |
188 | 229 | if(fromLocation.getRowFlag() == QuantityConstant.ROW_OUT) { |
... | ... | @@ -194,12 +235,12 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
194 | 235 | if(taskHeader != null) { |
195 | 236 | preTaskNo = taskHeader.getId(); |
196 | 237 | } else { |
197 | - return Result.error("源库位:" + fromLocationCode + "旁边库位有托盘无法移库"); | |
238 | + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "旁边库位有托盘无法移库"); | |
198 | 239 | } |
199 | 240 | } else { |
200 | 241 | TaskHeader taskHeader = getUnCompleteTaskByToLocationCode(locationCode, warehouseCode); |
201 | 242 | if(taskHeader != null) { |
202 | - return Result.error("源库位:" + fromLocationCode + "旁边库位有任务无法移库"); | |
243 | + return Result.error("创建移库任务时,起始库位:" + fromLocationCode + "旁边库位有任务无法移库"); | |
203 | 244 | } |
204 | 245 | } |
205 | 246 | } |
... | ... | @@ -208,73 +249,384 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
208 | 249 | TaskHeader taskHeader = new TaskHeader(); |
209 | 250 | taskHeader.setWarehouseCode(warehouseCode); |
210 | 251 | taskHeader.setTaskType(QuantityConstant.TASK_TYPE_TRANSFER); |
211 | - taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_WORK); | |
252 | + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_TRANSFER_POSITION); | |
212 | 253 | taskHeader.setZoneCode(fromLocation.getZoneCode()); |
213 | 254 | taskHeader.setContainerCode(fromLocation.getContainerCode()); |
214 | 255 | taskHeader.setFromLocationCode(fromLocationCode); |
215 | 256 | taskHeader.setToLocationCode(toLocationCode); |
216 | 257 | taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); |
217 | 258 | taskHeader.setPreTaskNo(preTaskNo); |
218 | - boolean result = taskHeaderService.save(taskHeader); | |
219 | - if(!result) { | |
220 | - throw new ServiceException("创建任务失败"); | |
259 | + success = taskHeaderService.save(taskHeader); | |
260 | + if(!success) { | |
261 | + throw new ServiceException("创建移库任务时,创建任务失败"); | |
221 | 262 | } |
222 | 263 | |
223 | - result = locationService.updateStatus(fromLocationCode, | |
264 | + success = locationService.updateStatus(fromLocationCode, | |
224 | 265 | QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); |
225 | - if(!result) { | |
226 | - throw new ServiceException("库位“ + fromLocationCode + “更新失败"); | |
266 | + if(!success) { | |
267 | + throw new ServiceException("创建移库任务时, 库位" + fromLocationCode + "更新失败"); | |
227 | 268 | } |
228 | - result = locationService.updateStatus(toLocationCode, | |
269 | + success = locationService.updateStatus(toLocationCode, | |
229 | 270 | QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); |
230 | - if(!result) { | |
231 | - throw new ServiceException("库位“ + toLocationCode + “更新失败"); | |
271 | + if(!success) { | |
272 | + throw new ServiceException("创建移库任务时, 库位" + toLocationCode + "更新失败"); | |
232 | 273 | } |
233 | - result = containerService.updateLocationCodeAndStatus(fromLocation.getContainerCode(), | |
274 | + success = containerService.updateLocationCodeAndStatus(fromLocation.getContainerCode(), | |
234 | 275 | fromLocationCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); |
235 | - if(!result) { | |
236 | - throw new ServiceException("容器“ + fromLocation.getContainerCode() + “更新失败"); | |
237 | - } | |
238 | - | |
239 | -// LambdaUpdateWrapper<InventoryDetail> detailLambdaUpdateWrapper = Wrappers.lambdaUpdate(); | |
240 | -// detailLambdaUpdateWrapper.eq(InventoryDetail::getWarehouseCode, warehouseCode); | |
241 | -// detailLambdaUpdateWrapper.eq(InventoryDetail::getLocationCode, sourceLocationCode); | |
242 | -// List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(detailLambdaUpdateWrapper); | |
243 | -// for (InventoryDetail inventoryDetail : inventoryDetailList) { | |
244 | -// TaskDetail taskDetail = new TaskDetail(); | |
245 | -// taskDetail.setTaskId(taskHeader.getId()); | |
246 | -// taskDetail.setTaskType(taskHeader.getTaskType()); | |
247 | -// taskDetail.setInternalTaskType(taskHeader.getInternalTaskType()); | |
248 | -// taskDetail.setWarehouseCode(taskHeader.getWarehouseCode());; | |
249 | -// taskDetail.setCompanyCode(inventoryDetail.getCompanyCode()); | |
250 | -// taskDetail.setMaterialCode(inventoryDetail.getMaterialCode()); | |
251 | -// taskDetail.setMaterialName(inventoryDetail.getMaterialName()); | |
252 | -// taskDetail.setMaterialSpec(inventoryDetail.getMaterialSpec()); | |
253 | -// taskDetail.setMaterialUnit(inventoryDetail.getMaterialUnit()); | |
254 | -// taskDetail.setQty(inventoryDetail.getQty()); | |
255 | -// taskDetail.setFromLocation(inventoryDetail.getLocationCode()); | |
256 | -// taskDetail.setToLocation(desLocationCode); | |
257 | -// taskDetail.setContainerCode(inventoryDetail.getContainerCode()); | |
258 | -// taskDetail.setStatus(QuantityConstant.TASK_STATUS_BUILD); | |
259 | -// taskDetail.setReferenceCode(inventoryDetail.getReferCode()); | |
260 | -// taskDetail.setAttribute1(inventoryDetail.getAttribute1()); | |
261 | -// taskDetail.setAttribute2(inventoryDetail.getAttribute2()); | |
262 | -// taskDetail.setAttribute3(inventoryDetail.getAttribute3()); | |
263 | -// taskDetail.setBatch(inventoryDetail.getBatch()); | |
264 | -// taskDetail.setLot(inventoryDetail.getLot()); | |
265 | -// taskDetail.setProjectNo(inventoryDetail.getProjectNo()); | |
266 | -// taskDetail.setManufactureDate(inventoryDetail.getManufactureDate()); | |
267 | -// taskDetail.setExpirationDate(inventoryDetail.getExpirationDate()); | |
268 | -// taskDetail.setAgingDate(inventoryDetail.getAgingDate()); | |
269 | -// taskDetail.setInventorySts(inventoryDetail.getInventorySts()); | |
270 | -// taskDetail.setFromInventoryId(inventoryDetail.getId()); | |
271 | -// taskDetail.setToInventoryId(inventoryDetail.getId()); | |
272 | -// if (!taskDetailService.save(taskDetail) || !inventoryDetailService.updateById(inventoryDetail)) { | |
273 | -// throw new ServiceException("创建任务失败"); | |
274 | -// } | |
275 | -// } | |
276 | - | |
277 | - return Result.OK(taskHeader.getId()); | |
276 | + if(!success) { | |
277 | + throw new ServiceException("创建移库任务时,容器" + fromLocation.getContainerCode() + "更新失败"); | |
278 | + } | |
279 | + return Result.OK("创建移库任务成功"); | |
280 | + } | |
281 | + | |
282 | + @Override | |
283 | + @Transactional(rollbackFor = Exception.class) | |
284 | + public Result createCheckOutTask(String containerCode, String toPortCode, String warehouseCode) { | |
285 | + if(StringUtils.isEmpty(containerCode)) { | |
286 | + return Result.error("创建出库查看任务时,容器编码为空"); | |
287 | + } | |
288 | + if(StringUtils.isEmpty(toPortCode)) { | |
289 | + return Result.error("创建出库查看任务时,目标站台号为空"); | |
290 | + } | |
291 | + if(StringUtils.isEmpty(warehouseCode)) { | |
292 | + return Result.error("创建出库查看任务时,仓库编码为空"); | |
293 | + } | |
294 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
295 | + if(container == null) { | |
296 | + return Result.error("创建出库查看任务时,容器为空"); | |
297 | + } | |
298 | + String fromLocationCode = container.getLocationCode(); | |
299 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
300 | + return Result.error("创建出库查看任务时,容器不在库位上"); | |
301 | + } | |
302 | + Location location = locationService.getLocationByCode(fromLocationCode, warehouseCode); | |
303 | + if(location == null) { | |
304 | + return Result.error("创建出库查看任务时,没有找到库位:" + fromLocationCode); | |
305 | + } | |
306 | + String zoneCode = location.getZoneCode(); | |
307 | + Port port = portService.getPortByCode(toPortCode, zoneCode, warehouseCode); | |
308 | + if(port == null) { | |
309 | + return Result.error("创建出库查看任务时,没有找到出库口:" + toPortCode); | |
310 | + } | |
311 | + boolean success = false; | |
312 | + LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
313 | + inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getContainerCode, containerCode) | |
314 | + .eq(InventoryDetail::getWarehouseCode, warehouseCode) | |
315 | + .eq(InventoryDetail::getLocationCode, fromLocationCode); | |
316 | + List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper); | |
317 | + if(inventoryDetailList.size() != 0) { | |
318 | + for (InventoryDetail inventoryDetail : inventoryDetailList) { | |
319 | + inventoryDetail.setTaskQty(inventoryDetail.getQty()); | |
320 | + } | |
321 | + success = inventoryDetailService.updateBatchById(inventoryDetailList); | |
322 | + if (!success) { | |
323 | + throw new ServiceException("创建出库查看任务时,更新库存详情失败"); | |
324 | + } | |
325 | + } | |
326 | + success = locationService.updateStatus(fromLocationCode, | |
327 | + QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); | |
328 | + if(!success) { | |
329 | + throw new ServiceException("创建出库查看任务时,更新库位状态失败"); | |
330 | + } | |
331 | + success = containerService.updateStatus(containerCode, | |
332 | + QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); | |
333 | + if(!success) { | |
334 | + throw new ServiceException("创建出库查看任务时,更新容器状态失败"); | |
335 | + } | |
336 | + TaskHeader taskHeader = new TaskHeader(); | |
337 | + taskHeader.setWarehouseCode(warehouseCode); | |
338 | + taskHeader.setTaskType(QuantityConstant.TASK_TYPE_CHECK_OUT); | |
339 | + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_CYCLECOUNT); | |
340 | + taskHeader.setContainerCode(containerCode); | |
341 | + taskHeader.setZoneCode(zoneCode); | |
342 | + taskHeader.setFromLocationCode(fromLocationCode); | |
343 | + taskHeader.setToPortCode(toPortCode); | |
344 | + String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_LOCATION); | |
345 | + int taskLocationRule = Integer.parseInt(value); | |
346 | + if (taskLocationRule == QuantityConstant.RULE_TASK_SET_LOCATION) { | |
347 | + taskHeader.setToLocationCode(fromLocationCode); | |
348 | + } | |
349 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); | |
350 | + success = taskHeaderService.save(taskHeader); | |
351 | + if(!success) { | |
352 | + throw new ServiceException("创建出库查看任务时, 创建任务失败"); | |
353 | + } | |
354 | + return Result.OK("创建出库查看任务成功"); | |
355 | + } | |
356 | + | |
357 | + @Override | |
358 | + @Transactional(rollbackFor = Exception.class) | |
359 | + public Result createOverStationTask(String containerCode, String fromPortCode, | |
360 | + String toPortCode, String warehouseCode) { | |
361 | + if(StringUtils.isEmpty(containerCode)) { | |
362 | + return Result.error("创建跨站任务时,容器号为空"); | |
363 | + } | |
364 | + if(StringUtils.isEmpty(fromPortCode)) { | |
365 | + return Result.error("创建跨站任务时,起始站台号为空"); | |
366 | + } | |
367 | + if(StringUtils.isEmpty(toPortCode)) { | |
368 | + return Result.error("创建跨站任务时,目标站台号为空"); | |
369 | + } | |
370 | + if(StringUtils.isEmpty(warehouseCode)) { | |
371 | + return Result.error("创建跨站任务时,仓库编码为空"); | |
372 | + } | |
373 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
374 | + if(container == null) { | |
375 | + return Result.error("创建跨站任务时,容器为空"); | |
376 | + } | |
377 | + if(!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { | |
378 | + return Result.error("创建跨站任务时,容器状态不为空托盘"); | |
379 | + } | |
380 | + Port fromPort = portService.getPortByCode(fromPortCode, warehouseCode); | |
381 | + if(fromPort == null) { | |
382 | + return Result.error("创建跨站任务时,起始站台为空"); | |
383 | + } | |
384 | + Port toPort = portService.getPortByCode(toPortCode, warehouseCode); | |
385 | + if(toPort == null) { | |
386 | + return Result.error("创建跨站任务时,目标站台为空"); | |
387 | + } | |
388 | + | |
389 | + TaskHeader taskHeader = new TaskHeader(); | |
390 | + taskHeader.setWarehouseCode(warehouseCode); | |
391 | + taskHeader.setContainerCode(containerCode); | |
392 | + taskHeader.setTaskType(QuantityConstant.TASK_TYPE_OVER_STATION); | |
393 | + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_TRANSFER_POSITION); | |
394 | + taskHeader.setFromPortCode(fromPortCode); | |
395 | + taskHeader.setToPortCode(toPortCode); | |
396 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); | |
397 | + boolean success = taskHeaderService.save(taskHeader); | |
398 | + if(!success) { | |
399 | + return Result.error("创建跨站任务时, 创建任务失败"); | |
400 | + } | |
401 | + success = containerService.updateStatus(containerCode, | |
402 | + QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); | |
403 | + if(!success) { | |
404 | + return Result.error("创建跨站任务时, 更新容器状态失败"); | |
405 | + } | |
406 | + return Result.ok("创建跨站任务成功"); | |
407 | + } | |
408 | + | |
409 | + @Override | |
410 | + @Transactional(rollbackFor = Exception.class) | |
411 | + public Result createManyEmptyInTask(String containerCode, String zoneCode, | |
412 | + String roadWay, String height, String warehouseCode) { | |
413 | + if(StringUtils.isEmpty(containerCode)) { | |
414 | + return Result.error("创建空托盘组入库任务时,容器号为空"); | |
415 | + } | |
416 | + if(StringUtils.isEmpty(zoneCode)) { | |
417 | + return Result.error("创建空托盘组入库任务时,库区编码为空"); | |
418 | + } | |
419 | + if(StringUtils.isEmpty(roadWay)) { | |
420 | + return Result.error("创建空托盘组入库任务时,巷道为空"); | |
421 | + } | |
422 | + if(StringUtils.isEmpty(height)) { | |
423 | + return Result.error("创建空托盘组入库任务时,高度值为空"); | |
424 | + } | |
425 | + if(StringUtils.isEmpty(height)) { | |
426 | + return Result.error("创建空托盘组入库任务时,仓库编码为空"); | |
427 | + } | |
428 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
429 | + if(container == null) { | |
430 | + return Result.error("创建空托盘组入库任务时,没有找到容器"); | |
431 | + } | |
432 | + if (StringUtils.isNotEmpty(container.getLocationCode())) { | |
433 | + return Result.error("容器已在库位" + container.getLocationCode() + "上"); | |
434 | + } | |
435 | + List<Integer> roadWays = new ArrayList<>(); | |
436 | + String[] strList = roadWay.split(","); | |
437 | + for(String str : strList) { | |
438 | + roadWays.add(Integer.parseInt(str)); | |
439 | + } | |
440 | + String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_ALLOCATION); | |
441 | + if (StringUtils.isEmpty(value)) { | |
442 | + return Result.error("未绑定定位规则"); | |
443 | + } | |
444 | + int allocationRule = Integer.parseInt(value); | |
445 | + Zone zone = zoneService.getZoneByCode(zoneCode, warehouseCode); | |
446 | + if(zone == null) { | |
447 | + return Result.error("创建空托盘组入库任务时,没有找到库区"); | |
448 | + } | |
449 | + TaskHeader taskHeader = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); | |
450 | + if(taskHeader != null) { | |
451 | + return Result.ok("创建空托盘组入库任务时, 已经生成空托盘组任务"); | |
452 | + } | |
453 | + List<LocationType> locationTypeList = locationTypeService. | |
454 | + getLocationTypeListByZoneCode(zoneCode, warehouseCode); | |
455 | + if(locationTypeList.size() == 0) { | |
456 | + return Result.error("创建空托盘组入库任务时,没有找到库位类型"); | |
457 | + } | |
458 | + List<String> locationTypeCodeList = locationTypeList.stream(). | |
459 | + map(t -> t.getCode()).collect(Collectors.toList()); | |
460 | + int highHeight = Float.valueOf(height).intValue(); | |
461 | + LocationHigh locationHigh = locationHighService. | |
462 | + getLocationHighByHighLevel(highHeight, locationTypeCodeList, warehouseCode); | |
463 | + if(locationHigh == null) { | |
464 | + return Result.error("创建空托盘组入库任务时,没有获取到库位高度"); | |
465 | + } | |
466 | + int high = locationHigh.getHigh(); | |
467 | + String toLocationCode = allocationService.allocation(allocationRule, locationTypeCodeList, high, zoneCode, | |
468 | + roadWays, warehouseCode, containerCode, null); | |
469 | + if(StringUtils.isEmpty(toLocationCode)) { | |
470 | + throw new ServiceException("创建空托盘组入库任务时,目标库位为空"); | |
471 | + } | |
472 | + Result result = createManyEmptyIn(containerCode, toLocationCode, warehouseCode); | |
473 | + if(!result.isSuccess()) { | |
474 | + throw new ServiceException(result.getMessage()); | |
475 | + } | |
476 | + return Result.ok("创建空托盘组入库任务成功"); | |
477 | + } | |
478 | + | |
479 | + @Override | |
480 | + @Transactional(rollbackFor = Exception.class) | |
481 | + public Result createManyEmptyIn(String containerCode, String toLocationCode, String warehouseCode) { | |
482 | + if(StringUtils.isEmpty(containerCode)) { | |
483 | + return Result.error("创建空托盘组入库任务时,容器号为空"); | |
484 | + } | |
485 | + if(StringUtils.isEmpty(warehouseCode)) { | |
486 | + return Result.error("创建空托盘组入库任务时,仓库编码为空"); | |
487 | + } | |
488 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
489 | + if(container == null) { | |
490 | + return Result.error("创建空托盘组入库任务时,没有找到容器"); | |
491 | + } | |
492 | + if (StringUtils.isNotEmpty(container.getLocationCode())) { | |
493 | + return Result.error("创建空托盘组入库任务时, 容器已在库位" + container.getLocationCode() + "上"); | |
494 | + } | |
495 | + if (!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { | |
496 | + return Result.error("创建空托盘组入库任务时,容器状态不为空容器"); | |
497 | + } | |
498 | + boolean success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); | |
499 | + if(!success) { | |
500 | + throw new ServiceException("创建空托盘组入库任务时, 更新容器状态失败"); | |
501 | + } | |
502 | + if(StringUtils.isNotEmpty(toLocationCode)) { | |
503 | + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); | |
504 | + if (toLocation == null) { | |
505 | + return Result.error("创建空托盘组入库任务时,没有找到目标库位"); | |
506 | + } | |
507 | + if (toLocation.getStatus() != QuantityConstant.STATUS_LOCATION_EMPTY) { | |
508 | + return Result.error("创建空托盘组入库任务时,目标库位状态不是空闲"); | |
509 | + } | |
510 | + success = locationService.updateStatus(toLocationCode, QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); | |
511 | + if (!success) { | |
512 | + throw new ServiceException("创建空托盘组入库任务时, 更新库位状态失败"); | |
513 | + } | |
514 | + } | |
515 | + TaskHeader taskHeader = new TaskHeader(); | |
516 | + taskHeader.setWarehouseCode(warehouseCode); | |
517 | + taskHeader.setContainerCode(containerCode); | |
518 | + taskHeader.setTaskType(QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT); | |
519 | + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); | |
520 | + taskHeader.setToLocationCode(toLocationCode); | |
521 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); | |
522 | + success =taskHeaderService.save(taskHeader); | |
523 | + if(!success) { | |
524 | + throw new ServiceException("创建空托盘组入库任务时, 创建任务失败"); | |
525 | + } | |
526 | + return Result.ok("创建空托盘组入库任务成功"); | |
527 | + } | |
528 | + | |
529 | + @Override | |
530 | + @Transactional(rollbackFor = Exception.class) | |
531 | + public Result createManyEmptyOutTask(String zoneCode, String toPortCode, String warehouseCode) { | |
532 | + if(StringUtils.isEmpty(toPortCode)) { | |
533 | + return Result.error("创建空托盘组出库任务时,目标出入口为空"); | |
534 | + } | |
535 | + if(StringUtils.isEmpty(zoneCode)) { | |
536 | + return Result.error("创建空托盘组出库任务时,库区编码为空"); | |
537 | + } | |
538 | + if(StringUtils.isEmpty(warehouseCode)) { | |
539 | + return Result.error("创建空托盘组出库任务时,仓库编码为空"); | |
540 | + } | |
541 | + List<Container> containerList = containerService.getContainerListByStatus( | |
542 | + QuantityConstant.STATUS_CONTAINER_MANY, warehouseCode); | |
543 | + if(containerList.size() == 0) { | |
544 | + return Result.error("创建空托盘组出库任务时,没有找到空托盘组"); | |
545 | + } | |
546 | + List<Container> removeContainerList = new ArrayList<>(); | |
547 | + if(containerList.size() > 0) { | |
548 | + for(Container container : containerList) { | |
549 | + String locationCode = container.getLocationCode(); | |
550 | + Location location = locationService.getLocationByCode(locationCode, warehouseCode); | |
551 | + if(!location.getZoneCode().equals(zoneCode)) { | |
552 | + removeContainerList.add(container); | |
553 | + } | |
554 | + } | |
555 | + } | |
556 | + boolean success = containerList.removeAll(removeContainerList); | |
557 | + if(!success) { | |
558 | + throw new ServiceException("创建空托盘组出库任务时,删除不符合的空托盘组失败"); | |
559 | + } | |
560 | + if(containerList.size() <= 0) { | |
561 | + throw new ServiceException("没有找到合适的空托盘组!"); | |
562 | + } | |
563 | + String containerCode = containerList.get(0).getCode(); | |
564 | + TaskHeader taskHeader = taskHeaderService.getUnCompleteTaskByContainerCode(containerCode, warehouseCode); | |
565 | + if(taskHeader != null) { | |
566 | + return Result.ok("创建空托盘组出库任务时, 已经生成空托盘组出库任务"); | |
567 | + } | |
568 | + Result result = createManyEmptyOut(containerCode, toPortCode, warehouseCode); | |
569 | + if(!result.isSuccess()) { | |
570 | + throw new ServiceException(result.getMessage()); | |
571 | + } | |
572 | + return Result.ok("创建空托盘组出库任务成功"); | |
573 | + } | |
574 | + | |
575 | + @Override | |
576 | + @Transactional(rollbackFor = Exception.class) | |
577 | + public Result createManyEmptyOut(String containerCode, String toPortCode, String warehouseCode) { | |
578 | + if(StringUtils.isEmpty(containerCode)) { | |
579 | + return Result.error("创建空托盘组出库任务时,托盘号为空"); | |
580 | + } | |
581 | + if(StringUtils.isEmpty(toPortCode)) { | |
582 | + return Result.error("创建空托盘组出库任务时,目标出入口为空"); | |
583 | + } | |
584 | + if(StringUtils.isEmpty(warehouseCode)) { | |
585 | + return Result.error("创建空托盘组出库任务时,仓库编码为空"); | |
586 | + } | |
587 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
588 | + if(container == null) { | |
589 | + return Result.error("创建空托盘组出库任务时, 没有找到容器:" + containerCode); | |
590 | + } | |
591 | + if(!QuantityConstant.STATUS_CONTAINER_MANY.equals(container.getStatus())) { | |
592 | + return Result.error("创建空托盘组出库任务时, 容器状态不为空托盘组状态"); | |
593 | + } | |
594 | + String fromLocationCode = container.getLocationCode(); | |
595 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
596 | + return Result.error("创建空托盘组出库任务时, 该容器不在库位上"); | |
597 | + } | |
598 | + Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); | |
599 | + if(fromLocation == null) { | |
600 | + return Result.error("创建空托盘组出库任务时, 没有找到库位:" + fromLocationCode); | |
601 | + } | |
602 | + String zoneCode = fromLocation.getZoneCode(); | |
603 | + if(StringUtils.isEmpty(zoneCode)) { | |
604 | + return Result.error("创建空托盘组出库任务时, 库区为空"); | |
605 | + } | |
606 | + boolean success = containerService.updateStatus(containerCode, | |
607 | + QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); | |
608 | + if (!success) { | |
609 | + throw new ServiceException("创建空托盘组出库任务时, 更新容器状态失败"); | |
610 | + } | |
611 | + success = locationService.updateStatus(fromLocationCode, | |
612 | + QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); | |
613 | + if (!success) { | |
614 | + throw new ServiceException("创建空托盘组出库任务时, 更新库位状态失败"); | |
615 | + } | |
616 | + TaskHeader taskHeader = new TaskHeader(); | |
617 | + taskHeader.setWarehouseCode(warehouseCode); | |
618 | + taskHeader.setZoneCode(zoneCode); | |
619 | + taskHeader.setContainerCode(containerCode); | |
620 | + taskHeader.setTaskType(QuantityConstant.TASK_TYPE_MANY_EMPTYSHIPMENT); | |
621 | + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT); | |
622 | + taskHeader.setFromLocationCode(fromLocationCode); | |
623 | + taskHeader.setToPortCode(toPortCode); | |
624 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); | |
625 | + success = taskHeaderService.save(taskHeader); | |
626 | + if(!success) { | |
627 | + throw new ServiceException("创建空托盘组出库任务时,生成任务失败"); | |
628 | + } | |
629 | + return Result.ok("创建空托盘组出库任务成功"); | |
278 | 630 | } |
279 | 631 | |
280 | 632 | @Override |
... | ... | @@ -306,6 +658,26 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
306 | 658 | return taskHeader; |
307 | 659 | } |
308 | 660 | |
661 | + @Override | |
662 | + public TaskHeader getUnCompleteTaskByContainerCode(String containerCode, String warehouseCode) { | |
663 | + LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
664 | + taskHeaderLambdaQueryWrapper.eq(TaskHeader::getContainerCode, containerCode) | |
665 | + .eq(TaskHeader::getWarehouseCode, warehouseCode) | |
666 | + .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED); | |
667 | + TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper); | |
668 | + return taskHeader; | |
669 | + } | |
670 | + | |
671 | + @Override | |
672 | + public TaskHeader getUnCompleteTaskByPreTaskNo(int preTaskNo, String warehouseCode) { | |
673 | + LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
674 | + taskHeaderLambdaQueryWrapper.eq(TaskHeader::getPreTaskNo, preTaskNo) | |
675 | + .eq(TaskHeader::getWarehouseCode, warehouseCode) | |
676 | + .lt(TaskHeader::getStatus, QuantityConstant.TASK_STATUS_COMPLETED); | |
677 | + TaskHeader taskHeader = taskHeaderService.getOne(taskHeaderLambdaQueryWrapper); | |
678 | + return taskHeader; | |
679 | + } | |
680 | + | |
309 | 681 | /** |
310 | 682 | * WMS完成任务 |
311 | 683 | */ |
... | ... | @@ -319,12 +691,14 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
319 | 691 | if (taskHeader.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) { |
320 | 692 | return Result.ok("任务(" +taskId + ")任务已经是完成的!"); |
321 | 693 | } |
322 | - if (StringUtils.isEmpty(taskHeader.getFromLocationCode()) | |
323 | - && StringUtils.isEmpty(taskHeader.getToLocationCode())) { | |
324 | - return Result.error("任务" + taskId + "没有库位,执行中止"); | |
694 | + int taskType = taskHeader.getTaskType().intValue(); | |
695 | + if(taskType != QuantityConstant.TASK_TYPE_OVER_STATION) { | |
696 | + if (StringUtils.isEmpty(taskHeader.getFromLocationCode()) | |
697 | + && StringUtils.isEmpty(taskHeader.getToLocationCode())) { | |
698 | + return Result.error("任务" + taskId + "没有库位,执行中止"); | |
699 | + } | |
325 | 700 | } |
326 | 701 | Result result = null; |
327 | - int taskType = taskHeader.getTaskType().intValue(); | |
328 | 702 | switch (taskType) { |
329 | 703 | //整盘入库、补充入库 |
330 | 704 | case QuantityConstant.TASK_TYPE_WHOLERECEIPT: |
... | ... | @@ -335,6 +709,65 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
335 | 709 | case QuantityConstant.TASK_TYPE_SORTINGSHIPMENT: |
336 | 710 | result = completeShipmentTask(taskHeader); |
337 | 711 | break; |
712 | + case QuantityConstant.TASK_TYPE_EMPTYRECEIPT: | |
713 | + result = completeEmptyInTask(taskHeader); | |
714 | + break; | |
715 | + case QuantityConstant.TASK_TYPE_EMPTYSHIPMENT: | |
716 | + result = completeEmptyOutTask(taskHeader); | |
717 | + break; | |
718 | + case QuantityConstant.TASK_TYPE_TRANSFER: | |
719 | + result = completeTransferTask(taskHeader); | |
720 | + break; | |
721 | + case QuantityConstant.TASK_TYPE_CHECK_OUT: | |
722 | + result = completeCheckOutTask(taskHeader); | |
723 | + break; | |
724 | + case QuantityConstant.TASK_TYPE_OVER_STATION: | |
725 | + result = completeOverStationTask(taskHeader); | |
726 | + break; | |
727 | + case QuantityConstant.TASK_TYPE_MANY_EMPTYRECEIPT: | |
728 | + result = completeManyEmptyInTask(taskHeader); | |
729 | + break; | |
730 | + case QuantityConstant.TASK_TYPE_MANY_EMPTYSHIPMENT: | |
731 | + result = completeManyEmptyOutTask(taskHeader); | |
732 | + break; | |
733 | + default: | |
734 | + throw new ServiceException("不支持的任务类型" + taskType); | |
735 | + } | |
736 | + return result; | |
737 | + } | |
738 | + | |
739 | + @Override | |
740 | + public Result cancelTask(Integer taskId) { | |
741 | + TaskHeader taskHeader = getById(taskId); | |
742 | + if(taskHeader == null) { | |
743 | + return Result.error("任务" + taskId + "未找到,执行中止"); | |
744 | + } | |
745 | + if (taskHeader.getStatus().equals(QuantityConstant.TASK_STATUS_COMPLETED)) { | |
746 | + return Result.ok("任务(" +taskId + ")任务已经是完成的!"); | |
747 | + } | |
748 | + int taskType = taskHeader.getTaskType().intValue(); | |
749 | + int preTaskNo = taskId; | |
750 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
751 | + TaskHeader preTaskHeader = getUnCompleteTaskByPreTaskNo(preTaskNo, warehouseCode); | |
752 | + if (preTaskHeader != null) { | |
753 | + return Result.error("取消任务失败,有前置任务" + preTaskHeader.getId()); | |
754 | + } | |
755 | + boolean success = taskHeaderService.removeById(taskId); | |
756 | + if(!success) { | |
757 | + return Result.error("取消任务失败, 删除任务失败"); | |
758 | + } | |
759 | + Result result = null; | |
760 | + switch (taskType) { | |
761 | + case QuantityConstant.TASK_TYPE_WHOLERECEIPT: | |
762 | + case QuantityConstant.TASK_TYPE_SUPPLEMENTRECEIPT: | |
763 | + cancelLocationAndContainerStatus(taskHeader); | |
764 | + result = cancelReceiptTask(taskHeader); | |
765 | + break; | |
766 | + case QuantityConstant.TASK_TYPE_WHOLESHIPMENT: | |
767 | + case QuantityConstant.TASK_TYPE_SORTINGSHIPMENT: | |
768 | + cancelLocationAndContainerStatus(taskHeader); | |
769 | + result = cancelShipmentTask(taskHeader); | |
770 | + break; | |
338 | 771 | default: |
339 | 772 | throw new ServiceException("不支持的任务类型" + taskType); |
340 | 773 | } |
... | ... | @@ -342,6 +775,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
342 | 775 | } |
343 | 776 | |
344 | 777 | @Override |
778 | + @Transactional(rollbackFor = Exception.class) | |
345 | 779 | public Result sendTaskToWcs(Integer taskId) { |
346 | 780 | TaskHeader taskHeader = taskHeaderService.getById(taskId); |
347 | 781 | if(taskHeader == null) { |
... | ... | @@ -363,64 +797,141 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
363 | 797 | return Result.ok("执行下发任务成功"); |
364 | 798 | } |
365 | 799 | |
800 | + /** | |
801 | + * 创建空托盘入库 | |
802 | + * 1. 判断托盘号、库位号是否满足要求 | |
803 | + * 2. 创建任务,锁定容器、库位 | |
804 | + * @param containerCode | |
805 | + * @param toLocationCode | |
806 | + * @param warehouseCode | |
807 | + * @return | |
808 | + */ | |
809 | + @Override | |
366 | 810 | @Transactional(rollbackFor = Exception.class) |
367 | - public boolean combineInventoryDetail(TaskHeader taskHeader) { | |
368 | - boolean success = false; | |
369 | - String warehouseCode = taskHeader.getWarehouseCode(); | |
370 | - String containerCode = taskHeader.getContainerCode(); | |
371 | - | |
372 | - InventoryHeader inventoryHeader = inventoryHeaderService. | |
373 | - getInventoryHeaderByContainerCode(containerCode, warehouseCode); | |
374 | - if(inventoryHeader == null) { | |
375 | - throw new ServiceException("合并库存时, 没有找到库存头"); | |
376 | - } | |
377 | - List<InventoryDetail> inventoryDetailList = inventoryDetailService. | |
378 | - getInventoryDetailListByInventoryHeaderId(inventoryHeader.getId()); | |
379 | - if(inventoryDetailList.size() == 0) { | |
380 | - throw new ServiceException("合并库存时, 没有找到库存详情"); | |
381 | - } | |
382 | -// if(inventoryDetailList.size() == 1) { | |
383 | -// return true; | |
384 | -// } | |
385 | - for (int i = 0; i < inventoryDetailList.size() - 1; i++) { | |
386 | - for (int j = inventoryDetailList.size() - 1; j > i; j--) { | |
387 | - InventoryDetail inventoryDetail1 = inventoryDetailList.get(i); | |
388 | - InventoryDetail inventoryDetail2 = inventoryDetailList.get(j); | |
389 | - if (inventoryDetail1.getMaterialCode().equals(inventoryDetail2.getMaterialCode()) | |
390 | - && inventoryDetail1.getBatch().equals(inventoryDetail2.getBatch()) | |
391 | - && inventoryDetail1.getLot().equals(inventoryDetail2.getLot()) | |
392 | - && inventoryDetail1.getProject().equals(inventoryDetail2.getProject())) { | |
393 | - BigDecimal totalQty = inventoryDetail1.getQty().add(inventoryDetail2.getQty()); | |
394 | - inventoryDetail1.setQty(totalQty); | |
395 | - success = inventoryDetailService.updateById(inventoryDetail1); | |
396 | - if(!success) { | |
397 | - throw new ServiceException("合并库存时, 更新库存详情失败:" + inventoryDetail1.getId()); | |
398 | - } | |
399 | - success = inventoryDetailService.removeById(inventoryDetail2.getId()); | |
400 | - if(!success) { | |
401 | - throw new ServiceException("合并库存时, 删除库存详情失败:" + inventoryDetail2.getId()); | |
402 | - } | |
403 | - inventoryDetailList.remove(j); | |
404 | - } | |
405 | - } | |
811 | + public Result createEmptyIn(String containerCode, String toLocationCode, String warehouseCode) { | |
812 | + if(StringUtils.isEmpty(containerCode)) { | |
813 | + return Result.error("创建空托盘入库时, 托盘号为空"); | |
406 | 814 | } |
407 | - BigDecimal totalQty = new BigDecimal(0); | |
408 | - int totalLines = 0; | |
409 | - for (InventoryDetail inventoryDetail : inventoryDetailList) { | |
410 | - totalQty = totalQty.add(inventoryDetail.getQty()); | |
411 | - totalLines++; | |
815 | + if(StringUtils.isEmpty(warehouseCode)) { | |
816 | + return Result.error("创建空托盘入库时, 仓库编码为空"); | |
412 | 817 | } |
413 | 818 | Container container = containerService.getContainerByCode(containerCode, warehouseCode); |
414 | 819 | if(container == null) { |
415 | - throw new ServiceException("合并库存时, 没有找到容器, 容器号为" + containerCode); | |
820 | + return Result.error("创建空托盘入库时, 没有找到托盘" + containerCode); | |
416 | 821 | } |
417 | - inventoryHeader.setTotalQty(totalQty); | |
418 | - inventoryHeader.setTotalLines(totalLines); | |
419 | - inventoryHeader.setContainerStatus(container.getStatus()); | |
420 | - success = inventoryHeaderService.updateById(inventoryHeader); | |
421 | - return success; | |
422 | - } | |
423 | - /** | |
822 | + if(!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { | |
823 | + return Result.error("创建空托盘入库时, 托盘状态并非空托盘状态"); | |
824 | + } | |
825 | + if (StringUtils.isNotEmpty(container.getLocationCode())) { | |
826 | + return Result.error("创建空托盘入库时, 容器已在库位" + container.getLocationCode() + "上"); | |
827 | + } | |
828 | + | |
829 | + if (StringUtils.isNotEmpty(toLocationCode)) { | |
830 | + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); | |
831 | + if (toLocation == null) { | |
832 | + return Result.error("创建空托盘入库时," + toLocationCode + "目标库位不存在" ); | |
833 | + } | |
834 | + if (StringUtils.isNotEmpty(toLocation.getContainerCode())) { | |
835 | + return Result.error("创建空托盘入库时," + toLocationCode+"上已存在容器" + toLocation.getContainerCode()); | |
836 | + } | |
837 | + if (!QuantityConstant.STATUS_LOCATION_EMPTY.equals(toLocation.getStatus())) { | |
838 | + return Result.error("创建空托盘入库时, 目标库位非空闲"); | |
839 | + } | |
840 | + boolean success = locationService.updateStatus(toLocationCode, | |
841 | + QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); | |
842 | + if(!success) { | |
843 | + throw new ServiceException("创建空托盘入库时,更新库位状态失败"); | |
844 | + } | |
845 | + } | |
846 | + | |
847 | + boolean success = containerService.updateStatus(containerCode, | |
848 | + QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); | |
849 | + if(!success) { | |
850 | + throw new ServiceException("创建空托盘入库时,更新容器状态失败"); | |
851 | + } | |
852 | + TaskHeader taskHeader = new TaskHeader(); | |
853 | + taskHeader.setWarehouseCode(warehouseCode); | |
854 | + taskHeader.setContainerCode(containerCode); | |
855 | + taskHeader.setTaskType(QuantityConstant.TASK_TYPE_EMPTYRECEIPT); | |
856 | + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_RECEIPT); | |
857 | + taskHeader.setToLocationCode(toLocationCode); | |
858 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); | |
859 | + success = taskHeaderService.save(taskHeader); | |
860 | + if(!success) { | |
861 | + throw new ServiceException("创建空托盘入库时,保存任务失败"); | |
862 | + } | |
863 | + return Result.OK("创建空托盘入库任务成功"); | |
864 | + } | |
865 | + | |
866 | + /** | |
867 | + * 创建空托盘出库 | |
868 | + * @param containerCode | |
869 | + * @param toPortCode | |
870 | + * @param warehouseCode | |
871 | + * @return | |
872 | + */ | |
873 | + @Override | |
874 | + @Transactional(rollbackFor = Exception.class) | |
875 | + public Result createEmptyOut(String containerCode, String toPortCode, String warehouseCode) { | |
876 | + if(StringUtils.isEmpty(containerCode)) { | |
877 | + return Result.error("创建空托盘出库时, 托盘号为空"); | |
878 | + } | |
879 | + if(StringUtils.isEmpty(toPortCode)) { | |
880 | + return Result.error("创建空托盘出库时, 出库口为空"); | |
881 | + } | |
882 | + if(StringUtils.isEmpty(warehouseCode)) { | |
883 | + return Result.error("创建空托盘出库时, 仓库编码为空"); | |
884 | + } | |
885 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
886 | + if(container == null) { | |
887 | + return Result.error("创建空托盘出库时, 没有找到托盘" + containerCode); | |
888 | + } | |
889 | + if(!container.getStatus().equals(QuantityConstant.STATUS_CONTAINER_EMPTY)) { | |
890 | + return Result.error("创建空托盘出库时, 托盘状态并非空托盘状态"); | |
891 | + } | |
892 | + String fromLocationCode = container.getLocationCode(); | |
893 | + if (StringUtils.isEmpty(fromLocationCode)) { | |
894 | + return Result.error("创建空托盘出库时, 容器不在库位上"); | |
895 | + } | |
896 | + Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); | |
897 | + if(fromLocation == null) { | |
898 | + return Result.error("创建空托盘出库时, 起始库位为空"); | |
899 | + } | |
900 | + String zoneCode = fromLocation.getZoneCode(); | |
901 | + if (StringUtils.isEmpty(zoneCode)) { | |
902 | + return Result.error("创建空托盘出库时, 起始库位的库区为空"); | |
903 | + } | |
904 | + Port port = portService.getPortByCode(toPortCode, zoneCode, warehouseCode); | |
905 | + if(port == null) { | |
906 | + return Result.error("创建空托盘出库时, 没有找到出库口" + toPortCode); | |
907 | + } | |
908 | + boolean success = locationService.updateStatus(fromLocationCode, | |
909 | + QuantityConstant.STATUS_LOCATION_LOCK, warehouseCode); | |
910 | + if(!success) { | |
911 | + throw new ServiceException("创建空托盘出库时,更新库位状态失败"); | |
912 | + } | |
913 | + success = containerService.updateStatus(containerCode, | |
914 | + QuantityConstant.STATUS_CONTAINER_LOCK, warehouseCode); | |
915 | + if(!success) { | |
916 | + throw new ServiceException("创建空托盘出库时,更新容器状态失败"); | |
917 | + } | |
918 | + TaskHeader taskHeader = new TaskHeader(); | |
919 | + taskHeader.setWarehouseCode(warehouseCode); | |
920 | + taskHeader.setZoneCode(zoneCode); | |
921 | + taskHeader.setContainerCode(containerCode); | |
922 | + taskHeader.setTaskType(QuantityConstant.TASK_TYPE_EMPTYSHIPMENT); | |
923 | + taskHeader.setInnernalTaskType(QuantityConstant.TASK_INTENERTYPE_SHIPMENT); | |
924 | + taskHeader.setFromLocationCode(fromLocationCode); | |
925 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_BUILD); | |
926 | + taskHeader.setToPortCode(toPortCode); | |
927 | + success = taskHeaderService.save(taskHeader); | |
928 | + if(!success) { | |
929 | + throw new ServiceException("创建空托盘出库时,保存任务失败"); | |
930 | + } | |
931 | + return Result.OK("创建空托盘出库任务成功"); | |
932 | + } | |
933 | + | |
934 | + /** | |
424 | 935 | * 完成入库任务 |
425 | 936 | * @param taskHeader 任务 |
426 | 937 | * @return AjaxResult 完成入库任务结果 |
... | ... | @@ -520,7 +1031,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
520 | 1031 | inventoryTransaction.setWarehouseCode(taskDetail.getWarehouseCode()); |
521 | 1032 | inventoryTransaction.setCompanyCode(taskDetail.getCompanyCode()); |
522 | 1033 | inventoryTransaction.setContainerCode(containerCode); |
523 | - inventoryTransaction.setLocationCode(toLocationCode); | |
1034 | + inventoryTransaction.setToLocationCode(toLocationCode); | |
524 | 1035 | inventoryTransaction.setMaterialCode(taskDetail.getMaterialCode()); |
525 | 1036 | inventoryTransaction.setMaterialName(taskDetail.getMaterialName()); |
526 | 1037 | inventoryTransaction.setMaterialSpec(taskDetail.getMaterialSpec()); |
... | ... | @@ -673,7 +1184,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
673 | 1184 | inventoryTransaction.setWarehouseCode(warehouseCode); |
674 | 1185 | inventoryTransaction.setCompanyCode(inventoryDetail.getCompanyCode()); |
675 | 1186 | inventoryTransaction.setContainerCode(containerCode); |
676 | - inventoryTransaction.setLocationCode(fromLocationCode); | |
1187 | + inventoryTransaction.setFromLocationCode(fromLocationCode); | |
677 | 1188 | inventoryTransaction.setMaterialCode(inventoryDetail.getMaterialCode()); |
678 | 1189 | inventoryTransaction.setMaterialName(inventoryDetail.getMaterialName()); |
679 | 1190 | inventoryTransaction.setMaterialSpec(inventoryDetail.getMaterialSpec()); |
... | ... | @@ -766,4 +1277,585 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
766 | 1277 | } |
767 | 1278 | return Result.ok("完成出库任务"); |
768 | 1279 | } |
1280 | + | |
1281 | + @Transactional(rollbackFor = Exception.class) | |
1282 | + public boolean combineInventoryDetail(TaskHeader taskHeader) { | |
1283 | + boolean success = false; | |
1284 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1285 | + String containerCode = taskHeader.getContainerCode(); | |
1286 | + | |
1287 | + InventoryHeader inventoryHeader = inventoryHeaderService. | |
1288 | + getInventoryHeaderByContainerCode(containerCode, warehouseCode); | |
1289 | + if(inventoryHeader == null) { | |
1290 | + throw new ServiceException("合并库存时, 没有找到库存头"); | |
1291 | + } | |
1292 | + List<InventoryDetail> inventoryDetailList = inventoryDetailService. | |
1293 | + getInventoryDetailListByInventoryHeaderId(inventoryHeader.getId()); | |
1294 | + if(inventoryDetailList.size() == 0) { | |
1295 | + throw new ServiceException("合并库存时, 没有找到库存详情"); | |
1296 | + } | |
1297 | + for (int i = 0; i < inventoryDetailList.size() - 1; i++) { | |
1298 | + for (int j = inventoryDetailList.size() - 1; j > i; j--) { | |
1299 | + InventoryDetail inventoryDetail1 = inventoryDetailList.get(i); | |
1300 | + InventoryDetail inventoryDetail2 = inventoryDetailList.get(j); | |
1301 | + if (inventoryDetail1.getMaterialCode().equals(inventoryDetail2.getMaterialCode()) | |
1302 | + && inventoryDetail1.getBatch().equals(inventoryDetail2.getBatch()) | |
1303 | + && inventoryDetail1.getLot().equals(inventoryDetail2.getLot()) | |
1304 | + && inventoryDetail1.getProject().equals(inventoryDetail2.getProject())) { | |
1305 | + BigDecimal totalQty = inventoryDetail1.getQty().add(inventoryDetail2.getQty()); | |
1306 | + inventoryDetail1.setQty(totalQty); | |
1307 | + success = inventoryDetailService.updateById(inventoryDetail1); | |
1308 | + if(!success) { | |
1309 | + throw new ServiceException("合并库存时, 更新库存详情失败:" + inventoryDetail1.getId()); | |
1310 | + } | |
1311 | + success = inventoryDetailService.removeById(inventoryDetail2.getId()); | |
1312 | + if(!success) { | |
1313 | + throw new ServiceException("合并库存时, 删除库存详情失败:" + inventoryDetail2.getId()); | |
1314 | + } | |
1315 | + inventoryDetailList.remove(j); | |
1316 | + } | |
1317 | + } | |
1318 | + } | |
1319 | + BigDecimal totalQty = new BigDecimal(0); | |
1320 | + int totalLines = 0; | |
1321 | + for (InventoryDetail inventoryDetail : inventoryDetailList) { | |
1322 | + totalQty = totalQty.add(inventoryDetail.getQty()); | |
1323 | + totalLines++; | |
1324 | + } | |
1325 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1326 | + if(container == null) { | |
1327 | + throw new ServiceException("合并库存时, 没有找到容器, 容器号为" + containerCode); | |
1328 | + } | |
1329 | + inventoryHeader.setTotalQty(totalQty); | |
1330 | + inventoryHeader.setTotalLines(totalLines); | |
1331 | + inventoryHeader.setContainerStatus(container.getStatus()); | |
1332 | + success = inventoryHeaderService.updateById(inventoryHeader); | |
1333 | + return success; | |
1334 | + } | |
1335 | + | |
1336 | + /** | |
1337 | + * 完成空托盘入库任务 | |
1338 | + * @param taskHeader 任务 | |
1339 | + * @return Result 完成入库任务结果 | |
1340 | + */ | |
1341 | + @Transactional(rollbackFor = Exception.class) | |
1342 | + public Result completeEmptyInTask(TaskHeader taskHeader) { | |
1343 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1344 | + String toLocationCode = taskHeader.getToLocationCode(); | |
1345 | + String containerCode = taskHeader.getContainerCode(); | |
1346 | + if(StringUtils.isEmpty(containerCode)) { | |
1347 | + return Result.error("完成空托盘入库任务时, 托盘号为空"); | |
1348 | + } | |
1349 | + if(StringUtils.isEmpty(warehouseCode)) { | |
1350 | + return Result.error("完成空托盘入库任务时, 仓库编码为空"); | |
1351 | + } | |
1352 | + if(StringUtils.isEmpty(toLocationCode)) { | |
1353 | + return Result.error("完成空托盘入库任务时, 目标库位号为空"); | |
1354 | + } | |
1355 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1356 | + if(container == null) { | |
1357 | + return Result.error("完成空托盘入库任务时, 没有找到托盘" + containerCode); | |
1358 | + } | |
1359 | + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); | |
1360 | + if (toLocation == null) { | |
1361 | + return Result.error("完成空托盘入库任务时," + toLocationCode + "目标库位不存在" ); | |
1362 | + } | |
1363 | + boolean success = containerService.updateLocationCodeAndStatus(containerCode, | |
1364 | + toLocationCode, QuantityConstant.STATUS_CONTAINER_EMPTY, warehouseCode); | |
1365 | + if(!success) { | |
1366 | + throw new ServiceException("完成空托盘入库任务时, 更新容器的库位号和状态失败"); | |
1367 | + } | |
1368 | + success = locationService.updateContainerCodeAndStatus(toLocationCode, | |
1369 | + containerCode, QuantityConstant.STATUS_LOCATION_EMPTY,warehouseCode); | |
1370 | + if(!success) { | |
1371 | + throw new ServiceException("完成空托盘入库任务时, 更新库位的容器号和状态失败"); | |
1372 | + } | |
1373 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); | |
1374 | + success = taskHeaderService.updateById(taskHeader); | |
1375 | + if(!success) { | |
1376 | + throw new ServiceException("完成空托盘入库任务时, 更新任务失败"); | |
1377 | + } | |
1378 | + return Result.OK("完成空托盘入库成功"); | |
1379 | + } | |
1380 | + | |
1381 | + /** | |
1382 | + * 完成空托盘出库任务 | |
1383 | + * @param taskHeader 任务 | |
1384 | + * @return Result 完成出库任务结果 | |
1385 | + */ | |
1386 | + @Transactional(rollbackFor = Exception.class) | |
1387 | + public Result completeEmptyOutTask(TaskHeader taskHeader) { | |
1388 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1389 | + String fromLocationCode = taskHeader.getFromLocationCode(); | |
1390 | + String containerCode = taskHeader.getContainerCode(); | |
1391 | + String toPortCode = taskHeader.getToPortCode(); | |
1392 | + String zoneCode = taskHeader.getZoneCode(); | |
1393 | + if(StringUtils.isEmpty(containerCode)) { | |
1394 | + return Result.error("完成空托盘出库任务时, 托盘号为空"); | |
1395 | + } | |
1396 | + if(StringUtils.isEmpty(warehouseCode)) { | |
1397 | + return Result.error("完成空托盘出库任务时, 仓库编码为空"); | |
1398 | + } | |
1399 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
1400 | + return Result.error("完成空托盘出库任务时, 起始库位号为空"); | |
1401 | + } | |
1402 | + if(StringUtils.isEmpty(toPortCode)) { | |
1403 | + return Result.error("完成空托盘出库任务时, 目标出入口号为空"); | |
1404 | + } | |
1405 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1406 | + if(container == null) { | |
1407 | + return Result.error("完成空托盘出库任务时, 没有找到托盘" + containerCode); | |
1408 | + } | |
1409 | + Location fromLocation = locationService.getLocationByCode(fromLocationCode, warehouseCode); | |
1410 | + if (fromLocation == null) { | |
1411 | + return Result.error("完成空托盘出库任务时," + fromLocationCode + "目标库位不存在" ); | |
1412 | + } | |
1413 | + Port port = portService.getPortByCode(toPortCode, zoneCode, warehouseCode); | |
1414 | + if(port == null) { | |
1415 | + return Result.error("完成空托盘出库任务时," + toPortCode + "目标出库口不存在" ); | |
1416 | + } | |
1417 | + boolean success = containerService.updateLocationCodeAndStatus(containerCode, | |
1418 | + QuantityConstant.EMPTY_STRING, QuantityConstant.STATUS_CONTAINER_EMPTY, warehouseCode); | |
1419 | + if(!success) { | |
1420 | + throw new ServiceException("完成空托盘出库任务时, 更新容器的库位号和状态失败"); | |
1421 | + } | |
1422 | + success = locationService.updateContainerCodeAndStatus(fromLocationCode, | |
1423 | + QuantityConstant.EMPTY_STRING, QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1424 | + if(!success) { | |
1425 | + throw new ServiceException("完成空托盘出库任务时, 更新库位的容器号和状态失败"); | |
1426 | + } | |
1427 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); | |
1428 | + success = taskHeaderService.updateById(taskHeader); | |
1429 | + if(!success) { | |
1430 | + throw new ServiceException("完成空托盘出库任务时, 更新任务失败"); | |
1431 | + } | |
1432 | + return Result.OK("完成空托盘出库成功"); | |
1433 | + } | |
1434 | + | |
1435 | + /** | |
1436 | + * 完成移库任务 | |
1437 | + * @param taskHeader 任务 | |
1438 | + * @return Result 完成移库任务结果 | |
1439 | + */ | |
1440 | + @Transactional(rollbackFor = Exception.class) | |
1441 | + public Result completeTransferTask(TaskHeader taskHeader) { | |
1442 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1443 | + String containerCode = taskHeader.getContainerCode(); | |
1444 | + String fromLocationCode = taskHeader.getFromLocationCode(); | |
1445 | + String toLocationCode = taskHeader.getToLocationCode(); | |
1446 | + | |
1447 | + if(StringUtils.isEmpty(containerCode)) { | |
1448 | + return Result.error("完成移库任务时, 托盘号为空"); | |
1449 | + } | |
1450 | + if(StringUtils.isEmpty(warehouseCode)) { | |
1451 | + return Result.error("完成移库任务时, 仓库编码为空"); | |
1452 | + } | |
1453 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
1454 | + return Result.error("完成移库任务时, 起始库位号为空"); | |
1455 | + } | |
1456 | + if(StringUtils.isEmpty(toLocationCode)) { | |
1457 | + return Result.error("完成移库任务时, 目标库位号为空"); | |
1458 | + } | |
1459 | + | |
1460 | + List<InventoryTransaction> inventoryTransactionList = new ArrayList<>(); | |
1461 | + LambdaUpdateWrapper<InventoryDetail> inventoryDetailLambdaUpdateWrapper = Wrappers.lambdaUpdate(); | |
1462 | + inventoryDetailLambdaUpdateWrapper.eq(InventoryDetail::getWarehouseCode, warehouseCode) | |
1463 | + .eq(InventoryDetail::getContainerCode, containerCode) | |
1464 | + .eq(InventoryDetail::getLocationCode, fromLocationCode); | |
1465 | + List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaUpdateWrapper); | |
1466 | + for(InventoryDetail inventoryDetail : inventoryDetailList) { | |
1467 | + inventoryDetail.setLocationCode(toLocationCode); | |
1468 | + InventoryTransaction inventoryTransaction = new InventoryTransaction(); | |
1469 | + inventoryTransaction.setWarehouseCode(inventoryDetail.getWarehouseCode()); | |
1470 | + inventoryTransaction.setContainerCode(inventoryDetail.getContainerCode()); | |
1471 | + inventoryTransaction.setCompanyCode(inventoryDetail.getCompanyCode()); | |
1472 | + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_TRANSFER); | |
1473 | + inventoryTransaction.setFromLocationCode(fromLocationCode); | |
1474 | + inventoryTransaction.setToLocationCode(toLocationCode); | |
1475 | + inventoryTransaction.setMaterialCode(inventoryDetail.getMaterialCode()); | |
1476 | + inventoryTransaction.setMaterialName(inventoryDetail.getMaterialName()); | |
1477 | + inventoryTransaction.setMaterialSpec(inventoryDetail.getMaterialSpec()); | |
1478 | + inventoryTransaction.setMaterialUnit(inventoryDetail.getMaterialUnit()); | |
1479 | + inventoryTransaction.setQty(inventoryDetail.getQty()); | |
1480 | + inventoryTransaction.setInventoryStatus(inventoryDetail.getInventoryStatus()); | |
1481 | + inventoryTransaction.setBatch(inventoryDetail.getBatch()); | |
1482 | + inventoryTransaction.setProject(inventoryDetail.getProject()); | |
1483 | + inventoryTransaction.setLot(inventoryDetail.getLot()); | |
1484 | + inventoryTransactionList.add(inventoryTransaction); | |
1485 | + } | |
1486 | + boolean success = false; | |
1487 | + if(inventoryTransactionList.size() > 0) { | |
1488 | + success = inventoryTransactionService.saveBatch(inventoryTransactionList); | |
1489 | + if (!success) { | |
1490 | + throw new ServiceException("完成移库任务时,保存库存交易失败"); | |
1491 | + } | |
1492 | + } | |
1493 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); | |
1494 | + success = taskHeaderService.updateById(taskHeader); | |
1495 | + if(!success) { | |
1496 | + throw new ServiceException("完成移库任务时, 更新任务失败"); | |
1497 | + } | |
1498 | + if(inventoryDetailList.size() > 0) { | |
1499 | + success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, | |
1500 | + QuantityConstant.STATUS_CONTAINER_SOME, warehouseCode); | |
1501 | + if(!success) { | |
1502 | + throw new ServiceException("完成移库任务时, 更新容器状态失败"); | |
1503 | + } | |
1504 | + } else { | |
1505 | + success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, | |
1506 | + QuantityConstant.STATUS_CONTAINER_EMPTY, warehouseCode); | |
1507 | + if(!success) { | |
1508 | + throw new ServiceException("完成移库任务时, 更新容器状态失败"); | |
1509 | + } | |
1510 | + } | |
1511 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1512 | + container.setLastStatus(QuantityConstant.EMPTY_STRING); | |
1513 | + success = containerService.updateById(container); | |
1514 | + if(!success) { | |
1515 | + throw new ServiceException("完成移库任务时, 更新容器状态失败"); | |
1516 | + } | |
1517 | + success = locationService.updateContainerCodeAndStatus(fromLocationCode, QuantityConstant.EMPTY_STRING, | |
1518 | + QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1519 | + if(!success) { | |
1520 | + throw new ServiceException("完成移库任务时, 更新起始库位状态失败"); | |
1521 | + } | |
1522 | + success = locationService.updateContainerCodeAndStatus(toLocationCode, containerCode, | |
1523 | + QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1524 | + if(!success) { | |
1525 | + throw new ServiceException("完成移库任务时, 更新目标库位状态失败"); | |
1526 | + } | |
1527 | + LambdaUpdateWrapper<InventoryHeader> inventoryHeaderLambdaUpdateWrapper = Wrappers.lambdaUpdate(); | |
1528 | + inventoryHeaderLambdaUpdateWrapper.eq(InventoryHeader::getWarehouseCode, warehouseCode) | |
1529 | + .eq(InventoryHeader::getContainerCode, containerCode) | |
1530 | + .eq(InventoryHeader::getLocationCode, fromLocationCode); | |
1531 | + InventoryHeader inventoryHeader = inventoryHeaderService.getOne(inventoryHeaderLambdaUpdateWrapper); | |
1532 | + if(inventoryHeader != null) { | |
1533 | + inventoryHeader.setLocationCode(toLocationCode); | |
1534 | + success = inventoryHeaderService.updateById(inventoryHeader); | |
1535 | + if(!success) { | |
1536 | + throw new ServiceException("完成移库任务时, 更新库存头失败"); | |
1537 | + } | |
1538 | + } | |
1539 | + if(inventoryDetailList.size() != 0) { | |
1540 | + success = inventoryDetailService.updateBatchById(inventoryDetailList); | |
1541 | + if(!success) { | |
1542 | + throw new ServiceException("完成移库任务时, 更新库存详情失败"); | |
1543 | + } | |
1544 | + } | |
1545 | + return Result.OK("完成移库任务成功"); | |
1546 | + } | |
1547 | + | |
1548 | + /** | |
1549 | + * 完成出库查看任务 | |
1550 | + * @param taskHeader 任务 | |
1551 | + * @return Result 完成出库查看任务结果 | |
1552 | + */ | |
1553 | + @Transactional(rollbackFor = Exception.class) | |
1554 | + public Result completeCheckOutTask(TaskHeader taskHeader) { | |
1555 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1556 | + String containerCode = taskHeader.getContainerCode(); | |
1557 | + String fromLocationCode = taskHeader.getFromLocationCode(); | |
1558 | + String toLocationCode = taskHeader.getToLocationCode(); | |
1559 | + String toPortCode = taskHeader.getToPortCode(); | |
1560 | + | |
1561 | + if(StringUtils.isEmpty(containerCode)) { | |
1562 | + return Result.error("完成出库查看任务时, 托盘号为空"); | |
1563 | + } | |
1564 | + if(StringUtils.isEmpty(warehouseCode)) { | |
1565 | + return Result.error("完成出库查看任务时, 仓库编码为空"); | |
1566 | + } | |
1567 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
1568 | + return Result.error("完成出库查看任务时, 起始库位号为空"); | |
1569 | + } | |
1570 | + if(StringUtils.isEmpty(toPortCode)) { | |
1571 | + return Result.error("完成出库查看任务时, 目标出入口号为空"); | |
1572 | + } | |
1573 | + if(StringUtils.isEmpty(toLocationCode)) { | |
1574 | + return Result.error("完成出库查看任务时, 目标库位号为空"); | |
1575 | + } | |
1576 | + | |
1577 | + boolean success = false; | |
1578 | + LambdaUpdateWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaUpdate(); | |
1579 | + inventoryDetailLambdaQueryWrapper.eq(InventoryDetail::getWarehouseCode, warehouseCode) | |
1580 | + .eq(InventoryDetail::getContainerCode, containerCode) | |
1581 | + .eq(InventoryDetail::getLocationCode, fromLocationCode); | |
1582 | + List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambdaQueryWrapper); | |
1583 | + if(inventoryDetailList.size() != 0) { | |
1584 | + for (InventoryDetail inventoryDetail : inventoryDetailList) { | |
1585 | + inventoryDetail.setTaskQty(BigDecimal.ZERO); | |
1586 | + } | |
1587 | + success = inventoryDetailService.updateBatchById(inventoryDetailList); | |
1588 | + if (!success) { | |
1589 | + throw new ServiceException("完成出库查看任务时,更新库存详情失败"); | |
1590 | + } | |
1591 | + success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_SOME, warehouseCode); | |
1592 | + if (!success) { | |
1593 | + throw new ServiceException("完成出库查看任务时,更新容器状态失败"); | |
1594 | + } | |
1595 | + } else { | |
1596 | + success = containerService.updateStatus(containerCode, QuantityConstant.STATUS_CONTAINER_EMPTY, warehouseCode); | |
1597 | + if (!success) { | |
1598 | + throw new ServiceException("完成出库查看任务时,更新容器状态失败"); | |
1599 | + } | |
1600 | + } | |
1601 | + success = locationService.updateContainerCodeAndStatus(fromLocationCode, | |
1602 | + QuantityConstant.EMPTY_STRING, QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1603 | + if (!success) { | |
1604 | + throw new ServiceException("完成出库查看任务时,更新起始库位状态失败"); | |
1605 | + } | |
1606 | + success = locationService.updateContainerCodeAndStatus(toLocationCode, | |
1607 | + containerCode, QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1608 | + if (!success) { | |
1609 | + throw new ServiceException("完成出库查看任务时,更新目标库位状态失败"); | |
1610 | + } | |
1611 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); | |
1612 | + success = taskHeaderService.updateById(taskHeader); | |
1613 | + if (!success) { | |
1614 | + throw new ServiceException("完成出库查看任务时,保存任务失败"); | |
1615 | + } | |
1616 | + return Result.ok("完成出库查看任务"); | |
1617 | + } | |
1618 | + | |
1619 | + /** | |
1620 | + * 完成跨站任务 | |
1621 | + * @param taskHeader 任务 | |
1622 | + * @return Result 完成跨站任务结果 | |
1623 | + */ | |
1624 | + @Transactional(rollbackFor = Exception.class) | |
1625 | + public Result completeOverStationTask(TaskHeader taskHeader) { | |
1626 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1627 | + String containerCode = taskHeader.getContainerCode(); | |
1628 | + String fromPortCode = taskHeader.getFromPortCode(); | |
1629 | + String toPortCode = taskHeader.getToPortCode(); | |
1630 | + if(StringUtils.isEmpty(containerCode)) { | |
1631 | + return Result.error("完成跨站任务时, 托盘号为空"); | |
1632 | + } | |
1633 | + if(StringUtils.isEmpty(warehouseCode)) { | |
1634 | + return Result.error("完成跨站任务时, 仓库编码为空"); | |
1635 | + } | |
1636 | + if(StringUtils.isEmpty(fromPortCode)) { | |
1637 | + return Result.error("完成跨站任务时, 起始出入口号为空"); | |
1638 | + } | |
1639 | + if(StringUtils.isEmpty(toPortCode)) { | |
1640 | + return Result.error("完成跨站任务时, 目标出入口号为空"); | |
1641 | + } | |
1642 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1643 | + if(container == null) { | |
1644 | + return Result.error("创建跨站任务时,容器为空"); | |
1645 | + } | |
1646 | + Port fromPort = portService.getPortByCode(fromPortCode, warehouseCode); | |
1647 | + if(fromPort == null) { | |
1648 | + return Result.error("创建跨站任务时,起始站台为空"); | |
1649 | + } | |
1650 | + Port toPort = portService.getPortByCode(toPortCode, warehouseCode); | |
1651 | + if(toPort == null) { | |
1652 | + return Result.error("创建跨站任务时,目标站台为空"); | |
1653 | + } | |
1654 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); | |
1655 | + boolean success = taskHeaderService.updateById(taskHeader); | |
1656 | + if(!success) { | |
1657 | + throw new ServiceException("创建跨站任务时, 更新任务失败"); | |
1658 | + } | |
1659 | + success = containerService.updateStatus(containerCode, | |
1660 | + QuantityConstant.STATUS_CONTAINER_EMPTY, warehouseCode); | |
1661 | + if(!success) { | |
1662 | + throw new ServiceException("创建跨站任务时, 更新容器状态失败"); | |
1663 | + } | |
1664 | + return Result.OK("完成跨站任务成功"); | |
1665 | + } | |
1666 | + | |
1667 | + /** | |
1668 | + * 完成空托盘组入库任务 | |
1669 | + * @param taskHeader 任务 | |
1670 | + * @return Result 完成空托盘组入库任务结果 | |
1671 | + */ | |
1672 | + @Transactional(rollbackFor = Exception.class) | |
1673 | + public Result completeManyEmptyInTask(TaskHeader taskHeader) { | |
1674 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1675 | + String containerCode = taskHeader.getContainerCode(); | |
1676 | + String toLocationCode = taskHeader.getToLocationCode(); | |
1677 | + if(StringUtils.isEmpty(containerCode)) { | |
1678 | + return Result.error("完成空托盘组入库任务时, 托盘号为空"); | |
1679 | + } | |
1680 | + if(StringUtils.isEmpty(warehouseCode)) { | |
1681 | + return Result.error("完成空托盘组入库任务时, 仓库编码为空"); | |
1682 | + } | |
1683 | + if(StringUtils.isEmpty(toLocationCode)) { | |
1684 | + return Result.error("完成空托盘组入库任务时, 目标库位号为空"); | |
1685 | + } | |
1686 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1687 | + if(container == null) { | |
1688 | + return Result.error("完成空托盘组入库任务时,没有找到容器" + containerCode); | |
1689 | + } | |
1690 | + Location toLocation = locationService.getLocationByCode(toLocationCode, warehouseCode); | |
1691 | + if(toLocation == null) { | |
1692 | + return Result.error("完成空托盘组入库任务时,没有找到库位" + toLocationCode); | |
1693 | + } | |
1694 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); | |
1695 | + boolean success = taskHeaderService.updateById(taskHeader); | |
1696 | + if(!success) { | |
1697 | + throw new ServiceException("完成空托盘组入库任务时, 更新任务失败"); | |
1698 | + } | |
1699 | + success = containerService.updateLocationCodeAndStatus(containerCode, toLocationCode, | |
1700 | + QuantityConstant.STATUS_CONTAINER_MANY, warehouseCode); | |
1701 | + if(!success) { | |
1702 | + throw new ServiceException("完成空托盘组入库任务时, 更新容器失败"); | |
1703 | + } | |
1704 | + success = locationService.updateContainerCodeAndStatus(toLocationCode, containerCode, | |
1705 | + QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1706 | + if(!success) { | |
1707 | + throw new ServiceException("完成空托盘组入库任务时, 更新库位失败"); | |
1708 | + } | |
1709 | + return Result.ok("完成空托盘组入库任务成功"); | |
1710 | + } | |
1711 | + | |
1712 | + /** | |
1713 | + * 完成空托盘组出库任务 | |
1714 | + * @param taskHeader 任务 | |
1715 | + * @return Result 完成空托盘组出库任务结果 | |
1716 | + */ | |
1717 | + @Transactional(rollbackFor = Exception.class) | |
1718 | + public Result completeManyEmptyOutTask(TaskHeader taskHeader) { | |
1719 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1720 | + String containerCode = taskHeader.getContainerCode(); | |
1721 | + String toPortCode = taskHeader.getToPortCode(); | |
1722 | + if(StringUtils.isEmpty(containerCode)) { | |
1723 | + return Result.error("完成空托盘组出库任务时, 托盘号为空"); | |
1724 | + } | |
1725 | + if(StringUtils.isEmpty(warehouseCode)) { | |
1726 | + return Result.error("完成空托盘组出库任务时, 仓库编码为空"); | |
1727 | + } | |
1728 | + if(StringUtils.isEmpty(toPortCode)) { | |
1729 | + return Result.error("完成空托盘组出库任务时, 目标出入口为空"); | |
1730 | + } | |
1731 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1732 | + if(container == null) { | |
1733 | + return Result.error("完成空托盘组出库任务时,没有找到容器" + containerCode); | |
1734 | + } | |
1735 | + String toLocationCode = container.getLocationCode(); | |
1736 | + if(StringUtils.isEmpty(toLocationCode)) { | |
1737 | + return Result.error("完成空托盘组出库任务时, 容器不在库位上"); | |
1738 | + } | |
1739 | + Port port = portService.getPortByCode(toPortCode, warehouseCode); | |
1740 | + if(port == null) { | |
1741 | + return Result.error("完成空托盘组出库任务时,没有找到出入口" + toPortCode); | |
1742 | + } | |
1743 | + taskHeader.setStatus(QuantityConstant.TASK_STATUS_COMPLETED); | |
1744 | + boolean success = taskHeaderService.updateById(taskHeader); | |
1745 | + if(!success) { | |
1746 | + throw new ServiceException("完成空托盘组出库任务时, 更新任务失败"); | |
1747 | + } | |
1748 | + success = containerService.updateLocationCodeAndStatus(containerCode, QuantityConstant.EMPTY_STRING, | |
1749 | + QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1750 | + if(!success) { | |
1751 | + throw new ServiceException("完成空托盘组出库任务时, 更新容器失败"); | |
1752 | + } | |
1753 | + success = locationService.updateContainerCodeAndStatus(toLocationCode, QuantityConstant.EMPTY_STRING, | |
1754 | + QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1755 | + if(!success) { | |
1756 | + throw new ServiceException("完成空托盘组出库任务时, 更新库位失败"); | |
1757 | + } | |
1758 | + return Result.ok("完成空托盘组出库任务成功"); | |
1759 | + } | |
1760 | + | |
1761 | + /** | |
1762 | + * 取消入库任务 | |
1763 | + * @param taskHeader 任务 | |
1764 | + * @return Result 取消入库任务结果 | |
1765 | + */ | |
1766 | + @Transactional(rollbackFor = Exception.class) | |
1767 | + public Result cancelReceiptTask(TaskHeader taskHeader) { | |
1768 | + int receiptContainerHeaderId = taskHeader.getReceiptContainerHeaderId(); | |
1769 | + boolean success = receiptContainerHeaderService.cancelReceiptTask(receiptContainerHeaderId); | |
1770 | + if(!success) { | |
1771 | + throw new ServiceException("取消入库任务时, 更新组盘头状态失败"); | |
1772 | + } | |
1773 | + String containerCode = taskHeader.getContainerCode(); | |
1774 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1775 | + ReceiptContainerHeader receiptContainerHeader = receiptContainerHeaderService. | |
1776 | + getUnCompleteReceiptContainerByCode(containerCode, warehouseCode); | |
1777 | + String value = parameterConfigurationService.getValueByCode(QuantityConstant.RULE_TASK_LOCATION); | |
1778 | + if(StringUtils.isEmpty(value)) { | |
1779 | + throw new ServiceException("取消入库任务时, 没有获取到配置属性"); | |
1780 | + } | |
1781 | + int taskLocationRule = Integer.parseInt(value); | |
1782 | + if (taskLocationRule == QuantityConstant.RULE_TASK_NOT_LOCATION) { | |
1783 | + receiptContainerHeader.setToLocationCode(QuantityConstant.EMPTY_STRING); | |
1784 | + success = receiptContainerHeaderService.updateById(receiptContainerHeader); | |
1785 | + if(!success) { | |
1786 | + throw new ServiceException("取消入库任务时, 更新组盘头状态失败!!"); | |
1787 | + } | |
1788 | + } | |
1789 | + return Result.ok("取消入库任务成功"); | |
1790 | + } | |
1791 | + | |
1792 | + /** | |
1793 | + * 取消出库任务 | |
1794 | + * @param taskHeader 任务 | |
1795 | + * @return Result 取消出库任务结果 | |
1796 | + */ | |
1797 | + @Transactional(rollbackFor = Exception.class) | |
1798 | + public Result cancelShipmentTask(TaskHeader taskHeader) { | |
1799 | + | |
1800 | + return Result.ok("取消出库任务成功"); | |
1801 | + } | |
1802 | + | |
1803 | + /** | |
1804 | + * 取消任务,恢复容器和库位状态 | |
1805 | + * @param taskHeader | |
1806 | + * @return | |
1807 | + */ | |
1808 | + @Transactional(rollbackFor = Exception.class) | |
1809 | + public Result cancelLocationAndContainerStatus(TaskHeader taskHeader) { | |
1810 | + String containerCode = taskHeader.getContainerCode(); | |
1811 | + String fromLocationCode = taskHeader.getFromLocationCode(); | |
1812 | + String toLocationCode = taskHeader.getToLocationCode(); | |
1813 | + String warehouseCode = taskHeader.getWarehouseCode(); | |
1814 | + | |
1815 | + boolean success = false; | |
1816 | + if(StringUtils.isEmpty(fromLocationCode)) { | |
1817 | + success = locationService.updateStatus(fromLocationCode, | |
1818 | + QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1819 | + if(!success) { | |
1820 | + throw new ServiceException("取消任务时, 更新起始库位状态失败"); | |
1821 | + } | |
1822 | + } | |
1823 | + if(StringUtils.isEmpty(toLocationCode)) { | |
1824 | + success = locationService.updateStatus(toLocationCode, | |
1825 | + QuantityConstant.STATUS_LOCATION_EMPTY, warehouseCode); | |
1826 | + if(!success) { | |
1827 | + throw new ServiceException("取消任务时, 更新目标库位状态失败"); | |
1828 | + } | |
1829 | + } | |
1830 | + InventoryHeader inventoryHeader = inventoryHeaderService. | |
1831 | + getInventoryHeaderByContainerCode(containerCode, warehouseCode); | |
1832 | + | |
1833 | + Container container = containerService.getContainerByCode(containerCode, warehouseCode); | |
1834 | + if(container == null) { | |
1835 | + throw new ServiceException("取消任务时, 没有找到容器"); | |
1836 | + } | |
1837 | + if (inventoryHeader != null) { | |
1838 | + if (QuantityConstant.STATUS_CONTAINER_SOME.equals(inventoryHeader.getContainerStatus())) { | |
1839 | + container.setStatus(QuantityConstant.STATUS_CONTAINER_SOME); | |
1840 | + } | |
1841 | + inventoryHeader.setContainerStatus(QuantityConstant.STATUS_CONTAINER_SOME); | |
1842 | + success = inventoryHeaderService.updateById(inventoryHeader); | |
1843 | + if(!success) { | |
1844 | + throw new ServiceException("取消任务时, 更新库存成功"); | |
1845 | + } | |
1846 | + } else { | |
1847 | + container.setStatus(QuantityConstant.STATUS_CONTAINER_EMPTY); | |
1848 | + } | |
1849 | + String lastStatus = container.getLastStatus(); | |
1850 | + if (StringUtils.isNotEmpty(lastStatus)) { | |
1851 | + container.setStatus(lastStatus); //解决空托盘组移库问题 | |
1852 | + } | |
1853 | + container.setLastStatus(QuantityConstant.EMPTY_STRING); | |
1854 | + container.setLocationCode(fromLocationCode); | |
1855 | + success = containerService.updateById(container); | |
1856 | + if(!success) { | |
1857 | + throw new ServiceException("取消任务时, 更新容器失败"); | |
1858 | + } | |
1859 | + return Result.ok("取消任务成功"); | |
1860 | + } | |
769 | 1861 | } |
... | ... |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
... | ... | @@ -183,7 +183,7 @@ public class QuantityConstant { |
183 | 183 | public static final int TASK_TYPE_TRANSFER = 800; |
184 | 184 | |
185 | 185 | /** 出库查看 */ |
186 | - public static final int TASK_TYPE_VIEW = 900; | |
186 | + public static final int TASK_TYPE_CHECK_OUT = 900; | |
187 | 187 | |
188 | 188 | /** 换站 */ |
189 | 189 | public static final int TASK_TYPE_OVER_STATION = 1000; |
... | ... | @@ -307,24 +307,13 @@ public class QuantityConstant { |
307 | 307 | public static final Integer INVENTORY_TRANSACTION_SHIPMENT = 20; |
308 | 308 | |
309 | 309 | /** 调整入 */ |
310 | - public static final Integer INVENTORY_TRANSACTION_ADJUSTINTO = 30; | |
310 | + public static final Integer INVENTORY_TRANSACTION_CYCLEINTO = 30; | |
311 | 311 | |
312 | 312 | /** 调整出 */ |
313 | - public static final Integer INVENTORY_TRANSACTION_ADJUSTOUT = 40; | |
313 | + public static final Integer INVENTORY_TRANSACTION_CYCLEOUT = 40; | |
314 | 314 | |
315 | - /** 调整属性 */ | |
316 | - public static final Integer INVENTORY_TRANSACTION_ADJUSTPROPERTIES = 50; | |
317 | - | |
318 | - /** 盘点 */ | |
319 | - public static final Integer INVENTORY_TRANSACTION_CYCLECOUNT = 60; | |
320 | - | |
321 | - /** 移库入 */ | |
322 | - public static final Integer INVENTORY_TRANSACTION_TRANSFERINTO = 70; | |
323 | - | |
324 | - /** 移库出 */ | |
325 | - public static final Integer INVENTORY_TRANSACTION_TRANSFEROUT = 80; | |
326 | - /**空出*/ | |
327 | - public static final Integer INVENTORY_TRANSACTION_EMPTYOUT = 90; | |
315 | + /** 移库 */ | |
316 | + public static final Integer INVENTORY_TRANSACTION_TRANSFER = 50; | |
328 | 317 | |
329 | 318 | |
330 | 319 | |
... | ... | @@ -351,10 +340,10 @@ public class QuantityConstant { |
351 | 340 | /** 拣货任务*/ |
352 | 341 | public static final Integer TASK_INTENERTYPE_SHIPMENT = 200; |
353 | 342 | |
354 | - /** 工作任务*/ | |
355 | - public static final Integer TASK_INTENERTYPE_WORK = 300; | |
343 | + /** 移位任务*/ | |
344 | + public static final Integer TASK_INTENERTYPE_TRANSFER_POSITION = 300; | |
356 | 345 | |
357 | - //盘点任务 | |
346 | + /** 盘点任务*/ | |
358 | 347 | public static final Integer TASK_INTENERTYPE_CYCLECOUNT = 400; |
359 | 348 | |
360 | 349 | |
... | ... |