Pārlūkot izejas kodu

Merge remote-tracking branch 'origin/master'

caozj 2 gadi atpakaļ
vecāks
revīzija
f8f0db9510
46 mainītis faili ar 952 papildinājumiem un 166 dzēšanām
  1. 11 11
      code/src/test/java/DingDingDataSource.java
  2. 10 0
      hx-account/src/main/java/com/fjhx/account/controller/account/AccountRunningWaterController.java
  3. 10 0
      hx-account/src/main/java/com/fjhx/account/entity/account/dto/AccountRunningWaterSelectDto.java
  4. 7 0
      hx-account/src/main/java/com/fjhx/account/entity/account/po/AccountRunningWater.java
  5. 7 0
      hx-account/src/main/java/com/fjhx/account/service/account/AccountRunningWaterService.java
  6. 23 3
      hx-account/src/main/java/com/fjhx/account/service/account/impl/AccountRunningWaterServiceImpl.java
  7. 5 1
      hx-admin/src/main/resources/application-dev.yml
  8. 79 0
      hx-common/src/main/java/com/fjhx/common/controller/send/SendMegController.java
  9. 2 2
      hx-common/src/main/java/com/fjhx/common/entity/corporation/po/Corporation.java
  10. 19 0
      hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegDto.java
  11. 27 0
      hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegSelectDto.java
  12. 59 0
      hx-common/src/main/java/com/fjhx/common/entity/send/po/SendMeg.java
  13. 17 0
      hx-common/src/main/java/com/fjhx/common/entity/send/vo/SendMegVo.java
  14. 26 0
      hx-common/src/main/java/com/fjhx/common/mapper/send/SendMegMapper.java
  15. 55 0
      hx-common/src/main/java/com/fjhx/common/service/send/SendMegService.java
  16. 166 0
      hx-common/src/main/java/com/fjhx/common/service/send/impl/SendMegServiceImpl.java
  17. 21 0
      hx-common/src/main/resources/mapper/send/SendMegMapper.xml
  18. 1 1
      hx-customer/src/main/resources/mapper/customer/CustomerMapper.xml
  19. 4 1
      hx-mail/src/main/java/com/fjhx/mail/config/MailServiceConfig.java
  20. 3 9
      hx-mail/src/main/java/com/fjhx/mail/controller/enterprise/EnterpriseMailboxController.java
  21. 3 10
      hx-mail/src/main/java/com/fjhx/mail/controller/personal/PersonalMailboxController.java
  22. 6 5
      hx-mail/src/main/java/com/fjhx/mail/service/enterprise/EnterpriseMailboxService.java
  23. 20 49
      hx-mail/src/main/java/com/fjhx/mail/service/enterprise/impl/EnterpriseMailboxServiceImpl.java
  24. 12 1
      hx-mail/src/main/java/com/fjhx/mail/service/message/impl/InfoServiceImpl.java
  25. 6 5
      hx-mail/src/main/java/com/fjhx/mail/service/personal/PersonalMailboxService.java
  26. 16 46
      hx-mail/src/main/java/com/fjhx/mail/service/personal/impl/PersonalMailboxServiceImpl.java
  27. 5 0
      hx-mes/src/main/java/com/fjhx/mes/entity/production/po/ProductionTaskDetail.java
  28. 5 0
      hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskDetailServiceImpl.java
  29. 20 1
      hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java
  30. 9 0
      hx-supply/src/main/java/com/fjhx/supply/controller/supplier/SupplierInfoController.java
  31. 25 0
      hx-supply/src/main/java/com/fjhx/supply/entity/supplier/dto/SupplierInfoSelectDto.java
  32. 5 0
      hx-supply/src/main/java/com/fjhx/supply/entity/supplier/po/SupplierInfo.java
  33. 8 1
      hx-supply/src/main/java/com/fjhx/supply/service/supplier/SupplierInfoService.java
  34. 80 0
      hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierInfoServiceImpl.java
  35. 15 1
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdOrderDto.java
  36. 3 3
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdOrder.java
  37. 5 0
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/logistics/po/LogisticsInfos.java
  38. 39 6
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdOrderServiceImpl.java
  39. 33 6
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/order/impl/OrderInfoServiceImpl.java
  40. 43 1
      hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/purchase/impl/PurchaseBackServiceImpl.java
  41. 9 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockWaitDetailsDto.java
  42. 5 0
      hx-wms/src/main/java/com/fjhx/wms/entity/stock/vo/StockWaitDetailsVo.java
  43. 5 0
      hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockWaitMapper.java
  44. 2 1
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java
  45. 2 1
      hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java
  46. 19 1
      hx-wms/src/main/resources/mapper/stock/StockWaitMapper.xml

+ 11 - 11
code/src/test/java/DingDingDataSource.java

@@ -2,16 +2,16 @@ import fly.generator.GeneratorApplication;
 
 public class DingDingDataSource {
 
-    public static void main(String[] args) {
-        GeneratorApplication.builder()
-                .url("jdbc:mysql://36.134.91.96:17330/bytesailing_dingding?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
-                .username("fjhx2012mysql")
-                .password("3PN-Mzn#vnP&q6d")
-                .port(9989)
-                .module("hx-dingding")
-                .parent("com.fjhx.dingding")
-                .superServiceClass("com.ruoyi.common.core.service.BaseService")
-                .build();
-    }
+//    public static void main(String[] args) {
+//        GeneratorApplication.builder()
+//                .url("jdbc:mysql://36.134.91.96:17330/bytesailing_dingding?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true")
+//                .username("fjhx2012mysql")
+//                .password("3PN-Mzn#vnP&q6d")
+//                .port(9989)
+//                .module("hx-dingding")
+//                .parent("com.fjhx.dingding")
+//                .superServiceClass("com.ruoyi.common.core.service.BaseService")
+//                .build();
+//    }
 
 }

+ 10 - 0
hx-account/src/main/java/com/fjhx/account/controller/account/AccountRunningWaterController.java

@@ -12,6 +12,8 @@ import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.fjhx.account.service.account.AccountRunningWaterService;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -69,4 +71,12 @@ public class AccountRunningWaterController {
         accountRunningWaterService.delete(dto.getId());
     }
 
+    /**
+     * 到账认领统计
+     */
+    @PostMapping("/claimStatistics")
+    public List<AccountRunningWater> claimStatistics(@RequestBody BaseSelectDto dto) {
+        return accountRunningWaterService.claimStatistics(dto);
+    }
+
 }

+ 10 - 0
hx-account/src/main/java/com/fjhx/account/entity/account/dto/AccountRunningWaterSelectDto.java

@@ -60,4 +60,14 @@ public class AccountRunningWaterSelectDto extends BaseSelectDto {
      */
     private BigDecimal endAmount;
 
+    /**
+     * 对方账户名称
+     */
+    private String name;
+
+    /**
+     * 备注
+     */
+    private String remarks;
+
 }

+ 7 - 0
hx-account/src/main/java/com/fjhx/account/entity/account/po/AccountRunningWater.java

@@ -1,5 +1,6 @@
 package com.fjhx.account.entity.account.po;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.ruoyi.common.core.domain.BasePo;
 import com.baomidou.mybatisplus.annotation.TableName;
 import java.math.BigDecimal;
@@ -87,4 +88,10 @@ public class AccountRunningWater extends BasePo {
      * 是否认领
      */
     private Integer isClaim;
+
+    /**
+     * 条数
+     */
+    @TableField(exist = false)
+    private Integer count;
 }

+ 7 - 0
hx-account/src/main/java/com/fjhx/account/service/account/AccountRunningWaterService.java

@@ -1,12 +1,15 @@
 package com.fjhx.account.service.account;
 
 import com.fjhx.account.entity.account.po.AccountRunningWater;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.core.service.BaseService;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.account.entity.account.vo.AccountRunningWaterVo;
 import com.fjhx.account.entity.account.dto.AccountRunningWaterSelectDto;
 import com.fjhx.account.entity.account.dto.AccountRunningWaterDto;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -43,4 +46,8 @@ public interface AccountRunningWaterService extends BaseService<AccountRunningWa
      */
     void delete(Long id);
 
+    /**
+     * 到账任领统计
+     */
+    List<AccountRunningWater> claimStatistics(BaseSelectDto dto);
 }

+ 23 - 3
hx-account/src/main/java/com/fjhx/account/service/account/impl/AccountRunningWaterServiceImpl.java

@@ -11,6 +11,7 @@ import com.fjhx.account.service.account.AccountRunningWaterService;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.obs.services.internal.ServiceException;
 import com.ruoyi.common.annotation.TenantIgnore;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.utils.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -22,6 +23,8 @@ import com.fjhx.account.entity.account.dto.AccountRunningWaterDto;
 import cn.hutool.core.bean.BeanUtil;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.util.List;
