package com.zy.asrs.openapi.task; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.alibaba.fastjson.support.config.FastJsonConfig; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.zy.asrs.common.domain.dto.ReportStockDto; import com.zy.asrs.common.domain.enums.ApiType; import com.zy.asrs.common.domain.enums.OrderSettleType; import com.zy.asrs.common.openapi.entity.ApiList; import com.zy.asrs.common.openapi.entity.HostKey; import com.zy.asrs.common.openapi.service.ApiListService; import com.zy.asrs.common.openapi.service.HostKeyService; import com.zy.asrs.common.utils.HttpHandler; import com.zy.asrs.common.wms.entity.Order; import com.zy.asrs.common.wms.entity.OrderDetl; import com.zy.asrs.common.wms.service.LocDetlService; import com.zy.asrs.common.wms.service.OrderDetlService; import com.zy.asrs.common.wms.service.OrderService; import org.apache.commons.codec.digest.DigestUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; @Component public class ReportApiScheduler { @Autowired private ApiListService apiListService; @Autowired private OrderService orderService; @Autowired private OrderDetlService orderDetlService; @Autowired private HostKeyService hostKeyService; @Autowired private LocDetlService locDetlService; @Scheduled(cron = "0/3 * * * * ? ") public void orderComplete() { //订单完成上报 //获取已完成订单 List list = orderService.list(new LambdaQueryWrapper() .eq(Order::getSettle, OrderSettleType.COMPLETE.id)); for (Order order : list) { //查询是否需要上报 ApiList apiList = apiListService.getOne(new LambdaQueryWrapper() .eq(ApiList::getType, ApiType.ORDER_COMPLETE.type) .eq(ApiList::getStatus, 1) .eq(ApiList::getHostId,order.getHostId())); if (apiList == null) { continue; } //获取订单明细 List orderDetls = orderDetlService.list(new LambdaQueryWrapper() .eq(OrderDetl::getOrderId, order.getId())); //封装数据 HashMap data = new HashMap<>(); data.put("order", order); data.put("orderDetls", orderDetls); getSign(data, order.getHostId());//获取签名 try { String response = new HttpHandler.Builder() .setUri(apiList.getUrl()) .setJson(JSON.toJSONString(data)) .build() .doPost(); JSONObject result = JSON.parseObject(response); if (result.getOrDefault("code", 0).equals(200)) { order.setSettle(OrderSettleType.REPORT_COMPLETE.id.longValue()); order.setUpdateTime(new Date()); orderService.updateById(order);//更新订单状态 } } catch (Exception e) { e.printStackTrace(); } } } @Scheduled(cron = "0/3 * * * * ? ") public void orderCancel() { //订单取消上报 //获取已取消订单 List list = orderService.list(new LambdaQueryWrapper() .eq(Order::getSettle, OrderSettleType.CANCEL.id)); for (Order order : list) { //查询是否需要上报 ApiList apiList = apiListService.getOne(new LambdaQueryWrapper() .eq(ApiList::getType, ApiType.ORDER_CANCEL.type) .eq(ApiList::getStatus, 1) .eq(ApiList::getHostId,order.getHostId())); if (apiList == null) { continue; } //获取订单明细 List orderDetls = orderDetlService.list(new LambdaQueryWrapper() .eq(OrderDetl::getOrderId, order.getId())); //封装数据 HashMap data = new HashMap<>(); data.put("order", order); data.put("orderDetls", orderDetls); getSign(data, order.getHostId());//获取签名 try { String response = new HttpHandler.Builder() .setUri(apiList.getUrl()) .setJson(JSON.toJSONString(data)) .build() .doPost(); JSONObject result = JSON.parseObject(response); if (result.getOrDefault("code", 0).equals(200)) { order.setSettle(OrderSettleType.REPORT_COMPLETE.id.longValue()); order.setUpdateTime(new Date()); orderService.updateById(order);//更新订单状态 } } catch (Exception e) { e.printStackTrace(); } } } @Scheduled(cron = "* 30 23 * * ? ") public void reportStock() { //库存上报 //每天晚上11点半执行 //查询是否需要上报 List list = apiListService.list(new LambdaQueryWrapper() .eq(ApiList::getType, ApiType.REPORT_STOCK.type) .eq(ApiList::getStatus, 1)); for (ApiList apiList : list) { List reportStockDto = locDetlService.getReportStockDto(apiList.getHostId()); //封装数据 HashMap data = new HashMap<>(); data.put("stock", reportStockDto); getSign(data, apiList.getHostId());//获取签名 //保留null值 FastJsonConfig fastJsonConfig = new FastJsonConfig(); fastJsonConfig.setSerializerFeatures(SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullListAsEmpty, SerializerFeature.WriteNullStringAsEmpty); String paramData = JSON.toJSONString(data, fastJsonConfig.getSerializeConfig(), fastJsonConfig.getSerializerFeatures()); try { String response = new HttpHandler.Builder() .setUri(apiList.getUrl()) .setJson(JSON.toJSONString(paramData)) .build() .doPost(); JSONObject result = JSON.parseObject(response); if (result.getOrDefault("code", 0).equals(200)) { } } catch (Exception e) { e.printStackTrace(); } } } //获取签名 public String getSign(HashMap data, Long hostId) { HostKey hostKey = hostKeyService.getOne(new LambdaQueryWrapper() .eq(HostKey::getHostId, hostId)); if (hostKey == null) { return null; } if (hostKey.getSignStatus() == 0) {//没有开启签名 return null; } //创建自然排序map JSONObject param = new JSONObject(true); for (Map.Entry entry : data.entrySet()) { if (!entry.getKey().equals("sign")) {//剔除sign param.put(entry.getKey(), entry.getValue()); } } param.put("signKey", hostKey.getSignKey()); String md5Hex = DigestUtils.md5Hex(param.toJSONString()); data.put("sign", md5Hex); return md5Hex; } }