diff --git a/.run/asinkj-auth.run.xml b/.run/asinkj-auth.run.xml
index 98eb297..492bd32 100644
--- a/.run/asinkj-auth.run.xml
+++ b/.run/asinkj-auth.run.xml
@@ -17,7 +17,7 @@
-
+
\ No newline at end of file
diff --git a/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java b/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java
index 7c44416..9146fa2 100644
--- a/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java
+++ b/asinkj-api/asinkj-api-amz/src/main/java/org/asinkj/amz/api/RemoteFBADataService.java
@@ -13,4 +13,6 @@ public interface RemoteFBADataService {
void updatePurchaseOrderSeller(String startDate, String endDate) throws Exception;
void quoteReminder() throws Exception;
+
+ void updateRemaind();
}
diff --git a/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/model/LoginUser.java b/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/model/LoginUser.java
index a133cd5..fbef89a 100644
--- a/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/model/LoginUser.java
+++ b/asinkj-api/asinkj-api-system/src/main/java/org/asinkj/system/api/model/LoginUser.java
@@ -110,6 +110,8 @@ public class LoginUser implements Serializable {
*/
private String password;
+ private String openId;
+
/**
* 角色对象
*/
diff --git a/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java b/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java
index 7d818c1..ff86625 100644
--- a/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java
+++ b/asinkj-auth/src/main/java/org/asinkj/auth/controller/TokenController.java
@@ -104,7 +104,7 @@ public class TokenController {
Long userId = LoginHelper.getUserId();
scheduledExecutorService.schedule(() -> {
- remoteMessageService.publishMessage(userId, "欢迎登录瑷胜科技管理系统");
+ remoteMessageService.publishMessage(userId, "欢迎登录香港SMT订单物流管理系统");
}, 3, TimeUnit.SECONDS);
return R.ok(loginVo);
}
@@ -153,10 +153,22 @@ public class TokenController {
remoteUserService.recordOpenId(Long.valueOf(state), openId);
String nickname = remoteUserService.selectNicknameById(Long.valueOf(state));
- return "用户: " + nickname + "绑定成功!";
+ return "" +
+ "" +
+ "
绑定结果" +
+ "" +
+ "绑定成功!
" +
+ "用户: " + nickname + "
" +
+ "";
} catch (WxErrorException e) {
log.error("微信授权失败: {}", e.getMessage());
- return "绑定失败,请重试";
+ return "" +
+ "" +
+ "错误" +
+ "" +
+ "绑定失败
" +
+ "请重试或联系管理员
" +
+ "";
}
}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizSendShipmentRelController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizSendShipmentRelController.java
new file mode 100644
index 0000000..2f3fc8e
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/BizSendShipmentRelController.java
@@ -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.BizSendShipmentRelVo;
+import org.asinkj.amz.domain.bo.BizSendShipmentRelBo;
+import org.asinkj.amz.service.IBizSendShipmentRelService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 发货单与货运计划多对多关联
+ * 前端访问路由地址为:/amz/sendShipmentRel
+ *
+ * @author shuo hu
+ * @date 2025-06-20
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/sendShipmentRel")
+public class BizSendShipmentRelController extends BaseController {
+
+ private final IBizSendShipmentRelService bizSendShipmentRelService;
+
+ /**
+ * 查询发货单与货运计划多对多关联列表
+ */
+ @SaCheckPermission("amz:sendShipmentRel:list")
+ @GetMapping("/list")
+ public TableDataInfo list(BizSendShipmentRelBo bo, PageQuery pageQuery) {
+ return bizSendShipmentRelService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出发货单与货运计划多对多关联列表
+ */
+ @SaCheckPermission("amz:sendShipmentRel:export")
+ @Log(title = "发货单与货运计划多对多关联", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(BizSendShipmentRelBo bo, HttpServletResponse response) {
+ List list = bizSendShipmentRelService.queryList(bo);
+ ExcelUtil.exportExcel(list, "发货单与货运计划多对多关联", BizSendShipmentRelVo.class, response);
+ }
+
+ /**
+ * 获取发货单与货运计划多对多关联详细信息
+ *
+ * @param id 主键
+ */
+ @SaCheckPermission("amz:sendShipmentRel:query")
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(bizSendShipmentRelService.queryById(id));
+ }
+
+ /**
+ * 新增发货单与货运计划多对多关联
+ */
+ @SaCheckPermission("amz:sendShipmentRel:add")
+ @Log(title = "发货单与货运计划多对多关联", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody BizSendShipmentRelBo bo) {
+ return toAjax(bizSendShipmentRelService.insertByBo(bo));
+ }
+
+ /**
+ * 修改发货单与货运计划多对多关联
+ */
+ @SaCheckPermission("amz:sendShipmentRel:edit")
+ @Log(title = "发货单与货运计划多对多关联", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody BizSendShipmentRelBo bo) {
+ return toAjax(bizSendShipmentRelService.updateByBo(bo));
+ }
+
+ /**
+ * 删除发货单与货运计划多对多关联
+ *
+ * @param ids 主键串
+ */
+ @SaCheckPermission("amz:sendShipmentRel:remove")
+ @Log(title = "发货单与货运计划多对多关联", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(bizSendShipmentRelService.deleteWithValidByIds(List.of(ids), true));
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysAmazonStoreController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysAmazonStoreController.java
index 0d02de2..170f013 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysAmazonStoreController.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysAmazonStoreController.java
@@ -6,6 +6,7 @@ import lombok.RequiredArgsConstructor;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.validation.constraints.*;
import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.asinkj.amz.api.RemoteFBADataService;
import org.asinkj.amz.service.LingxinCallback;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
@@ -23,6 +24,8 @@ import org.asinkj.amz.domain.bo.SysAmazonStoreBo;
import org.asinkj.amz.service.ISysAmazonStoreService;
import org.asinkj.common.mybatis.core.page.TableDataInfo;
+import javax.annotation.Resource;
+
/**
* 亚马逊店铺信息
* 前端访问路由地址为:/amz/amazonStore
@@ -206,4 +209,20 @@ public class SysAmazonStoreController extends BaseController {
}
return R.ok();
}
+
+ @Resource
+ private RemoteFBADataService remoteFBADataService;
+ @GetMapping("/test3")
+ public R testRmaind() {
+ try {
+ remoteFBADataService.updateRemaind();
+ } catch (Exception e) {
+ throw new RuntimeException(e);
+ }
+ return R.ok();
+ }
+
+
+
+
}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysUserController.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysUserController.java
new file mode 100644
index 0000000..94b818d
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/controller/SysUserController.java
@@ -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.SysUserVo;
+import org.asinkj.amz.domain.bo.SysUserBo;
+import org.asinkj.amz.service.ISysUserService;
+import org.asinkj.common.mybatis.core.page.TableDataInfo;
+
+/**
+ * 用户信息
+ * 前端访问路由地址为:/amz/user
+ *
+ * @author shuo hu
+ * @date 2025-06-17
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/user")
+public class SysUserController extends BaseController {
+
+ private final ISysUserService sysUserService;
+
+ /**
+ * 查询用户信息列表
+ */
+ @SaCheckPermission("amz:user:list")
+ @GetMapping("/list")
+ public TableDataInfo list(SysUserBo bo, PageQuery pageQuery) {
+ return sysUserService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出用户信息列表
+ */
+ @SaCheckPermission("amz:user:export")
+ @Log(title = "用户信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(SysUserBo bo, HttpServletResponse response) {
+ List list = sysUserService.queryList(bo);
+ ExcelUtil.exportExcel(list, "用户信息", SysUserVo.class, response);
+ }
+
+ /**
+ * 获取用户信息详细信息
+ *
+ * @param userId 主键
+ */
+ @SaCheckPermission("amz:user:query")
+ @GetMapping("/{userId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long userId) {
+ return R.ok(sysUserService.queryById(userId));
+ }
+
+ /**
+ * 新增用户信息
+ */
+ @SaCheckPermission("amz:user:add")
+ @Log(title = "用户信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody SysUserBo bo) {
+ return toAjax(sysUserService.insertByBo(bo));
+ }
+
+ /**
+ * 修改用户信息
+ */
+ @SaCheckPermission("amz:user:edit")
+ @Log(title = "用户信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody SysUserBo bo) {
+ return toAjax(sysUserService.updateByBo(bo));
+ }
+
+ /**
+ * 删除用户信息
+ *
+ * @param userIds 主键串
+ */
+ @SaCheckPermission("amz:user:remove")
+ @Log(title = "用户信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{userIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] userIds) {
+ return toAjax(sysUserService.deleteWithValidByIds(List.of(userIds), true));
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java
index 9dd34be..38b7b0b 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizLogisticsQuote.java
@@ -112,6 +112,7 @@ public class BizLogisticsQuote extends TenantEntity {
private Long inquiryId;
+ private String customsFlag;
/**
* 后端物流类型
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java
index 0609865..3f8d3cc 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizPurchaseOrderItem.java
@@ -174,6 +174,13 @@ public class BizPurchaseOrderItem extends TenantEntity {
*/
private String spuName;
+ @AutoMapping(dateFormat = "yyyy-MM-dd HH:mm:ss")
+ private Date confirmTime;
+
+ private Long confirmBy;
+ private String confirmOpenId;
+
+
/**
* 删除标志(0正常 2删除)
*/
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizSendShipmentRel.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizSendShipmentRel.java
new file mode 100644
index 0000000..37e1852
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/BizSendShipmentRel.java
@@ -0,0 +1,40 @@
+package org.asinkj.amz.domain;
+
+import org.asinkj.common.mybatis.core.domain.BaseEntity;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serial;
+
+/**
+ * 发货单与货运计划多对多关联对象 biz_send_shipment_rel
+ *
+ * @author shuo hu
+ * @date 2025-06-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("biz_send_shipment_rel")
+public class BizSendShipmentRel extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * $column.columnComment
+ */
+ private Long id;
+
+ /**
+ * 发货单ID
+ */
+ private Long sendOrderId;
+
+ /**
+ * 货运计划ID
+ */
+ private Long shipmentPlanId;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysUser.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysUser.java
new file mode 100644
index 0000000..e7c2c00
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/SysUser.java
@@ -0,0 +1,113 @@
+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;
+
+/**
+ * 用户信息对象 sys_user
+ *
+ * @author shuo hu
+ * @date 2025-06-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("sys_user")
+public class SysUser extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户ID
+ */
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ private String nickName;
+
+ /**
+ * 用户类型(sys_user系统用户)
+ */
+ private String userType;
+
+ /**
+ * 用户邮箱
+ */
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ private String phonenumber;
+
+ /**
+ * 用户性别(0男 1女 2未知)
+ */
+ private String sex;
+
+ /**
+ * 头像地址
+ */
+ private Long avatar;
+
+ /**
+ * 密码
+ */
+ private String password;
+
+ /**
+ * 帐号状态(0正常 1停用)
+ */
+ private String status;
+
+ /**
+ * 删除标志(0代表存在 2代表删除)
+ */
+ @TableLogic
+ private String delFlag;
+
+ /**
+ * 最后登陆IP
+ */
+ private String loginIp;
+
+ /**
+ * 最后登陆时间
+ */
+ private Date loginDate;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+ /**
+ * open_id
+ */
+ private String openId;
+
+ /**
+ * 详细地址
+ */
+ private String address;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BatchRelDTO.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BatchRelDTO.java
new file mode 100644
index 0000000..51ce102
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BatchRelDTO.java
@@ -0,0 +1,15 @@
+package org.asinkj.amz.domain.bo;
+
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class BatchRelDTO {
+ @NotEmpty(message = "发货单ID列表不能为空")
+ private List sendOrderIds;
+
+ @NotEmpty(message = "货运计划ID列表不能为空")
+ private List shipmentIds;
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java
index c0b0fdb..c4099d0 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizInquiryRequestBo.java
@@ -98,5 +98,8 @@ public class BizInquiryRequestBo extends BaseEntity {
*/
private Date quoteDate;
+ private String customsFlag;
+
+
}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java
index 30040bc..a7d8208 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizLogisticsQuoteBo.java
@@ -113,7 +113,7 @@ public class BizLogisticsQuoteBo extends BaseEntity {
@NotBlank(message = "单位不能为空", groups = { AddGroup.class, EditGroup.class })
private String unit;
-
+ private String customsFlag;
private String backLogisticsType;
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizSendShipmentRelBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizSendShipmentRelBo.java
new file mode 100644
index 0000000..f9087dd
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizSendShipmentRelBo.java
@@ -0,0 +1,42 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.BizSendShipmentRel;
+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.*;
+
+/**
+ * 发货单与货运计划多对多关联业务对象 biz_send_shipment_rel
+ *
+ * @author shuo hu
+ * @date 2025-06-20
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = BizSendShipmentRel.class, reverseConvertGenerate = false)
+public class BizSendShipmentRelBo extends BaseEntity {
+
+ /**
+ * $column.columnComment
+ */
+// @NotNull(message = "$column.columnComment不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long id;
+
+ /**
+ * 发货单ID
+ */
+ @NotNull(message = "发货单ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long sendOrderId;
+
+ /**
+ * 货运计划ID
+ */
+ @NotNull(message = "货运计划ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long shipmentPlanId;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java
index 95a2728..13639ee 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/BizShipmentPlanBo.java
@@ -48,6 +48,8 @@ public class BizShipmentPlanBo extends BaseEntity {
// @NotBlank(message = "货件编号不能为空", groups = { AddGroup.class, EditGroup.class })
private String shipmentId;
+ private List shipmentIds;
+
/**
* 货件名称
*/
@@ -199,8 +201,12 @@ public class BizShipmentPlanBo extends BaseEntity {
// @NotNull(message = "供应商发货单id不能为空", groups = { AddGroup.class, EditGroup.class })
private Long sendOrderId;
+ private List sendOrderIds;
+
private String sellerName;
private Collection sidList;
+ private String linkType;
+
}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysUserBo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysUserBo.java
new file mode 100644
index 0000000..22c2c4d
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/bo/SysUserBo.java
@@ -0,0 +1,122 @@
+package org.asinkj.amz.domain.bo;
+
+import org.asinkj.amz.domain.SysUser;
+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;
+
+/**
+ * 用户信息业务对象 sys_user
+ *
+ * @author shuo hu
+ * @date 2025-06-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@AutoMapper(target = SysUser.class, reverseConvertGenerate = false)
+public class SysUserBo extends BaseEntity {
+
+ /**
+ * 用户ID
+ */
+ @NotNull(message = "用户ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ @NotNull(message = "部门ID不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ @NotBlank(message = "用户账号不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ @NotBlank(message = "用户昵称不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String nickName;
+
+ /**
+ * 用户类型(sys_user系统用户)
+ */
+ @NotBlank(message = "用户类型(sys_user系统用户)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String userType;
+
+ /**
+ * 用户邮箱
+ */
+ @NotBlank(message = "用户邮箱不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ @NotBlank(message = "手机号码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String phonenumber;
+
+ /**
+ * 用户性别(0男 1女 2未知)
+ */
+ @NotBlank(message = "用户性别(0男 1女 2未知)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String sex;
+
+ /**
+ * 头像地址
+ */
+ @NotNull(message = "头像地址不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Long avatar;
+
+ /**
+ * 密码
+ */
+ @NotBlank(message = "密码不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String password;
+
+ /**
+ * 帐号状态(0正常 1停用)
+ */
+ @NotBlank(message = "帐号状态(0正常 1停用)不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String status;
+
+ /**
+ * 最后登陆IP
+ */
+ @NotBlank(message = "最后登陆IP不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String loginIp;
+
+ /**
+ * 最后登陆时间
+ */
+ @NotNull(message = "最后登陆时间不能为空", groups = { AddGroup.class, EditGroup.class })
+ private Date loginDate;
+
+ /**
+ * 备注
+ */
+ @NotBlank(message = "备注不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String remark;
+
+ /**
+ * open_id
+ */
+ @NotBlank(message = "open_id不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String openId;
+
+ /**
+ * 详细地址
+ */
+ @NotBlank(message = "详细地址不能为空", groups = { AddGroup.class, EditGroup.class })
+ private String address;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java
index f95469e..a7deb25 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizInquiryRequestVo.java
@@ -123,5 +123,8 @@ public class BizInquiryRequestVo implements Serializable {
private FbaShipmentApiResponse.Address shipToAddress;
+ private String customsFlag;
+
+
}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java
index a7b0daa..8ef5d9e 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizLogisticsQuoteVo.java
@@ -129,9 +129,7 @@ public class BizLogisticsQuoteVo implements Serializable {
@ExcelProperty(value = "单位")
private String unit;
-
-
-
+ private String customsFlag;
private String backLogisticsType;
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizSendShipmentRelVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizSendShipmentRelVo.java
new file mode 100644
index 0000000..643ad44
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/BizSendShipmentRelVo.java
@@ -0,0 +1,51 @@
+package org.asinkj.amz.domain.vo;
+
+import org.asinkj.amz.domain.BizSendShipmentRel;
+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_send_shipment_rel
+ *
+ * @author shuo hu
+ * @date 2025-06-20
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = BizSendShipmentRel.class)
+public class BizSendShipmentRelVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * $column.columnComment
+ */
+ @ExcelProperty(value = "${comment}", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "$column.readConverterExp()")
+ private Long id;
+
+ /**
+ * 发货单ID
+ */
+ @ExcelProperty(value = "发货单ID")
+ private Long sendOrderId;
+
+ /**
+ * 货运计划ID
+ */
+ @ExcelProperty(value = "货运计划ID")
+ private Long shipmentPlanId;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysUserVo.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysUserVo.java
new file mode 100644
index 0000000..7dae5de
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/domain/vo/SysUserVo.java
@@ -0,0 +1,133 @@
+package org.asinkj.amz.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import org.asinkj.amz.domain.SysUser;
+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;
+
+
+
+/**
+ * 用户信息视图对象 sys_user
+ *
+ * @author shuo hu
+ * @date 2025-06-17
+ */
+@Data
+@ExcelIgnoreUnannotated
+@AutoMapper(target = SysUser.class)
+public class SysUserVo implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 用户ID
+ */
+ @ExcelProperty(value = "用户ID")
+ private Long userId;
+
+ /**
+ * 部门ID
+ */
+ @ExcelProperty(value = "部门ID")
+ private Long deptId;
+
+ /**
+ * 用户账号
+ */
+ @ExcelProperty(value = "用户账号")
+ private String userName;
+
+ /**
+ * 用户昵称
+ */
+ @ExcelProperty(value = "用户昵称")
+ private String nickName;
+
+ /**
+ * 用户类型(sys_user系统用户)
+ */
+ @ExcelProperty(value = "用户类型", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "s=ys_user系统用户")
+ private String userType;
+
+ /**
+ * 用户邮箱
+ */
+ @ExcelProperty(value = "用户邮箱")
+ private String email;
+
+ /**
+ * 手机号码
+ */
+ @ExcelProperty(value = "手机号码")
+ private String phonenumber;
+
+ /**
+ * 用户性别(0男 1女 2未知)
+ */
+ @ExcelProperty(value = "用户性别", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "0=男,1=女,2=未知")
+ private String sex;
+
+ /**
+ * 头像地址
+ */
+ @ExcelProperty(value = "头像地址")
+ private Long avatar;
+
+ /**
+ * 密码
+ */
+ @ExcelProperty(value = "密码")
+ private String password;
+
+ /**
+ * 帐号状态(0正常 1停用)
+ */
+ @ExcelProperty(value = "帐号状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+ private String status;
+
+ /**
+ * 最后登陆IP
+ */
+ @ExcelProperty(value = "最后登陆IP")
+ private String loginIp;
+
+ /**
+ * 最后登陆时间
+ */
+ @ExcelProperty(value = "最后登陆时间")
+ private Date loginDate;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+ /**
+ * open_id
+ */
+ @ExcelProperty(value = "open_id")
+ private String openId;
+
+ /**
+ * 详细地址
+ */
+ @ExcelProperty(value = "详细地址")
+ private String address;
+
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java
index b842363..2f6329c 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/dubbo/RemoteFBADataServiceImpl.java
@@ -1,26 +1,56 @@
package org.asinkj.amz.dubbo;
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboService;
import org.asinkj.amz.api.RemoteFBADataService;
+import org.asinkj.amz.domain.BizPurchaseOrder;
+import org.asinkj.amz.domain.BizPurchaseOrderItem;
+import org.asinkj.amz.domain.SysUser;
+import org.asinkj.amz.mapper.BizPurchaseOrderItemMapper;
+import org.asinkj.amz.mapper.BizPurchaseOrderMapper;
+import org.asinkj.amz.mapper.SysUserMapper;
import org.asinkj.amz.service.IBizInquiryRequestService;
import org.asinkj.amz.service.ISysAmazonStoreService;
import org.asinkj.amz.service.LingxinCallback;
+import org.asinkj.common.wp.handler.WxMessagesManager;
+import org.asinkj.utils.WpMessageUtil;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
@RequiredArgsConstructor
@Service
@DubboService
+@Slf4j
public class RemoteFBADataServiceImpl implements RemoteFBADataService {
+ public static final String KEYWORD_1 = "有订单还没有开始备料,请及时备料!";
+ public static final String KEYWORD_11 = "有订单还没有开始上线生产,请及时上线生产!";
@Resource
private ISysAmazonStoreService sysAmazonStoreService;
@Resource
private IBizInquiryRequestService ibizInquiryRequestService;
+ @Resource
+ private BizPurchaseOrderItemMapper purchaseOrderItemMapper;
+ @Resource
+ private BizPurchaseOrderMapper bizPurchaseOrderMapper;
+
+ @Resource
+ private SysUserMapper sysUserMapper;
+
+// @Resource
+// private WpMessageUtil wpMessageUtil;
+
@Override
public void pullAmzFbaDataToken(String startDate, String endDate) throws Exception {
sysAmazonStoreService.pullAmzStaData(startDate, endDate, (result, status) -> {
@@ -41,7 +71,7 @@ public class RemoteFBADataServiceImpl implements RemoteFBADataService {
@Override
public void pullPurchaseOrderData(String startDate, String endDate) throws Exception {
- sysAmazonStoreService.pullPurchaseOrderData(startDate, endDate,new LingxinCallback() {
+ sysAmazonStoreService.pullPurchaseOrderData(startDate, endDate, new LingxinCallback() {
@Override
public void onFinished(String result, int status) {
@@ -51,7 +81,7 @@ public class RemoteFBADataServiceImpl implements RemoteFBADataService {
@Override
public void updatePurchaseOrderSeller(String startDate, String endDate) throws Exception {
- sysAmazonStoreService.updatePurchaseOrderSeller(startDate, endDate,new LingxinCallback() {
+ sysAmazonStoreService.updatePurchaseOrderSeller(startDate, endDate, new LingxinCallback() {
@Override
public void onFinished(String result, int status) {
@@ -64,4 +94,70 @@ public class RemoteFBADataServiceImpl implements RemoteFBADataService {
public void quoteReminder() throws Exception {
ibizInquiryRequestService.quoteReminder();
}
+
+ @Override
+ public void updateRemaind() {
+ LambdaQueryWrapper queryWrapper1 = new LambdaQueryWrapper<>();
+ queryWrapper1.eq(BizPurchaseOrder::getOrderStatus, "ord_unconfirmed");
+ List bizPurchaseOrders = bizPurchaseOrderMapper.selectList(queryWrapper1);
+
+ Set collect = bizPurchaseOrders.stream().map(BizPurchaseOrder::getSupplierName).collect(Collectors.toSet());
+ LambdaQueryWrapper queryWrapper2 = new LambdaQueryWrapper<>();
+ queryWrapper2.in(SysUser::getNickName, collect);
+ List sysUsers = sysUserMapper.selectList(queryWrapper2);
+ Set openIds = sysUsers.stream().map(SysUser::getOpenId).filter(Objects::nonNull).collect(Collectors.toSet());
+// Map collect1 = sysUsers.stream().collect(Collectors.toMap(SysUser::getNickName, Function.identity()));
+// WpMessageUtil.sendWechatTempMessage("有新订单,请及时确认!", DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN), );
+ if (CollectionUtil.isNotEmpty((openIds))) {
+ WxMessagesManager.sendWechatTempMessage("有新订单,请及时确认!",
+ DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN),
+ openIds.toArray(new String[0])
+ );
+ }else {
+ log.info("用户为空");
+ }
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.isNotNull(BizPurchaseOrderItem::getConfirmBy);
+ List bizPurchaseOrderItems = purchaseOrderItemMapper.selectList(queryWrapper);
+ if (CollectionUtil.isEmpty(bizPurchaseOrderItems)) {
+ log.info("没有待处理订单");
+ return;
+ }
+ Set orderSns = bizPurchaseOrderItems.stream().map(BizPurchaseOrderItem::getOrderSn).collect(Collectors.toSet());
+ LambdaQueryWrapper inQueryWrapper = new LambdaQueryWrapper()
+ .in(BizPurchaseOrder::getOrderSn, orderSns);
+
+ Map purchaseOrderMap = bizPurchaseOrderMapper.selectList(inQueryWrapper).stream().collect(Collectors.toMap(BizPurchaseOrder::getOrderSn, Function.identity()));
+ ArrayList materialPreparingList = new ArrayList<>();
+ ArrayList productionStartedList = new ArrayList<>();
+ for (BizPurchaseOrderItem bizPurchaseOrderItem : bizPurchaseOrderItems) {
+ BizPurchaseOrder bizPurchaseOrder = purchaseOrderMap.get(bizPurchaseOrderItem.getOrderSn());
+ Date confirmTime = bizPurchaseOrderItem.getConfirmTime();
+ Long estDlvDays = bizPurchaseOrder.getEstDlvDays();
+ long l = estDlvDays * 20 / 100;
+ Date materialPreparingTime = new Date(confirmTime.getTime() + l * 24 * 60 * 60 * 1000);
+ long l1 = estDlvDays * 50 / 100;
+ Date productionStartedTime = new Date(confirmTime.getTime() + l1 * 24 * 60 * 60 * 1000);
+
+ if (DateUtil.compare(materialPreparingTime, DateUtil.date()) > 0 && bizPurchaseOrderItem.getOrderStatus().equals("ord_confirmed")) {
+ //提示用户当前时间超过了备料 时间
+ materialPreparingList.add(bizPurchaseOrderItem.getConfirmOpenId());
+ } else if (DateUtil.compare(productionStartedTime, DateUtil.date()) > 0 && bizPurchaseOrderItem.getOrderStatus().equals("material_preparing")) {
+ productionStartedList.add(bizPurchaseOrderItem.getConfirmOpenId());
+ }
+ }
+ if (CollectionUtil.isNotEmpty(materialPreparingList)) {
+ WxMessagesManager.sendWechatTempMessage(KEYWORD_1,
+ DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN),
+ materialPreparingList.toArray(new String[0]));
+ }
+
+ if (CollectionUtil.isNotEmpty(productionStartedList)) {
+ WxMessagesManager.sendWechatTempMessage(KEYWORD_11,
+ DateUtil.offsetMinute(DateUtil.date(), 30).toString(DatePattern.NORM_DATETIME_PATTERN),
+ productionStartedList.toArray(new String[0])
+ );
+ }
+
+ }
}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizSendShipmentRelMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizSendShipmentRelMapper.java
new file mode 100644
index 0000000..187e89d
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/BizSendShipmentRelMapper.java
@@ -0,0 +1,17 @@
+package org.asinkj.amz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.asinkj.amz.domain.BizSendShipmentRel;
+import org.asinkj.amz.domain.vo.BizSendShipmentRelVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+
+/**
+ * 发货单与货运计划多对多关联Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-06-20
+ */
+@Mapper
+public interface BizSendShipmentRelMapper extends BaseMapperPlus {
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysUserMapper.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysUserMapper.java
new file mode 100644
index 0000000..ea1937f
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/mapper/SysUserMapper.java
@@ -0,0 +1,18 @@
+package org.asinkj.amz.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.asinkj.amz.domain.SysUser;
+import org.asinkj.amz.domain.vo.SysUserVo;
+import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
+import org.springframework.stereotype.Component;
+
+/**
+ * 用户信息Mapper接口
+ *
+ * @author shuo hu
+ * @date 2025-06-17
+ */
+@Mapper
+public interface SysUserMapper extends BaseMapperPlus {
+
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizSendShipmentRelService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizSendShipmentRelService.java
new file mode 100644
index 0000000..aeb5088
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/IBizSendShipmentRelService.java
@@ -0,0 +1,69 @@
+package org.asinkj.amz.service;
+
+import org.asinkj.amz.domain.BizSendShipmentRel;
+import org.asinkj.amz.domain.vo.BizSendShipmentRelVo;
+import org.asinkj.amz.domain.bo.BizSendShipmentRelBo;
+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-06-20
+ */
+public interface IBizSendShipmentRelService {
+
+ /**
+ * 查询发货单与货运计划多对多关联
+ *
+ * @param id 主键
+ * @return 发货单与货运计划多对多关联
+ */
+ BizSendShipmentRelVo queryById(Long id);
+
+ /**
+ * 分页查询发货单与货运计划多对多关联列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 发货单与货运计划多对多关联分页列表
+ */
+ TableDataInfo queryPageList(BizSendShipmentRelBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的发货单与货运计划多对多关联列表
+ *
+ * @param bo 查询条件
+ * @return 发货单与货运计划多对多关联列表
+ */
+ List queryList(BizSendShipmentRelBo bo);
+
+ /**
+ * 新增发货单与货运计划多对多关联
+ *
+ * @param bo 发货单与货运计划多对多关联
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(BizSendShipmentRelBo bo);
+
+ /**
+ * 修改发货单与货运计划多对多关联
+ *
+ * @param bo 发货单与货运计划多对多关联
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(BizSendShipmentRelBo bo);
+
+ /**
+ * 校验并批量删除发货单与货运计划多对多关联信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysUserService.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysUserService.java
new file mode 100644
index 0000000..8e343c0
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/ISysUserService.java
@@ -0,0 +1,69 @@
+package org.asinkj.amz.service;
+
+import org.asinkj.amz.domain.SysUser;
+import org.asinkj.amz.domain.vo.SysUserVo;
+import org.asinkj.amz.domain.bo.SysUserBo;
+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-06-17
+ */
+public interface ISysUserService {
+
+ /**
+ * 查询用户信息
+ *
+ * @param userId 主键
+ * @return 用户信息
+ */
+ SysUserVo queryById(Long userId);
+
+ /**
+ * 分页查询用户信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 用户信息分页列表
+ */
+ TableDataInfo queryPageList(SysUserBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询符合条件的用户信息列表
+ *
+ * @param bo 查询条件
+ * @return 用户信息列表
+ */
+ List queryList(SysUserBo bo);
+
+ /**
+ * 新增用户信息
+ *
+ * @param bo 用户信息
+ * @return 是否新增成功
+ */
+ Boolean insertByBo(SysUserBo bo);
+
+ /**
+ * 修改用户信息
+ *
+ * @param bo 用户信息
+ * @return 是否修改成功
+ */
+ Boolean updateByBo(SysUserBo bo);
+
+ /**
+ * 校验并批量删除用户信息信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java
index 246072a..13ee5d4 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizLogisticsQuoteServiceImpl.java
@@ -260,6 +260,7 @@ public class BizLogisticsQuoteServiceImpl implements IBizLogisticsQuoteService {
bizLogisticsQuote.setChannelType(bo.getChannelType());
bizLogisticsQuote.setChannelId(bo.getChannelId());
bizLogisticsQuote.setIsDdp(bo.getIsDdp());
+ bizLogisticsQuote.setRemark(bo.getRemark());
bizLogisticsQuote.setUnit(bo.getUnit());
bizLogisticsQuote.setInquiryId(bo.getId());
bizLogisticsQuotes.add(bizLogisticsQuote);
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java
index edd0d01..1b2bcb3 100644
--- a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizPurchaseOrderServiceImpl.java
@@ -304,6 +304,10 @@ public class BizPurchaseOrderServiceImpl implements IBizPurchaseOrderService {
LambdaUpdateWrapper lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.in(BizPurchaseOrderItem::getOrderSn, update.getOrderSn());
lambdaUpdateWrapper.set(BizPurchaseOrderItem::getOrderStatus, "ord_confirmed");
+ lambdaUpdateWrapper.set(BizPurchaseOrderItem::getConfirmBy, LoginHelper.getUserId());
+ lambdaUpdateWrapper.set(BizPurchaseOrderItem::getConfirmOpenId, LoginHelper.getLoginUser().getOpenId());
+
+ lambdaUpdateWrapper.set(BizPurchaseOrderItem::getConfirmTime, new Date());
purchaseOrderItemMapper.update(lambdaUpdateWrapper);
return baseMapper.updateById(update) > 0;
}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizSendShipmentRelServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizSendShipmentRelServiceImpl.java
new file mode 100644
index 0000000..ee48394
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/BizSendShipmentRelServiceImpl.java
@@ -0,0 +1,176 @@
+package org.asinkj.amz.service.impl;
+
+import lombok.extern.slf4j.Slf4j;
+import org.asinkj.amz.domain.bo.BatchRelDTO;
+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.BizSendShipmentRelBo;
+import org.asinkj.amz.domain.vo.BizSendShipmentRelVo;
+import org.asinkj.amz.domain.BizSendShipmentRel;
+import org.asinkj.amz.mapper.BizSendShipmentRelMapper;
+import org.asinkj.amz.service.IBizSendShipmentRelService;
+
+import java.util.*;
+
+/**
+ * 发货单与货运计划多对多关联Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-06-20
+ */
+@RequiredArgsConstructor
+@Service
+@Slf4j
+public class BizSendShipmentRelServiceImpl implements IBizSendShipmentRelService {
+
+ private final BizSendShipmentRelMapper baseMapper;
+
+ /**
+ * 查询发货单与货运计划多对多关联
+ *
+ * @param id 主键
+ * @return 发货单与货运计划多对多关联
+ */
+ @Override
+ public BizSendShipmentRelVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 分页查询发货单与货运计划多对多关联列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 发货单与货运计划多对多关联分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(BizSendShipmentRelBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的发货单与货运计划多对多关联列表
+ *
+ * @param bo 查询条件
+ * @return 发货单与货运计划多对多关联列表
+ */
+ @Override
+ public List queryList(BizSendShipmentRelBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(BizSendShipmentRelBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getSendOrderId() != null, BizSendShipmentRel::getSendOrderId, bo.getSendOrderId());
+ lqw.eq(bo.getShipmentPlanId() != null, BizSendShipmentRel::getShipmentPlanId, bo.getShipmentPlanId());
+ return lqw;
+ }
+
+ /**
+ * 新增发货单与货运计划多对多关联
+ *
+ * @param bo 发货单与货运计划多对多关联
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(BizSendShipmentRelBo bo) {
+ BizSendShipmentRel add = MapstructUtils.convert(bo, BizSendShipmentRel.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改发货单与货运计划多对多关联
+ *
+ * @param bo 发货单与货运计划多对多关联
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(BizSendShipmentRelBo bo) {
+ BizSendShipmentRel update = MapstructUtils.convert(bo, BizSendShipmentRel.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(BizSendShipmentRel entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除发货单与货运计划多对多关联信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+
+
+
+ // 构建笛卡尔积关系列表(优化版)
+ private List buildCartesianRelations(BatchRelDTO dto) {
+ // 1. 获取所有已存在的关联关系
+ Set existingRelations = getExistingRelations(dto);
+
+ // 2. 构建笛卡尔积关系列表(过滤已存在的)
+ List relations = new ArrayList<>();
+
+ for (Long orderId : dto.getSendOrderIds()) {
+ for (Long shipmentId : dto.getShipmentIds()) {
+ // 使用组合键检查是否已存在
+ String relationKey = orderId + ":" + shipmentId;
+ if (!existingRelations.contains(relationKey)) {
+ BizSendShipmentRel bizSendShipmentRel = new BizSendShipmentRel();
+ bizSendShipmentRel.setSendOrderId(orderId);
+ bizSendShipmentRel.setShipmentPlanId(shipmentId);
+ relations.add(bizSendShipmentRel);
+ }
+ }
+ }
+
+ log.debug("生成的笛卡尔积关联关系数量: {}", relations.size());
+ return relations;
+ }
+
+ // 批量获取已存在的关联关系
+ private Set getExistingRelations(BatchRelDTO dto) {
+ // 一次性查询所有可能的关联关系
+ List existing = baseMapper.selectList(
+ Wrappers.lambdaQuery()
+ .in(BizSendShipmentRel::getSendOrderId, dto.getSendOrderIds())
+ .in(BizSendShipmentRel::getShipmentPlanId, dto.getShipmentIds())
+ );
+
+ // 创建组合键集合
+ Set existingKeys = new HashSet<>();
+ for (BizSendShipmentRel rel : existing) {
+ existingKeys.add(rel.getSendOrderId() + ":" + rel.getShipmentPlanId());
+ }
+
+ return existingKeys;
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysUserServiceImpl.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysUserServiceImpl.java
new file mode 100644
index 0000000..ed69bf5
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/amz/service/impl/SysUserServiceImpl.java
@@ -0,0 +1,143 @@
+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.SysUserBo;
+import org.asinkj.amz.domain.vo.SysUserVo;
+import org.asinkj.amz.domain.SysUser;
+import org.asinkj.amz.mapper.SysUserMapper;
+import org.asinkj.amz.service.ISysUserService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 用户信息Service业务层处理
+ *
+ * @author shuo hu
+ * @date 2025-06-17
+ */
+@RequiredArgsConstructor
+@Service
+public class SysUserServiceImpl implements ISysUserService {
+
+ private final SysUserMapper baseMapper;
+
+ /**
+ * 查询用户信息
+ *
+ * @param userId 主键
+ * @return 用户信息
+ */
+ @Override
+ public SysUserVo queryById(Long userId){
+ return baseMapper.selectVoById(userId);
+ }
+
+ /**
+ * 分页查询用户信息列表
+ *
+ * @param bo 查询条件
+ * @param pageQuery 分页参数
+ * @return 用户信息分页列表
+ */
+ @Override
+ public TableDataInfo queryPageList(SysUserBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询符合条件的用户信息列表
+ *
+ * @param bo 查询条件
+ * @return 用户信息列表
+ */
+ @Override
+ public List queryList(SysUserBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(SysUserBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getUserId() != null, SysUser::getUserId, bo.getUserId());
+ lqw.eq(bo.getDeptId() != null, SysUser::getDeptId, bo.getDeptId());
+ lqw.like(StringUtils.isNotBlank(bo.getUserName()), SysUser::getUserName, bo.getUserName());
+ lqw.like(StringUtils.isNotBlank(bo.getNickName()), SysUser::getNickName, bo.getNickName());
+ lqw.eq(StringUtils.isNotBlank(bo.getUserType()), SysUser::getUserType, bo.getUserType());
+ lqw.eq(StringUtils.isNotBlank(bo.getEmail()), SysUser::getEmail, bo.getEmail());
+ lqw.eq(StringUtils.isNotBlank(bo.getPhonenumber()), SysUser::getPhonenumber, bo.getPhonenumber());
+ lqw.eq(StringUtils.isNotBlank(bo.getSex()), SysUser::getSex, bo.getSex());
+ lqw.eq(bo.getAvatar() != null, SysUser::getAvatar, bo.getAvatar());
+ lqw.eq(StringUtils.isNotBlank(bo.getPassword()), SysUser::getPassword, bo.getPassword());
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), SysUser::getStatus, bo.getStatus());
+ lqw.eq(StringUtils.isNotBlank(bo.getLoginIp()), SysUser::getLoginIp, bo.getLoginIp());
+ lqw.eq(bo.getLoginDate() != null, SysUser::getLoginDate, bo.getLoginDate());
+ lqw.eq(StringUtils.isNotBlank(bo.getOpenId()), SysUser::getOpenId, bo.getOpenId());
+ lqw.eq(StringUtils.isNotBlank(bo.getAddress()), SysUser::getAddress, bo.getAddress());
+ return lqw;
+ }
+
+ /**
+ * 新增用户信息
+ *
+ * @param bo 用户信息
+ * @return 是否新增成功
+ */
+ @Override
+ public Boolean insertByBo(SysUserBo bo) {
+ SysUser add = MapstructUtils.convert(bo, SysUser.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setUserId(add.getUserId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改用户信息
+ *
+ * @param bo 用户信息
+ * @return 是否修改成功
+ */
+ @Override
+ public Boolean updateByBo(SysUserBo bo) {
+ SysUser update = MapstructUtils.convert(bo, SysUser.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(SysUser entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 校验并批量删除用户信息信息
+ *
+ * @param ids 待删除的主键集合
+ * @param isValid 是否进行有效性校验
+ * @return 是否删除成功
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteByIds(ids) > 0;
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/utils/WpMessageUtil.java b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/utils/WpMessageUtil.java
new file mode 100644
index 0000000..5edf2e5
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/java/org/asinkj/utils/WpMessageUtil.java
@@ -0,0 +1,45 @@
+package org.asinkj.utils;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.asinkj.amz.domain.SysUser;
+import org.asinkj.amz.mapper.SysUserMapper;
+import org.asinkj.common.wp.handler.WxMessagesManager;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.annotation.PostConstruct;
+import javax.annotation.Resource;
+import java.util.Collection;
+import java.util.List;
+
+@Component
+@Slf4j
+public class WpMessageUtil {
+
+ private static SysUserMapper userServiceInstance; // 静态变量
+
+ @Resource
+ private SysUserMapper userMapper; // 非静态实例变量
+
+ @PostConstruct
+ public void init() {
+ userServiceInstance = userMapper; // 依赖注入后初始化静态引用
+ }
+
+
+ public static void sendWechatTempMessage(String keyword1, String keyword2, Collection userIds) {
+ if (CollectionUtil.isEmpty(userIds)) {
+ log.info("用户为空");
+ return;
+ }
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.select(SysUser::getOpenId).in(SysUser::getUserId, userIds);
+ List users = userServiceInstance.selectList(queryWrapper);
+
+ WxMessagesManager.sendWechatTempMessage(keyword1, keyword2, users.stream().map(SysUser::getOpenId).toArray(String[]::new));
+ }
+}
diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizSendShipmentRelMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizSendShipmentRelMapper.xml
new file mode 100644
index 0000000..8968292
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/BizSendShipmentRelMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/SysUserMapper.xml b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/SysUserMapper.xml
new file mode 100644
index 0000000..4849907
--- /dev/null
+++ b/asinkj-biz/asinkj-amz/src/main/resources/mapper/amz/SysUserMapper.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java b/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java
index 9f1d1ca..3e19859 100644
--- a/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java
+++ b/asinkj-common/asinkj-common-wp/src/main/java/org/asinkj/common/wp/handler/WxMessagesManager.java
@@ -74,6 +74,10 @@ public class WxMessagesManager {
for (String openId : openIds) {
try {
// 根据用户ID获取已绑定的 OpenID(需自行实现)
+ if (openId == null){
+ log.error("微信消息推送失败,用户ID为空");
+ continue;
+ }
log.info("微信消息推送 => openid:{}", openId);
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
diff --git a/asinkj-modules/asinkj-gen/src/main/resources/vm/java/mapper.java.vm b/asinkj-modules/asinkj-gen/src/main/resources/vm/java/mapper.java.vm
index 3a3e38f..d29cfe2 100644
--- a/asinkj-modules/asinkj-gen/src/main/resources/vm/java/mapper.java.vm
+++ b/asinkj-modules/asinkj-gen/src/main/resources/vm/java/mapper.java.vm
@@ -3,13 +3,14 @@ package ${packageName}.mapper;
import ${packageName}.domain.${ClassName};
import ${packageName}.domain.vo.${ClassName}Vo;
import org.asinkj.common.mybatis.core.mapper.BaseMapperPlus;
-
+import org.apache.ibatis.annotations.Mapper;
/**
* ${functionName}Mapper接口
*
* @author ${author}
* @date ${datetime}
*/
+@Mapper
public interface ${ClassName}Mapper extends BaseMapperPlus<${ClassName}, ${ClassName}Vo> {
}
diff --git a/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/RemindJobExecutor.java b/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/RemindJobExecutor.java
new file mode 100644
index 0000000..fcfc429
--- /dev/null
+++ b/asinkj-modules/asinkj-job/src/main/java/org/asinkj/job/snailjob/RemindJobExecutor.java
@@ -0,0 +1,64 @@
+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 = "RemindJobExecutor")
+@Slf4j
+public class RemindJobExecutor {
+
+ @DubboReference
+ private RemoteFBADataService remoteFBADataService;
+
+ public ExecuteResult jobExecute(JobArgs jobArgs) throws Exception {
+ SnailJobLog.LOCAL.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
+ SnailJobLog.REMOTE.info("amzPullFBAJobExecutor. jobArgs:{}", JsonUtil.toJsonString(jobArgs));
+ remoteFBADataService.updateRemaind();
+ return ExecuteResult.success("RemindJobExecutor");
+ }
+
+
+
+// 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");
+// }
+}
diff --git a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java
index 5a91846..7c4b806 100644
--- a/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java
+++ b/asinkj-modules/asinkj-system/src/main/java/org/asinkj/system/dubbo/RemoteUserServiceImpl.java
@@ -269,6 +269,7 @@ public class RemoteUserServiceImpl implements RemoteUserService {
LoginUser loginUser = new LoginUser();
loginUser.setTenantId(userVo.getTenantId());
loginUser.setUserId(userVo.getUserId());
+ loginUser.setOpenId(userVo.getOpenId());
loginUser.setDeptId(userVo.getDeptId());
loginUser.setUsername(userVo.getUserName());
loginUser.setNickname(userVo.getNickName());
diff --git a/asinkj-node/src/routes/bff.js b/asinkj-node/src/routes/bff.js
index e69de29..7c6243b 100644
--- a/asinkj-node/src/routes/bff.js
+++ b/asinkj-node/src/routes/bff.js
@@ -0,0 +1,59 @@
+// src/routes/bff.js
+const express = require('express');
+const axios = require('axios');
+const router = express.Router();
+const {nacosClient, serviceConfig} = require('../nacos-config.js');
+
+// 简单的 hello 测试接口
+router.get('/hello2', (req, res) => {
+ console.log('BFF 接收到请求:', req.method, req.url);
+ res.json({
+ message: 'Hello from Node.js BFF!',
+ serviceName: serviceConfig.serviceName,
+ clientIp: req.ip,
+ time: new Date().toISOString(),
+ tips: '简单的 hello 测试接口'
+ });
+});
+
+// 用户数据聚合接口
+router.get('/users/:id', async (req, res) => {
+ try {
+ const javaService = 'java-user-service';
+ const instances = await nacosClient.getAllInstances(javaService);
+
+ if (!instances || instances.length === 0) {
+ return res.status(503).json({
+ error: '后端服务不可用',
+ details: `无法找到服务: ${javaService}`
+ });
+ }
+
+ // 简单负载均衡:随机选择一个实例
+ const instance = instances[Math.floor(Math.random() * instances.length)];
+ const serviceUrl = `http://${instance.ip}:${instance.port}`;
+
+ const response = await axios.get(`${serviceUrl}/users/${req.params.id}`, {
+ timeout: 5000 // 添加超时控制
+ });
+
+ res.json({
+ source: 'Node.js BFF',
+ backend: instance,
+ data: response.data
+ });
+
+ } catch (error) {
+ console.error('BFF 聚合错误:', error);
+
+ // 更详细的错误响应
+ const status = error.response?.status || 500;
+ res.status(status).json({
+ error: '后端服务调用失败',
+ message: error.message,
+ serviceName: serviceConfig.serviceName
+ });
+ }
+});
+
+module.exports = router; // 确保导出路由
diff --git a/asinkj-node/src/server.js b/asinkj-node/src/server.js
index 15cd0aa..16e2f09 100644
--- a/asinkj-node/src/server.js
+++ b/asinkj-node/src/server.js
@@ -8,6 +8,11 @@ const PORT = process.env.PORT || 3000;
// 中间件
app.use(express.json());
+// const bffRoutes = require('./routes/bff');
+// app.use('/api', bffRoutes); // 所有路由添加/bff前缀
+const bffRoutes = require('./routes/bff');
+app.use('/bff', bffRoutes);
+
// 健康检查端点
app.get('/health', (req, res) => {
res.json({