Compare commits

...

2 Commits

Author SHA1 Message Date
dev
615549ed5e 5.9新需求修改 2025-05-10 14:29:20 +08:00
dev
47b65b2528 4.12新需求修改 2025-04-24 11:05:44 +08:00
68 changed files with 3524 additions and 96 deletions

View File

@ -17,7 +17,7 @@
</settings>
</deployment>
<method v="2">
<option name="Maven.BeforeRunTask" enabled="true" file="F:\Asinkj-Cloud\asinkj-auth/pom.xml" goal="package" />
<option name="Maven.BeforeRunTask" enabled="true" file="$PROJECT_DIR$/pom.xml" goal="package -Pprod" />
</method>
</configuration>
</component>

View File

@ -17,7 +17,7 @@
</settings>
</deployment>
<method v="2">
<option name="Maven.BeforeRunTask" enabled="true" file="F:\Asinkj-Cloud\asinkj-modules\asinkj-system/pom.xml" goal="package" />
<option name="Maven.BeforeRunTask" enabled="true" file="$PROJECT_DIR$/asinkj-modules/asinkj-system/pom.xml" goal="package -Pprod" />
</method>
</configuration>
</component>

View File

@ -5,4 +5,8 @@ import org.springframework.stereotype.Service;
@Service
public interface RemoteFBADataService {
void pullAmzFbaDataToken(String startDate, String endDate) throws Exception;
void updateAmzFbaDataToken() throws Exception;
void quoteReminder() throws Exception;
}

View File

@ -116,6 +116,15 @@ public interface RemoteUserService {
*/
void recordLoginInfo(Long userId, String ip);
/**
* 更新用户信息
*
* @param userId 用户ID
* @param openId openId
*/
void recordOpenId(Long userId, String openId);
/**
* 通过用户ID查询用户列表
*
@ -131,4 +140,13 @@ public interface RemoteUserService {
* @return 用户ids
*/
List<Long> selectUserIdsByRoleIds(List<Long> roleIds);
/**
* 通过角色ID查询用户ID
*
* @param roleIds 角色ids
* @return 用户ids
*/
List<String> selectUserOpenIdsByRoleIds(List<Long> roleIds);
}

View File

@ -86,6 +86,11 @@
<artifactId>asinkj-api-resource</artifactId>
</dependency>
<dependency>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common-wp</artifactId>
</dependency>
<!-- 自定义负载均衡(多团队开发使用) -->
<!-- <dependency>-->
<!-- <groupId>org.asinkj</groupId>-->

View File

@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest;
@ -30,11 +31,9 @@ import org.asinkj.common.social.config.properties.SocialLoginConfigProperties;
import org.asinkj.common.social.config.properties.SocialProperties;
import org.asinkj.common.social.utils.SocialUtils;
import org.asinkj.common.tenant.helper.TenantHelper;
import org.asinkj.common.wp.handler.WxMessagesManager;
import org.asinkj.resource.api.RemoteMessageService;
import org.asinkj.system.api.RemoteClientService;
import org.asinkj.system.api.RemoteConfigService;
import org.asinkj.system.api.RemoteSocialService;
import org.asinkj.system.api.RemoteTenantService;
import org.asinkj.system.api.*;
import org.asinkj.system.api.domain.vo.RemoteClientVo;
import org.asinkj.system.api.domain.vo.RemoteTenantVo;
import org.springframework.web.bind.annotation.*;
@ -72,6 +71,9 @@ public class TokenController {
@DubboReference(stub = "true")
private final RemoteMessageService remoteMessageService;
@DubboReference
private RemoteUserService remoteUserService;
/**
* 登录方法
*
@ -129,6 +131,35 @@ public class TokenController {
return R.ok("操作成功", authorizeUrl);
}
/**
* 第三方登录请求
*
* @return 结果
*/
@GetMapping("/generate-auth-url")
public R<String> generateWeixinAuthUrl() {
String redirectUri = "https://api.amzups.com/auth/auth-callback";
String authUrl = WxMessagesManager.buildAuthUrl(redirectUri, String.valueOf(LoginHelper.getUserId()));
return R.ok("操作成功", authUrl);
}
@GetMapping("/auth-callback")
public String handleCallback(@RequestParam String code, @RequestParam String state) {
try {
String openId = WxMessagesManager.getOpenIdByCode(code);
// openId 绑定到 state 对应的用户ID需自行实现
remoteUserService.recordOpenId(Long.valueOf(state), openId);
String nickname = remoteUserService.selectNicknameById(Long.valueOf(state));
return "用户: " + nickname + "绑定成功!";
} catch (WxErrorException e) {
log.error("微信授权失败: {}", e.getMessage());
return "绑定失败,请重试";
}
}
/**
* 第三方登录回调业务处理 绑定授权
*

View File

@ -4,6 +4,8 @@
#FROM findepi/graalvm:java17-native
FROM amazoncorretto:17.0.14
ENV TZ=Asia/Shanghai
LABEL maintainer="Shuo Hu "
RUN mkdir -p /asinkj/amz/logs \

View File

@ -49,6 +49,11 @@
<artifactId>asinkj-common-mybatis</artifactId>
</dependency>
<dependency>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common-wp</artifactId>
</dependency>
<dependency>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common-dubbo</artifactId>

View File

@ -7,6 +7,8 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.asinkj.amz.domain.vo.InquiryRequestItemVo;
import org.asinkj.common.wp.handler.WxMessagesManager;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.asinkj.common.idempotent.annotation.RepeatSubmit;
@ -22,6 +24,7 @@ import org.asinkj.amz.domain.vo.BizInquiryRequestVo;
import org.asinkj.amz.domain.bo.BizInquiryRequestBo;
import org.asinkj.amz.service.IBizInquiryRequestService;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 物流询价
@ -55,9 +58,9 @@ public class BizInquiryRequestController extends BaseController {
@SaCheckPermission("amz:shipmentPlan:edit")
@GetMapping("/query/{destination}/{channelId}/{date}")
public TableDataInfo<BizInquiryRequestVo> queryWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination,
@PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId,
@PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizInquiryRequestService.queryWithDesAndChannel(destination, channelId,date);
@PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId,
@PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizInquiryRequestService.queryWithDesAndChannel(destination, channelId, date);
}
@ -68,9 +71,9 @@ public class BizInquiryRequestController extends BaseController {
@SaCheckPermission("amz:shipmentPlan:edit")
@GetMapping("/create/{destination}/{channelId}/{date}")
public R<String> createWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination,
@PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId,
@PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizInquiryRequestService.createWithDesAndChannel(destination, channelId,date);
@PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId,
@PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizInquiryRequestService.createWithDesAndChannel(destination, channelId, date);
}
@SaCheckPermission("amz:shipmentPlan:edit")
@ -99,7 +102,7 @@ public class BizInquiryRequestController extends BaseController {
@SaCheckPermission("amz:inquiryRequest:query")
@GetMapping("/{id}")
public R<BizInquiryRequestVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
@PathVariable Long id) {
return R.ok(bizInquiryRequestService.queryById(id));
}
@ -125,6 +128,7 @@ public class BizInquiryRequestController extends BaseController {
return toAjax(bizInquiryRequestService.updateByBo(bo));
}
/**
* 删除物流询价
*
@ -137,4 +141,17 @@ public class BizInquiryRequestController extends BaseController {
@PathVariable Long[] ids) {
return toAjax(bizInquiryRequestService.deleteWithValidByIds(List.of(ids), true));
}
@GetMapping("/message/test/{key1}/{key2}/{openId}")
public R<Void> test(
@PathVariable("key1") String key1,
@PathVariable("key2") String key2,
@PathVariable("openId") String openId
) throws Exception {
WxMessagesManager.sendWechatTempMessage(key1, key2, openId);
return R.ok();
}
}

View File

@ -11,6 +11,7 @@ import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.apache.dubbo.config.annotation.DubboReference;
import org.asinkj.amz.domain.BizLogisticsOrder;
import org.asinkj.amz.domain.bo.BizLogisticsCreateOrderBo;
import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.core.utils.file.MimeTypeUtils;
@ -157,4 +158,10 @@ public class BizLogisticsOrderController extends BaseController {
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(bizLogisticsOrderService.deleteWithValidByIds(List.of(ids), true));
}
@GetMapping("/query")
public R<List<BizLogisticsOrder>> query() {
return R.ok(bizLogisticsOrderService.selectOrdersByUserId());
}
}

View File

@ -3,11 +3,14 @@ package org.asinkj.amz.controller;
import java.util.List;
import java.util.Map;
import cn.dev33.satoken.annotation.SaCheckRole;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteMostBo;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteReportBo;
import org.asinkj.amz.domain.vo.InquiryQuoteStatusDTO;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@ -57,22 +60,20 @@ public class BizLogisticsQuoteController extends BaseController {
@SaCheckPermission("amz:shipmentPlan:edit")
@GetMapping("/query/{destination}/{channelId}/{date}")
public TableDataInfo<BizLogisticsQuoteVo> queryWithDesAndChannel(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination,
@PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId,
@PathVariable("channelId") @NotNull(message = "渠道不能为空") String channelId,
@PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizLogisticsQuoteService.listWithDesAndChannel(destination, channelId,date);
return bizLogisticsQuoteService.listWithDesAndChannel(destination, channelId, date);
}
@SaCheckPermission("amz:shipmentPlan:edit")
@GetMapping("/queryWithDes/{destination}/{date}")
public TableDataInfo<BizLogisticsQuoteVo> queryWithDes(@PathVariable("destination") @NotNull(message = "目的地不能为空") String destination,
@PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizLogisticsQuoteService.listWithDes(destination,date);
@PathVariable("date") @NotNull(message = "日期不能为空") String date) {
return bizLogisticsQuoteService.listWithDes(destination, date);
}
/**
* 导出物流报价列表
*/
@ -92,7 +93,7 @@ public class BizLogisticsQuoteController extends BaseController {
@SaCheckPermission("amz:logisticsQuote:query")
@GetMapping("/{id}")
public R<BizLogisticsQuoteVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
@PathVariable Long id) {
return R.ok(bizLogisticsQuoteService.queryById(id));
}
@ -161,11 +162,15 @@ public class BizLogisticsQuoteController extends BaseController {
return toAjax(bizLogisticsQuoteService.deleteWithValidByIds(List.of(ids), true));
}
@SaCheckPermission("amz:logisticsQuote:query")
@GetMapping("/report")
public R<List<Map<String, Object>>> getInfo() {
List<Map<String, Object>> maps = bizLogisticsQuoteService.generateReport();
/**
* 查询报表
*
* @return
*/
@SaCheckRole("yunying")
@PostMapping("/report")
public R<List<Map<String, Object>>> getInfo(@Valid @RequestBody BizLogisticsQuoteReportBo bo) {
List<Map<String, Object>> maps = bizLogisticsQuoteService.generateReport(bo);
return R.ok(maps);
}

View File

@ -0,0 +1,106 @@
package org.asinkj.amz.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.asinkj.common.idempotent.annotation.RepeatSubmit;
import org.asinkj.common.log.annotation.Log;
import org.asinkj.common.web.core.BaseController;
import org.asinkj.common.mybatis.core.page.PageQuery;
import org.asinkj.common.core.domain.R;
import org.asinkj.common.core.validate.AddGroup;
import org.asinkj.common.core.validate.EditGroup;
import org.asinkj.common.log.enums.BusinessType;
import org.asinkj.common.excel.utils.ExcelUtil;
import org.asinkj.amz.domain.vo.BizPurchaseOrderVo;
import org.asinkj.amz.domain.bo.BizPurchaseOrderBo;
import org.asinkj.amz.service.IBizPurchaseOrderService;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
/**
* 采购单主
* 前端访问路由地址为:/amz/purchaseOrder
*
* @author shuo hu
* @date 2025-05-10
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/purchaseOrder")
public class BizPurchaseOrderController extends BaseController {
private final IBizPurchaseOrderService bizPurchaseOrderService;
/**
* 查询采购单主列表
*/
@SaCheckPermission("amz:purchaseOrder:list")
@GetMapping("/list")
public TableDataInfo<BizPurchaseOrderVo> list(BizPurchaseOrderBo bo, PageQuery pageQuery) {
return bizPurchaseOrderService.queryPageList(bo, pageQuery);
}
/**
* 导出采购单主列表
*/
@SaCheckPermission("amz:purchaseOrder:export")
@Log(title = "采购单主", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BizPurchaseOrderBo bo, HttpServletResponse response) {
List<BizPurchaseOrderVo> list = bizPurchaseOrderService.queryList(bo);
ExcelUtil.exportExcel(list, "采购单主", BizPurchaseOrderVo.class, response);
}
/**
* 获取采购单主详细信息
*
* @param orderSn 主键
*/
@SaCheckPermission("amz:purchaseOrder:query")
@GetMapping("/{orderSn}")
public R<BizPurchaseOrderVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable String orderSn) {
return R.ok(bizPurchaseOrderService.queryById(orderSn));
}
/**
* 新增采购单主
*/
@SaCheckPermission("amz:purchaseOrder:add")
@Log(title = "采购单主", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BizPurchaseOrderBo bo) {
return toAjax(bizPurchaseOrderService.insertByBo(bo));
}
/**
* 修改采购单主
*/
@SaCheckPermission("amz:purchaseOrder:edit")
@Log(title = "采购单主", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BizPurchaseOrderBo bo) {
return toAjax(bizPurchaseOrderService.updateByBo(bo));
}
/**
* 删除采购单主
*
* @param orderSns 主键串
*/
@SaCheckPermission("amz:purchaseOrder:remove")
@Log(title = "采购单主", businessType = BusinessType.DELETE)
@DeleteMapping("/{orderSns}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable String[] orderSns) {
return toAjax(bizPurchaseOrderService.deleteWithValidByIds(List.of(orderSns), true));
}
}

View File