+
 
 /**
  * <p>
@@ -57,9 +60,13 @@ public class AccountRunningWaterServiceImpl extends ServiceImpl<AccountRunningWa
         wrapper.ge(ObjectUtil.isNotEmpty(dto.getBeginTime()),"arw.create_time",dto.getBeginTime());
         //交易结束金额
         wrapper.ge(ObjectUtil.isNotEmpty(dto.getEndTime()),"arw.create_time",dto.getEndTime());
-//        if (StringUtils.isNotEmpty(dto.getKeyword())) {
-//            wrapper.and(wrapper1 -> wrapper1.like("arw.remarks", dto.getKeyword()).or().like("arw.name", dto.getKeyword()));
-//        }
+        //对方账户名称
+        wrapper.ge(ObjectUtil.isNotEmpty(dto.getName()),"arw.name",dto.getName());
+        //摘要
+        wrapper.ge(ObjectUtil.isNotEmpty(dto.getRemarks()),"arw.name",dto.getRemarks());
+        if (StringUtils.isNotEmpty(dto.getKeyword())) {
+            wrapper.and(wrapper1 -> wrapper1.like("arw.remarks", dto.getKeyword()).or().like("arw.name", dto.getKeyword()));
+        }
         if(ObjectUtil.isNotEmpty(dto.getDataType())&&dto.getDataType()==1){//到账认领数据
             wrapper.eq("arw.received",10);
             wrapper.orderByDesc("arw.is_claim","arw.create_time");
@@ -131,4 +138,17 @@ public class AccountRunningWaterServiceImpl extends ServiceImpl<AccountRunningWa
         this.removeById(id);
     }
 
+    /**
+     * 到账任领统计
+     */
+    @Override
+    public List<AccountRunningWater> claimStatistics(BaseSelectDto dto) {
+        QueryWrapper<AccountRunningWater> query = Wrappers.query();
+        query.groupBy("is_claim");
+        query.select("is_claim,count(*) count");
+       //到账认领统计
+       return baseMapper.selectList(query);
+
+    }
+
 }

+ 5 - 1
hx-admin/src/main/resources/application-dev.yml

@@ -65,6 +65,10 @@ spring:
                     url: jdbc:mysql://36.134.91.96:17330/bytesailing_kd100?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
                     username: fjhx2012mysql
                     password: 3PN-Mzn#vnP&q6d
+#                dingding:
+#                    url: jdbc:mysql://36.134.91.96:17330/bytesailing_dingding?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
+#                    username: fjhx2012mysql
+#                    password: 3PN-Mzn#vnP&q6d
                 ehsd:
                     url: jdbc:mysql://36.134.91.96:17330/bytesailing_ehsd?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=Asia/Shanghai
                     username: fjhx2012mysql
@@ -116,4 +120,4 @@ token:
     # 令牌密钥
     secret: abcdefghijklmnopqrstuvwxyz
     # 令牌有效期(默认30分钟)
-    expireTime: 2880
+    expireTime: 2880

+ 79 - 0
hx-common/src/main/java/com/fjhx/common/controller/send/SendMegController.java

@@ -0,0 +1,79 @@
+package com.fjhx.common.controller.send;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.send.dto.SendMegDto;
+import com.fjhx.common.entity.send.dto.SendMegSelectDto;
+import com.fjhx.common.entity.send.vo.SendMegVo;
+import com.fjhx.common.service.send.SendMegService;
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+
+/**
+ * <p>
+ * 前端控制器
+ * </p>
+ *
+ * @author
+ * @since 2023-05-22
+ */
+@EnableScheduling
+@RestController
+@RequestMapping("/sendMeg")
+public class SendMegController {
+
+    @Autowired
+    private SendMegService sendMegService;
+
+    /**
+     * 分页
+     */
+    @PostMapping("/page")
+    public Page<SendMegVo> page(@RequestBody SendMegSelectDto dto) {
+        return sendMegService.getPage(dto);
+    }
+
+    /**
+     * 明细
+     */
+    @PostMapping("/detail")
+    public SendMegVo detail(@RequestBody BaseSelectDto dto) {
+        return sendMegService.detail(dto.getId());
+    }
+
+    /**
+     * 新增
+     */
+    @PostMapping("/add")
+    public void add(@RequestBody SendMegDto sendMegDto) {
+        sendMegService.add(sendMegDto);
+    }
+
+    /**
+     * 编辑
+     */
+    @PostMapping("/edit")
+    public void edit(@RequestBody SendMegDto sendMegDto) {
+        sendMegService.edit(sendMegDto);
+    }
+
+    /**
+     * 删除
+     */
+    @PostMapping("/delete")
+    public void delete(@RequestBody BaseSelectDto dto) {
+        sendMegService.delete(dto.getId());
+    }
+
+    @Scheduled(cron = "0 0/1 *  * * ? ")   // 每1分钟执行一次
+    public void execute() {
+        sendMegService.executeSend();
+    }
+
+}

+ 2 - 2
hx-common/src/main/java/com/fjhx/common/entity/corporation/po/Corporation.java

@@ -35,7 +35,7 @@ public class Corporation extends BasePo {
     /**
      * 企业类型
      */
-    private Integer type;
+    private String type;
 
     /**
      * 统一信用代码
@@ -67,7 +67,7 @@ public class Corporation extends BasePo {
     /**
      * 纳税人资质
      */
-    private Integer taxpayerQualification;
+    private String taxpayerQualification;
 
     /**
      * 进出口企业代码

+ 19 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegDto.java

@@ -0,0 +1,19 @@
+package com.fjhx.common.entity.send.dto;
+
+import com.fjhx.common.entity.send.po.SendMeg;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 新增编辑入参实体
+ *
+ * @author 
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+public class SendMegDto extends SendMeg {
+
+
+
+}

+ 27 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/dto/SendMegSelectDto.java

@@ -0,0 +1,27 @@
+package com.fjhx.common.entity.send.dto;
+
+import com.ruoyi.common.core.domain.BaseSelectDto;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 列表查询入参实体
+ *
+ * @author 
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+public class SendMegSelectDto extends BaseSelectDto {
+
+    /**
+     * 状态 0待发送 1以发送
+     */
+    private Integer status;
+
+    /**
+     * 消息类型 1系统公告
+     */
+    private Integer type;
+
+}

+ 59 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/po/SendMeg.java

@@ -0,0 +1,59 @@
+package com.fjhx.common.entity.send.po;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.ruoyi.common.core.domain.BasePo;
+import lombok.Getter;
+import lombok.Setter;
+
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.Date;
+
+/**
+ * <p>
+ *
+ * </p>
+ *
+ * @author
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+@TableName("send_meg")
+public class SendMeg extends BasePo {
+
+    /**
+     * 消息类型 1系统公告
+     */
+    @NotNull(message = "消息类型不能为空")
+    private Integer type;
+
+    /**
+     * 标题
+     */
+    @NotEmpty(message = "标题不能为空")
+    private String title;
+
+    /**
+     * 内容
+     */
+    @NotEmpty(message = "消息正文不能为空")
+    private String content;
+
+    /**
+     * 发送时间
+     */
+    @NotEmpty(message = "发送时间不能为空")
+    private Date sendTime;
+
+    /**
+     * 结束时间
+     */
+    private Date endTime;
+
+    /**
+     * 状态 0待发送 1已发送
+     */
+    private Integer status;
+
+}

+ 17 - 0
hx-common/src/main/java/com/fjhx/common/entity/send/vo/SendMegVo.java

@@ -0,0 +1,17 @@
+package com.fjhx.common.entity.send.vo;
+
+import com.fjhx.common.entity.send.po.SendMeg;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * 列表查询返回值实体
+ *
+ * @author 
+ * @since 2023-05-22
+ */
+@Getter
+@Setter
+public class SendMegVo extends SendMeg {
+
+}

+ 26 - 0
hx-common/src/main/java/com/fjhx/common/mapper/send/SendMegMapper.java

@@ -0,0 +1,26 @@
+package com.fjhx.common.mapper.send;
+
+import com.fjhx.common.entity.send.po.SendMeg;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.send.vo.SendMegVo;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import org.apache.ibatis.annotations.Param;
+
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2023-05-22
+ */
+public interface SendMegMapper extends BaseMapper<SendMeg> {
+
+    /**
+     * 分页
+     */
+    Page<SendMegVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<SendMeg> wrapper);
+
+}

+ 55 - 0
hx-common/src/main/java/com/fjhx/common/service/send/SendMegService.java

@@ -0,0 +1,55 @@
+package com.fjhx.common.service.send;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.fjhx.common.entity.send.dto.SendMegDto;
+import com.fjhx.common.entity.send.dto.SendMegSelectDto;
+import com.fjhx.common.entity.send.po.SendMeg;
+import com.fjhx.common.entity.send.vo.SendMegVo;
+import com.ruoyi.common.core.service.BaseService;
+
+
+/**
+ * <p>
+ * 服务类
+ * </p>
+ *
+ * @author
+ * @since 2023-05-22
+ */
+public interface SendMegService extends BaseService<SendMeg> {
+
+    /**
+     * 分页
+     */
+    Page<SendMegVo> getPage(SendMegSelectDto dto);
+
+    /**
+     * 明细
+     */
+    SendMegVo detail(Long id);
+
+    /**
+     * 新增
+     */
+    void add(SendMegDto sendMegDto);
+
+    /**
+     * 编辑
+     */
+    void edit(SendMegDto sendMegDto);
+
+    /**
+     * 删除
+     */
+    void delete(Long id);
+
+    /**
+     * 推送数据
+     */
+    void send(SendMeg sendMeg);
+
+
+    void executeSend();
+
+
+}

