diff --git a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java index 8e3299a93..84d9a84bf 100644 --- a/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java +++ b/jeecg-boot-base-core/src/main/java/org/jeecg/common/constant/CommonConstant.java @@ -323,7 +323,7 @@ public interface CommonConstant { String X_MiniFlowExclusionFieldMode = "X-Miniflowexclusionfieldmode"; /**===============================================================================================*/ - String TOKEN_IS_INVALID_MSG = "Token失效,请重新登录!"; + String TOKEN_IS_INVALID_MSG = "Your session has expired, please log in again"; String X_FORWARDED_SCHEME = "X-Forwarded-Scheme"; diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java index 42130a11f..54bcdf08a 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/PurchaseOrderController.java @@ -79,6 +79,8 @@ public class PurchaseOrderController { @Autowired private IShippingInvoiceService shippingInvoiceService; @Autowired private IProviderMabangService providerMabangService; + @Autowired + private IPlatformOrderMabangService platformOrderMabangService; private static final Integer DEFAULT_NUMBER_OF_THREADS = 2; private static final Integer MABANG_API_RATE_LIMIT_PER_MINUTE = 10; @@ -625,7 +627,7 @@ public class PurchaseOrderController { } else { log.info("Updating order erp status to 2 in Mabang"); List platformOrderIds = platformOrderService.getPlatformOrderIdsByInvoiceNumbers(invoiceNumbers); - Response, List> updateResponse = providerMabangService.updateOrderStatusToPreparing(platformOrderIds); + Response, List> updateResponse = platformOrderMabangService.updateOrderStatusToPreparing(platformOrderIds); Responses updateOrderStatusResponse = new Responses(); if(updateResponse.getStatus() == HttpStatus.SC_INTERNAL_SERVER_ERROR) { String errMsg = updateResponse.getError().get(0).getReason(); @@ -634,10 +636,10 @@ public class PurchaseOrderController { } else { List updateOrderStatusSuccess = updateResponse.getData().stream() - .map(UpdateResult::getPlatformOrderId) + .map(UpdateResult::getPlatformOrderNumber) .collect(Collectors.toList()); List updateOrderStatusFailure = updateResponse.getError().stream() - .map(UpdateResult::getPlatformOrderId) + .map(UpdateResult::getPlatformOrderNumber) .collect(Collectors.toList()); log.info("Update order errors : {}", updateResponse.getError()); updateOrderStatusResponse.getSuccesses().addAll(updateOrderStatusSuccess); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java index 5ec9a222c..bc42b7c8f 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/SkuController.java @@ -4,7 +4,6 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.google.common.base.CaseFormat; -import com.google.common.collect.Lists; import freemarker.template.Template; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -15,12 +14,7 @@ import org.jeecg.common.aspect.annotation.AutoLog; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.common.util.oConvertUtils; -import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuData; -import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuListRawStream; -import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuListRequestBody; -import org.jeecg.modules.business.domain.api.mabang.doSearchSkuListNew.SkuUpdateListStream; import org.jeecg.modules.business.entity.*; -import org.jeecg.modules.business.model.SkuDocument; import org.jeecg.modules.business.mongoService.SkuMongoService; import org.jeecg.modules.business.service.*; import org.jeecg.modules.business.vo.*; @@ -622,70 +616,11 @@ public class SkuController { public Result compareClientSkuWithMabang(@RequestParam(name="clientId") String clientId, @RequestParam(name="erpStatuses[]") List erpStatuses) { Map clientSkus = skuService.listInUninvoicedOrders(clientId, erpStatuses); - List skuIds = new ArrayList<>(clientSkus.keySet()); - List clientSkuDocs = new ArrayList<>(); - for(String skuId: skuIds) { - List skus = skuMongoService.findBySkuId(skuId); - if(skus.isEmpty()) { - skuMongoService.migrateOneSku(clientSkus.get(skuId)); - skus = skuMongoService.findBySkuId(skuId); - } - SkuDocument sku = skus.get(0); - clientSkuDocs.add(sku); - } - - List> erpCodePartition = Lists.partition(clientSkuDocs, 50) - .stream() - .map(skus -> skus.stream().map(SkuDocument::getErpCode).collect(Collectors.toList())) - .collect(Collectors.toList()); - List skusFromMabang = new ArrayList<>(); - for(List partition : erpCodePartition) { - SkuListRequestBody body = new SkuListRequestBody(); - body.setStockSkuList(String.join(",", partition)); - SkuListRawStream rawStream = new SkuListRawStream(body); - SkuUpdateListStream stream = new SkuUpdateListStream(rawStream); - skusFromMabang.addAll(stream.all()); - } - List desyncedSkus = new ArrayList<>(); - List syncedSkus = new ArrayList<>(); - for(SkuDocument sku : clientSkuDocs) { - SkuData skuData = skusFromMabang.stream().filter(s -> s.getErpCode().equals(sku.getErpCode())) - .findFirst().orElse(null); - if(skuData != null) { - boolean isDesynced = false; - BigDecimal mabangPrice = skuData.getSalePrice().setScale(2, RoundingMode.HALF_UP); // because price from mabang has 4 decimal places, so Objects.equals will always return false - if(skuData.getWeight() == null && sku.getLatestSkuWeight() != null) { - log.info("sku {} doesn't have a weight on Mabang but has one in Mongo", skuData.getErpCode()); - isDesynced = true; - } - if (sku.getLatestSkuWeight() != null && !Objects.equals(skuData.getWeight(), sku.getLatestSkuWeight().getWeight())) { - log.info("sku {} has a different weight on Mabang and in Mongo : mabang :{}; mongo :{}", skuData.getErpCode() ,skuData.getWeight(), sku.getLatestSkuWeight().getWeight()); - isDesynced = true; - } - if(skuData.getSalePrice() == null && sku.getLatestSkuPrice() != null) { - log.info("sku {} doesn't have a price on Mabang but has one in mongo", skuData.getErpCode()); - isDesynced = true; - } - if(sku.getLatestSkuPrice() != null && !Objects.equals(mabangPrice, sku.getLatestSkuPrice().getPrice())) { - log.info("sku {} has a different price on Mabang and in Mongo : mabang :{}; mongo :{}", skuData.getErpCode() ,skuData.getSalePrice(), sku.getLatestSkuPrice().getPrice()); - isDesynced = true; - } - if(isDesynced) - desyncedSkus.add(skuData.getErpCode()); - else - syncedSkus.add(skuData.getErpCode()); - } else { - desyncedSkus.add(sku.getErpCode()); - } - } - if(!desyncedSkus.isEmpty()) { - log.info("Desynced skus : {}", desyncedSkus); - skuService.setIsSynced(desyncedSkus, false); - } - if(!syncedSkus.isEmpty()) { - log.info("Synced skus : {}", syncedSkus); - skuService.setIsSynced(syncedSkus, true); + if(clientSkus.isEmpty()) { + log.info("No skus to compare"); + return Result.OK(); } + skuListMabangService.compareClientSkusWithMabang(clientSkus); return Result.OK(); } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java index d2da89780..9f8bd3508 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/controller/admin/shippingInvoice/InvoiceController.java @@ -15,7 +15,6 @@ import org.jeecg.common.api.vo.Result; import org.jeecg.common.system.query.QueryGenerator; import org.jeecg.common.system.vo.LoginUser; import org.jeecg.modules.business.controller.UserException; -import org.jeecg.modules.business.domain.api.mabang.getorderlist.OrderStatus; import org.jeecg.modules.business.domain.purchase.invoice.PurchaseInvoiceEntry; import org.jeecg.modules.business.entity.*; import org.jeecg.modules.business.mapper.ExchangeRatesMapper; @@ -54,6 +53,7 @@ import java.util.stream.Collectors; import static org.jeecg.common.util.SqlInjectionUtil.specialFilterContentForDictSql; import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; +import static org.jeecg.modules.business.entity.Invoice.InvoicingMethod.*; import static org.jeecg.modules.business.entity.Task.TaskCode.SI_G; import static org.jeecg.modules.business.entity.TaskHistory.TaskStatus.*; import static org.jeecg.modules.business.vo.PlatformOrderFront.*; @@ -117,6 +117,8 @@ public class InvoiceController { @Autowired private ICreditService creditService; @Autowired + private IPlatformOrderMabangService platformOrderMabangService; + @Autowired Environment env; @Value("${jeecg.path.shippingInvoiceDir}") @@ -246,10 +248,20 @@ public class InvoiceController { @PostMapping(value = "/makeComplete") public Result makeCompleteShippingInvoice(@RequestBody ShippingInvoiceParam param) { try { - String method = param.getErpStatuses().toString().equals("[3]") ? "post" : param.getErpStatuses().toString().equals("[1, 2]") ? "pre-shipping" : "all"; + JSONObject response = new JSONObject(); + + String method = param.getErpStatuses().toString().equals("[3]") ? POSTSHIPPING.getMethod() : param.getErpStatuses().toString().equals("[1, 2]") ? PRESHIPPING.getMethod() : ALL.getMethod(); InvoiceMetaData metaData = shippingInvoiceService.makeCompleteInvoicePostShipping(param, method); balanceService.updateBalance(param.clientID(), metaData.getInvoiceCode(), COMPLETE.name()); - return Result.OK(metaData); + + if(method.equals(PRESHIPPING.getMethod())) { + ResponsesWithMsg mabangResponses = platformOrderMabangService.editOrdersRemark(metaData.getInvoiceCode()); + response.put("metaData", metaData); + response.put("mabangResponses", mabangResponses); + return Result.OK(response); + } + response.put("metaData", metaData); + return Result.OK(response); } catch (UserException e) { return Result.error(e.getMessage()); } catch (IOException | ParseException e) { @@ -320,6 +332,7 @@ public class InvoiceController { public Result makeManualPurchaseInvoice(@RequestBody ShippingInvoiceOrderParam param) { InvoiceMetaData metaData; try { + JSONObject response = new JSONObject(); List skuQuantities = skuService.getSkuQuantitiesFromOrderIds(param.orderIds()); if(skuQuantities.isEmpty()) { return Result.error("Nothing to invoice."); @@ -353,7 +366,14 @@ public class InvoiceController { emailService.sendSimpleMessage(destEmail, subject, htmlBody, session); log.info("Mail sent successfully"); } - return Result.OK(metaData); + if(param.getType().equals(PRESHIPPING.getMethod())) { + ResponsesWithMsg mabangResponses = platformOrderMabangService.editOrdersRemark(metaData.getInvoiceCode()); + response.put("metaData", metaData); + response.put("mabangResponses", mabangResponses); + return Result.OK(response); + } + response.put("metaData", metaData); + return Result.OK(response); } catch (UserException e) { return Result.error(e.getMessage()); } catch (IOException e) { @@ -376,6 +396,7 @@ public class InvoiceController { @PostMapping(value = "/makeManualComplete") public Result makeManualCompleteInvoice(@RequestBody ShippingInvoiceOrderParam param) { try { + JSONObject response = new JSONObject(); InvoiceMetaData metaData = shippingInvoiceService.makeCompleteInvoice(param); String clientCategory = clientCategoryService.getClientCategoryByClientId(param.clientID()); if(clientCategory.equals(ClientCategory.CategoryName.CONFIRMED.getName()) || clientCategory.equals(ClientCategory.CategoryName.VIP.getName())) { @@ -402,7 +423,14 @@ public class InvoiceController { emailService.sendSimpleMessage(destEmail, subject, htmlBody, session); log.info("Mail sent successfully"); } - return Result.OK(metaData); + if(param.getType().equals(PRESHIPPING.getMethod())) { + ResponsesWithMsg mabangResponses = platformOrderMabangService.editOrdersRemark(metaData.getInvoiceCode()); + response.put("metaData", metaData); + response.put("mabangResponses", mabangResponses); + return Result.OK(response); + } + response.put("metaData", metaData); + return Result.OK(response); } catch (UserException e) { return Result.error(e.getMessage()); } catch (IOException | ParseException e) { diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderResponse.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderResponse.java index d0801180b..4f450e3f4 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderResponse.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/ChangeOrderResponse.java @@ -2,20 +2,24 @@ package org.jeecg.modules.business.domain.api.mabang.dochangeorder; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import lombok.Getter; import org.jeecg.modules.business.domain.api.mabang.Response; +@Getter public class ChangeOrderResponse extends Response { private final String message; /** * Erp order number */ private final String orderId; + private final String platformOrderId; - private ChangeOrderResponse(Code status, String message, String orderId) { + private ChangeOrderResponse(Code status, String message, String orderId, String platformOrderId) { super(status); this.message = message; this.orderId = orderId; + this.platformOrderId = platformOrderId; } public static ChangeOrderResponse parse(String json) { @@ -25,25 +29,19 @@ public class ChangeOrderResponse extends Response { if (code.equals("200")) { JSONObject data = jsonObject.getJSONObject("data"); String orderId = data.getString("orderId"); - return new ChangeOrderResponse(Code.SUCCESS, message, orderId); + String platformOrderId = data.getString("platformOrderId"); + return new ChangeOrderResponse(Code.SUCCESS, message, orderId, platformOrderId); } else { - return new ChangeOrderResponse(Code.ERROR, message, null); + return new ChangeOrderResponse(Code.ERROR, message, null, null); } } - public String getMessage() { - return message; - } - - public String getOrderId() { - return orderId; - } - @Override public String toString() { return "ChangeOrderResponse{" + "message='" + message + '\'' + ", orderId='" + orderId + '\'' + + ", platformOrderId='" + platformOrderId + '\'' + '}'; } } diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/EditRemarkRequest.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/EditRemarkRequest.java new file mode 100644 index 000000000..f99bb9e2c --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/EditRemarkRequest.java @@ -0,0 +1,15 @@ +package org.jeecg.modules.business.domain.api.mabang.dochangeorder; + +import org.jeecg.modules.business.domain.api.mabang.Request; + +public class EditRemarkRequest extends Request { + public EditRemarkRequest(EditRemarkRequestBody body) { + super(body); + } + + @Override + public ChangeOrderResponse send() { + String jsonString = rawSend().getBody(); + return ChangeOrderResponse.parse(jsonString); + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/EditRemarkRequestBody.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/EditRemarkRequestBody.java new file mode 100644 index 000000000..eb99e11cf --- /dev/null +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/dochangeorder/EditRemarkRequestBody.java @@ -0,0 +1,36 @@ +package org.jeecg.modules.business.domain.api.mabang.dochangeorder; + +import com.alibaba.fastjson.JSONObject; +import lombok.Getter; +import org.jeecg.modules.business.domain.api.mabang.RequestBody; + +import java.util.Map; + +@Getter +public class EditRemarkRequestBody implements RequestBody { + private final String platformOrderId; + private final String remark; + + public EditRemarkRequestBody(String platformOrderId, String remark) { + this.platformOrderId = platformOrderId; + this.remark = remark; + } + + @Override + public String api() { + return "order-do-change-order"; + } + + @Override + public Map parameters() { + JSONObject json = new JSONObject(); + putNonNull(json, "platformOrderId", platformOrderId); + putNonNull(json, "remark", remark); + return json; + } + private void putNonNull(JSONObject json, String key, E value) { + if (value != null) { + json.put(key, value); + } + } +} diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/getorderlist/Order.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/getorderlist/Order.java index 90af1ed6d..0389fd03e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/getorderlist/Order.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/api/mabang/getorderlist/Order.java @@ -125,6 +125,12 @@ public class Order { @JSONField(name = "isNewOrder") private String isNewOrder; + /** + * 订单备注 + */ + @JSONField(name = "remark") + private String remark; + /** * 1 = 有货 * 2 = 缺货 diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java index 9134e4d6c..cfb07dd3e 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/domain/shippingInvoice/ShippingInvoiceFactory.java @@ -36,6 +36,7 @@ import java.util.stream.Collectors; import static cn.hutool.core.date.DateTime.now; import static java.util.stream.Collectors.*; import static org.jeecg.modules.business.entity.Invoice.InvoiceType.*; +import static org.jeecg.modules.business.entity.Invoice.InvoicingMethod.*; @Slf4j @Component @@ -132,11 +133,11 @@ public class ShippingInvoiceFactory { List extraFees = extraFeeService.findNotInvoicedByShops(shopIds); log.info("Orders to be invoiced: {}", uninvoicedOrderToContent); String subject; - if(type.equals("shipping")) + if(type.equals(POSTSHIPPING.getMethod())) subject = String.format("Shipping fees from %s to %s", start, end); - else if(type.equals("pre-shipping")) + else if(type.equals(PRESHIPPING.getMethod())) subject = String.format("Pre-Shipping fees, order time from %s to %s", start, end); - else if(type.equals("all")) + else if(type.equals(ALL.getMethod())) subject = String.format("Shipping fees, order time from %s to %s", start, end); else throw new UserException("Couldn't create shipping invoice of unknown type."); @@ -180,11 +181,11 @@ public class ShippingInvoiceFactory { String subject; if(shippingMethod.equals("shipping")) subject = String.format("Purchase and Shipping fees from %s to %s", start, end); - else if(shippingMethod.equals("post")) + else if(shippingMethod.equals(POSTSHIPPING.getMethod())) subject = String.format("Purchase and post-Shipping fees from %s to %s", start, end); - else if (shippingMethod.equals("pre-shipping")) + else if (shippingMethod.equals(PRESHIPPING.getMethod())) subject = String.format("Purchase and pre-Shipping fees, order time from %s to %s", start, end); - else if(shippingMethod.equals("all")) + else if(shippingMethod.equals(ALL.getMethod())) subject = String.format("Purchase and Shipping fees, order time from %s to %s", start, end); else throw new UserException("Couldn't create complete invoice for unknown shipping method"); if(balance != null) diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java index 08a980431..9be8a94ae 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/PlatformOrderMapper.java @@ -218,6 +218,7 @@ public interface PlatformOrderMapper extends BaseMapper { List fetchShippingFeeBillableOrders(); List getPlatformOrdersByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber); + List getPlatformOrderIdsByInvoiceNumber(@Param("invoiceNumber") String invoiceNumber); OrderKpi countPlatformOrders(@Param("start") LocalDateTime start, @Param("end") LocalDateTime end, @Param("showAllData") boolean showAllData, @Param("username") String username); diff --git a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml index c72550c40..900788aa9 100644 --- a/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml +++ b/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/business/mapper/xml/PlatformOrderMapper.xml @@ -684,6 +684,8 @@ + SELECT count(po.id) FROM platform_order po - JOIN platform_order_content poc ON po.id = poc.platform_order_id - JOIN sku s ON poc.sku_id = s.id - JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name + JOIN logistic_channel lc ON po.logistic_channel_name = lc.zh_name WHERE po.erp_status IN #{erpStatus} @@ -1303,6 +1320,7 @@ AND po.order_time BETWEEN #{start} AND #{end} + AND po.shipping_invoice_number IS NULL