Commit a028afff273a7e46dd1690eb3f2a203561b01da6
Merge remote-tracking branch 'origin/develop' into develop
Showing
54 changed files
with
3507 additions
and
200 deletions
ant-design-vue-jeecg/src/api/api.js
... | ... | @@ -260,6 +260,17 @@ export const callShipmentBox = (params) => postAction('/shipment/shipmentHeader/ |
260 | 260 | export const listReceiveByReceiveId = (params) => postAction('/receipt/receiveHeader/listReceiveByReceiveId', params); |
261 | 261 | //收货 |
262 | 262 | export const receive = (params) => postAction('/receipt/receiveHeader/receive', params); |
263 | +//全部收货 | |
264 | +export const receiveHeader = (params) => postAction('/receipt/receiveHeader/receiveHeader?id=' + params, params); | |
265 | +//越库 | |
266 | +export const crossDocking = (params) => postAction('/receipt/receiptHeader/crossDocking?id=' + params, params); | |
267 | +//收货详情转质检 | |
268 | +export const receiveDetailToQuality = (params) => postAction('/receipt/receiveHeader/receiveDetailToQuality?id=' + params, params); | |
269 | +//质检 | |
270 | +export const qualityTesting = (params) => postAction('/receipt/qualityHeader/qualityTesting', params); | |
271 | +//全部转质检 | |
272 | +export const receiveHeaderToQuality = (params) => postAction('/receipt/receiveHeader/receiveHeaderToQuality?id=' + params, params); | |
273 | + | |
263 | 274 | // 中转HTTP请求 |
264 | 275 | export const transitRESTful = { |
265 | 276 | get: (url, parameter) => getAction(getTransitURL(url), parameter), |
... | ... |
ant-design-vue-jeecg/src/views/system/inventory/InventoryHeaderList.vue
... | ... | @@ -206,6 +206,11 @@ export default { |
206 | 206 | dataIndex: 'containerCode' |
207 | 207 | }, |
208 | 208 | { |
209 | + title: '物料编码', | |
210 | + align: "center", | |
211 | + dataIndex: 'materialCode' | |
212 | + }, | |
213 | + { | |
209 | 214 | title: '容器状态', |
210 | 215 | align: "center", |
211 | 216 | dataIndex: 'containerStatus_dictText', |
... | ... | @@ -430,6 +435,7 @@ export default { |
430 | 435 | fieldList.push({type: 'string', value: 'containerCode', text: '容器编码', dictCode: ''}) |
431 | 436 | fieldList.push({type: 'string', value: 'containerStatus', text: '容器状态', dictCode: 'container_status'}) |
432 | 437 | fieldList.push({type: 'string', value: 'locationCode', text: '库位编码', dictCode: ''}) |
438 | + fieldList.push({type: 'string', value: 'materialCode', text: '物料编码', dictCode: ''}) | |
433 | 439 | fieldList.push({type: 'BigDecimal', value: 'totalQty', text: '总数量', dictCode: ''}) |
434 | 440 | fieldList.push({type: 'int', value: 'totalLines', text: '总行量', dictCode: ''}) |
435 | 441 | fieldList.push({type: 'string', value: 'createBy', text: '创建人', dictCode: ''}) |
... | ... |
ant-design-vue-jeecg/src/views/system/inventory/InventoryLevelAlarmList.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 | + <a-input placeholder="请输入物料编码" v-model="queryParam.materialCode"></a-input> | |
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.materialName"></a-input> | |
15 | + </a-form-item> | |
16 | + </a-col> | |
17 | + <a-col :xl='6' :lg='7' :md='8' :sm='24'> | |
18 | + <a-form-item label='预警状态'> | |
19 | + <a-select show-search placeholder='请选择预警状态' option-filter-prop='children' v-model='queryParam.alarmStatus'> | |
20 | + <a-select-option v-for='item in alarmStatusList' :key='item.name' :value='item.code'> | |
21 | + {{ item.name }} | |
22 | + </a-select-option> | |
23 | + </a-select> | |
24 | + </a-form-item> | |
25 | + </a-col> | |
26 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
27 | + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> | |
28 | + <a-button id="search" type="primary" @click="searchQuery" icon="search">查询</a-button> | |
29 | + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> | |
30 | + </span> | |
31 | + </a-col> | |
32 | + </a-row> | |
33 | + </a-form> | |
34 | + </div> | |
35 | + <!-- 查询区域-END --> | |
36 | + | |
37 | + <!-- 操作按钮区域 --> | |
38 | + <div class="table-operator" style="display: none"> | |
39 | + <a-button type="primary" icon="download" @click="handleExportXls('inventory_level_alarm')">导出</a-button> | |
40 | + </div> | |
41 | + | |
42 | + <!-- table区域-begin --> | |
43 | + <div> | |
44 | + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> | |
45 | + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a | |
46 | + style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 | |
47 | + <a style="margin-left: 24px" @click="onClearSelected">清空</a> | |
48 | + </div> | |
49 | + | |
50 | + <a-table | |
51 | + ref="table" | |
52 | + size="middle" | |
53 | + :scroll="{x:true}" | |
54 | + bordered | |
55 | + rowKey="id" | |
56 | + :columns="columns" | |
57 | + :dataSource="dataSource" | |
58 | + :pagination="ipagination" | |
59 | + :loading="loading" | |
60 | + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" | |
61 | + class="j-table-force-nowrap" | |
62 | + @change="handleTableChange"> | |
63 | + | |
64 | + <span slot="min" slot-scope="text, record"> | |
65 | + <a-tag :key="record" :color="minColor(record)"> | |
66 | + {{ minStatus(record) }} | |
67 | + </a-tag> | |
68 | + </span> | |
69 | + | |
70 | + <span slot="max" slot-scope="text, record"> | |
71 | + <a-tag :key="record" :color="maxColor(record)"> | |
72 | + {{ maxStatus(record) }} | |
73 | + </a-tag> | |
74 | + </span> | |
75 | + | |
76 | + <span slot="qtySum" slot-scope="text, record"> | |
77 | + <a-tag :key="record" :color="qtySumColor(record)" style="font-size: 14px;font-weight: normal"> | |
78 | + {{ qtySumStatus(record) }} | |
79 | + </a-tag> | |
80 | + </span> | |
81 | + | |
82 | + <span slot="upper" slot-scope="text, record"> | |
83 | + <a-tag :key="record" :color="upperColor(record)"> | |
84 | + {{ record.upper }} | |
85 | + </a-tag> | |
86 | + </span> | |
87 | + | |
88 | + <span slot="lower" slot-scope="text, record"> | |
89 | + <a-tag :key="record" :color="lowerColor(record)"> | |
90 | + {{ record.lower }} | |
91 | + </a-tag> | |
92 | + </span> | |
93 | + | |
94 | + <template slot="htmlSlot" slot-scope="text"> | |
95 | + <div v-html="text"></div> | |
96 | + </template> | |
97 | + <template slot="imgSlot" slot-scope="text"> | |
98 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> | |
99 | + <img v-else :src="getImgView(text)" height="25px" alt="" | |
100 | + style="max-width:80px;font-size: 12px;font-style: italic;"/> | |
101 | + </template> | |
102 | + <template slot="fileSlot" slot-scope="text"> | |
103 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> | |
104 | + <a-button | |
105 | + v-else | |
106 | + :ghost="true" | |
107 | + type="primary" | |
108 | + icon="download" | |
109 | + size="small" | |
110 | + @click="downloadFile(text)"> | |
111 | + 下载 | |
112 | + </a-button> | |
113 | + </template> | |
114 | + | |
115 | + </a-table> | |
116 | + </div> | |
117 | + </a-card> | |
118 | +</template> | |
119 | + | |
120 | +<script> | |
121 | + | |
122 | +import '@/assets/less/TableExpand.less' | |
123 | +import {mixinDevice} from '@/utils/mixin' | |
124 | +import {JeecgListMixin} from '@/mixins/JeecgListMixin' | |
125 | + | |
126 | +export default { | |
127 | + name: 'InventoryLevelAlarmList', | |
128 | + mixins: [JeecgListMixin, mixinDevice], | |
129 | + components: {}, | |
130 | + queryParam: { | |
131 | + materialName2:"" | |
132 | + }, | |
133 | + data() { | |
134 | + return { | |
135 | + description: '库存水位预警', | |
136 | + // alarmStatusList:['所有', '无预警', '有预警', '上限预警', '下限预警'], | |
137 | + alarmStatusList:[ | |
138 | + {'name':'所有', 'code':'all'}, | |
139 | + {'name':'无预警', 'code':'noAlarm'}, | |
140 | + {'name':'有预警', 'code':'isAlarm'}, | |
141 | + {'name':'上限预警', 'code':'upperAlarm'}, | |
142 | + {'name':'下限预警', 'code':'lowerAlarm'}], | |
143 | + // 表头 | |
144 | + columns: [ | |
145 | + { | |
146 | + title: '#', | |
147 | + dataIndex: '', | |
148 | + key: 'rowIndex', | |
149 | + width: 60, | |
150 | + align: "center", | |
151 | + customRender: function (t, r, index) { | |
152 | + return parseInt(index) + 1; | |
153 | + } | |
154 | + }, | |
155 | + { | |
156 | + title: '物料编码', | |
157 | + align: "center", | |
158 | + dataIndex: 'materialCode' | |
159 | + }, | |
160 | + { | |
161 | + title: '物料名称', | |
162 | + align: "center", | |
163 | + dataIndex: 'materialName' | |
164 | + }, | |
165 | + { | |
166 | + title: '最小值', | |
167 | + align: "center", | |
168 | + dataIndex: 'min', | |
169 | + scopedSlots: {customRender: 'min'} | |
170 | + }, | |
171 | + { | |
172 | + title: '下限预警值', | |
173 | + align: "center", | |
174 | + dataIndex: 'lower', | |
175 | + scopedSlots: {customRender: 'lower'} | |
176 | + }, | |
177 | + { | |
178 | + title: '库存数量', | |
179 | + align: "center", | |
180 | + dataIndex: 'qtySum', | |
181 | + scopedSlots: {customRender: 'qtySum'} | |
182 | + }, | |
183 | + { | |
184 | + title: '上限预警值', | |
185 | + align: "center", | |
186 | + dataIndex: 'upper', | |
187 | + scopedSlots: {customRender: 'upper'} | |
188 | + }, | |
189 | + { | |
190 | + title: '最大值', | |
191 | + align: "center", | |
192 | + dataIndex: 'max', | |
193 | + scopedSlots: {customRender: 'max'} | |
194 | + }, | |
195 | + { | |
196 | + title: '物料规格', | |
197 | + align: "center", | |
198 | + dataIndex: 'materialSpec' | |
199 | + }, | |
200 | + { | |
201 | + title: '物料单位', | |
202 | + align: "center", | |
203 | + dataIndex: 'materialUnit' | |
204 | + }, | |
205 | + { | |
206 | + title: '仓库编码', | |
207 | + align: "center", | |
208 | + dataIndex: 'warehouseCode' | |
209 | + }, | |
210 | + { | |
211 | + title: '货主编码', | |
212 | + align: "center", | |
213 | + dataIndex: 'companyCode' | |
214 | + }, | |
215 | + { | |
216 | + title: '备注', | |
217 | + align: "center", | |
218 | + dataIndex: 'remark' | |
219 | + }, | |
220 | + ], | |
221 | + url: { | |
222 | + list: "/inventory/inventoryLevel/list", | |
223 | + exportXlsUrl: "/inventory/inventoryLevel/exportXls", | |
224 | + }, | |
225 | + dictOptions: {}, | |
226 | + superFieldList: [], | |
227 | + } | |
228 | + }, | |
229 | + created() { | |
230 | + this.getSuperFieldList(); | |
231 | + }, | |
232 | + computed: { | |
233 | + importExcelUrl: function () { | |
234 | + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; | |
235 | + }, | |
236 | + }, | |
237 | + methods: { | |
238 | + initDictConfig() { | |
239 | + }, | |
240 | + qtySumStatus(record) { | |
241 | + if(record.qtySum <= record.lower){ | |
242 | + return record.qtySum + " 🠋" | |
243 | + } | |
244 | + if(record.qtySum >= record.upper){ | |
245 | + return record.qtySum + " 🠉" | |
246 | + } | |
247 | + return record.qtySum; | |
248 | + }, | |
249 | + qtySumColor(record) { | |
250 | + if(record.qtySum >= record.upper || record.qtySum <= record.lower){ | |
251 | + return 'red'; | |
252 | + } | |
253 | + return ''; | |
254 | + }, | |
255 | + | |
256 | + lowerColor(record) { | |
257 | + if(record.qtySum <= record.lower){ | |
258 | + return 'blue'; | |
259 | + } | |
260 | + return ''; | |
261 | + }, | |
262 | + | |
263 | + upperColor(record) { | |
264 | + if(record.qtySum >= record.upper){ | |
265 | + return 'blue'; | |
266 | + } | |
267 | + return ''; | |
268 | + }, | |
269 | + | |
270 | + maxColor(record) { | |
271 | + if(record.qtySum >= record.max){ | |
272 | + return 'blue'; | |
273 | + } | |
274 | + return ''; | |
275 | + }, | |
276 | + | |
277 | + minColor(record) { | |
278 | + if(record.qtySum <= record.min){ | |
279 | + return 'blue'; | |
280 | + } | |
281 | + return ''; | |
282 | + }, | |
283 | + | |
284 | + minStatus(record) { | |
285 | + if(record.min <= 0){ | |
286 | + return '' | |
287 | + } | |
288 | + return record.min; | |
289 | + }, | |
290 | + | |
291 | + maxStatus(record) { | |
292 | + if(record.max <= 0){ | |
293 | + return ''; | |
294 | + } | |
295 | + return record.max; | |
296 | + }, | |
297 | + getSuperFieldList() { | |
298 | + let fieldList = []; | |
299 | + fieldList.push({type: 'string', value: 'alarmType', text: '预警类别代码'}) | |
300 | + fieldList.push({type: 'string', value: 'warehouseCode', text: '仓库编码'}) | |
301 | + fieldList.push({type: 'string', value: 'companyCode', text: '货主编码'}) | |
302 | + fieldList.push({type: 'string', value: 'materialCode', text: '物料编码'}) | |
303 | + fieldList.push({type: 'string', value: 'materialName', text: '物料名称'}) | |
304 | + fieldList.push({type: 'string', value: 'materialSpec', text: '物料规格'}) | |
305 | + fieldList.push({type: 'string', value: 'materialUnit', text: '物料单位'}) | |
306 | + fieldList.push({type: 'int', value: 'qtysum', text: 'qtysum'}) | |
307 | + fieldList.push({type: 'int', value: 'inlower', text: 'inlower'}) | |
308 | + fieldList.push({type: 'int', value: 'inupper', text: 'inupper'}) | |
309 | + fieldList.push({type: 'int', value: 'inmin', text: 'inmin'}) | |
310 | + fieldList.push({type: 'int', value: 'inmax', text: 'inmax'}) | |
311 | + fieldList.push({type: 'int', value: 'needalarm', text: 'needalarm'}) | |
312 | + fieldList.push({type: 'int', value: 'max', text: '最大'}) | |
313 | + fieldList.push({type: 'int', value: 'min', text: '最小'}) | |
314 | + fieldList.push({type: 'int', value: 'upper', text: '上限预警值'}) | |
315 | + fieldList.push({type: 'int', value: 'lower', text: '下限预警值'}) | |
316 | + fieldList.push({type: 'string', value: 'remark', text: '备注'}) | |
317 | + fieldList.push({type: 'string', value: 'userdef1', text: '备用字段1'}) | |
318 | + fieldList.push({type: 'string', value: 'userdef2', text: '备用字段2'}) | |
319 | + fieldList.push({type: 'string', value: 'userdef3', text: '备用字段3'}) | |
320 | + this.superFieldList = fieldList | |
321 | + } | |
322 | + } | |
323 | +} | |
324 | +</script> | |
325 | +<style scoped> | |
326 | +@import '~@assets/less/common.less'; | |
327 | +</style> | |
0 | 328 | \ No newline at end of file |
... | ... |
ant-design-vue-jeecg/src/views/system/inventory/InventoryTransactionList.vue
... | ... | @@ -307,6 +307,11 @@ export default { |
307 | 307 | scopedSlots: {customRender: 'inventoryStatus_dictText'} |
308 | 308 | }, |
309 | 309 | { |
310 | + title: '数量', | |
311 | + align: "center", | |
312 | + dataIndex: 'qty' | |
313 | + }, | |
314 | + { | |
310 | 315 | title: '入库数量', |
311 | 316 | align: "center", |
312 | 317 | dataIndex: 'receiptQty' |
... | ... |
ant-design-vue-jeecg/src/views/system/monitor/locationStatus.vue
... | ... | @@ -618,7 +618,7 @@ export default { |
618 | 618 | }, |
619 | 619 | success: function (response) { |
620 | 620 | if (response.code == 200) { |
621 | - $("#zone").val("库位总数:" + response.result.location + ", 空闲库位:" + response.result.emptyLocation + | |
621 | + $("#zone").val("库位总数:" + response.result.location + ", 空库位:" + response.result.emptyLocation + | |
622 | 622 | ", 空托盘库位:" + response.result.haveContainLocation + ", 有货库位:" + response.result.haveInventoryLocation) |
623 | 623 | } else { |
624 | 624 | alert(response.message) |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/QualityDetailList.vue
0 → 100644
1 | +<template> | |
2 | + <a-card :bordered="false" :class="'cust-erp-sub-tab'"> | |
3 | + <!-- 操作按钮区域 --> | |
4 | + <div class="table-operator" v-if="mainId"> | |
5 | + <a-button @click="handleAdd" type="primary" icon="plus">新增</a-button> | |
6 | + <a-button type="primary" icon="download" @click="handleExportXls('质检单详情')">导出</a-button> | |
7 | + <a-upload | |
8 | + name="file" | |
9 | + :showUploadList="false" | |
10 | + :multiple="false" | |
11 | + :headers="tokenHeader" | |
12 | + :action="importExcelUrl" | |
13 | + @change="handleImportExcel"> | |
14 | + <a-button type="primary" icon="import">导入</a-button> | |
15 | + </a-upload> | |
16 | + <a-dropdown v-if="selectedRowKeys.length > 0"> | |
17 | + <a-menu slot="overlay"> | |
18 | + <a-menu-item key="1" @click="batchDel"><a-icon type="delete"/>删除</a-menu-item> | |
19 | + </a-menu> | |
20 | + <a-button style="margin-left: 8px"> 批量操作 <a-icon type="down" /></a-button> | |
21 | + </a-dropdown> | |
22 | + </div> | |
23 | + | |
24 | + <!-- table区域-begin --> | |
25 | + <div> | |
26 | + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> | |
27 | + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 | |
28 | + <a style="margin-left: 24px" @click="onClearSelected">清空</a> | |
29 | + </div> | |
30 | + | |
31 | + <a-table | |
32 | + ref="table" | |
33 | + size="middle" | |
34 | + bordered | |
35 | + rowKey="id" | |
36 | + :scroll="{x:true}" | |
37 | + :columns="columns" | |
38 | + :dataSource="dataSource" | |
39 | + :pagination="ipagination" | |
40 | + :loading="loading" | |
41 | + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange}" | |
42 | + @change="handleTableChange"> | |
43 | + | |
44 | + <template slot="htmlSlot" slot-scope="text"> | |
45 | + <div v-html="text"></div> | |
46 | + </template> | |
47 | + <template slot="imgSlot" slot-scope="text"> | |
48 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> | |
49 | + <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/> | |
50 | + </template> | |
51 | + <template slot="fileSlot" slot-scope="text"> | |
52 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> | |
53 | + <a-button | |
54 | + v-else | |
55 | + :ghost="true" | |
56 | + type="primary" | |
57 | + icon="download" | |
58 | + size="small" | |
59 | + @click="downloadFile(text)"> | |
60 | + 下载 | |
61 | + </a-button> | |
62 | + </template> | |
63 | + | |
64 | + <span slot="action" slot-scope="text, record"> | |
65 | + <a v-has="'qualityDetail:edit'" @click="handleEdit(record)">编辑</a> | |
66 | + <a-divider type="vertical" /> | |
67 | + <a v-has="'qualityDetail:quality'" v-if="(record.status != 200)" @click="qualityTesting(record)">质检</a> | |
68 | + <a-divider type="vertical" /> | |
69 | + <a-popconfirm v-has="'qualityDetail:remove'" title="确定删除吗?" @confirm="() => handleDelete(record.id)"> | |
70 | + <a>删除</a> | |
71 | + </a-popconfirm> | |
72 | + </span> | |
73 | + | |
74 | + </a-table> | |
75 | + </div> | |
76 | + | |
77 | + <qualityDetail-modal ref="modalForm" @ok="modalFormOk" :mainId="mainId"></qualityDetail-modal> | |
78 | + <quality-testing-modal ref="qualityTesting" @ok="modalFormOk" :mainId="mainId"></quality-testing-modal> | |
79 | + </a-card> | |
80 | +</template> | |
81 | + | |
82 | +<script> | |
83 | + | |
84 | + import { JeecgListMixin } from '@/mixins/JeecgListMixin' | |
85 | + import QualityDetailModal from './modules/QualityDetailModal' | |
86 | + import {receiveDetailToQuality, qualityTesting} from "@api/api"; | |
87 | + import QualityTestingModal from "@views/system/receipt/modules/QualityTestingModal"; | |
88 | + | |
89 | + export default { | |
90 | + name: "QualityDetailList", | |
91 | + mixins:[JeecgListMixin], | |
92 | + components: {QualityTestingModal, QualityDetailModal }, | |
93 | + props:{ | |
94 | + mainId:{ | |
95 | + type:String, | |
96 | + default:'', | |
97 | + required:false | |
98 | + } | |
99 | + }, | |
100 | + watch:{ | |
101 | + mainId:{ | |
102 | + immediate: true, | |
103 | + handler(val) { | |
104 | + if(!this.mainId){ | |
105 | + this.clearList() | |
106 | + }else{ | |
107 | + this.queryParam['qualityId'] = val | |
108 | + this.loadData(1); | |
109 | + } | |
110 | + } | |
111 | + } | |
112 | + }, | |
113 | + data () { | |
114 | + return { | |
115 | + description: '质检表单头管理页面', | |
116 | + disableMixinCreated:true, | |
117 | + // 表头 | |
118 | + columns: [ | |
119 | + { | |
120 | + title: '#', | |
121 | + dataIndex: '', | |
122 | + key:'rowIndex', | |
123 | + width:60, | |
124 | + align:"center", | |
125 | + customRender:function (t,r,index) { | |
126 | + return parseInt(index)+1; | |
127 | + } | |
128 | + }, | |
129 | + { | |
130 | + title:'物料编码', | |
131 | + align:"center", | |
132 | + dataIndex: 'materialCode' | |
133 | + }, | |
134 | + { | |
135 | + title:'物料名称', | |
136 | + align:"center", | |
137 | + dataIndex: 'materialName' | |
138 | + }, | |
139 | + { | |
140 | + title:'物料规格', | |
141 | + align:"center", | |
142 | + dataIndex: 'materialSpec' | |
143 | + }, | |
144 | + { | |
145 | + title:'物料单位', | |
146 | + align:"center", | |
147 | + dataIndex: 'materialUnit' | |
148 | + }, | |
149 | + { | |
150 | + title:'单据数量', | |
151 | + align:"center", | |
152 | + dataIndex: 'qty' | |
153 | + }, | |
154 | + { | |
155 | + title:'合格数量', | |
156 | + align:"center", | |
157 | + dataIndex: 'qualityfiedQty' | |
158 | + }, | |
159 | + { | |
160 | + title:'不合格数量', | |
161 | + align:"center", | |
162 | + dataIndex: 'unqualityfiedQty' | |
163 | + }, | |
164 | + { | |
165 | + title:'不合格原因', | |
166 | + align:"center", | |
167 | + dataIndex: 'remark' | |
168 | + }, | |
169 | + { | |
170 | + title:'批次', | |
171 | + align:"center", | |
172 | + dataIndex: 'batch' | |
173 | + }, | |
174 | + { | |
175 | + title:'批号', | |
176 | + align:"center", | |
177 | + dataIndex: 'lot' | |
178 | + }, | |
179 | + { | |
180 | + title:'项目号', | |
181 | + align:"center", | |
182 | + dataIndex: 'project' | |
183 | + }, | |
184 | + { | |
185 | + title:'单据状态', | |
186 | + align:"center", | |
187 | + dataIndex: 'status_dictText' | |
188 | + }, | |
189 | + // { | |
190 | + // title:'上游单号', | |
191 | + // align:"center", | |
192 | + // dataIndex: 'referCode' | |
193 | + // }, | |
194 | + // { | |
195 | + // title:'上游行号', | |
196 | + // align:"center", | |
197 | + // dataIndex: 'referLineNum' | |
198 | + // }, | |
199 | + { | |
200 | + title:'创建人', | |
201 | + align:"center", | |
202 | + dataIndex: 'createBy' | |
203 | + }, | |
204 | + { | |
205 | + title:'创建日期', | |
206 | + align:"center", | |
207 | + dataIndex: 'createTime' | |
208 | + }, | |
209 | + { | |
210 | + title:'更新人', | |
211 | + align:"center", | |
212 | + dataIndex: 'updateBy' | |
213 | + }, | |
214 | + { | |
215 | + title:'更新日期', | |
216 | + align:"center", | |
217 | + dataIndex: 'updateTime' | |
218 | + }, | |
219 | + { | |
220 | + title: '操作', | |
221 | + dataIndex: 'action', | |
222 | + align:"center", | |
223 | + fixed:"right", | |
224 | + width:147, | |
225 | + scopedSlots: { customRender: 'action' }, | |
226 | + } | |
227 | + ], | |
228 | + url: { | |
229 | + list: "/receipt/qualityHeader/listQualityDetailByMainId", | |
230 | + delete: "/receipt/qualityHeader/deleteQualityDetail", | |
231 | + deleteBatch: "/receipt/qualityHeader/deleteBatchQualityDetail", | |
232 | + exportXlsUrl: "/receipt/qualityHeader/exportQualityDetail", | |
233 | + importUrl: "/receipt/qualityHeader/importQualityDetail", | |
234 | + }, | |
235 | + dictOptions:{ | |
236 | + } | |
237 | + } | |
238 | + }, | |
239 | + created() { | |
240 | + }, | |
241 | + computed: { | |
242 | + importExcelUrl(){ | |
243 | + return `${window._CONFIG['domianURL']}/${this.url.importUrl}/${this.mainId}`; | |
244 | + } | |
245 | + }, | |
246 | + methods: { | |
247 | + clearList(){ | |
248 | + this.dataSource=[] | |
249 | + this.selectedRowKeys=[] | |
250 | + this.ipagination.current = 1 | |
251 | + }, | |
252 | + qualityTesting(record) { | |
253 | + this.$refs.qualityTesting.edit(record); | |
254 | + this.$refs.qualityTesting.title = "质检"; | |
255 | + }, | |
256 | + } | |
257 | + } | |
258 | +</script> | |
259 | +<style scoped> | |
260 | + @import '~@assets/less/common.less' | |
261 | +</style> | |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/QualityHeaderList.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 | + <a-input placeholder="请输入编码" v-model="queryParam.code"></a-input> | |
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.type"></a-input> | |
15 | + </a-form-item> | |
16 | + </a-col> | |
17 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
18 | + <a-form-item label="货主"> | |
19 | + <a-select | |
20 | + show-search | |
21 | + placeholder="请选择货主" | |
22 | + option-filter-prop="children" | |
23 | + v-model="queryParam.companyCode"> | |
24 | + <a-select-option v-for="item in companyList" :key="item.name" :value="item.code">{{ | |
25 | + item.name | |
26 | + }} | |
27 | + </a-select-option> | |
28 | + </a-select> | |
29 | + </a-form-item> | |
30 | + </a-col> | |
31 | + <template v-if="toggleSearchStatus"> | |
32 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
33 | + <a-form-item label="头状态"> | |
34 | + <a-input placeholder="请输入头状态" v-model="queryParam.firstStatus"></a-input> | |
35 | + </a-form-item> | |
36 | + </a-col> | |
37 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
38 | + <a-form-item label="尾状态"> | |
39 | + <a-input placeholder="请输入尾状态" v-model="queryParam.lastStatus"></a-input> | |
40 | + </a-form-item> | |
41 | + </a-col> | |
42 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
43 | + <a-form-item label="上游单号"> | |
44 | + <a-input placeholder="请输入上游单号" v-model="queryParam.referCode"></a-input> | |
45 | + </a-form-item> | |
46 | + </a-col> | |
47 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
48 | + <a-form-item label="供应商"> | |
49 | + <a-select | |
50 | + show-search | |
51 | + placeholder="请选择供应商" | |
52 | + option-filter-prop="children" | |
53 | + v-model="queryParam.supplierCode"> | |
54 | + <a-select-option v-for="item in supplierList" :key="item.name" :value="item.code">{{ | |
55 | + item.name | |
56 | + }} | |
57 | + </a-select-option> | |
58 | + </a-select> | |
59 | + </a-form-item> | |
60 | + </a-col> | |
61 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
62 | + <a-form-item label="备注"> | |
63 | + <a-input placeholder="请输入备注" v-model="queryParam.remark"></a-input> | |
64 | + </a-form-item> | |
65 | + </a-col> | |
66 | + </template> | |
67 | + <a-col :xl="6" :lg="7" :md="8" :sm="24"> | |
68 | + <span style="float: left;overflow: hidden;" class="table-page-search-submitButtons"> | |
69 | + <a-button type="primary" @click="searchQuery" icon="search">查询</a-button> | |
70 | + <a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button> | |
71 | + <a @click="handleToggleSearch" style="margin-left: 8px"> | |
72 | + {{ toggleSearchStatus ? '收起' : '展开' }} | |
73 | + <a-icon :type="toggleSearchStatus ? 'up' : 'down'"/> | |
74 | + </a> | |
75 | + </span> | |
76 | + </a-col> | |
77 | + </a-row> | |
78 | + </a-form> | |
79 | + </div> | |
80 | + <!-- 查询区域-END --> | |
81 | + | |
82 | + <!-- 操作按钮区域 --> | |
83 | + <div class="table-operator"> | |
84 | + <a-button v-has="'qualityHeader:add'" @click="handleAdd" type="primary" icon="plus">新增</a-button> | |
85 | + <a-button v-has="'qualityHeader:export'" type="primary" icon="download" @click="handleExportXls('质检表单头')">导出</a-button> | |
86 | + <a-upload v-has="'qualityHeader:import'" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel"> | |
87 | + <a-button type="primary" icon="import">导入</a-button> | |
88 | + </a-upload> | |
89 | + <!-- 高级查询区域 --> | |
90 | + <j-super-query v-has="'qualityHeader:superQuery'" :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query> | |
91 | + </div> | |
92 | + | |
93 | + <!-- table区域-begin --> | |
94 | + <div> | |
95 | + <div class="ant-alert ant-alert-info" style="margin-bottom: 16px;"> | |
96 | + <i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>项 | |
97 | + <a style="margin-left: 24px" @click="onClearSelected">清空</a> | |
98 | + </div> | |
99 | + | |
100 | + <a-table | |
101 | + ref="table" | |
102 | + size="middle" | |
103 | + bordered | |
104 | + rowKey="id" | |
105 | + class="j-table-force-nowrap" | |
106 | + :scroll="{x:true}" | |
107 | + :columns="columns" | |
108 | + :dataSource="dataSource" | |
109 | + :pagination="ipagination" | |
110 | + :loading="loading" | |
111 | + :rowSelection="{selectedRowKeys: selectedRowKeys, onChange: onSelectChange, type:'radio'}" | |
112 | + :customRow="clickThenSelect" | |
113 | + @change="handleTableChange"> | |
114 | + | |
115 | + <span slot="companyCode" slot-scope="companyCode"> | |
116 | + <a-tag :key="companyCode" color=blue> | |
117 | + {{ solutionCompany(companyCode) }} | |
118 | + </a-tag> | |
119 | + </span> | |
120 | + | |
121 | + <span slot="firstStatus_dictText" slot-scope="firstStatus_dictText"> | |
122 | + <a-tag :key="firstStatus_dictText" :color="getStatusColor(firstStatus_dictText)"> | |
123 | + {{ firstStatus_dictText }} | |
124 | + </a-tag> | |
125 | + </span> | |
126 | + | |
127 | + <span slot="lastStatus_dictText" slot-scope="lastStatus_dictText"> | |
128 | + <a-tag :key="lastStatus_dictText" :color="getStatusColor(lastStatus_dictText)"> | |
129 | + {{ lastStatus_dictText }} | |
130 | + </a-tag> | |
131 | + </span> | |
132 | + | |
133 | + <span slot="supplierCode" slot-scope="supplierCode"> | |
134 | + <a-tag :key="supplierCode" color=pink> | |
135 | + {{ solutionSupplier(supplierCode) }} | |
136 | + </a-tag> | |
137 | + </span> | |
138 | + | |
139 | + | |
140 | + | |
141 | + <template slot="htmlSlot" slot-scope="text"> | |
142 | + <div v-html="text"></div> | |
143 | + </template> | |
144 | + <template slot="imgSlot" slot-scope="text"> | |
145 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无图片</span> | |
146 | + <img v-else :src="getImgView(text)" height="25px" alt="" style="max-width:80px;font-size: 12px;font-style: italic;"/> | |
147 | + </template> | |
148 | + <template slot="fileSlot" slot-scope="text"> | |
149 | + <span v-if="!text" style="font-size: 12px;font-style: italic;">无文件</span> | |
150 | + <a-button | |
151 | + v-else | |
152 | + :ghost="true" | |
153 | + type="primary" | |
154 | + icon="download" | |
155 | + size="small" | |
156 | + @click="downloadFile(text)"> | |
157 | + 下载 | |
158 | + </a-button> | |
159 | + </template> | |
160 | + | |
161 | + <span slot="action" slot-scope="text, record"> | |
162 | + <a v-has="'qualityHeader:edit'" v-if="(record.firstStatus == 0)" @click="handleEdit(record)"> | |
163 | + <a-button type="primary">编辑</a-button><a-divider type="vertical"/> | |
164 | + </a> | |
165 | + | |
166 | + <a-popconfirm v-has="'qualityHeader:remove'" v-if="(record.firstStatus == 0)" title="确定删除吗?" @confirm="() => handleDelete(record.id)" > | |
167 | + <a><a-button type="primary">删除</a-button></a> | |
168 | + <a-divider type="vertical"/> | |
169 | + </a-popconfirm> | |
170 | +<!-- <a-dropdown>--> | |
171 | +<!-- <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>--> | |
172 | +<!-- <a-menu slot="overlay">--> | |
173 | +<!-- <a-menu-item>--> | |
174 | +<!-- <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">--> | |
175 | +<!-- <a>删除</a>--> | |
176 | +<!-- </a-popconfirm>--> | |
177 | +<!-- </a-menu-item>--> | |
178 | +<!-- </a-menu>--> | |
179 | +<!-- </a-dropdown>--> | |
180 | + </span> | |
181 | + | |
182 | + </a-table> | |
183 | + </div> | |
184 | + | |
185 | + <a-tabs defaultActiveKey="1"> | |
186 | + <a-tab-pane tab="质检单详情" key="1" > | |
187 | + <QualityDetailList :mainId="selectedMainId" /> | |
188 | + </a-tab-pane> | |
189 | + </a-tabs> | |
190 | + | |
191 | + <qualityHeader-modal ref="modalForm" @ok="modalFormOk"></qualityHeader-modal> | |
192 | + </a-card> | |
193 | +</template> | |
194 | + | |
195 | +<script> | |
196 | + | |
197 | + import { JeecgListMixin } from '@/mixins/JeecgListMixin' | |
198 | + import QualityHeaderModal from './modules/QualityHeaderModal' | |
199 | + import { getAction } from '@/api/manage' | |
200 | + import QualityDetailList from './QualityDetailList' | |
201 | + import '@/assets/less/TableExpand.less' | |
202 | + import {getCompanyList, getSupplierList} from "@api/api"; | |
203 | + | |
204 | + export default { | |
205 | + name: "QualityHeaderList", | |
206 | + mixins:[JeecgListMixin], | |
207 | + components: { | |
208 | + QualityDetailList, | |
209 | + QualityHeaderModal | |
210 | + }, | |
211 | + data () { | |
212 | + return { | |
213 | + description: '质检表单头管理页面', | |
214 | + companyList: [], | |
215 | + supplierList: [], | |
216 | + // 表头 | |
217 | + columns: [ | |
218 | + { | |
219 | + title:'编码', | |
220 | + align:"center", | |
221 | + dataIndex: 'code' | |
222 | + }, | |
223 | + { | |
224 | + title:'类型', | |
225 | + align:"center", | |
226 | + dataIndex: 'type_dictText', | |
227 | + }, | |
228 | + { | |
229 | + title: '货主', | |
230 | + align: "center", | |
231 | + dataIndex: 'companyCode', | |
232 | + key: 'companyCode', | |
233 | + scopedSlots: {customRender: 'companyCode'} | |
234 | + }, | |
235 | + { | |
236 | + title:'头状态', | |
237 | + align:"center", | |
238 | + dataIndex: 'firstStatus_dictText', | |
239 | + key: 'firstStatus_dictText', | |
240 | + scopedSlots: {customRender: 'firstStatus_dictText'} | |
241 | + }, | |
242 | + { | |
243 | + title:'尾状态', | |
244 | + align:"center", | |
245 | + dataIndex: 'lastStatus_dictText', | |
246 | + key: 'lastStatus_dictText', | |
247 | + scopedSlots: {customRender: 'lastStatus_dictText'} | |
248 | + }, | |
249 | + { | |
250 | + title:'上游单号', | |
251 | + align:"center", | |
252 | + dataIndex: 'referCode' | |
253 | + }, | |
254 | + { | |
255 | + title: '供应商', | |
256 | + align: "center", | |
257 | + dataIndex: 'supplierCode', | |
258 | + key: 'supplierCode', | |
259 | + scopedSlots: {customRender: 'supplierCode'} | |
260 | + }, | |
261 | + { | |
262 | + title:'总数量', | |
263 | + align:"center", | |
264 | + dataIndex: 'totalQty' | |
265 | + }, | |
266 | + { | |
267 | + title:'总行数', | |
268 | + align:"center", | |
269 | + dataIndex: 'totalLines' | |
270 | + }, | |
271 | + { | |
272 | + title:'备注', | |
273 | + align:"center", | |
274 | + dataIndex: 'remark' | |
275 | + }, | |
276 | + { | |
277 | + title:'创建人', | |
278 | + align:"center", | |
279 | + dataIndex: 'createBy' | |
280 | + }, | |
281 | + { | |
282 | + title:'创建日期', | |
283 | + align:"center", | |
284 | + dataIndex: 'createTime' | |
285 | + }, | |
286 | + { | |
287 | + title:'更新人', | |
288 | + align:"center", | |
289 | + dataIndex: 'updateBy' | |
290 | + }, | |
291 | + { | |
292 | + title:'更新日期', | |
293 | + align:"center", | |
294 | + dataIndex: 'updateTime' | |
295 | + }, | |
296 | + { | |
297 | + title: '操作', | |
298 | + dataIndex: 'action', | |
299 | + align:"center", | |
300 | + fixed:"right", | |
301 | + width:147, | |
302 | + scopedSlots: { customRender: 'action' }, | |
303 | + } | |
304 | + ], | |
305 | + url: { | |
306 | + list: "/receipt/qualityHeader/list", | |
307 | + delete: "/receipt/qualityHeader/delete", | |
308 | + deleteBatch: "/receipt/qualityHeader/deleteBatch", | |
309 | + exportXlsUrl: "/receipt/qualityHeader/exportXls", | |
310 | + importExcelUrl: "receipt/qualityHeader/importExcel", | |
311 | + }, | |
312 | + dictOptions:{ | |
313 | + }, | |
314 | + /* 分页参数 */ | |
315 | + ipagination:{ | |
316 | + current: 1, | |
317 | + pageSize: 5, | |
318 | + pageSizeOptions: ['5', '10', '50'], | |
319 | + showTotal: (total, range) => { | |
320 | + return range[0] + "-" + range[1] + " 共" + total + "条" | |
321 | + }, | |
322 | + showQuickJumper: true, | |
323 | + showSizeChanger: true, | |
324 | + total: 0 | |
325 | + }, | |
326 | + selectedMainId:'', | |
327 | + superFieldList:[], | |
328 | + } | |
329 | + }, | |
330 | + created() { | |
331 | + this.getSuperFieldList(); | |
332 | + this.loadFrom(); | |
333 | + }, | |
334 | + computed: { | |
335 | + importExcelUrl: function(){ | |
336 | + return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`; | |
337 | + } | |
338 | + }, | |
339 | + methods: { | |
340 | + initDictConfig(){ | |
341 | + }, | |
342 | + clickThenSelect(record) { | |
343 | + return { | |
344 | + on: { | |
345 | + click: () => { | |
346 | + this.onSelectChange(record.id.split(","), [record]); | |
347 | + } | |
348 | + } | |
349 | + } | |
350 | + }, | |
351 | + onClearSelected() { | |
352 | + this.selectedRowKeys = []; | |
353 | + this.selectionRows = []; | |
354 | + this.selectedMainId='' | |
355 | + }, | |
356 | + onSelectChange(selectedRowKeys, selectionRows) { | |
357 | + this.selectedMainId=selectedRowKeys[0] | |
358 | + this.selectedRowKeys = selectedRowKeys; | |
359 | + this.selectionRows = selectionRows; | |
360 | + }, | |
361 | + getStatusColor(status) { | |
362 | + const colors = { | |
363 | + '新建': 'green', | |
364 | + '部分质检': 'Skyblue', | |
365 | + '质检完成': 'blue', | |
366 | + default: 'blue' | |
367 | + }; | |
368 | + return colors[status] || colors.default; | |
369 | + }, | |
370 | + loadFrom() { | |
371 | + getCompanyList().then((res) => { | |
372 | + if (res.success) { | |
373 | + this.companyList = res.result | |
374 | + } | |
375 | + }); | |
376 | + getSupplierList().then((res) => { | |
377 | + if (res.success) { | |
378 | + this.supplierList = res.result | |
379 | + } | |
380 | + }); | |
381 | + }, | |
382 | + solutionCompany(value) { | |
383 | + var actions = [] | |
384 | + Object.keys(this.companyList).some((key) => { | |
385 | + if (this.companyList[key].code == ('' + value)) { | |
386 | + actions.push(this.companyList[key].name) | |
387 | + return true | |
388 | + } | |
389 | + }) | |
390 | + return actions.join('') | |
391 | + }, | |
392 | + solutionSupplier(value) { | |
393 | + var actions = [] | |
394 | + Object.keys(this.supplierList).some((key) => { | |
395 | + if (this.supplierList[key].code == ('' + value)) { | |
396 | + actions.push(this.supplierList[key].name) | |
397 | + return true | |
398 | + } | |
399 | + }) | |
400 | + return actions.join('') | |
401 | + }, | |
402 | + loadData(arg) { | |
403 | + if(!this.url.list){ | |
404 | + this.$message.error("请设置url.list属性!") | |
405 | + return | |
406 | + } | |
407 | + //加载数据 若传入参数1则加载第一页的内容 | |
408 | + if (arg === 1) { | |
409 | + this.ipagination.current = 1; | |
410 | + } | |
411 | + this.onClearSelected() | |
412 | + var params = this.getQueryParams();//查询条件 | |
413 | + this.loading = true; | |
414 | + getAction(this.url.list, params).then((res) => { | |
415 | + if (res.success) { | |
416 | + this.dataSource = res.result.records; | |
417 | + this.ipagination.total = res.result.total; | |
418 | + } | |
419 | + if(res.code===510){ | |
420 | + this.$message.warning(res.message) | |
421 | + } | |
422 | + this.loading = false; | |
423 | + }) | |
424 | + }, | |
425 | + getSuperFieldList(){ | |
426 | + let fieldList=[]; | |
427 | + fieldList.push({type:'string',value:'code',text:'编码',dictCode:''}) | |
428 | + fieldList.push({type:'string',value:'type',text:'类型',dictCode:''}) | |
429 | + fieldList.push({type:'string',value:'companyCode',text:'货主编码',dictCode:''}) | |
430 | + fieldList.push({type:'int',value:'firstStatus',text:'头状态',dictCode:''}) | |
431 | + fieldList.push({type:'int',value:'lastStatus',text:'尾状态',dictCode:''}) | |
432 | + fieldList.push({type:'string',value:'referCode',text:'上游单号',dictCode:''}) | |
433 | + fieldList.push({type:'string',value:'supplierCode',text:'供应商编码',dictCode:''}) | |
434 | + fieldList.push({type:'BigDecimal',value:'totalQty',text:'总数量',dictCode:''}) | |
435 | + fieldList.push({type:'int',value:'totalLines',text:'总行数',dictCode:''}) | |
436 | + fieldList.push({type:'string',value:'remark',text:'备注',dictCode:''}) | |
437 | + fieldList.push({type:'string',value:'createBy',text:'创建人',dictCode:''}) | |
438 | + fieldList.push({type:'datetime',value:'createTime',text:'创建日期'}) | |
439 | + fieldList.push({type:'string',value:'updateBy',text:'更新人',dictCode:''}) | |
440 | + fieldList.push({type:'datetime',value:'updateTime',text:'更新日期'}) | |
441 | + this.superFieldList = fieldList | |
442 | + } | |
443 | + } | |
444 | + } | |
445 | +</script> | |
446 | +<style scoped> | |
447 | + @import '~@assets/less/common.less' | |
448 | +</style> | |
0 | 449 | \ No newline at end of file |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/ReceiptHeaderList.vue
... | ... | @@ -178,6 +178,11 @@ |
178 | 178 | <span slot="action" slot-scope="text, record"> |
179 | 179 | <a-popconfirm v-has="'receiptHeader:back'" v-if="record.lastStatus == 800" title="确定回传吗?" @confirm="() => hanleBack(record)"> |
180 | 180 | <a><a-button type="default">回传</a-button></a> |
181 | + <a-divider type="vertical"/> | |
182 | + </a-popconfirm> | |
183 | + <a-popconfirm v-has="'receiptHeader:crossDocking'" v-if="record.lastStatus == 0" title="确定越库吗?" @confirm="() => hanleCross(record)"> | |
184 | + <a><a-button type="primary">越库</a-button></a> | |
185 | + <a-divider type="vertical"/> | |
181 | 186 | </a-popconfirm> |
182 | 187 | <a v-if="(record.lastStatus < 800 && record.firstStatus >= 15 && record.firstStatus != '20') || (flowOff == '0' && record.lastStatus < 800) " @click="receive(record)" v-has="'receiptHeader:receive'"> |
183 | 188 | <a-button type="primary">组盘</a-button> |
... | ... | @@ -230,7 +235,7 @@ import {initDictOptions, filterMultiDictText} from '@/components/dict/JDictSelec |
230 | 235 | import '@/assets/less/TableExpand.less' |
231 | 236 | import {getCompanyList} from '@/api/api' |
232 | 237 | import {getReceiptTypeList} from '@/api/api' |
233 | -import {getSupplierList, backErpReceipt,createReceiptAuditFlow,getDocumentAduitFlow} from '@/api/api' | |
238 | +import {getSupplierList, backErpReceipt,createReceiptAuditFlow,getDocumentAduitFlow, crossDocking} from '@/api/api' | |
234 | 239 | import ReceiptModal from "./modules/ReceiptModal"; |
235 | 240 | import { notification } from 'ant-design-vue'; |
236 | 241 | import FlowProcess from "../flow/FlowProcess"; |
... | ... | @@ -537,6 +542,16 @@ export default { |
537 | 542 | this.searchQuery(); |
538 | 543 | }); |
539 | 544 | }, |
545 | + hanleCross(record) { | |
546 | + crossDocking(record.id).then((res) => { | |
547 | + if (res.success) { | |
548 | + this.$message.success(res.message); | |
549 | + } else { | |
550 | + this.$message.warning(res.message); | |
551 | + } | |
552 | + this.searchQuery(); | |
553 | + }); | |
554 | + }, | |
540 | 555 | loadFrom() { |
541 | 556 | getCompanyList().then((res) => { |
542 | 557 | if (res.success) { |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/ReceiveDetailList.vue
... | ... | @@ -80,9 +80,11 @@ |
80 | 80 | </template> |
81 | 81 | |
82 | 82 | <span slot="action" slot-scope="text, record"> |
83 | - <a @click="handleEdit(record)">编辑</a> | |
83 | + <a v-has="'receiveDetail:edit'" @click="handleEdit(record)">编辑</a> | |
84 | 84 | <a-divider type="vertical" /> |
85 | - <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> | |
85 | + <a v-has="'receiveDetail:quality'" v-if="(record.status == 200)" @click="receiveDetailToQuality(record.id)">质检</a> | |
86 | + <a-divider type="vertical" /> | |
87 | + <a-popconfirm v-has="'receiveDetail:remove'" title="确定删除吗?" @confirm="() => handleDelete(record.id)"> | |
86 | 88 | <a>删除</a> |
87 | 89 | </a-popconfirm> |
88 | 90 | </span> |
... | ... | @@ -98,7 +100,7 @@ |
98 | 100 | |
99 | 101 | import { JeecgListMixin } from '@/mixins/JeecgListMixin' |
100 | 102 | import ReceiveDetailModal from './modules/ReceiveDetailModal' |
101 | - import {getCompanyList, getSupplierList} from "@api/api"; | |
103 | + import {getCompanyList, getSupplierList, receiveHeader, receiveDetailToQuality} from "@api/api"; | |
102 | 104 | |
103 | 105 | export default { |
104 | 106 | name: "ReceiveDetailList", |
... | ... | @@ -175,6 +177,11 @@ |
175 | 177 | dataIndex: 'taskQty' |
176 | 178 | }, |
177 | 179 | { |
180 | + title:'质检数量', | |
181 | + align:"center", | |
182 | + dataIndex: 'qualityQty' | |
183 | + }, | |
184 | + { | |
178 | 185 | title: '库存状态', |
179 | 186 | align: "center", |
180 | 187 | dataIndex: 'inventoryStatus_dictText', |
... | ... | @@ -262,6 +269,16 @@ |
262 | 269 | } |
263 | 270 | }); |
264 | 271 | }, |
272 | + receiveDetailToQuality(record) { | |
273 | + receiveDetailToQuality(record).then((res) => { | |
274 | + if (res.success) { | |
275 | + this.$message.success(res.message) | |
276 | + } else { | |
277 | + this.$message.warning(res.message) | |
278 | + } | |
279 | + this.searchQuery(); | |
280 | + }); | |
281 | + }, | |
265 | 282 | getStatusColor(status) { |
266 | 283 | const colors = { |
267 | 284 | '良品': 'green', |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/ReceiveHeaderList.vue
... | ... | @@ -80,14 +80,14 @@ |
80 | 80 | |
81 | 81 | <!-- 操作按钮区域 --> |
82 | 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"> | |
83 | + <a-button v-has="'receiveHeader:add'" @click="handleAdd" type="primary" icon="plus">新增</a-button> | |
84 | + <a-button v-has="'receiveHeader:export'" type="primary" icon="download" @click="handleExportXls('收货单表头')">导出</a-button> | |
85 | + <a-upload v-has="'receiveHeader:import'" name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel"> | |
86 | 86 | <a-button type="primary" icon="import">导入</a-button> |
87 | - <a-button v-has="'receiveHeader:print'" @click="batchPrint()" type="primary">打印</a-button> | |
88 | 87 | </a-upload> |
88 | + <a-button v-has="'receiveHeader:print'" @click="batchPrint()" type="primary">打印</a-button> | |
89 | 89 | <!-- 高级查询区域 --> |
90 | -<!-- <j-super-query :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query>--> | |
90 | + <j-super-query v-has="'receiveHeader:superQuery'" :fieldList="superFieldList" ref="superQueryModal" @handleSuperQuery="handleSuperQuery"></j-super-query> | |
91 | 91 | </div> |
92 | 92 | |
93 | 93 | <!-- table区域-begin --> |
... | ... | @@ -118,6 +118,12 @@ |
118 | 118 | </a-tag> |
119 | 119 | </span> |
120 | 120 | |
121 | + <span slot="type" slot-scope="type"> | |
122 | + <a-tag :key="type" color=pink> | |
123 | + {{ solutionType(type) }} | |
124 | + </a-tag> | |
125 | + </span> | |
126 | + | |
121 | 127 | <span slot="firstStatus_dictText" slot-scope="firstStatus_dictText"> |
122 | 128 | <a-tag :key="firstStatus_dictText" :color="getStatusColor(firstStatus_dictText)"> |
123 | 129 | {{ firstStatus_dictText }} |
... | ... | @@ -157,22 +163,32 @@ |
157 | 163 | </template> |
158 | 164 | |
159 | 165 | <span slot="action" slot-scope="text, record"> |
160 | - <a @click="receive(record)"> | |
161 | - <a-button v-if="(record.lastStatus < 200)" type="primary">收货</a-button><a-divider type="vertical"/> | |
166 | + <a v-has="'receiveHeader:receive'" v-if="(record.lastStatus < 200)" @click="receive(record)"> | |
167 | + <a-button type="primary">收货</a-button><a-divider type="vertical"/> | |
162 | 168 | </a> |
163 | - <a @click="handleEdit(record)"> | |
164 | - <a-button type="primary">编辑</a-button><a-divider type="vertical"/> | |
169 | + <a v-has="'receiveHeader:receive'" v-if="(record.lastStatus < 200)" @click="receiveHeader(record.id)"> | |
170 | + <a-button type="primary">全部收货</a-button><a-divider type="vertical"/> | |
165 | 171 | </a> |
166 | - <a-dropdown> | |
167 | - <a class="ant-dropdown-link">更多 <a-icon type="down" /></a> | |
168 | - <a-menu slot="overlay"> | |
169 | - <a-menu-item> | |
170 | - <a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)"> | |
171 | - <a>删除</a> | |
172 | - </a-popconfirm> | |
173 | - </a-menu-item> | |
174 | - </a-menu> | |
175 | - </a-dropdown> | |
172 | + <a v-has="'receiveHeader:quality'" v-if="(record.lastStatus == 200)" @click="receiveHeaderToQuality(record.id)"> | |
173 | + <a-button type="primary">全部质检</a-button><a-divider type="vertical"/> | |
174 | + </a> | |
175 | + <a v-has="'receiveHeader:edit'" v-if="(record.firstStatus == 0)" @click="handleEdit(record)"> | |
176 | + <a-button type="primary">编辑</a-button><a-divider type="vertical"/> | |
177 | + </a> | |
178 | + <a-popconfirm v-has="'receiveHeader:remove'" v-if="(record.firstStatus == 0)" title="确定删除吗?" @confirm="() => handleDelete(record.id)" > | |
179 | + <a><a-button type="primary">删除</a-button></a> | |
180 | + <a-divider type="vertical"/> | |
181 | + </a-popconfirm> | |
182 | +<!-- <a-dropdown>--> | |
183 | +<!-- <a class="ant-dropdown-link">更多 <a-icon type="down" /></a>--> | |
184 | +<!-- <a-menu slot="overlay">--> | |
185 | +<!-- <a-menu-item>--> | |
186 | +<!-- <a-popconfirm v-has="'receiveHeader:remove'" title="确定删除吗?" @confirm="() => handleDelete(record.id)">--> | |
187 | +<!-- <a>删除</a>--> | |
188 | +<!-- </a-popconfirm>--> | |
189 | +<!-- </a-menu-item>--> | |
190 | +<!-- </a-menu>--> | |
191 | +<!-- </a-dropdown>--> | |
176 | 192 | </span> |
177 | 193 | |
178 | 194 | </a-table> |
... | ... | @@ -196,7 +212,7 @@ |
196 | 212 | import { getAction } from '@/api/manage' |
197 | 213 | import ReceiveDetailList from './ReceiveDetailList' |
198 | 214 | import '@/assets/less/TableExpand.less' |
199 | - import {getCompanyList, getSupplierList} from "@api/api"; | |
215 | + import {getCompanyList, getSupplierList, receiveHeader, receiveHeaderToQuality} from "@api/api"; | |
200 | 216 | import ReceiveModal from "@views/system/receipt/modules/ReceiveModal"; |
201 | 217 | |
202 | 218 | export default { |
... | ... | @@ -382,6 +398,26 @@ |
382 | 398 | this.$refs.modalForm2.edit(record); |
383 | 399 | this.$refs.modalForm2.title = "收货"; |
384 | 400 | }, |
401 | + receiveHeader(record) { | |
402 | + receiveHeader(record).then((res) => { | |
403 | + if (res.success) { | |
404 | + this.$message.success(res.message) | |
405 | + } else { | |
406 | + this.$message.warning(res.message) | |
407 | + } | |
408 | + this.searchQuery(); | |
409 | + }); | |
410 | + }, | |
411 | + receiveHeaderToQuality(record) { | |
412 | + receiveHeaderToQuality(record).then((res) => { | |
413 | + if (res.success) { | |
414 | + this.$message.success(res.message) | |
415 | + } else { | |
416 | + this.$message.warning(res.message) | |
417 | + } | |
418 | + this.searchQuery(); | |
419 | + }); | |
420 | + }, | |
385 | 421 | loadFrom() { |
386 | 422 | getCompanyList().then((res) => { |
387 | 423 | if (res.success) { |
... | ... | @@ -394,6 +430,16 @@ |
394 | 430 | } |
395 | 431 | }); |
396 | 432 | }, |
433 | + solutionType(value) { | |
434 | + var actions = [] | |
435 | + Object.keys(this.receiptTypeList).some((key) => { | |
436 | + if (this.receiptTypeList[key].code == ('' + value)) { | |
437 | + actions.push(this.receiptTypeList[key].name) | |
438 | + return true | |
439 | + } | |
440 | + }) | |
441 | + return actions.join('') | |
442 | + }, | |
397 | 443 | solutionCompany(value) { |
398 | 444 | var actions = [] |
399 | 445 | Object.keys(this.companyList).some((key) => { |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/modules/QualityDetailModal.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="materialCode"> | |
16 | + <a-input v-model="model.materialCode"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="materialName"> | |
21 | + <a-input v-model="model.materialName"placeholder="请输入物料名称" ></a-input> | |
22 | + </a-form-model-item> | |
23 | + </a-col> | |
24 | + <a-col :span="24"> | |
25 | + <a-form-model-item label="物料规格" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialSpec"> | |
26 | + <a-input v-model="model.materialSpec"placeholder="请输入物料规格" ></a-input> | |
27 | + </a-form-model-item> | |
28 | + </a-col> | |
29 | + <a-col :span="24"> | |
30 | + <a-form-model-item label="物料单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialUnit"> | |
31 | + <a-input v-model="model.materialUnit"placeholder="请输入物料单位" ></a-input> | |
32 | + </a-form-model-item> | |
33 | + </a-col> | |
34 | + <a-col :span="24"> | |
35 | + <a-form-model-item label="单据数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qty"> | |
36 | + <a-input-number v-model="model.qty"placeholder="请输入单据数量" style="width: 100%" /> | |
37 | + </a-form-model-item> | |
38 | + </a-col> | |
39 | + <a-col :span="24"> | |
40 | + <a-form-model-item label="库存状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="inventoryStatus"> | |
41 | + <a-input v-model="model.inventoryStatus"placeholder="请输入库存状态" ></a-input> | |
42 | + </a-form-model-item> | |
43 | + </a-col> | |
44 | + <a-col :span="24"> | |
45 | + <a-form-model-item label="批次" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="batch"> | |
46 | + <a-input v-model="model.batch"placeholder="请输入批次" ></a-input> | |
47 | + </a-form-model-item> | |
48 | + </a-col> | |
49 | + <a-col :span="24"> | |
50 | + <a-form-model-item label="批号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="lot"> | |
51 | + <a-input v-model="model.lot"placeholder="请输入批号" ></a-input> | |
52 | + </a-form-model-item> | |
53 | + </a-col> | |
54 | + <a-col :span="24"> | |
55 | + <a-form-model-item label="项目号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="project"> | |
56 | + <a-input v-model="model.project"placeholder="请输入项目号" ></a-input> | |
57 | + </a-form-model-item> | |
58 | + </a-col> | |
59 | + <a-col :span="24"> | |
60 | + <a-form-model-item label="单据状态" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="status"> | |
61 | + <a-input-number v-model="model.status"placeholder="请输入单据状态" style="width: 100%" /> | |
62 | + </a-form-model-item> | |
63 | + </a-col> | |
64 | + </a-row> | |
65 | + </a-form-model> | |
66 | + </a-spin> | |
67 | + </j-modal> | |
68 | +</template> | |
69 | + | |
70 | +<script> | |
71 | + | |
72 | + import { httpAction } from '@/api/manage' | |
73 | + import { validateDuplicateValue } from '@/utils/util' | |
74 | + import {receiveHeader} from "@api/api"; | |
75 | + | |
76 | + export default { | |
77 | + name: "QualityDetailModal", | |
78 | + components: { | |
79 | + }, | |
80 | + props:{ | |
81 | + mainId:{ | |
82 | + type:String, | |
83 | + required:false, | |
84 | + default:'' | |
85 | + } | |
86 | + }, | |
87 | + data () { | |
88 | + return { | |
89 | + title:"操作", | |
90 | + width:800, | |
91 | + visible: false, | |
92 | + model:{ | |
93 | + }, | |
94 | + labelCol: { | |
95 | + xs: { span: 24 }, | |
96 | + sm: { span: 5 }, | |
97 | + }, | |
98 | + wrapperCol: { | |
99 | + xs: { span: 24 }, | |
100 | + sm: { span: 16 }, | |
101 | + }, | |
102 | + | |
103 | + confirmLoading: false, | |
104 | +validatorRules: { | |
105 | +}, | |
106 | + url: { | |
107 | + add: "/receipt/qualityHeader/addQualityDetail", | |
108 | + edit: "/receipt/qualityHeader/editQualityDetail", | |
109 | + } | |
110 | + | |
111 | + } | |
112 | + }, | |
113 | + created () { | |
114 | + //备份model原始值 | |
115 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
116 | + }, | |
117 | + methods: { | |
118 | + add () { | |
119 | + this.edit(this.modelDefault); | |
120 | + }, | |
121 | + edit (record) { | |
122 | + this.model = Object.assign({}, record); | |
123 | + this.visible = true; | |
124 | + }, | |
125 | + close () { | |
126 | + this.$emit('close'); | |
127 | + this.visible = false; | |
128 | + this.$refs.form.clearValidate(); | |
129 | + }, | |
130 | + handleOk () { | |
131 | + const that = this; | |
132 | + // 触发表单验证 | |
133 | + this.$refs.form.validate(valid => { | |
134 | + if (valid) { | |
135 | + that.confirmLoading = true; | |
136 | + let httpurl = ''; | |
137 | + let method = ''; | |
138 | + if(!this.model.id){ | |
139 | + httpurl+=this.url.add; | |
140 | + method = 'post'; | |
141 | + }else{ | |
142 | + httpurl+=this.url.edit; | |
143 | + method = 'put'; | |
144 | + } | |
145 | + this.model['qualityId'] = this.mainId | |
146 | + httpAction(httpurl,this.model,method).then((res)=>{ | |
147 | + if(res.success){ | |
148 | + that.$message.success(res.message); | |
149 | + that.$emit('ok'); | |
150 | + }else{ | |
151 | + that.$message.warning(res.message); | |
152 | + } | |
153 | + }).finally(() => { | |
154 | + that.confirmLoading = false; | |
155 | + that.close(); | |
156 | + }) | |
157 | + }else{ | |
158 | + return false | |
159 | + } | |
160 | + }) | |
161 | + }, | |
162 | + handleCancel () { | |
163 | + this.close() | |
164 | + }, | |
165 | + | |
166 | + | |
167 | + } | |
168 | + } | |
169 | +</script> | |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/modules/QualityHeaderForm.vue
0 → 100644
1 | +<template> | |
2 | + <a-spin :spinning="confirmLoading"> | |
3 | + <j-form-container :disabled="formDisabled"> | |
4 | + <!-- 主表单区域 --> | |
5 | + <a-form-model ref="form" :model="model" :rules="validatorRules" slot="detail"> | |
6 | + <a-row> | |
7 | + <a-col :span="24" > | |
8 | + <a-form-model-item label="编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="code"> | |
9 | + <a-input v-model="model.code" placeholder="请输入编码" ></a-input> | |
10 | + </a-form-model-item> | |
11 | + </a-col> | |
12 | + <a-col :span="24" > | |
13 | + <a-form-model-item label="类型" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="type"> | |
14 | + <a-input v-model="model.type" placeholder="请输入类型" ></a-input> | |
15 | + </a-form-model-item> | |
16 | + </a-col> | |
17 | + <a-col :span="24" > | |
18 | + <a-form-model-item label="货主编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="companyCode"> | |
19 | + <a-input v-model="model.companyCode" placeholder="请输入货主编码" ></a-input> | |
20 | + </a-form-model-item> | |
21 | + </a-col> | |
22 | + <a-col :span="24" > | |
23 | + <a-form-model-item label="上游单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="referCode"> | |
24 | + <a-input v-model="model.referCode" placeholder="请输入上游单号" ></a-input> | |
25 | + </a-form-model-item> | |
26 | + </a-col> | |
27 | + <a-col :span="24" > | |
28 | + <a-form-model-item label="供应商编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="supplierCode"> | |
29 | + <a-input v-model="model.supplierCode" placeholder="请输入供应商编码" ></a-input> | |
30 | + </a-form-model-item> | |
31 | + </a-col> | |
32 | + <a-col :span="24" > | |
33 | + <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark"> | |
34 | + <a-input v-model="model.remark" placeholder="请输入备注" ></a-input> | |
35 | + </a-form-model-item> | |
36 | + </a-col> | |
37 | + </a-row> | |
38 | + </a-form-model> | |
39 | + </j-form-container> | |
40 | + <!-- 子表单区域 --> | |
41 | + <a-tabs v-model="activeKey" @change="handleChangeTabs"> | |
42 | + <a-tab-pane tab="质检单详情" :key="refKeys[0]" :forceRender="true"> | |
43 | + <j-vxe-table | |
44 | + keep-source | |
45 | + :ref="refKeys[0]" | |
46 | + :loading="qualityDetailTable.loading" | |
47 | + :columns="qualityDetailTable.columns" | |
48 | + :dataSource="qualityDetailTable.dataSource" | |
49 | + :maxHeight="300" | |
50 | + :disabled="formDisabled" | |
51 | + :rowNumber="true" | |
52 | + :rowSelection="true" | |
53 | + :toolbar="true" | |
54 | + /> | |
55 | + </a-tab-pane> | |
56 | + </a-tabs> | |
57 | + </a-spin> | |
58 | +</template> | |
59 | + | |
60 | +<script> | |
61 | + | |
62 | + import { getAction } from '@/api/manage' | |
63 | + import { JVxeTableModelMixin } from '@/mixins/JVxeTableModelMixin.js' | |
64 | + import { JVXETypes } from '@/components/jeecg/JVxeTable' | |
65 | + import { getRefPromise,VALIDATE_FAILED} from '@/components/jeecg/JVxeTable/utils/vxeUtils.js' | |
66 | + import { validateDuplicateValue } from '@/utils/util' | |
67 | + import JFormContainer from '@/components/jeecg/JFormContainer' | |
68 | + | |
69 | + export default { | |
70 | + name: 'QualityHeaderForm', | |
71 | + mixins: [JVxeTableModelMixin], | |
72 | + components: { | |
73 | + JFormContainer, | |
74 | + }, | |
75 | + data() { | |
76 | + return { | |
77 | + labelCol: { | |
78 | + xs: { span: 24 }, | |
79 | + sm: { span: 5 }, | |
80 | + }, | |
81 | + wrapperCol: { | |
82 | + xs: { span: 24 }, | |
83 | + sm: { span: 16 }, | |
84 | + }, | |
85 | + model:{ | |
86 | + }, | |
87 | + // 新增时子表默认添加几行空数据 | |
88 | + addDefaultRowNum: 1, | |
89 | +validatorRules: { | |
90 | + code: [ | |
91 | + { required: true, message: '请输入编码!'}, | |
92 | + ], | |
93 | +}, | |
94 | + refKeys: ['qualityDetail', ], | |
95 | + tableKeys:['qualityDetail', ], | |
96 | + activeKey: 'qualityDetail', | |
97 | + // 质检单详情 | |
98 | + qualityDetailTable: { | |
99 | + loading: false, | |
100 | + dataSource: [], | |
101 | + columns: [ | |
102 | + { | |
103 | + title: '物料编码', | |
104 | + key: 'materialCode', | |
105 | + type: JVXETypes.input, | |
106 | + width:"200px", | |
107 | + placeholder: '请输入${title}', | |
108 | + defaultValue:'', | |
109 | + }, | |
110 | + { | |
111 | + title: '物料名称', | |
112 | + key: 'materialName', | |
113 | + type: JVXETypes.input, | |
114 | + width:"200px", | |
115 | + placeholder: '请输入${title}', | |
116 | + defaultValue:'', | |
117 | + }, | |
118 | + { | |
119 | + title: '物料规格', | |
120 | + key: 'materialSpec', | |
121 | + type: JVXETypes.input, | |
122 | + width:"200px", | |
123 | + placeholder: '请输入${title}', | |
124 | + defaultValue:'', | |
125 | + }, | |
126 | + { | |
127 | + title: '物料单位', | |
128 | + key: 'materialUnit', | |
129 | + type: JVXETypes.input, | |
130 | + width:"200px", | |
131 | + placeholder: '请输入${title}', | |
132 | + defaultValue:'', | |
133 | + }, | |
134 | + { | |
135 | + title: '单据数量', | |
136 | + key: 'qty', | |
137 | + type: JVXETypes.input, | |
138 | + width:"200px", | |
139 | + placeholder: '请输入${title}', | |
140 | + defaultValue:'', | |
141 | + }, | |
142 | + { | |
143 | + title: '库存状态', | |
144 | + key: 'inventoryStatus', | |
145 | + type: JVXETypes.input, | |
146 | + width:"200px", | |
147 | + placeholder: '请输入${title}', | |
148 | + defaultValue:'', | |
149 | + }, | |
150 | + { | |
151 | + title: '批次', | |
152 | + key: 'batch', | |
153 | + type: JVXETypes.input, | |
154 | + width:"200px", | |
155 | + placeholder: '请输入${title}', | |
156 | + defaultValue:'', | |
157 | + }, | |
158 | + { | |
159 | + title: '批号', | |
160 | + key: 'lot', | |
161 | + type: JVXETypes.input, | |
162 | + width:"200px", | |
163 | + placeholder: '请输入${title}', | |
164 | + defaultValue:'', | |
165 | + }, | |
166 | + { | |
167 | + title: '项目号', | |
168 | + key: 'project', | |
169 | + type: JVXETypes.input, | |
170 | + width:"200px", | |
171 | + placeholder: '请输入${title}', | |
172 | + defaultValue:'', | |
173 | + }, | |
174 | + { | |
175 | + title: '单据状态', | |
176 | + key: 'status', | |
177 | + type: JVXETypes.input, | |
178 | + width:"200px", | |
179 | + placeholder: '请输入${title}', | |
180 | + defaultValue:'', | |
181 | + }, | |
182 | + ] | |
183 | + }, | |
184 | + url: { | |
185 | + add: "/receipt/qualityHeader/add", | |
186 | + edit: "/receipt/qualityHeader/edit", | |
187 | + queryById: "/receipt/qualityHeader/queryById", | |
188 | + qualityDetail: { | |
189 | + list: '/receipt/qualityHeader/queryQualityDetailByMainId' | |
190 | + }, | |
191 | + } | |
192 | + } | |
193 | + }, | |
194 | + props: { | |
195 | + //表单禁用 | |
196 | + disabled: { | |
197 | + type: Boolean, | |
198 | + default: false, | |
199 | + required: false | |
200 | + } | |
201 | + }, | |
202 | + computed: { | |
203 | + formDisabled(){ | |
204 | + return this.disabled | |
205 | + }, | |
206 | + }, | |
207 | + created () { | |
208 | + }, | |
209 | + methods: { | |
210 | + addBefore(){ | |
211 | + this.qualityDetailTable.dataSource=[] | |
212 | + }, | |
213 | + getAllTable() { | |
214 | + let values = this.tableKeys.map(key => getRefPromise(this, key)) | |
215 | + return Promise.all(values) | |
216 | + }, | |
217 | + /** 调用完edit()方法之后会自动调用此方法 */ | |
218 | + editAfter() { | |
219 | + this.$nextTick(() => { | |
220 | + }) | |
221 | + // 加载子表数据 | |
222 | + if (this.model.id) { | |
223 | + let params = { id: this.model.id } | |
224 | + this.requestSubTableData(this.url.qualityDetail.list, params, this.qualityDetailTable) | |
225 | + } | |
226 | + }, | |
227 | + //校验所有一对一子表表单 | |
228 | + validateSubForm(allValues){ | |
229 | + return new Promise((resolve,reject)=>{ | |
230 | + Promise.all([ | |
231 | + ]).then(() => { | |
232 | + resolve(allValues) | |
233 | + }).catch(e => { | |
234 | + if (e.error === VALIDATE_FAILED) { | |
235 | + // 如果有未通过表单验证的子表,就自动跳转到它所在的tab | |
236 | + this.activeKey = e.index == null ? this.activeKey : this.refKeys[e.index] | |
237 | + } else { | |
238 | + console.error(e) | |
239 | + } | |
240 | + }) | |
241 | + }) | |
242 | + }, | |
243 | + /** 整理成formData */ | |
244 | + classifyIntoFormData(allValues) { | |
245 | + let main = Object.assign(this.model, allValues.formValue) | |
246 | + return { | |
247 | + ...main, // 展开 | |
248 | + qualityDetailList: allValues.tablesValue[0].tableData, | |
249 | + } | |
250 | + }, | |
251 | + validateError(msg){ | |
252 | + this.$message.error(msg) | |
253 | + }, | |
254 | + | |
255 | + } | |
256 | + } | |
257 | +</script> | |
258 | + | |
259 | +<style scoped> | |
260 | +</style> | |
0 | 261 | \ No newline at end of file |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/modules/QualityHeaderModal.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="code"> | |
16 | + <a-input v-model="model.code" 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="type"> | |
21 | + <a-input v-model="model.type" placeholder="请输入类型" ></a-input> | |
22 | + </a-form-model-item> | |
23 | + </a-col> | |
24 | + <a-col :span="24"> | |
25 | + <a-form-model-item label="货主编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="companyCode"> | |
26 | + <a-input v-model="model.companyCode" placeholder="请输入货主编码" ></a-input> | |
27 | + </a-form-model-item> | |
28 | + </a-col> | |
29 | + <a-col :span="24"> | |
30 | + <a-form-model-item label="上游单号" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="referCode"> | |
31 | + <a-input v-model="model.referCode" placeholder="请输入上游单号" ></a-input> | |
32 | + </a-form-model-item> | |
33 | + </a-col> | |
34 | + <a-col :span="24"> | |
35 | + <a-form-model-item label="供应商编码" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="supplierCode"> | |
36 | + <a-input v-model="model.supplierCode" placeholder="请输入供应商编码" ></a-input> | |
37 | + </a-form-model-item> | |
38 | + </a-col> | |
39 | + <a-col :span="24"> | |
40 | + <a-form-model-item label="备注" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark"> | |
41 | + <a-input v-model="model.remark" placeholder="请输入备注" ></a-input> | |
42 | + </a-form-model-item> | |
43 | + </a-col> | |
44 | + </a-row> | |
45 | + </a-form-model> | |
46 | + </a-spin> | |
47 | + </j-modal> | |
48 | +</template> | |
49 | + | |
50 | +<script> | |
51 | + | |
52 | + import { httpAction } from '@/api/manage' | |
53 | + import { validateDuplicateValue } from '@/utils/util' | |
54 | + | |
55 | + export default { | |
56 | + name: "QualityHeaderModal", | |
57 | + components: { | |
58 | + }, | |
59 | + data () { | |
60 | + return { | |
61 | + title:"操作", | |
62 | + width:800, | |
63 | + visible: false, | |
64 | + model:{ | |
65 | + }, | |
66 | + labelCol: { | |
67 | + xs: { span: 24 }, | |
68 | + sm: { span: 5 }, | |
69 | + }, | |
70 | + wrapperCol: { | |
71 | + xs: { span: 24 }, | |
72 | + sm: { span: 16 }, | |
73 | + }, | |
74 | + | |
75 | + confirmLoading: false, | |
76 | +validatorRules: { | |
77 | + code: [ | |
78 | + { required: true, message: '请输入编码!'}, | |
79 | + ], | |
80 | +}, | |
81 | + url: { | |
82 | + add: "/receipt/qualityHeader/add", | |
83 | + edit: "/receipt/qualityHeader/edit", | |
84 | + } | |
85 | + | |
86 | + } | |
87 | + }, | |
88 | + created () { | |
89 | + //备份model原始值 | |
90 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
91 | + }, | |
92 | + methods: { | |
93 | + add () { | |
94 | + this.edit(this.modelDefault); | |
95 | + }, | |
96 | + edit (record) { | |
97 | + this.model = Object.assign({}, record); | |
98 | + this.visible = true; | |
99 | + }, | |
100 | + close () { | |
101 | + this.$emit('close'); | |
102 | + this.visible = false; | |
103 | + this.$refs.form.clearValidate(); | |
104 | + }, | |
105 | + handleOk () { | |
106 | + const that = this; | |
107 | + // 触发表单验证 | |
108 | + this.$refs.form.validate(valid => { | |
109 | + if (valid) { | |
110 | + that.confirmLoading = true; | |
111 | + let httpurl = ''; | |
112 | + let method = ''; | |
113 | + if(!this.model.id){ | |
114 | + httpurl+=this.url.add; | |
115 | + method = 'post'; | |
116 | + }else{ | |
117 | + httpurl+=this.url.edit; | |
118 | + method = 'put'; | |
119 | + } | |
120 | + httpAction(httpurl,this.model,method).then((res)=>{ | |
121 | + if(res.success){ | |
122 | + that.$message.success(res.message); | |
123 | + that.$emit('ok'); | |
124 | + }else{ | |
125 | + that.$message.warning(res.message); | |
126 | + } | |
127 | + }).finally(() => { | |
128 | + that.confirmLoading = false; | |
129 | + that.close(); | |
130 | + }) | |
131 | + }else{ | |
132 | + return false | |
133 | + } | |
134 | + }) | |
135 | + }, | |
136 | + handleCancel () { | |
137 | + this.close() | |
138 | + }, | |
139 | + | |
140 | + | |
141 | + } | |
142 | + } | |
143 | +</script> | |
0 | 144 | \ No newline at end of file |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/modules/QualityTestingModal.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="materialCode"> | |
16 | + <a-input v-model="model.materialCode"placeholder="请输入物料编码" disabled="true"/></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="materialName"> | |
21 | + <a-input v-model="model.materialName"placeholder="请输入物料名称" disabled="true"></a-input> | |
22 | + </a-form-model-item> | |
23 | + </a-col> | |
24 | + <a-col :span="24"> | |
25 | + <a-form-model-item label="物料规格" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialSpec"> | |
26 | + <a-input v-model="model.materialSpec"placeholder="请输入物料规格" disabled="true"></a-input> | |
27 | + </a-form-model-item> | |
28 | + </a-col> | |
29 | + <a-col :span="24"> | |
30 | + <a-form-model-item label="物料单位" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="materialUnit"> | |
31 | + <a-input v-model="model.materialUnit"placeholder="请输入物料单位" disabled="true"></a-input> | |
32 | + </a-form-model-item> | |
33 | + </a-col> | |
34 | + <a-col :span="24"> | |
35 | + <a-form-model-item label="单据数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qty"> | |
36 | + <a-input-number v-model="model.qty"placeholder="请输入单据数量" style="width: 100%" disabled="true"/> | |
37 | + </a-form-model-item> | |
38 | + </a-col> | |
39 | + <a-col :span="24"> | |
40 | + <a-form-model-item label="合格数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qty"> | |
41 | + <a-input-number v-model="model.qualityfiedQty"placeholder="请输入合格数量" style="width: 100%" /> | |
42 | + </a-form-model-item> | |
43 | + </a-col> | |
44 | + <a-col :span="24"> | |
45 | + <a-form-model-item label="不合格数量" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="qty"> | |
46 | + <a-input-number v-model="model.unqualityfiedQty"placeholder="请输入不合格数量" style="width: 100%" /> | |
47 | + </a-form-model-item> | |
48 | + </a-col> | |
49 | + <a-col :span="24"> | |
50 | + <a-form-model-item label="不合格原因" :labelCol="labelCol" :wrapperCol="wrapperCol" prop="remark"> | |
51 | + <a-input v-model="model.remark"placeholder="请输入不合格原因" /> | |
52 | + </a-form-model-item> | |
53 | + </a-col> | |
54 | + </a-row> | |
55 | + </a-form-model> | |
56 | + </a-spin> | |
57 | + </j-modal> | |
58 | +</template> | |
59 | + | |
60 | +<script> | |
61 | + | |
62 | + import { httpAction } from '@/api/manage' | |
63 | + import { validateDuplicateValue } from '@/utils/util' | |
64 | + import {receiveHeader, qualityTesting} from "@api/api"; | |
65 | + | |
66 | + export default { | |
67 | + name: "QualityTestingModal", | |
68 | + components: { | |
69 | + }, | |
70 | + props:{ | |
71 | + mainId:{ | |
72 | + type:String, | |
73 | + required:false, | |
74 | + default:'' | |
75 | + } | |
76 | + }, | |
77 | + data () { | |
78 | + return { | |
79 | + title:"操作", | |
80 | + width:800, | |
81 | + visible: false, | |
82 | + model:{ | |
83 | + }, | |
84 | + labelCol: { | |
85 | + xs: { span: 24 }, | |
86 | + sm: { span: 5 }, | |
87 | + }, | |
88 | + wrapperCol: { | |
89 | + xs: { span: 24 }, | |
90 | + sm: { span: 16 }, | |
91 | + }, | |
92 | + | |
93 | + confirmLoading: false, | |
94 | + validatorRules: { | |
95 | + }, | |
96 | + url: { | |
97 | + add: "/receipt/qualityHeader/addQualityDetail", | |
98 | + edit: "/receipt/qualityHeader/editQualityDetail", | |
99 | + } | |
100 | + | |
101 | + } | |
102 | + }, | |
103 | + created () { | |
104 | + //备份model原始值 | |
105 | + this.modelDefault = JSON.parse(JSON.stringify(this.model)); | |
106 | + }, | |
107 | + methods: { | |
108 | + add () { | |
109 | + this.edit(this.modelDefault); | |
110 | + }, | |
111 | + edit (record) { | |
112 | + this.model = Object.assign({}, record); | |
113 | + this.visible = true; | |
114 | + }, | |
115 | + close () { | |
116 | + this.$emit('close'); | |
117 | + this.visible = false; | |
118 | + this.$refs.form.clearValidate(); | |
119 | + }, | |
120 | + | |
121 | + handleOk () { | |
122 | + const that = this; | |
123 | + // 触发表单验证 | |
124 | + this.$refs.form.validate(valid => { | |
125 | + if (valid) { | |
126 | + that.confirmLoading = true; | |
127 | + let httpurl = ''; | |
128 | + let method = ''; | |
129 | + if(!this.model.id){ | |
130 | + httpurl+=this.url.add; | |
131 | + method = 'post'; | |
132 | + }else{ | |
133 | + httpurl+=this.url.edit; | |
134 | + method = 'put'; | |
135 | + } | |
136 | + this.model['qualityId'] = this.mainId | |
137 | + qualityTesting(this.model).then((res)=>{ | |
138 | + if(res.success){ | |
139 | + that.$message.success(res.message); | |
140 | + that.$emit('ok'); | |
141 | + }else{ | |
142 | + that.$message.warning(res.message); | |
143 | + } | |
144 | + }).finally(() => { | |
145 | + that.confirmLoading = false; | |
146 | + that.close(); | |
147 | + }) | |
148 | + }else{ | |
149 | + return false | |
150 | + } | |
151 | + }) | |
152 | + }, | |
153 | + handleCancel () { | |
154 | + this.close() | |
155 | + }, | |
156 | + | |
157 | + | |
158 | + } | |
159 | + } | |
160 | +</script> | |
... | ... |
ant-design-vue-jeecg/src/views/system/receipt/modules/ReceiveDetailModal.vue
... | ... | @@ -80,6 +80,15 @@ |
80 | 80 | |
81 | 81 | confirmLoading: false, |
82 | 82 | validatorRules: { |
83 | + materialCode: [ | |
84 | + {required: true, message: '请输入物料编码!'}, | |
85 | + ], | |
86 | + qty: [ | |
87 | + {required: true, message: '请输入单据数量!'}, | |
88 | + ], | |
89 | + inventoryStatus: [ | |
90 | + {required: true, message: '请输入库存状态!'}, | |
91 | + ], | |
83 | 92 | }, |
84 | 93 | url: { |
85 | 94 | add: "/receipt/receiveHeader/addReceiveDetail", |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/api/wcs/service/WcsServiceImpl.java
... | ... | @@ -326,7 +326,7 @@ public class WcsServiceImpl implements WcsService { |
326 | 326 | @Override |
327 | 327 | @Transactional(rollbackFor = Exception.class) |
328 | 328 | @OperationLog(bizId = "#taskHeader == null ? '' : #taskHeader.getId()", bizType = "'任务追踪'", tag = "'任务下发'", extra = "''", |
329 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
329 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
330 | 330 | recordReturnValue = true) |
331 | 331 | public Result wcsTaskAssign(TaskHeader taskHeader) { |
332 | 332 | if (taskHeader == null) { |
... | ... | @@ -567,7 +567,7 @@ public class WcsServiceImpl implements WcsService { |
567 | 567 | @Override |
568 | 568 | @Transactional(rollbackFor = Exception.class) |
569 | 569 | @OperationLog(bizId = "#taskHeader == null ? '' : #taskHeader.getId()", bizType = "'任务追踪'", tag = "'空出处理'", extra = "''", |
570 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode() + ',目标出入口:' + #taskHeader.getToPortCode()", | |
570 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode() + ',目标出入口:' + #taskHeader.getToPortCode()", | |
571 | 571 | recordReturnValue = true) |
572 | 572 | public Result emptyOutHandle(String taskNo) { |
573 | 573 | if (StringUtils.isEmpty(taskNo)) { |
... | ... | @@ -601,7 +601,7 @@ public class WcsServiceImpl implements WcsService { |
601 | 601 | @Override |
602 | 602 | @Transactional(rollbackFor = Exception.class) |
603 | 603 | @OperationLog(bizId = "#taskHeader == null ? '' : #taskHeader.getId()", bizType = "'任务追踪'", tag = "'重入处理'", extra = "''", |
604 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode() + ',目标出入口:' + #taskHeader.getToPortCode()", | |
604 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode() + ',目标出入口:' + #taskHeader.getToPortCode()", | |
605 | 605 | recordReturnValue = true) |
606 | 606 | public Result reentryHandle(String taskNo) { |
607 | 607 | // 1、判断非空字段 |
... | ... | @@ -708,7 +708,7 @@ public class WcsServiceImpl implements WcsService { |
708 | 708 | @Override |
709 | 709 | @Transactional(rollbackFor = Exception.class) |
710 | 710 | @OperationLog(bizId = "#taskHeader == null ? '' : #taskHeader.getId()", bizType = "'任务追踪'", tag = "'取货错处理'", extra = "''", |
711 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode() + ',目标出入口:' + #taskHeader.getToPortCode()", | |
711 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode() + ',目标出入口:' + #taskHeader.getToPortCode()", | |
712 | 712 | recordReturnValue = true) |
713 | 713 | public Result pickupErrorHandle(String taskNo) { |
714 | 714 | // 1、判断非空字段 |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/locationMonitor/controller/LocationMonitorController.java
... | ... | @@ -69,6 +69,7 @@ public class LocationMonitorController { |
69 | 69 | // 换stream进行数据拣选速度更快 |
70 | 70 | List<Location> emptyLocationList = |
71 | 71 | locationList.stream().filter(t -> QuantityConstant.STATUS_LOCATION_EMPTY.equals(t.getStatus())).collect(Collectors.toList()); |
72 | + emptyLocationList = emptyLocationList.stream().filter(t -> t.getContainerCode().isEmpty()).collect(Collectors.toList()); | |
72 | 73 | map.put("emptyLocation", emptyLocationList.size()); |
73 | 74 | // 查询库位上的托盘信息 |
74 | 75 | LambdaQueryWrapper<Container> containerLambdaQueryWrapper = Wrappers.lambdaQuery(); |
... | ... | @@ -110,8 +111,7 @@ public class LocationMonitorController { |
110 | 111 | |
111 | 112 | /* 查询库存明细 */ |
112 | 113 | LambdaQueryWrapper<InventoryDetail> inventoryDetailLambda = Wrappers.lambdaQuery(); |
113 | - inventoryDetailLambda.eq(StringUtils.isEmpty(zoneCode),InventoryDetail::getZoneCode,zoneCode) | |
114 | - .isNotNull(InventoryDetail::getLocationCode); | |
114 | + inventoryDetailLambda.eq(StringUtils.isEmpty(zoneCode), InventoryDetail::getZoneCode, zoneCode).isNotNull(InventoryDetail::getLocationCode); | |
115 | 115 | HuahengJwtUtil.setWarehouseCode(inventoryDetailLambda, InventoryDetail.class, req); |
116 | 116 | List<InventoryDetail> inventoryDetailList = inventoryDetailService.list(inventoryDetailLambda); |
117 | 117 | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/IMaterialWarningService.java
1 | 1 | package org.jeecg.modules.wms.config.materialWarning.service; |
2 | 2 | |
3 | 3 | import com.baomidou.mybatisplus.extension.service.IService; |
4 | -import org.jeecg.modules.wms.config.materialWarning.entity.MaterialLevelAlarm; | |
5 | 4 | import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; |
6 | 5 | |
7 | -import java.util.List; | |
8 | - | |
9 | 6 | /** |
10 | 7 | * @Description: 物料预警 |
11 | 8 | * @Author: jeecg-boot |
... | ... | @@ -14,5 +11,4 @@ import java.util.List; |
14 | 11 | */ |
15 | 12 | public interface IMaterialWarningService extends IService<MaterialWarning> { |
16 | 13 | |
17 | - List<MaterialLevelAlarm> getLevelAlarm(String materialCode); | |
18 | 14 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/service/impl/MaterialWarningServiceImpl.java
1 | 1 | package org.jeecg.modules.wms.config.materialWarning.service.impl; |
2 | 2 | |
3 | -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
4 | -import org.jeecg.modules.wms.config.materialWarning.entity.MaterialLevelAlarm; | |
3 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
5 | 4 | import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; |
6 | 5 | import org.jeecg.modules.wms.config.materialWarning.mapper.MaterialWarningMapper; |
7 | 6 | import org.jeecg.modules.wms.config.materialWarning.service.IMaterialWarningService; |
8 | -import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; | |
9 | -import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryDetailServiceImpl; | |
10 | -import org.jeecg.utils.StringUtils; | |
11 | -import org.jeecg.utils.constant.QuantityConstant; | |
12 | 7 | import org.springframework.stereotype.Service; |
13 | 8 | |
14 | -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
15 | - | |
16 | -import javax.annotation.Resource; | |
17 | -import java.math.BigDecimal; | |
18 | -import java.util.ArrayList; | |
19 | -import java.util.List; | |
20 | -import java.util.stream.Collectors; | |
21 | - | |
22 | 9 | /** |
23 | 10 | * @Description: 物料预警 |
24 | 11 | * @Author: jeecg-boot |
... | ... | @@ -28,26 +15,4 @@ import java.util.stream.Collectors; |
28 | 15 | @Service |
29 | 16 | public class MaterialWarningServiceImpl extends ServiceImpl<MaterialWarningMapper, MaterialWarning> implements IMaterialWarningService { |
30 | 17 | |
31 | - @Resource | |
32 | - InventoryDetailServiceImpl inventoryDetailService; | |
33 | - | |
34 | - @Override | |
35 | - public List<MaterialLevelAlarm> getLevelAlarm(String materialCode) { | |
36 | - LambdaQueryWrapper<MaterialWarning> query = new LambdaQueryWrapper<>(); | |
37 | - query.eq(StringUtils.isNotEmpty(materialCode), MaterialWarning::getMaterialCode, materialCode); | |
38 | - List<MaterialWarning> warningList = list(query); | |
39 | - | |
40 | - List<MaterialLevelAlarm> alarmList = new ArrayList<>(); | |
41 | - warningList.forEach(w -> { | |
42 | - InventoryDetail d = new InventoryDetail(); | |
43 | - d.setMaterialCode(w.getMaterialCode()); | |
44 | - d.setCompanyCode(w.getCompanyCode()); | |
45 | - d.setWarehouseCode(w.getWarehouseCode()); | |
46 | - d.setInventoryStatus(QuantityConstant.QUALITY_GOOD); | |
47 | - BigDecimal sum = inventoryDetailService.getInventorySumQty(d); | |
48 | - alarmList.add(new MaterialLevelAlarm(w, sum)); | |
49 | - }); | |
50 | - | |
51 | - return alarmList.stream().filter(MaterialLevelAlarm::needAlarm).collect(Collectors.toList()); | |
52 | - } | |
53 | 18 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryDetail/controller/InventoryDetailController.java
... | ... | @@ -7,18 +7,14 @@ import java.util.List; |
7 | 7 | import javax.servlet.http.HttpServletRequest; |
8 | 8 | import javax.servlet.http.HttpServletResponse; |
9 | 9 | |
10 | -import com.baomidou.mybatisplus.core.conditions.Wrapper; | |
11 | -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
12 | 10 | import org.jeecg.common.api.vo.Result; |
13 | 11 | import org.jeecg.common.aspect.annotation.AutoLog; |
14 | 12 | import org.jeecg.common.system.base.controller.JeecgController; |
15 | 13 | import org.jeecg.common.system.query.QueryGenerator; |
16 | -import org.jeecg.modules.wms.config.container.entity.Container; | |
17 | 14 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; |
18 | 15 | import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailService; |
19 | 16 | import org.jeecg.utils.HuahengJwtUtil; |
20 | 17 | import org.jeecg.utils.StringUtils; |
21 | -import org.jeecg.utils.constant.QuantityConstant; | |
22 | 18 | import org.springframework.beans.factory.annotation.Autowired; |
23 | 19 | import org.springframework.web.bind.annotation.*; |
24 | 20 | import org.springframework.web.servlet.ModelAndView; |
... | ... | @@ -67,7 +63,7 @@ public class InventoryDetailController extends JeecgController<InventoryDetail, |
67 | 63 | QueryWrapper<InventoryDetail> queryWrapper = QueryGenerator.initQueryWrapper(inventoryDetail, req.getParameterMap()); |
68 | 64 | queryWrapper.lt(inventoryAge != null, "create_time", inventoryAge); |
69 | 65 | Page<InventoryDetail> page = new Page<InventoryDetail>(pageNo, pageSize); |
70 | - IPage<InventoryDetail> pageList = inventoryDetailService.page(page, queryWrapper); | |
66 | + IPage<InventoryDetail> pageList = inventoryDetailService.queryPage(page, queryWrapper); | |
71 | 67 | inventoryDetailService.calculateInventoryAge(pageList.getRecords());// 计算库龄 |
72 | 68 | return Result.OK(pageList); |
73 | 69 | } |
... | ... | @@ -75,17 +71,17 @@ public class InventoryDetailController extends JeecgController<InventoryDetail, |
75 | 71 | @ApiOperation(value = "库存详情-分页列表查询", notes = "库存详情-分页列表查询") |
76 | 72 | @GetMapping(value = "/selectContainerlist") |
77 | 73 | public Result<IPage<InventoryDetail>> selectContainerlist(InventoryDetail inventoryDetail, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, |
78 | - @RequestParam(name = "pageSize", defaultValue = "5") Integer pageSize, HttpServletRequest req) { | |
79 | - IPage<InventoryDetail> pageList=new Page<>(); | |
80 | - //由于前端页面嵌套,进页面就会加载此接口,加个判断避免不必要的查询 | |
81 | - if (StringUtils.isNotEmpty(inventoryDetail.getMaterialCode())){ | |
74 | + @RequestParam(name = "pageSize", defaultValue = "5") Integer pageSize, HttpServletRequest req) { | |
75 | + IPage<InventoryDetail> pageList = new Page<>(); | |
76 | + // 由于前端页面嵌套,进页面就会加载此接口,加个判断避免不必要的查询 | |
77 | + if (StringUtils.isNotEmpty(inventoryDetail.getMaterialCode())) { | |
82 | 78 | String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); |
83 | - //查询出符合条件的托盘 | |
84 | - List<String> containerCodeList=inventoryDetailService.containerCodeList(warehouseCode,inventoryDetail.getMaterialCode()); | |
79 | + // 查询出符合条件的托盘 | |
80 | + List<String> containerCodeList = inventoryDetailService.containerCodeList(warehouseCode, inventoryDetail.getMaterialCode()); | |
85 | 81 | QueryWrapper<InventoryDetail> queryWrapper = QueryGenerator.initQueryWrapper(inventoryDetail, req.getParameterMap()); |
86 | 82 | Page<InventoryDetail> page = new Page<InventoryDetail>(pageNo, pageSize); |
87 | - if (containerCodeList.size()>0){ | |
88 | - queryWrapper.in("container_code",containerCodeList); | |
83 | + if (containerCodeList.size() > 0) { | |
84 | + queryWrapper.in("container_code", containerCodeList); | |
89 | 85 | } |
90 | 86 | pageList = inventoryDetailService.page(page, queryWrapper); |
91 | 87 | } |
... | ... | @@ -180,7 +176,7 @@ public class InventoryDetailController extends JeecgController<InventoryDetail, |
180 | 176 | public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { |
181 | 177 | return super.importExcel(request, response, InventoryDetail.class); |
182 | 178 | } |
183 | - | |
179 | + | |
184 | 180 | /** |
185 | 181 | * 根据多个库存头id分页列表查询 |
186 | 182 | */ |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/controller/InventoryLevelAlarmController.java
0 → 100644
1 | +package org.jeecg.modules.wms.inventory.inventoryLevel.controller; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
4 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |
5 | +import com.baomidou.mybatisplus.core.metadata.IPage; | |
6 | +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |
7 | +import io.swagger.annotations.Api; | |
8 | +import io.swagger.annotations.ApiOperation; | |
9 | +import lombok.extern.slf4j.Slf4j; | |
10 | +import org.jeecg.common.api.vo.Result; | |
11 | +import org.jeecg.common.system.base.controller.JeecgController; | |
12 | +import org.jeecg.common.system.query.QueryGenerator; | |
13 | +import org.jeecg.modules.oss.entity.OSSFile; | |
14 | +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; | |
15 | +import org.jeecg.modules.wms.config.materialWarning.service.IMaterialWarningService; | |
16 | +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; | |
17 | +import org.jeecg.modules.wms.inventory.inventoryLevel.service.IInventoryLevelAlarmService; | |
18 | +import org.jeecg.utils.StringUtils; | |
19 | +import org.springframework.beans.factory.annotation.Autowired; | |
20 | +import org.springframework.web.bind.annotation.*; | |
21 | +import org.springframework.web.servlet.ModelAndView; | |
22 | + | |
23 | +import javax.servlet.http.HttpServletRequest; | |
24 | +import java.util.List; | |
25 | +import java.util.stream.Collectors; | |
26 | + | |
27 | +/** | |
28 | + * @Description: inventory_level_alarm | |
29 | + * @Author: jeecg-boot | |
30 | + * @Date: 2023-10-30 | |
31 | + * @Version: V1.0 | |
32 | + */ | |
33 | +@Api(tags="inventory_level_alarm") | |
34 | +@RestController | |
35 | +@RequestMapping("/inventory/inventoryLevel") | |
36 | +@Slf4j | |
37 | +public class InventoryLevelAlarmController extends JeecgController<InventoryLevelAlarm, IInventoryLevelAlarmService> { | |
38 | + @Autowired | |
39 | + private IInventoryLevelAlarmService iInventoryLevelAlarmService; | |
40 | + | |
41 | + @Autowired | |
42 | + private IMaterialWarningService iMaterialWarningService; | |
43 | + | |
44 | + /** | |
45 | + * 分页列表查询 | |
46 | + * | |
47 | + * @param inventoryLevelAlarm | |
48 | + * @param pageNo | |
49 | + * @param pageSize | |
50 | + * @param req | |
51 | + * @return | |
52 | + */ | |
53 | + //@AutoLog(value = "inventory_level_alarm-分页列表查询") | |
54 | + @ApiOperation(value="inventory_level_alarm-分页列表查询", notes="inventory_level_alarm-分页列表查询") | |
55 | + @GetMapping(value = "/list") | |
56 | + public Result<IPage<InventoryLevelAlarm>> queryPageList(String materialCode, String materialName, String alarmStatus, | |
57 | + @RequestParam(name="pageNo", defaultValue="1") Integer pageNo, | |
58 | + @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, | |
59 | + HttpServletRequest req) { | |
60 | + | |
61 | + Page<InventoryLevelAlarm> page = new Page<>(pageNo, pageSize); | |
62 | + IPage<InventoryLevelAlarm> pageList = iInventoryLevelAlarmService.queryLevelAlarm(page, materialCode, materialName, alarmStatus); | |
63 | + //对list分页处理 | |
64 | + return Result.OK(pageList); | |
65 | + } | |
66 | + | |
67 | + | |
68 | + /** | |
69 | + * 通过id查询 | |
70 | + * | |
71 | + * @param id | |
72 | + * @return | |
73 | + */ | |
74 | + //@AutoLog(value = "inventory_level_alarm-通过id查询") | |
75 | + @ApiOperation(value="inventory_level_alarm-通过id查询", notes="inventory_level_alarm-通过id查询") | |
76 | + @GetMapping(value = "/queryById") | |
77 | + public Result<InventoryLevelAlarm> queryById(@RequestParam(name="id",required=true) String id) { | |
78 | + InventoryLevelAlarm inventoryLevelAlarm = iInventoryLevelAlarmService.getById(id); | |
79 | + if(inventoryLevelAlarm ==null) { | |
80 | + return Result.error("未找到对应数据"); | |
81 | + } | |
82 | + return Result.OK(inventoryLevelAlarm); | |
83 | + } | |
84 | + | |
85 | + /** | |
86 | + * 导出excel | |
87 | + * | |
88 | + * @param request | |
89 | + * @param inventoryLevelAlarm | |
90 | + */ | |
91 | + @RequestMapping(value = "/exportXls") | |
92 | + public ModelAndView exportXls(HttpServletRequest request, InventoryLevelAlarm inventoryLevelAlarm) { | |
93 | + return super.exportXls(request, inventoryLevelAlarm, InventoryLevelAlarm.class, "inventory_level_alarm"); | |
94 | + } | |
95 | + | |
96 | + | |
97 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/config/materialWarning/entity/MaterialLevelAlarm.java renamed to huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/entity/InventoryLevelAlarm.java
1 | -package org.jeecg.modules.wms.config.materialWarning.entity; | |
1 | +package org.jeecg.modules.wms.inventory.inventoryLevel.entity; | |
2 | 2 | |
3 | 3 | import lombok.Data; |
4 | +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; | |
4 | 5 | |
5 | 6 | import java.math.BigDecimal; |
6 | 7 | |
7 | 8 | @Data |
8 | -public class MaterialLevelAlarm extends MaterialWarning { | |
9 | +public class InventoryLevelAlarm extends MaterialWarning { | |
9 | 10 | private int qtySum; |
10 | - //小于等于下线预警 | |
11 | - private boolean inLower; | |
12 | - //小于等于上线预警 | |
13 | - private boolean inUpper; | |
14 | 11 | |
15 | - //小于等于最小值 | |
16 | - private boolean inMin; | |
17 | - //大于等于最大值 | |
18 | - private boolean inMax; | |
12 | + public InventoryLevelAlarm(){ | |
13 | + | |
14 | + } | |
19 | 15 | |
20 | 16 | /** |
21 | - * 构造预警数据 | |
17 | + * 判断是否低于下限 | |
22 | 18 | **/ |
23 | - public MaterialLevelAlarm(MaterialWarning warning, BigDecimal qtySum) { | |
24 | - org.springframework.beans.BeanUtils.copyProperties(warning, this); | |
25 | - this.qtySum = qtySum.intValue(); | |
26 | - if (getLower() > 0) { | |
27 | - inLower = this.qtySum <= getLower(); | |
28 | - } | |
29 | - if (getUpper() > 0) { | |
30 | - inUpper = this.qtySum >= getUpper(); | |
31 | - } | |
19 | + public boolean inLower() { | |
20 | + return this.qtySum <= getLower(); | |
21 | + } | |
32 | 22 | |
33 | - if (getMin() > 0) { | |
34 | - inMin = this.qtySum <= getMin(); | |
35 | - } | |
23 | + /** | |
24 | + * 判断是否高于上限 | |
25 | + **/ | |
26 | + public boolean inUpper(){ | |
27 | + return this.qtySum >= getUpper(); | |
28 | + } | |
36 | 29 | |
37 | - if (getMax() > 0) { | |
38 | - inMax = this.qtySum >= getMax(); | |
39 | - } | |
30 | + /** 判断是否低于最小值 **/ | |
31 | + public boolean inMin(){ | |
32 | + return this.qtySum <= getMin(); | |
33 | + } | |
34 | + | |
35 | + /** 判断是否高于最大值 **/ | |
36 | + public boolean inMax(){ | |
37 | + return this.qtySum >= getMax(); | |
40 | 38 | } |
41 | 39 | |
42 | 40 | /** |
43 | 41 | * 判断是否有预警 |
44 | 42 | **/ |
45 | 43 | public Boolean needAlarm() { |
46 | - return inLower || inUpper || inMin || inMax; | |
44 | + return inLower() || inUpper() || inMin() || inMax(); | |
47 | 45 | } |
48 | 46 | |
49 | 47 | @Override |
50 | 48 | public String toString() { |
51 | 49 | String str = "<ul>"; |
52 | - if (inLower) { | |
50 | + if (inLower()) { | |
53 | 51 | str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 低于下限预警值<b> " + getLower() + "</b></li>"; |
54 | - } else if (inUpper) { | |
52 | + } else if (inUpper()) { | |
55 | 53 | str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 高于上限预警值<b> " + getUpper() + "</b></li>"; |
56 | - } else if (inMin) { | |
54 | + } else if (inMin()) { | |
57 | 55 | str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 低于最低值<b> " + getMin() + "</b></li>"; |
58 | - } else if (inMax) { | |
56 | + } else if (inMax()) { | |
59 | 57 | str = str + "<li><b>" + getMaterialName() + "</b> " + getMaterialCode() + " 库存数 <b>" + getQtySum() + "</b> 超过最高值<b> " + getMax() + "</b></li>"; |
60 | 58 | } |
61 | 59 | return str + "</ul>"; |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/InventoryLevelAlarmMapper.java
0 → 100644
1 | +package org.jeecg.modules.wms.inventory.inventoryLevel.mapper; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
4 | +import com.baomidou.mybatisplus.core.metadata.IPage; | |
5 | +import org.apache.ibatis.annotations.Param; | |
6 | +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; | |
7 | + | |
8 | +import java.util.List; | |
9 | + | |
10 | +/** | |
11 | + * @Description: material_level_alarm | |
12 | + * @Author: jeecg-boot | |
13 | + * @Date: 2023-10-30 | |
14 | + * @Version: V1.0 | |
15 | + */ | |
16 | +public interface InventoryLevelAlarmMapper extends BaseMapper<InventoryLevelAlarm> { | |
17 | + IPage<InventoryLevelAlarm> queryLevelAlarm(IPage<InventoryLevelAlarm> page, | |
18 | + @Param("materialCode") String materialCode, | |
19 | + @Param("materialName") String materialName, | |
20 | + @Param("alarmStatus") String alarmStatus); | |
21 | + | |
22 | + List<InventoryLevelAlarm> queryLevelAlarm(@Param("materialCode") String materialCode, | |
23 | + @Param("materialName") String materialName, | |
24 | + @Param("alarmStatus") String alarmStatus); | |
25 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/mapper/xml/InventoryLevelAlarmMapper.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |
3 | +<mapper namespace="org.jeecg.modules.wms.inventory.inventoryLevel.mapper.InventoryLevelAlarmMapper"> | |
4 | + | |
5 | + <select id="queryLevelAlarm" | |
6 | + resultType="org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm"> | |
7 | + select w.*, i.qtySum from ( | |
8 | + SELECT material_code, sum(qty) as qtySum FROM inventory_detail | |
9 | + WHERE inventory_status='good' and material_code IN ( SELECT material_code FROM material_warning) | |
10 | + group by material_code | |
11 | + ) i right join material_warning w on i.material_code = w.material_code | |
12 | + <where> | |
13 | + <if test="materialCode != null and materialCode != ''"> | |
14 | + and w.material_code = #{materialCode} | |
15 | + </if> | |
16 | + <if test="materialName != null and materialName != ''"> | |
17 | + <bind name="materialNameLike" value="'%'+materialName+'%'"/> | |
18 | + and w.material_name like #{materialNameLike} | |
19 | + </if> | |
20 | + <if test="alarmStatus != null and alarmStatus == 'noAlarm'"> | |
21 | + and qtySum > lower and qtySum < upper | |
22 | + </if> | |
23 | + <if test="alarmStatus != null and alarmStatus == 'isAlarm'"> | |
24 | + and (qtySum <= lower or qtySum >= upper or qtySum is null) | |
25 | + </if> | |
26 | + <if test="alarmStatus != null and alarmStatus == 'lowerAlarm'"> | |
27 | + and (qtySum <= lower or qtySum is null) | |
28 | + </if> | |
29 | + <if test="alarmStatus != null and alarmStatus == 'upperAlarm'"> | |
30 | + and qtySum >= upper | |
31 | + </if> | |
32 | + </where> | |
33 | + </select> | |
34 | +</mapper> | |
0 | 35 | \ No newline at end of file |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/IInventoryLevelAlarmService.java
0 → 100644
1 | +package org.jeecg.modules.wms.inventory.inventoryLevel.service; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.metadata.IPage; | |
4 | +import com.baomidou.mybatisplus.extension.service.IService; | |
5 | +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; | |
6 | +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; | |
7 | + | |
8 | +import java.util.List; | |
9 | + | |
10 | +/** | |
11 | + * @Description: inventory_level_alarm | |
12 | + * @Author: jeecg-boot | |
13 | + * @Date: 2023-10-30 | |
14 | + * @Version: V1.0 | |
15 | + */ | |
16 | +public interface IInventoryLevelAlarmService extends IService<InventoryLevelAlarm> { | |
17 | + List<InventoryLevelAlarm> getLevelAlarm(String materialCode); | |
18 | + | |
19 | + IPage<InventoryLevelAlarm> queryLevelAlarm(IPage<InventoryLevelAlarm> page, String materialCode, String materialName, String alarmStatus); | |
20 | + | |
21 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/inventory/inventoryLevel/service/impl/InventoryLevelAlarmServiceImpl.java
0 → 100644
1 | +package org.jeecg.modules.wms.inventory.inventoryLevel.service.impl; | |
2 | + | |
3 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
4 | +import com.baomidou.mybatisplus.core.metadata.IPage; | |
5 | +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |
6 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
7 | +import org.jeecg.modules.wms.config.materialWarning.entity.MaterialWarning; | |
8 | +import org.jeecg.modules.wms.config.materialWarning.service.impl.MaterialWarningServiceImpl; | |
9 | +import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; | |
10 | +import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryDetailServiceImpl; | |
11 | +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; | |
12 | +import org.jeecg.modules.wms.inventory.inventoryLevel.mapper.InventoryLevelAlarmMapper; | |
13 | +import org.jeecg.modules.wms.inventory.inventoryLevel.service.IInventoryLevelAlarmService; | |
14 | +import org.jeecg.utils.StringUtils; | |
15 | +import org.jeecg.utils.constant.QuantityConstant; | |
16 | +import org.springframework.stereotype.Service; | |
17 | + | |
18 | +import javax.annotation.Resource; | |
19 | +import java.math.BigDecimal; | |
20 | +import java.util.ArrayList; | |
21 | +import java.util.List; | |
22 | +import java.util.stream.Collectors; | |
23 | + | |
24 | +/** | |
25 | + * @Description: inventory_level_alarm | |
26 | + * @Author: jeecg-boot | |
27 | + * @Date: 2023-10-30 | |
28 | + * @Version: V1.0 | |
29 | + */ | |
30 | +@Service | |
31 | +public class InventoryLevelAlarmServiceImpl extends ServiceImpl<InventoryLevelAlarmMapper, InventoryLevelAlarm> implements IInventoryLevelAlarmService { | |
32 | + | |
33 | + @Resource | |
34 | + InventoryDetailServiceImpl inventoryDetailService; | |
35 | + | |
36 | + @Resource | |
37 | + MaterialWarningServiceImpl materialWarningService; | |
38 | + | |
39 | + @Resource | |
40 | + InventoryLevelAlarmMapper inventoryLevelAlarmMapper; | |
41 | + | |
42 | + @Override | |
43 | + public List<InventoryLevelAlarm> getLevelAlarm(String materialCode) { | |
44 | + List<InventoryLevelAlarm> alarmList = inventoryLevelAlarmMapper.queryLevelAlarm(materialCode,null,"isAlarm"); | |
45 | + | |
46 | + return alarmList; | |
47 | + } | |
48 | + | |
49 | + | |
50 | + @Override | |
51 | + public IPage<InventoryLevelAlarm> queryLevelAlarm(IPage<InventoryLevelAlarm> page, String materialCode, String materialName, String alarmStatus) { | |
52 | + return inventoryLevelAlarmMapper.queryLevelAlarm(page, materialCode, materialName, alarmStatus); | |
53 | + } | |
54 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/MaterialLevelAlarmTask.java renamed to huaheng-wms-core/src/main/java/org/jeecg/modules/wms/monitor/job/InventoryLevelAlarmTask.java
... | ... | @@ -11,14 +11,12 @@ import org.jeecg.modules.system.entity.SysUser; |
11 | 11 | import org.jeecg.modules.system.service.impl.SysAnnouncementServiceImpl; |
12 | 12 | import org.jeecg.modules.system.service.impl.SysRoleServiceImpl; |
13 | 13 | import org.jeecg.modules.system.service.impl.SysUserServiceImpl; |
14 | -import org.jeecg.modules.wms.config.materialWarning.entity.MaterialLevelAlarm; | |
15 | -import org.jeecg.modules.wms.config.materialWarning.service.impl.MaterialWarningServiceImpl; | |
14 | +import org.jeecg.modules.wms.inventory.inventoryLevel.entity.InventoryLevelAlarm; | |
15 | +import org.jeecg.modules.wms.inventory.inventoryLevel.service.impl.InventoryLevelAlarmServiceImpl; | |
16 | 16 | import org.quartz.*; |
17 | -import org.springframework.beans.factory.annotation.Autowired; | |
18 | 17 | import org.springframework.util.CollectionUtils; |
19 | 18 | |
20 | 19 | import javax.annotation.Resource; |
21 | -import java.util.ArrayList; | |
22 | 20 | import java.util.Date; |
23 | 21 | import java.util.List; |
24 | 22 | import java.util.stream.Collectors; |
... | ... | @@ -31,7 +29,7 @@ import java.util.stream.Collectors; |
31 | 29 | @Slf4j |
32 | 30 | @PersistJobDataAfterExecution |
33 | 31 | @DisallowConcurrentExecution |
34 | -public class MaterialLevelAlarmTask implements Job { | |
32 | +public class InventoryLevelAlarmTask implements Job { | |
35 | 33 | private String parameter; |
36 | 34 | |
37 | 35 | @Resource |
... | ... | @@ -43,14 +41,14 @@ public class MaterialLevelAlarmTask implements Job { |
43 | 41 | @Resource |
44 | 42 | private SysRoleServiceImpl sysRoleService; |
45 | 43 | |
46 | - @Autowired | |
44 | + @Resource | |
47 | 45 | private SqlSession sqlSession; |
48 | 46 | |
49 | - @Autowired | |
47 | + @Resource | |
50 | 48 | private SysAnnouncementServiceImpl sysAnnouncementService; |
51 | 49 | |
52 | - @Autowired | |
53 | - private MaterialWarningServiceImpl materialWarningService; | |
50 | + @Resource | |
51 | + private InventoryLevelAlarmServiceImpl inventoryLevelAlarmService; | |
54 | 52 | |
55 | 53 | public void setParameter(String parameter) { |
56 | 54 | this.parameter = parameter; |
... | ... | @@ -60,13 +58,15 @@ public class MaterialLevelAlarmTask implements Job { |
60 | 58 | public void execute(JobExecutionContext context) throws JobExecutionException { |
61 | 59 | log.info(StrUtil.format("定时任务 MaterialLevelAlarmTask 参数:{},执行时间:{}", this.parameter, DateUtils.getTimestamp())); |
62 | 60 | |
63 | - List<MaterialLevelAlarm> alarmList = materialWarningService.getLevelAlarm(null); | |
61 | + List<InventoryLevelAlarm> alarmList = inventoryLevelAlarmService.getLevelAlarm(null); | |
64 | 62 | if (CollectionUtils.isEmpty(alarmList)) { |
65 | 63 | return; |
66 | 64 | } |
67 | 65 | |
68 | - List<String> list = alarmList.stream().map(MaterialLevelAlarm::toString).collect(Collectors.toList()); | |
66 | + List<String> list = alarmList.stream().map(InventoryLevelAlarm::toString).collect(Collectors.toList()); | |
69 | 67 | String msg = String.join("\n", list); |
68 | + msg = msg + "<a href='/wms/index.html#/system/inventory/inventoryLevel'>点击查看详情</a>"; | |
69 | +// " <a href='/wms/index.html#/system/config/MaterialWarningList'>预警配置</a>"; | |
70 | 70 | |
71 | 71 | List<SysUser> userList; |
72 | 72 | try { |
... | ... | @@ -75,7 +75,7 @@ public class MaterialLevelAlarmTask implements Job { |
75 | 75 | if (userList.size() == 0) { |
76 | 76 | userList = null; |
77 | 77 | } |
78 | - sysAnnouncementService.quickAnnouncementToUser(userList, "物料水位预警", msg, DateUtil.offsetDay(new Date(), 1), "H"); | |
78 | + sysAnnouncementService.quickAnnouncementToUser(userList, "库存水位预警", msg, DateUtil.offsetDay(new Date(), 1), "H"); | |
79 | 79 | } catch (Exception e) { |
80 | 80 | log.error("获取预警通知用户出错", e); |
81 | 81 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/controller/QualityHeaderController.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.controller; | |
2 | + | |
3 | +import java.io.IOException; | |
4 | +import java.util.Arrays; | |
5 | +import java.util.List; | |
6 | +import java.util.Map; | |
7 | +import java.util.stream.Collectors; | |
8 | + | |
9 | +import javax.servlet.http.HttpServletRequest; | |
10 | +import javax.servlet.http.HttpServletResponse; | |
11 | + | |
12 | +import org.apache.shiro.SecurityUtils; | |
13 | +import org.jeecg.common.api.vo.Result; | |
14 | +import org.jeecg.common.aspect.annotation.AutoLog; | |
15 | +import org.jeecg.common.exception.JeecgBootException; | |
16 | +import org.jeecg.common.system.base.controller.JeecgController; | |
17 | +import org.jeecg.common.system.query.QueryGenerator; | |
18 | +import org.jeecg.common.system.vo.LoginUser; | |
19 | +import org.jeecg.common.util.oConvertUtils; | |
20 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityDetail; | |
21 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityHeader; | |
22 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityDetailService; | |
23 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityHeaderService; | |
24 | +import org.jeecg.utils.constant.QuantityConstant; | |
25 | +import org.jeecgframework.poi.excel.ExcelImportUtil; | |
26 | +import org.jeecgframework.poi.excel.def.NormalExcelConstants; | |
27 | +import org.jeecgframework.poi.excel.entity.ExportParams; | |
28 | +import org.jeecgframework.poi.excel.entity.ImportParams; | |
29 | +import org.jeecgframework.poi.excel.view.JeecgEntityExcelView; | |
30 | +import org.springframework.beans.factory.annotation.Autowired; | |
31 | +import org.springframework.web.bind.annotation.*; | |
32 | +import org.springframework.web.multipart.MultipartFile; | |
33 | +import org.springframework.web.multipart.MultipartHttpServletRequest; | |
34 | +import org.springframework.web.servlet.ModelAndView; | |
35 | + | |
36 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | |
37 | +import com.baomidou.mybatisplus.core.metadata.IPage; | |
38 | +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; | |
39 | + | |
40 | +import io.swagger.annotations.Api; | |
41 | +import io.swagger.annotations.ApiOperation; | |
42 | +import lombok.extern.slf4j.Slf4j; | |
43 | + | |
44 | +/** | |
45 | + * @Description: 质检表单头 | |
46 | + * @Author: jeecg-boot | |
47 | + * @Date: 2023-10-24 | |
48 | + * @Version: V1.0 | |
49 | + */ | |
50 | +@Api(tags = "质检表单头") | |
51 | +@RestController | |
52 | +@RequestMapping("/receipt/qualityHeader") | |
53 | +@Slf4j | |
54 | +public class QualityHeaderController extends JeecgController<QualityHeader, IQualityHeaderService> { | |
55 | + | |
56 | + @Autowired | |
57 | + private IQualityHeaderService qualityHeaderService; | |
58 | + | |
59 | + @Autowired | |
60 | + private IQualityDetailService qualityDetailService; | |
61 | + | |
62 | + /*---------------------------------主表处理-begin-------------------------------------*/ | |
63 | + | |
64 | + /** | |
65 | + * 分页列表查询 | |
66 | + * @param qualityHeader | |
67 | + * @param pageNo | |
68 | + * @param pageSize | |
69 | + * @param req | |
70 | + * @return | |
71 | + */ | |
72 | + // @AutoLog(value = "质检表单头-分页列表查询") | |
73 | + @ApiOperation(value = "质检表单头-分页列表查询", notes = "质检表单头-分页列表查询") | |
74 | + @GetMapping(value = "/list") | |
75 | + public Result<IPage<QualityHeader>> queryPageList(QualityHeader qualityHeader, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, | |
76 | + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { | |
77 | + QueryWrapper<QualityHeader> queryWrapper = QueryGenerator.initQueryWrapper(qualityHeader, req.getParameterMap()); | |
78 | + Page<QualityHeader> page = new Page<QualityHeader>(pageNo, pageSize); | |
79 | + IPage<QualityHeader> pageList = qualityHeaderService.page(page, queryWrapper); | |
80 | + return Result.OK(pageList); | |
81 | + } | |
82 | + | |
83 | + /** | |
84 | + * 添加 | |
85 | + * @param qualityHeader | |
86 | + * @return | |
87 | + */ | |
88 | + @AutoLog(value = "质检表单头-添加") | |
89 | + @ApiOperation(value = "质检表单头-添加", notes = "质检表单头-添加") | |
90 | + @PostMapping(value = "/add") | |
91 | + public Result<String> add(@RequestBody QualityHeader qualityHeader) { | |
92 | + qualityHeaderService.save(qualityHeader); | |
93 | + return Result.OK("添加成功!"); | |
94 | + } | |
95 | + | |
96 | + /** | |
97 | + * 编辑 | |
98 | + * @param qualityHeader | |
99 | + * @return | |
100 | + */ | |
101 | + @AutoLog(value = "质检表单头-编辑") | |
102 | + @ApiOperation(value = "质检表单头-编辑", notes = "质检表单头-编辑") | |
103 | + @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST}) | |
104 | + public Result<String> edit(@RequestBody QualityHeader qualityHeader) { | |
105 | + if (qualityHeader.getFirstStatus().intValue() > QuantityConstant.QUALITY_HEADER_BUILD) { | |
106 | + throw new JeecgBootException("不能删除非新建状态单据"); | |
107 | + } | |
108 | + qualityHeaderService.updateById(qualityHeader); | |
109 | + return Result.OK("编辑成功!"); | |
110 | + } | |
111 | + | |
112 | + /** | |
113 | + * 通过id删除 | |
114 | + * @param id | |
115 | + * @return | |
116 | + */ | |
117 | + @AutoLog(value = "质检表单头-通过id删除") | |
118 | + @ApiOperation(value = "质检表单头-通过id删除", notes = "质检表单头-通过id删除") | |
119 | + @DeleteMapping(value = "/delete") | |
120 | + public Result<String> delete(@RequestParam(name = "id", required = true) String id) { | |
121 | + QualityHeader qualityHeader = qualityHeaderService.getById(id); | |
122 | + if (qualityHeader.getFirstStatus().intValue() > QuantityConstant.QUALITY_HEADER_BUILD) { | |
123 | + throw new JeecgBootException("不能删除非新建状态单据"); | |
124 | + } | |
125 | + qualityHeaderService.delMain(id); | |
126 | + return Result.OK("删除成功!"); | |
127 | + } | |
128 | + | |
129 | + /** | |
130 | + * 批量删除 | |
131 | + * @param ids | |
132 | + * @return | |
133 | + */ | |
134 | + @AutoLog(value = "质检表单头-批量删除") | |
135 | + @ApiOperation(value = "质检表单头-批量删除", notes = "质检表单头-批量删除") | |
136 | + @DeleteMapping(value = "/deleteBatch") | |
137 | + public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) { | |
138 | + this.qualityHeaderService.delBatchMain(Arrays.asList(ids.split(","))); | |
139 | + return Result.OK("批量删除成功!"); | |
140 | + } | |
141 | + | |
142 | + /** | |
143 | + * 导出 | |
144 | + * @return | |
145 | + */ | |
146 | + @RequestMapping(value = "/exportXls") | |
147 | + public ModelAndView exportXls(HttpServletRequest request, QualityHeader qualityHeader) { | |
148 | + return super.exportXls(request, qualityHeader, QualityHeader.class, "质检表单头"); | |
149 | + } | |
150 | + | |
151 | + /** | |
152 | + * 导入 | |
153 | + * @return | |
154 | + */ | |
155 | + @RequestMapping(value = "/importExcel", method = RequestMethod.POST) | |
156 | + public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) { | |
157 | + return super.importExcel(request, response, QualityHeader.class); | |
158 | + } | |
159 | + /*---------------------------------主表处理-end-------------------------------------*/ | |
160 | + | |
161 | + /*--------------------------------子表处理-质检单详情-begin----------------------------------------------*/ | |
162 | + /** | |
163 | + * 通过主表ID查询 | |
164 | + * @return | |
165 | + */ | |
166 | + // @AutoLog(value = "质检单详情-通过主表ID查询") | |
167 | + @ApiOperation(value = "质检单详情-通过主表ID查询", notes = "质检单详情-通过主表ID查询") | |
168 | + @GetMapping(value = "/listQualityDetailByMainId") | |
169 | + public Result<IPage<QualityDetail>> listQualityDetailByMainId(QualityDetail qualityDetail, @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo, | |
170 | + @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize, HttpServletRequest req) { | |
171 | + QueryWrapper<QualityDetail> queryWrapper = QueryGenerator.initQueryWrapper(qualityDetail, req.getParameterMap()); | |
172 | + Page<QualityDetail> page = new Page<QualityDetail>(pageNo, pageSize); | |
173 | + IPage<QualityDetail> pageList = qualityDetailService.page(page, queryWrapper); | |
174 | + return Result.OK(pageList); | |
175 | + } | |
176 | + | |
177 | + /** | |
178 | + * 添加 | |
179 | + * @param qualityDetail | |
180 | + * @return | |
181 | + */ | |
182 | + @AutoLog(value = "质检单详情-添加") | |
183 | + @ApiOperation(value = "质检单详情-添加", notes = "质检单详情-添加") | |
184 | + @PostMapping(value = "/addQualityDetail") | |
185 | + public Result<String> addQualityDetail(@RequestBody QualityDetail qualityDetail) { | |
186 | + | |
187 | + qualityDetailService.save(qualityDetail); | |
188 | + return Result.OK("添加成功!"); | |
189 | + } | |
190 | + | |
191 | + /** | |
192 | + * 编辑 | |
193 | + * @param qualityDetail | |
194 | + * @return | |
195 | + */ | |
196 | + @AutoLog(value = "质检单详情-编辑") | |
197 | + @ApiOperation(value = "质检单详情-编辑", notes = "质检单详情-编辑") | |
198 | + @RequestMapping(value = "/editQualityDetail", method = {RequestMethod.PUT, RequestMethod.POST}) | |
199 | + public Result<String> editQualityDetail(@RequestBody QualityDetail qualityDetail) { | |
200 | + if (qualityDetail.getStatus().intValue() > QuantityConstant.QUALITY_HEADER_BUILD) { | |
201 | + throw new JeecgBootException("不能添加非新建状态单据"); | |
202 | + } | |
203 | + qualityDetailService.updateById(qualityDetail); | |
204 | + return Result.OK("编辑成功!"); | |
205 | + } | |
206 | + | |
207 | + /** | |
208 | + * 通过id删除 | |
209 | + * @param id | |
210 | + * @return | |
211 | + */ | |
212 | + @AutoLog(value = "质检单详情-通过id删除") | |
213 | + @ApiOperation(value = "质检单详情-通过id删除", notes = "质检单详情-通过id删除") | |
214 | + @DeleteMapping(value = "/deleteQualityDetail") | |
215 | + public Result<String> deleteQualityDetail(@RequestParam(name = "id", required = true) String id) { | |
216 | + QualityDetail qualityDetail = qualityDetailService.getById(id); | |
217 | + if (qualityDetail.getStatus().intValue() > QuantityConstant.QUALITY_HEADER_BUILD) { | |
218 | + throw new JeecgBootException("不能添加非新建状态单据"); | |
219 | + } | |
220 | + qualityDetailService.removeById(id); | |
221 | + return Result.OK("删除成功!"); | |
222 | + } | |
223 | + | |
224 | + /** | |
225 | + * 批量删除 | |
226 | + * @param ids | |
227 | + * @return | |
228 | + */ | |
229 | + @AutoLog(value = "质检单详情-批量删除") | |
230 | + @ApiOperation(value = "质检单详情-批量删除", notes = "质检单详情-批量删除") | |
231 | + @DeleteMapping(value = "/deleteBatchQualityDetail") | |
232 | + public Result<String> deleteBatchQualityDetail(@RequestParam(name = "ids", required = true) String ids) { | |
233 | + this.qualityDetailService.removeByIds(Arrays.asList(ids.split(","))); | |
234 | + return Result.OK("批量删除成功!"); | |
235 | + } | |
236 | + | |
237 | + /** | |
238 | + * 导出 | |
239 | + * @return | |
240 | + */ | |
241 | + @RequestMapping(value = "/exportQualityDetail") | |
242 | + public ModelAndView exportQualityDetail(HttpServletRequest request, QualityDetail qualityDetail) { | |
243 | + // Step.1 组装查询条件 | |
244 | + QueryWrapper<QualityDetail> queryWrapper = QueryGenerator.initQueryWrapper(qualityDetail, request.getParameterMap()); | |
245 | + LoginUser sysUser = (LoginUser)SecurityUtils.getSubject().getPrincipal(); | |
246 | + | |
247 | + // Step.2 获取导出数据 | |
248 | + List<QualityDetail> pageList = qualityDetailService.list(queryWrapper); | |
249 | + List<QualityDetail> exportList = null; | |
250 | + | |
251 | + // 过滤选中数据 | |
252 | + String selections = request.getParameter("selections"); | |
253 | + if (oConvertUtils.isNotEmpty(selections)) { | |
254 | + List<String> selectionList = Arrays.asList(selections.split(",")); | |
255 | + exportList = pageList.stream().filter(item -> selectionList.contains(item.getId())).collect(Collectors.toList()); | |
256 | + } else { | |
257 | + exportList = pageList; | |
258 | + } | |
259 | + | |
260 | + // Step.3 AutoPoi 导出Excel | |
261 | + ModelAndView mv = new ModelAndView(new JeecgEntityExcelView()); | |
262 | + mv.addObject(NormalExcelConstants.FILE_NAME, "质检单详情"); // 此处设置的filename无效 ,前端会重更新设置一下 | |
263 | + mv.addObject(NormalExcelConstants.CLASS, QualityDetail.class); | |
264 | + mv.addObject(NormalExcelConstants.PARAMS, new ExportParams("质检单详情报表", "导出人:" + sysUser.getRealname(), "质检单详情")); | |
265 | + mv.addObject(NormalExcelConstants.DATA_LIST, exportList); | |
266 | + return mv; | |
267 | + } | |
268 | + | |
269 | + /** | |
270 | + * 导入 | |
271 | + * @return | |
272 | + */ | |
273 | + @RequestMapping(value = "/importQualityDetail/{mainId}") | |
274 | + public Result<?> importQualityDetail(HttpServletRequest request, HttpServletResponse response, @PathVariable("mainId") Integer mainId) { | |
275 | + MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request; | |
276 | + Map<String, MultipartFile> fileMap = multipartRequest.getFileMap(); | |
277 | + for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) { | |
278 | + MultipartFile file = entity.getValue();// 获取上传文件对象 | |
279 | + ImportParams params = new ImportParams(); | |
280 | + params.setTitleRows(2); | |
281 | + params.setHeadRows(1); | |
282 | + params.setNeedSave(true); | |
283 | + try { | |
284 | + List<QualityDetail> list = ExcelImportUtil.importExcel(file.getInputStream(), QualityDetail.class, params); | |
285 | + for (QualityDetail temp : list) { | |
286 | + temp.setQualityId(mainId); | |
287 | + } | |
288 | + long start = System.currentTimeMillis(); | |
289 | + qualityDetailService.saveBatch(list); | |
290 | + log.info("消耗时间" + (System.currentTimeMillis() - start) + "毫秒"); | |
291 | + return Result.OK("文件导入成功!数据行数:" + list.size()); | |
292 | + } catch (Exception e) { | |
293 | + log.error(e.getMessage(), e); | |
294 | + return Result.error("文件导入失败:" + e.getMessage()); | |
295 | + } finally { | |
296 | + try { | |
297 | + file.getInputStream().close(); | |
298 | + } catch (IOException e) { | |
299 | + e.printStackTrace(); | |
300 | + } | |
301 | + } | |
302 | + } | |
303 | + return Result.error("文件导入失败!"); | |
304 | + } | |
305 | + | |
306 | + /*--------------------------------子表处理-质检单详情-end----------------------------------------------*/ | |
307 | + | |
308 | + /** | |
309 | + * 质检 | |
310 | + * @param qualityDetail | |
311 | + * @return | |
312 | + */ | |
313 | + @AutoLog(value = "质检单详情-质检") | |
314 | + @ApiOperation(value = "质检单详情-质检", notes = "质检单详情-质检") | |
315 | + @RequestMapping(value = "/qualityTesting", method = {RequestMethod.PUT, RequestMethod.POST}) | |
316 | + public Result<String> qualityTesting(@RequestBody QualityDetail qualityDetail) { | |
317 | + return qualityDetailService.qualityTesting(qualityDetail); | |
318 | + } | |
319 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/entity/QualityDetail.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.entity; | |
2 | + | |
3 | +import java.io.Serializable; | |
4 | +import java.math.BigDecimal; | |
5 | + | |
6 | +import org.jeecg.common.aspect.annotation.Dict; | |
7 | +import org.jeecg.common.exception.JeecgBootException; | |
8 | +import org.jeecgframework.poi.excel.annotation.Excel; | |
9 | + | |
10 | +import com.baomidou.mybatisplus.annotation.IdType; | |
11 | +import com.baomidou.mybatisplus.annotation.TableId; | |
12 | +import com.baomidou.mybatisplus.annotation.TableName; | |
13 | + | |
14 | +import io.swagger.annotations.ApiModel; | |
15 | +import io.swagger.annotations.ApiModelProperty; | |
16 | +import lombok.Data; | |
17 | + | |
18 | +/** | |
19 | + * @Description: 质检单详情 | |
20 | + * @Author: jeecg-boot | |
21 | + * @Date: 2023-10-24 | |
22 | + * @Version: V1.0 | |
23 | + */ | |
24 | +@Data | |
25 | +@TableName("quality_detail") | |
26 | +@ApiModel(value = "quality_detail对象", description = "质检单详情") | |
27 | +public class QualityDetail implements Serializable { | |
28 | + private static final long serialVersionUID = 1L; | |
29 | + | |
30 | + /** 主键 */ | |
31 | + @TableId(type = IdType.AUTO) | |
32 | + @ApiModelProperty(value = "主键") | |
33 | + private java.lang.Integer id; | |
34 | + /** 质检单id */ | |
35 | + @ApiModelProperty(value = "质检单id") | |
36 | + private java.lang.Integer qualityId; | |
37 | + /** 质检单号 */ | |
38 | + @Excel(name = "质检单号", width = 15) | |
39 | + @ApiModelProperty(value = "质检单号") | |
40 | + private java.lang.String qualityCode; | |
41 | + /** 仓库编码 */ | |
42 | + @Excel(name = "仓库编码", width = 15) | |
43 | + @ApiModelProperty(value = "仓库编码") | |
44 | + private java.lang.String warehouseCode; | |
45 | + /** 货主编码 */ | |
46 | + @Excel(name = "货主编码", width = 15) | |
47 | + @ApiModelProperty(value = "货主编码") | |
48 | + private java.lang.String companyCode; | |
49 | + /** 物料编码 */ | |
50 | + @Excel(name = "物料编码", width = 15) | |
51 | + @ApiModelProperty(value = "物料编码") | |
52 | + private java.lang.String materialCode; | |
53 | + /** 物料名称 */ | |
54 | + @Excel(name = "物料名称", width = 15) | |
55 | + @ApiModelProperty(value = "物料名称") | |
56 | + private java.lang.String materialName; | |
57 | + /** 物料规格 */ | |
58 | + @Excel(name = "物料规格", width = 15) | |
59 | + @ApiModelProperty(value = "物料规格") | |
60 | + private java.lang.String materialSpec; | |
61 | + /** 物料单位 */ | |
62 | + @Excel(name = "物料单位", width = 15) | |
63 | + @ApiModelProperty(value = "物料单位") | |
64 | + private java.lang.String materialUnit; | |
65 | + /** 单据数量 */ | |
66 | + @Excel(name = "单据数量", width = 15) | |
67 | + @ApiModelProperty(value = "单据数量") | |
68 | + private BigDecimal qty; | |
69 | + /** 合格数量 */ | |
70 | + @Excel(name = "合格数量", width = 15) | |
71 | + @ApiModelProperty(value = "合格数量") | |
72 | + private BigDecimal qualityfiedQty; | |
73 | + /** 不合格数量 */ | |
74 | + @Excel(name = "不合格数量", width = 15) | |
75 | + @ApiModelProperty(value = "不合格数量") | |
76 | + private BigDecimal unqualityfiedQty; | |
77 | + /** 不合格原因 */ | |
78 | + @Excel(name = "不合格原因", width = 15) | |
79 | + @ApiModelProperty(value = "不合格原因") | |
80 | + private java.lang.String remark; | |
81 | + /** 库存状态 */ | |
82 | + @Excel(name = "库存状态", width = 15) | |
83 | + @ApiModelProperty(value = "库存状态") | |
84 | + @Dict(dicCode = "inventory_status") | |
85 | + private java.lang.String inventoryStatus; | |
86 | + /** 批次 */ | |
87 | + @Excel(name = "批次", width = 15) | |
88 | + @ApiModelProperty(value = "批次") | |
89 | + private java.lang.String batch; | |
90 | + /** 批号 */ | |
91 | + @Excel(name = "批号", width = 15) | |
92 | + @ApiModelProperty(value = "批号") | |
93 | + private java.lang.String lot; | |
94 | + /** 项目号 */ | |
95 | + @Excel(name = "项目号", width = 15) | |
96 | + @ApiModelProperty(value = "项目号") | |
97 | + private java.lang.String project; | |
98 | + /** 单据状态 */ | |
99 | + @Excel(name = "单据状态", width = 15) | |
100 | + @ApiModelProperty(value = "单据状态") | |
101 | + @Dict(dicCode = "quality_header_status") | |
102 | + private java.lang.Integer status; | |
103 | + /** 上游单号 */ | |
104 | + @Excel(name = "上游单号", width = 15) | |
105 | + @ApiModelProperty(value = "上游单号") | |
106 | + private java.lang.String referCode; | |
107 | + /** 上游行号 */ | |
108 | + @Excel(name = "上游行号", width = 15) | |
109 | + @ApiModelProperty(value = "上游行号") | |
110 | + private java.lang.Integer referLineNum; | |
111 | + /** 创建人 */ | |
112 | + @ApiModelProperty(value = "创建人") | |
113 | + private java.lang.String createBy; | |
114 | + /** 创建日期 */ | |
115 | + @ApiModelProperty(value = "创建日期") | |
116 | + private java.util.Date createTime; | |
117 | + /** 更新人 */ | |
118 | + @ApiModelProperty(value = "更新人") | |
119 | + private java.lang.String updateBy; | |
120 | + /** 更新日期 */ | |
121 | + @ApiModelProperty(value = "更新日期") | |
122 | + private java.util.Date updateTime; | |
123 | + | |
124 | + public void setQty(BigDecimal qty) { | |
125 | + if (qty.compareTo(BigDecimal.ZERO) < 0) { | |
126 | + throw new JeecgBootException("质检单据数量不能小于0"); | |
127 | + } | |
128 | + this.qty = qty; | |
129 | + } | |
130 | + | |
131 | + public void setQualityfiedQty(BigDecimal qualityfiedQty) { | |
132 | + if (qualityfiedQty.compareTo(BigDecimal.ZERO) < 0) { | |
133 | + throw new JeecgBootException("质检合格数量不能小于0"); | |
134 | + } | |
135 | + this.qualityfiedQty = qualityfiedQty; | |
136 | + } | |
137 | + | |
138 | + public void setUnqualityfiedQty(BigDecimal unqualityfiedQty) { | |
139 | + if (unqualityfiedQty.compareTo(BigDecimal.ZERO) < 0) { | |
140 | + throw new JeecgBootException("质检不合格数量不能小于0"); | |
141 | + } | |
142 | + this.unqualityfiedQty = unqualityfiedQty; | |
143 | + } | |
144 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/entity/QualityHeader.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.entity; | |
2 | + | |
3 | +import java.io.Serializable; | |
4 | + | |
5 | +import org.jeecg.common.aspect.annotation.Dict; | |
6 | +import org.jeecgframework.poi.excel.annotation.Excel; | |
7 | + | |
8 | +import com.baomidou.mybatisplus.annotation.IdType; | |
9 | +import com.baomidou.mybatisplus.annotation.TableId; | |
10 | +import com.baomidou.mybatisplus.annotation.TableName; | |
11 | + | |
12 | +import io.swagger.annotations.ApiModel; | |
13 | +import io.swagger.annotations.ApiModelProperty; | |
14 | +import lombok.Data; | |
15 | + | |
16 | +/** | |
17 | + * @Description: 质检表单头 | |
18 | + * @Author: jeecg-boot | |
19 | + * @Date: 2023-10-24 | |
20 | + * @Version: V1.0 | |
21 | + */ | |
22 | +@Data | |
23 | +@TableName("quality_header") | |
24 | +@ApiModel(value = "quality_header对象", description = "质检表单头") | |
25 | +public class QualityHeader implements Serializable { | |
26 | + private static final long serialVersionUID = 1L; | |
27 | + | |
28 | + /** 主键 */ | |
29 | + @TableId(type = IdType.AUTO) | |
30 | + @ApiModelProperty(value = "主键") | |
31 | + private java.lang.Integer id; | |
32 | + /** 编码 */ | |
33 | + @Excel(name = "编码", width = 15) | |
34 | + @ApiModelProperty(value = "编码") | |
35 | + private java.lang.String code; | |
36 | + /** 类型 */ | |
37 | + @Excel(name = "类型", width = 15) | |
38 | + @ApiModelProperty(value = "类型") | |
39 | + @Dict(dicCode = "quality_type") | |
40 | + private java.lang.String type; | |
41 | + /** 仓库编码 */ | |
42 | + @Excel(name = "仓库编码", width = 15) | |
43 | + @ApiModelProperty(value = "仓库编码") | |
44 | + private java.lang.String warehouseCode; | |
45 | + /** 货主编码 */ | |
46 | + @Excel(name = "货主编码", width = 15) | |
47 | + @ApiModelProperty(value = "货主编码") | |
48 | + private java.lang.String companyCode; | |
49 | + /** 头状态 */ | |
50 | + @Excel(name = "头状态", width = 15) | |
51 | + @ApiModelProperty(value = "头状态") | |
52 | + @Dict(dicCode = "quality_header_status") | |
53 | + private java.lang.Integer firstStatus; | |
54 | + /** 尾状态 */ | |
55 | + @Excel(name = "尾状态", width = 15) | |
56 | + @ApiModelProperty(value = "尾状态") | |
57 | + @Dict(dicCode = "quality_header_status") | |
58 | + private java.lang.Integer lastStatus; | |
59 | + /** 上游单号 */ | |
60 | + @Excel(name = "上游单号", width = 15) | |
61 | + @ApiModelProperty(value = "上游单号") | |
62 | + private java.lang.String referCode; | |
63 | + /** 供应商编码 */ | |
64 | + @Excel(name = "供应商编码", width = 15) | |
65 | + @ApiModelProperty(value = "供应商编码") | |
66 | + private java.lang.String supplierCode; | |
67 | + /** 总数量 */ | |
68 | + @Excel(name = "总数量", width = 15) | |
69 | + @ApiModelProperty(value = "总数量") | |
70 | + private java.math.BigDecimal totalQty; | |
71 | + /** 总行数 */ | |
72 | + @Excel(name = "总行数", width = 15) | |
73 | + @ApiModelProperty(value = "总行数") | |
74 | + private java.lang.Integer totalLines; | |
75 | + /** 备注 */ | |
76 | + @Excel(name = "备注", width = 15) | |
77 | + @ApiModelProperty(value = "备注") | |
78 | + private java.lang.String remark; | |
79 | + /** 创建人 */ | |
80 | + @ApiModelProperty(value = "创建人") | |
81 | + private java.lang.String createBy; | |
82 | + /** 创建日期 */ | |
83 | + @ApiModelProperty(value = "创建日期") | |
84 | + private java.util.Date createTime; | |
85 | + /** 更新人 */ | |
86 | + @ApiModelProperty(value = "更新人") | |
87 | + private java.lang.String updateBy; | |
88 | + /** 更新日期 */ | |
89 | + @ApiModelProperty(value = "更新日期") | |
90 | + private java.util.Date updateTime; | |
91 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/mapper/QualityDetailMapper.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.mapper; | |
2 | + | |
3 | +import java.util.List; | |
4 | + | |
5 | +import org.apache.ibatis.annotations.Param; | |
6 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityDetail; | |
7 | + | |
8 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
9 | + | |
10 | +/** | |
11 | + * @Description: 质检单详情 | |
12 | + * @Author: jeecg-boot | |
13 | + * @Date: 2023-10-24 | |
14 | + * @Version: V1.0 | |
15 | + */ | |
16 | +public interface QualityDetailMapper extends BaseMapper<QualityDetail> { | |
17 | + | |
18 | + public boolean deleteByMainId(@Param("mainId") String mainId); | |
19 | + | |
20 | + public List<QualityDetail> selectByMainId(@Param("mainId") String mainId); | |
21 | + | |
22 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/mapper/QualityHeaderMapper.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.mapper; | |
2 | + | |
3 | +import org.apache.ibatis.annotations.Param; | |
4 | +import org.apache.ibatis.annotations.Select; | |
5 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityHeader; | |
6 | + | |
7 | +import com.baomidou.mybatisplus.core.mapper.BaseMapper; | |
8 | + | |
9 | +/** | |
10 | + * @Description: 质检表单头 | |
11 | + * @Author: jeecg-boot | |
12 | + * @Date: 2023-10-24 | |
13 | + * @Version: V1.0 | |
14 | + */ | |
15 | +public interface QualityHeaderMapper extends BaseMapper<QualityHeader> { | |
16 | + | |
17 | + @Select("select r.code from quality_header r where r.type = #{qualityType} order by r.code desc limit 1") | |
18 | + QualityHeader getMaxQualityHeaderCode(@Param("qualityType") String qualityType); | |
19 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/mapper/xml/QualityDetailMapper.xml
0 → 100644
1 | +<?xml version="1.0" encoding="UTF-8"?> | |
2 | +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | |
3 | +<mapper namespace="org.jeecg.modules.wms.receipt.qualityHeader.mapper.QualityDetailMapper"> | |
4 | + | |
5 | + <delete id="deleteByMainId" parameterType="java.lang.String"> | |
6 | + DELETE | |
7 | + FROM quality_detail | |
8 | + WHERE quality_id = #{mainId} | |
9 | + </delete> | |
10 | + | |
11 | + <select id="selectByMainId" parameterType="java.lang.String" | |
12 | + resultType="org.jeecg.modules.wms.receipt.qualityHeader.mapper.QualityDetailMapper"> | |
13 | + SELECT * | |
14 | + FROM quality_detail | |
15 | + WHERE quality_id = #{mainId} | |
16 | + </select> | |
17 | + | |
18 | +</mapper> | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/mapper/xml/QualityHeaderMapper.xml
0 → 100644
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/service/IQualityDetailService.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.service; | |
2 | + | |
3 | +import java.math.BigDecimal; | |
4 | +import java.util.List; | |
5 | + | |
6 | +import org.jeecg.common.api.vo.Result; | |
7 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityDetail; | |
8 | + | |
9 | +import com.baomidou.mybatisplus.extension.service.IService; | |
10 | + | |
11 | +/** | |
12 | + * @Description: 质检单详情 | |
13 | + * @Author: jeecg-boot | |
14 | + * @Date: 2023-10-24 | |
15 | + * @Version: V1.0 | |
16 | + */ | |
17 | +public interface IQualityDetailService extends IService<QualityDetail> { | |
18 | + | |
19 | + public List<QualityDetail> selectByMainId(String mainId); | |
20 | + | |
21 | + /** | |
22 | + * 质检 | |
23 | + * @return | |
24 | + */ | |
25 | + Result qualityTesting(QualityDetail qualityDetail); | |
26 | + | |
27 | + /** | |
28 | + * 更新质检信息 | |
29 | + * @return | |
30 | + */ | |
31 | + boolean updateQualityById(BigDecimal qualityfiedQty, BigDecimal unqualityfiedQty, int id); | |
32 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/service/IQualityHeaderService.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.service; | |
2 | + | |
3 | +import java.io.Serializable; | |
4 | +import java.util.Collection; | |
5 | + | |
6 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityHeader; | |
7 | + | |
8 | +import com.baomidou.mybatisplus.extension.service.IService; | |
9 | + | |
10 | +/** | |
11 | + * @Description: 质检表单头 | |
12 | + * @Author: jeecg-boot | |
13 | + * @Date: 2023-10-24 | |
14 | + * @Version: V1.0 | |
15 | + */ | |
16 | +public interface IQualityHeaderService extends IService<QualityHeader> { | |
17 | + | |
18 | + /** | |
19 | + * 删除一对多 | |
20 | + */ | |
21 | + public void delMain(String id); | |
22 | + | |
23 | + /** | |
24 | + * 批量删除一对多 | |
25 | + */ | |
26 | + public void delBatchMain(Collection<? extends Serializable> idList); | |
27 | + | |
28 | + QualityHeader getQualityHeaderByReferCode(String referCode, String warehouseCode); | |
29 | + | |
30 | + String createQualityCode(String qualityType); | |
31 | + | |
32 | + boolean updateQualityHeader(Integer id); | |
33 | + | |
34 | + boolean updateQualityHeaderStatus(Integer id); | |
35 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/service/impl/QualityDetailServiceImpl.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.service.impl; | |
2 | + | |
3 | +import java.math.BigDecimal; | |
4 | +import java.util.ArrayList; | |
5 | +import java.util.List; | |
6 | + | |
7 | +import javax.annotation.Resource; | |
8 | + | |
9 | +import org.jeecg.common.api.vo.Result; | |
10 | +import org.jeecg.common.exception.JeecgBootException; | |
11 | +import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction; | |
12 | +import org.jeecg.modules.wms.inventory.inventoryTransaction.service.IInventoryTransactionService; | |
13 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityDetail; | |
14 | +import org.jeecg.modules.wms.receipt.qualityHeader.mapper.QualityDetailMapper; | |
15 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityDetailService; | |
16 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityHeaderService; | |
17 | +import org.jeecg.utils.constant.QuantityConstant; | |
18 | +import org.springframework.beans.factory.annotation.Autowired; | |
19 | +import org.springframework.stereotype.Service; | |
20 | +import org.springframework.transaction.annotation.Transactional; | |
21 | + | |
22 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
23 | + | |
24 | +/** | |
25 | + * @Description: 质检单详情 | |
26 | + * @Author: jeecg-boot | |
27 | + * @Date: 2023-10-24 | |
28 | + * @Version: V1.0 | |
29 | + */ | |
30 | +@Service | |
31 | +public class QualityDetailServiceImpl extends ServiceImpl<QualityDetailMapper, QualityDetail> implements IQualityDetailService { | |
32 | + | |
33 | + @Autowired | |
34 | + private QualityDetailMapper qualityDetailMapper; | |
35 | + @Resource | |
36 | + private IQualityDetailService qualityDetailService; | |
37 | + @Resource | |
38 | + private IQualityHeaderService qualityHeaderService; | |
39 | + @Resource | |
40 | + private IInventoryTransactionService inventoryTransactionService; | |
41 | + | |
42 | + @Override | |
43 | + public List<QualityDetail> selectByMainId(String mainId) { | |
44 | + return qualityDetailMapper.selectByMainId(mainId); | |
45 | + } | |
46 | + | |
47 | + @Override | |
48 | + @Transactional(rollbackFor = Exception.class) | |
49 | + public Result qualityTesting(QualityDetail qualityDetail) { | |
50 | + if (qualityDetail == null) { | |
51 | + return Result.error("质检失败, 质检数据为空"); | |
52 | + } | |
53 | + if (qualityDetail.getStatus().intValue() == QuantityConstant.QUALITY_HEADER_COMPLETE) { | |
54 | + return Result.error("质检失败, 已经质检完成"); | |
55 | + } | |
56 | + BigDecimal qty = qualityDetail.getQty(); | |
57 | + BigDecimal qualityfiedQty = qualityDetail.getQualityfiedQty(); | |
58 | + BigDecimal unqualityfiedQty = qualityDetail.getUnqualityfiedQty(); | |
59 | + BigDecimal totalQty = qualityfiedQty.add(unqualityfiedQty); | |
60 | + if (qty.compareTo(totalQty) != 0) { | |
61 | + return Result.error("质检失败, 质检总数应该等于单据数量"); | |
62 | + } | |
63 | + QualityDetail qualityDetail1 = new QualityDetail(); | |
64 | + qualityDetail1.setId(qualityDetail.getId()); | |
65 | + qualityDetail1.setQualityfiedQty(qualityfiedQty); | |
66 | + qualityDetail1.setUnqualityfiedQty(unqualityfiedQty); | |
67 | + qualityDetail1.setRemark(qualityDetail.getRemark()); | |
68 | + qualityDetail1.setStatus(QuantityConstant.QUALITY_HEADER_COMPLETE); | |
69 | + if (!qualityDetailService.updateById(qualityDetail1)) { | |
70 | + throw new JeecgBootException("质检失败,更新质检数据失败"); | |
71 | + } | |
72 | + | |
73 | + if (!qualityHeaderService.updateQualityHeaderStatus(qualityDetail.getQualityId())) { | |
74 | + throw new JeecgBootException("质检失败,更新质检状态失败"); | |
75 | + } | |
76 | + | |
77 | + List<InventoryTransaction> inventoryTransactionList = new ArrayList<>(); | |
78 | + if (qualityfiedQty.compareTo(BigDecimal.ZERO) > 0) { | |
79 | + InventoryTransaction inventoryTransaction = new InventoryTransaction(); | |
80 | + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_QUALITY); | |
81 | + inventoryTransaction.setWarehouseCode(qualityDetail.getWarehouseCode()); | |
82 | + inventoryTransaction.setCompanyCode(qualityDetail.getCompanyCode()); | |
83 | + inventoryTransaction.setReceiptCode(qualityDetail.getQualityCode()); | |
84 | + inventoryTransaction.setMaterialCode(qualityDetail.getMaterialCode()); | |
85 | + inventoryTransaction.setMaterialName(qualityDetail.getMaterialName()); | |
86 | + inventoryTransaction.setMaterialSpec(qualityDetail.getMaterialSpec()); | |
87 | + inventoryTransaction.setMaterialUnit(qualityDetail.getMaterialUnit()); | |
88 | + inventoryTransaction.setBatch(qualityDetail.getBatch()); | |
89 | + inventoryTransaction.setLot(qualityDetail.getLot()); | |
90 | + inventoryTransaction.setProject(qualityDetail.getProject()); | |
91 | + inventoryTransaction.setInventoryStatus(QuantityConstant.QUALITY_GOOD); | |
92 | + inventoryTransaction.setQty(qualityfiedQty); | |
93 | + inventoryTransactionList.add(inventoryTransaction); | |
94 | + } | |
95 | + if (unqualityfiedQty.compareTo(BigDecimal.ZERO) > 0) { | |
96 | + InventoryTransaction inventoryTransaction = new InventoryTransaction(); | |
97 | + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_QUALITY); | |
98 | + inventoryTransaction.setWarehouseCode(qualityDetail.getWarehouseCode()); | |
99 | + inventoryTransaction.setCompanyCode(qualityDetail.getCompanyCode()); | |
100 | + inventoryTransaction.setReceiptCode(qualityDetail.getQualityCode()); | |
101 | + inventoryTransaction.setMaterialCode(qualityDetail.getMaterialCode()); | |
102 | + inventoryTransaction.setMaterialName(qualityDetail.getMaterialName()); | |
103 | + inventoryTransaction.setMaterialSpec(qualityDetail.getMaterialSpec()); | |
104 | + inventoryTransaction.setMaterialUnit(qualityDetail.getMaterialUnit()); | |
105 | + inventoryTransaction.setBatch(qualityDetail.getBatch()); | |
106 | + inventoryTransaction.setLot(qualityDetail.getLot()); | |
107 | + inventoryTransaction.setProject(qualityDetail.getProject()); | |
108 | + inventoryTransaction.setInventoryStatus(QuantityConstant.QUALITY_DEFECTIVE); | |
109 | + inventoryTransaction.setQty(unqualityfiedQty); | |
110 | + inventoryTransactionList.add(inventoryTransaction); | |
111 | + } | |
112 | + if (!inventoryTransactionService.saveBatch(inventoryTransactionList)) { | |
113 | + throw new JeecgBootException("质检失败,增加库存交易记录失败"); | |
114 | + } | |
115 | + return Result.ok("质检成功"); | |
116 | + } | |
117 | + | |
118 | + @Override | |
119 | + public boolean updateQualityById(BigDecimal qualityfiedQty, BigDecimal unqualityfiedQty, int id) { | |
120 | + QualityDetail qualityDetail = new QualityDetail(); | |
121 | + qualityDetail.setId(id); | |
122 | + qualityDetail.setQualityfiedQty(qualityfiedQty); | |
123 | + qualityDetail.setUnqualityfiedQty(unqualityfiedQty); | |
124 | + return updateById(qualityDetail); | |
125 | + } | |
126 | + | |
127 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/qualityHeader/service/impl/QualityHeaderServiceImpl.java
0 → 100644
1 | +package org.jeecg.modules.wms.receipt.qualityHeader.service.impl; | |
2 | + | |
3 | +import java.io.Serializable; | |
4 | +import java.math.BigDecimal; | |
5 | +import java.text.SimpleDateFormat; | |
6 | +import java.util.Collection; | |
7 | +import java.util.Date; | |
8 | +import java.util.List; | |
9 | + | |
10 | +import javax.annotation.Resource; | |
11 | + | |
12 | +import org.jeecg.common.exception.JeecgBootException; | |
13 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityDetail; | |
14 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityHeader; | |
15 | +import org.jeecg.modules.wms.receipt.qualityHeader.mapper.QualityDetailMapper; | |
16 | +import org.jeecg.modules.wms.receipt.qualityHeader.mapper.QualityHeaderMapper; | |
17 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityDetailService; | |
18 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityHeaderService; | |
19 | +import org.jeecg.utils.constant.QuantityConstant; | |
20 | +import org.springframework.beans.factory.annotation.Autowired; | |
21 | +import org.springframework.stereotype.Service; | |
22 | +import org.springframework.transaction.annotation.Transactional; | |
23 | + | |
24 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | |
25 | +import com.baomidou.mybatisplus.core.toolkit.Wrappers; | |
26 | +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; | |
27 | + | |
28 | +/** | |
29 | + * @Description: 质检表单头 | |
30 | + * @Author: jeecg-boot | |
31 | + * @Date: 2023-10-24 | |
32 | + * @Version: V1.0 | |
33 | + */ | |
34 | +@Service | |
35 | +public class QualityHeaderServiceImpl extends ServiceImpl<QualityHeaderMapper, QualityHeader> implements IQualityHeaderService { | |
36 | + | |
37 | + @Autowired | |
38 | + private QualityHeaderMapper qualityHeaderMapper; | |
39 | + @Autowired | |
40 | + private QualityDetailMapper qualityDetailMapper; | |
41 | + @Resource | |
42 | + private IQualityDetailService qualityDetailService; | |
43 | + @Resource | |
44 | + private IQualityHeaderService qualityHeaderService; | |
45 | + | |
46 | + @Override | |
47 | + @Transactional | |
48 | + public void delMain(String id) { | |
49 | + qualityDetailMapper.deleteByMainId(id); | |
50 | + qualityHeaderMapper.deleteById(id); | |
51 | + } | |
52 | + | |
53 | + @Override | |
54 | + @Transactional | |
55 | + public void delBatchMain(Collection<? extends Serializable> idList) { | |
56 | + for (Serializable id : idList) { | |
57 | + qualityDetailMapper.deleteByMainId(id.toString()); | |
58 | + qualityHeaderMapper.deleteById(id); | |
59 | + } | |
60 | + } | |
61 | + | |
62 | + @Override | |
63 | + public QualityHeader getQualityHeaderByReferCode(String referCode, String warehouseCode) { | |
64 | + LambdaQueryWrapper<QualityHeader> qualityHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
65 | + qualityHeaderLambdaQueryWrapper.eq(QualityHeader::getReferCode, referCode); | |
66 | + QualityHeader qualityHeader = getOne(qualityHeaderLambdaQueryWrapper); | |
67 | + return qualityHeader; | |
68 | + } | |
69 | + | |
70 | + @Override | |
71 | + @Transactional | |
72 | + public String createQualityCode(String qualityType) { | |
73 | + String code = null; | |
74 | + Date now = new Date(); | |
75 | + SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd"); | |
76 | + String maxCode = null; | |
77 | + QualityHeader qualityHeader = qualityHeaderMapper.getMaxQualityHeaderCode(qualityType); | |
78 | + if (qualityHeader != null) { | |
79 | + maxCode = qualityHeader.getCode(); | |
80 | + } | |
81 | + if (maxCode != null) { | |
82 | + String day = maxCode.substring(maxCode.length() - 13, maxCode.length() - 5); | |
83 | + if (day.equals(df.format(now))) { | |
84 | + Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 5, maxCode.length())); | |
85 | + code = qualityType + df.format(now) + String.format("%05d", Count + 1); | |
86 | + } else { | |
87 | + code = qualityType + df.format(now) + String.format("%05d", 0000 + 1); | |
88 | + } | |
89 | + } else { | |
90 | + code = qualityType + df.format(now) + String.format("%05d", 0000 + 1); | |
91 | + } | |
92 | + return code; | |
93 | + } | |
94 | + | |
95 | + @Override | |
96 | + @Transactional(rollbackFor = Exception.class) | |
97 | + public boolean updateQualityHeader(Integer id) { | |
98 | + LambdaQueryWrapper<QualityDetail> qualityDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
99 | + qualityDetailLambdaQueryWrapper.eq(QualityDetail::getQualityId, id); | |
100 | + List<QualityDetail> qualityDetailList = qualityDetailService.list(qualityDetailLambdaQueryWrapper); | |
101 | + QualityHeader qualityHeader = qualityHeaderService.getById(id); | |
102 | + if (qualityHeader == null) { | |
103 | + return false; | |
104 | + } | |
105 | + BigDecimal totalQty = new BigDecimal(0); | |
106 | + int totalLines = 0; | |
107 | + for (QualityDetail qualityDetail : qualityDetailList) { | |
108 | + totalLines++; | |
109 | + totalQty = totalQty.add(qualityDetail.getQty()); | |
110 | + } | |
111 | + qualityHeader = new QualityHeader(); | |
112 | + qualityHeader.setId(id); | |
113 | + qualityHeader.setTotalQty(totalQty); | |
114 | + qualityHeader.setTotalLines(totalLines); | |
115 | + if (!qualityHeaderService.updateById(qualityHeader)) { | |
116 | + return false; | |
117 | + } | |
118 | + return true; | |
119 | + } | |
120 | + | |
121 | + @Override | |
122 | + @Transactional(rollbackFor = Exception.class) | |
123 | + public boolean updateQualityHeaderStatus(Integer id) { | |
124 | + LambdaQueryWrapper<QualityDetail> qualityDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); | |
125 | + qualityDetailLambdaQueryWrapper.eq(QualityDetail::getQualityId, id); | |
126 | + List<QualityDetail> qualityDetailList = qualityDetailService.list(qualityDetailLambdaQueryWrapper); | |
127 | + QualityHeader qualityHeader = qualityHeaderService.getById(id); | |
128 | + if (qualityHeader == null) { | |
129 | + return false; | |
130 | + } | |
131 | + int minStatus; | |
132 | + int maxStatus; | |
133 | + if (qualityDetailList.size() == 0) { | |
134 | + minStatus = QuantityConstant.QUALITY_HEADER_BUILD; | |
135 | + maxStatus = QuantityConstant.QUALITY_HEADER_BUILD; | |
136 | + } else { | |
137 | + minStatus = qualityDetailList.get(0).getStatus(); | |
138 | + maxStatus = qualityDetailList.get(0).getStatus(); | |
139 | + for (QualityDetail qualityDetail : qualityDetailList) { | |
140 | + int status = qualityDetail.getStatus(); | |
141 | + if (minStatus > status) { | |
142 | + minStatus = status; | |
143 | + } | |
144 | + if (maxStatus < status) { | |
145 | + maxStatus = status; | |
146 | + } | |
147 | + } | |
148 | + } | |
149 | + QualityHeader updateQualityHeader = new QualityHeader(); | |
150 | + updateQualityHeader.setId(id); | |
151 | + updateQualityHeader.setCode(qualityHeader.getCode()); | |
152 | + updateQualityHeader.setReferCode(qualityHeader.getReferCode()); | |
153 | + updateQualityHeader.setWarehouseCode(qualityHeader.getWarehouseCode()); | |
154 | + updateQualityHeader.setFirstStatus(maxStatus); | |
155 | + updateQualityHeader.setLastStatus(minStatus); | |
156 | + if (!qualityHeaderService.updateById(updateQualityHeader)) { | |
157 | + throw new JeecgBootException("更新收货单:" + id + " 状态失败"); | |
158 | + } | |
159 | + return true; | |
160 | + } | |
161 | +} | |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptContainerHeader/service/impl/ReceiptContainerHeaderServiceImpl.java
... | ... | @@ -125,7 +125,7 @@ public class ReceiptContainerHeaderServiceImpl extends ServiceImpl<ReceiptContai |
125 | 125 | @OperationLog(bizId = "''", bizType = "'入库单追踪'", tag = "'入库任务生成'", extra = "#extraJsonString1", msg = "'任务ID:' + #taskHeader.getId()", |
126 | 126 | condition = "#receiptContainerDetailList.size() > 0", recordReturnValue = true) |
127 | 127 | @OperationLog(bizId = "''", bizType = "'任务追踪'", tag = "'入库任务生成'", extra = "#extraJsonString2", |
128 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
128 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
129 | 129 | condition = "#taskDetailList.size() > 0", recordReturnValue = true) |
130 | 130 | public Result<TaskHeader> createReceiptTask(ReceiptContainerHeader receiptContainerHeader, String warehouseCode) { |
131 | 131 | log.info("开始创建入库任务"); |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/controller/ReceiptHeaderController.java
... | ... | @@ -403,4 +403,13 @@ public class ReceiptHeaderController extends JeecgController<ReceiptHeader, IRec |
403 | 403 | } |
404 | 404 | return result; |
405 | 405 | } |
406 | + | |
407 | + @AutoLog(value = "越库") | |
408 | + @ApiOperation(value = "越库", notes = "越库") | |
409 | + @PostMapping("/crossDocking") | |
410 | + @ResponseBody | |
411 | + @ApiLogger(apiName = "越库", from = "WMS") | |
412 | + public Result<?> crossDocking(@RequestParam(name = "id", required = true) String id, HttpServletRequest req) { | |
413 | + return receiptHeaderService.crossDocking(id); | |
414 | + } | |
406 | 415 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/IReceiptHeaderService.java
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiptHeader/service/impl/ReceiptHeaderServiceImpl.java
... | ... | @@ -3,6 +3,7 @@ package org.jeecg.modules.wms.receipt.receiptHeader.service.impl; |
3 | 3 | import java.io.Serializable; |
4 | 4 | import java.math.BigDecimal; |
5 | 5 | import java.text.SimpleDateFormat; |
6 | +import java.util.ArrayList; | |
6 | 7 | import java.util.Collection; |
7 | 8 | import java.util.Date; |
8 | 9 | import java.util.List; |
... | ... | @@ -15,6 +16,8 @@ import org.jeecg.modules.wms.audit.service.IAuditService; |
15 | 16 | import org.jeecg.modules.wms.config.receiptType.entity.ReceiptType; |
16 | 17 | import org.jeecg.modules.wms.config.receiptType.service.IReceiptTypeService; |
17 | 18 | import org.jeecg.modules.wms.flow.service.IFlowDetailService; |
19 | +import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction; | |
20 | +import org.jeecg.modules.wms.inventory.inventoryTransaction.service.IInventoryTransactionService; | |
18 | 21 | import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptDetail; |
19 | 22 | import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader; |
20 | 23 | import org.jeecg.modules.wms.receipt.receiptHeader.mapper.ReceiptDetailMapper; |
... | ... | @@ -29,6 +32,7 @@ import org.springframework.stereotype.Service; |
29 | 32 | import org.springframework.transaction.annotation.Transactional; |
30 | 33 | |
31 | 34 | import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; |
35 | +import com.baomidou.mybatisplus.core.toolkit.CollectionUtils; | |
32 | 36 | import com.baomidou.mybatisplus.core.toolkit.Wrappers; |
33 | 37 | import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; |
34 | 38 | |
... | ... | @@ -60,6 +64,8 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R |
60 | 64 | private IFlowDetailService iFlowDetailService; |
61 | 65 | @Resource |
62 | 66 | private IAuditService iAuditService; |
67 | + @Resource | |
68 | + private IInventoryTransactionService inventoryTransactionService; | |
63 | 69 | |
64 | 70 | /** |
65 | 71 | * @param id 入库单主表id |
... | ... | @@ -136,18 +142,80 @@ public class ReceiptHeaderServiceImpl extends ServiceImpl<ReceiptHeaderMapper, R |
136 | 142 | } |
137 | 143 | if (maxCode != null) { |
138 | 144 | String day = maxCode.substring(maxCode.length() - 13, maxCode.length() - 5); |
139 | - if (day.equals(df.format(now))) { | |
140 | - Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 5, maxCode.length())); | |
141 | - code = receiptType + df.format(now) + String.format("%05d", Count + 1); | |
142 | - } else { | |
143 | - code = receiptType + df.format(now) + String.format("%05d", 0000 + 1); | |
144 | - } | |
145 | + Integer Count = Integer.valueOf(maxCode.substring(maxCode.length() - 5, maxCode.length())); | |
146 | + code = receiptType + df.format(now) + String.format("%05d", Count + 1); | |
145 | 147 | } else { |
146 | 148 | code = receiptType + df.format(now) + String.format("%05d", 0000 + 1); |
147 | 149 | } |
148 | 150 | return code; |
149 | 151 | } |
150 | 152 | |
153 | + @Override | |
154 | + @Transactional(rollbackFor = Exception.class) | |
155 | + public Result crossDocking(String id) { | |
156 | + ReceiptHeader receiptHeader = receiptHeaderService.getById(id); | |
157 | + if (receiptHeader == null) { | |
158 | + return Result.error("越库失败,没有找到入库单头" + id); | |
159 | + } | |
160 | + List<ReceiptDetail> receiptDetailList = receiptDetailService.selectByMainId(id); | |
161 | + if (CollectionUtils.isEmpty(receiptDetailList)) { | |
162 | + return Result.error("越库失败,没有找到入库详情" + id); | |
163 | + } | |
164 | + List<InventoryTransaction> inventoryTransactionList = new ArrayList<>(); | |
165 | + for (ReceiptDetail receiptDetail : receiptDetailList) { | |
166 | + BigDecimal qty = receiptDetail.getQty(); | |
167 | + receiptDetail.setTaskQty(qty); | |
168 | + receiptDetail.setReceiptQty(qty); | |
169 | + receiptDetail.setStatus(QuantityConstant.RECEIPT_HEADER_COMPLETED); | |
170 | + InventoryTransaction inventoryTransaction = new InventoryTransaction(); | |
171 | + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT); | |
172 | + inventoryTransaction.setWarehouseCode(receiptDetail.getWarehouseCode()); | |
173 | + inventoryTransaction.setCompanyCode(receiptDetail.getCompanyCode()); | |
174 | + inventoryTransaction.setMaterialCode(receiptDetail.getMaterialCode()); | |
175 | + inventoryTransaction.setMaterialName(receiptDetail.getMaterialName()); | |
176 | + inventoryTransaction.setMaterialSpec(receiptDetail.getMaterialSpec()); | |
177 | + inventoryTransaction.setMaterialUnit(receiptDetail.getMaterialUnit()); | |
178 | + inventoryTransaction.setReceiptId(receiptDetail.getReceiptId()); | |
179 | + inventoryTransaction.setReceiptCode(receiptHeader.getCode()); | |
180 | + inventoryTransaction.setReceiptType(receiptHeader.getType()); | |
181 | + inventoryTransaction.setReceiptDetailId(receiptDetail.getId()); | |
182 | + inventoryTransaction.setBatch(receiptDetail.getBatch()); | |
183 | + inventoryTransaction.setLot(receiptDetail.getLot()); | |
184 | + inventoryTransaction.setProject(receiptDetail.getProject()); | |
185 | + inventoryTransaction.setInventoryStatus(receiptDetail.getInventoryStatus()); | |
186 | + inventoryTransaction.setQty(qty); | |
187 | + inventoryTransaction.setReceiptQty(qty); | |
188 | + inventoryTransactionList.add(inventoryTransaction); | |
189 | + | |
190 | + inventoryTransaction = new InventoryTransaction(); | |
191 | + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_SHIPMENT); | |
192 | + inventoryTransaction.setWarehouseCode(receiptDetail.getWarehouseCode()); | |
193 | + inventoryTransaction.setCompanyCode(receiptDetail.getCompanyCode()); | |
194 | + inventoryTransaction.setMaterialCode(receiptDetail.getMaterialCode()); | |
195 | + inventoryTransaction.setMaterialName(receiptDetail.getMaterialName()); | |
196 | + inventoryTransaction.setMaterialSpec(receiptDetail.getMaterialSpec()); | |
197 | + inventoryTransaction.setMaterialUnit(receiptDetail.getMaterialUnit()); | |
198 | + inventoryTransaction.setInventoryStatus(receiptDetail.getInventoryStatus()); | |
199 | + inventoryTransaction.setBatch(receiptDetail.getBatch()); | |
200 | + inventoryTransaction.setLot(receiptDetail.getLot()); | |
201 | + inventoryTransaction.setProject(receiptDetail.getProject()); | |
202 | + inventoryTransaction.setQty(receiptDetail.getQty()); | |
203 | + inventoryTransaction.setShipmentQty(receiptDetail.getQty()); | |
204 | + inventoryTransactionList.add(inventoryTransaction); | |
205 | + } | |
206 | + | |
207 | + if (!receiptDetailService.updateBatchById(receiptDetailList)) { | |
208 | + throw new JeecgBootException("越库失败,批量更新入库单详情失败"); | |
209 | + } | |
210 | + if (!inventoryTransactionService.saveBatch(inventoryTransactionList)) { | |
211 | + throw new JeecgBootException("越库失败,批量保存库存交易记录失败"); | |
212 | + } | |
213 | + if (!receiptHeaderService.updateReceiptHeaderStatus(Integer.parseInt(id))) { | |
214 | + throw new JeecgBootException("越库失败,批更新入库单失败"); | |
215 | + } | |
216 | + return Result.ok("越库成功"); | |
217 | + } | |
218 | + | |
151 | 219 | /** |
152 | 220 | * 更新入库单 头状态和尾状态 |
153 | 221 | * 头状态是单据详情中最大的状态 |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiveHeader/controller/ReceiveHeaderController.java
... | ... | @@ -359,4 +359,47 @@ public class ReceiveHeaderController extends JeecgController<ReceiveHeader, IRec |
359 | 359 | return result; |
360 | 360 | } |
361 | 361 | |
362 | + /** | |
363 | + * 全部收货 | |
364 | + * @return | |
365 | + */ | |
366 | + @AutoLog("收货单-全部收货") | |
367 | + @ApiOperation(value = "收货单-全部收货", notes = "收货单-全部收货") | |
368 | + @PostMapping("/receiveHeader") | |
369 | + @ResponseBody | |
370 | + public Result receiveHeader(@RequestParam(name = "id", required = true) String id, HttpServletRequest req) { | |
371 | + String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); | |
372 | + String lockKey = warehouseCode; | |
373 | + Result result = receiveDetailService.receiveHeader(id, warehouseCode); | |
374 | + return result; | |
375 | + } | |
376 | + | |
377 | + /** | |
378 | + * 收货详情质检 | |
379 | + * @return | |
380 | + */ | |
381 | + @AutoLog("收货单-收货详情质检") | |
382 | + @ApiOperation(value = "收货单-收货详情质检", notes = "收货单-收货详情质检") | |
383 | + @PostMapping("/receiveDetailToQuality") | |
384 | + @ResponseBody | |
385 | + public Result receiveDetailToQuality(@RequestParam(name = "id", required = true) String id, HttpServletRequest req) { | |
386 | + String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); | |
387 | + String lockKey = warehouseCode; | |
388 | + Result result = receiveDetailService.receiveToQuality(id, warehouseCode); | |
389 | + return result; | |
390 | + } | |
391 | + | |
392 | + /** | |
393 | + * 全部质检 | |
394 | + * @return | |
395 | + */ | |
396 | + @AutoLog("收货单-全部质检") | |
397 | + @ApiOperation(value = "收货单-全部质检", notes = "收货单-全部质检") | |
398 | + @PostMapping("/receiveHeaderToQuality") | |
399 | + @ResponseBody | |
400 | + public Result receiveHeaderToQuality(@RequestParam(name = "id", required = true) String id, HttpServletRequest req) { | |
401 | + String warehouseCode = HuahengJwtUtil.getWarehouseCodeByToken(req); | |
402 | + Result result = receiveHeaderService.receiveHeaderToQuality(id, warehouseCode); | |
403 | + return result; | |
404 | + } | |
362 | 405 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiveHeader/entity/ReceiveDetail.java
... | ... | @@ -69,6 +69,10 @@ public class ReceiveDetail implements Serializable { |
69 | 69 | @Excel(name = "已收数量", width = 15) |
70 | 70 | @ApiModelProperty(value = "已收数量") |
71 | 71 | private java.math.BigDecimal taskQty; |
72 | + /** 质检数量 */ | |
73 | + @Excel(name = "质检数量", width = 15) | |
74 | + @ApiModelProperty(value = "质检数量") | |
75 | + private java.math.BigDecimal qualityQty; | |
72 | 76 | /** 库存状态 */ |
73 | 77 | @Excel(name = "库存状态", width = 15) |
74 | 78 | @Dict(dicCode = "inventory_status") |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiveHeader/service/IReceiveDetailService.java
1 | 1 | package org.jeecg.modules.wms.receipt.receiveHeader.service; |
2 | 2 | |
3 | +import java.math.BigDecimal; | |
3 | 4 | import java.util.List; |
4 | 5 | |
5 | 6 | import org.jeecg.common.api.vo.Result; |
... | ... | @@ -21,4 +22,18 @@ public interface IReceiveDetailService extends IService<ReceiveDetail> { |
21 | 22 | Result saveReceiveDetail(ReceiveDetail receiveDetail); |
22 | 23 | |
23 | 24 | Result receive(List<Receive> receiveList, String warehouseCode); |
25 | + | |
26 | + Result receiveHeader(String id, String warehouseCode); | |
27 | + | |
28 | + /** | |
29 | + * 收货单转质检单 | |
30 | + * @param id | |
31 | + * @param warehouseCode | |
32 | + * @return | |
33 | + */ | |
34 | + Result receiveToQuality(String id, String warehouseCode); | |
35 | + | |
36 | + boolean updateQualityQtyById(BigDecimal qualityQty, int id); | |
37 | + | |
38 | + boolean updateStatusById(int status, int id); | |
24 | 39 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiveHeader/service/IReceiveHeaderService.java
... | ... | @@ -38,4 +38,6 @@ public interface IReceiveHeaderService extends IService<ReceiveHeader> { |
38 | 38 | boolean updateReceiveHeader(Integer id); |
39 | 39 | |
40 | 40 | boolean updateReceiptHeaderStatus(Integer id); |
41 | + | |
42 | + Result receiveHeaderToQuality(String id, String warehouseCode); | |
41 | 43 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiveHeader/service/impl/ReceiveDetailServiceImpl.java
... | ... | @@ -3,7 +3,6 @@ package org.jeecg.modules.wms.receipt.receiveHeader.service.impl; |
3 | 3 | import java.math.BigDecimal; |
4 | 4 | import java.util.ArrayList; |
5 | 5 | import java.util.Collections; |
6 | -import java.util.Date; | |
7 | 6 | import java.util.List; |
8 | 7 | |
9 | 8 | import javax.annotation.Resource; |
... | ... | @@ -13,11 +12,16 @@ import org.jeecg.common.exception.JeecgBootException; |
13 | 12 | import org.jeecg.modules.wms.config.material.entity.Material; |
14 | 13 | import org.jeecg.modules.wms.config.material.service.IMaterialService; |
15 | 14 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; |
16 | -import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; | |
17 | 15 | import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryDetailService; |
18 | 16 | import org.jeecg.modules.wms.inventory.inventoryHeader.service.IInventoryHeaderService; |
19 | 17 | import org.jeecg.modules.wms.inventory.inventoryTransaction.entity.InventoryTransaction; |
20 | 18 | import org.jeecg.modules.wms.inventory.inventoryTransaction.service.IInventoryTransactionService; |
19 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityDetail; | |
20 | +import org.jeecg.modules.wms.receipt.qualityHeader.entity.QualityHeader; | |
21 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityDetailService; | |
22 | +import org.jeecg.modules.wms.receipt.qualityHeader.service.IQualityHeaderService; | |
23 | +import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptDetailService; | |
24 | +import org.jeecg.modules.wms.receipt.receiptHeader.service.IReceiptHeaderService; | |
21 | 25 | import org.jeecg.modules.wms.receipt.receiveHeader.entity.ReceiveDetail; |
22 | 26 | import org.jeecg.modules.wms.receipt.receiveHeader.entity.ReceiveHeader; |
23 | 27 | import org.jeecg.modules.wms.receipt.receiveHeader.mapper.ReceiveDetailMapper; |
... | ... | @@ -52,6 +56,14 @@ public class ReceiveDetailServiceImpl extends ServiceImpl<ReceiveDetailMapper, R |
52 | 56 | @Resource |
53 | 57 | private IReceiveHeaderService receiveHeaderService; |
54 | 58 | @Resource |
59 | + private IReceiptHeaderService receiptHeaderService; | |
60 | + @Resource | |
61 | + private IReceiptDetailService receiptDetailService; | |
62 | + @Resource | |
63 | + private IQualityHeaderService qualityHeaderService; | |
64 | + @Resource | |
65 | + private IQualityDetailService qualityDetailService; | |
66 | + @Resource | |
55 | 67 | private IMaterialService materialService; |
56 | 68 | @Resource |
57 | 69 | private IReceiveDetailService receiveDetailService; |
... | ... | @@ -116,7 +128,7 @@ public class ReceiveDetailServiceImpl extends ServiceImpl<ReceiveDetailMapper, R |
116 | 128 | @Transactional(rollbackFor = Exception.class) |
117 | 129 | public Result receive(List<Receive> receiveList, String warehouseCode) { |
118 | 130 | boolean success = false; |
119 | - if (receiveList == null || receiveList.size() == 0) { | |
131 | + if (CollectionUtils.isEmpty(receiveList)) { | |
120 | 132 | return Result.error("收货,收货信息为空"); |
121 | 133 | } |
122 | 134 | List<InventoryDetail> inventoryDetailList = new ArrayList<>(); |
... | ... | @@ -172,41 +184,9 @@ public class ReceiveDetailServiceImpl extends ServiceImpl<ReceiveDetailMapper, R |
172 | 184 | receiveDetail1.setStatus(QuantityConstant.RECEIVE_HEADER_COMPLETE); |
173 | 185 | } |
174 | 186 | receiveDetailList.add(receiveDetail1); |
175 | - InventoryHeader inventoryHeader = inventoryHeaderService.getInventoryHeaderByContainerCode(receiveCode, warehouseCode); | |
176 | - if (inventoryHeader == null) { | |
177 | - inventoryHeader = new InventoryHeader(); | |
178 | - inventoryHeader.setWarehouseCode(warehouseCode); | |
179 | - inventoryHeader.setCompanyCode(receiveDetail.getCompanyCode()); | |
180 | - inventoryHeader.setZoneCode(QuantityConstant.ZONE_RECEIVE); | |
181 | - inventoryHeader.setContainerCode(receiveCode); | |
182 | - inventoryHeader.setContainerStatus(QuantityConstant.STATUS_CONTAINER_EMPTY); | |
183 | - inventoryHeader.setEnable(QuantityConstant.STATUS_ENABLE); | |
184 | - if (!inventoryHeaderService.save(inventoryHeader)) { | |
185 | - throw new JeecgBootException("收货, 添加库存头失败"); | |
186 | - } | |
187 | - } | |
188 | - | |
189 | - InventoryDetail inventoryDetail = new InventoryDetail(); | |
190 | - inventoryDetail.setInventoryHeaderId(inventoryHeader.getId()); | |
191 | - inventoryDetail.setWarehouseCode(warehouseCode); | |
192 | - inventoryDetail.setCompanyCode(receiveDetail.getCompanyCode()); | |
193 | - inventoryDetail.setZoneCode(QuantityConstant.ZONE_RECEIVE); | |
194 | - inventoryDetail.setContainerCode(receiveCode); | |
195 | - inventoryDetail.setContainerStatus(QuantityConstant.STATUS_CONTAINER_EMPTY); | |
196 | - inventoryDetail.setMaterialCode(receiveDetail.getMaterialCode()); | |
197 | - inventoryDetail.setMaterialName(receiveDetail.getMaterialName()); | |
198 | - inventoryDetail.setMaterialSpec(receiveDetail.getMaterialSpec()); | |
199 | - inventoryDetail.setMaterialUnit(receiveDetail.getMaterialUnit()); | |
200 | - inventoryDetail.setQty(receiveQty); | |
201 | - inventoryDetail.setInventoryStatus(receiveDetail.getInventoryStatus()); | |
202 | - inventoryDetail.setBatch(receiveDetail.getBatch()); | |
203 | - inventoryDetail.setLot(receiveDetail.getLot()); | |
204 | - inventoryDetail.setProject(receiveDetail.getProject()); | |
205 | - inventoryDetail.setReceiveTime(new Date()); | |
206 | - inventoryDetailList.add(inventoryDetail); | |
207 | 187 | |
208 | 188 | InventoryTransaction inventoryTransaction = new InventoryTransaction(); |
209 | - inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_RECEIPT); | |
189 | + inventoryTransaction.setType(QuantityConstant.INVENTORY_TRANSACTION_RECEIVE); | |
210 | 190 | inventoryTransaction.setWarehouseCode(receiveDetail.getWarehouseCode()); |
211 | 191 | inventoryTransaction.setCompanyCode(receiveDetail.getCompanyCode()); |
212 | 192 | inventoryTransaction.setContainerCode(receiveCode); |
... | ... | @@ -219,7 +199,7 @@ public class ReceiveDetailServiceImpl extends ServiceImpl<ReceiveDetailMapper, R |
219 | 199 | inventoryTransaction.setLot(receiveDetail.getLot()); |
220 | 200 | inventoryTransaction.setProject(receiveDetail.getProject()); |
221 | 201 | inventoryTransaction.setInventoryStatus(receiveDetail.getInventoryStatus()); |
222 | - inventoryTransaction.setQty(receiveQty); | |
202 | + inventoryTransaction.setQty(taskQty); | |
223 | 203 | inventoryTransactionList.add(inventoryTransaction); |
224 | 204 | } |
225 | 205 | if (CollectionUtils.isEmpty(receiveDetailList)) { |
... | ... | @@ -231,16 +211,126 @@ public class ReceiveDetailServiceImpl extends ServiceImpl<ReceiveDetailMapper, R |
231 | 211 | if (!receiveHeaderService.updateReceiptHeaderStatus(receiveId)) { |
232 | 212 | throw new JeecgBootException("收货, 保存库存头失败"); |
233 | 213 | } |
234 | - if (!inventoryDetailService.saveBatch(inventoryDetailList)) { | |
235 | - throw new JeecgBootException("收货, 保存库存详情失败"); | |
236 | - } | |
214 | + | |
237 | 215 | if (!inventoryTransactionService.saveBatch(inventoryTransactionList)) { |
238 | 216 | throw new JeecgBootException("收货, 保存库存交易失败"); |
239 | 217 | } |
240 | - if (!taskHeaderService.combineInventoryDetail(receiveCode, warehouseCode)) { | |
241 | - throw new JeecgBootException("收货, 合并入库库存失败"); | |
242 | - } | |
243 | 218 | |
244 | 219 | return Result.OK("收货成功"); |
245 | 220 | } |
221 | + | |
222 | + @Override | |
223 | + @Transactional(rollbackFor = Exception.class) | |
224 | + public Result receiveHeader(String id, String warehouseCode) { | |
225 | + ReceiveHeader receiveHeader = receiveHeaderService.getById(id); | |
226 | + if (receiveHeader == null) { | |
227 | + return Result.error("收货失败, 没有找到收货头表" + id); | |
228 | + } | |
229 | + List<ReceiveDetail> receiveDetailList = receiveDetailService.selectByMainId(id); | |
230 | + if (CollectionUtils.isEmpty(receiveDetailList)) { | |
231 | + return Result.error("收货失败, 没有找到收货明细表" + id); | |
232 | + } | |
233 | + List<Receive> receiveList = new ArrayList<>(); | |
234 | + for (ReceiveDetail receiveDetail : receiveDetailList) { | |
235 | + Receive receive = new Receive(); | |
236 | + receive.setId(receiveDetail.getId()); | |
237 | + receive.setQty(receiveDetail.getQty()); | |
238 | + BigDecimal taskQty = receiveDetail.getQty().subtract(receiveDetail.getTaskQty()); | |
239 | + receive.setTaskQty(taskQty); | |
240 | + receiveList.add(receive); | |
241 | + } | |
242 | + return receiveDetailService.receive(receiveList, warehouseCode); | |
243 | + } | |
244 | + | |
245 | + @Override | |
246 | + @Transactional(rollbackFor = Exception.class) | |
247 | + public Result receiveToQuality(String id, String warehouseCode) { | |
248 | + ReceiveDetail receiveDetail = receiveDetailService.getById(id); | |
249 | + if (receiveDetail == null) { | |
250 | + throw new JeecgBootException("生成质检单失败, 没有找到收货明细表" + id); | |
251 | + } | |
252 | + if (receiveDetail.getQty().compareTo(receiveDetail.getTaskQty()) > 0) { | |
253 | + throw new JeecgBootException("生成质检单失败, 收货明细没有收货完成" + id); | |
254 | + } | |
255 | + if (receiveDetail.getQty().compareTo(receiveDetail.getQualityQty()) == 0) { | |
256 | + throw new JeecgBootException("生成质检单失败, 收货明细已经生成质检单" + id); | |
257 | + } | |
258 | + ReceiveHeader receiveHeader = receiveHeaderService.getById(receiveDetail.getReceiveId()); | |
259 | + if (receiveHeader == null) { | |
260 | + throw new JeecgBootException("生成质检单失败, 没有找到收货主表" + id); | |
261 | + } | |
262 | + String referCode = receiveHeader.getCode(); | |
263 | + QualityHeader qualityHeader = qualityHeaderService.getQualityHeaderByReferCode(referCode, warehouseCode); | |
264 | + if (qualityHeader == null) { | |
265 | + qualityHeader = new QualityHeader(); | |
266 | + qualityHeader.setWarehouseCode(warehouseCode); | |
267 | + qualityHeader.setReferCode(referCode); | |
268 | + qualityHeader.setCompanyCode(receiveHeader.getCompanyCode()); | |
269 | + qualityHeader.setType(QuantityConstant.QUALITY_TYPE_INCOMING); | |
270 | + qualityHeader.setSupplierCode(receiveHeader.getSupplierCode()); | |
271 | + String code = qualityHeaderService.createQualityCode(QuantityConstant.QUALITY_TYPE_INCOMING); | |
272 | + qualityHeader.setCode(code); | |
273 | + qualityHeader.setFirstStatus(QuantityConstant.QUALITY_HEADER_BUILD); | |
274 | + qualityHeader.setLastStatus(QuantityConstant.QUALITY_HEADER_BUILD); | |
275 | + if (!qualityHeaderService.save(qualityHeader)) { | |
276 | + throw new JeecgBootException("生成质检单失败, 创建单据表头失败"); | |
277 | + } | |
278 | + } | |
279 | + QualityDetail qualityDetail = new QualityDetail(); | |
280 | + qualityDetail.setWarehouseCode(warehouseCode); | |
281 | + qualityDetail.setCompanyCode(receiveHeader.getCompanyCode()); | |
282 | + qualityDetail.setReferCode(referCode); | |
283 | + qualityDetail.setQualityCode(qualityHeader.getCode()); | |
284 | + qualityDetail.setQualityId(qualityHeader.getId()); | |
285 | + qualityDetail.setStatus(QuantityConstant.QUALITY_HEADER_BUILD); | |
286 | + qualityDetail.setQty(receiveDetail.getQty()); | |
287 | + qualityDetail.setInventoryStatus(QuantityConstant.QUALITY_DISUSSED); | |
288 | + qualityDetail.setMaterialCode(receiveDetail.getMaterialCode()); | |
289 | + qualityDetail.setMaterialName(receiveDetail.getMaterialName()); | |
290 | + qualityDetail.setMaterialSpec(receiveDetail.getMaterialSpec()); | |
291 | + qualityDetail.setMaterialUnit(receiveDetail.getMaterialUnit()); | |
292 | + qualityDetail.setBatch(receiveDetail.getBatch()); | |
293 | + qualityDetail.setLot(receiveDetail.getLot()); | |
294 | + qualityDetail.setProject(receiveDetail.getProject()); | |
295 | + if (!qualityDetailService.save(qualityDetail)) { | |
296 | + throw new JeecgBootException("生成质检单失败, 创建单据表详情失败"); | |
297 | + } | |
298 | + | |
299 | + if (!receiveDetailService.updateQualityQtyById(receiveDetail.getQty(), receiveDetail.getId())) { | |
300 | + throw new JeecgBootException("生成质检单失败, 更新单据详情失败"); | |
301 | + } | |
302 | + if (!receiveDetailService.updateStatusById(QuantityConstant.RECEIVE_HEADER_QUALITY, receiveDetail.getId())) { | |
303 | + throw new JeecgBootException("生成质检单失败, 更新单据详情失败"); | |
304 | + } | |
305 | + | |
306 | + if (!receiveHeaderService.updateReceiptHeaderStatus(receiveDetail.getReceiveId())) { | |
307 | + throw new JeecgBootException("质检失败,更新质检状态失败"); | |
308 | + } | |
309 | + | |
310 | + if (!qualityHeaderService.updateQualityHeader(qualityHeader.getId())) { | |
311 | + throw new JeecgBootException("生成质检单失败, 更新单据数量失败"); | |
312 | + } | |
313 | + | |
314 | + if (!qualityHeaderService.updateQualityHeaderStatus(qualityHeader.getId())) { | |
315 | + throw new JeecgBootException("生成质检单失败, 更新单据状态失败"); | |
316 | + } | |
317 | + | |
318 | + return Result.ok("生成质检单成功"); | |
319 | + } | |
320 | + | |
321 | + @Override | |
322 | + public boolean updateQualityQtyById(BigDecimal qualityQty, int id) { | |
323 | + ReceiveDetail receiveDetail = new ReceiveDetail(); | |
324 | + receiveDetail.setId(id); | |
325 | + receiveDetail.setQualityQty(qualityQty); | |
326 | + return receiveDetailService.updateById(receiveDetail); | |
327 | + } | |
328 | + | |
329 | + @Override | |
330 | + public boolean updateStatusById(int status, int id) { | |
331 | + ReceiveDetail receiveDetail = new ReceiveDetail(); | |
332 | + receiveDetail.setId(id); | |
333 | + receiveDetail.setStatus(status); | |
334 | + return receiveDetailService.updateById(receiveDetail); | |
335 | + } | |
246 | 336 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/receipt/receiveHeader/service/impl/ReceiveHeaderServiceImpl.java
... | ... | @@ -187,4 +187,14 @@ public class ReceiveHeaderServiceImpl extends ServiceImpl<ReceiveHeaderMapper, R |
187 | 187 | } |
188 | 188 | return true; |
189 | 189 | } |
190 | + | |
191 | + @Override | |
192 | + @Transactional(rollbackFor = Exception.class) | |
193 | + public Result receiveHeaderToQuality(String id, String warehouseCode) { | |
194 | + List<ReceiveDetail> receiveDetailList = receiveDetailService.selectByMainId(id); | |
195 | + for (ReceiveDetail receiveDetail : receiveDetailList) { | |
196 | + receiveDetailService.receiveToQuality(String.valueOf(receiveDetail.getId()), warehouseCode); | |
197 | + } | |
198 | + return Result.ok("生成质检单成功"); | |
199 | + } | |
190 | 200 | } |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/shipment/shipmentCombination/service/impl/ShipmentCombinationServiceImpl.java
... | ... | @@ -834,7 +834,7 @@ public class ShipmentCombinationServiceImpl implements IShipmentCombinationServi |
834 | 834 | msg = "'任务ID:' + #taskHeader.getId() + ',库位编码:' + #shipmentContainerHeader.getFromLocationCode() + ',容器编码:' + #shipmentContainerHeader.getContainerCode() + ',目标出入口:' + #shipmentContainerHeader.getToPort()", |
835 | 835 | condition = "#shipmentContainerDetailList.size() > 0", recordReturnValue = true) |
836 | 836 | @OperationLog(bizId = "''", bizType = "'任务追踪'", tag = "'出库任务生成'", extra = "#extraJsonString2", |
837 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
837 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
838 | 838 | condition = "#taskDetailList.size() > 0", recordReturnValue = true) |
839 | 839 | public Result createShipmentTask(ShipmentContainerHeader shipmentContainerHeader, int forceTaskType, String warehouseCode, long shipmentOrder, int sequence, |
840 | 840 | int sequenceNumber) { |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/modules/wms/task/taskHeader/service/impl/TaskHeaderServiceImpl.java
... | ... | @@ -1085,7 +1085,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
1085 | 1085 | @Override |
1086 | 1086 | @Transactional(rollbackFor = Exception.class) |
1087 | 1087 | @OperationLog(bizId = "''", bizType = "'任务追踪'", tag = "'入库任务完成'", extra = "#extraJsonString1", |
1088 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
1088 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
1089 | 1089 | recordReturnValue = true) |
1090 | 1090 | @OperationLog(bizId = "''", bizType = "'入库单追踪'", tag = "'入库任务完成'", extra = "#extraJsonString1", |
1091 | 1091 | msg = "'任务ID:' + #taskHeader.getId() + ',库位编码:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", recordReturnValue = true) |
... | ... | @@ -1274,7 +1274,7 @@ public class TaskHeaderServiceImpl extends ServiceImpl<TaskHeaderMapper, TaskHea |
1274 | 1274 | @Override |
1275 | 1275 | @Transactional(rollbackFor = Exception.class) |
1276 | 1276 | @OperationLog(bizId = "''", bizType = "'任务追踪'", tag = "'出库任务完成'", extra = "#extraJsonString1", |
1277 | - msg = "'任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
1277 | + msg = "#taskHeader == null ? '' : '任务类型:' + #taskHeader.getTaskType() + ',起始库位:' + #taskHeader.getFromLocationCode() + ',目标库位:' + #taskHeader.getToLocationCode() + ',容器编码:' + #taskHeader.getContainerCode()", | |
1278 | 1278 | recordReturnValue = true) |
1279 | 1279 | @OperationLog(bizId = "''", bizType = "'出库单追踪'", tag = "'出库任务完成'", extra = "#extraJsonString1", |
1280 | 1280 | msg = "'任务ID:' + #taskHeader.getId() + ',库位编码:' + #taskHeader.getFromLocationCode() + ',容器编码:' + #taskHeader.getContainerCode() + ',目标出入口:' + #taskHeader.getToPortCode()", |
... | ... |
huaheng-wms-core/src/main/java/org/jeecg/utils/constant/QuantityConstant.java
... | ... | @@ -12,7 +12,7 @@ package org.jeecg.utils.constant; |
12 | 12 | * 8、波次状态 |
13 | 13 | * 9、质检状态 |
14 | 14 | * 10、盘点状态 |
15 | - * 11、INVENTORY_TRANSACTION_RECEIPT | |
15 | + * 11、库存交易记录 | |
16 | 16 | * 12、调整单状态 |
17 | 17 | * 13、任务内部类型 |
18 | 18 | * 14、质检单类型 |
... | ... | @@ -307,6 +307,12 @@ public class QuantityConstant { |
307 | 307 | /** 移库 */ |
308 | 308 | public static final Integer INVENTORY_TRANSACTION_TRANSFER = 50; |
309 | 309 | |
310 | + /** 收货 */ | |
311 | + public static final Integer INVENTORY_TRANSACTION_RECEIVE = 60; | |
312 | + | |
313 | + /** 质检 */ | |
314 | + public static final Integer INVENTORY_TRANSACTION_QUALITY = 70; | |
315 | + | |
310 | 316 | // 12、调整单状态 |
311 | 317 | |
312 | 318 | // 未批准 |
... | ... | @@ -402,7 +408,22 @@ public class QuantityConstant { |
402 | 408 | public static final Integer RECEIVE_HEADER_HALF = 100; |
403 | 409 | // 收货单完成收货状态 |
404 | 410 | public static final Integer RECEIVE_HEADER_COMPLETE = 200; |
405 | - | |
411 | + // 生成质检单 | |
412 | + public static final Integer RECEIVE_HEADER_QUALITY = 300; | |
413 | + | |
414 | + // 新建 | |
415 | + public static final Integer QUALITY_HEADER_BUILD = 0; | |
416 | + // 部分质检 | |
417 | + public static final Integer QUALITY_HEADER_HALF = 100; | |
418 | + // 质检完成 | |
419 | + public static final Integer QUALITY_HEADER_COMPLETE = 200; | |
420 | + | |
421 | + /** 来料质检 */ | |
422 | + public static final String QUALITY_TYPE_INCOMING = "QI"; | |
423 | + /** 库内全检 */ | |
424 | + public static final String QUALITY_TYPE_INHOUSE_FULL = "QIF"; | |
425 | + /** 库内抽检 */ | |
426 | + public static final String QUALITY_TYPE_INHOUSE_PART = "QIP"; | |
406 | 427 | |
407 | 428 | /** 对接WCS可用巷道API */ |
408 | 429 | public static final String ADDRESS_WCS_AVAILABLE_ROWDWAY = "WCS_AVAILABLE_ROWDWAY"; |
... | ... | @@ -451,8 +472,14 @@ public class QuantityConstant { |
451 | 472 | public static final String PLATFORM_CODING = "赋码系统"; |
452 | 473 | public static final String PLATFORM_ERP = "ERP"; |
453 | 474 | public static final String PLATFORM_WMS = "WMS"; |
454 | - // good | |
475 | + // 良品 | |
455 | 476 | public static final String QUALITY_GOOD = "good"; |
477 | + // 次品 | |
478 | + public static final String QUALITY_DEFECTIVE = "defective"; | |
479 | + // 报废品 | |
480 | + public static final String QUALITY_SCRAP = "scrap"; | |
481 | + // 待确认 | |
482 | + public static final String QUALITY_DISUSSED = "discussed"; | |
456 | 483 | |
457 | 484 | // 发送AGV任务成功 |
458 | 485 | public static final int AGV_NEED_SEND = 0; |
... | ... | @@ -515,23 +542,25 @@ public class QuantityConstant { |
515 | 542 | * 出库依赖库区 |
516 | 543 | */ |
517 | 544 | public static final int SHIPMENT_BY_ZONE = 1; |
518 | - | |
519 | - /** 对接WCS可用巷道API:关闭 */ | |
545 | + | |
546 | + /** 对接WCS可用巷道API:关闭 */ | |
520 | 547 | public static final String AVAILABLE_ROWDWAY_CLOSE = "0"; |
521 | - | |
548 | + | |
522 | 549 | /** 对接WCS可用巷道API:开启 */ |
523 | 550 | public static final String AVAILABLE_ROWDWAY_OPEN = "1"; |
524 | - | |
551 | + | |
525 | 552 | /** 启用获取可用巷道API */ |
526 | 553 | public static final String RULE_AVAILABLE_ROWDWAY_STATUS = "availableRowdwayStatus"; |
527 | - | |
528 | - /** 定时任务异常响应通知配置 */ | |
554 | + | |
555 | + /** 接口异常响应通知配置 */ | |
556 | + | |
557 | + /** 定时任务异常响应通知配置 */ | |
529 | 558 | public static final String RULE_JOB_EXCEPTION_NOTICE_ROLE_OR_NAME = "jobExceptionNoticeRoleOrName"; |
530 | - | |
531 | - /** 接口异常响应通知配置 */ | |
559 | + | |
560 | + /** 接口异常响应通知配置 */ | |
532 | 561 | public static final String RULE_API_EXCEPTION_NOTICE_ROLE_OR_NAME = "apiExceptionNoticeRoleOrName"; |
533 | - | |
534 | - /** 定时任务执行消息通知配置 */ | |
562 | + | |
563 | + /** 定时任务执行消息通知配置 */ | |
535 | 564 | public static final String RULE_TASK_RUN_NOTICE_CLASS_NAME = "taskRunNoticeClassName"; |
536 | 565 | |
537 | 566 | public static final int RULE_TASK_NOT_CLEAR = 0; |
... | ... |
huaheng-wms-core/src/main/resources/application-dev.yml
... | ... | @@ -116,7 +116,7 @@ spring: |
116 | 116 | # 初始化大小,最小,最大 |
117 | 117 | initial-size: 5 |
118 | 118 | min-idle: 5 |
119 | - maxActive: 20 | |
119 | + maxActive: 50 | |
120 | 120 | # 配置获取连接等待超时的时间 |
121 | 121 | maxWait: 60000 |
122 | 122 | # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 |
... | ... | @@ -136,7 +136,7 @@ spring: |
136 | 136 | connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 |
137 | 137 | datasource: |
138 | 138 | master: |
139 | - url: jdbc:log4jdbc:mysql://localhost:3306/wms4?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true | |
139 | + url: jdbc:log4jdbc:mysql://localhost:3306/wms4?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=9999 | |
140 | 140 | username: root |
141 | 141 | password: 123456 |
142 | 142 | driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy |
... | ... |
huaheng-wms-core/src/main/resources/application-prod.yml
... | ... | @@ -116,7 +116,7 @@ spring: |
116 | 116 | # 初始化大小,最小,最大 |
117 | 117 | initial-size: 5 |
118 | 118 | min-idle: 5 |
119 | - maxActive: 20 | |
119 | + maxActive: 50 | |
120 | 120 | # 配置获取连接等待超时的时间 |
121 | 121 | maxWait: 60000 |
122 | 122 | # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 |
... | ... | @@ -136,7 +136,7 @@ spring: |
136 | 136 | connectionProperties: druid.stat.mergeSql\=true;druid.stat.slowSqlMillis\=5000 |
137 | 137 | datasource: |
138 | 138 | master: |
139 | - url: jdbc:mysql://172.16.29.45:3306/wms4?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true | |
139 | + url: jdbc:mysql://172.16.29.45:3306/wms4?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=9999 | |
140 | 140 | username: root |
141 | 141 | password: hhsoftware |
142 | 142 | driver-class-name: com.mysql.cj.jdbc.Driver |
... | ... | @@ -250,7 +250,7 @@ jeecg: |
250 | 250 | - title: 物料双边打印机纸 |
251 | 251 | size: |
252 | 252 | - 85 |
253 | - - 60 | |
253 | + - 60 | |
254 | 254 | - title: 条码单边打印机纸 |
255 | 255 | size: |
256 | 256 | - 60 |
... | ... |
huaheng-wms-core/src/main/resources/application-test.yml
... | ... | @@ -137,7 +137,7 @@ spring: |
137 | 137 | datasource: |
138 | 138 | master: |
139 | 139 | # mysql数据源配置 |
140 | - url: jdbc:log4jdbc:mysql://172.16.29.45:3306/wms4?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true | |
140 | + url: jdbc:log4jdbc:mysql://172.16.29.45:3306/wms4?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true&autoReconnect=true&maxReconnects=9999 | |
141 | 141 | username: root |
142 | 142 | password: hhsoftware |
143 | 143 | driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy |
... | ... |