+ 166 - 0
hx-common/src/main/java/com/fjhx/common/service/send/impl/SendMegServiceImpl.java

@@ -0,0 +1,166 @@
+package com.fjhx.common.service.send.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.convert.Convert;
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.common.entity.send.dto.SendMegDto;
+import com.fjhx.common.entity.send.dto.SendMegSelectDto;
+import com.fjhx.common.entity.send.po.SendMeg;
+import com.fjhx.common.entity.send.vo.SendMegVo;
+import com.fjhx.common.mapper.send.SendMegMapper;
+import com.fjhx.common.service.send.SendMegService;
+import com.fjhx.socket.entity.MessageEntity;
+import com.fjhx.socket.event.WebSocketUserOfflineEvent;
+import com.fjhx.socket.service.WebSocketServer;
+import com.ruoyi.common.constant.StatusConstant;
+import com.ruoyi.common.core.domain.entity.SysUser;
+import com.ruoyi.common.core.redis.RedisCache;
+import com.ruoyi.common.utils.wrapper.IWrapper;
+import com.ruoyi.framework.mybatis.holder.TenantHolder;
+import com.ruoyi.system.service.ISysUserService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.event.EventListener;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author
+ * @since 2023-05-22
+ */
+@Slf4j
+@Service
+public class SendMegServiceImpl extends ServiceImpl<SendMegMapper, SendMeg> implements SendMegService {
+
+    @Autowired
+    private ISysUserService sysUserService;
+
+    @Autowired
+    private RedisCache redisCache;
+
+    private static final String sendMessageKey = "sendMessage:";
+
+    @Override
+    public Page<SendMegVo> getPage(SendMegSelectDto dto) {
+        IWrapper<SendMeg> wrapper = getWrapper();
+        wrapper.eq("sm", SendMeg::getType, dto.getType());
+        wrapper.eq("sm", SendMeg::getStatus, dto.getStatus());
+        wrapper.orderByAsc("sm", SendMeg::getStatus);
+        wrapper.orderByDesc("sm", SendMeg::getId);
+        Page<SendMegVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        return page;
+    }
+
+    @Override
+    public SendMegVo detail(Long id) {
+        SendMeg SendMeg = this.getById(id);
+        SendMegVo result = BeanUtil.toBean(SendMeg, SendMegVo.class);
+        return result;
+    }
+
+    @Override
+    public void add(SendMegDto sendMegDto) {
+        Date sendTime = sendMegDto.getSendTime();
+        if (sendTime.before(DateUtil.endOfMinute(new Date()))) {
+            sendMegDto.setStatus(StatusConstant.YES);
+            new Thread(() -> send(sendMegDto)).start();
+        } else {
+            sendMegDto.setStatus(StatusConstant.NO);
+        }
+
+        this.save(sendMegDto);
+    }
+
+    @Override
+    public void edit(SendMegDto sendMegDto) {
+        sendMegDto.setStatus(StatusConstant.YES);
+        this.updateById(sendMegDto);
+    }
+
+    @Override
+    public void delete(Long id) {
+        this.removeById(id);
+    }
+
+    @Override
+    public synchronized void send(SendMeg sendMeg) {
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        TenantHolder.setIgnore(true);
+        List<SysUser> list = sysUserService.list();
+        DynamicDataSourceContextHolder.poll();
+
+        for (SysUser sysUser : list) {
+            WebSocketServer.sendInfo(sysUser.getUserId(), 0, sendMeg);
+        }
+
+    }
+
+    @Override
+    public void executeSend() {
+
+        Set<String> scan = redisCache.scan(sendMessageKey + "**");
+        for (String key : scan) {
+            String[] split = key.split(":");
+            if (split.length != 3) {
+                return;
+            }
+            String userIdStr = split[2];
+            Long userId = Convert.toLong(userIdStr);
+            if (userId == null) {
+                return;
+            }
+
+            try {
+                SendMeg cacheObject = redisCache.getCacheObject(key);
+                redisCache.deleteObject(key);
+                WebSocketServer.sendInfo(userId, 0, cacheObject);
+            } catch (Exception e) {
+                log.error("推送异常", e);
+            }
+
+        }
+
+
+        List<SendMeg> list = list(q -> q
+                .eq(SendMeg::getStatus, StatusConstant.NO)
+                .le(SendMeg::getSendTime, DateUtil.endOfMinute(new Date())));
+
+        for (SendMeg sendMeg : list) {
+            send(sendMeg);
+            sendMeg.setStatus(StatusConstant.YES);
+        }
+        updateBatchById(list);
+
+    }
+
+    @EventListener
+    public void userOfflineEvent(WebSocketUserOfflineEvent webSocketUserOfflineEvent) {
+        MessageEntity messageEntity = webSocketUserOfflineEvent.getMessageEntity();
+
+        Object data = messageEntity.getData();
+
+        if (messageEntity.getType() != 0 || !(data instanceof SendMeg)) {
+            return;
+        }
+
+        String key = sendMessageKey + ((SendMeg) data).getId() + ":" + messageEntity.getUserId();
+        if (((SendMeg) data).getEndTime().after(new Date())) {
+            redisCache.setCacheObject(key, data);
+        }
+
+    }
+
+
+}

+ 21 - 0
hx-common/src/main/resources/mapper/send/SendMegMapper.xml

@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.fjhx.common.mapper.send.SendMegMapper">
+    <select id="getPage" resultType="com.fjhx.common.entity.send.vo.SendMegVo">
+        select
+            sm.id,
+            sm.type,
+            sm.title,
+            sm.content,
+            sm.send_time,
+            sm.end_time,
+            sm.status,
+            sm.create_user,
+            sm.create_time,
+            sm.update_user,
+            sm.update_time
+        from send_meg sm
+            ${ew.customSqlSegment}
+    </select>
+
+</mapper>

+ 1 - 1
hx-customer/src/main/resources/mapper/customer/CustomerMapper.xml

@@ -2,7 +2,7 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.customer.mapper.customer.CustomerMapper">
     <update id="customerAllocation">
-        update customer set user_id = #{userId} where id = #{id}
+        update customer set user_id = #{userId},update_time = now() where id = #{id}
     </update>
     <select id="getList" resultType="com.fjhx.customer.entity.customer.vo.CustomerVo">
         select

+ 4 - 1
hx-mail/src/main/java/com/fjhx/mail/config/MailServiceConfig.java

