5.9新需求修改

This commit is contained in:
dev 2025-05-10 14:29:20 +08:00
parent 47b65b2528
commit 615549ed5e
62 changed files with 3364 additions and 79 deletions

View File

@ -17,7 +17,7 @@
</settings> </settings>
</deployment> </deployment>
<method v="2"> <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> </method>
</configuration> </configuration>
</component> </component>

View File

@ -17,7 +17,7 @@
</settings> </settings>
</deployment> </deployment>
<method v="2"> <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> </method>
</configuration> </configuration>
</component> </component>

View File

@ -5,4 +5,8 @@ import org.springframework.stereotype.Service;
@Service @Service
public interface RemoteFBADataService { public interface RemoteFBADataService {
void pullAmzFbaDataToken(String startDate, String endDate) throws Exception; 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); void recordLoginInfo(Long userId, String ip);
/**
* 更新用户信息
*
* @param userId 用户ID
* @param openId openId
*/
void recordOpenId(Long userId, String openId);
/** /**
* 通过用户ID查询用户列表 * 通过用户ID查询用户列表
* *
@ -131,4 +140,13 @@ public interface RemoteUserService {
* @return 用户ids * @return 用户ids
*/ */
List<Long> selectUserIdsByRoleIds(List<Long> roleIds); 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> <artifactId>asinkj-api-resource</artifactId>
</dependency> </dependency>
<dependency>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common-wp</artifactId>
</dependency>
<!-- 自定义负载均衡(多团队开发使用) --> <!-- 自定义负载均衡(多团队开发使用) -->
<!-- <dependency>--> <!-- <dependency>-->
<!-- <groupId>org.asinkj</groupId>--> <!-- <groupId>org.asinkj</groupId>-->

View File

@ -7,6 +7,7 @@ import cn.hutool.core.util.ObjectUtil;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthResponse;
import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.model.AuthUser;
import me.zhyd.oauth.request.AuthRequest; 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.config.properties.SocialProperties;
import org.asinkj.common.social.utils.SocialUtils; import org.asinkj.common.social.utils.SocialUtils;
import org.asinkj.common.tenant.helper.TenantHelper; import org.asinkj.common.tenant.helper.TenantHelper;
import org.asinkj.common.wp.handler.WxMessagesManager;
import org.asinkj.resource.api.RemoteMessageService; import org.asinkj.resource.api.RemoteMessageService;
import org.asinkj.system.api.RemoteClientService; import org.asinkj.system.api.*;
import org.asinkj.system.api.RemoteConfigService;
import org.asinkj.system.api.RemoteSocialService;
import org.asinkj.system.api.RemoteTenantService;
import org.asinkj.system.api.domain.vo.RemoteClientVo; import org.asinkj.system.api.domain.vo.RemoteClientVo;
import org.asinkj.system.api.domain.vo.RemoteTenantVo; import org.asinkj.system.api.domain.vo.RemoteTenantVo;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
@ -72,6 +71,9 @@ public class TokenController {
@DubboReference(stub = "true") @DubboReference(stub = "true")
private final RemoteMessageService remoteMessageService; private final RemoteMessageService remoteMessageService;
@DubboReference
private RemoteUserService remoteUserService;
/** /**
* 登录方法 * 登录方法
* *
@ -129,6 +131,35 @@ public class TokenController {
return R.ok("操作成功", authorizeUrl); 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 findepi/graalvm:java17-native
FROM amazoncorretto:17.0.14 FROM amazoncorretto:17.0.14
ENV TZ=Asia/Shanghai
LABEL maintainer="Shuo Hu " LABEL maintainer="Shuo Hu "
RUN mkdir -p /asinkj/amz/logs \ RUN mkdir -p /asinkj/amz/logs \

View File

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

View File

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

@ -3,6 +3,7 @@ package org.asinkj.amz.controller;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import cn.dev33.satoken.annotation.SaCheckRole;
import jakarta.validation.Valid; import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
@ -166,7 +167,7 @@ public class BizLogisticsQuoteController extends BaseController {
* *
* @return * @return
*/ */
@SaCheckPermission("amz:logisticsQuote:query") @SaCheckRole("yunying")
@PostMapping("/report") @PostMapping("/report")
public R<List<Map<String, Object>>> getInfo(@Valid @RequestBody BizLogisticsQuoteReportBo bo) { public R<List<Map<String, Object>>> getInfo(@Valid @RequestBody BizLogisticsQuoteReportBo bo) {
List<Map<String, Object>> maps = bizLogisticsQuoteService.generateReport(bo); List<Map<String, Object>> maps = bizLogisticsQuoteService.generateReport(bo);

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 java.util.List;
import cn.dev33.satoken.annotation.SaCheckRole;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*; import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission; import cn.dev33.satoken.annotation.SaCheckPermission;
import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo;
import org.asinkj.amz.domain.vo.BizShipmentPlanOrderVo; import org.asinkj.amz.domain.vo.BizShipmentPlanOrderVo;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.asinkj.common.idempotent.annotation.RepeatSubmit; 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.domain.bo.BizShipmentPlanBo;
import org.asinkj.amz.service.IBizShipmentPlanService; import org.asinkj.amz.service.IBizShipmentPlanService;
import org.asinkj.common.mybatis.core.page.TableDataInfo; 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(); 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(); 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") @SaCheckPermission("amz:amazonStore:remove")
@Log(title = "亚马逊FBAtest", businessType = BusinessType.OTHER) @Log(title = "亚马逊FBAtest", businessType = BusinessType.OTHER)
@GetMapping("/test") @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

@ -33,7 +33,7 @@ public class BizLogisticsQuoteReportBo extends BaseEntity {
/** /**
* 目的地建议使用ISO国家代码如CN/US/GB * 目的地建议使用ISO国家代码如CN/US/GB
*/ */
@NotBlank(message = "目的地(建议使用ISO国家代码如CN/US/GB)不能为空") @NotBlank(message = "目的地(4个字母组合)不能为空")
private String destination; private String destination;

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

View File

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

@ -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.Mapper;
import org.apache.ibatis.annotations.Param; import org.apache.ibatis.annotations.Param;
import org.asinkj.amz.domain.BizShipmentPlan; import org.asinkj.amz.domain.BizShipmentPlan;
import org.asinkj.amz.domain.BizShipmentPlanFileData;
import org.asinkj.amz.domain.vo.BizShipmentPlanVo; import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus; 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); 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.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery; import org.asinkj.common.mybatis.core.page.PageQuery;
import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -76,4 +77,6 @@ public interface IBizInquiryRequestService {
R<String> batchCreateWithItems(List<InquiryRequestItemVo> items); R<String> batchCreateWithItems(List<InquiryRequestItemVo> items);
TableDataInfo<BizInquiryRequestVo> queryWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date); TableDataInfo<BizInquiryRequestVo> queryWithDesAndChannel(@NotNull(message = "目的地不能为空") String destination, @NotNull(message = "渠道不能为空") String channelId, @NotNull(message = "日期不能为空") String date);
void quoteReminder();
} }

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.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery; import org.asinkj.common.mybatis.core.page.PageQuery;
import java.io.InputStream;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
@ -81,4 +82,6 @@ public interface IBizShipmentPlanService {
void updateStatusbyFbaShipmentIds(List<String> fbaShipmentids); void updateStatusbyFbaShipmentIds(List<String> fbaShipmentids);
void updateList(Collection<String> list, String status); 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 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); void pullAmzStaData(String startDate, String endDate, LingxinCallback lingxinCallback);

View File

@ -1,20 +1,28 @@
package org.asinkj.amz.service.impl; package org.asinkj.amz.service.impl;
import cn.hutool.core.collection.CollectionUtil; import cn.hutool.core.collection.CollectionUtil;
import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil; 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 com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.extern.slf4j.Slf4j; 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.BizLogisticsChannelVo;
import org.asinkj.amz.domain.vo.BizLogisticsOrderDetailVo;
import org.asinkj.amz.domain.vo.InquiryRequestItemVo; import org.asinkj.amz.domain.vo.InquiryRequestItemVo;
import org.asinkj.amz.mapper.BizLogisticsQuoteMapper; import org.asinkj.amz.mapper.BizLogisticsQuoteMapper;
import org.asinkj.amz.service.IBizInquiryBlacklistService; import org.asinkj.amz.service.IBizInquiryBlacklistService;
import org.asinkj.amz.service.IBizLogisticsChannelService; import org.asinkj.amz.service.IBizLogisticsChannelService;
import org.asinkj.amz.service.IBizShipmentPlanService; import org.asinkj.amz.service.IBizShipmentPlanService;
import org.asinkj.common.core.domain.R; 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.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils; 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.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery; import org.asinkj.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.annotation.DistributedLock;
import org.asinkj.common.redis.utils.RedisUtils; import org.asinkj.common.redis.utils.RedisUtils;
import org.asinkj.common.satoken.utils.LoginHelper; import org.asinkj.common.satoken.utils.LoginHelper;
import org.asinkj.common.wp.handler.WxMessagesManager;
import org.asinkj.resource.api.RemoteMessageService; import org.asinkj.resource.api.RemoteMessageService;
import org.asinkj.system.api.RemoteUserService;
import org.asinkj.utils.SerialNoGenerator; import org.asinkj.utils.SerialNoGenerator;
import org.redisson.api.RLock; import org.redisson.api.RLock;
import org.springframework.dao.DuplicateKeyException; import org.springframework.dao.DuplicateKeyException;
@ -36,10 +46,13 @@ import org.asinkj.amz.mapper.BizInquiryRequestMapper;
import org.asinkj.amz.service.IBizInquiryRequestService; import org.asinkj.amz.service.IBizInquiryRequestService;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.InputStream;
import java.time.DayOfWeek; import java.time.DayOfWeek;
import java.time.LocalDate; import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters; import java.time.temporal.TemporalAdjusters;
import java.util.*; import java.util.*;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -56,6 +69,8 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
private final BizInquiryRequestMapper baseMapper; private final BizInquiryRequestMapper baseMapper;
private final ScheduledExecutorService scheduledExecutorService;
private static final AtomicInteger sequence = new AtomicInteger(0); private static final AtomicInteger sequence = new AtomicInteger(0);
@ -68,7 +83,8 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
@Resource @Resource
private BizLogisticsQuoteMapper logisticsQuoteMapper; private BizLogisticsQuoteMapper logisticsQuoteMapper;
@Resource
@DubboReference(stub = "true")
private RemoteMessageService remoteMessageService; private RemoteMessageService remoteMessageService;
@Resource @Resource
@ -77,6 +93,13 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
@Resource @Resource
private IBizInquiryBlacklistService bizInquiryBlacklistService; 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()); lqw.eq(bo.getEffectiveEndTime() != null, BizInquiryRequest::getEffectiveEndTime, bo.getEffectiveEndTime());
List<Long> ids = bizInquiryBlacklistService.queryByUserid(LoginHelper.getUserId()); List<Long> ids = bizInquiryBlacklistService.queryByUserid(LoginHelper.getUserId());
lqw.notIn(CollectionUtil.isNotEmpty(ids), BizInquiryRequest::getId, ids); 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; return lqw;
} }
@ -234,8 +263,17 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
billingRequestMapper.insert(bizInquiryRequest); 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()); return R.ok(bizInquiryRequest.getInquiryNo());
} }
@ -400,6 +438,17 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
// String inquiryNo = bizInquiryRequests.get(0).getInquiryNo(); // String inquiryNo = bizInquiryRequests.get(0).getInquiryNo();
// remoteMessageService.publishMessage(LoginHelper.getUserId(), "询价单创建成功,单号:" + inquiryNo); // 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(); return R.ok();
} }
@ -444,4 +493,10 @@ public class BizInquiryRequestServiceImpl implements IBizInquiryRequestService {
return TableDataInfo.build(bizInquiryRequestVos); return TableDataInfo.build(bizInquiryRequestVos);
} }
@Override
public void quoteReminder() {
}
} }

