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({