From 9691382d22efb241056177f92cd22040e3224303 Mon Sep 17 00:00:00 2001 From: skyouc Date: 星期四, 14 八月 2025 11:21:45 +0800 Subject: [PATCH] no message --- rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java | 11 + rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTransItemDto.java | 34 +++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java | 74 +++++++++++ rsf-server/src/main/Test/ChineseMD5Util.java | 78 +++++++++---- rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java | 4 rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java | 20 +++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTrandDto.java | 24 ++++ rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml | 31 +++++ rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java | 15 ++ rsf-admin/.env | 2 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/DashboardDto.java | 39 ++++++ 11 files changed, 304 insertions(+), 28 deletions(-) diff --git a/rsf-admin/.env b/rsf-admin/.env index f793907..a3c69b2 100644 --- a/rsf-admin/.env +++ b/rsf-admin/.env @@ -1,3 +1,3 @@ -VITE_BASE_IP=192.168.4.151 +VITE_BASE_IP=127.0.0.1 # VITE_BASE_IP=47.76.147.249 VITE_BASE_PORT=8080 diff --git a/rsf-server/src/main/Test/ChineseMD5Util.java b/rsf-server/src/main/Test/ChineseMD5Util.java index c73e2d3..0c71353 100644 --- a/rsf-server/src/main/Test/ChineseMD5Util.java +++ b/rsf-server/src/main/Test/ChineseMD5Util.java @@ -1,38 +1,68 @@ import java.nio.charset.StandardCharsets; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; +import java.time.LocalDate; +import java.time.YearMonth; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.IntStream; public class ChineseMD5Util { - public static List<Integer> getSelectedIndices(int[] arr) { - List<Integer> indices = new ArrayList<>(); - int index = 0; - int step = 3; - while (index < arr.length) { - indices.add(index); - index += step; - step = (step == 3) ? 1 : 3; - } - return indices; - } +// public static List<Integer> getSelectedIndices(int[] arr) { +// List<Integer> indices = new ArrayList<>(); +// int index = 0; +// int step = 3; +// while (index < arr.length) { +// indices.add(index); +// index += step; +// step = (step == 3) ? 1 : 3; +// } +// return indices; +// } +// +// public static Integer getNextSelectedValue(int[] arr, int inputIndex) { +// List<Integer> selectedIndices = getSelectedIndices(arr); +// int currentPos = selectedIndices.indexOf(inputIndex); +// if (currentPos != -1 && currentPos + 1 < selectedIndices.size()) { +// return arr[selectedIndices.get(currentPos + 1)]; +// } +// return null; // 鎴栨寜闇�澶勭悊 +// } +// +// public static void main(String[] args) { +// int[] arr = {2, 5, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 15, 40, 32, 48}; +// System.out.println("杈撳叆 0锛岃緭鍑�: " + getNextSelectedValue(arr, 0)); // 10 +// System.out.println("杈撳叆 3锛岃緭鍑�: " + getNextSelectedValue(arr, 3)); // 15 +// System.out.println("杈撳叆 4锛岃緭鍑�: " + getNextSelectedValue(arr, 4)); // 30 +// System.out.println("杈撳叆 4锛岃緭鍑�: " + getNextSelectedValue(arr, 5)); // 30 +// +// } - public static Integer getNextSelectedValue(int[] arr, int inputIndex) { - List<Integer> selectedIndices = getSelectedIndices(arr); - int currentPos = selectedIndices.indexOf(inputIndex); - if (currentPos != -1 && currentPos + 1 < selectedIndices.size()) { - return arr[selectedIndices.get(currentPos + 1)]; - } - return null; // 鎴栨寜闇�澶勭悊 + + public static List<String> getFormattedDatesOfPreviousMonth(String pattern) { +// DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); +// YearMonth previousMonth = YearMonth.now().minusMonths(1); +// +// return IntStream.rangeClosed(1, previousMonth.lengthOfMonth()) +// .mapToObj(day -> previousMonth.atDay(day).format(formatter)) +// .collect(Collectors.toList()); + LocalDate today = LocalDate.now().minusDays(1); + LocalDate oneMonthAgo = today.minusMonths(1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + return IntStream.iterate(0, i -> i + 1) + .limit(ChronoUnit.DAYS.between(oneMonthAgo, today) + 1) + .mapToObj(oneMonthAgo::plusDays) + .map(date -> date.format(formatter)) + .collect(Collectors.toList()); } public static void main(String[] args) { - int[] arr = {2, 5, 8, 10, 15, 20, 25, 30, 35, 40, 45, 50, 15, 40, 32, 48}; - System.out.println("杈撳叆 0锛岃緭鍑�: " + getNextSelectedValue(arr, 0)); // 10 - System.out.println("杈撳叆 3锛岃緭鍑�: " + getNextSelectedValue(arr, 3)); // 15 - System.out.println("杈撳叆 4锛岃緭鍑�: " + getNextSelectedValue(arr, 4)); // 30 - System.out.println("杈撳叆 4锛岃緭鍑�: " + getNextSelectedValue(arr, 5)); // 30 - + List<String> formattedDates = getFormattedDatesOfPreviousMonth("yyyy-MM-dd"); + formattedDates.forEach(System.out::println); } + } \ No newline at end of file diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java index ff3c883..38d4e4d 100755 --- a/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/utils/DateUtils.java @@ -6,7 +6,10 @@ import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.stream.Collectors; +import java.util.stream.IntStream; /** * 鏃ユ湡鏃堕棿宸ュ叿绫� @@ -232,6 +235,23 @@ } /** + * 鑾峰彇鍓�30澶╂墍鏈夋棩鏈� + * @param pattern + * @return + */ + public static List<String> getLastMonthDays(String pattern) { + LocalDate today = LocalDate.now().minusDays(1); + LocalDate oneMonthAgo = today.minusMonths(1); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern(pattern); + return IntStream.iterate(0, i -> i + 1) + .limit(ChronoUnit.DAYS.between(oneMonthAgo, today) + 1) + .mapToObj(oneMonthAgo::plusDays) + .map(date -> date.format(formatter)) + .collect(Collectors.toList()); + } + + + /** * 鏃ユ湡鍨嬪瓧绗︿覆杞寲涓烘棩鏈� 鏍煎紡 * { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm", diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java index 9be475a..8ed1ab3 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderController.java @@ -60,6 +60,21 @@ return R.ok().add(asnOrderService.page(pageParam, queryWrapper)); } + @ApiOperation("鑾峰彇棣栭〉琛ㄥご鏁版嵁") + @PostMapping("/asnOrder/dashbord/header") + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + public R getDashbord() { + return R.ok().add(asnOrderService.getDashbord()); + } + + @ApiOperation("鑾峰彇鍑哄叆搴撹秼鍔垮浘") + @PostMapping("/asnOrder/stock/trand") + @PreAuthorize("hasAuthority('manager:asnOrder:list')") + public R getStockTrand() { + return R.ok().add(asnOrderService.getStockTrand()); + } + + @PreAuthorize("hasAuthority('manager:asnOrder:list')") @PostMapping("/asnOrder/list") public R list(@RequestBody Map<String, Object> map) { diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/DashboardDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/DashboardDto.java new file mode 100644 index 0000000..029fe5e --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/DashboardDto.java @@ -0,0 +1,39 @@ +package com.vincent.rsf.server.manager.controller.dto; + +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiModel; +import lombok.experimental.Accessors; +import lombok.Data; + +@Data +@Accessors(chain = true) +@ApiModel(value = "DashboardDto", description = "棣栭〉琛ㄥご鏁版嵁") +public class DashboardDto { + + @ApiModelProperty("寰呭叆搴撴暟閲�") + private Integer inAnf; + + @ApiModelProperty("寰呭嚭搴撴暟閲�") + private Integer outAnf; + + @ApiModelProperty("瀹為檯鍏ュ簱鏁伴噺") + private Integer taskIn; + + @ApiModelProperty("瀹為檯鍑哄簱鏁伴噺") + private Integer taskOut; + + @ApiModelProperty("鎬诲叆搴撴暟閲�") + private Integer totalIn; + + @ApiModelProperty("鎬诲嚭搴撴暟閲�") + private Integer totalOut; + + @ApiModelProperty("浠诲姟鎵ц鏁伴噺") + private Integer taskQty; + + private Integer anfme; + + private Integer realAnfme; + + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTrandDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTrandDto.java new file mode 100644 index 0000000..417ae00 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTrandDto.java @@ -0,0 +1,24 @@ +package com.vincent.rsf.server.manager.controller.dto; + + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import lombok.experimental.Accessors; +import lombok.Data; + +import java.util.List; + +@Data +@Accessors(chain = true) +@ApiModel(value = "StockTrandDto", description = "鍑哄叆搴撹秼鍔垮浘") +public class StockTrandDto { + + List<StockTransItemDto> trandItem; + + @ApiModelProperty("鏈�澶ф鏁�") + Integer maxQty; + + @ApiModelProperty("鏈�澶ф暟閲�") + Integer maxAnfme; + +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTransItemDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTransItemDto.java new file mode 100644 index 0000000..71b9a99 --- /dev/null +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/StockTransItemDto.java @@ -0,0 +1,34 @@ +package com.vincent.rsf.server.manager.controller.dto; + + +import io.swagger.annotations.ApiModelProperty; +import io.swagger.annotations.ApiModel; +import lombok.experimental.Accessors; +import lombok.Data; + +import java.io.Serializable; +import java.util.Date; + +@Data +@Accessors(chain = true) +@ApiModel(value = "StockTransItemDto", description = "搴撳瓨瓒嬪娍鍥�") +public class StockTransItemDto implements Serializable { + + @ApiModelProperty("鍏ュ簱鏁伴噺") + private Integer inAnfme; + + @ApiModelProperty("鍑哄簱鏁伴噺") + private Integer outAnfme; + + @ApiModelProperty("鍗曟嵁鏃堕棿") + private String orderTime; + + @ApiModelProperty("鍏ュ簱鏁伴噺") + private Integer inQty; + + @ApiModelProperty("鍑哄簱鏁伴噺") + private Integer outQty; + + @ApiModelProperty("浠诲姟绫诲瀷") + private Integer taskType; +} diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java index 26f2ad2..1b0f90e 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/AsnOrderMapper.java @@ -1,12 +1,23 @@ package com.vincent.rsf.server.manager.mapper; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Constants; +import com.vincent.rsf.server.manager.controller.dto.DashboardDto; +import com.vincent.rsf.server.manager.controller.dto.StockTransItemDto; +import com.vincent.rsf.server.manager.entity.StockStatistic; import com.vincent.rsf.server.manager.entity.WkOrder; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import org.springframework.stereotype.Repository; + +import java.util.List; @Mapper @Repository public interface AsnOrderMapper extends BaseMapper<WkOrder> { + DashboardDto getDashbord(@Param("type") String type, @Param("taskType") String taskType); + + List<StockTransItemDto> getStockTrand(@Param(Constants.WRAPPER) LambdaQueryWrapper<StockStatistic> queryWrapper); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java index 641902a..70a771e 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/AsnOrderService.java @@ -28,4 +28,8 @@ R createByPo(Map<String, Object> params); R removeOrders(List<Long> list); + + R getDashbord(); + + R getStockTrand(); } diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java index 626d2d4..ee6b2e7 100644 --- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java +++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java @@ -9,11 +9,14 @@ import com.vincent.rsf.server.api.entity.dto.PoItemsDto; import com.vincent.rsf.server.api.service.ReceiveMsgService; import com.vincent.rsf.server.api.service.ReportMsgService; +import com.vincent.rsf.server.common.utils.DateUtils; +import com.vincent.rsf.server.manager.controller.dto.DashboardDto; +import com.vincent.rsf.server.manager.controller.dto.StockTrandDto; +import com.vincent.rsf.server.manager.controller.dto.StockTransItemDto; import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams; import com.vincent.rsf.server.manager.controller.params.BatchUpdateParam; import com.vincent.rsf.server.manager.entity.*; -import com.vincent.rsf.server.manager.enums.AsnExceStatus; -import com.vincent.rsf.server.manager.enums.POExceStatus; +import com.vincent.rsf.server.manager.enums.*; import com.vincent.rsf.server.manager.mapper.AsnOrderMapper; import com.vincent.rsf.server.manager.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -27,6 +30,9 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; +import java.text.DateFormat; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; import java.util.*; import java.util.stream.Collectors; @@ -59,6 +65,10 @@ private PurchaseService purchaseService; @Autowired private PurchaseItemService purchaseItemService; + @Autowired + private AsnOrderService asnOrderService; + @Autowired + private TaskService taskService; @Override public boolean notifyInspect(List<WkOrder> orders) { @@ -392,7 +402,6 @@ throw new CoolException("浠诲姟涓崟鎹笉鍙垹闄わ紒锛�"); } - if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>() .in(WkOrderItem::getOrderId, ids))) { // throw new CoolException("Details Delete Fail"); @@ -402,6 +411,65 @@ } /** + * 鑾峰彇棣栭〉琛ㄥご鏁版嵁 + * @return + */ + @Override + public R getDashbord() { + DashboardDto dto = new DashboardDto(); + //鑾峰彇鍏ュ簱鏁伴噺 + DashboardDto trandDto = this.baseMapper.getDashbord(OrderType.ORDER_IN.type, TaskType.TASK_TYPE_IN.type + ""); + dto.setInAnf(trandDto.getAnfme()).setTaskIn(trandDto.getRealAnfme()).setTotalIn(trandDto.getAnfme() + trandDto.getRealAnfme()); + + //鑾峰彇鍑哄簱鍗曟暟閲� + DashboardDto outTrand = this.baseMapper.getDashbord(OrderType.ORDER_OUT.type, TaskType.TASK_TYPE_OUT.type + ""); + dto.setOutAnf(outTrand.getAnfme()).setTaskOut(outTrand.getRealAnfme()).setTotalOut(outTrand.getAnfme() + outTrand.getRealAnfme()); + + //鑾峰彇鎵ц涓换鍔℃暟閲� + List<Task> tasks = taskService.list(new LambdaQueryWrapper<>()); + if (!tasks.isEmpty()) { + outTrand.setTaskQty(tasks.size()); + } + return R.ok().add(dto); + } + + /** + * 鑾峰彇鍑哄叆搴撹秼鍔� + * @return + */ + @Override + public R getStockTrand() { + List<String> days = DateUtils.getLastMonthDays("yyyy-MM-dd"); + LambdaQueryWrapper<StockStatistic> queryWrapper = new LambdaQueryWrapper<StockStatistic>() + .in(StockStatistic::getTaskType, Arrays.asList(TaskType.TASK_TYPE_IN.type, TaskType.TASK_TYPE_OUT.type)); + List<StockTransItemDto> items = this.baseMapper.getStockTrand(queryWrapper); + if (items.isEmpty()) { + return R.ok(); + } + List<StockTransItemDto> stockDtos = new ArrayList<>(); + days.forEach(day -> { + StockTransItemDto itemDto = new StockTransItemDto(); + itemDto.setInQty(0).setOutQty(0).setOutAnfme(0).setOutAnfme(0); + items.forEach(item -> { + if (item.getOrderTime().equals(day)) { + BeanUtils.copyProperties(item, itemDto); + } + }); + itemDto.setOrderTime(day); + stockDtos.add(itemDto); + }); + + //鑾峰彇鏈�澶у�� + Optional<Integer> max = stockDtos.stream().map(StockTransItemDto::getInQty).filter(Objects::nonNull).max(Comparator.naturalOrder()); + Optional<Integer> maxOut = stockDtos.stream().map(StockTransItemDto::getOutQty).filter(Objects::nonNull).max(Comparator.naturalOrder()); + int maxed = Math.max(max.orElse(Integer.MIN_VALUE), maxOut.orElse(Integer.MIN_VALUE)); + + StockTrandDto trandDto = new StockTrandDto(); + trandDto.setMaxQty(maxed).setTrandItem(stockDtos); + return R.ok().add(trandDto); + } + + /** * @param * @return * @author Ryan diff --git a/rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml b/rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml index fac628a..d839a40 100644 --- a/rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml +++ b/rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml @@ -1,5 +1,36 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.vincent.rsf.server.manager.mapper.AsnOrderMapper"> + <select id="getDashbord" resultType="com.vincent.rsf.server.manager.controller.dto.DashboardDto"> + SELECT + ( SELECT COUNT( 1 ) FROM man_asn_order WHERE DATE(create_time) = CURRENT_DATE() AND `type` = #{type} ) AS anfme, + COUNT( id ) AS real_anfme + FROM + man_task_log + WHERE + DATE(create_time) = CURRENT_DATE() + AND task_type = #{taskType} + </select> + <select id="getStockTrand" resultType="com.vincent.rsf.server.manager.controller.dto.StockTransItemDto"> + SELECT * FROM + ( + SELECT + id, + IF ( task_type = 1, COUNT( 1 ), 0 ) AS in_qty, + IF ( task_type = 1, SUM( anfme ), 0 ) AS in_anfme, + IF ( task_type = 101, SUM( anfme ), 0 ) AS out_anfme, + IF ( task_type = 101, COUNT( 1 ), 0 ) AS out_qty, + task_type, + day_time AS order_time + FROM + view_stock_statistic + WHERE + `day_time` BETWEEN ( CURDATE() - INTERVAL 1 MONTH ) + AND CURDATE() + GROUP BY + `day_time`, task_type + ) t + ${ew.customSqlSegment} + </select> </mapper> -- Gitblit v1.9.1