View File

@ -6,6 +6,7 @@ import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.NumberUtil; import cn.hutool.core.util.NumberUtil;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.asinkj.amz.domain.BizInquiryRequest; 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.BizLogisticsQuoteMostBo;
import org.asinkj.amz.domain.bo.BizLogisticsQuoteReportBo; import org.asinkj.amz.domain.bo.BizLogisticsQuoteReportBo;
import org.asinkj.amz.domain.vo.InquiryQuoteStatusDTO; import org.asinkj.amz.domain.vo.InquiryQuoteStatusDTO;
@ -139,6 +140,9 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
lqw.eq(StringUtils.isNotBlank(bo.getIsSubmitted()), BizLogisticsQuote::getIsSubmitted, bo.getIsSubmitted()); lqw.eq(StringUtils.isNotBlank(bo.getIsSubmitted()), BizLogisticsQuote::getIsSubmitted, bo.getIsSubmitted());
lqw.eq(StringUtils.isNotBlank(bo.getChannelType()), BizLogisticsQuote::getChannelType, bo.getChannelType()); lqw.eq(StringUtils.isNotBlank(bo.getChannelType()), BizLogisticsQuote::getChannelType, bo.getChannelType());
lqw.eq(bo.getChannelId() != null, BizLogisticsQuote::getChannelId, bo.getChannelId()); 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; return lqw;
} }
@ -292,7 +296,6 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
LocalDate today = LocalDate.now(); LocalDate today = LocalDate.now();
List<BizInquiryRequest> inquiries = bizInquiryRequestMapper.selectOpenAndEffectiveInquiries(today); List<BizInquiryRequest> inquiries = bizInquiryRequestMapper.selectOpenAndEffectiveInquiries(today);
// 2. 收集所有物流商ID
Map<Long, List<Long>> inquiryProvidersMap = new HashMap<>(); Map<Long, List<Long>> inquiryProvidersMap = new HashMap<>();
Set<Long> allProviderIds = new HashSet<>(); Set<Long> allProviderIds = new HashSet<>();
for (BizInquiryRequest inquiry : inquiries) { for (BizInquiryRequest inquiry : inquiries) {
@ -301,19 +304,16 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
allProviderIds.addAll(providerIds); allProviderIds.addAll(providerIds);
} }
// 3. 查询当日报价记录即使 allProviderIds 为空也会执行
List<BizLogisticsQuote> quotes = baseMapper.selectQuotesByProvidersAndDate( List<BizLogisticsQuote> quotes = baseMapper.selectQuotesByProvidersAndDate(
new ArrayList<>(allProviderIds), today new ArrayList<>(allProviderIds), today
); );
// 4. 构建报价状态映射表
Map<Pair<Long, Long>, BizLogisticsQuote> quoteMap = quotes.stream() Map<Pair<Long, Long>, BizLogisticsQuote> quoteMap = quotes.stream()
.collect(Collectors.toMap( .collect(Collectors.toMap(
quote -> Pair.of(quote.getInquiryId(), quote.getChannelId()), quote -> Pair.of(quote.getInquiryId(), quote.getChannelId()),
Function.identity() Function.identity()
)); ));
// 5. 组合结果
List<InquiryQuoteStatusDTO> result = new ArrayList<>(); List<InquiryQuoteStatusDTO> result = new ArrayList<>();
for (BizInquiryRequest inquiry : inquiries) { for (BizInquiryRequest inquiry : inquiries) {
List<Long> providerIds = inquiryProvidersMap.get(inquiry.getId()); 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.DateTime;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.asinkj.amz.domain.*; import org.asinkj.amz.domain.*;
import org.asinkj.amz.domain.bo.SysAmazonStoreBo; import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
import org.asinkj.amz.domain.vo.BizLogisticsQuoteVo; import org.asinkj.amz.domain.vo.*;
import org.asinkj.amz.domain.vo.BizShipmentPlanOrderVo;
import org.asinkj.amz.domain.vo.SysAmazonStoreVo;
import org.asinkj.amz.mapper.*; import org.asinkj.amz.mapper.*;
import org.asinkj.amz.service.IBizLogisticsQuoteService; import org.asinkj.amz.service.IBizLogisticsQuoteService;
import org.asinkj.amz.service.ISysAmazonStoreService; import org.asinkj.amz.service.ISysAmazonStoreService;
import org.asinkj.amz.service.LingxinCallback; 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.MapstructUtils;
import org.asinkj.common.core.utils.StringUtils; 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.TableDataInfo;
import org.asinkj.common.mybatis.core.page.PageQuery; import org.asinkj.common.mybatis.core.page.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; 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.asinkj.resource.api.RemoteMessageService;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.asinkj.amz.domain.bo.BizShipmentPlanBo; import org.asinkj.amz.domain.bo.BizShipmentPlanBo;
import org.asinkj.amz.domain.vo.BizShipmentPlanVo;
import org.asinkj.amz.service.IBizShipmentPlanService; import org.asinkj.amz.service.IBizShipmentPlanService;
import javax.annotation.Resource; import javax.annotation.Resource;
import java.io.InputStream;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@ -61,7 +63,7 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
@Resource @Resource
private BizShipmentItemMapper bizShipmentItemMapper; private BizShipmentItemMapper bizShipmentItemMapper;
@Resource @DubboReference(stub = "true")
private RemoteMessageService remoteMessageService; 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.getShippingMode()), BizShipmentPlan::getShippingMode, bo.getShippingMode());
lqw.eq(StringUtils.isNotBlank(bo.getShippingSolution()), BizShipmentPlan::getShippingSolution, bo.getShippingSolution()); lqw.eq(StringUtils.isNotBlank(bo.getShippingSolution()), BizShipmentPlan::getShippingSolution, bo.getShippingSolution());
lqw.eq(bo.getGmtModified() != null, BizShipmentPlan::getGmtModified, bo.getGmtModified()); 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.getReceivingTime() != null, BizShipmentPlan::getReceivingTime, bo.getReceivingTime());
lqw.eq(bo.getStaShipmentDate() != null, BizShipmentPlan::getStaShipmentDate, bo.getStaShipmentDate()); lqw.eq(bo.getStaShipmentDate() != null, BizShipmentPlan::getStaShipmentDate, bo.getStaShipmentDate());
lqw.eq(bo.getStaDeliveryStartDate() != null, BizShipmentPlan::getStaDeliveryStartDate, bo.getStaDeliveryStartDate()); lqw.eq(bo.getStaDeliveryStartDate() != null, BizShipmentPlan::getStaDeliveryStartDate, bo.getStaDeliveryStartDate());
@ -378,18 +384,39 @@ public class BizShipmentPlanServiceImpl implements IBizShipmentPlanService {
@Override @Override
public void updateStatusbyFbaShipmentIds(List<String> fbaShipmentids) { public void updateStatusbyFbaShipmentIds(List<String> fbaShipmentids) {
LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, fbaShipmentids) lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, fbaShipmentids)
.set(BizShipmentPlan::getFbaStatus, "ask"); .set(BizShipmentPlan::getFbaStatus, "ask");
baseMapper.update(null,lambdaUpdateWrapper); baseMapper.update(null, lambdaUpdateWrapper);
} }
@Override @Override
public void updateList(Collection<String> list, String status) { public void updateList(Collection<String> list, String status) {
LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>(); LambdaUpdateWrapper<BizShipmentPlan> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, list) lambdaUpdateWrapper.in(BizShipmentPlan::getShipmentId, list)
.set(BizShipmentPlan::getFbaStatus, "send"); .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 @Override
public void pullAmzFBAData(String startDate, String endDate) throws Exception { public void pullAmzFBAData(String startDate, String endDate) throws Exception {
@ -418,15 +419,21 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
@Override @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<>(); Map<String, String> queryParam = new HashMap<>();
List<SysAmazonStore> sysAmazonStores = baseMapper.selectList(); List<SysAmazonStore> sysAmazonStores = baseMapper.selectList();
String sids = sysAmazonStores.stream().map(item -> String.valueOf(item.getSid())).collect(Collectors.joining(",")); String sids = sysAmazonStores.stream().map(item -> String.valueOf(item.getSid())).collect(Collectors.joining(","));
log.info("sids:{}", sids); log.info("sids:{}", sids);
queryParam.put("sid", "153"); queryParam.put("sid", sids);
queryParam.put("start_date", startDate); queryParam.put("start_date", DateUtil.offsetMonth(DateUtil.date(), -1).toString("yyyy-MM-dd"));
queryParam.put("end_date", endDate); queryParam.put("end_date", DateUtil.date().toString("yyyy-MM-dd"));
// queryParam.put("shipment_id", String.join(",", shipmentIds));
queryParam.put("shipment_status", "RECEIVING"); queryParam.put("shipment_status", "RECEIVING");
RequestAttributes ra = RequestContextHolder.getRequestAttributes(); RequestAttributes ra = RequestContextHolder.getRequestAttributes();
@ -463,24 +470,28 @@ public class SysAmazonStoreServiceImpl implements ISysAmazonStoreService {
log.info("fbaShipmentApiResponse:{}", listData); log.info("fbaShipmentApiResponse:{}", listData);
Set<String> shipmentIds = listData.stream().map(FbaShipmentApiResponse.ShipmentPlan::getShipmentId).collect(Collectors.toSet()); Set<String> shipmentIds = listData.stream().map(FbaShipmentApiResponse.ShipmentPlan::getShipmentId).collect(Collectors.toSet());
// 查询数据库中存在的shipmentId 使用mybatis-plus批量查询 // 查询数据库中存在的shipmentId 使用mybatis-plus批量查询
List<BizShipmentPlan> bizShipmentPlans = bizShipmentPlanMapper.selectList(new LambdaQueryWrapper<BizShipmentPlan>().in(BizShipmentPlan::getShipmentId, shipmentIds)); List<BizShipmentPlan> bizShipmentPlans = bizShipmentPlanMapper.selectList(new LambdaQueryWrapper<BizShipmentPlan>().in(BizShipmentPlan::getShipmentId, shipmentIds).ne(BizShipmentPlan::getShipmentStatus, "RECEIVING"));
Set<String> selectExistingShipmentIds = bizShipmentPlans.stream().map(BizShipmentPlan::getShipmentId).collect(Collectors.toSet()); 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) { for (BizShipmentPlan bizShipmentPlan : bizShipmentPlans) {
FbaShipmentApiResponse.ShipmentPlan shipmentPlan = collect.get(bizShipmentPlan.getShipmentId()); FbaShipmentApiResponse.ShipmentPlan shipmentPlan = collect.get(bizShipmentPlan.getShipmentId());
if (ObjectUtil.isNotEmpty(shipmentPlan)) { if (ObjectUtil.isNotEmpty(shipmentPlan)) {
bizShipmentPlan.setShipmentStatus(shipmentPlan.getShipmentStatus()); bizShipmentPlan.setShipmentStatus(shipmentPlan.getShipmentStatus());
if (StrUtil.isNotEmpty(shipmentPlan.getReceivingTime())) { if (StrUtil.isNotEmpty(shipmentPlan.getReceivingTime())) {
bizShipmentPlan.setReceivingTime(DateUtil.parseTime(shipmentPlan.getReceivingTime())); bizShipmentPlan.setReceivingTime(DateUtil.parse(shipmentPlan.getReceivingTime(), "yyyy-MM-dd HH:mm"));
}
} }
} }
bizShipmentPlanMapper.updateById(bizShipmentPlans);
} else {
log.info("未查询到需要更新的数据");
} }
bizShipmentPlanMapper.updateById(bizShipmentPlans);
} finally { } finally {
RequestContextHolder.resetRequestAttributes(); 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任务 * 通过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

@ -14,6 +14,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="item.logisticsProviderName != null and item.logisticsProviderName != ''"> <if test="item.logisticsProviderName != null and item.logisticsProviderName != ''">
logistics_provider_name = #{item.logisticsProviderName}, logistics_provider_name = #{item.logisticsProviderName},
</if> </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> </set>
WHERE fba_box_number = #{item.fbaBoxNumber} WHERE fba_box_number = #{item.fbaBoxNumber}
</foreach> </foreach>

View File

@ -7,7 +7,10 @@
<select id="selectOrdersByUserId" resultType="org.asinkj.amz.domain.BizLogisticsOrder"> <select id="selectOrdersByUserId" resultType="org.asinkj.amz.domain.BizLogisticsOrder">
SELECT blo.* SELECT blo.*
FROM biz_logistics_order 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 blo.del_flag = '0'
AND EXISTS ( AND EXISTS (
SELECT 1 SELECT 1
@ -20,3 +23,4 @@
); );
</select> </select>
</mapper> </mapper>

View File

@ -38,7 +38,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select> </select>
<select id="getQuoteReport" resultType="java.util.Map"> <select id="getQuoteReport" resultType="java.util.Map">
SELECT SELECT
q.logistics_name AS "物流商名称", logistics_name AS "物流商名称",
<foreach item="col" collection="columns" separator=","> <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 price END), 0) AS "${col}_报价",
COALESCE(MAX(CASE WHEN q.channel_name = #{col} THEN lead_time END), 0) AS "${col}_时效" COALESCE(MAX(CASE WHEN q.channel_name = #{col} THEN lead_time END), 0) AS "${col}_时效"

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" PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"> "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.asinkj.amz.mapper.BizShipmentPlanMapper"> <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 id="selectExistingShipmentIds" resultType="java.lang.String">
SELECT shipmentid SELECT shipment_id
FROM biz_shipment_plan FROM biz_shipment_plan
WHERE del_flag = '0' WHERE del_flag = '0'
WHERE shipmentid IN WHERE shipment_id IN
<foreach item="id" collection="batchIds" open="(" separator="," close=")"> <foreach item="id" collection="batchIds" open="(" separator="," close=")">
#{id} #{id}
</foreach> </foreach>

View File

@ -145,6 +145,9 @@
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<!-- 短信模块 --> <!-- 短信模块 -->
<dependency> <dependency>
<groupId>org.asinkj</groupId> <groupId>org.asinkj</groupId>
@ -256,7 +259,11 @@
<artifactId>asinkj-common-sse</artifactId> <artifactId>asinkj-common-sse</artifactId>
<version>${revision}</version> <version>${revision}</version>
</dependency> </dependency>
<dependency>
<groupId>org.asinkj</groupId>
<artifactId>asinkj-common-wp</artifactId>
<version>${revision}</version>
</dependency>
</dependencies> </dependencies>
</dependencyManagement> </dependencyManagement>
</project> </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-nacos</module>
<module>asinkj-common-bus</module> <module>asinkj-common-bus</module>
<module>asinkj-common-sse</module> <module>asinkj-common-sse</module>
<module>asinkj-common-wp</module>
</modules> </modules>
<artifactId>asinkj-common</artifactId> <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 loginIp;
private String openId;
/** /**
* 最后登录时间 * 最后登录时间
*/ */

View File

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

View File

@ -1,6 +1,7 @@
package org.asinkj.system.dubbo; package org.asinkj.system.dubbo;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.lang.Opt; import cn.hutool.core.lang.Opt;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; 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.exception.user.UserException;
import org.asinkj.common.core.utils.DateUtils; import org.asinkj.common.core.utils.DateUtils;
import org.asinkj.common.core.utils.MapstructUtils; 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.core.utils.StringUtils;
import org.asinkj.common.mybatis.helper.DataPermissionHelper; import org.asinkj.common.mybatis.helper.DataPermissionHelper;
import org.asinkj.common.tenant.helper.TenantHelper; import org.asinkj.common.tenant.helper.TenantHelper;
@ -285,6 +287,19 @@ public class RemoteUserServiceImpl implements RemoteUserService {
DataPermissionHelper.ignore(() -> userMapper.updateById(sysUser)); 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查询用户列表 * 通过用户ID查询用户列表
* *
@ -308,4 +323,10 @@ public class RemoteUserServiceImpl implements RemoteUserService {
return userService.selectUserIdsByRoleIds(roleIds); 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); 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<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); return StreamUtils.toList(userRoles, SysUserRole::getUserId);
} }
@Override
public List<String> selectUserOpenIdsByRoleIds(List<Long> roleIds) {
return baseMapper.selectUserOpenIdsByRoleIds(roleIds);
}
/** /**
* 通过用户ID查询用户账户 * 通过用户ID查询用户账户
* *

View File

@ -68,6 +68,16 @@
<select id="countUserById" resultType="Long"> <select id="countUserById" resultType="Long">
select count(*) from sys_user where del_flag = '0' and user_id = #{userId} select count(*) from sys_user where del_flag = '0' and user_id = #{userId}
</select> </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> </mapper>

View File

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