@ -0,0 +1,106 @@
package org.asinkj.amz.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.asinkj.common.idempotent.annotation.RepeatSubmit;
import org.asinkj.common.log.annotation.Log;
import org.asinkj.common.web.core.BaseController;
import org.asinkj.common.mybatis.core.page.PageQuery;
import org.asinkj.common.core.domain.R;
import org.asinkj.common.core.validate.AddGroup;
import org.asinkj.common.core.validate.EditGroup;
import org.asinkj.common.log.enums.BusinessType;
import org.asinkj.common.excel.utils.ExcelUtil;
import org.asinkj.amz.domain.vo.BizPurchaseOrderItemVo;
import org.asinkj.amz.domain.bo.BizPurchaseOrderItemBo;
import org.asinkj.amz.service.IBizPurchaseOrderItemService;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
/**
* 供应商订单产品明细
* 前端访问路由地址为:/amz/purchaseOrderItem
*
* @author shuo hu
* @date 2025-05-10
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/purchaseOrderItem")
public class BizPurchaseOrderItemController extends BaseController {
private final IBizPurchaseOrderItemService bizPurchaseOrderItemService;
/**
* 查询供应商订单产品明细列表
*/
@SaCheckPermission("amz:purchaseOrderItem:list")
@GetMapping("/list")
public TableDataInfo<BizPurchaseOrderItemVo> list(BizPurchaseOrderItemBo bo, PageQuery pageQuery) {
return bizPurchaseOrderItemService.queryPageList(bo, pageQuery);
}
/**
* 导出供应商订单产品明细列表
*/
@SaCheckPermission("amz:purchaseOrderItem:export")
@Log(title = "供应商订单产品明细", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(BizPurchaseOrderItemBo bo, HttpServletResponse response) {
List<BizPurchaseOrderItemVo> list = bizPurchaseOrderItemService.queryList(bo);
ExcelUtil.exportExcel(list, "供应商订单产品明细", BizPurchaseOrderItemVo.class, response);
}
/**
* 获取供应商订单产品明细详细信息
*
* @param id 主键
*/
@SaCheckPermission("amz:purchaseOrderItem:query")
@GetMapping("/{id}")
public R<BizPurchaseOrderItemVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(bizPurchaseOrderItemService.queryById(id));
}
/**
* 新增供应商订单产品明细
*/
@SaCheckPermission("amz:purchaseOrderItem:add")
@Log(title = "供应商订单产品明细", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody BizPurchaseOrderItemBo bo) {
return toAjax(bizPurchaseOrderItemService.insertByBo(bo));
}
/**
* 修改供应商订单产品明细
*/
@SaCheckPermission("amz:purchaseOrderItem:edit")
@Log(title = "供应商订单产品明细", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody BizPurchaseOrderItemBo bo) {
return toAjax(bizPurchaseOrderItemService.updateByBo(bo));
}
/**
* 删除供应商订单产品明细
*
* @param ids 主键串
*/
@SaCheckPermission("amz:purchaseOrderItem:remove")
@Log(title = "供应商订单产品明细", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(bizPurchaseOrderItemService.deleteWithValidByIds(List.of(ids), true));
}
}

View File

@ -2,12 +2,14 @@ package org.asinkj.amz.controller;
import java.util.List;
import cn.dev33.satoken.annotation.SaCheckRole;
import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
import org.asinkj.amz.domain.vo.BizShipmentPlanOrderVo;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import org.asinkj.common.idempotent.annotation.RepeatSubmit;
@ -23,6 +25,7 @@ import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
import org.asinkj.amz.domain.bo.BizShipmentPlanBo;
import org.asinkj.amz.service.IBizShipmentPlanService;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.springframework.web.multipart.MultipartFile;
/**
* 货件计划
@ -149,4 +152,13 @@ public class BizShipmentPlanController extends BaseController {
return R.ok();
}
@SaCheckRole("yunying")
@Log(title = "更新货件信息", businessType = BusinessType.EXPORT)
@PostMapping(value = "/importData", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public R<Void> importData(@RequestPart("file") MultipartFile file) throws Exception {
bizShipmentPlanService.importExcel(file.getInputStream());
return R.ok();
}
}

View File

@ -153,6 +153,21 @@ public class SysAmazonStoreController extends BaseController {
return R.ok();
}
@GetMapping("/purchase/{startDate}/{endDate}")
public R<Void> pullPurchaseOrderData(@PathVariable String startDate, @PathVariable String endDate) {
try {
sysAmazonStoreService.pullPurchaseOrderData(startDate, endDate, new LingxinCallback() {
@Override
public void onFinished(String result, int status) {
}
});
} catch (Exception e) {
throw new RuntimeException(e);
}
return R.ok();
}
@SaCheckPermission("amz:amazonStore:remove")
@Log(title = "亚马逊FBAtest", businessType = BusinessType.OTHER)
@GetMapping("/test")

View File

@ -0,0 +1,283 @@
package org.asinkj.amz.domain;
import org.asinkj.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 采购单主对象 biz_purchase_order
*
* @author shuo hu
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("biz_purchase_order")
public class BizPurchaseOrder extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 采购单号
*/
private String orderSn;
/**
* 自定义单号
*/
private String customOrderSn;
/**
* 供应商ID
*/
private Long supplierId;
/**
* 供应商名称
*/
private String supplierName;
/**
* 采购员ID
*/
private Long optUid;
/**
* 审核人姓名
*/
private String auditorRealname;
/**
* 操作人姓名
*/
private String optRealname;
/**
* 最后操作人姓名
*/
private String lastRealname;
/**
* 下单时间
*/
private Date orderTime;
/**
* 应付货款手工
*/
private String payment;
/**
* 审核人员ID
*/
private Long auditorUid;
/**
* 审核时间
*/
private Date auditorTime;
/**
* 最后操作人员ID
*/
private Long lastUid;
/**
* 最后操作时间
*/
private Date lastTime;
/**
* 作废原因
*/
private String reason;
/**
* 是否含税0 1
*/
private Long isTax;
/**
* 采购单状态-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废
*/
private Long status;
/**
* 状态说明
*/
private String statusText;
/**
* 支付状态说明
*/
private String payStatusText;
/**
* 到货状态1 未到货, 2 部分到货, 3 全部到货
*/
private Long statusShipped;
/**
* 到货状态说明
*/
private String statusShippedText;
/**
* 货物总价
*/
private Long amountTotal;
/**
* 总金额
*/
private Long totalPrice;
/**
* 币种符号
*/
private String icon;
/**
* 付款状态0 未申请, 1 已申请, 2 部分付款, 3 已付款
*/
private Long payStatus;
/**
* 备注
*/
private String remark;
/**
* 其他费用
*/
private Long otherFee;
/**
* 其他费用币种
*/
private String otherCurrency;
/**
* 费用分摊方式0 不分摊, 1 按金额, 2 按数量
*/
private Long feePartType;
/**
* 运费
*/
private Long shippingPrice;
/**
* 运费币种
*/
private String shippingCurrency;
/**
* 采购币种
*/
private String purchaseCurrency;
/**
* 采购汇率
*/
private Long purchaseRate;
/**
* 采购总量
*/
private Long quantityTotal;
/**
* 仓库ID
*/
private Long wid;
/**
* 仓库名称
*/
private String wareHouseName;
/**
* 仓库名(备份)
*/
private String wareHouseBakName;
/**
* 入库量
*/
private Long quantityEntry;
/**
* 实际采购量
*/
private Long quantityReal;
/**
* 待到货量
*/
private Long quantityReceive;
/**
* 采购方ID
*/
private Long purchaserId;
/**
* 联系人
*/
private String contactPerson;
/**
* 联系方式
*/
private String contactNumber;
/**
* 结算方式7 现结, 8 月结
*/
private Long settlementMethod;
/**
* 结算描述
*/
private String settlementDescription;
/**
* 支付方式
*/
private Long paymentMethod;
/**
* 删除标志0正常 2删除
*/
@TableLogic
private String delFlag;
/**
* 交货天数
*/
private Long estDlvDays;
/**
* 订单状态
*/
private String orderStatus;
/**
* 交货时间
*/
private Date deliveryTime;
/**
* 订单交付变动天数
*/
private Long dlvTimeVar;
}

View File

@ -0,0 +1,178 @@
package org.asinkj.amz.domain;
import org.asinkj.common.tenant.core.TenantEntity;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.io.Serial;
/**
* 供应商订单产品明细对象 biz_purchase_order_item
*
* @author shuo hu
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("biz_purchase_order_item")
public class BizPurchaseOrderItem extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 采购单子项ID
*/
private Long id;
/**
* 关联采购单号
*/
private String orderSn;
/**
* 仓库ID
*/
private Long wid;
/**
* 仓库名称
*/
private String wareHouseName;
/**
* 采购计划号
*/
private String planSn;
/**
* 本地产品ID
*/
private Long productId;
/**
* 品名
*/
private String productName;
/**
* SKU
*/
private String sku;
/**
* FNSKU
*/
private String fnsku;
/**
* 店铺ID
*/
private String sid;
/**
* 型号
*/
private String model;
/**
* 含税单价
*/
private Long price;
/**
* 价税合计
*/
private Long amount;
/**
* 计划采购量
*/
private Long quantityPlan;
/**
* 实际采购量
*/
private Long quantityReal;
/**
* 到货入库量
*/
private Long quantityEntry;
/**
* 待到货量
*/
private Long quantityReceive;
/**
* 退货数
*/
private Long quantityReturn;
/**
* 换货量
*/
private Long quantityExchange;
/**
* 质检量
*/
private Long quantityQc;
/**
* 待质检量
*/
private Long quantityQcPrepare;
/**
* 期待到货时间
*/
private Date expectArriveTime;
/**
* 备注
*/
private String remark;
/**
* 箱数
*/
private Long casesNum;
/**
* 单箱数量
*/
private Long quantityPerCase;
/**
* 是否删除0 1
*/
private Long isDelete;
/**
* 税率
*/
private String taxRate;
/**
* SPU
*/
private String spu;
/**
* 款名
*/
private String spuName;
/**
* 删除标志0正常 2删除
*/
@TableLogic
private String delFlag;
}

View File

@ -0,0 +1,63 @@
package org.asinkj.amz.domain;
import com.alibaba.excel.annotation.ExcelProperty;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.asinkj.amz.hanlder.AddressTypeHandler;
import org.asinkj.asinking.entity.FbaShipmentApiResponse;
import org.asinkj.common.tenant.core.TenantEntity;
import java.io.Serial;
import java.util.Date;
/**
* 货件计划对象 biz_shipment_plan
*
* @author shuo hu
* @date 2025-03-19
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("biz_shipment_plan")
public class BizShipmentPlanFileData extends TenantEntity {
@Serial
private static final long serialVersionUID = 1L;
/**
* 货件编号
*/
@ExcelProperty(value = "货件编号")
private String shipmentId;
/**
* 总箱子数量
*/
@ExcelProperty(value = "总箱子数量")
private Long boxQuantity;
/**
* 箱子尺寸
*/
@ExcelProperty(value = "箱子尺寸")
private String boxSize;
/**
* 总的物流商计重单位KG物流商实际测量值
*/
@ExcelProperty(value = "总的物流商计重")
private Long vendorWeight;
/**
* 套数系统中的申报量
*/
@ExcelProperty(value = "套数")
private Long setTotal;
}

View File

@ -0,0 +1,57 @@
package org.asinkj.amz.domain.bo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.github.linpeilie.annotations.AutoMapper;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.asinkj.amz.domain.BizLogisticsQuote;
import org.asinkj.common.core.validate.AddGroup;
import org.asinkj.common.core.validate.EditGroup;
import org.asinkj.common.mybatis.core.domain.BaseEntity;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serial;
import java.util.Date;
/**
* 物流报价业务对象 biz_logistics_quote
*
* @author shuo hu
* @date 2025-03-22
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BizLogisticsQuote.class, reverseConvertGenerate = false)
public class BizLogisticsQuoteReportBo extends BaseEntity {
@Serial
private static final long serialVersionUID = -8065228533338642055L;
/**
* 目的地建议使用ISO国家代码如CN/US/GB
*/
@NotBlank(message = "目的地4个字母组合不能为空")
private String destination;
/**
* 报价开始生效日期
*/
@NotNull(message = "报价开始生效日期不能为空")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
private Date quoteStartDate;
/**
* 报价开始生效日期
*/
@NotNull(message = "报价结束生效日期不能为空")
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss.SSSXXX", timezone = "UTC")
private Date quoteEndDate;
}

View File