@@ -8,10 +8,13 @@ import org.springframework.context.annotation.Configuration;
 public class MailServiceConfig {
 
     /**
-     * 调用主服务url前缀
+     * 国内邮箱服务url
      */
     public static String urlPrefix;
 
+    /**
+     * 国外邮箱服务url
+     */
     public static String abroadUrlPrefix;
 
     @Value("${mail.urlPrefix}")

+ 3 - 9
hx-mail/src/main/java/com/fjhx/mail/controller/enterprise/EnterpriseMailboxController.java

@@ -1,18 +1,15 @@
 package com.fjhx.mail.controller.enterprise;
 
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.common.constant.SourceConstant;
-import com.fjhx.mail.config.MailServiceConfig;
 import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxDto;
 import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxSelectDto;
 import com.fjhx.mail.entity.enterprise.vo.EnterpriseMailboxVo;
 import com.fjhx.mail.service.enterprise.EnterpriseMailboxService;
 import com.ruoyi.common.annotation.NonInterception;
 import com.ruoyi.common.core.domain.BaseSelectDto;
-import com.ruoyi.common.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -58,11 +55,8 @@ public class EnterpriseMailboxController {
      */
     @NonInterception
     @PostMapping("/add")
-    public Object add(@Validated @RequestBody EnterpriseMailboxDto enterpriseMailboxDto) {
-        enterpriseMailboxDto.setCreateUser(SecurityUtils.getUserId());
-        enterpriseMailboxDto.setUpdateUser(SecurityUtils.getUserId());
-        String post = HttpUtil.post(MailServiceConfig.urlPrefix + "addEnterpriseMailbox", JSON.toJSONString(enterpriseMailboxDto));
-        return JSON.parseObject(post);
+    public JSONObject add(@Validated @RequestBody EnterpriseMailboxDto enterpriseMailboxDto) {
+        return enterpriseMailboxService.add(enterpriseMailboxDto);
     }
 
     /**

+ 3 - 10
hx-mail/src/main/java/com/fjhx/mail/controller/personal/PersonalMailboxController.java

@@ -1,18 +1,15 @@
 package com.fjhx.mail.controller.personal;
 
-import cn.hutool.http.HttpUtil;
-import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.fjhx.common.constant.SourceConstant;
-import com.fjhx.mail.config.MailServiceConfig;
 import com.fjhx.mail.entity.personal.dto.PersonalMailboxDto;
 import com.fjhx.mail.entity.personal.dto.PersonalMailboxSelectDto;
 import com.fjhx.mail.entity.personal.vo.PersonalMailboxVo;
 import com.fjhx.mail.service.personal.PersonalMailboxService;
 import com.ruoyi.common.annotation.NonInterception;
 import com.ruoyi.common.core.domain.BaseSelectDto;
-import com.ruoyi.common.utils.SecurityUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.PostMapping;
@@ -58,12 +55,8 @@ public class PersonalMailboxController {
      */
     @NonInterception
     @PostMapping("/add")
-    public Object add(@Validated @RequestBody PersonalMailboxDto personalMailboxDto) {
-        personalMailboxDto.setCreateUser(SecurityUtils.getUserId());
-        personalMailboxDto.setUpdateUser(SecurityUtils.getUserId());
-        personalMailboxDto.setUserId(SecurityUtils.getUserId());
-        String post = HttpUtil.post(MailServiceConfig.urlPrefix + "addPersonalMailbox", JSON.toJSONString(personalMailboxDto));
-        return JSON.parseObject(post);
+    public JSONObject add(@Validated @RequestBody PersonalMailboxDto personalMailboxDto) {
+        return personalMailboxService.add(personalMailboxDto);
     }
 
     /**

+ 6 - 5
hx-mail/src/main/java/com/fjhx/mail/service/enterprise/EnterpriseMailboxService.java

@@ -1,11 +1,12 @@
 package com.fjhx.mail.service.enterprise;
 
-import com.fjhx.mail.entity.enterprise.po.EnterpriseMailbox;
-import com.ruoyi.common.core.service.BaseService;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mail.entity.enterprise.vo.EnterpriseMailboxVo;
-import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxSelectDto;
 import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxDto;
+import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxSelectDto;
+import com.fjhx.mail.entity.enterprise.po.EnterpriseMailbox;
+import com.fjhx.mail.entity.enterprise.vo.EnterpriseMailboxVo;
+import com.ruoyi.common.core.service.BaseService;
 
 
 /**
@@ -31,7 +32,7 @@ public interface EnterpriseMailboxService extends BaseService<EnterpriseMailbox>
     /**
      * 企业邮箱新增
      */
-    void add(EnterpriseMailboxDto enterpriseMailboxDto);
+    JSONObject add(EnterpriseMailboxDto enterpriseMailboxDto);
 
     /**
      * 企业邮箱编辑

+ 20 - 49
hx-mail/src/main/java/com/fjhx/mail/service/enterprise/impl/EnterpriseMailboxServiceImpl.java

@@ -1,33 +1,31 @@
 package com.fjhx.mail.service.enterprise.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.mail.config.MailServiceConfig;
 import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxDto;
 import com.fjhx.mail.entity.enterprise.dto.EnterpriseMailboxSelectDto;
 import com.fjhx.mail.entity.enterprise.po.EnterpriseDomain;
-import com.fjhx.mail.entity.enterprise.po.EnterpriseFolder;
 import com.fjhx.mail.entity.enterprise.po.EnterpriseMailbox;
 import com.fjhx.mail.entity.enterprise.vo.EnterpriseMailboxVo;
 import com.fjhx.mail.mapper.enterprise.EnterpriseMailboxMapper;
 import com.fjhx.mail.service.enterprise.EnterpriseDomainService;
-import com.fjhx.mail.service.enterprise.EnterpriseFolderService;
 import com.fjhx.mail.service.enterprise.EnterpriseMailboxService;
-import com.fjhx.mail.util.EmailUtil;
-import com.ruoyi.common.constant.StatusConstant;
-import com.ruoyi.common.exception.ServiceException;
+import com.obs.services.internal.ServiceException;
+import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
 import com.ruoyi.system.utils.UserUtil;
-import com.sun.mail.imap.IMAPStore;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.mail.MessagingException;
 import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Objects;
 
 
 /**
@@ -42,9 +40,6 @@ import java.util.stream.Collectors;
 public class EnterpriseMailboxServiceImpl extends ServiceImpl<EnterpriseMailboxMapper, EnterpriseMailbox> implements EnterpriseMailboxService {
 
     @Autowired
-    private EnterpriseFolderService enterpriseFolderService;
-
-    @Autowired
     private EnterpriseDomainService enterpriseDomainService;
 
     @Override
@@ -74,47 +69,23 @@ public class EnterpriseMailboxServiceImpl extends ServiceImpl<EnterpriseMailboxM
 
     @Transactional
     @Override
-    public void add(EnterpriseMailboxDto enterpriseMailboxDto) {
-
-        Long enterpriseMailboxId = IdWorker.getId();
-
+    public JSONObject add(EnterpriseMailboxDto enterpriseMailboxDto) {
+        enterpriseMailboxDto.setCreateUser(SecurityUtils.getUserId());
+        enterpriseMailboxDto.setUpdateUser(SecurityUtils.getUserId());
         Long domainId = enterpriseMailboxDto.getDomainId();
-        EnterpriseDomain enterpriseDomain = enterpriseDomainService.getById(domainId);
-
-        if (enterpriseDomain == null) {
-            throw new ServiceException("未找到企业域名");
+        EnterpriseDomain domain = enterpriseDomainService.getById(domainId);
+        if (domain == null) {
+            throw new ServiceException("找不到企业邮箱域名");
         }
-
-        try {
-
-            IMAPStore imapStore = EmailUtil.getIMAPStore(
-                    enterpriseDomain.getReceiveHost(),
-                    enterpriseDomain.getReceivePort(),
-                    enterpriseMailboxDto.getMailUserPrefix() + "@" + enterpriseDomain.getDomainName(),
-                    enterpriseMailboxDto.getMailPassword()
-            );
-
-            List<String> folderNameList = EmailUtil.getFolderNameList(imapStore);
-            List<EnterpriseFolder> personalFolderList = folderNameList.stream().map(item -> {
-                EnterpriseFolder enterpriseFolder = new EnterpriseFolder();
-                enterpriseFolder.setMailboxId(enterpriseMailboxId);
-                enterpriseFolder.setName(item);
-                enterpriseFolder.setSyncStatus(1);
-                return enterpriseFolder;
-            }).collect(Collectors.toList());
-
-            enterpriseFolderService.saveBatch(personalFolderList);
-
-        } catch (MessagingException e) {
-            throw new ServiceException("连接邮箱异常");
+        String urlPrefix;
+        if (Objects.equals(domain.getType(), 2)) {
+            urlPrefix = MailServiceConfig.abroadUrlPrefix;
+        } else {
+            urlPrefix = MailServiceConfig.urlPrefix;
         }
 
-        enterpriseMailboxDto.setId(enterpriseMailboxId);
-        enterpriseMailboxDto.setDefaultStatus(0);
-        enterpriseMailboxDto.setSyncStatus(1);
-        enterpriseMailboxDto.setStatus(StatusConstant.ENABLE);
-        this.save(enterpriseMailboxDto);
-
+        String post = HttpUtil.post(urlPrefix + "addEnterpriseMailbox", JSON.toJSONString(enterpriseMailboxDto));
+        return JSON.parseObject(post);
     }
 
     @Override

+ 12 - 1
hx-mail/src/main/java/com/fjhx/mail/service/message/impl/InfoServiceImpl.java

@@ -83,6 +83,7 @@ public class InfoServiceImpl implements InfoService {
     public String sendMail(SendDto dto) {
         Integer type = dto.getType();
         Long mailboxId = dto.getMailboxId();
+        String urlPrefix;
 
         StringJoiner urlJoiner = new StringJoiner("/");
         urlJoiner.add("sendMail");
@@ -97,6 +98,11 @@ public class InfoServiceImpl implements InfoService {
             urlJoiner.add(personalMailbox.getMailUser());
             urlJoiner.add(personalMailbox.getMailPassword());
 
+            if (Objects.equals(personalMailbox.getType(), 2)) {
+                urlPrefix = MailServiceConfig.abroadUrlPrefix;
+            } else {
+                urlPrefix = MailServiceConfig.urlPrefix;
+            }
         } else {
 
             EnterpriseMailbox enterpriseMailbox = enterpriseMailboxService.getById(mailboxId);
@@ -111,9 +117,14 @@ public class InfoServiceImpl implements InfoService {
             urlJoiner.add(enterpriseMailbox.getMailUserPrefix() + "@" + enterpriseDomain.getDomainName());
             urlJoiner.add(enterpriseMailbox.getMailPassword());
 
+            if (Objects.equals(enterpriseDomain.getType(), 2)) {
+                urlPrefix = MailServiceConfig.abroadUrlPrefix;
+            } else {
+                urlPrefix = MailServiceConfig.urlPrefix;
+            }
         }
 
-        return HttpUtil.post(MailServiceConfig.urlPrefix + urlJoiner, JSON.toJSONString(dto));
+        return HttpUtil.post(urlPrefix + urlJoiner, JSON.toJSONString(dto));
     }
 
     private void subordinateDeptId(Long deptId, Set<Long> deptSet, Map<Long, List<SysDept>> parentDeptMap) {

+ 6 - 5
hx-mail/src/main/java/com/fjhx/mail/service/personal/PersonalMailboxService.java

@@ -1,11 +1,12 @@
 package com.fjhx.mail.service.personal;
 
-import com.fjhx.mail.entity.personal.po.PersonalMailbox;
-import com.ruoyi.common.core.service.BaseService;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.fjhx.mail.entity.personal.vo.PersonalMailboxVo;
-import com.fjhx.mail.entity.personal.dto.PersonalMailboxSelectDto;
 import com.fjhx.mail.entity.personal.dto.PersonalMailboxDto;
+import com.fjhx.mail.entity.personal.dto.PersonalMailboxSelectDto;
+import com.fjhx.mail.entity.personal.po.PersonalMailbox;
+import com.fjhx.mail.entity.personal.vo.PersonalMailboxVo;
+import com.ruoyi.common.core.service.BaseService;
 
 
 /**
@@ -31,7 +32,7 @@ public interface PersonalMailboxService extends BaseService<PersonalMailbox> {
     /**
      * 个人邮箱新增
      */
-    void add(PersonalMailboxDto personalMailboxDto);
+    JSONObject add(PersonalMailboxDto personalMailboxDto);
 
     /**
      * 个人邮箱编辑

+ 16 - 46
hx-mail/src/main/java/com/fjhx/mail/service/personal/impl/PersonalMailboxServiceImpl.java

@@ -1,31 +1,25 @@
 package com.fjhx.mail.service.personal.impl;
 
 import cn.hutool.core.bean.BeanUtil;
-import com.baomidou.mybatisplus.core.toolkit.IdWorker;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson2.JSON;
+import com.alibaba.fastjson2.JSONObject;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fjhx.mail.config.MailServiceConfig;
 import com.fjhx.mail.entity.personal.dto.PersonalMailboxDto;
 import com.fjhx.mail.entity.personal.dto.PersonalMailboxSelectDto;
-import com.fjhx.mail.entity.personal.po.PersonalFolder;
 import com.fjhx.mail.entity.personal.po.PersonalMailbox;
 import com.fjhx.mail.entity.personal.vo.PersonalMailboxVo;
 import com.fjhx.mail.mapper.personal.PersonalMailboxMapper;
-import com.fjhx.mail.service.personal.PersonalFolderService;
 import com.fjhx.mail.service.personal.PersonalMailboxService;
-import com.fjhx.mail.util.EmailUtil;
-import com.ruoyi.common.constant.StatusConstant;
-import com.ruoyi.common.exception.ServiceException;
 import com.ruoyi.common.utils.SecurityUtils;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
-import com.sun.mail.imap.IMAPStore;
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import javax.mail.MessagingException;
-import java.util.List;
-import java.util.stream.Collectors;
+import java.util.Objects;
 
 
 /**
@@ -39,9 +33,6 @@ import java.util.stream.Collectors;
 @Service
 public class PersonalMailboxServiceImpl extends ServiceImpl<PersonalMailboxMapper, PersonalMailbox> implements PersonalMailboxService {
 
-    @Autowired
-    private PersonalFolderService personalFolderService;
-
     @Override
     public Page<PersonalMailboxVo> getPage(PersonalMailboxSelectDto dto) {
         IWrapper<PersonalMailbox> wrapper = getWrapper();
@@ -61,40 +52,19 @@ public class PersonalMailboxServiceImpl extends ServiceImpl<PersonalMailboxMappe
 
     @Transactional(rollbackFor = Exception.class)
     @Override
-    public void add(PersonalMailboxDto personalMailboxDto) {
-
-        Long personalMailboxId = IdWorker.getId();
-
-        try {
-            IMAPStore imapStore = EmailUtil.getIMAPStore(
-                    personalMailboxDto.getReceiveHost(),
-                    personalMailboxDto.getReceivePort(),
-                    personalMailboxDto.getMailUser(),
-                    personalMailboxDto.getMailPassword()
-            );
-
-            List<String> folderNameList = EmailUtil.getFolderNameList(imapStore);
-            List<PersonalFolder> personalFolderList = folderNameList.stream().map(item -> {
-                PersonalFolder personalFolder = new PersonalFolder();
-                personalFolder.setMailboxId(personalMailboxId);
-                personalFolder.setName(item);
-                personalFolder.setSyncStatus(1);
-                return personalFolder;
-            }).collect(Collectors.toList());
-
-            personalFolderService.saveBatch(personalFolderList);
-
-        } catch (MessagingException e) {
-            throw new ServiceException("连接邮箱异常");
-        }
-
-        personalMailboxDto.setId(personalMailboxId);
-        personalMailboxDto.setStatus(StatusConstant.ENABLE);
-        personalMailboxDto.setSyncStatus(1);
-        personalMailboxDto.setDefaultStatus(0);
+    public JSONObject add(PersonalMailboxDto personalMailboxDto) {
+        personalMailboxDto.setCreateUser(SecurityUtils.getUserId());
+        personalMailboxDto.setUpdateUser(SecurityUtils.getUserId());
         personalMailboxDto.setUserId(SecurityUtils.getUserId());
+        String urlPrefix;
+        if (Objects.equals(personalMailboxDto.getType(), 2)) {
+            urlPrefix = MailServiceConfig.abroadUrlPrefix;
+        } else {
+            urlPrefix = MailServiceConfig.urlPrefix;
+        }
 
-        this.save(personalMailboxDto);
+        String post = HttpUtil.post(urlPrefix + "addPersonalMailbox", JSON.toJSONString(personalMailboxDto));
+        return JSON.parseObject(post);
     }
 
     @Override

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/entity/production/po/ProductionTaskDetail.java

@@ -67,4 +67,9 @@ public class ProductionTaskDetail extends BasePo {
      */
     private Integer circulationStatus;
 
+    /**
+     * 接收人id
+     */
+    private Long receivedUserId;
+
 }

+ 5 - 0
hx-mes/src/main/java/com/fjhx/mes/service/production/impl/ProductionTaskDetailServiceImpl.java

@@ -127,11 +127,16 @@ public class ProductionTaskDetailServiceImpl extends ServiceImpl<ProductionTaskD
     public void circulation(ProductionTaskDetailDto productionTaskDetailDto) {
         //修改流转状态
         productionTaskDetailDto.setCirculationStatus(1);
+        //赋值接收人id
+        productionTaskDetailDto.setReceivedUserId(productionTaskDetailDto.getReceivedUserId());
         //赋值流转人id
         productionTaskDetailDto.setCirculationUserId(SecurityUtils.getUserId());
         this.updateById(productionTaskDetailDto);
     }
 
+    /**
+     * 完工入库
+     */
     @Override
     public void productStorage(Long id) {
         ProductionTaskDetail productionTaskDetail = getById(id);

+ 20 - 1
hx-purchase/src/main/java/com/fjhx/purchase/service/subscribe/impl/SubscribeDetailServiceImpl.java

@@ -78,7 +78,9 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
 
         // 维多利亚扩展根据到货仓库id过滤
         wrapper.eq("json_unquote(t2.victoriatourist_json -> '$.receiptWarehouseId')", dto.getReceiptWarehouseId());
-        wrapper.eq("json_unquote(pi.victoriatourist_json -> '$.deptId')", dto.getDeptId());
+        if(ObjectUtil.isNotEmpty(dto.getDeptId())) {
+            wrapper.eq( "json_unquote(pi.victoriatourist_json -> '$.deptId')", dto.getDeptId().toString());
+        }
         //待采购过滤掉指定状态 例如不要 99 作废
         if (ObjectUtil.isNotEmpty(dto.getNeStatus())) {
             wrapper.notIn("t1", SubscribeDetail::getStatus, dto.getNeStatus().split(","));
@@ -110,6 +112,23 @@ public class SubscribeDetailServiceImpl extends ServiceImpl<SubscribeDetailMappe
             s.setDeptId(json.getLong("deptId"));
         }
 
+        List<Long> subscribeDetailIds = list.stream().map(SubscribeDetail::getId).collect(Collectors.toList());
+        if (ObjectUtil.isNotEmpty(subscribeDetailIds)) {
+            List<PurchaseDetail> purchaseDetailsList = purchaseDetailService.list(q -> q.in(PurchaseDetail::getSubscribeDetailId, subscribeDetailIds));
+            Map<Long, List<PurchaseDetail>> purchaseDetailsMap = purchaseDetailsList.stream().collect(Collectors.groupingBy(PurchaseDetail::getSubscribeDetailId));
+            for (SubscribeDetailVo subscribeDetailVo : list) {
+                List<PurchaseDetail> purchaseDetails = purchaseDetailsMap.get(subscribeDetailVo.getId());
+                if (ObjectUtil.isEmpty(purchaseDetails)) {
+                    subscribeDetailVo.setPurchaseCount(BigDecimal.ZERO);
+                    continue;
+                }
+                BigDecimal count = purchaseDetails.stream()
+                        .map(PurchaseDetail::getCount)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                subscribeDetailVo.setPurchaseCount(count);
+            }
+        }
+
         return page;
     }
 

+ 9 - 0
hx-supply/src/main/java/com/fjhx/supply/controller/supplier/SupplierInfoController.java

@@ -14,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RestController;
 
+import java.util.Map;
+
 
 /**
  * <p>
@@ -84,4 +86,11 @@ public class SupplierInfoController {
         supplierInfoService.delete(dto.getId());
     }
 
+    /**
+     * 供应商统计(列表)
+     */
+    @PostMapping("/supplierStatistics")
+    public Map<String,Object> supplierStatistics(@RequestBody BaseSelectDto dto) {
+        return supplierInfoService.supplierStatistics(dto);
+    }
 }

+ 25 - 0
hx-supply/src/main/java/com/fjhx/supply/entity/supplier/dto/SupplierInfoSelectDto.java

@@ -24,4 +24,29 @@ public class SupplierInfoSelectDto extends BaseSelectDto {
      */
     private Integer accountPeriodType;
 
+
+    /**
+     * 供应商编码
+     */
+    private String code;
+
+    /**
+     * 供应商名称
+     */
+    private String name;
+
+    /**
+     * 国家id
+     */
+    private Long countryId;
+
+    /**
+     * 省id
+     */
+    private Long provinceId;
+
+    /**
+     * 市id
+     */
+    private Long cityId;
 }

+ 5 - 0
hx-supply/src/main/java/com/fjhx/supply/entity/supplier/po/SupplierInfo.java

@@ -103,6 +103,11 @@ public class SupplierInfo extends BasePo {
      */
     private String accountPeriodRemark;
 
+    /**
+     * 个数
+     */
+    private Integer count;
+
 
 
 }

+ 8 - 1
hx-supply/src/main/java/com/fjhx/supply/service/supplier/SupplierInfoService.java

@@ -5,15 +5,18 @@ import com.fjhx.supply.entity.supplier.dto.SupplierInfoDto;
 import com.fjhx.supply.entity.supplier.dto.SupplierInfoSelectDto;
 import com.fjhx.supply.entity.supplier.po.SupplierInfo;
 import com.fjhx.supply.entity.supplier.vo.SupplierInfoVo;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.core.service.BaseService;
 
+import java.util.Map;
+
 
 /**
  * <p>
  * 供应商 服务类
  * </p>
  *
- * @author 
+ * @author
  * @since 2023-03-17
  */
 public interface SupplierInfoService extends BaseService<SupplierInfo> {
@@ -52,4 +55,8 @@ public interface SupplierInfoService extends BaseService<SupplierInfo> {
      */
     void delete(Long id);
 
+    /**
+     * 供应商统计
+     */
+    Map<String, Object> supplierStatistics(BaseSelectDto dto);
 }

+ 80 - 0
hx-supply/src/main/java/com/fjhx/supply/service/supplier/impl/SupplierInfoServiceImpl.java

@@ -1,10 +1,15 @@
 package com.fjhx.supply.service.supplier.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.ListUtil;
+import cn.hutool.core.stream.CollectorUtil;
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DS;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
+import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.area.utils.CustomizeAreaUtil;
@@ -17,11 +22,22 @@ import com.fjhx.supply.entity.supplier.vo.SupplierInfoVo;
 import com.fjhx.supply.mapper.supplier.SupplierInfoMapper;
 import com.fjhx.supply.service.supplier.SupplierInfoService;
 import com.fjhx.supply.utils.CodeEnum;
+import com.fjhx.tenant.entity.dict.dto.DictTenantDataSelectDto;
+import com.fjhx.tenant.entity.dict.vo.DictTenantDataVo;
+import com.fjhx.tenant.service.dict.DictTenantDataService;
+import com.obs.services.internal.ServiceException;
+import com.ruoyi.common.core.domain.BaseSelectDto;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import com.ruoyi.common.utils.wrapper.SqlField;
+import org.apache.commons.collections4.ListUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
 
 
 /**
@@ -36,11 +52,19 @@ import java.util.List;
 @Service
 public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, SupplierInfo> implements SupplierInfoService {
 
+    @Autowired
+    private DictTenantDataService dictTenantDataService;
+
     @Override
     public Page<SupplierInfoVo> getPage(SupplierInfoSelectDto dto) {
         IWrapper<SupplierInfo> wrapper = getWrapper();
         wrapper.orderByDesc("si", SupplierInfo::getId);
         wrapper.eq("si", SupplierInfo::getType, dto.getType());
+        wrapper.like("si",SupplierInfo::getCode,dto.getCode());
+        wrapper.like("si",SupplierInfo::getName,dto.getName());
+        wrapper.eq("si",SupplierInfo::getCountryId,dto.getCountryId());
+        wrapper.eq("si",SupplierInfo::getProvinceId,dto.getProvinceId());
+        wrapper.eq("si",SupplierInfo::getCityId,dto.getCityId());
         wrapper.keyword(dto,
                 new SqlField("si", SupplierInfo::getName),
                 new SqlField("si", SupplierInfo::getCode)
@@ -137,4 +161,60 @@ public class SupplierInfoServiceImpl extends ServiceImpl<SupplierInfoMapper, Sup
         ObsFileUtil.removeFile(id);
     }
 
+    /**
+     * 供应商统计
+     */
+    @Override
+    public Map<String, Object> supplierStatistics(BaseSelectDto dto) {
+        //存放供应商统计数据
+        Map<String,Object> map = new HashMap<>();
+        //存放供应商类型数据列表
+        List<Map<String,Object>> list = new ArrayList<>();
+
+        QueryWrapper<SupplierInfo> query = Wrappers.query();
+        //为-1则说明没有查到供应商的数据(如果为null的话后面list转map报错)
+        query.select("ifnull(type,-1) type,count(*) count");
+        query.groupBy("type");
+        //查询供应商统计
+        List<SupplierInfo> supplierInfoList = baseMapper.selectList(query);
+        Map<String, List<SupplierInfo>> supplierInfoMap = supplierInfoList.stream().collect(Collectors.groupingBy(SupplierInfo::getType));
+
+        //赋值合计数据
+        Integer amount = supplierInfoList.stream().map(SupplierInfo::getCount).reduce(Integer::sum).orElse(0);
+        map.put("amount",amount);
+
+        //切换数据源
+        DynamicDataSourceContextHolder.push(SourceConstant.BASE);
+        //获取供应商类型字典数据
+        List<DictTenantDataVo> dictTenantDataVoList = getDict("supplier_type");
+        DynamicDataSourceContextHolder.poll();
+
+        if (ObjectUtil.isEmpty(dictTenantDataVoList)){
+            throw new ServiceException("数据有误:没有配置供应商类型字典,请先配置");
+        }
+
+        //赋值
+        for (DictTenantDataVo dictTenantDataVo : dictTenantDataVoList) {
+            //设置初始值
+            Map<String,Object> supplierMap = new HashMap<>();
+            supplierMap.put("type",dictTenantDataVo.getDictValue());
+            supplierMap.put("count",0);
+
+            //赋值数量
+            List<SupplierInfo> supplierInfos = supplierInfoMap.get(dictTenantDataVo.getDictKey());
+            if (ObjectUtil.isNotEmpty(supplierInfos)){
+                supplierMap.put("count",supplierInfos.get(0).getCount());
+            }
+            list.add(supplierMap);
+        }
+        map.put("supplierInfoList",list);
+        return map;
+    }
+
+    //根据字典编码获取字典的数据
+    private List<DictTenantDataVo> getDict(String code){
+        DictTenantDataSelectDto dto = new DictTenantDataSelectDto();
+        dto.setDictCode(code);
+        return dictTenantDataService.getList(dto);
+    }
 }

+ 15 - 1
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/dto/JdOrderDto.java

@@ -36,7 +36,9 @@ public class JdOrderDto extends JdOrder implements SetCustomizeAreaId {
      */
     private Long outWarehouseId;
 
-    /**调仓说明*/
+    /**
+     * 调仓说明
+     */
     private String remark;
 
     /**
@@ -50,4 +52,16 @@ public class JdOrderDto extends JdOrder implements SetCustomizeAreaId {
     private String cityName;
 
 
+    /**
+     * 物流公司编号
+     */
+    private String logisticsCompanyCode;
+    /**
+     * 物流编号
+     */
+    private String logisticsCode;
+    /**
+     * 预约号
+     */
+    private String reservationCode;
 }

+ 3 - 3
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/jd/po/JdOrder.java

@@ -43,19 +43,19 @@ public class JdOrder extends BasePo {
     /**
      * 国家
      */
-    @NotBlank(message = "国家id不能为空")
+//    @NotBlank(message = "国家id不能为空")
     private Long countryId;
 
     /**
      * 省
      */
-    @NotBlank(message = "省id不能为空")
+//    @NotBlank(message = "省id不能为空")
     private Long provinceId;
 
     /**
      * 市
      */
-    @NotBlank(message = "市id不能为空")
+//    @NotBlank(message = "市id不能为空")
     private Long cityId;
 
     /**

+ 5 - 0
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/entity/logistics/po/LogisticsInfos.java

@@ -69,4 +69,9 @@ public class LogisticsInfos extends BasePo {
      */
     private Integer isKd100;
 
+    /**
+     * 预约号
+     */
+    private String reservationCode;
+
 }

+ 39 - 6
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/jd/impl/JdOrderServiceImpl.java

@@ -19,6 +19,8 @@ import com.fjhx.victoriatourist.entity.jd.po.JdOrder;
 import com.fjhx.victoriatourist.entity.jd.po.JdOrderDetails;
 import com.fjhx.victoriatourist.entity.jd.vo.JdOrderDetailsVo;
 import com.fjhx.victoriatourist.entity.jd.vo.JdOrderVo;
+import com.fjhx.victoriatourist.entity.logistics.po.LogisticsDetails;
+import com.fjhx.victoriatourist.entity.logistics.po.LogisticsInfos;
 import com.fjhx.victoriatourist.entity.stock.dto.StockTransferDto;
 import com.fjhx.victoriatourist.entity.stock.po.StockTransfer;
 import com.fjhx.victoriatourist.entity.stock.po.StockTransferDetails;
@@ -26,6 +28,8 @@ import com.fjhx.victoriatourist.mapper.jd.JdOrderMapper;
 import com.fjhx.victoriatourist.service.abnormal.AbnormalInfoService;
 import com.fjhx.victoriatourist.service.jd.JdOrderDetailsService;
 import com.fjhx.victoriatourist.service.jd.JdOrderService;
+import com.fjhx.victoriatourist.service.logistics.LogisticsDetailsService;
+import com.fjhx.victoriatourist.service.logistics.LogisticsInfosService;
 import com.fjhx.victoriatourist.service.stock.StockTransferDetailsService;
 import com.fjhx.victoriatourist.service.stock.StockTransferService;
 import com.fjhx.victoriatourist.utils.CodeEnum;
@@ -72,18 +76,22 @@ public class JdOrderServiceImpl extends ServiceImpl<JdOrderMapper, JdOrder> impl
     @Autowired
     private StockTransferDetailsService stockTransferDetailsService;
     @Autowired
-    StockWaitService stockWaitService;
+    private StockWaitService stockWaitService;
     @Autowired
-    StockWaitDetailsService stockWaitDetailsService;
+    private StockWaitDetailsService stockWaitDetailsService;
 
     @Autowired
-    AbnormalInfoService abnormalInfoService;
+    private AbnormalInfoService abnormalInfoService;
     @Autowired
-    StockJournalService stockJournalService;
+    private StockJournalService stockJournalService;
     @Autowired
-    StockJournalDetailsService stockJournalDetailsService;
+    private StockJournalDetailsService stockJournalDetailsService;
     @Autowired
-    StockService stockService;
+    private StockService stockService;
+    @Autowired
+    private LogisticsInfosService logisticsInfosService;
+    @Autowired
+    private LogisticsDetailsService logisticsDetailsService;
 
     @Override
     public Page<JdOrderVo> getPage(JdOrderSelectDto dto) {
@@ -177,6 +185,9 @@ public class JdOrderServiceImpl extends ServiceImpl<JdOrderMapper, JdOrder> impl
         this.jdOrderDetailsService.saveBatch(jdOrderDetailsList);
 
         CustomizeAreaUtil.setAreaId(jdOrderDto);
+
+
+
     }
 
     @DSTransactional
@@ -324,6 +335,28 @@ public class JdOrderServiceImpl extends ServiceImpl<JdOrderMapper, JdOrder> impl
             //保存出库记录明细
             stockJournalDetailsService.saveBatch(stockJournalDetailsList1);
         }
+
+        //创建物流数据
+        LogisticsInfos logisticsInfos = new LogisticsInfos();
+        logisticsInfos.setBusinessId(jdOrderDto.getId());
+        logisticsInfos.setBusinessCode(jdOrderDto.getCode());
+        logisticsInfos.setBusinessType(2);//京东订单出库
+        logisticsInfos.setLogisticsCompanyCode(jdOrderDto.getLogisticsCompanyCode());
+        logisticsInfos.setCode(jdOrderDto.getLogisticsCode());
+        logisticsInfos.setWarehouseId(jdOrderDto.getOutWarehouseId());
+        logisticsInfos.setReservationCode(jdOrderDto.getReservationCode());
+        logisticsInfos.setIsKd100(0);
+        logisticsInfosService.save(logisticsInfos);
+
+        List<LogisticsDetails> logisticsDetailsList = new ArrayList<>();
+        for (JdOrderDetails jdOrderDetails : jdOrderDetailsList) {
+            LogisticsDetails logisticsDetails =new LogisticsDetails();
+            logisticsDetails.setLogisticsInfoId(logisticsInfos.getId());
+            logisticsDetails.setLogisticsInfoCode(logisticsInfos.getCode());
+            logisticsDetails.setBusinessDetailsId(jdOrderDetails.getId());
+            logisticsDetails.setReceiptQuantity(jdOrderDetails.getQuantity());
+        }
+        logisticsDetailsService.saveBatch(logisticsDetailsList);
     }
 
     @Override

