Commit cf97175786b2697eed7abab484af727139dffb4c
1 parent
1131273f
update
Showing
3 changed files
with
411 additions
and
293 deletions
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/home/controller/HomePageViewController.java
@@ -10,6 +10,7 @@ import org.jeecg.modules.system.entity.SysDictItem; | @@ -10,6 +10,7 @@ import org.jeecg.modules.system.entity.SysDictItem; | ||
10 | import org.jeecg.modules.system.service.impl.SysDictItemServiceImpl; | 10 | import org.jeecg.modules.system.service.impl.SysDictItemServiceImpl; |
11 | import org.jeecg.modules.wms.config.location.entity.Location; | 11 | import org.jeecg.modules.wms.config.location.entity.Location; |
12 | import org.jeecg.modules.wms.config.location.service.impl.LocationServiceImpl; | 12 | import org.jeecg.modules.wms.config.location.service.impl.LocationServiceImpl; |
13 | +import org.jeecg.modules.wms.home.service.HomePageViewService; | ||
13 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; | 14 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; |
14 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; | 15 | import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; |
15 | import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryDetailServiceImpl; | 16 | import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryDetailServiceImpl; |
@@ -55,21 +56,7 @@ public class HomePageViewController { | @@ -55,21 +56,7 @@ public class HomePageViewController { | ||
55 | 56 | ||
56 | 57 | ||
57 | @Resource | 58 | @Resource |
58 | - ShipmentHeaderServiceImpl shipmentHeaderServiceImpl; | ||
59 | - @Resource | ||
60 | - ReceiptHeaderServiceImpl receiptHeaderServiceImpl; | ||
61 | - @Resource | ||
62 | - SysDictItemServiceImpl sysDictItemServiceImpl; | ||
63 | - @Resource | ||
64 | - LocationServiceImpl locationServiceImpl; | ||
65 | - @Resource | ||
66 | - InventoryDetailServiceImpl inventoryDetailServiceImpl; | ||
67 | - @Resource | ||
68 | - InventoryHeaderServiceImpl inventoryHeaderServiceImpl; | ||
69 | - @Resource | ||
70 | - TaskDetailServiceImpl taskDetailServiceImpl; | ||
71 | - @Resource | ||
72 | - TaskHeaderServiceImpl taskHeaderService; | 59 | + HomePageViewService homePageViewService; |
73 | 60 | ||
74 | 61 | ||
75 | /** | 62 | /** |
@@ -78,75 +65,7 @@ public class HomePageViewController { | @@ -78,75 +65,7 @@ public class HomePageViewController { | ||
78 | */ | 65 | */ |
79 | @RequestMapping(value = "/deliveringAmount", method = {RequestMethod.PUT,RequestMethod.POST}) | 66 | @RequestMapping(value = "/deliveringAmount", method = {RequestMethod.PUT,RequestMethod.POST}) |
80 | public Result<String> deliveringAmount() { | 67 | public Result<String> deliveringAmount() { |
81 | - //查询出库单的7天出库量 | ||
82 | - LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
83 | - shipmentHeaderLambdaQueryWrapper | ||
84 | - .select(ShipmentHeader::getCreateTime,ShipmentHeader::getTotalQty); | ||
85 | - List<ShipmentHeader> shipmentHeaders = shipmentHeaderServiceImpl.list(shipmentHeaderLambdaQueryWrapper); | ||
86 | - LinkedHashMap<String, String> list = new LinkedHashMap<>(); | ||
87 | - | ||
88 | - for (int i=6;i>=0;i--) | ||
89 | - { | ||
90 | - List<ShipmentHeader> shipmentHeadersCop = shipmentHeaders; | ||
91 | - String today = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() -(1000 * 60 * 60 * 24)*i).toString(); | ||
92 | - List<ShipmentHeader> collect = shipmentHeadersCop.stream().filter(shipmentHeader -> new SimpleDateFormat("yyyy-MM-dd").format(shipmentHeader.getCreateTime()).toString().contains(today)).collect(Collectors.toList()); | ||
93 | - list.put(today, String.valueOf(collect.size())); | ||
94 | - } | ||
95 | - | ||
96 | - | ||
97 | - //查询入库单的7天入库量 | ||
98 | - LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
99 | - receiptHeaderLambdaQueryWrapper | ||
100 | - .select(ReceiptHeader::getCreateTime,ReceiptHeader::getTotalqty); | ||
101 | - List<ReceiptHeader> receiptHeaders = receiptHeaderServiceImpl.list(receiptHeaderLambdaQueryWrapper); | ||
102 | - LinkedHashMap<String, String> list2 = new LinkedHashMap<>(); | ||
103 | - for (int i=6;i>=0;i--) | ||
104 | - { | ||
105 | - List<ReceiptHeader> receiptHeadersCop = receiptHeaders; | ||
106 | - String today = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() -(1000 * 60 * 60 * 24)*i).toString(); | ||
107 | - List<ReceiptHeader> collect = receiptHeadersCop.stream().filter(ReceiptHeader -> new SimpleDateFormat("yyyy-MM-dd").format(ReceiptHeader.getCreateTime()).toString().contains(today)).collect(Collectors.toList()); | ||
108 | - list2.put(today, String.valueOf(collect.size())); | ||
109 | - } | ||
110 | - | ||
111 | - Option option = new Option(); | ||
112 | - option.tooltip().trigger(Trigger.axis).axisPointer().type(PointerType.cross); | ||
113 | - option.grid().setLeft("3%"); | ||
114 | - option.grid().setRight("4%"); | ||
115 | - option.grid().setBottom("3%"); | ||
116 | - List<Object> content = new ArrayList<>(); | ||
117 | - content.add("#c23531"); | ||
118 | - content.add("#2f4554"); | ||
119 | - option.setColor(content); | ||
120 | - option.grid().containLabel(true); | ||
121 | - option.legend().data().add("收货量"); | ||
122 | - option.legend().data().add("发货量"); | ||
123 | - Map<Object, Object> map = new HashMap<>(); | ||
124 | - Axis axis = new CategoryAxis() ; | ||
125 | - axis.boundaryGap(false); | ||
126 | - Line line = new Line(); | ||
127 | - line.setName("发货量"); | ||
128 | - for (String key : list.keySet()) { | ||
129 | - Object o1 = key; | ||
130 | - Object o2 = list.get(key); | ||
131 | - axis.data().add(o1); | ||
132 | - line.data().add(o2); | ||
133 | - } | ||
134 | - | ||
135 | - Line line2 = new Line(); | ||
136 | - line2.setName("收货量"); | ||
137 | - for (String key : list2.keySet()) { | ||
138 | - Object o1 = key; | ||
139 | - Object o2 = list2.get(key); | ||
140 | - line2.data().add(o2); | ||
141 | - } | ||
142 | - | ||
143 | - | ||
144 | - option.setxAxis(Arrays.asList(axis)); | ||
145 | - ValueAxis yAxis = new ValueAxis(); | ||
146 | - option.setyAxis(Arrays.asList(yAxis)); | ||
147 | - option.series(line,line2); | ||
148 | - String format = GsonUtil.format(option); | ||
149 | - return Result.ok(GsonUtil.format(option)); | 68 | + return homePageViewService.deliveringAmount(); |
150 | } | 69 | } |
151 | 70 | ||
152 | 71 | ||
@@ -156,57 +75,7 @@ public class HomePageViewController { | @@ -156,57 +75,7 @@ public class HomePageViewController { | ||
156 | */ | 75 | */ |
157 | @RequestMapping(value = "/inventoryUtilization", method = {RequestMethod.PUT,RequestMethod.POST}) | 76 | @RequestMapping(value = "/inventoryUtilization", method = {RequestMethod.PUT,RequestMethod.POST}) |
158 | public Result<String> inventoryUtilization() { | 77 | public Result<String> inventoryUtilization() { |
159 | - | ||
160 | - //查询所有容器 select限制字段速度更快 | ||
161 | - LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
162 | - locationLambdaQueryWrapper.select(Location::getContainerCode); | ||
163 | - List<Location> locations = locationServiceImpl.list(locationLambdaQueryWrapper); | ||
164 | - | ||
165 | - //先存储总数 | ||
166 | - int inStock=locations.size(); | ||
167 | - | ||
168 | - //删除为空的数量 | ||
169 | - locations.removeIf(location -> StringUtils.isEmpty(location.getContainerCode())); | ||
170 | - | ||
171 | - //有货数量 总数-无货数量 | ||
172 | - inStock=inStock-locations.size(); | ||
173 | - | ||
174 | - Option option = new Option(); | ||
175 | -// option.title("库存状态分布").title().x("center"); | ||
176 | - option.tooltip(Trigger.item).tooltip().formatter("{a} <br/>{b} : {c} ({d}%)"); | ||
177 | - option.legend().setOrient(Orient.vertical); | ||
178 | - option.legend().setRight(10); | ||
179 | - option.legend().setTop(20); | ||
180 | - option.legend().setBottom(20); | ||
181 | - option.legend().setData(new ArrayList<String>()); | ||
182 | - List<Object> content = new ArrayList<>(); | ||
183 | - content.add("#c23531"); | ||
184 | - content.add("#2f4554"); | ||
185 | - option.setColor(content); | ||
186 | - Pie pie = new Pie(); | ||
187 | - pie.setName("货位状态"); | ||
188 | - pie.setType(SeriesType.pie); | ||
189 | - pie.setRadius("55%"); | ||
190 | - pie.setCenter(new String[]{"40%","50%"}); | ||
191 | - Normal normal = new Normal(); | ||
192 | - normal.setFormatter("{b} \n {c} ({d}%)"); | ||
193 | - normal.setBarBorderColor("#eee"); | ||
194 | - normal.setBorderWidth(1); | ||
195 | - normal.setBorderRadius(4); | ||
196 | - pie.label().normal(normal); | ||
197 | - pie.itemStyle().emphasis().setShadowBlur(10); | ||
198 | - pie.itemStyle().emphasis().setShadowOffsetX(0); | ||
199 | - pie.itemStyle().emphasis().setShadowColor("rgba(0, 0, 0, 0.4)"); | ||
200 | - | ||
201 | - option.legend().data().add("有货"); | ||
202 | - pie.data().add(new ChartData("有货", Convert.toDouble(inStock))); | ||
203 | - | ||
204 | - option.legend().data().add("无货"); | ||
205 | - pie.data().add(new ChartData("无货", Convert.toDouble(locations.size()))); | ||
206 | - | ||
207 | - option.series(pie); | ||
208 | - String format = GsonUtil.format(option); | ||
209 | - return Result.ok(GsonUtil.format(option)); | 78 | + return homePageViewService.inventoryUtilization(); |
210 | } | 79 | } |
211 | 80 | ||
212 | 81 | ||
@@ -216,58 +85,7 @@ public class HomePageViewController { | @@ -216,58 +85,7 @@ public class HomePageViewController { | ||
216 | */ | 85 | */ |
217 | @RequestMapping(value = "/inventoryStatus", method = {RequestMethod.PUT,RequestMethod.POST}) | 86 | @RequestMapping(value = "/inventoryStatus", method = {RequestMethod.PUT,RequestMethod.POST}) |
218 | public Result<String> inventoryStatus() { | 87 | public Result<String> inventoryStatus() { |
219 | - Option option = new Option(); | ||
220 | - option.tooltip(Trigger.item).tooltip().formatter("{a} <br/>{b} : {c} ({d}%)"); | ||
221 | - option.legend().setOrient(Orient.vertical); | ||
222 | - option.legend().setRight(10); | ||
223 | - option.legend().setTop(20); | ||
224 | - option.legend().setBottom(10); | ||
225 | - option.legend().setData(new ArrayList<String>()); | ||
226 | - List<Object> content = new ArrayList<>(); | ||
227 | - content.add("#c23531"); | ||
228 | - content.add("#2f4554"); | ||
229 | - option.setColor(content); | ||
230 | - | ||
231 | - Pie pie = new Pie(); | ||
232 | - pie.setName("库存状态"); | ||
233 | - pie.setType(SeriesType.pie); | ||
234 | - pie.setRadius("70%"); | ||
235 | - pie.setCenter(new String[]{"40%","50%"}); | ||
236 | - Normal normal = new Normal(); | ||
237 | - normal.setFormatter("{b} \n {c} ({d}%)"); | ||
238 | - normal.setBarBorderColor("#eee"); | ||
239 | - normal.setBorderWidth(1); | ||
240 | - normal.setBorderRadius(4); | ||
241 | - pie.label().normal(normal); | ||
242 | - pie.itemStyle().emphasis().setShadowBlur(10); | ||
243 | - pie.itemStyle().emphasis().setShadowOffsetX(0); | ||
244 | - pie.itemStyle().emphasis().setShadowColor("rgba(0, 0, 0, 0.4)"); | ||
245 | - | ||
246 | - | ||
247 | - QueryWrapper<InventoryDetail> queryWrapper = new QueryWrapper<>(); | ||
248 | - queryWrapper.select("inventory_status ,SUM(qty) qty") | ||
249 | - .eq("warehouse_code", "CS0001").groupBy("inventory_status"); | ||
250 | - List<InventoryDetail> inventoryDetails = inventoryDetailServiceImpl.list(queryWrapper); | ||
251 | - | ||
252 | - | ||
253 | - LambdaQueryWrapper<SysDictItem> sysDictItemLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
254 | - sysDictItemLambdaQueryWrapper.select(SysDictItem::getItemText,SysDictItem::getItemValue); | ||
255 | - List<SysDictItem> sysDictItems = sysDictItemServiceImpl.list(sysDictItemLambdaQueryWrapper); | ||
256 | - List<String> collect = sysDictItems.stream().map(SysDictItem::getItemValue).collect(Collectors.toList()); | ||
257 | - Object[] objects = collect.toArray(); | ||
258 | - | ||
259 | - | ||
260 | - for(InventoryDetail inventoryDetail : inventoryDetails){ | ||
261 | - int i = ArrayUtil.indexOf(objects, inventoryDetail.getInventoryStatus()); | ||
262 | - ChartData chartData = new ChartData(); | ||
263 | - option.legend().getData().add(sysDictItems.get(i).getItemText()); | ||
264 | - chartData.setName(sysDictItems.get(i).getItemText()); | ||
265 | - chartData.setValue(Convert.toDouble(inventoryDetail.getQty())); | ||
266 | - pie.data().add(chartData); | ||
267 | - } | ||
268 | - option.series().add(pie); | ||
269 | - String format = GsonUtil.format(option); | ||
270 | - return Result.ok(GsonUtil.format(option)); | 88 | + return homePageViewService.inventoryStatus(); |
271 | } | 89 | } |
272 | 90 | ||
273 | 91 | ||
@@ -277,57 +95,7 @@ public class HomePageViewController { | @@ -277,57 +95,7 @@ public class HomePageViewController { | ||
277 | */ | 95 | */ |
278 | @RequestMapping(value = "/inventoryOverview", method = {RequestMethod.PUT,RequestMethod.POST}) | 96 | @RequestMapping(value = "/inventoryOverview", method = {RequestMethod.PUT,RequestMethod.POST}) |
279 | public Result<String> inventoryOverview() { | 97 | public Result<String> inventoryOverview() { |
280 | - | ||
281 | - QueryWrapper<InventoryDetail> queryWrapper = new QueryWrapper<>(); | ||
282 | - queryWrapper.select("material_name, sum(qty) AS qty") | ||
283 | - .eq("warehouse_code", "CS0001").groupBy("material_name"); | ||
284 | - List<InventoryDetail> inventoryDetails = inventoryDetailServiceImpl.list(queryWrapper); | ||
285 | - Option option = new Option(); | ||
286 | - option.tooltip(Trigger.item).tooltip().formatter("{a} <br/>{b} : {c} ({d}%)"); | ||
287 | - option.legend().setOrient(Orient.vertical); | ||
288 | - option.legend().setRight(10); | ||
289 | - option.legend().setTop(10); | ||
290 | - option.legend().setBottom(10); | ||
291 | - option.legend().setData(new ArrayList<String>()); | ||
292 | - option.legend().setType(LegendType.scroll); | ||
293 | - List<Object> content = new ArrayList<>(); | ||
294 | - content.add("#c23531"); | ||
295 | - content.add("#2f4554"); | ||
296 | - option.setColor(content); | ||
297 | - Pie pie = new Pie(); | ||
298 | - pie.setName("库存"); | ||
299 | - pie.setType(SeriesType.pie); | ||
300 | - pie.setRadius("55%"); | ||
301 | - pie.setCenter(new String[]{"40%","50%"}); | ||
302 | - pie.itemStyle().emphasis().setShadowBlur(10); | ||
303 | - pie.itemStyle().emphasis().setShadowOffsetX(0); | ||
304 | - pie.itemStyle().emphasis().setShadowColor("rgba(0, 0, 0, 0.4)"); | ||
305 | - Normal normal = new Normal(); | ||
306 | - normal.setFormatter("{b} \n {c} ({d}%)"); | ||
307 | - normal.setBarBorderColor("#eee"); | ||
308 | - normal.setBorderWidth(1); | ||
309 | - normal.setBorderRadius(4); | ||
310 | - pie.label().normal(normal); | ||
311 | - | ||
312 | - int i = 0; | ||
313 | - Map<String, Boolean> map = new HashMap<>(); | ||
314 | - for(InventoryDetail inventory: inventoryDetails){ | ||
315 | - Object o1 = inventory.getMaterialName(); | ||
316 | - Object o2 = inventory.getQty(); | ||
317 | - option.legend().data().add(o1); | ||
318 | - pie.data().add(new ChartData(o1.toString(), Convert.toDouble(o2))); | ||
319 | - if(i<6){ | ||
320 | - map.put(o1.toString(),true); | ||
321 | - }else{ | ||
322 | - map.put(o1.toString(),false); | ||
323 | - } | ||
324 | - i++; | ||
325 | - } | ||
326 | - option.series(pie); | ||
327 | - option.legend().setSelected(map); | ||
328 | - String format = GsonUtil.format(option); | ||
329 | - return Result.ok(GsonUtil.format(option)); | ||
330 | - | 98 | + return homePageViewService.inventoryOverview(); |
331 | } | 99 | } |
332 | 100 | ||
333 | 101 | ||
@@ -338,61 +106,7 @@ public class HomePageViewController { | @@ -338,61 +106,7 @@ public class HomePageViewController { | ||
338 | */ | 106 | */ |
339 | @RequestMapping(value = "/getCommonData", method = {RequestMethod.PUT,RequestMethod.POST}) | 107 | @RequestMapping(value = "/getCommonData", method = {RequestMethod.PUT,RequestMethod.POST}) |
340 | public Result getCommonData() { | 108 | public Result getCommonData() { |
341 | - | ||
342 | - //昨天日期 | ||
343 | - String today = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() - 1000 * 60 * 60 * 24).toString(); | ||
344 | - Map<String, Object> map = new HashMap<>(); | ||
345 | - | ||
346 | - //今天入库量 | ||
347 | - LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
348 | - taskDetailLambdaQueryWrapper.select(TaskDetail::getTaskType,TaskDetail::getQty).gt(TaskDetail::getCreateTime,today); | ||
349 | - List<TaskDetail> taskDetails = taskDetailServiceImpl.list(taskDetailLambdaQueryWrapper); | ||
350 | - BigDecimal receiptQty = BigDecimal.ZERO; | ||
351 | - BigDecimal shipmentQty = BigDecimal.ZERO; | ||
352 | - | ||
353 | - for(TaskDetail taskDetail : taskDetails) | ||
354 | - { | ||
355 | - if (taskDetail.getTaskType().equals(QuantityConstant.TASK_TYPE_WHOLERECEIPT)) | ||
356 | - { | ||
357 | - receiptQty=receiptQty.add(taskDetail.getQty()); | ||
358 | - }else if (taskDetail.getTaskType().equals(QuantityConstant.TASK_TYPE_WHOLESHIPMENT)) | ||
359 | - { | ||
360 | - shipmentQty=shipmentQty.add(taskDetail.getQty()); | ||
361 | - } | ||
362 | - | ||
363 | - } | ||
364 | - map.put("receiptTotal",receiptQty); | ||
365 | - map.put("shipmentTotal",shipmentQty); | ||
366 | - //今日交易量 | ||
367 | - map.put("bllCount",receiptQty.add(shipmentQty)); | ||
368 | - | ||
369 | - | ||
370 | - //库存总数 | ||
371 | - LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
372 | - inventoryHeaderLambdaQueryWrapper.select(InventoryHeader::getTotalQty); | ||
373 | - List<InventoryHeader> inventoryHeaders = inventoryHeaderServiceImpl.list(inventoryHeaderLambdaQueryWrapper); | ||
374 | - BigDecimal inventoryQty = BigDecimal.ZERO; | ||
375 | - for(InventoryHeader inventoryHeader : inventoryHeaders) | ||
376 | - { | ||
377 | - inventoryQty=inventoryQty.add(inventoryHeader.getTotalQty()); | ||
378 | - } | ||
379 | - map.put("inventoryTotal",inventoryQty); | ||
380 | - | ||
381 | - | ||
382 | - //库内品数 | ||
383 | - LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
384 | - inventoryDetailLambdaQueryWrapper.select(InventoryDetail::getId).groupBy(InventoryDetail::getInventoryStatus); | ||
385 | - List<InventoryDetail> inventoryDetails = inventoryDetailServiceImpl.list(inventoryDetailLambdaQueryWrapper); | ||
386 | - map.put("materialCount",inventoryDetails.size()); | ||
387 | - | ||
388 | - //待执行任务数 | ||
389 | - LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
390 | - taskHeaderLambdaQueryWrapper.ge(TaskHeader::getStatus,QuantityConstant.TASK_STATUS_RELEASE) | ||
391 | - .lt(TaskHeader::getStatus,QuantityConstant.TASK_STATUS_COMPLETED); | ||
392 | - List<TaskHeader> taskHeaders = taskHeaderService.list(taskHeaderLambdaQueryWrapper); | ||
393 | - map.put("taskUncompletedTotal",taskHeaders.size()); | ||
394 | - | ||
395 | - return Result.ok(map); | 109 | + return homePageViewService.getCommonData(); |
396 | } | 110 | } |
397 | 111 | ||
398 | } | 112 | } |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/home/service/HomePageViewService.java
0 → 100644
1 | +package org.jeecg.modules.wms.home.service; | ||
2 | + | ||
3 | +import com.baomidou.mybatisplus.extension.service.IService; | ||
4 | +import org.jeecg.common.api.vo.Result; | ||
5 | +import org.jeecg.modules.wms.config.location.entity.Location; | ||
6 | +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; | ||
7 | + | ||
8 | +import java.io.Serializable; | ||
9 | +import java.util.Collection; | ||
10 | + | ||
11 | +/** | ||
12 | + * @Description: 任务表 | ||
13 | + * @Author: jeecg-boot | ||
14 | + * @Date: 2022-11-10 | ||
15 | + * @Version: V1.0 | ||
16 | + */ | ||
17 | +public interface HomePageViewService { | ||
18 | + | ||
19 | + | ||
20 | + Result<String> deliveringAmount(); | ||
21 | + | ||
22 | + Result<String> inventoryUtilization(); | ||
23 | + | ||
24 | + Result<String> inventoryStatus(); | ||
25 | + | ||
26 | + Result<String> inventoryOverview(); | ||
27 | + | ||
28 | + Result getCommonData(); | ||
29 | + | ||
30 | +} |
jeecg-boot-master/jeecg-boot/jeecg-boot-module-system/src/main/java/org/jeecg/modules/wms/home/service/impl/HomePageViewServiceImpl.java
0 → 100644
1 | +package org.jeecg.modules.wms.home.service.impl; | ||
2 | + | ||
3 | + | ||
4 | +import cn.hutool.core.util.ArrayUtil; | ||
5 | +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
6 | +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | ||
7 | +import com.baomidou.mybatisplus.core.toolkit.Wrappers; | ||
8 | +import com.github.abel533.echarts.Option; | ||
9 | +import com.github.abel533.echarts.axis.Axis; | ||
10 | +import com.github.abel533.echarts.axis.CategoryAxis; | ||
11 | +import com.github.abel533.echarts.axis.ValueAxis; | ||
12 | +import com.github.abel533.echarts.code.*; | ||
13 | +import com.github.abel533.echarts.json.GsonUtil; | ||
14 | +import com.github.abel533.echarts.series.Line; | ||
15 | +import com.github.abel533.echarts.series.Pie; | ||
16 | +import com.github.abel533.echarts.style.itemstyle.Normal; | ||
17 | +import org.jeecg.common.api.vo.Result; | ||
18 | +import org.jeecg.modules.system.entity.SysDictItem; | ||
19 | +import org.jeecg.modules.system.service.impl.SysDictItemServiceImpl; | ||
20 | +import org.jeecg.modules.wms.config.location.entity.Location; | ||
21 | +import org.jeecg.modules.wms.config.location.service.impl.LocationServiceImpl; | ||
22 | +import org.jeecg.modules.wms.home.service.HomePageViewService; | ||
23 | + | ||
24 | +import org.jeecg.modules.wms.home.support.ChartData; | ||
25 | +import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryDetail; | ||
26 | +import org.jeecg.modules.wms.inventory.inventoryHeader.entity.InventoryHeader; | ||
27 | +import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryDetailServiceImpl; | ||
28 | +import org.jeecg.modules.wms.inventory.inventoryHeader.service.impl.InventoryHeaderServiceImpl; | ||
29 | +import org.jeecg.modules.wms.receipt.receiptHeader.entity.ReceiptHeader; | ||
30 | +import org.jeecg.modules.wms.receipt.receiptHeader.service.impl.ReceiptHeaderServiceImpl; | ||
31 | +import org.jeecg.modules.wms.shipment.shipmentHeader.entity.ShipmentHeader; | ||
32 | +import org.jeecg.modules.wms.shipment.shipmentHeader.service.impl.ShipmentHeaderServiceImpl; | ||
33 | +import org.jeecg.modules.wms.task.taskHeader.entity.TaskDetail; | ||
34 | +import org.jeecg.modules.wms.task.taskHeader.entity.TaskHeader; | ||
35 | +import org.jeecg.modules.wms.task.taskHeader.service.impl.TaskDetailServiceImpl; | ||
36 | +import org.jeecg.modules.wms.task.taskHeader.service.impl.TaskHeaderServiceImpl; | ||
37 | +import org.jeecg.utils.StringUtils; | ||
38 | +import org.jeecg.utils.constant.QuantityConstant; | ||
39 | +import org.jeecg.utils.support.Convert; | ||
40 | +import org.springframework.stereotype.Service; | ||
41 | + | ||
42 | +import javax.annotation.Resource; | ||
43 | +import java.math.BigDecimal; | ||
44 | +import java.text.SimpleDateFormat; | ||
45 | +import java.util.*; | ||
46 | +import java.util.stream.Collectors; | ||
47 | + | ||
48 | + | ||
49 | +/** | ||
50 | + * @Description: 任务表 | ||
51 | + * @Author: jeecg-boot | ||
52 | + * @Date: 2022-11-10 | ||
53 | + * @Version: V1.0 | ||
54 | + */ | ||
55 | +@Service | ||
56 | +public class HomePageViewServiceImpl implements HomePageViewService { | ||
57 | + | ||
58 | + | ||
59 | + @Resource | ||
60 | + ShipmentHeaderServiceImpl shipmentHeaderServiceImpl; | ||
61 | + @Resource | ||
62 | + ReceiptHeaderServiceImpl receiptHeaderServiceImpl; | ||
63 | + @Resource | ||
64 | + SysDictItemServiceImpl sysDictItemServiceImpl; | ||
65 | + @Resource | ||
66 | + LocationServiceImpl locationServiceImpl; | ||
67 | + @Resource | ||
68 | + InventoryDetailServiceImpl inventoryDetailServiceImpl; | ||
69 | + @Resource | ||
70 | + InventoryHeaderServiceImpl inventoryHeaderServiceImpl; | ||
71 | + @Resource | ||
72 | + TaskDetailServiceImpl taskDetailServiceImpl; | ||
73 | + @Resource | ||
74 | + TaskHeaderServiceImpl taskHeaderService; | ||
75 | + @Resource | ||
76 | + HomePageViewService homePageViewService; | ||
77 | + | ||
78 | + | ||
79 | + @Override | ||
80 | + public Result<String> deliveringAmount() { | ||
81 | + //查询出库单的7天出库量 | ||
82 | + LambdaQueryWrapper<ShipmentHeader> shipmentHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
83 | + shipmentHeaderLambdaQueryWrapper | ||
84 | + .select(ShipmentHeader::getCreateTime,ShipmentHeader::getTotalQty); | ||
85 | + List<ShipmentHeader> shipmentHeaders = shipmentHeaderServiceImpl.list(shipmentHeaderLambdaQueryWrapper); | ||
86 | + LinkedHashMap<String, String> list = new LinkedHashMap<>(); | ||
87 | + | ||
88 | + for (int i=6;i>=0;i--) | ||
89 | + { | ||
90 | + List<ShipmentHeader> shipmentHeadersCop = shipmentHeaders; | ||
91 | + String today = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() -(1000 * 60 * 60 * 24)*i).toString(); | ||
92 | + List<ShipmentHeader> collect = shipmentHeadersCop.stream().filter(shipmentHeader -> new SimpleDateFormat("yyyy-MM-dd").format(shipmentHeader.getCreateTime()).toString().contains(today)).collect(Collectors.toList()); | ||
93 | + list.put(today, String.valueOf(collect.size())); | ||
94 | + } | ||
95 | + | ||
96 | + | ||
97 | + //查询入库单的7天入库量 | ||
98 | + LambdaQueryWrapper<ReceiptHeader> receiptHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
99 | + receiptHeaderLambdaQueryWrapper | ||
100 | + .select(ReceiptHeader::getCreateTime,ReceiptHeader::getTotalqty); | ||
101 | + List<ReceiptHeader> receiptHeaders = receiptHeaderServiceImpl.list(receiptHeaderLambdaQueryWrapper); | ||
102 | + LinkedHashMap<String, String> list2 = new LinkedHashMap<>(); | ||
103 | + for (int i=6;i>=0;i--) | ||
104 | + { | ||
105 | + List<ReceiptHeader> receiptHeadersCop = receiptHeaders; | ||
106 | + String today = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() -(1000 * 60 * 60 * 24)*i).toString(); | ||
107 | + List<ReceiptHeader> collect = receiptHeadersCop.stream().filter(ReceiptHeader -> new SimpleDateFormat("yyyy-MM-dd").format(ReceiptHeader.getCreateTime()).toString().contains(today)).collect(Collectors.toList()); | ||
108 | + list2.put(today, String.valueOf(collect.size())); | ||
109 | + } | ||
110 | + | ||
111 | + Option option = new Option(); | ||
112 | + option.tooltip().trigger(Trigger.axis).axisPointer().type(PointerType.cross); | ||
113 | + option.grid().setLeft("3%"); | ||
114 | + option.grid().setRight("4%"); | ||
115 | + option.grid().setBottom("3%"); | ||
116 | + List<Object> content = new ArrayList<>(); | ||
117 | + content.add("#c23531"); | ||
118 | + content.add("#2f4554"); | ||
119 | + option.setColor(content); | ||
120 | + option.grid().containLabel(true); | ||
121 | + option.legend().data().add("收货量"); | ||
122 | + option.legend().data().add("发货量"); | ||
123 | + Map<Object, Object> map = new HashMap<>(); | ||
124 | + Axis axis = new CategoryAxis() ; | ||
125 | + axis.boundaryGap(false); | ||
126 | + Line line = new Line(); | ||
127 | + line.setName("发货量"); | ||
128 | + for (String key : list.keySet()) { | ||
129 | + Object o1 = key; | ||
130 | + Object o2 = list.get(key); | ||
131 | + axis.data().add(o1); | ||
132 | + line.data().add(o2); | ||
133 | + } | ||
134 | + | ||
135 | + Line line2 = new Line(); | ||
136 | + line2.setName("收货量"); | ||
137 | + for (String key : list2.keySet()) { | ||
138 | + Object o1 = key; | ||
139 | + Object o2 = list2.get(key); | ||
140 | + line2.data().add(o2); | ||
141 | + } | ||
142 | + | ||
143 | + | ||
144 | + option.setxAxis(Arrays.asList(axis)); | ||
145 | + ValueAxis yAxis = new ValueAxis(); | ||
146 | + option.setyAxis(Arrays.asList(yAxis)); | ||
147 | + option.series(line,line2); | ||
148 | + String format = GsonUtil.format(option); | ||
149 | + return Result.ok(GsonUtil.format(option)); | ||
150 | + } | ||
151 | + | ||
152 | + @Override | ||
153 | + public Result<String> inventoryUtilization() { | ||
154 | + //查询所有容器 select限制字段速度更快 | ||
155 | + LambdaQueryWrapper<Location> locationLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
156 | + locationLambdaQueryWrapper.select(Location::getContainerCode); | ||
157 | + List<Location> locations = locationServiceImpl.list(locationLambdaQueryWrapper); | ||
158 | + | ||
159 | + //先存储总数 | ||
160 | + int inStock=locations.size(); | ||
161 | + | ||
162 | + //删除为空的数量 | ||
163 | + locations.removeIf(location -> StringUtils.isEmpty(location.getContainerCode())); | ||
164 | + | ||
165 | + //有货数量 总数-无货数量 | ||
166 | + inStock=inStock-locations.size(); | ||
167 | + | ||
168 | + Option option = new Option(); | ||
169 | +// option.title("库存状态分布").title().x("center"); | ||
170 | + option.tooltip(Trigger.item).tooltip().formatter("{a} <br/>{b} : {c} ({d}%)"); | ||
171 | + option.legend().setOrient(Orient.vertical); | ||
172 | + option.legend().setRight(10); | ||
173 | + option.legend().setTop(20); | ||
174 | + option.legend().setBottom(20); | ||
175 | + option.legend().setData(new ArrayList<String>()); | ||
176 | + List<Object> content = new ArrayList<>(); | ||
177 | + content.add("#c23531"); | ||
178 | + content.add("#2f4554"); | ||
179 | + option.setColor(content); | ||
180 | + Pie pie = new Pie(); | ||
181 | + pie.setName("货位状态"); | ||
182 | + pie.setType(SeriesType.pie); | ||
183 | + pie.setRadius("55%"); | ||
184 | + pie.setCenter(new String[]{"40%","50%"}); | ||
185 | + Normal normal = new Normal(); | ||
186 | + normal.setFormatter("{b} \n {c} ({d}%)"); | ||
187 | + normal.setBarBorderColor("#eee"); | ||
188 | + normal.setBorderWidth(1); | ||
189 | + normal.setBorderRadius(4); | ||
190 | + pie.label().normal(normal); | ||
191 | + pie.itemStyle().emphasis().setShadowBlur(10); | ||
192 | + pie.itemStyle().emphasis().setShadowOffsetX(0); | ||
193 | + pie.itemStyle().emphasis().setShadowColor("rgba(0, 0, 0, 0.4)"); | ||
194 | + | ||
195 | + option.legend().data().add("有货"); | ||
196 | + pie.data().add(new ChartData("有货", Convert.toDouble(inStock))); | ||
197 | + | ||
198 | + option.legend().data().add("无货"); | ||
199 | + pie.data().add(new ChartData("无货", Convert.toDouble(locations.size()))); | ||
200 | + | ||
201 | + option.series(pie); | ||
202 | + String format = GsonUtil.format(option); | ||
203 | + return Result.ok(GsonUtil.format(option)); | ||
204 | + } | ||
205 | + | ||
206 | + @Override | ||
207 | + public Result<String> inventoryStatus() { | ||
208 | + Option option = new Option(); | ||
209 | + option.tooltip(Trigger.item).tooltip().formatter("{a} <br/>{b} : {c} ({d}%)"); | ||
210 | + option.legend().setOrient(Orient.vertical); | ||
211 | + option.legend().setRight(10); | ||
212 | + option.legend().setTop(20); | ||
213 | + option.legend().setBottom(10); | ||
214 | + option.legend().setData(new ArrayList<String>()); | ||
215 | + List<Object> content = new ArrayList<>(); | ||
216 | + content.add("#c23531"); | ||
217 | + content.add("#2f4554"); | ||
218 | + option.setColor(content); | ||
219 | + | ||
220 | + Pie pie = new Pie(); | ||
221 | + pie.setName("库存状态"); | ||
222 | + pie.setType(SeriesType.pie); | ||
223 | + pie.setRadius("70%"); | ||
224 | + pie.setCenter(new String[]{"40%","50%"}); | ||
225 | + Normal normal = new Normal(); | ||
226 | + normal.setFormatter("{b} \n {c} ({d}%)"); | ||
227 | + normal.setBarBorderColor("#eee"); | ||
228 | + normal.setBorderWidth(1); | ||
229 | + normal.setBorderRadius(4); | ||
230 | + pie.label().normal(normal); | ||
231 | + pie.itemStyle().emphasis().setShadowBlur(10); | ||
232 | + pie.itemStyle().emphasis().setShadowOffsetX(0); | ||
233 | + pie.itemStyle().emphasis().setShadowColor("rgba(0, 0, 0, 0.4)"); | ||
234 | + | ||
235 | + | ||
236 | + QueryWrapper<InventoryDetail> queryWrapper = new QueryWrapper<>(); | ||
237 | + queryWrapper.select("inventory_status ,SUM(qty) qty") | ||
238 | + .eq("warehouse_code", "CS0001").groupBy("inventory_status"); | ||
239 | + List<InventoryDetail> inventoryDetails = inventoryDetailServiceImpl.list(queryWrapper); | ||
240 | + | ||
241 | + | ||
242 | + LambdaQueryWrapper<SysDictItem> sysDictItemLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
243 | + sysDictItemLambdaQueryWrapper.select(SysDictItem::getItemText,SysDictItem::getItemValue); | ||
244 | + List<SysDictItem> sysDictItems = sysDictItemServiceImpl.list(sysDictItemLambdaQueryWrapper); | ||
245 | + List<String> collect = sysDictItems.stream().map(SysDictItem::getItemValue).collect(Collectors.toList()); | ||
246 | + Object[] objects = collect.toArray(); | ||
247 | + | ||
248 | + | ||
249 | + for(InventoryDetail inventoryDetail : inventoryDetails){ | ||
250 | + int i = ArrayUtil.indexOf(objects, inventoryDetail.getInventoryStatus()); | ||
251 | + ChartData chartData = new ChartData(); | ||
252 | + option.legend().getData().add(sysDictItems.get(i).getItemText()); | ||
253 | + chartData.setName(sysDictItems.get(i).getItemText()); | ||
254 | + chartData.setValue(Convert.toDouble(inventoryDetail.getQty())); | ||
255 | + pie.data().add(chartData); | ||
256 | + } | ||
257 | + option.series().add(pie); | ||
258 | + String format = GsonUtil.format(option); | ||
259 | + return Result.ok(GsonUtil.format(option)); | ||
260 | + } | ||
261 | + | ||
262 | + @Override | ||
263 | + public Result<String> inventoryOverview() { | ||
264 | + QueryWrapper<InventoryDetail> queryWrapper = new QueryWrapper<>(); | ||
265 | + queryWrapper.select("material_name, sum(qty) AS qty") | ||
266 | + .eq("warehouse_code", "CS0001").groupBy("material_name"); | ||
267 | + List<InventoryDetail> inventoryDetails = inventoryDetailServiceImpl.list(queryWrapper); | ||
268 | + Option option = new Option(); | ||
269 | + option.tooltip(Trigger.item).tooltip().formatter("{a} <br/>{b} : {c} ({d}%)"); | ||
270 | + option.legend().setOrient(Orient.vertical); | ||
271 | + option.legend().setRight(10); | ||
272 | + option.legend().setTop(10); | ||
273 | + option.legend().setBottom(10); | ||
274 | + option.legend().setData(new ArrayList<String>()); | ||
275 | + option.legend().setType(LegendType.scroll); | ||
276 | + List<Object> content = new ArrayList<>(); | ||
277 | + content.add("#c23531"); | ||
278 | + content.add("#2f4554"); | ||
279 | + option.setColor(content); | ||
280 | + Pie pie = new Pie(); | ||
281 | + pie.setName("库存"); | ||
282 | + pie.setType(SeriesType.pie); | ||
283 | + pie.setRadius("55%"); | ||
284 | + pie.setCenter(new String[]{"40%","50%"}); | ||
285 | + pie.itemStyle().emphasis().setShadowBlur(10); | ||
286 | + pie.itemStyle().emphasis().setShadowOffsetX(0); | ||
287 | + pie.itemStyle().emphasis().setShadowColor("rgba(0, 0, 0, 0.4)"); | ||
288 | + Normal normal = new Normal(); | ||
289 | + normal.setFormatter("{b} \n {c} ({d}%)"); | ||
290 | + normal.setBarBorderColor("#eee"); | ||
291 | + normal.setBorderWidth(1); | ||
292 | + normal.setBorderRadius(4); | ||
293 | + pie.label().normal(normal); | ||
294 | + | ||
295 | + int i = 0; | ||
296 | + Map<String, Boolean> map = new HashMap<>(); | ||
297 | + for(InventoryDetail inventory: inventoryDetails){ | ||
298 | + Object o1 = inventory.getMaterialName(); | ||
299 | + Object o2 = inventory.getQty(); | ||
300 | + option.legend().data().add(o1); | ||
301 | + pie.data().add(new ChartData(o1.toString(), Convert.toDouble(o2))); | ||
302 | + if(i<6){ | ||
303 | + map.put(o1.toString(),true); | ||
304 | + }else{ | ||
305 | + map.put(o1.toString(),false); | ||
306 | + } | ||
307 | + i++; | ||
308 | + } | ||
309 | + option.series(pie); | ||
310 | + option.legend().setSelected(map); | ||
311 | + String format = GsonUtil.format(option); | ||
312 | + return Result.ok(GsonUtil.format(option)); | ||
313 | + } | ||
314 | + | ||
315 | + @Override | ||
316 | + public Result getCommonData() { | ||
317 | + //昨天日期 | ||
318 | + String today = new SimpleDateFormat("yyyy-MM-dd").format(System.currentTimeMillis() - 1000 * 60 * 60 * 24).toString(); | ||
319 | + Map<String, Object> map = new HashMap<>(); | ||
320 | + | ||
321 | + //今天入库量 | ||
322 | + LambdaQueryWrapper<TaskDetail> taskDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
323 | + taskDetailLambdaQueryWrapper.select(TaskDetail::getTaskType,TaskDetail::getQty).gt(TaskDetail::getCreateTime,today); | ||
324 | + List<TaskDetail> taskDetails = taskDetailServiceImpl.list(taskDetailLambdaQueryWrapper); | ||
325 | + BigDecimal receiptQty = BigDecimal.ZERO; | ||
326 | + BigDecimal shipmentQty = BigDecimal.ZERO; | ||
327 | + | ||
328 | + for(TaskDetail taskDetail : taskDetails) | ||
329 | + { | ||
330 | + if (taskDetail.getTaskType().equals(QuantityConstant.TASK_TYPE_WHOLERECEIPT)) | ||
331 | + { | ||
332 | + receiptQty=receiptQty.add(taskDetail.getQty()); | ||
333 | + }else if (taskDetail.getTaskType().equals(QuantityConstant.TASK_TYPE_WHOLESHIPMENT)) | ||
334 | + { | ||
335 | + shipmentQty=shipmentQty.add(taskDetail.getQty()); | ||
336 | + } | ||
337 | + | ||
338 | + } | ||
339 | + map.put("receiptTotal",receiptQty); | ||
340 | + map.put("shipmentTotal",shipmentQty); | ||
341 | + //今日交易量 | ||
342 | + map.put("bllCount",receiptQty.add(shipmentQty)); | ||
343 | + | ||
344 | + | ||
345 | + //库存总数 | ||
346 | + LambdaQueryWrapper<InventoryHeader> inventoryHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
347 | + inventoryHeaderLambdaQueryWrapper.select(InventoryHeader::getTotalQty); | ||
348 | + List<InventoryHeader> inventoryHeaders = inventoryHeaderServiceImpl.list(inventoryHeaderLambdaQueryWrapper); | ||
349 | + BigDecimal inventoryQty = BigDecimal.ZERO; | ||
350 | + for(InventoryHeader inventoryHeader : inventoryHeaders) | ||
351 | + { | ||
352 | + inventoryQty=inventoryQty.add(inventoryHeader.getTotalQty()); | ||
353 | + } | ||
354 | + map.put("inventoryTotal",inventoryQty); | ||
355 | + | ||
356 | + | ||
357 | + //库内品数 | ||
358 | + LambdaQueryWrapper<InventoryDetail> inventoryDetailLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
359 | + inventoryDetailLambdaQueryWrapper.select(InventoryDetail::getId).groupBy(InventoryDetail::getInventoryStatus); | ||
360 | + List<InventoryDetail> inventoryDetails = inventoryDetailServiceImpl.list(inventoryDetailLambdaQueryWrapper); | ||
361 | + map.put("materialCount",inventoryDetails.size()); | ||
362 | + | ||
363 | + //待执行任务数 | ||
364 | + LambdaQueryWrapper<TaskHeader> taskHeaderLambdaQueryWrapper = Wrappers.lambdaQuery(); | ||
365 | + taskHeaderLambdaQueryWrapper.ge(TaskHeader::getStatus,QuantityConstant.TASK_STATUS_RELEASE) | ||
366 | + .lt(TaskHeader::getStatus,QuantityConstant.TASK_STATUS_COMPLETED); | ||
367 | + List<TaskHeader> taskHeaders = taskHeaderService.list(taskHeaderLambdaQueryWrapper); | ||
368 | + map.put("taskUncompletedTotal",taskHeaders.size()); | ||
369 | + | ||
370 | + return Result.ok(map); | ||
371 | + } | ||
372 | + | ||
373 | + | ||
374 | +} |