@ -0,0 +1,326 @@
package org.asinkj.amz.domain.bo;
import org.asinkj.amz.domain.BizPurchaseOrder;
import org.asinkj.common.mybatis.core.domain.BaseEntity;
import org.asinkj.common.core.validate.AddGroup;
import org.asinkj.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 采购单主业务对象 biz_purchase_order
*
* @author shuo hu
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BizPurchaseOrder.class, reverseConvertGenerate = false)
public class BizPurchaseOrderBo extends BaseEntity {
/**
* 采购单号
*/
@NotBlank(message = "采购单号不能为空", groups = { AddGroup.class, EditGroup.class })
private String orderSn;
/**
* 自定义单号
*/
@NotBlank(message = "自定义单号不能为空", groups = { AddGroup.class, EditGroup.class })
private String customOrderSn;
/**
* 供应商ID
*/
@NotNull(message = "供应商ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long supplierId;
/**
* 供应商名称
*/
@NotBlank(message = "供应商名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String supplierName;
/**
* 采购员ID
*/
@NotNull(message = "采购员ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long optUid;
/**
* 审核人姓名
*/
@NotBlank(message = "审核人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String auditorRealname;
/**
* 操作人姓名
*/
@NotBlank(message = "操作人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String optRealname;
/**
* 最后操作人姓名
*/
@NotBlank(message = "最后操作人姓名不能为空", groups = { AddGroup.class, EditGroup.class })
private String lastRealname;
/**
* 下单时间
*/
@NotNull(message = "下单时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date orderTime;
/**
* 应付货款手工
*/
@NotBlank(message = "应付货款(手工)不能为空", groups = { AddGroup.class, EditGroup.class })
private String payment;
/**
* 审核人员ID
*/
@NotNull(message = "审核人员ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long auditorUid;
/**
* 审核时间
*/
@NotNull(message = "审核时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date auditorTime;
/**
* 最后操作人员ID
*/
@NotNull(message = "最后操作人员ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long lastUid;
/**
* 最后操作时间
*/
@NotNull(message = "最后操作时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date lastTime;
/**
* 作废原因
*/
@NotBlank(message = "作废原因不能为空", groups = { AddGroup.class, EditGroup.class })
private String reason;
/**
* 是否含税0 1
*/
@NotNull(message = "是否含税0 否1 是不能为空", groups = { AddGroup.class, EditGroup.class })
private Long isTax;
/**
* 采购单状态-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废
*/
@NotNull(message = "采购单状态:-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废不能为空", groups = { AddGroup.class, EditGroup.class })
private Long status;
/**
* 状态说明
*/
@NotBlank(message = "状态说明不能为空", groups = { AddGroup.class, EditGroup.class })
private String statusText;
/**
* 支付状态说明
*/
@NotBlank(message = "支付状态说明不能为空", groups = { AddGroup.class, EditGroup.class })
private String payStatusText;
/**
* 到货状态1 未到货, 2 部分到货, 3 全部到货
*/
@NotNull(message = "到货状态1 未到货, 2 部分到货, 3 全部到货不能为空", groups = { AddGroup.class, EditGroup.class })
private Long statusShipped;
/**
* 到货状态说明
*/
@NotBlank(message = "到货状态说明不能为空", groups = { AddGroup.class, EditGroup.class })
private String statusShippedText;
/**
* 货物总价
*/
@NotNull(message = "货物总价不能为空", groups = { AddGroup.class, EditGroup.class })
private Long amountTotal;
/**
* 总金额
*/
@NotNull(message = "总金额不能为空", groups = { AddGroup.class, EditGroup.class })
private Long totalPrice;
/**
* 币种符号
*/
@NotBlank(message = "币种符号不能为空", groups = { AddGroup.class, EditGroup.class })
private String icon;
/**
* 付款状态0 未申请, 1 已申请, 2 部分付款, 3 已付款
*/
@NotNull(message = "付款状态0 未申请, 1 已申请, 2 部分付款, 3 已付款不能为空", groups = { AddGroup.class, EditGroup.class })
private Long payStatus;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 其他费用
*/
@NotNull(message = "其他费用不能为空", groups = { AddGroup.class, EditGroup.class })
private Long otherFee;
/**
* 其他费用币种
*/
@NotBlank(message = "其他费用币种不能为空", groups = { AddGroup.class, EditGroup.class })
private String otherCurrency;
/**
* 费用分摊方式0 不分摊, 1 按金额, 2 按数量
*/
@NotNull(message = "费用分摊方式0 不分摊, 1 按金额, 2 按数量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long feePartType;
/**
* 运费
*/
@NotNull(message = "运费不能为空", groups = { AddGroup.class, EditGroup.class })
private Long shippingPrice;
/**
* 运费币种
*/
@NotBlank(message = "运费币种不能为空", groups = { AddGroup.class, EditGroup.class })
private String shippingCurrency;
/**
* 采购币种
*/
@NotBlank(message = "采购币种不能为空", groups = { AddGroup.class, EditGroup.class })
private String purchaseCurrency;
/**
* 采购汇率
*/
@NotNull(message = "采购汇率不能为空", groups = { AddGroup.class, EditGroup.class })
private Long purchaseRate;
/**
* 采购总量
*/
@NotNull(message = "采购总量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityTotal;
/**
* 仓库ID
*/
@NotNull(message = "仓库ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long wid;
/**
* 仓库名称
*/
@NotBlank(message = "仓库名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String wareHouseName;
/**
* 仓库名(备份)
*/
@NotBlank(message = "仓库名(备份)不能为空", groups = { AddGroup.class, EditGroup.class })
private String wareHouseBakName;
/**
* 入库量
*/
@NotNull(message = "入库量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityEntry;
/**
* 实际采购量
*/
@NotNull(message = "实际采购量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityReal;
/**
* 待到货量
*/
@NotNull(message = "待到货量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityReceive;
/**
* 采购方ID
*/
@NotNull(message = "采购方ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long purchaserId;
/**
* 联系人
*/
@NotBlank(message = "联系人不能为空", groups = { AddGroup.class, EditGroup.class })
private String contactPerson;
/**
* 联系方式
*/
@NotBlank(message = "联系方式不能为空", groups = { AddGroup.class, EditGroup.class })
private String contactNumber;
/**
* 结算方式7 现结, 8 月结
*/
@NotNull(message = "结算方式7 现结, 8 月结不能为空", groups = { AddGroup.class, EditGroup.class })
private Long settlementMethod;
/**
* 结算描述
*/
@NotBlank(message = "结算描述不能为空", groups = { AddGroup.class, EditGroup.class })
private String settlementDescription;
/**
* 支付方式
*/
@NotNull(message = "支付方式不能为空", groups = { AddGroup.class, EditGroup.class })
private Long paymentMethod;
/**
* 交货天数
*/
@NotNull(message = "交货天数不能为空", groups = { AddGroup.class, EditGroup.class })
private Long estDlvDays;
/**
* 订单状态
*/
@NotBlank(message = "订单状态不能为空", groups = { AddGroup.class, EditGroup.class })
private String orderStatus;
/**
* 交货时间
*/
@NotNull(message = "交货时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date deliveryTime;
/**
* 订单交付变动天数
*/
@NotNull(message = "订单交付变动天数不能为空", groups = { AddGroup.class, EditGroup.class })
private Long dlvTimeVar;
}

View File

@ -0,0 +1,200 @@
package org.asinkj.amz.domain.bo;
import org.asinkj.amz.domain.BizPurchaseOrderItem;
import org.asinkj.common.mybatis.core.domain.BaseEntity;
import org.asinkj.common.core.validate.AddGroup;
import org.asinkj.common.core.validate.EditGroup;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import lombok.EqualsAndHashCode;
import jakarta.validation.constraints.*;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
/**
* 供应商订单产品明细业务对象 biz_purchase_order_item
*
* @author shuo hu
* @date 2025-05-10
*/
@Data
@EqualsAndHashCode(callSuper = true)
@AutoMapper(target = BizPurchaseOrderItem.class, reverseConvertGenerate = false)
public class BizPurchaseOrderItemBo extends BaseEntity {
/**
* 采购单子项ID
*/
@NotNull(message = "采购单子项ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long id;
/**
* 关联采购单号
*/
@NotBlank(message = "关联采购单号不能为空", groups = { AddGroup.class, EditGroup.class })
private String orderSn;
/**
* 仓库ID
*/
@NotNull(message = "仓库ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long wid;
/**
* 仓库名称
*/
@NotBlank(message = "仓库名称不能为空", groups = { AddGroup.class, EditGroup.class })
private String wareHouseName;
/**
* 采购计划号
*/
@NotBlank(message = "采购计划号不能为空", groups = { AddGroup.class, EditGroup.class })
private String planSn;
/**
* 本地产品ID
*/
@NotNull(message = "本地产品ID不能为空", groups = { AddGroup.class, EditGroup.class })
private Long productId;
/**
* 品名
*/
@NotBlank(message = "品名不能为空", groups = { AddGroup.class, EditGroup.class })
private String productName;
/**
* SKU
*/
@NotBlank(message = "SKU不能为空", groups = { AddGroup.class, EditGroup.class })
private String sku;
/**
* FNSKU
*/
@NotBlank(message = "FNSKU不能为空", groups = { AddGroup.class, EditGroup.class })
private String fnsku;
/**
* 店铺ID
*/
@NotBlank(message = "店铺ID不能为空", groups = { AddGroup.class, EditGroup.class })
private String sid;
/**
* 型号
*/
@NotBlank(message = "型号不能为空", groups = { AddGroup.class, EditGroup.class })
private String model;
/**
* 含税单价
*/
@NotNull(message = "含税单价不能为空", groups = { AddGroup.class, EditGroup.class })
private Long price;
/**
* 价税合计
*/
@NotNull(message = "价税合计不能为空", groups = { AddGroup.class, EditGroup.class })
private Long amount;
/**
* 计划采购量
*/
@NotNull(message = "计划采购量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityPlan;
/**
* 实际采购量
*/
@NotNull(message = "实际采购量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityReal;
/**
* 到货入库量
*/
@NotNull(message = "到货入库量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityEntry;
/**
* 待到货量
*/
@NotNull(message = "待到货量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityReceive;
/**
* 退货数
*/
@NotNull(message = "退货数不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityReturn;
/**
* 换货量
*/
@NotNull(message = "换货量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityExchange;
/**
* 质检量
*/
@NotNull(message = "质检量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityQc;
/**
* 待质检量
*/
@NotNull(message = "待质检量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityQcPrepare;
/**
* 期待到货时间
*/
@NotNull(message = "期待到货时间不能为空", groups = { AddGroup.class, EditGroup.class })
private Date expectArriveTime;
/**
* 备注
*/
@NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
private String remark;
/**
* 箱数
*/
@NotNull(message = "箱数不能为空", groups = { AddGroup.class, EditGroup.class })
private Long casesNum;
/**
* 单箱数量
*/
@NotNull(message = "单箱数量不能为空", groups = { AddGroup.class, EditGroup.class })
private Long quantityPerCase;
/**
* 是否删除0 1
*/
@NotNull(message = "是否删除0 否1 是不能为空", groups = { AddGroup.class, EditGroup.class })
private Long isDelete;
/**
* 税率
*/
@NotBlank(message = "税率不能为空", groups = { AddGroup.class, EditGroup.class })
private String taxRate;
/**
* SPU
*/
@NotBlank(message = "SPU不能为空", groups = { AddGroup.class, EditGroup.class })
private String spu;
/**
* 款名
*/
@NotBlank(message = "款名不能为空", groups = { AddGroup.class, EditGroup.class })
private String spuName;
}

View File

@ -13,7 +13,9 @@ import jakarta.validation.constraints.*;
import java.math.BigDecimal;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;
/**
* 货件计划业务对象 biz_shipment_plan
@ -29,7 +31,7 @@ public class BizShipmentPlanBo extends BaseEntity {
/**
* 主键ID
*/
@NotNull(message = "主键ID不能为空", groups = { AddGroup.class, EditGroup.class })
@NotNull(message = "主键ID不能为空", groups = {AddGroup.class, EditGroup.class})
private Long id;
/**
@ -90,6 +92,7 @@ public class BizShipmentPlanBo extends BaseEntity {
* 创建时间
*/
// @NotNull(message = "创建时间不能为空", groups = { AddGroup.class, EditGroup.class })
@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date gmtCreate;
/**
@ -185,7 +188,7 @@ public class BizShipmentPlanBo extends BaseEntity {
/**
* 物流渠道
*/
// @NotBlank(message = "物流渠道不能为空", groups = { AddGroup.class, EditGroup.class })
// @NotBlank(message = "物流渠道不能为空", groups = { AddGroup.class, EditGroup.class })
private String channelName;
}

View File

@ -69,21 +69,21 @@ public class BizLogisticsOrderDetailVo implements Serializable {
/**
* 物流商ID冗余存储
*/
@ExcelProperty(value = "物流商ID")
// @ExcelProperty(value = "物流商ID")
// @ExcelDictFormat(readConverterExp = "冗=余存储")
private Long logisticsProviderId;
/**
* 物流商名称冗余存储
*/
@ExcelProperty(value = "物流商名称")
// @ExcelProperty(value = "物流商名称")
// @ExcelDictFormat(readConverterExp = "冗=余存储")
private String logisticsProviderName;
/**
* 物流渠道与主表一致
*/
@ExcelProperty(value = "物流渠道")
// @ExcelProperty(value = "物流渠道")
// @ExcelDictFormat(readConverterExp = "与=主表一致")
private String logisticsChannel;
@ -97,14 +97,14 @@ public class BizLogisticsOrderDetailVo implements Serializable {
/**
* 计划数量该箱子预计装载的商品数量
*/
@ExcelProperty(value = "计划数量")
// @ExcelProperty(value = "计划数量")
// @ExcelDictFormat(readConverterExp = "该=箱子预计装载的商品数量")
private Long plannedQuantity;
/**
* 实际货件数量该箱子实际装载的商品数量
*/
@ExcelProperty(value = "实际货件数量")
@ExcelProperty(value = "数量")
// @ExcelDictFormat(readConverterExp = "该=箱子实际装载的商品数量")
private Long shipmentQuantity;
@ -118,7 +118,7 @@ public class BizLogisticsOrderDetailVo implements Serializable {
/**
* 供应商称重单位KG由供应商提供
*/
@ExcelProperty(value = "供应商称重")
// @ExcelProperty(value = "供应商称重")
// @ExcelDictFormat(readConverterExp = "单=位KG由供应商提供")
private Long supplierWeight;
@ -132,49 +132,49 @@ public class BizLogisticsOrderDetailVo implements Serializable {
/**
* 称重差异应用层计算物流商计重 - 供应商称重
*/
@ExcelProperty(value = "称重差异")
// @ExcelProperty(value = "称重差异")
// @ExcelDictFormat(readConverterExp = "应=用层计算:物流商计重,-=,供=应商称重")
private Long weightDiff;
/**
* 物流单价单位/KG由合同或报价确定
*/
@ExcelProperty(value = "物流单价")
// @ExcelProperty(value = "物流单价")
// @ExcelDictFormat(readConverterExp = "单=位:元/KG由合同或报价确定")
private Long pricePerKg;
/**
* 物流计价重量应用层根据业务规则计算
*/
@ExcelProperty(value = "物流计价重量")
// @ExcelProperty(value = "物流计价重量")
// @ExcelDictFormat(readConverterExp = "应=用层根据业务规则计算")
private Long logisticsCalculationPrice;
/**
* 其他物流费用如报关费保险费等
*/
@ExcelProperty(value = "其他物流费用")
// @ExcelProperty(value = "其他物流费用")
// @ExcelDictFormat(readConverterExp = "如=报关费、保险费等")
private Long otherFee;
/**
* 费用合计应用层计算物流计价 + 其他费用
*/
@ExcelProperty(value = "费用合计")
// @ExcelProperty(value = "费用合计")
// @ExcelDictFormat(readConverterExp = "应=用层计算:物流计价,+=,其=他费用")
private Long totalFee;
/**
* 物流状态pending:待发运/in_transit:运输中/delivered:已签收
*/
@ExcelProperty(value = "物流状态")
// @ExcelDictFormat(readConverterExp = "pending=待发运,in_transit=运输中,delivered=已签收")
@ExcelProperty(value = "物流状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "biz_logistics_status")
private String logisticsStatus;
/**
* 预计签收日期物流商提供的预估日期
*/
@ExcelProperty(value = "预计签收日期")
// @ExcelProperty(value = "预计签收日期")
// @ExcelDictFormat(readConverterExp = "物=流商提供的预估日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date estimatedDeliveryDate;
@ -190,7 +190,7 @@ public class BizLogisticsOrderDetailVo implements Serializable {
/**
* 运输时效单位实际签收日期 - 发货日期
*/
@ExcelProperty(value = "运输时效")
// @ExcelProperty(value = "运输时效")
// @ExcelDictFormat(readConverterExp = "单=位:天,实际签收日期,-=,发=货日期")
private Long timeliness;
@ -198,55 +198,55 @@ public class BizLogisticsOrderDetailVo implements Serializable {
/**
* 物流商确认接收时间
*/
@ExcelProperty(value = "物流商确认接收时间")
// @ExcelProperty(value = "物流商确认接收时间")
private Date carrierConfirmTime;
/**
* 已提货时间
*/
@ExcelProperty(value = "物流商已提货时间")
// @ExcelProperty(value = "物流商已提货时间")
private Date goodsReceiptTime;
/**
* 转运开始时间
*/
@ExcelProperty(value = "转运开始时间")
// @ExcelProperty(value = "转运开始时间")
private Date transferStartTime;
/**
* 最终签收时间
*/
@ExcelProperty(value = "最终签收时间")
// @ExcelProperty(value = "最终签收时间")
private Date signedTime;
/**
* 排仓时间
*/
@ExcelProperty(value = "排仓时间")
// @ExcelProperty(value = "排仓时间")
private Date scheduleTime;
/**
* 船舶离港时间
*/
@ExcelProperty(value = "船舶离港时间")
// @ExcelProperty(value = "船舶离港时间")
private Date vesselDepartTime;
/**
* 目的港到达时间
*/
@ExcelProperty(value = "目的港到达时间")
// @ExcelProperty(value = "目的港到达时间")
private Date portArrivalTime;
/**
* 查验开始时间
*/
@ExcelProperty(value = "查验开始时间")
// @ExcelProperty(value = "查验开始时间")
private Date inspectionTime;
/**
* 末端提取时间
*/
@ExcelProperty(value = "末端提取时间")
// @ExcelProperty(value = "末端提取时间")
private Date deliveryPickupTime;

View File

@ -0,0 +1,208 @@
package org.asinkj.amz.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.asinkj.amz.domain.BizPurchaseOrderItem;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.asinkj.common.excel.annotation.ExcelDictFormat;
import org.asinkj.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 供应商订单产品明细视图对象 biz_purchase_order_item
*
* @author shuo hu
* @date 2025-05-10
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BizPurchaseOrderItem.class)
public class BizPurchaseOrderItemVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 采购单子项ID
*/
@ExcelProperty(value = "采购单子项ID")
private Long id;
/**
* 关联采购单号
*/
@ExcelProperty(value = "关联采购单号")
private String orderSn;
/**
* 仓库ID
*/
@ExcelProperty(value = "仓库ID")
private Long wid;
/**
* 仓库名称
*/
@ExcelProperty(value = "仓库名称")
private String wareHouseName;
/**
* 采购计划号
*/
@ExcelProperty(value = "采购计划号")
private String planSn;
/**
* 本地产品ID
*/
@ExcelProperty(value = "本地产品ID")
private Long productId;
/**
* 品名
*/
@ExcelProperty(value = "品名")
private String productName;
/**
* SKU
*/
@ExcelProperty(value = "SKU")
private String sku;
/**
* FNSKU
*/
@ExcelProperty(value = "FNSKU")
private String fnsku;
/**
* 店铺ID
*/
@ExcelProperty(value = "店铺ID")
private String sid;
/**
* 型号
*/
@ExcelProperty(value = "型号")
private String model;
/**
* 含税单价
*/
@ExcelProperty(value = "含税单价")
private Long price;
/**
* 价税合计
*/
@ExcelProperty(value = "价税合计")
private Long amount;
/**
* 计划采购量
*/
@ExcelProperty(value = "计划采购量")
private Long quantityPlan;
/**
* 实际采购量
*/
@ExcelProperty(value = "实际采购量")
private Long quantityReal;
/**
* 到货入库量
*/
@ExcelProperty(value = "到货入库量")
private Long quantityEntry;
/**
* 待到货量
*/
@ExcelProperty(value = "待到货量")
private Long quantityReceive;
/**
* 退货数
*/
@ExcelProperty(value = "退货数")
private Long quantityReturn;
/**
* 换货量
*/
@ExcelProperty(value = "换货量")
private Long quantityExchange;
/**
* 质检量
*/
@ExcelProperty(value = "质检量")
private Long quantityQc;
/**
* 待质检量
*/
@ExcelProperty(value = "待质检量")
private Long quantityQcPrepare;
/**
* 期待到货时间
*/
@ExcelProperty(value = "期待到货时间")
private Date expectArriveTime;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 箱数
*/
@ExcelProperty(value = "箱数")
private Long casesNum;
/**
* 单箱数量
*/
@ExcelProperty(value = "单箱数量")
private Long quantityPerCase;
/**
* 是否删除0 1
*/
@ExcelProperty(value = "是否删除0 否1 是")
private Long isDelete;
/**
* 税率
*/
@ExcelProperty(value = "税率")
private String taxRate;
/**
* SPU
*/
@ExcelProperty(value = "SPU")
private String spu;
/**
* 款名
*/
@ExcelProperty(value = "款名")
private String spuName;
}

View File

@ -0,0 +1,336 @@
package org.asinkj.amz.domain.vo;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.asinkj.amz.domain.BizPurchaseOrder;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import org.asinkj.common.excel.annotation.ExcelDictFormat;
import org.asinkj.common.excel.convert.ExcelDictConvert;
import io.github.linpeilie.annotations.AutoMapper;
import lombok.Data;
import java.io.Serial;
import java.io.Serializable;
import java.util.Date;
/**
* 采购单主视图对象 biz_purchase_order
*
* @author shuo hu
* @date 2025-05-10
*/
@Data
@ExcelIgnoreUnannotated
@AutoMapper(target = BizPurchaseOrder.class)
public class BizPurchaseOrderVo implements Serializable {
@Serial
private static final long serialVersionUID = 1L;
/**
* 采购单号
*/
@ExcelProperty(value = "采购单号")
private String orderSn;
/**
* 自定义单号
*/
@ExcelProperty(value = "自定义单号")
private String customOrderSn;
/**
* 供应商ID
*/
@ExcelProperty(value = "供应商ID")
private Long supplierId;
/**
* 供应商名称
*/
@ExcelProperty(value = "供应商名称")
private String supplierName;
/**
* 采购员ID
*/
@ExcelProperty(value = "采购员ID")
private Long optUid;
/**
* 审核人姓名
*/
@ExcelProperty(value = "审核人姓名")
private String auditorRealname;
/**
* 操作人姓名
*/
@ExcelProperty(value = "操作人姓名")
private String optRealname;
/**
* 最后操作人姓名
*/
@ExcelProperty(value = "最后操作人姓名")
private String lastRealname;
/**
* 下单时间
*/
@ExcelProperty(value = "下单时间")
private Date orderTime;
/**
* 应付货款手工
*/
@ExcelProperty(value = "应付货款", converter = ExcelDictConvert.class)
@ExcelDictFormat(readConverterExp = "手=工")
private String payment;
/**
* 审核人员ID
*/
@ExcelProperty(value = "审核人员ID")
private Long auditorUid;
/**
* 审核时间
*/
@ExcelProperty(value = "审核时间")
private Date auditorTime;
/**
* 最后操作人员ID
*/
@ExcelProperty(value = "最后操作人员ID")
private Long lastUid;
/**
* 最后操作时间
*/
@ExcelProperty(value = "最后操作时间")
private Date lastTime;
/**
* 作废原因
*/
@ExcelProperty(value = "作废原因")
private String reason;
/**
* 是否含税0 1
*/
@ExcelProperty(value = "是否含税0 否1 是")
private Long isTax;
/**
* 采购单状态-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废
*/
@ExcelProperty(value = "采购单状态:-1 作废, 3 待提交, 1 待下单, 2 待签收, 9 完成, 121 待审核, 122 驳回, 124 作废")
private Long status;
/**
* 状态说明
*/
@ExcelProperty(value = "状态说明")
private String statusText;
/**
* 支付状态说明
*/
@ExcelProperty(value = "支付状态说明")
private String payStatusText;
/**
* 到货状态1 未到货, 2 部分到货, 3 全部到货
*/
@ExcelProperty(value = "到货状态1 未到货, 2 部分到货, 3 全部到货")
private Long statusShipped;
/**
* 到货状态说明
*/
@ExcelProperty(value = "到货状态说明")
private String statusShippedText;
/**
* 货物总价
*/
@ExcelProperty(value = "货物总价")
private Long amountTotal;
/**
* 总金额
*/
@ExcelProperty(value = "总金额")
private Long totalPrice;
/**
* 币种符号
*/
@ExcelProperty(value = "币种符号")
private String icon;
/**
* 付款状态0 未申请, 1 已申请, 2 部分付款, 3 已付款
*/
@ExcelProperty(value = "付款状态0 未申请, 1 已申请, 2 部分付款, 3 已付款")
private Long payStatus;
/**
* 备注
*/
@ExcelProperty(value = "备注")
private String remark;
/**
* 其他费用
*/
@ExcelProperty(value = "其他费用")
private Long otherFee;
/**
* 其他费用币种
*/
@ExcelProperty(value = "其他费用币种")
private String otherCurrency;
/**
* 费用分摊方式0 不分摊, 1 按金额, 2 按数量
*/
@ExcelProperty(value = "费用分摊方式0 不分摊, 1 按金额, 2 按数量")
private Long feePartType;
/**
* 运费
*/
@ExcelProperty(value = "运费")
private Long shippingPrice;
/**
* 运费币种
*/
@ExcelProperty(value = "运费币种")
private String shippingCurrency;
/**
* 采购币种
*/
@ExcelProperty(value = "采购币种")
private String purchaseCurrency;
/**
* 采购汇率
*/
@ExcelProperty(value = "采购汇率")
private Long purchaseRate;
/**
* 采购总量
*/
@ExcelProperty(value = "采购总量")
private Long quantityTotal;
/**
* 仓库ID
*/
@ExcelProperty(value = "仓库ID")
private Long wid;
/**
* 仓库名称
*/
@ExcelProperty(value = "仓库名称")
private String wareHouseName;
/**
* 仓库名(备份)
*/
@ExcelProperty(value = "仓库名(备份)")
private String wareHouseBakName;
/**
* 入库量
*/
@ExcelProperty(value = "入库量")
private Long quantityEntry;
/**
* 实际采购量
*/
@ExcelProperty(value = "实际采购量")
private Long quantityReal;
/**
* 待到货量
*/
@ExcelProperty(value = "待到货量")
private Long quantityReceive;
/**
* 采购方ID
*/
@ExcelProperty(value = "采购方ID")
private Long purchaserId;
/**
* 联系人
*/
@ExcelProperty(value = "联系人")
private String contactPerson;
/**
* 联系方式
*/
@ExcelProperty(value = "联系方式")
private String contactNumber;
/**
* 结算方式7 现结, 8 月结
*/
@ExcelProperty(value = "结算方式7 现结, 8 月结")
private Long settlementMethod;
/**
* 结算描述
*/
@ExcelProperty(value = "结算描述")
private String settlementDescription;
/**
* 支付方式
*/
@ExcelProperty(value = "支付方式")
private Long paymentMethod;
/**
* 交货天数
*/
@ExcelProperty(value = "交货天数")
private Long estDlvDays;
/**
* 订单状态
*/
@ExcelProperty(value = "订单状态", converter = ExcelDictConvert.class)
@ExcelDictFormat(dictType = "vendor_order_status")
private String orderStatus;
/**
* 交货时间
*/
@ExcelProperty(value = "交货时间")
private Date deliveryTime;
/**
* 订单交付变动天数
*/
@ExcelProperty(value = "订单交付变动天数")
private Long dlvTimeVar;
}

View File

@ -3,6 +3,7 @@ package org.asinkj.amz.dubbo;
import lombok.RequiredArgsConstructor;
import org.apache.dubbo.config.annotation.DubboService;
import org.asinkj.amz.api.RemoteFBADataService;
import org.asinkj.amz.service.IBizInquiryRequestService;
import org.asinkj.amz.service.ISysAmazonStoreService;
import org.asinkj.amz.service.LingxinCallback;
import org.springframework.stereotype.Service;
@ -17,10 +18,29 @@ public class RemoteFBADataServiceImpl implements RemoteFBADataService {
@Resource
private ISysAmazonStoreService sysAmazonStoreService;
@Resource
private IBizInquiryRequestService ibizInquiryRequestService;
@Override
public void pullAmzFbaDataToken(String startDate, String endDate) throws Exception {
sysAmazonStoreService.pullAmzStaData(startDate, endDate, (result, status) -> {
});
}
@Override
public void updateAmzFbaDataToken() throws Exception {
sysAmazonStoreService.updateAmzFBAData(new LingxinCallback() {
@Override
public void onFinished(String result, int status) {
}
});
}
@Override
public void quoteReminder() throws Exception {
ibizInquiryRequestService.quoteReminder();
}
}

View File

@ -1,11 +1,14 @@
package org.asinkj.amz.mapper;
import jakarta.validation.constraints.Size;
import org.apache.ibatis.annotations.Param;
import org.asinkj.amz.domain.BizLogisticsQuote;
import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDate;
import java.util.Date;
import java.util.List;
import java.util.Map;
@ -25,4 +28,13 @@ public interface BizLogisticsQuoteMapper extends BaseMapperPlus<BizLogisticsQuot
List<Map<String, Object>> selectDynamicReport(@Param("channels") List<String> channels);
List<Map<String, Object>> getQuoteReport( @Param("columns") List<String> channels,
@Param("startDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date startDate,
@Param("endDate") @DateTimeFormat(pattern = "yyyy-MM-dd") Date endDate,
@Param("destination") @Size(max = 10) String destination);
List<Map<String, Object>> getQuoteAvgDayReport(@Param("columns") List<String> channels);
}

View File

@ -0,0 +1,15 @@
package org.asinkj.amz.mapper;
import org.asinkj.amz.domain.BizPurchaseOrderItem;
import org.asinkj.amz.domain.vo.BizPurchaseOrderItemVo;
import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 供应商订单产品明细Mapper接口
*
* @author shuo hu
* @date 2025-05-10
*/
public interface BizPurchaseOrderItemMapper extends BaseMapperPlus<BizPurchaseOrderItem, BizPurchaseOrderItemVo> {
}

View File

@ -0,0 +1,15 @@
package org.asinkj.amz.mapper;
import org.asinkj.amz.domain.BizPurchaseOrder;
import org.asinkj.amz.domain.vo.BizPurchaseOrderVo;
import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
/**
* 采购单主Mapper接口
*
* @author shuo hu
* @date 2025-05-10
*/
public interface BizPurchaseOrderMapper extends BaseMapperPlus<BizPurchaseOrder, BizPurchaseOrderVo> {
}

View File

@ -3,6 +3,7 @@ package org.asinkj.amz.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.asinkj.amz.domain.BizShipmentPlan;
import org.asinkj.amz.domain.BizShipmentPlanFileData;
import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
@ -20,4 +21,5 @@ public interface BizShipmentPlanMapper extends BaseMapperPlus<BizShipmentPlan, B
List<String> selectExistingShipmentIds(@Param("batchIds") Collection<String> batchIds);
void updateByFbaShipmentId(List<BizShipmentPlanFileData> bizShipmentPlanFileDataList);
}

View File

@ -9,6 +9,7 @@ import org.asinkj.common.core.domain.R;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
@ -76,4 +77,6 @@ public interface IBizInquiryRequestService {
R<String> batchCreateWithItems(List<InquiryRequestItemVo> items);
TableDataInfo<BizInquiryRequestVo> queryWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date);
void quoteReminder();
}

View File

@ -71,4 +71,7 @@ public interface IBizLogisticsOrderService {
void createByBo(BizLogisticsCreateOrderBo bo);
void updateByOrderId(BizLogisticsOrderBo bizLogisticsOrderBo);
List<BizLogisticsOrder> selectOrdersByUserId();
}

View File

@ -4,6 +4,7 @@ import cn.hutool.core.lang.Opt;
import jakarta.validation.constraints.NotNull;
import org.asinkj.amz.domain.BizLogisticsQuote;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteMostBo;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteReportBo;
import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteBo;
import org.asinkj.amz.domain.vo.InquiryQuoteStatusDTO;
@ -32,7 +33,9 @@ public interface IBizLogisticsQuoteService {
*/
BizLogisticsQuoteVo queryById(Long id);
List<Map<String, Object>> generateReport();
List<Map<String, Object>> generateReport(BizLogisticsQuoteReportBo bo);
List<Map<String, Object>> getQuoteAvgDayReport();
/**
* 分页查询物流报价列表

View File

@ -0,0 +1,69 @@
package org.asinkj.amz.service;
import org.asinkj.amz.domain.BizPurchaseOrderItem;
import org.asinkj.amz.domain.vo.BizPurchaseOrderItemVo;
import org.asinkj.amz.domain.bo.BizPurchaseOrderItemBo;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 供应商订单产品明细Service接口
*
* @author shuo hu
* @date 2025-05-10
*/
public interface IBizPurchaseOrderItemService {
/**
* 查询供应商订单产品明细
*
* @param id 主键
* @return 供应商订单产品明细
*/
BizPurchaseOrderItemVo queryById(Long id);
/**
* 分页查询供应商订单产品明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 供应商订单产品明细分页列表
*/
TableDataInfo<BizPurchaseOrderItemVo> queryPageList(BizPurchaseOrderItemBo bo, PageQuery pageQuery);
/**
* 查询符合条件的供应商订单产品明细列表
*
* @param bo 查询条件
* @return 供应商订单产品明细列表
*/
List<BizPurchaseOrderItemVo> queryList(BizPurchaseOrderItemBo bo);
/**
* 新增供应商订单产品明细
*
* @param bo 供应商订单产品明细
* @return 是否新增成功
*/
Boolean insertByBo(BizPurchaseOrderItemBo bo);
/**
* 修改供应商订单产品明细
*
* @param bo 供应商订单产品明细
* @return 是否修改成功
*/
Boolean updateByBo(BizPurchaseOrderItemBo bo);
/**
* 校验并批量删除供应商订单产品明细信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@ -0,0 +1,69 @@
package org.asinkj.amz.service;
import org.asinkj.amz.domain.BizPurchaseOrder;
import org.asinkj.amz.domain.vo.BizPurchaseOrderVo;
import org.asinkj.amz.domain.bo.BizPurchaseOrderBo;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 采购单主Service接口
*
* @author shuo hu
* @date 2025-05-10
*/
public interface IBizPurchaseOrderService {
/**
* 查询采购单主
*
* @param orderSn 主键
* @return 采购单主
*/
BizPurchaseOrderVo queryById(String orderSn);
/**
* 分页查询采购单主列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 采购单主分页列表
*/
TableDataInfo<BizPurchaseOrderVo> queryPageList(BizPurchaseOrderBo bo, PageQuery pageQuery);
/**
* 查询符合条件的采购单主列表
*
* @param bo 查询条件
* @return 采购单主列表
*/
List<BizPurchaseOrderVo> queryList(BizPurchaseOrderBo bo);
/**
* 新增采购单主
*
* @param bo 采购单主
* @return 是否新增成功
*/
Boolean insertByBo(BizPurchaseOrderBo bo);
/**
* 修改采购单主
*
* @param bo 采购单主
* @return 是否修改成功
*/
Boolean updateByBo(BizPurchaseOrderBo bo);
/**
* 校验并批量删除采购单主信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@ -9,6 +9,7 @@ import org.asinkj.amz.domain.bo.BizShipmentPlanBo;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import java.io.InputStream;
import java.util.Collection;
import java.util.List;
@ -81,4 +82,6 @@ public interface IBizShipmentPlanService {
void updateStatusbyFbaShipmentIds(List<String> fbaShipmentids);
void updateList(Collection<String> list, String status);
void importExcel(InputStream inputStream);
}

View File

@ -76,7 +76,9 @@ public interface ISysAmazonStoreService {
void pullAmzFBAData(String startDate,String endDate) throws Exception;
void updateAmzFBAData(String startDate, String endDate) throws Exception;
void updateAmzFBAData(LingxinCallback lingxinCallback) throws Exception;
void pullPurchaseOrderData(String startDate, String endDate, LingxinCallback lingxinCallback);
void pullAmzStaData(String startDate, String endDate, LingxinCallback lingxinCallback);

View File

@ -1,20 +1,28 @@
package org.asinkj.amz.service.impl;
import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.asinkj.amz.domain.BizLogisticsQuote;
import org.asinkj.amz.domain.vo.BizLogisticsChannelVo;
import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo;
import org.asinkj.amz.domain.vo.InquiryRequestItemVo;
import org.asinkj.amz.mapper.BizLogisticsQuoteMapper;
import org.asinkj.amz.service.IBizInquiryBlacklistService;
import org.asinkj.amz.service.IBizLogisticsChannelService;
import org.asinkj.amz.service.IBizShipmentPlanService;
import org.asinkj.common.core.domain.R;
import org.asinkj.common.core.exception.ServiceException;
import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.excel.utils.ExcelUtil;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -24,7 +32,9 @@ import lombok.RequiredArgsConstructor;
import org.asinkj.common.redis.annotation.DistributedLock;
import org.asinkj.common.redis.utils.RedisUtils;
import org.asinkj.common.satoken.utils.LoginHelper;
import org.asinkj.common.wp.handler.WxMessagesManager;
import org.asinkj.resource.api.RemoteMessageService;
import org.asinkj.system.api.RemoteUserService;
import org.asinkj.utils.SerialNoGenerator;
import org.redisson.api.RLock;
import org.springframework.dao.DuplicateKeyException;
@ -36,10 +46,13 @@ import org.asinkj.amz.mapper.BizInquiryRequestMapper;
import org.asinkj.amz.service.IBizInquiryRequestService;
import javax.annotation.Resource;
import java.io.InputStream;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;
import java.util.*;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors;
@ -56,6 +69,8 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
private final BizInquiryRequestMapper baseMapper;
private final ScheduledExecutorService scheduledExecutorService;
private static final AtomicInteger sequence = new AtomicInteger(0);
@ -68,7 +83,8 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
@Resource
private BizLogisticsQuoteMapper logisticsQuoteMapper;
@Resource
@DubboReference(stub = "true")
private RemoteMessageService remoteMessageService;
@Resource
@ -77,6 +93,13 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
@Resource
private IBizInquiryBlacklistService bizInquiryBlacklistService;
@DubboReference
private RemoteUserService remoteUserService;
/**
* 查询物流询价
@ -131,6 +154,12 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
lqw.eq(bo.getEffectiveEndTime() != null, BizInquiryRequest::getEffectiveEndTime, bo.getEffectiveEndTime());
List<Long> ids = bizInquiryBlacklistService.queryByUserid(LoginHelper.getUserId());
lqw.notIn(CollectionUtil.isNotEmpty(ids), BizInquiryRequest::getId, ids);
LambdaQueryWrapper<BizLogisticsQuote> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(BizLogisticsQuote::getUserId, LoginHelper.getUserId());
List<BizLogisticsQuote> bizLogisticsQuotes = logisticsQuoteMapper.selectList(queryWrapper);
Set<Long> collect = bizLogisticsQuotes.stream().map(BizLogisticsQuote::getInquiryId).collect(Collectors.toSet());
lqw.notIn(CollectionUtil.isNotEmpty(collect), BizInquiryRequest::getId, collect);
return lqw;
}
@ -234,8 +263,17 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
billingRequestMapper.insert(bizInquiryRequest);
remoteMessageService.publishMessage(LoginHelper.getUserId(), "您好,您的询价单创建成功。具体询价单号为:" + bizInquiryRequest.getInquiryNo());
// remoteMessageService.publishMessage(LoginHelper.getUserId(), "您好,您的询价单创建成功。具体询价单号为:" + bizInquiryRequest.getInquiryNo());
// Set<String> collect = remoteUserService.selectUserOpenIdsByRoleIds(List.of(3L)).stream().filter(StrUtil::isNotBlank).collect(Collectors.toSet());
// log.info("{}", collect);
// if (CollectionUtil.isNotEmpty(collect)) {
//
// scheduledExecutorService.schedule(() -> {
// WxMessagesManager.sendWechatTempMessage("有新的物流信息需要报价了",
// DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN),
// collect.toArray(new String[0]));
// }, 3, TimeUnit.SECONDS);
// }
return R.ok(bizInquiryRequest.getInquiryNo());
}
@ -400,6 +438,17 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
// String inquiryNo = bizInquiryRequests.get(0).getInquiryNo();
// remoteMessageService.publishMessage(LoginHelper.getUserId(), "询价单创建成功,单号:" + inquiryNo);
Set<String> collect = remoteUserService.selectUserOpenIdsByRoleIds(List.of(3L)).stream().filter(StrUtil::isNotBlank).collect(Collectors.toSet());
log.info("发送通知openId:{}", collect);
if (CollectionUtil.isNotEmpty(collect)) {
scheduledExecutorService.schedule(() -> {
WxMessagesManager.sendWechatTempMessage("有新的物流信息需要报价了",
DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN),
collect.toArray(new String[0]));
}, 3, TimeUnit.SECONDS);
}
return R.ok();
}
@ -444,4 +493,10 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
return TableDataInfo.build(bizInquiryRequestVos);
}
@Override
public void quoteReminder() {
}
}

View File

@ -20,8 +20,6 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.asinkj.common.satoken.utils.LoginHelper;
import org.asinkj.system.api.RemoteUserService;
import org.asinkj.system.api.model.LoginUser;
import org.asinkj.system.api.model.RoleDTO;
import org.asinkj.utils.SerialNoGenerator;
import org.springframework.stereotype.Service;
import org.asinkj.amz.domain.bo.BizLogisticsOrderBo;
@ -30,7 +28,6 @@ import org.asinkj.amz.mapper.BizLogisticsOrderMapper;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.util.*;
import java.util.stream.Collectors;
@ -306,4 +303,9 @@ public class BizLogisticsOrderServiceImpl implements IBizLogisticsOrderService {
baseMapper.update(updateWrapper);
}
@Override
public List<BizLogisticsOrder> selectOrdersByUserId() {
return baseMapper.selectOrdersByUserId(LoginHelper.getUserId());
}
}

View File

@ -3,11 +3,12 @@ package org.asinkj.amz.service.impl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.NumberUtil;
import lombok.extern.slf4j.Slf4j;
import org.asinkj.amz.domain.BizInquiryRequest;
import org.asinkj.amz.domain.BizLogisticsOrder;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteMostBo;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteReportBo;
import org.asinkj.amz.domain.vo.InquiryQuoteStatusDTO;
import org.asinkj.amz.mapper.BizInquiryRequestMapper;
import org.asinkj.amz.mapper.BizLogisticsChannelMapper;
@ -79,12 +80,25 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
@Override
public List<Map<String, Object>> generateReport() {
public List<Map<String, Object>> generateReport(BizLogisticsQuoteReportBo bo) {
// 1. 获取所有渠道名称
List<String> channels = bizLogisticsChannelMapper.listAllChannels();
// 2. 调用动态报表查询
return baseMapper.selectDynamicReport(channels);
// return baseMapper.selectDynamicReport(channels);
return baseMapper.getQuoteReport(channels,bo.getQuoteStartDate(), bo.getQuoteEndDate(),bo.getDestination());
}
@Override
public List<Map<String, Object>> getQuoteAvgDayReport() {
// 1. 获取所有渠道名称
List<String> channels = bizLogisticsChannelMapper.listAllChannels();
// 2. 调用动态报表查询
// return baseMapper.selectDynamicReport(channels);
return baseMapper.getQuoteAvgDayReport(channels);
}
/**
@ -126,6 +140,9 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
lqw.eq(StringUtils.isNotBlank(bo.getIsSubmitted()), BizLogisticsQuote::getIsSubmitted, bo.getIsSubmitted());
lqw.eq(StringUtils.isNotBlank(bo.getChannelType()), BizLogisticsQuote::getChannelType, bo.getChannelType());
lqw.eq(bo.getChannelId() != null, BizLogisticsQuote::getChannelId, bo.getChannelId());
if (!LoginHelper.isSuperAdmin() && !LoginHelper.isManagerAdmin()) {
lqw.and(wrapper -> wrapper.eq(BizLogisticsQuote::getCreateBy, LoginHelper.getUserId()).or().eq(BizLogisticsQuote::getUserId, LoginHelper.getUserId()));
}
return lqw;
}
@ -279,7 +296,6 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
LocalDate today = LocalDate.now();
List<BizInquiryRequest> inquiries = bizInquiryRequestMapper.selectOpenAndEffectiveInquiries(today);
// 2. 收集所有物流商ID
Map<Long, List<Long>> inquiryProvidersMap = new HashMap<>();
Set<Long> allProviderIds = new HashSet<>();
for (BizInquiryRequest inquiry : inquiries) {
@ -288,19 +304,16 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
allProviderIds.addAll(providerIds);
}
// 3. 查询当日报价记录即使 allProviderIds 为空也会执行
List<BizLogisticsQuote> quotes = baseMapper.selectQuotesByProvidersAndDate(
new ArrayList<>(allProviderIds), today
);
// 4. 构建报价状态映射表
Map<Pair<Long, Long>, BizLogisticsQuote> quoteMap = quotes.stream()
.collect(Collectors.toMap(
quote -> Pair.of(quote.getInquiryId(), quote.getChannelId()),
Function.identity()
));
// 5. 组合结果
List<InquiryQuoteStatusDTO> result = new ArrayList<>();
for (BizInquiryRequest inquiry : inquiries) {
List<Long> providerIds = inquiryProvidersMap.get(inquiry.getId());

View File

@ -0,0 +1,155 @@
package org.asinkj.amz.service.impl;
import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.asinkj.amz.domain.bo.BizPurchaseOrderItemBo;
import org.asinkj.amz.domain.vo.BizPurchaseOrderItemVo;
import org.asinkj.amz.domain.BizPurchaseOrderItem;
import org.asinkj.amz.mapper.BizPurchaseOrderItemMapper;
import org.asinkj.amz.service.IBizPurchaseOrderItemService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 供应商订单产品明细Service业务层处理
*
* @author shuo hu
* @date 2025-05-10
*/
@RequiredArgsConstructor
@Service
public class BizPurchaseOrderItemServiceImpl implements IBizPurchaseOrderItemService {
private final BizPurchaseOrderItemMapper baseMapper;
/**
* 查询供应商订单产品明细
*
* @param id 主键
* @return 供应商订单产品明细
*/
@Override
public BizPurchaseOrderItemVo queryById(Long id){
return baseMapper.selectVoById(id);
}
/**
* 分页查询供应商订单产品明细列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 供应商订单产品明细分页列表
*/
@Override
public TableDataInfo<BizPurchaseOrderItemVo> queryPageList(BizPurchaseOrderItemBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BizPurchaseOrderItem> lqw = buildQueryWrapper(bo);
Page<BizPurchaseOrderItemVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
/**
* 查询符合条件的供应商订单产品明细列表
*
* @param bo 查询条件
* @return 供应商订单产品明细列表
*/
@Override
public List<BizPurchaseOrderItemVo> queryList(BizPurchaseOrderItemBo bo) {
LambdaQueryWrapper<BizPurchaseOrderItem> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BizPurchaseOrderItem> buildQueryWrapper(BizPurchaseOrderItemBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BizPurchaseOrderItem> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getOrderSn()), BizPurchaseOrderItem::getOrderSn, bo.getOrderSn());
lqw.eq(bo.getWid() != null, BizPurchaseOrderItem::getWid, bo.getWid());
lqw.like(StringUtils.isNotBlank(bo.getWareHouseName()), BizPurchaseOrderItem::getWareHouseName, bo.getWareHouseName());
lqw.eq(StringUtils.isNotBlank(bo.getPlanSn()), BizPurchaseOrderItem::getPlanSn, bo.getPlanSn());
lqw.eq(bo.getProductId() != null, BizPurchaseOrderItem::getProductId, bo.getProductId());
lqw.like(StringUtils.isNotBlank(bo.getProductName()), BizPurchaseOrderItem::getProductName, bo.getProductName());
lqw.eq(StringUtils.isNotBlank(bo.getSku()), BizPurchaseOrderItem::getSku, bo.getSku());
lqw.eq(StringUtils.isNotBlank(bo.getFnsku()), BizPurchaseOrderItem::getFnsku, bo.getFnsku());
lqw.eq(StringUtils.isNotBlank(bo.getSid()), BizPurchaseOrderItem::getSid, bo.getSid());
lqw.eq(StringUtils.isNotBlank(bo.getModel()), BizPurchaseOrderItem::getModel, bo.getModel());
lqw.eq(bo.getPrice() != null, BizPurchaseOrderItem::getPrice, bo.getPrice());
lqw.eq(bo.getAmount() != null, BizPurchaseOrderItem::getAmount, bo.getAmount());
lqw.eq(bo.getQuantityPlan() != null, BizPurchaseOrderItem::getQuantityPlan, bo.getQuantityPlan());
lqw.eq(bo.getQuantityReal() != null, BizPurchaseOrderItem::getQuantityReal, bo.getQuantityReal());
lqw.eq(bo.getQuantityEntry() != null, BizPurchaseOrderItem::getQuantityEntry, bo.getQuantityEntry());
lqw.eq(bo.getQuantityReceive() != null, BizPurchaseOrderItem::getQuantityReceive, bo.getQuantityReceive());
lqw.eq(bo.getQuantityReturn() != null, BizPurchaseOrderItem::getQuantityReturn, bo.getQuantityReturn());
lqw.eq(bo.getQuantityExchange() != null, BizPurchaseOrderItem::getQuantityExchange, bo.getQuantityExchange());
lqw.eq(bo.getQuantityQc() != null, BizPurchaseOrderItem::getQuantityQc, bo.getQuantityQc());
lqw.eq(bo.getQuantityQcPrepare() != null, BizPurchaseOrderItem::getQuantityQcPrepare, bo.getQuantityQcPrepare());
lqw.eq(bo.getExpectArriveTime() != null, BizPurchaseOrderItem::getExpectArriveTime, bo.getExpectArriveTime());
lqw.eq(bo.getCasesNum() != null, BizPurchaseOrderItem::getCasesNum, bo.getCasesNum());
lqw.eq(bo.getQuantityPerCase() != null, BizPurchaseOrderItem::getQuantityPerCase, bo.getQuantityPerCase());
lqw.eq(bo.getIsDelete() != null, BizPurchaseOrderItem::getIsDelete, bo.getIsDelete());
lqw.eq(StringUtils.isNotBlank(bo.getTaxRate()), BizPurchaseOrderItem::getTaxRate, bo.getTaxRate());
lqw.eq(StringUtils.isNotBlank(bo.getSpu()), BizPurchaseOrderItem::getSpu, bo.getSpu());
lqw.like(StringUtils.isNotBlank(bo.getSpuName()), BizPurchaseOrderItem::getSpuName, bo.getSpuName());
return lqw;
}
/**
* 新增供应商订单产品明细
*
* @param bo 供应商订单产品明细
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(BizPurchaseOrderItemBo bo) {
BizPurchaseOrderItem add = MapstructUtils.convert(bo, BizPurchaseOrderItem.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
/**
* 修改供应商订单产品明细
*
* @param bo 供应商订单产品明细
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BizPurchaseOrderItemBo bo) {
BizPurchaseOrderItem update = MapstructUtils.convert(bo, BizPurchaseOrderItem.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BizPurchaseOrderItem entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除供应商订单产品明细信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -0,0 +1,189 @@
package org.asinkj.amz.service.impl;
import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.asinkj.amz.domain.bo.BizPurchaseOrderBo;
import org.asinkj.amz.domain.vo.BizPurchaseOrderVo;
import org.asinkj.amz.domain.BizPurchaseOrder;
import org.asinkj.amz.mapper.BizPurchaseOrderMapper;
import org.asinkj.amz.service.IBizPurchaseOrderService;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.Set;
import java.util.stream.Collectors;
/**
* 采购单主Service业务层处理
*
* @author shuo hu
* @date 2025-05-10
*/
@RequiredArgsConstructor
@Service
public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService {
private final BizPurchaseOrderMapper baseMapper;
// @Resource
// private MapstructUtils mapstructUtils;
/**
* 查询采购单主
*
* @param orderSn 主键
* @return 采购单主
*/
@Override
public BizPurchaseOrderVo queryById(String orderSn){
return baseMapper.selectVoById(orderSn);
}
/**
* 分页查询采购单主列表
*
* @param bo 查询条件
* @param pageQuery 分页参数
* @return 采购单主分页列表
*/
@Override
public TableDataInfo<BizPurchaseOrderVo> queryPageList(BizPurchaseOrderBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<BizPurchaseOrder> lqw = buildQueryWrapper(bo);
Page<BizPurchaseOrderVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
List<BizPurchaseOrderVo> records = result.getRecords();
Set<String> orderSnSet = records.stream().map(BizPurchaseOrderVo::getOrderSn).collect(Collectors.toSet());
for (BizPurchaseOrderVo record : records) {
}
return TableDataInfo.build(result);
}
/**
* 查询符合条件的采购单主列表
*
* @param bo 查询条件
* @return 采购单主列表
*/
@Override
public List<BizPurchaseOrderVo> queryList(BizPurchaseOrderBo bo) {
LambdaQueryWrapper<BizPurchaseOrder> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<BizPurchaseOrder> buildQueryWrapper(BizPurchaseOrderBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<BizPurchaseOrder> lqw = Wrappers.lambdaQuery();
lqw.eq(StringUtils.isNotBlank(bo.getOrderSn()), BizPurchaseOrder::getOrderSn, bo.getOrderSn());
lqw.eq(StringUtils.isNotBlank(bo.getCustomOrderSn()), BizPurchaseOrder::getCustomOrderSn, bo.getCustomOrderSn());
lqw.eq(bo.getSupplierId() != null, BizPurchaseOrder::getSupplierId, bo.getSupplierId());
lqw.like(StringUtils.isNotBlank(bo.getSupplierName()), BizPurchaseOrder::getSupplierName, bo.getSupplierName());
lqw.eq(bo.getOptUid() != null, BizPurchaseOrder::getOptUid, bo.getOptUid());
lqw.like(StringUtils.isNotBlank(bo.getAuditorRealname()), BizPurchaseOrder::getAuditorRealname, bo.getAuditorRealname());
lqw.like(StringUtils.isNotBlank(bo.getOptRealname()), BizPurchaseOrder::getOptRealname, bo.getOptRealname());
lqw.like(StringUtils.isNotBlank(bo.getLastRealname()), BizPurchaseOrder::getLastRealname, bo.getLastRealname());
lqw.eq(bo.getOrderTime() != null, BizPurchaseOrder::getOrderTime, bo.getOrderTime());
lqw.eq(StringUtils.isNotBlank(bo.getPayment()), BizPurchaseOrder::getPayment, bo.getPayment());
lqw.eq(bo.getAuditorUid() != null, BizPurchaseOrder::getAuditorUid, bo.getAuditorUid());
lqw.eq(bo.getAuditorTime() != null, BizPurchaseOrder::getAuditorTime, bo.getAuditorTime());
lqw.eq(bo.getLastUid() != null, BizPurchaseOrder::getLastUid, bo.getLastUid());
lqw.eq(bo.getLastTime() != null, BizPurchaseOrder::getLastTime, bo.getLastTime());
lqw.eq(StringUtils.isNotBlank(bo.getReason()), BizPurchaseOrder::getReason, bo.getReason());
lqw.eq(bo.getIsTax() != null, BizPurchaseOrder::getIsTax, bo.getIsTax());
lqw.eq(bo.getStatus() != null, BizPurchaseOrder::getStatus, bo.getStatus());
lqw.eq(StringUtils.isNotBlank(bo.getStatusText()), BizPurchaseOrder::getStatusText, bo.getStatusText());
lqw.eq(StringUtils.isNotBlank(bo.getPayStatusText()), BizPurchaseOrder::getPayStatusText, bo.getPayStatusText());
lqw.eq(bo.getStatusShipped() != null, BizPurchaseOrder::getStatusShipped, bo.getStatusShipped());
lqw.eq(StringUtils.isNotBlank(bo.getStatusShippedText()), BizPurchaseOrder::getStatusShippedText, bo.getStatusShippedText());
lqw.eq(bo.getAmountTotal() != null, BizPurchaseOrder::getAmountTotal, bo.getAmountTotal());
lqw.eq(bo.getTotalPrice() != null, BizPurchaseOrder::getTotalPrice, bo.getTotalPrice());
lqw.eq(StringUtils.isNotBlank(bo.getIcon()), BizPurchaseOrder::getIcon, bo.getIcon());
lqw.eq(bo.getPayStatus() != null, BizPurchaseOrder::getPayStatus, bo.getPayStatus());
lqw.eq(bo.getOtherFee() != null, BizPurchaseOrder::getOtherFee, bo.getOtherFee());
lqw.eq(StringUtils.isNotBlank(bo.getOtherCurrency()), BizPurchaseOrder::getOtherCurrency, bo.getOtherCurrency());
lqw.eq(bo.getFeePartType() != null, BizPurchaseOrder::getFeePartType, bo.getFeePartType());
lqw.eq(bo.getShippingPrice() != null, BizPurchaseOrder::getShippingPrice, bo.getShippingPrice());
lqw.eq(StringUtils.isNotBlank(bo.getShippingCurrency()), BizPurchaseOrder::getShippingCurrency, bo.getShippingCurrency());
lqw.eq(StringUtils.isNotBlank(bo.getPurchaseCurrency()), BizPurchaseOrder::getPurchaseCurrency, bo.getPurchaseCurrency());
lqw.eq(bo.getPurchaseRate() != null, BizPurchaseOrder::getPurchaseRate, bo.getPurchaseRate());
lqw.eq(bo.getQuantityTotal() != null, BizPurchaseOrder::getQuantityTotal, bo.getQuantityTotal());
lqw.eq(bo.getWid() != null, BizPurchaseOrder::getWid, bo.getWid());
lqw.like(StringUtils.isNotBlank(bo.getWareHouseName()), BizPurchaseOrder::getWareHouseName, bo.getWareHouseName());
lqw.like(StringUtils.isNotBlank(bo.getWareHouseBakName()), BizPurchaseOrder::getWareHouseBakName, bo.getWareHouseBakName());
lqw.eq(bo.getQuantityEntry() != null, BizPurchaseOrder::getQuantityEntry, bo.getQuantityEntry());
lqw.eq(bo.getQuantityReal() != null, BizPurchaseOrder::getQuantityReal, bo.getQuantityReal());
lqw.eq(bo.getQuantityReceive() != null, BizPurchaseOrder::getQuantityReceive, bo.getQuantityReceive());
lqw.eq(bo.getPurchaserId() != null, BizPurchaseOrder::getPurchaserId, bo.getPurchaserId());
lqw.eq(StringUtils.isNotBlank(bo.getContactPerson()), BizPurchaseOrder::getContactPerson, bo.getContactPerson());
lqw.eq(StringUtils.isNotBlank(bo.getContactNumber()), BizPurchaseOrder::getContactNumber, bo.getContactNumber());
lqw.eq(bo.getSettlementMethod() != null, BizPurchaseOrder::getSettlementMethod, bo.getSettlementMethod());
lqw.eq(StringUtils.isNotBlank(bo.getSettlementDescription()), BizPurchaseOrder::getSettlementDescription, bo.getSettlementDescription());
lqw.eq(bo.getPaymentMethod() != null, BizPurchaseOrder::getPaymentMethod, bo.getPaymentMethod());
lqw.eq(bo.getEstDlvDays() != null, BizPurchaseOrder::getEstDlvDays, bo.getEstDlvDays());
lqw.eq(StringUtils.isNotBlank(bo.getOrderStatus()), BizPurchaseOrder::getOrderStatus, bo.getOrderStatus());
lqw.eq(bo.getDeliveryTime() != null, BizPurchaseOrder::getDeliveryTime, bo.getDeliveryTime());
lqw.eq(bo.getDlvTimeVar() != null, BizPurchaseOrder::getDlvTimeVar, bo.getDlvTimeVar());
return lqw;
}
/**
* 新增采购单主
*
* @param bo 采购单主
* @return 是否新增成功
*/
@Override
public Boolean insertByBo(BizPurchaseOrderBo bo) {
BizPurchaseOrder add = MapstructUtils.convert(bo, BizPurchaseOrder.class);
validEntityBeforeSave(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setOrderSn(add.getOrderSn());
}
return flag;
}
/**
* 修改采购单主
*
* @param bo 采购单主
* @return 是否修改成功
*/
@Override
public Boolean updateByBo(BizPurchaseOrderBo bo) {
BizPurchaseOrder update = MapstructUtils.convert(bo, BizPurchaseOrder.class);
validEntityBeforeSave(update);
return baseMapper.updateById(update) > 0;
}
/**
* 保存前的数据校验
*/
private void validEntityBeforeSave(BizPurchaseOrder entity){
//TODO 做一些数据校验,如唯一约束
}
/**
* 校验并批量删除采购单主信息
*
* @param ids 待删除的主键集合
* @param isValid 是否进行有效性校验
* @return 是否删除成功
*/
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if(isValid){
//TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteByIds(ids) > 0;
}
}

View File

@ -4,19 +4,21 @@ import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.asinkj.amz.domain.*;
import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
import org.asinkj.amz.domain.vo.BizShipmentPlanOrderVo;
import org.asinkj.amz.domain.vo.SysAmazonStoreVo;
import org.asinkj.amz.domain.vo.*;
import org.asinkj.amz.mapper.*;
import org.asinkj.amz.service.IBizLogisticsQuoteService;
import org.asinkj.amz.service.ISysAmazonStoreService;
import org.asinkj.amz.service.LingxinCallback;
import org.asinkj.common.core.exception.ServiceException;
import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.excel.utils.ExcelUtil;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@ -27,10 +29,10 @@ import org.asinkj.common.satoken.utils.LoginHelper;
import org.asinkj.resource.api.RemoteMessageService;
import org.springframework.stereotype.Service;
import org.asinkj.amz.domain.bo.BizShipmentPlanBo;
import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
import org.asinkj.amz.service.IBizShipmentPlanService;
import javax.annotation.Resource;
import java.io.InputStream;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -61,7 +63,7 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
@Resource
private BizShipmentItemMapper bizShipmentItemMapper;
@Resource
@DubboReference(stub = "true")
private RemoteMessageService remoteMessageService;
@ -172,7 +174,11 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
lqw.eq(StringUtils.isNotBlank(bo.getShippingMode()), BizShipmentPlan::getShippingMode, bo.getShippingMode());
lqw.eq(StringUtils.isNotBlank(bo.getShippingSolution()), BizShipmentPlan::getShippingSolution, bo.getShippingSolution());
lqw.eq(bo.getGmtModified() != null, BizShipmentPlan::getGmtModified, bo.getGmtModified());
lqw.eq(bo.getGmtCreate() != null, BizShipmentPlan::getGmtCreate, bo.getGmtCreate());
// lqw.eq(bo.getGmtCreate() != null, BizShipmentPlan::getGmtCreate, bo.getGmtCreate());
if (bo.getGmtCreate() != null) {
lqw.ge(BizShipmentPlan::getGmtCreate, DateUtil.beginOfDay(bo.getGmtCreate()))
.lt(BizShipmentPlan::getGmtCreate, DateUtil.endOfDay(bo.getGmtCreate()));
}
lqw.eq(bo.getReceivingTime() != null, BizShipmentPlan::getReceivingTime, bo.getReceivingTime());
lqw.eq(bo.getStaShipmentDate() != null, BizShipmentPlan::getStaShipmentDate, bo.getStaShipmentDate());
lqw.eq(bo.getStaDeliveryStartDate() != null, BizShipmentPlan::getStaDeliveryStartDate, bo.getStaDeliveryStartDate());
@ -378,18 +384,39 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
@Override
public void updateStatusbyFbaShipmentIds(List<String> fbaShipmentids) {
LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, fbaShipmentids)
.set(BizShipmentPlan::getFbaStatus, "ask");
baseMapper.update(null,lambdaUpdateWrapper);
baseMapper.update(null, lambdaUpdateWrapper);
}
@Override
public void updateList(Collection<String> list, String status) {
LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, list)
.set(BizShipmentPlan::getFbaStatus, "send");
baseMapper.update(null,lambdaUpdateWrapper);
baseMapper.update(null, lambdaUpdateWrapper);
}
@Override
public void importExcel(InputStream inputStream) {
List<BizShipmentPlanFileData> bizShipmentPlanFileDataList = ExcelUtil.importExcel(inputStream, BizShipmentPlanFileData.class);
// checkData(bizShipmentPlanFileDataList);
log.info("导入数据条数:{}", JSONObject.toJSONString(bizShipmentPlanFileDataList));
baseMapper.updateByFbaShipmentId(bizShipmentPlanFileDataList);
}
private void checkData(List<BizShipmentPlanFileData> bizShipmentPlanFileDataList) {
boolean isAllSame = bizShipmentPlanFileDataList.stream()
.map(BizShipmentPlanFileData::getShipmentId)
.collect(Collectors.toSet())
.size() == 1;
if (!isAllSame) {
throw new ServiceException("FBA货件编号不一致请检查后重新导入");
}
}
}

View File

@ -322,6 +322,7 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
}
@Override
public void pullAmzFBAData(String startDate, String endDate) throws Exception {
@ -418,15 +419,21 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
@Override
public void updateAmzFBAData(String startDate, String endDate) throws Exception {
public void updateAmzFBAData(LingxinCallback lingxinCallback) throws Exception {
LambdaQueryWrapper<BizShipmentPlan> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(BizShipmentPlan::getShipmentStatus, "READY_TO_SHIP");
List<BizShipmentPlan> bizShipmentPlans = bizShipmentPlanMapper.selectList(lambdaQueryWrapper);
Set<String> shipmentIds = bizShipmentPlans.stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toSet());
Map<String, String> queryParam = new HashMap<>();
List<SysAmazonStore> sysAmazonStores = baseMapper.selectList();
String sids = sysAmazonStores.stream().map(item -> String.valueOf(item.getSid())).collect(Collectors.joining(","));
log.info("sids:{}", sids);
queryParam.put("sid", "153");
queryParam.put("start_date", startDate);
queryParam.put("end_date", endDate);
queryParam.put("sid", sids);
queryParam.put("start_date", DateUtil.offsetMonth(DateUtil.date(), -1).toString("yyyy-MM-dd"));
queryParam.put("end_date", DateUtil.date().toString("yyyy-MM-dd"));
// queryParam.put("shipment_id", String.join(",", shipmentIds));
queryParam.put("shipment_status", "RECEIVING");
RequestAttributes ra = RequestContextHolder.getRequestAttributes();
@ -463,24 +470,28 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
log.info("fbaShipmentApiResponse:{}", listData);
Set<String> shipmentIds = listData.stream().map(FbaShipmentApiResponse.ShipmentPlan::getShipmentId).collect(Collectors.toSet());
// 查询数据库中存在的shipmentId 使用mybatis-plus批量查询
List<BizShipmentPlan> bizShipmentPlans = bizShipmentPlanMapper.selectList(new LambdaQueryWrapper<BizShipmentPlan>().in(BizShipmentPlan::getShipmentId, shipmentIds));
Set<String> selectExistingShipmentIds = bizShipmentPlans.stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toSet());
List<BizShipmentPlan> bizShipmentPlans = bizShipmentPlanMapper.selectList(new LambdaQueryWrapper<BizShipmentPlan>().in(BizShipmentPlan::getShipmentId, shipmentIds).ne(BizShipmentPlan::getShipmentStatus, "RECEIVING"));
if (CollectionUtil.isNotEmpty(bizShipmentPlans)) {
Set<String> selectExistingShipmentIds = bizShipmentPlans.stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toSet());
listData.removeIf(shipmentPlan -> !selectExistingShipmentIds.contains(shipmentPlan.getShipmentId()));
listData.removeIf(shipmentPlan -> !selectExistingShipmentIds.contains(shipmentPlan.getShipmentId()));
Map<String, FbaShipmentApiResponse.ShipmentPlan> collect = listData.stream().collect(Collectors.toMap(FbaShipmentApiResponse.ShipmentPlan::getShipmentId, Function.identity()));
Map<String, FbaShipmentApiResponse.ShipmentPlan> collect = listData.stream().collect(Collectors.toMap(FbaShipmentApiResponse.ShipmentPlan::getShipmentId, Function.identity()));
for (BizShipmentPlan bizShipmentPlan : bizShipmentPlans) {
FbaShipmentApiResponse.ShipmentPlan shipmentPlan = collect.get(bizShipmentPlan.getShipmentId());
if (ObjectUtil.isNotEmpty(shipmentPlan)) {
bizShipmentPlan.setShipmentStatus(shipmentPlan.getShipmentStatus());
if (StrUtil.isNotEmpty(shipmentPlan.getReceivingTime())) {
bizShipmentPlan.setReceivingTime(DateUtil.parseTime(shipmentPlan.getReceivingTime()));
for (BizShipmentPlan bizShipmentPlan : bizShipmentPlans) {
FbaShipmentApiResponse.ShipmentPlan shipmentPlan = collect.get(bizShipmentPlan.getShipmentId());
if (ObjectUtil.isNotEmpty(shipmentPlan)) {
bizShipmentPlan.setShipmentStatus(shipmentPlan.getShipmentStatus());
if (StrUtil.isNotEmpty(shipmentPlan.getReceivingTime())) {
bizShipmentPlan.setReceivingTime(DateUtil.parse(shipmentPlan.getReceivingTime(), "yyyy-MM-dd HH:mm"));
}
}
}
bizShipmentPlanMapper.updateById(bizShipmentPlans);
} else {
log.info("未查询到需要更新的数据");
}
bizShipmentPlanMapper.updateById(bizShipmentPlans);
} finally {
RequestContextHolder.resetRequestAttributes();
@ -491,6 +502,44 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
}
/**
* 查询采购订单
*
* @param startDate
* @param endDate
* @param lingxinCallback
*/
@Override
public void pullPurchaseOrderData(String startDate, String endDate, LingxinCallback lingxinCallback) {
Map<String, Object> queryParam = new HashMap<>();
queryParam.put("start_date", startDate);
queryParam.put("end_date", endDate);
HttpUtil.postWithParams("/erp/sc/routing/data/local_inventory/purchaseOrderList", queryParam, new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
String string = response.body().string();
log.info("onResponse+{}", string);
JSONObject jsonObject = JSONObject.parse(string);
JSONArray data = jsonObject.getJSONArray("data");
List<PurchaseOrderResponse.OrderData> list = data.toList(PurchaseOrderResponse.OrderData.class);
log.info("list:{}", list);
}
});
}
/**
* 通过STA查询STA任务
*

View File

@ -0,0 +1,301 @@
package org.asinkj.asinking.entity;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.math.BigDecimal;
import java.util.List;
@Data
public class PurchaseOrderResponse {
private Integer code;
private String message;
@JsonProperty("error_details")
private List<Object> errorDetails;
@JsonProperty("request_id")
private String requestId;
@JsonProperty("response_time")
private String responseTime;
private List<OrderData> data;
@Data
public static class OrderData {
@JsonProperty("order_sn")
private String orderSn;
@JsonProperty("custom_order_sn")
private String customOrderSn;
@JsonProperty("supplier_id")
private Integer supplierId;
@JsonProperty("supplier_name")
private String supplierName;
@JsonProperty("opt_uid")
private Integer optUid;
@JsonProperty("auditor_realname")
private String auditorRealname;
@JsonProperty("opt_realname")
private String optRealname;
@JsonProperty("last_realname")
private String lastRealname;
@JsonProperty("create_time")
private String createTime;
@JsonProperty("order_time")
private String orderTime;
@JsonProperty("payment")
private String payment;
@JsonProperty("auditor_uid")
private Integer auditorUid;
@JsonProperty("auditor_time")
private String auditorTime;
@JsonProperty("last_uid")
private Integer lastUid;
@JsonProperty("last_time")
private String lastTime;
@JsonProperty("reason")
private String reason;
@JsonProperty("is_tax")
private Integer isTax;
@JsonProperty("status")
private Integer status;
@JsonProperty("status_text")
private String statusText;
@JsonProperty("pay_status_text")
private String payStatusText;
@JsonProperty("status_shipped")
private Integer statusShipped;
@JsonProperty("status_shipped_text")
private String statusShippedText;
@JsonProperty("amount_total")
private BigDecimal amountTotal;
@JsonProperty("total_price")
private BigDecimal totalPrice;
@JsonProperty("icon")
private String icon;
@JsonProperty("pay_status")
private Integer payStatus;
@JsonProperty("remark")
private String remark;
@JsonProperty("other_fee")
private BigDecimal otherFee;
@JsonProperty("other_currency")
private String otherCurrency;
@JsonProperty("fee_part_type")
private Integer feePartType;
@JsonProperty("shipping_price")
private BigDecimal shippingPrice;
@JsonProperty("shipping_currency")
private String shippingCurrency;
@JsonProperty("purchase_currency")
private String purchaseCurrency;
@JsonProperty("purchase_rate")
private BigDecimal purchaseRate;
@JsonProperty("quantity_total")
private BigDecimal quantityTotal;
@JsonProperty("wid")
private Integer wid;
@JsonProperty("ware_house_name")
private String wareHouseName;
@JsonProperty("ware_house_bak_name")
private String wareHouseBakName;
@JsonProperty("quantity_entry")
private Integer quantityEntry;
@JsonProperty("quantity_real")
private Integer quantityReal;
@JsonProperty("quantity_receive")
private Integer quantityReceive;
@JsonProperty("update_time")
private String updateTime;
@JsonProperty("purchaser_id")
private Integer purchaserId;
@JsonProperty("contact_person")
private String contactPerson;
@JsonProperty("contact_number")
private String contactNumber;
@JsonProperty("settlement_method")
private Integer settlementMethod;
@JsonProperty("settlement_description")
private String settlementDescription;
@JsonProperty("payment_method")
private Integer paymentMethod;
@JsonProperty("principal_uids")
private List<PrincipalUid> principalUids;
@JsonProperty("item_list")
private List<ItemListItem> itemList;
@JsonProperty("logistics_info")
private List<LogisticsInfo> logisticsInfo;
@Data
public static class PrincipalUid {
@JsonProperty("id")
private String id;
@JsonProperty("name")
private String name;
}
@Data
public static class ItemListItem {
@JsonProperty("id")
private Integer id;
@JsonProperty("wid")
private Integer wid;
@JsonProperty("ware_house_name")
private String wareHouseName;
@JsonProperty("plan_sn")
private String planSn;
@JsonProperty("product_id")
private Integer productId;
@JsonProperty("product_name")
private String productName;
@JsonProperty("sku")
private String sku;
@JsonProperty("fnsku")
private String fnsku;
@JsonProperty("sid")
private String sid;
@JsonProperty("model")
private String model;
@JsonProperty("price")
private BigDecimal price;
@JsonProperty("amount")
private BigDecimal amount;
@JsonProperty("quantity_plan")
private Integer quantityPlan;
@JsonProperty("quantity_real")
private Integer quantityReal;
@JsonProperty("quantity_entry")
private Integer quantityEntry;
@JsonProperty("quantity_receive")
private Integer quantityReceive;
@JsonProperty("quantity_return")
private Integer quantityReturn;
@JsonProperty("quantity_exchange")
private Integer quantityExchange;
@JsonProperty("quantity_qc")
private Integer quantityQc;
@JsonProperty("quantity_qc_prepare")
private Integer quantityQcPrepare;
@JsonProperty("expect_arrive_time")
private String expectArriveTime;
@JsonProperty("remark")
private String remark;
@JsonProperty("cases_num")
private Integer casesNum;
@JsonProperty("quantity_per_case")
private Integer quantityPerCase;
@JsonProperty("is_delete")
private Integer isDelete;
@JsonProperty("msku")
private List<String> msku;
@JsonProperty("attribute")
private String attribute;
@JsonProperty("tax_rate")
private String taxRate;
@JsonProperty("spu")
private String spu;
@JsonProperty("spu_name")
private String spuName;
}
@Data
public static class LogisticsInfo {
@JsonProperty("logistics_company")
private String logisticsCompany;
@JsonProperty("logistics_order_no")
private String logisticsOrderNo;
@JsonProperty("pol_id")
private String polId;
@JsonProperty("purchase_order_id")
private String purchaseOrderId;
@JsonProperty("purchase_order_sn")
private String purchaseOrderSn;
}
}
}

View File

@ -5,6 +5,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<mapper namespace="org.asinkj.amz.mapper.BizLogisticsChannelMapper">
<select id="listAllChannels" resultType="java.lang.String">
SELECT DISTINCT channel_name FROM biz_logistics_channel
SELECT DISTINCT c.channel_name FROM biz_logistics_channel c
INNER JOIN biz_logistics_quote q ON c.id = q.channel_id
WHERE q.del_flag = '0'
AND c.del_flag = '0'
</select>
</mapper>

View File

@ -14,6 +14,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="item.logisticsProviderName != null and item.logisticsProviderName != ''">
logistics_provider_name = #{item.logisticsProviderName},
</if>
<if test="item.trackingNumber != null and item.trackingNumber != ''">
tracking_number = #{item.trackingNumber},
</if>
<if test="item.logisticsWeight != null and item.logisticsWeight != ''">
logistics_weight = #{item.logisticsWeight},
</if>
<if test="item.actualDeliveryDate != null and item.actualDeliveryDate != ''">
actual_delivery_date = #{item.actualDeliveryDate},
</if>
</set>
WHERE fba_box_number = #{item.fbaBoxNumber}
</foreach>

View File

@ -7,7 +7,10 @@
<select id="selectOrdersByUserId" resultType="org.asinkj.amz.domain.BizLogisticsOrder">
SELECT blo.*
FROM biz_logistics_order blo
WHERE blo.logistics_provider_id = #{userId} -- 替换为实际物流商ID
WHERE blo.logistics_provider_id = #{userId}
<!--
替换为实际物流商ID
-->
AND blo.del_flag = '0'
AND EXISTS (
SELECT 1
@ -20,3 +23,4 @@
);
</select>
</mapper>

View File

@ -36,4 +36,43 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
WHERE rn = 1
GROUP BY logistics_name
</select>
<select id="getQuoteReport" resultType="java.util.Map">
SELECT
logistics_name AS "物流商名称",
<foreach item="col" collection="columns" separator=",">
COALESCE(MAX(CASE WHEN q.channel_name = #{col} THEN price END), 0) AS "${col}_报价",
COALESCE(MAX(CASE WHEN q.channel_name = #{col} THEN lead_time END), 0) AS "${col}_时效"
</foreach>
FROM biz_logistics_quote q
INNER JOIN biz_logistics_channel c ON q.channel_id = c.id
<where>
q.del_flag = '0'
AND c.del_flag = '0'
<choose>
<when test="startDate != null and endDate != null">
AND q.quote_date BETWEEN #{startDate} AND #{endDate}
</when>
<when test="startDate != null">
AND q.quote_date <![CDATA[ >= ]]> #{startDate}
</when>
<when test="endDate != null">
AND q.quote_date <![CDATA[ <= ]]> #{endDate}
</when>
</choose>
<if test="destination != null and destination != ''">
AND q.destination = #{destination}
</if>
</where>
GROUP BY logistics_name
</select>
<select id="getQuoteAvgDayReport" resultType="java.util.Map">
SELECT logistics_name,
<foreach collection="columns" item="channel" separator=",">
COALESCE(AVG(CASE WHEN channel_name = #{channel} THEN lead_time END),0) AS "${channel}"
</foreach>
FROM biz_logistics_quote
WHERE del_flag = '0'
GROUP BY logistics_name
LIMIT #{pageSize} OFFSET #{offset}
</select>
</mapper>

View File

@ -0,0 +1,7 @@
<?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="org.asinkj.amz.mapper.BizPurchaseOrderItemMapper">
</mapper>

View File

@ -0,0 +1,7 @@
<?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="org.asinkj.amz.mapper.BizPurchaseOrderMapper">
</mapper>

View File

@ -3,12 +3,32 @@
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.asinkj.amz.mapper.BizShipmentPlanMapper">
<update id="updateByFbaShipmentId">
<foreach collection="list" item="item" index="index" separator=";">
UPDATE biz_shipment_plan
<set>
<if test="item.boxQuantity != null">
box_quantity = #{item.boxQuantity},
</if>
<if test="item.boxQuantity != null">
box_size = #{item.boxSize},
</if>
<if test="item.boxQuantity != null">
vendor_weight = #{item.vendorWeight},
</if>
<if test="item.boxQuantity != null">
set_total = #{item.setTotal},
</if>
</set>
WHERE shipment_id = #{item.shipmentId}
</foreach>
</update>
<select id="selectExistingShipmentIds" resultType="java.lang.String">
SELECT shipmentid
SELECT shipment_id
FROM biz_shipment_plan
WHERE del_flag = '0'
WHERE shipmentid IN
WHERE shipment_id IN
<foreach item="id" collection="batchIds" open="(" separator="," close=")">
#{id}
</foreach>

View File

@ -145,6 +145,9 @@
<version>${revision}</version>
</dependency>
<!-- 短信模块 -->
<dependency>
<groupId>org.asinkj</groupId>
@ -256,7 +259,11 @@
<artifactId>asinkj-common-sse</artifactId>
<version>${revision}</version>
</dependency>
<dependency>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common-wp</artifactId>
<version>${revision}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>

View File

@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common</artifactId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>asinkj-common-wp</artifactId>
<description>
asinkj-common-mp 微信公众号相关
</description>
<dependencies>
<dependency>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common-core</artifactId>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
</dependency>
<dependency>
<groupId>javax.annotation</groupId>
<artifactId>javax.annotation-api</artifactId>
<version>1.3.2</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>

View File

@ -0,0 +1,19 @@
package org.asinkj.common.wp.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "wechat.public")
@Component
@Data
public class WeChatProperties {
private String appId;
private String appSecret;
private String callBackUrl;
private String orderTemplateId;
}

View File

@ -0,0 +1,103 @@
package org.asinkj.common.wp.handler;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.oauth2.WxOAuth2AccessToken;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import me.chanjar.weixin.mp.config.impl.WxMpDefaultConfigImpl;
import org.asinkj.common.wp.config.WeChatProperties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import javax.annotation.PostConstruct;
import java.net.URLEncoder;
import java.util.Arrays;
import java.util.List;
@Component
@Slf4j
public class WxMessagesManager {
private static WxMpService wxMpService;
private static WeChatProperties weChatProperties;
@Autowired
private WeChatProperties tempProperties;
/**
* 初始化微信配置
*/
@PostConstruct
private void init() {
// 解决静态变量无法直接注入的问题
weChatProperties = tempProperties;
WxMpDefaultConfigImpl config = new WxMpDefaultConfigImpl();
config.setAppId(weChatProperties.getAppId());
config.setSecret(weChatProperties.getAppSecret());
wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(config);
}
/**
* 生成微信授权链接静默授权
*
* @param redirectUri 回调地址需与公众号配置的域名一致
* @param state 用户标识如用户ID
*/
public static String buildAuthUrl(String redirectUri, String state) {
return wxMpService.getOAuth2Service().buildAuthorizationUrl(
redirectUri,
WxConsts.OAuth2Scope.SNSAPI_BASE,
URLEncoder.encode(state) // 需编码防止特殊字符
);
}
/**
* 通过 code 换取 OpenID适配 4.1.0 版本
*
* @param code 微信回调的授权码
*/
public static String getOpenIdByCode(String code) throws WxErrorException {
WxOAuth2AccessToken accessToken = wxMpService.getOAuth2Service().getAccessToken(code);
return accessToken.getOpenId(); // 注意 4.1.0 版方法名为 getOpenid()
}
/**
* 发送微信模板消息优化后
*/
public static void sendWechatTempMessage(String keyword1, String keyword2, String... openIds) {
for (String openId : openIds) {
try {
// 根据用户ID获取已绑定的 OpenID需自行实现
log.info("微信消息推送 => openid:{}", openId);
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
.toUser(openId)
.url("https://amzups.com/")
.templateId(weChatProperties.getOrderTemplateId())
.data(buildTemplateData(keyword1, keyword2))
.build();
wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (Exception e) {
log.error("微信消息推送失败用户ID: {},错误信息: {}", openId, e.getMessage());
}
}
}
/**
* 构建模板消息数据
*/
private static List<WxMpTemplateData> buildTemplateData(String keyword1, String keyword2) {
return Arrays.asList(
new WxMpTemplateData("thing1", keyword1),
new WxMpTemplateData("time9", keyword2)
);
}
}

View File

@ -0,0 +1,2 @@
org.asinkj.common.wp.config.WeChatProperties
org.asinkj.common.wp.handler.WxMessagesManager

View File

@ -45,6 +45,7 @@
<module>asinkj-common-nacos</module>
<module>asinkj-common-bus</module>
<module>asinkj-common-sse</module>
<module>asinkj-common-wp</module>
</modules>
<artifactId>asinkj-common</artifactId>

View File

@ -0,0 +1,63 @@
package org.asinkj.job.snailjob;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.common.log.SnailJobLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.asinkj.amz.api.RemoteFBADataService;
import org.springframework.stereotype.Component;
/**
* @author opensnail
* @date 2024-05-17
*/
@Component
@JobExecutor(name = "amzUpdateFBAJobExecutor")
@Slf4j
public class AmzUpdateFBAJobExecutor {
@DubboReference
private RemoteFBADataService remoteFBADataService;
public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception {
SnailJobLog.LOCAL.info("amzUpdateFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
remoteFBADataService.updateAmzFbaDataToken();
return ExecuteResult.success("请指定参数yesterday或者today");
}
// public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception {
// SnailJobLog.LOCAL.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
// SnailJobLog.REMOTE.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
// log.info("amzPullFBAJobExecutor {}", jobArgs.getJobParams());
// //昨天的日期yyyy-MM-dd
// // 获取昨天的日期
// if ("yesterday".equals(jobArgs.getJobParams())) {
// DateTime yesterday = DateUtil.yesterday();
// String yesterdayString = yesterday.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", yesterdayString);
// //获取今天的日期
// DateTime tomorrow = DateUtil.tomorrow();
// String tomorrowString = tomorrow.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
// remoteFBADataService.pullAmzFbaDataToken(yesterdayString, tomorrowString);
// return ExecuteResult.success("获取从昨天开始的FBA货件数据");
// } else if ("today".equals(jobArgs.getJobParams())) {
// DateTime today = DateUtil.date();
// String todayString = today.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", todayString);
// //获取今天的日期
// DateTime tomorrow = DateUtil.tomorrow();
// String tomorrowString = tomorrow.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
// remoteFBADataService.pullAmzFbaDataToken(todayString, tomorrowString);
// }
// return ExecuteResult.success("请指定参数yesterday或者today");
// }
}

View File

@ -0,0 +1,63 @@
package org.asinkj.job.snailjob;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil;
import com.aizuda.snailjob.client.job.core.annotation.JobExecutor;
import com.aizuda.snailjob.client.job.core.dto.JobArgs;
import com.aizuda.snailjob.client.model.ExecuteResult;
import com.aizuda.snailjob.common.core.util.JsonUtil;
import com.aizuda.snailjob.common.log.SnailJobLog;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.asinkj.amz.api.RemoteFBADataService;
import org.springframework.stereotype.Component;
/**
* @author opensnail
* @date 2024-05-17
*/
@Component
@JobExecutor(name = "QuoteReminderExecutor")
@Slf4j
public class QuoteReminderExecutor {
@DubboReference
private RemoteFBADataService remoteFBADataService;
public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception {
SnailJobLog.LOCAL.info("QuoteReminderExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
return ExecuteResult.success("报价提醒");
}
// public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception {
// SnailJobLog.LOCAL.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
// SnailJobLog.REMOTE.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
// log.info("amzPullFBAJobExecutor {}", jobArgs.getJobParams());
// //昨天的日期yyyy-MM-dd
// // 获取昨天的日期
// if ("yesterday".equals(jobArgs.getJobParams())) {
// DateTime yesterday = DateUtil.yesterday();
// String yesterdayString = yesterday.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", yesterdayString);
// //获取今天的日期
// DateTime tomorrow = DateUtil.tomorrow();
// String tomorrowString = tomorrow.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
// remoteFBADataService.pullAmzFbaDataToken(yesterdayString, tomorrowString);
// return ExecuteResult.success("获取从昨天开始的FBA货件数据");
// } else if ("today".equals(jobArgs.getJobParams())) {
// DateTime today = DateUtil.date();
// String todayString = today.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("yesterdayString. yesterdayString:{}", todayString);
// //获取今天的日期
// DateTime tomorrow = DateUtil.tomorrow();
// String tomorrowString = tomorrow.toString("yyyy-MM-dd");
// SnailJobLog.LOCAL.info("todayString. todayString:{}", tomorrowString);
// remoteFBADataService.pullAmzFbaDataToken(todayString, tomorrowString);
// }
// return ExecuteResult.success("请指定参数yesterday或者today");
// }
}

View File

@ -93,6 +93,8 @@ public class SysUser extends TenantEntity {
*/
private String loginIp;
private String openId;
/**
* 最后登录时间
*/

View File

@ -108,6 +108,8 @@ public class SysUserVo implements Serializable {
*/
private String remark;
private String openId;
/**
* 创建时间
*/

View File

@ -1,6 +1,7 @@
package org.asinkj.system.dubbo;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@ -11,6 +12,7 @@ import org.asinkj.common.core.exception.ServiceException;
import org.asinkj.common.core.exception.user.UserException;
import org.asinkj.common.core.utils.DateUtils;
import org.asinkj.common.core.utils.MapstructUtils;
import org.asinkj.common.core.utils.StreamUtils;
import org.asinkj.common.core.utils.StringUtils;
import org.asinkj.common.mybatis.helper.DataPermissionHelper;
import org.asinkj.common.tenant.helper.TenantHelper;
@ -285,6 +287,19 @@ public class RemoteUserServiceImpl implements RemoteUserService {
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser));
}
@Override
public void recordOpenId(Long userId, String openId){
SysUser sysUser = new SysUser();
sysUser.setUserId(userId);
sysUser.setOpenId(openId);
sysUser.setLoginDate(DateUtils.getNowDate());
sysUser.setUpdateBy(userId);
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser));
}
/**
* 通过用户ID查询用户列表
*
@ -308,4 +323,10 @@ public class RemoteUserServiceImpl implements RemoteUserService {
return userService.selectUserIdsByRoleIds(roleIds);
}
@Override
public List<String> selectUserOpenIdsByRoleIds(List<Long> roleIds) {
return userService.selectUserOpenIdsByRoleIds(roleIds);
}
}

View File

@ -88,4 +88,5 @@ public interface SysUserMapper extends BaseMapperPlus<SysUser, SysUserVo> {
})
int updateById(@Param(Constants.ENTITY) SysUser user);
List<String> selectUserOpenIdsByRoleIds(@Param("roleIds") List<Long> roleIds);
}

View File

@ -268,4 +268,5 @@ public interface ISysUserService {
*/
List<Long> selectUserIdsByRoleIds(List<Long> roleIds);
List<String> selectUserOpenIdsByRoleIds(List<Long> roleIds);
}

View File

@ -559,6 +559,11 @@ public class SysUserServiceImpl implements ISysUserService {
return StreamUtils.toList(userRoles, SysUserRole::getUserId);
}
@Override
public List<String> selectUserOpenIdsByRoleIds(List<Long> roleIds) {
return baseMapper.selectUserOpenIdsByRoleIds(roleIds);
}
/**
* 通过用户ID查询用户账户
*

View File

@ -68,6 +68,16 @@
<select id="countUserById" resultType="Long">
select count(*) from sys_user where del_flag = '0' and user_id = #{userId}
</select>
<select id="selectUserOpenIdsByRoleIds" resultType="java.lang.String">
select open_id
from sys_user
where user_id
in (select user_id from sys_user_role where role_id in
<foreach item="item" collection="roleIds" separator="," open="(" close=")" index="">
#{item}
</foreach>
)
</select>
</mapper>

View File

@ -60,6 +60,7 @@
<flowable.version>7.0.1</flowable.version>
<!-- mq配置 -->
<rocketmq.version>2.3.0</rocketmq.version>
<weixin-java-mp.version>4.7.0</weixin-java-mp.version>
<!-- 插件版本 -->
<maven-compiler-plugin.verison>3.11.0</maven-compiler-plugin.verison>
@ -375,6 +376,12 @@
<version>${rocketmq.version}</version>
</dependency>
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-mp</artifactId>
<version>${weixin-java-mp.version}</version>
</dependency>
</dependencies>
</dependencyManagement>