+ 33 - 6
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/order/impl/OrderInfoServiceImpl.java

@@ -10,6 +10,8 @@ import com.fjhx.area.utils.CustomizeAreaUtil;
 import com.fjhx.customer.entity.customer.po.Customer;
 import com.fjhx.customer.service.customer.CustomerService;
 import com.fjhx.item.service.product.ProductInfoService;
+import com.fjhx.victoriatourist.entity.logistics.po.LogisticsDetails;
+import com.fjhx.victoriatourist.entity.logistics.po.LogisticsInfos;
 import com.fjhx.victoriatourist.entity.order.dto.OrderInfoDto;
 import com.fjhx.victoriatourist.entity.order.dto.OrderInfoSelectDto;
 import com.fjhx.victoriatourist.entity.order.po.OrderDetails;
@@ -17,6 +19,8 @@ import com.fjhx.victoriatourist.entity.order.po.OrderInfo;
 import com.fjhx.victoriatourist.entity.order.vo.OrderDetailsVo;
 import com.fjhx.victoriatourist.entity.order.vo.OrderInfoVo;
 import com.fjhx.victoriatourist.mapper.order.OrderInfoMapper;
+import com.fjhx.victoriatourist.service.logistics.LogisticsDetailsService;
+import com.fjhx.victoriatourist.service.logistics.LogisticsInfosService;
 import com.fjhx.victoriatourist.service.order.OrderDetailsService;
 import com.fjhx.victoriatourist.service.order.OrderInfoService;
 import com.fjhx.victoriatourist.utils.Assert;
@@ -48,17 +52,22 @@ import java.util.List;
 @Service
 public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo> implements OrderInfoService {
     @Autowired
-    CustomerService customerService;
+    private CustomerService customerService;
     @Autowired
-    AreaInfoService areaInfoService;
+    private AreaInfoService areaInfoService;
     @Autowired
-    OrderDetailsService orderDetailsService;
+    private OrderDetailsService orderDetailsService;
     @Autowired
-    ProductInfoService productInfoService;
+    private ProductInfoService productInfoService;
     @Autowired
-    StockWaitService stockWaitService;
+    private StockWaitService stockWaitService;
     @Autowired
-    StockWaitDetailsService stockWaitDetailsService;
+    private StockWaitDetailsService stockWaitDetailsService;
+
+    @Autowired
+    private LogisticsInfosService logisticsInfosService;
+    @Autowired
+    private LogisticsDetailsService logisticsDetailsService;
 
     @Override
     public Page<OrderInfoVo> getPage(OrderInfoSelectDto dto) {
@@ -230,6 +239,24 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
             orderInfo.setIssueStatus(2);//出库状态 1未出库 2进行中 3已出库
         }
         updateById(orderInfo);
+
+        //创建物流数据
+        LogisticsInfos logisticsInfos = new LogisticsInfos();
+        logisticsInfos.setBusinessId(orderInfo.getId());
+        logisticsInfos.setBusinessCode(orderInfo.getCode());
+        logisticsInfos.setBusinessType(3);//销售订单出库
+        logisticsInfos.setLogisticsCompanyCode(stockWaitDetailsDto.getLogisticsCompanyCode());
+        logisticsInfos.setCode(stockWaitDetailsDto.getLogisticsCode());
+        logisticsInfos.setWarehouseId(stockWaitDetailsDto.getWarehouseId());
+        logisticsInfos.setIsKd100(0);
+        logisticsInfosService.save(logisticsInfos);
+
+        LogisticsDetails logisticsDetails = new LogisticsDetails();
+        logisticsDetails.setLogisticsInfoId(logisticsInfos.getId());
+        logisticsDetails.setLogisticsInfoCode(logisticsInfos.getCode());
+        logisticsDetails.setBusinessDetailsId(orderDetails.getId());
+        logisticsDetails.setReceiptQuantity(orderDetails.getQuantity());
+        logisticsDetailsService.save(logisticsDetails);
     }
 
 }

+ 43 - 1
hx-victoriatourist/src/main/java/com/fjhx/victoriatourist/service/purchase/impl/PurchaseBackServiceImpl.java

@@ -1,11 +1,17 @@
 package com.fjhx.victoriatourist.service.purchase.impl;
 
 import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.dynamic.datasource.annotation.DSTransactional;
 import com.baomidou.dynamic.datasource.toolkit.DynamicDataSourceContextHolder;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.fjhx.common.constant.SourceConstant;
+import com.fjhx.purchase.entity.purchase.po.Purchase;
+import com.fjhx.purchase.service.purchase.PurchaseService;
+import com.fjhx.victoriatourist.entity.logistics.po.LogisticsDetails;
+import com.fjhx.victoriatourist.entity.logistics.po.LogisticsInfos;
 import com.fjhx.victoriatourist.entity.purchase.dto.PurchaseBackDto;
 import com.fjhx.victoriatourist.entity.purchase.dto.PurchaseBackSelectDto;
 import com.fjhx.victoriatourist.entity.purchase.po.PurchaseBack;
@@ -13,6 +19,8 @@ import com.fjhx.victoriatourist.entity.purchase.po.PurchaseBackDetails;
 import com.fjhx.victoriatourist.entity.purchase.vo.PurchaseBackDetailsVo;
 import com.fjhx.victoriatourist.entity.purchase.vo.PurchaseBackVo;
 import com.fjhx.victoriatourist.mapper.purchase.PurchaseBackMapper;
+import com.fjhx.victoriatourist.service.logistics.LogisticsDetailsService;
+import com.fjhx.victoriatourist.service.logistics.LogisticsInfosService;
 import com.fjhx.victoriatourist.service.purchase.PurchaseBackDetailsService;
 import com.fjhx.victoriatourist.service.purchase.PurchaseBackService;
 import com.fjhx.wms.entity.stock.dto.StockWaitDetailsDto;
@@ -21,6 +29,7 @@ import com.fjhx.wms.entity.stock.emums.StockWaitType;
 import com.fjhx.wms.entity.stock.po.*;
 import com.fjhx.wms.service.stock.*;
 import com.fjhx.wms.utils.CodeEnum;
+import com.obs.services.internal.ServiceException;
 import com.ruoyi.common.core.domain.entity.SysUser;
 import com.ruoyi.common.utils.wrapper.IWrapper;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -53,6 +62,12 @@ public class PurchaseBackServiceImpl extends ServiceImpl<PurchaseBackMapper, Pur
     private StockJournalDetailsService stockJournalDetailsService;
     @Autowired
     private StockService stockService;
+    @Autowired
+    private PurchaseService purchaseService;
+    @Autowired
+    private LogisticsInfosService logisticsInfosService;
+    @Autowired
+    private LogisticsDetailsService logisticsDetailsService;
 
     @Override
     public Page<PurchaseBackVo> getPage(PurchaseBackSelectDto dto) {
@@ -80,9 +95,17 @@ public class PurchaseBackServiceImpl extends ServiceImpl<PurchaseBackMapper, Pur
         purchaseBackDetailsList.forEach(purchaseBackDetails -> purchaseBackDetails.setPurchaseBackId(purchaseBackDto.getId()));
         purchaseBackDetailsService.saveBatch(purchaseBackDetailsList);
 
+        Purchase purchase = purchaseService.getById(purchaseBackDto.getPurchaseId());
+        if (ObjectUtil.isEmpty(purchase)) {
+            throw new ServiceException("无法查询到采购信息");
+        }
+        String victoriatouristJson = purchase.getVictoriatouristJson();
+        JSONObject json = ObjectUtil.isEmpty(victoriatouristJson) ? new JSONObject() : JSONObject.parseObject(victoriatouristJson);
+
         //创建待出库记录
         StockWait stockWait = new StockWait();
         stockWait.setBusinessId(purchaseBackDto.getId());
+        stockWait.setBusinessCode(json.getString("contractCode"));
         stockWait.setType(2);//出库
         stockWait.setStatus(0);//待出库
         stockWait.setBusinessType(StockWaitType.BACK_OUT.getDetailType());//已采购退货出库
@@ -101,7 +124,7 @@ public class PurchaseBackServiceImpl extends ServiceImpl<PurchaseBackMapper, Pur
 
     @Override
     @DSTransactional
-    public void backOut(StockWaitDetailsDto stockWaitDetailsDto){
+    public void backOut(StockWaitDetailsDto stockWaitDetailsDto) {
         //修改待出入库状态
         stockWaitDetailsService.changeStockWaitStatus(stockWaitDetailsDto);
         StockWaitDetails stockWaitDetails = stockWaitDetailsService.getById(stockWaitDetailsDto.getId());
@@ -128,6 +151,25 @@ public class PurchaseBackServiceImpl extends ServiceImpl<PurchaseBackMapper, Pur
         List<StockJournalDetails> stockJournalDetailsList = stockService.ModifyInventory(stockJournal.getId(), 4, Arrays.asList(stock), stockWaitDetailsDto.getWarehouseId());
         //保存出入库明细
         stockJournalDetailsService.saveBatch(stockJournalDetailsList);
+
+
+        //创建物流数据
+        LogisticsInfos logisticsInfos = new LogisticsInfos();
+        logisticsInfos.setBusinessId(byId.getId());
+        logisticsInfos.setBusinessCode(byId.getBusinessCode());
+        logisticsInfos.setBusinessType(5);//采购退货
+        logisticsInfos.setLogisticsCompanyCode(stockWaitDetailsDto.getLogisticsCompanyCode());
+        logisticsInfos.setCode(stockWaitDetailsDto.getLogisticsCode());
+        logisticsInfos.setWarehouseId(stockWaitDetailsDto.getWarehouseId());
+        logisticsInfos.setIsKd100(0);
+        logisticsInfosService.save(logisticsInfos);
+
+        LogisticsDetails logisticsDetails = new LogisticsDetails();
+        logisticsDetails.setLogisticsInfoId(logisticsInfos.getId());
+        logisticsDetails.setLogisticsInfoCode(logisticsInfos.getCode());
+        logisticsDetails.setBusinessDetailsId(stockWaitDetailsDto.getId());
+        logisticsDetails.setReceiptQuantity(stockWaitDetailsDto.getQuantity());
+        logisticsDetailsService.save(logisticsDetails);
     }
 
 }

+ 9 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/dto/StockWaitDetailsDto.java

@@ -23,4 +23,13 @@ public class StockWaitDetailsDto extends StockWaitDetails {
      * 仓库id
      */
     private Long warehouseId;
+
+    /**
+     * 物流公司编号
+     */
+    private String logisticsCompanyCode;
+    /**
+     * 物流编号
+     */
+    private String logisticsCode;
 }

+ 5 - 0
hx-wms/src/main/java/com/fjhx/wms/entity/stock/vo/StockWaitDetailsVo.java

@@ -71,4 +71,9 @@ public class StockWaitDetailsVo extends StockWaitDetails {
      */
     private BigDecimal receiptQuantity;
 
+    /**
+     * 产品自定义编码
+     */
+    private String productCustomCode;
+
 }

+ 5 - 0
hx-wms/src/main/java/com/fjhx/wms/mapper/stock/StockWaitMapper.java

@@ -21,6 +21,11 @@ public interface StockWaitMapper extends BaseMapper<StockWait> {
     /**
      * 待出入库分页
      */
+    Page<StockWaitVo> getPage1(@Param("page") Page<Object> page, @Param("ew") IWrapper<StockWait> wrapper);
+
+    /**
+     * 待出入库分页
+     */
     Page<StockWaitVo> getPage(@Param("page") Page<Object> page, @Param("ew") IWrapper<StockWait> wrapper);
 
 }

+ 2 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitDetailsServiceImpl.java

@@ -177,7 +177,8 @@ public class StockWaitDetailsServiceImpl extends ServiceImpl<StockWaitDetailsMap
         List<StockWaitDetails> stockWaitDetailsList = list(q -> q.eq(StockWaitDetails::getStockWaitId, stockWaitDetails.getStockWaitId()));
         for (StockWaitDetails waitDetails : stockWaitDetailsList) {
             //计算已经完全出库的数量
-            if (waitDetails.getReceiptQuantity().compareTo(waitDetails.getQuantity()) == 0) {
+            BigDecimal receiptQuantity1 = ObjectUtil.isEmpty(waitDetails.getReceiptQuantity()) ? BigDecimal.ZERO : waitDetails.getReceiptQuantity();
+            if (receiptQuantity1.compareTo(waitDetails.getQuantity()) == 0) {
                 statusFlag++;
             }
         }

+ 2 - 1
hx-wms/src/main/java/com/fjhx/wms/service/stock/impl/StockWaitServiceImpl.java

@@ -75,7 +75,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
         //过滤入库/出库
         wrapper.eq(StockWait::getType, dto.getType());
         wrapper.eq(StockWait::getBusinessCode, dto.getKeyword());
-        Page<StockWaitVo> page = this.baseMapper.getPage(dto.getPage(), wrapper);
+        Page<StockWaitVo> page = this.baseMapper.getPage1(dto.getPage(), wrapper);
 
         List<StockWaitVo> records = page.getRecords();
         // 赋值产品属性
@@ -178,6 +178,7 @@ public class StockWaitServiceImpl extends ServiceImpl<StockWaitMapper, StockWait
                 }
                 stockWaitDetails.setProductName(productInfo.getName());
                 stockWaitDetails.setProductCode(productInfo.getCode());
+                stockWaitDetails.setProductCustomCode(productInfo.getCustomCode());
             }
         }
         result.setStockWaitDetailsList(stockWaitDetailsVos);

+ 19 - 1
hx-wms/src/main/resources/mapper/stock/StockWaitMapper.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.fjhx.wms.mapper.stock.StockWaitMapper">
-    <select id="getPage" resultType="com.fjhx.wms.entity.stock.vo.StockWaitVo">
+    <select id="getPage1" resultType="com.fjhx.wms.entity.stock.vo.StockWaitVo">
         SELECT
             sw.id,
             swd.id stockWaitDetailsId,
@@ -24,4 +24,22 @@
             ${ew.customSqlSegment}
     </select>
 
+    <select id="getPage" resultType="com.fjhx.wms.entity.stock.vo.StockWaitVo">
+        SELECT
+            sw.id,
+            sw.type,
+            sw.business_id,
+            sw.business_code,
+            sw.business_type,
+            sw.`status`,
+            sw.create_user,
+            sw.create_time,
+            sw.update_user,
+            sw.update_time,
+            sw.victoriatourist_json
+        FROM
+            stock_wait sw
+            ${ew.customSqlSegment}
+    </select>
+
 </mapper>