Commit e4a4af81 by huluobin

销售sku报表

parent 4aef5ed3
......@@ -3,6 +3,9 @@ package com.bailuntec.ana.application.order;
import com.bailuntec.ana.domain.order.Order;
import com.bailuntec.ana.domain.order.OrderDetail;
import com.bailuntec.ana.domain.purchase.PurchaseOrderDetail;
import com.bailuntec.ana.vo.order.req.SellerOrderDetailChartRequest;
import com.bailuntec.ana.vo.order.resp.SellerOrderDetailChartResp;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
......@@ -52,4 +55,14 @@ public interface IOrderDetailService extends IService<OrderDetail> {
* @param purchaseOrderDetailList purchaseOrderDetailList
*/
void setPurchaseOrderDetailOrderDetail(List<PurchaseOrderDetail> purchaseOrderDetailList);
/**
* <p>
* 销售sku报表
* </p>
*
* @param request req
* @return 报表
*/
Page<SellerOrderDetailChartResp> sellerOrderDetailChartResp(SellerOrderDetailChartRequest request);
}
......@@ -8,7 +8,11 @@ import com.bailuntec.ana.domain.order.OrderDetail;
import com.bailuntec.ana.domain.purchase.PurchaseOrderDetail;
import com.bailuntec.ana.infrastructure.common.util.ListUtil;
import com.bailuntec.ana.infrastructure.mapper.order.OrderDetailMapper;
import com.bailuntec.ana.vo.order.req.SellerOrderDetailChartRequest;
import com.bailuntec.ana.vo.order.resp.SellerOrderDetailChartResp;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
......@@ -68,6 +72,13 @@ public class OrderDetailServiceImpl extends ServiceImpl<OrderDetailMapper, Order
}
}
@Override
public Page<SellerOrderDetailChartResp> sellerOrderDetailChartResp(SellerOrderDetailChartRequest request) {
Page<SellerOrderDetailChartResp> page = new Page<>(request.getPageNum(), request.getPageSize());
page = baseMapper.sellerOrderDetailChartResp(page, request);
return page;
}
@Override
public void setOrderDetail(Order order) {
......
......@@ -16,7 +16,6 @@ import com.bailuntec.ana.infrastructure.common.util.StringUtils;
import com.bailuntec.ana.infrastructure.feign.PamsApi;
import com.bailuntec.ana.infrastructure.feign.PdsApi;
import com.bailuntec.ana.infrastructure.mapper.order.OrderMapper;
import com.bailuntec.ana.vo.order.Currency;
import com.bailuntec.ana.vo.order.req.OrderQueryPageRequest;
import com.bailuntec.ana.vo.order.req.RefundOrderRequest;
import com.bailuntec.ana.vo.order.resp.Accounts;
......@@ -86,7 +85,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
public void orderSalesRefund(RefundOrderRequest request) {
Order order = baseMapper.selectByOrderNoAndPdsAccountId(request.getOriginalOrderNo(), request.getPdsAccountId());
order.setSalesRefundAmount(request.getSalesRefundAmount());
//todo 调用自动采购退款
//todo 生成采购订单
baseMapper.updateById(order);
}
......
......@@ -110,7 +110,7 @@ public class PurchaseOrderServiceImpl extends ServiceImpl<PurchaseOrderMapper, P
purchaseOrder.setPurchaseTaskId(purchaseTaskId);
purchaseOrder.setPurchasePlat(purchaseTask.getPurchasePlat());
purchaseOrder.setTotalTax(new Currency(totalTax));
purchaseOrder.setTotalPrice(new Currency(totalPrice));
purchaseOrder.setTotalSkuCost(new Currency(totalPrice));
purchaseOrder.setTotalShipCost(new Currency(totalShip));
purchaseOrder.setOrderId(purchaseTask.getOrderId());
......@@ -129,7 +129,7 @@ public class PurchaseOrderServiceImpl extends ServiceImpl<PurchaseOrderMapper, P
purchaseOrderDetail.setAsin(callBackPurchaseOrderDetail.getAsin());
purchaseOrderDetail.setMerchantId(callBackPurchaseOrderDetail.getMerchant_id());
purchaseOrderDetail.setPurchaseOrderId(purchaseOrder.getId());
purchaseOrderDetail.setPrice(callBackPurchaseOrderDetail.getPrice());
purchaseOrderDetail.setSkuCost(callBackPurchaseOrderDetail.getPrice());
purchaseOrderDetail.setTax(callBackPurchaseOrderDetail.getTax());
purchaseOrderDetail.setShipCost(callBackPurchaseOrderDetail.getShip());
purchaseOrderDetail.setSku(callBackPurchaseOrderDetail.getSku());
......
......@@ -100,7 +100,6 @@ public class Order extends BaseModel {
@ApiModelProperty(value = "采购价")
private Currency purchasePrice;
@Valid
@NotNull(groups = OrderValidGroup.PublishOrder.class, message = "ebayFee不能唯恐")
@TableField(typeHandler = JacksonTypeHandler.class)
......
......@@ -19,6 +19,8 @@ import org.hibernate.validator.constraints.URL;
import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
......@@ -33,7 +35,6 @@ import java.util.List;
@EqualsAndHashCode(callSuper = true)
@Accessors(chain = true)
@ApiModel(value = "OrdeDetail", description = "")
@TableName(autoResultMap = true)
public class OrderDetail extends BaseModel {
private static final long serialVersionUID = 1L;
......@@ -59,9 +60,22 @@ public class OrderDetail extends BaseModel {
private String orderId;
@NotNull(groups = OrderValidGroup.PublishOrder.class, message = "平台sku不能为空")
@ApiModelProperty(value = "订单 平台sku编码")
@ApiModelProperty(value = "订单平台sku编码")
private String skuNo;
@ApiModelProperty(value = "品牌")
private String brand;
@ApiModelProperty(value = "分类")
private String category;
@NotNull(groups = OrderValidGroup.PublishOrder.class, message = "平台sku售价不能为空")
@ApiModelProperty(value = "订单平台sku单价")
private Currency skuSalePrice;
@ApiModelProperty(value = "订单平台sku单价(CNY人民币")
private BigDecimal cnySkuSalePrice;
@NotNull(groups = OrderValidGroup.PublishOrder.class, message = "平台itemId不能为空")
@ApiModelProperty(value = "订单 平台spuId")
private String itemId;
......@@ -102,6 +116,9 @@ public class OrderDetail extends BaseModel {
@ApiModelProperty(value = "销售sku源链接")
private String originalLink;
@ApiModelProperty(value = "采购完成时间")
private LocalDateTime purchaseTime;
@DictParam(dictCode = "ORDER_DETAIL_PURCHASE_STATUS", dictValueParam = "purchaseStatusStr")
@ApiModelProperty(value = "采购状态1-未采购 2-采购中 3-采购失败 4-采购完成")
private Integer purchaseStatus;
......@@ -112,6 +129,9 @@ public class OrderDetail extends BaseModel {
private String purchaseMessage;
@ApiModelProperty(value = "发货时间")
private LocalDateTime deliveryTime;
@DictParam(dictCode = "ORDER_DETAIL_DELIVERY_STATUS", dictValueParam = "deliveryStatusStr")
@ApiModelProperty("发货状态 1-未发货 2-已发货")
private Integer deliveryStatus;
......
......@@ -10,6 +10,7 @@ import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.List;
/**
......@@ -39,8 +40,15 @@ public class PurchaseOrder extends BaseModel {
@ApiModelProperty(value = "采购单加权平均邮费")
private Currency totalShipCost;
@ApiModelProperty(value = "采购单总sku成本")
private Currency totalSkuCost;
@ApiModelProperty(value = "采购单总成本")
private Currency totalPrice;
@ApiModelProperty(value = "采购单总成本(CNY)")
private BigDecimal cnyTotalPrice;
@ApiModelProperty(value = "采购任务id")
private String purchaseTaskId;
......
......@@ -42,9 +42,12 @@ public class PurchaseOrderDetail extends BaseModel {
@ApiModelProperty(value = "采购listing页面爬虫需要的id 亚马逊是skuId、ebay是spuId")
private String asin;
@ApiModelProperty(value = "实际成本(单价 * 数量)采购系统回调")
@ApiModelProperty(value = "sku成本")
private Currency price;
@ApiModelProperty(value = "sku采购总额")
private Currency skuCost;
@ApiModelProperty(value = "加权平均邮费")
private Currency shipCost;
......
package com.bailuntec.ana.infrastructure.mapper.order;
import com.bailuntec.ana.domain.order.OrderDetail;
import com.bailuntec.ana.vo.order.req.SellerOrderDetailChartRequest;
import com.bailuntec.ana.vo.order.resp.SellerOrderDetailChartResp;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Param;
import java.util.List;
......@@ -46,4 +49,15 @@ public interface OrderDetailMapper extends BaseMapper<OrderDetail> {
* @return 订单详情列表
*/
List<OrderDetail> selectByTaskId(String purchaseTaskId);
/**
* <p>
* 销售sku报表
* </p>
*
* @param page page
* @param request request
* @return 报表
*/
Page<SellerOrderDetailChartResp> sellerOrderDetailChartResp(Page<SellerOrderDetailChartResp> page, SellerOrderDetailChartRequest request);
}
package com.bailuntec.ana.interfaces.address;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author robbendev
* @since 2020-07-28
*/
@RestController
@RequestMapping("/order-address")
public class OrderAddressController {
}
package com.bailuntec.ana.interfaces.common;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 字典表 前端控制器
* </p>
*
* @author robbendev
* @since 2020-08-05
*/
@RestController
@RequestMapping("//dict")
public class DictController {
}
package com.bailuntec.ana.interfaces.order;
import com.bailuntec.ana.application.order.IOrderDetailService;
import com.bailuntec.ana.infrastructure.common.base.BaseResult;
import com.bailuntec.ana.vo.order.req.SellerOrderDetailChartRequest;
import com.bailuntec.ana.vo.order.resp.SellerOrderDetailChartResp;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* <p>
* 订单详情接口
* </p>
*
* @author robbendev
* @since 2020-07-28
*/
@Api(tags = "订单详情接口")
@RestController
@RequestMapping("/api/orderDetail")
public class OrderDetailController {
@Resource
IOrderDetailService orderDetailService;
@PostMapping("/sellerOrderDetailChartResp")
public BaseResult<Page<SellerOrderDetailChartResp>> sellerOrderDetailChartResp(@RequestBody SellerOrderDetailChartRequest request) {
Page<SellerOrderDetailChartResp> page = orderDetailService.sellerOrderDetailChartResp(request);
return BaseResult.success(page);
}
}
package com.bailuntec.ana.interfaces.order;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author robbendev
* @since 2020-07-28
*/
@RestController
@RequestMapping("/api/orderSpecification")
public class OrderSpecificationController {
}
package com.bailuntec.ana.interfaces.purchase;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author robbendev
* @since 2020-08-01
*/
@RestController
@RequestMapping("//purchase-order-detail")
public class PurchaseOrderDetailController {
}
package com.bailuntec.ana.interfaces.purchase;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author robbendev
* @since 2020-08-01
*/
@RestController
@RequestMapping("//purchase-task")
public class PurchaseTaskController {
}
package com.bailuntec.ana.interfaces.purchase;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 前端控制器
* </p>
*
* @author robbendev
* @since 2020-08-01
*/
@RestController
@RequestMapping("//purchase-task-detail")
public class PurchaseTaskDetailController {
}
......@@ -25,7 +25,7 @@ public class Currency {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "汇率")
@ApiModelProperty(value = "对人民币汇率")
private BigDecimal exchangeRate;
@DecimalMin(value = "0", inclusive = false, message = "金额不能小于0", groups = OrderValidGroup.PublishOrder.class)
......@@ -61,4 +61,15 @@ public class Currency {
}
/**
* <p>
* 获取货币人民币金额
* </p>
*
* @return 人民币金额
*/
public BigDecimal CNY() {
return amount.multiply(exchangeRate);
}
}
package com.bailuntec.ana.vo.order.req;
import com.bailuntec.ana.infrastructure.common.base.BaseRequest;
import lombok.Data;
/**
* <p>
* 订单详情sku报表响应
* </p>
*
* @author robbendev
* @since 2020/8/10 5:14 下午
*/
@Data
public class SellerOrderDetailChartRequest extends BaseRequest {
}
package com.bailuntec.ana.vo.order.resp;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* <p>
* 订单详情sku报表响应
* </p>
*
* @author robbendev
* @since 2020/8/10 5:14 下午
*/
@Data
@JsonInclude()
public class SellerOrderDetailChartResp {
@ApiModelProperty("sku编码")
private String skuNo;
@ApiModelProperty("平台")
private String platform;
@ApiModelProperty("站点")
private String site;
@ApiModelProperty("帐号")
private String account;
@ApiModelProperty("品牌")
private String brand;
@ApiModelProperty("分类")
private String category;
@ApiModelProperty("订单数量")
private Integer orderNum;
@ApiModelProperty("平均sku售价")
private BigDecimal averageSkuPrice;
@ApiModelProperty("sku退货率")
private BigDecimal refundPercent;
@ApiModelProperty("采购时间")
private LocalDateTime purchaseTime;
@ApiModelProperty("发货时间")
private LocalDateTime deliveryTime;
}
......@@ -4,8 +4,6 @@ import com.bailuntec.ana.vo.order.Currency;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
* <p>
* 采购订单回调
......@@ -33,5 +31,4 @@ public class CallBackPurchaseOrderDetail {
private Currency ship;
private String merchant_id;
}
......@@ -24,4 +24,22 @@
where t1.id = #{purchaseTaskId}
and t3.record_state = 'A'
</select>
<select id="sellerOrderDetailChartResp"
resultType="com.bailuntec.ana.vo.order.resp.SellerOrderDetailChartResp">
SELECT t1.sku_no,
GROUP_CONCAT(DISTINCT t2.platform) platform,
GROUP_CONCAT(DISTINCT t2.site) site,
GROUP_CONCAT(DISTINCT t2.pds_account) account,
t1.brand,
t1.category,
count(DISTINCT t2.original_order_no, t2.pds_account_id) order_num,
sum(t1.cny_sku_sale_price) / sum(t1.quantity) average_sku_price,
sum(t3.quantity) / sum(t1.quantity) refund_precent,
t1.purchase_time,
t1.delivery_time
from order_detail t1
LEFT JOIN `order` t2 on t1.order_id = t2.id
LEFT JOIN refund_order_detail t3 on t1.id = t3.order_detail_id
GROUP BY t1.sku_no
</select>
</mapper>
package com.bailuntec.ana.interfaces.order;
import com.bailuntec.ana.infrastructure.feign.PamsApi;
import com.bailuntec.ana.infrastructure.feign.PdsApi;
import com.bailuntec.ana.vo.order.Currency;
import com.bailuntec.ana.vo.order.resp.Accounts;
import com.bailuntec.ana.vo.order.resp.PamsBaseResult;
import com.bailuntec.ana.vo.product.resp.PdsSkuInfo;
import com.google.common.collect.Lists;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mockito;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.mock.mockito.MockBean;
import org.springframework.test.context.junit4.SpringRunner;
import java.math.BigDecimal;
import java.util.List;
/**
* <p>
*
* </p>
*
* @author robbendev
* @since 2020/8/6 5:03 下午
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class OrderControllerTest {
@MockBean
PdsApi pdsApi;
@MockBean
PamsApi pamsApi;
@Before
public void setUp() {
PdsSkuInfo pdsSkuInfo = new PdsSkuInfo();
pdsSkuInfo.setTolerance(new Currency(BigDecimal.ONE));
pdsSkuInfo.setCostPrice(new Currency(BigDecimal.ONE));
pdsSkuInfo.setPurchasePlat("ebay");
pdsSkuInfo.setPurchaseAsin("purchase-sku-asin-001");
pdsSkuInfo.setPurchaseSkuNo("purchase-sku-test-001");
Mockito.when(pdsApi.queryPdsSku("ebay", "sale-sku-test-001"))
.thenReturn(pdsSkuInfo);
Accounts accounts = new Accounts();
accounts.setAccount("test-account");
accounts.setId(100);
accounts.setEmailAccount("test@gmail.com");
accounts.setOmsCode("AM4501646");
accounts.setOmsAccount("LagunamoonBeautyESBLT");
accounts.setPlatformId("15");
PamsBaseResult<List<Accounts>> result = new PamsBaseResult<>();
result.setData(Lists.newArrayList(accounts));
Mockito.when(pamsApi.getAccount("100"))
.thenReturn(result);
}
@Test
public void publishOrder() {
}
@Test
public void refundOrder() {
}
@Test
public void purchase() {
}
@Test
public void queryPage() {
}
@Test
public void queryDetail() {
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment