浏览代码

Merge branch 'master' of http://1.14.104.71:10880/root/ylrz_his_scrm_java

# Conflicts:
#	fs-company/src/main/resources/application.yml
15376779826 1 周之前
父节点
当前提交
d2aa198a27
共有 67 个文件被更改,包括 1043 次插入273 次删除
  1. 5 0
      fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java
  2. 1 1
      fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java
  3. 2 1
      fs-admin/src/main/java/com/fs/live/controller/LiveDataController.java
  4. 9 7
      fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java
  5. 1 1
      fs-common/src/main/java/com/fs/common/constant/LiveKeysConstant.java
  6. 45 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyConfigController.java
  7. 64 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  8. 2 1
      fs-company/src/main/java/com/fs/company/controller/live/LiveDataController.java
  9. 16 37
      fs-company/src/main/java/com/fs/company/controller/live/LiveOrderController.java
  10. 1 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java
  11. 1 1
      fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  12. 1 1
      fs-company/src/main/resources/application.yml
  13. 52 21
      fs-live-app/src/main/java/com/fs/live/task/Task.java
  14. 5 15
      fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java
  15. 25 0
      fs-service/src/main/java/com/fs/common/VerifyCodeUtil.java
  16. 2 0
      fs-service/src/main/java/com/fs/common/service/ISmsService.java
  17. 82 0
      fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java
  18. 3 0
      fs-service/src/main/java/com/fs/company/domain/CompanyUser.java
  19. 12 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyConfigMapper.java
  20. 15 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  21. 30 0
      fs-service/src/main/java/com/fs/company/param/SaveCompanyMiniAppParam.java
  22. 18 0
      fs-service/src/main/java/com/fs/company/service/ICompanyConfigService.java
  23. 15 0
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  24. 90 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyConfigServiceImpl.java
  25. 10 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  26. 32 0
      fs-service/src/main/java/com/fs/company/vo/CompanyMiniAppVO.java
  27. 4 0
      fs-service/src/main/java/com/fs/course/domain/FsCoursePlaySourceConfig.java
  28. 5 0
      fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigCreateParam.java
  29. 6 0
      fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigEditParam.java
  30. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  31. 6 0
      fs-service/src/main/java/com/fs/course/vo/FsCoursePlaySourceConfigVO.java
  32. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  33. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  34. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  35. 20 0
      fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java
  36. 10 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsUserScrm.java
  37. 2 1
      fs-service/src/main/java/com/fs/hisStore/enums/ShipperCodeEnum.java
  38. 2 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  39. 7 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsUserScrmMapper.java
  40. 9 6
      fs-service/src/main/java/com/fs/hisStore/service/IFsExpressScrmService.java
  41. 7 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsUserScrmService.java
  42. 64 13
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsExpressScrmServiceImpl.java
  43. 10 9
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  44. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserScrmServiceImpl.java
  45. 2 0
      fs-service/src/main/java/com/fs/live/domain/LiveOrder.java
  46. 2 2
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  47. 2 2
      fs-service/src/main/java/com/fs/live/mapper/LiveUserFirstEntryMapper.java
  48. 4 0
      fs-service/src/main/java/com/fs/live/param/LiveDataParam.java
  49. 31 33
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  50. 1 0
      fs-service/src/main/java/com/fs/live/vo/FsMyLiveOrderListQueryVO.java
  51. 1 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataListVo.java
  52. 1 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataStatisticsVo.java
  53. 6 4
      fs-service/src/main/java/com/fs/live/vo/LiveOrderVoZm.java
  54. 10 11
      fs-service/src/main/java/com/fs/wx/order/service/impl/LiveExpressToWxService.java
  55. 19 0
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  56. 3 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  57. 8 1
      fs-service/src/main/resources/mapper/hisStore/FsUserScrmMapper.xml
  58. 51 51
      fs-service/src/main/resources/mapper/live/LiveDataMapper.xml
  59. 4 0
      fs-service/src/main/resources/mapper/live/LiveMsgMapper.xml
  60. 5 4
      fs-service/src/main/resources/mapper/live/LiveOrderMapper.xml
  61. 1 1
      fs-service/src/main/resources/mapper/sop/QwSopTempMapper.xml
  62. 144 22
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  63. 2 2
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  64. 15 0
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java
  65. 21 21
      fs-user-app/src/main/java/com/fs/app/param/FsUserEditParam.java
  66. 1 0
      fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByWeChatParam.java
  67. 1 1
      fs-user-app/src/main/resources/application.yml

+ 5 - 0
fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java

@@ -181,6 +181,10 @@ public class LiveTask {
     //每5分钟执行一次
     public void deliveryOp() {
         List<LiveOrder> list = liveOrderService.selectUpdateExpress();
+        if(list == null || list.isEmpty()) return;
+        if (list.size() > 100) {
+            list = list.subList(0, 100);
+        }
         for (LiveOrder order : list) {
             ErpOrderQueryRequert request = new ErpOrderQueryRequert();
             request.setCode(order.getExtendOrderId());
@@ -202,6 +206,7 @@ public class LiveTask {
                 }
             }
         }
+
     }
 
     public void couponOp() {

+ 1 - 1
fs-admin/src/main/java/com/fs/hisStore/task/MallStoreTask.java

@@ -386,7 +386,7 @@ public class MallStoreTask
         for (Long orderId : list){
             FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderById(orderId);
             String lastFourNumber = "";
-            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())  || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
                 lastFourNumber = order.getUserPhone();
                 if (lastFourNumber.length() == 11) {
                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);

+ 2 - 1
fs-admin/src/main/java/com/fs/live/controller/LiveDataController.java

@@ -8,6 +8,7 @@ import com.fs.live.domain.LiveData;
 import com.fs.live.param.LiveDataParam;
 import com.fs.live.service.ILiveDataService;
 import com.fs.live.vo.LiveUserFirstVo;
+import com.github.pagehelper.PageHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -49,7 +50,7 @@ public class LiveDataController extends BaseController {
     @PostMapping("/listLiveData")
     public R listLiveData(@RequestBody LiveDataParam param, HttpServletRequest request)
     {
-        startPage();
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         return liveDataService.listLiveData(param);
     }
 

+ 9 - 7
fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java

@@ -33,6 +33,8 @@ import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserService;
 import com.fs.hisStore.dto.StoreOrderExpressExportDTO;
 import com.fs.hisStore.param.*;
+import com.fs.hisStore.service.IFsExpressScrmService;
+import com.fs.hisStore.task.ExpressTask;
 import com.fs.hisStore.task.LiveTask;
 import com.fs.hisStore.vo.FsStoreOrderVO;
 import com.fs.live.domain.*;
@@ -95,7 +97,7 @@ public class LiveOrderController extends BaseController
     @Autowired
     private TokenService tokenService;
     @Autowired
-    private IFsExpressService expressService;
+    private IFsExpressScrmService expressService;
 //    @Autowired
 //    private FsWarehousesMapper fsWarehousesMapper;
     @Autowired
@@ -168,15 +170,16 @@ public class LiveOrderController extends BaseController
             vo.setCompanyUserPhone(ParseUtils.parsePhone(vo.getCompanyUserPhone()));
             vo.setUserBindPhone(ParseUtils.parsePhone(vo.getUserBindPhone()));
             vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
-            vo.setCost(BigDecimal.ZERO);
+
             // 财务独特字段
             if (loginUser.getPermissions().contains("live:liveOrder:finance") || loginUser.getPermissions().contains("*:*:*")) {
                 vo.setCostPrice(vo.getCostPrice());
-                vo.setFPrice(BigDecimal.valueOf((long) vo.getCostPrice().intValue() * Integer.parseInt(vo.getTotalNum())));
+                vo.setFPrice(vo.getCostPrice().multiply(BigDecimal.valueOf(Long.parseLong(vo.getTotalNum()))));
             } else {
                 vo.setCostPrice(BigDecimal.ZERO);
                 vo.setFPrice(BigDecimal.ZERO);
             }
+            vo.setCost(vo.getCostPrice());
 
         }
         return getDataTable(list);
@@ -197,15 +200,15 @@ public class LiveOrderController extends BaseController
             vo.setCompanyUserPhone(ParseUtils.parsePhone(vo.getCompanyUserPhone()));
             vo.setUserBindPhone(ParseUtils.parsePhone(vo.getUserBindPhone()));
             vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
-            vo.setCost(BigDecimal.ZERO);
             // 财务独特字段
             if (loginUser.getPermissions().contains("live:liveOrder:finance") || loginUser.getPermissions().contains("*:*:*")) {
                 vo.setCostPrice(vo.getCostPrice());
-                vo.setFPrice(BigDecimal.valueOf((long) vo.getCostPrice().intValue() * Integer.parseInt(vo.getTotalNum())));
+                vo.setFPrice(vo.getCostPrice().multiply(BigDecimal.valueOf(Long.parseLong(vo.getTotalNum()))));
             } else {
                 vo.setCostPrice(BigDecimal.ZERO);
                 vo.setFPrice(BigDecimal.ZERO);
             }
+            vo.setCost(vo.getCostPrice());
         }
         ExcelUtil<LiveOrderVoZm> util = new ExcelUtil<LiveOrderVoZm>(LiveOrderVoZm.class);
         return util.exportExcel(list, "订单数据");
@@ -397,8 +400,7 @@ public class LiveOrderController extends BaseController
     @ApiOperation("物流查询")
     @PostMapping("/getExpressByDeliverId")
     public R getExpressByDeliverId(@Validated @RequestBody FsStoreOrderExpressParam param, HttpServletRequest request){
-//        return expressService.getLiveExpressByDeliverId(param);
-        return R.ok();
+        return expressService.getLiveExpressByDeliverId(param);
     }
 
     @PreAuthorize("@ss.hasPermi('live:liveOrder:auditPayRemain')")

+ 1 - 1
fs-common/src/main/java/com/fs/common/constant/LiveKeysConstant.java

@@ -28,7 +28,7 @@ public class LiveKeysConstant {
     public static final String TOP_MSG = "topMsg"; //抽奖记录
 
     public static final String LIVE_FLAG_CACHE = "live:flag:%s"; //直播间直播/回放状态缓存
-    public static final Integer LIVE_FLAG_CACHE_EXPIRE = 60; //直播间状态缓存过期时间(秒)
+    public static final Integer LIVE_FLAG_CACHE_EXPIRE = 300; //直播间状态缓存过期时间(秒)
 
 
 }

+ 45 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyConfigController.java

@@ -4,8 +4,11 @@ import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyConfig;
+import com.fs.company.param.SaveCompanyMiniAppParam;
 import com.fs.company.service.ICompanyConfigService;
+import com.fs.company.vo.CompanyMiniAppVO;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.service.TokenService;
 import com.fs.system.domain.SysConfig;
@@ -15,6 +18,8 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.List;
+
 /**
  * 系统配置
  *
@@ -78,7 +83,47 @@ public class CompanyConfigController extends BaseController
 
     }
 
+    /**
+     * 获取公司可配置小程序列表
+     * @return
+     */
+    @PreAuthorize("@ss.hasPermi('company:miniConfig:list')")
+    @GetMapping(value = "/getCompanyMiniAppList")
+    public R getCompanyMiniAppList()
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(null == loginUser) {
+            return R.error("用户信息错误");
+        }
+        Long companyId = loginUser.getCompany().getCompanyId();
+        List<CompanyMiniAppVO> companyMiniAppList = companyConfigService.getCompanyMiniAppList(companyId);
+        SaveCompanyMiniAppParam param = companyConfigService.getCurrentCompanyMiniApp(companyId);
+        return R.ok().put("data",companyMiniAppList).put("current",param);
+
+    }
 
+    /**
+     * 公司编辑保存主备小程序数据
+     * @return
+     */
+    @PreAuthorize("@ss.hasPermi('company:miniConfig:addOrEdit')")
+    @PostMapping(value = "/saveCompanyMiniApp")
+    public R saveCompanyMiniApp(@RequestBody SaveCompanyMiniAppParam param)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(null == loginUser) {
+            return R.error("用户信息错误");
+        }
+        Long companyId = loginUser.getCompany().getCompanyId();
+        param.setCompanyId(companyId);
+//        if(null == param.getCompanyId() || !companyId.equals(param.getCompanyId())) {
+//            return R.error("公司信息错误");
+//        }
+        Long userId = loginUser.getUser().getUserId();
+        param.setUpdateBy(userId);
+        return companyConfigService.saveCompanyMiniApp(param);
+
+    }
 
 
 

+ 64 - 0
fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java

@@ -35,6 +35,7 @@ import com.fs.framework.security.SecurityUtils;
 import com.fs.framework.service.TokenService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.his.vo.OptionsVO;
+import com.fs.hisStore.service.IFsUserScrmService;
 import com.fs.hisStore.vo.FsStoreProductExportVO;
 import com.fs.im.config.IMConfig;
 import com.fs.im.dto.OpenImResponseDTO;
@@ -112,6 +113,9 @@ public class CompanyUserController extends BaseController {
     @Autowired
     private CloudHostProper cloudHostProper;
 
+    @Autowired
+    private IFsUserScrmService fsUserScrmService;
+
     private static final String appLink = "https://jump.ylrztop.com/jumpapp/pages/index/index?link=";
 
     /**
@@ -805,4 +809,64 @@ public class CompanyUserController extends BaseController {
         OpenImResponseDTO openImResponseDTO = openIMService.importFriend(ownerUserID, friendUserIDs);
         return R.ok().put("data",openImResponseDTO);
     }
+
+    /**
+     * 根据手机号码精确查询fs_user(完全匹配)
+     * @param phone 手机号码
+     * @return 用户列表
+     */
+    @ApiOperation("根据手机号码精确查询fs_user")
+    @GetMapping("/fsUser/queryByPhone")
+    public R queryFsUserByPhone(@RequestParam("phone") String phone) {
+        if (StringUtils.isEmpty(phone)) {
+            return R.error("手机号码不能为空");
+        }
+        List<com.fs.hisStore.domain.FsUserScrm> userList = fsUserScrmService.selectFsUserListByPhoneExact(phone);
+        return R.ok().put("data", userList);
+    }
+
+    /**
+     * 批量绑定用户到员工
+     * @param data 包含 userIds(公司用户ID列表)和 bindCompanyUserId(绑定的销售ID)
+     * @return 操作结果
+     */
+    @ApiOperation("批量绑定用户到员工")
+    @PostMapping("/batchBindCompanyUserId")
+    public R batchBindCompanyUserId(@RequestBody Map<String, Object> data) {
+        List<Long> userIds = (List<Long>) data.get("fsUserIds");
+        Long bindCompanyUserId = null;
+        if (data.get("companyUserId") != null) {
+            if (data.get("companyUserId") instanceof Integer) {
+                bindCompanyUserId = ((Integer) data.get("companyUserId")).longValue();
+            } else if (data.get("companyUserId") instanceof Long) {
+                bindCompanyUserId = (Long) data.get("companyUserId");
+            }
+        }
+
+        if (userIds == null || userIds.isEmpty()) {
+            return R.error("用户ID列表不能为空");
+        }
+
+        int result = companyUserService.batchUpdateBindCompanyUserId(userIds, bindCompanyUserId);
+        if (result > 0) {
+            return R.ok("绑定成功");
+        } else {
+            return R.error("绑定失败");
+        }
+    }
+
+    /**
+     * 查询已绑定的用户
+     * @param companyUserId 销售ID
+     * @return 绑定的用户列表
+     */
+    @ApiOperation("查询已绑定的用户")
+    @GetMapping("/getBoundUsers/{companyUserId}")
+    public R getBoundUsers(@PathVariable("companyUserId") Long companyUserId) {
+        if (companyUserId == null) {
+            return R.error("销售ID不能为空");
+        }
+        List<com.fs.hisStore.domain.FsUserScrm> userList = companyUserService.selectBoundFsUsersByCompanyUserId(companyUserId);
+        return R.ok().put("data", userList);
+    }
 }

+ 2 - 1
fs-company/src/main/java/com/fs/company/controller/live/LiveDataController.java

@@ -14,6 +14,7 @@ import com.fs.live.domain.LiveData;
 import com.fs.live.param.LiveDataParam;
 import com.fs.live.service.ILiveDataService;
 import com.fs.live.vo.ColumnsConfigVo;
+import com.github.pagehelper.PageHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -67,7 +68,7 @@ public class LiveDataController extends BaseController
     public R listLiveData(@RequestBody LiveDataParam param, HttpServletRequest request)
     {
         param.setCompanyId(tokenService.getLoginUser(request).getUser().getCompanyId());
-        startPage();
+        PageHelper.startPage(param.getPageNum(), param.getPageSize());
         return liveDataService.listLiveData(param);
     }
 

+ 16 - 37
fs-company/src/main/java/com/fs/company/controller/live/LiveOrderController.java

@@ -1,5 +1,6 @@
 package com.fs.company.controller.live;
 
+import cn.hutool.core.util.StrUtil;
 import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
@@ -8,6 +9,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.framework.security.LoginUser;
 import com.fs.framework.security.SecurityUtils;
@@ -18,7 +20,10 @@ import com.fs.his.domain.FsUser;
 import com.fs.his.param.FsStoreOrderBindCustomerParam;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserService;
+import com.fs.hisStore.dto.ExpressInfoDTO;
+import com.fs.hisStore.enums.ShipperCodeEnum;
 import com.fs.hisStore.param.FsStoreOrderExpressParam;
+import com.fs.hisStore.service.IFsExpressScrmService;
 import com.fs.live.domain.*;
 import com.fs.live.enums.LiveOrderCancleReason;
 import com.fs.live.param.LiveOrderExpressParam;
@@ -40,6 +45,8 @@ import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 
+import static com.fs.his.utils.PhoneUtil.decryptPhone;
+
 
 /**
  * 订单Controller
@@ -67,7 +74,7 @@ public class LiveOrderController extends BaseController
     @Autowired
     private TokenService tokenService;
     @Autowired
-    private IFsExpressService expressService;
+    private IFsExpressScrmService expressService;
 
 
 //    @Autowired
@@ -204,8 +211,8 @@ public class LiveOrderController extends BaseController
     @PostMapping("/getExpressByDeliverId")
     public R getExpressByDeliverId(@Validated @RequestBody FsStoreOrderExpressParam param, HttpServletRequest request){
 
-//        return expressService.getLiveExpressByDeliverId(param);
-        return R.ok();
+        return expressService.getLiveExpressByDeliverId(param);
+//        return R.ok();
     }
 
     /**
@@ -287,40 +294,12 @@ public class LiveOrderController extends BaseController
     /**
      * 查看物流状态
      * */
-//    @PreAuthorize("@ss.hasPermi('live:liveOrder:express')")
-//    @GetMapping(value = "/getExpress/{id}")
-//    public R getExpress(@PathVariable("id") String id)
-//    {
-//        LiveOrder order=liveOrderService.selectLiveOrderByOrderId(id);
-//        ExpressInfoDTO expressInfoDTO=null;
-//        if(StringUtils.isNotEmpty(order.getDeliverySn())){
-//            String lastFourNumber = "";
-//            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
-//
-//                lastFourNumber = order.getUserPhone();
-//                if (lastFourNumber.length() == 11) {
-//                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
-//                }else if (lastFourNumber.length()>11){
-//                    String jm = decryptPhone(lastFourNumber);
-//                    lastFourNumber = StrUtil.sub(jm, jm.length(), -4);
-//                }
-//            }
-//            expressInfoDTO=expressService.getExpressInfo(order.getOrderCode(),order.getDeliveryCode(),order.getDeliverySn(),lastFourNumber);
-//
-//            if((expressInfoDTO.getStateEx()!=null&&expressInfoDTO.getStateEx().equals("0"))&&(expressInfoDTO.getState()!=null&&expressInfoDTO.getState().equals("0"))){
-//                lastFourNumber = "19923690275";
-//                if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
-//                    if (lastFourNumber.length() == 11) {
-//                        lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
-//                    }
-//                }
-//
-//                expressInfoDTO=expressService.getExpressInfo(order.getOrderCode(),order.getDeliveryCode(),order.getDeliverySn(),lastFourNumber);
-//
-//            }
-//        }
-//        return R.ok().put("data",expressInfoDTO);
-//    }
+    @PreAuthorize("@ss.hasPermi('live:liveOrder:express')")
+    @GetMapping(value = "/getExpress/{id}")
+    public R getExpress(@PathVariable("id") String id)
+    {
+        return liveOrderService.syncExpress(Long.valueOf(id));
+    }
 
     /**
      * 支付订单

+ 1 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwSopTempController.java

@@ -145,7 +145,7 @@ public class QwSopTempController extends BaseController
     public TableDataInfo deptList(QwSopTemp qwSopTemp)
     {
 
-        if ("济南联志健康".equals(signProjectName)) {
+        if (!"今正科技".equals(signProjectName)) {
             return list(qwSopTemp);
         }
 

+ 1 - 1
fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -270,7 +270,7 @@ public class FsStoreOrderScrmController extends BaseController
         if(StringUtils.isNotEmpty(order.getDeliveryId())){
 
             String lastFourNumber = "";
-            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
                 lastFourNumber = order.getUserPhone();
                 if (lastFourNumber.length() == 11) {
                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);

+ 1 - 1
fs-company/src/main/resources/application.yml

@@ -7,7 +7,7 @@ spring:
 #    active: druid-jnmy-test
 #    active: druid-jzzx-test
 #    active: druid-hdt
-    active: druid-jnsyj-test
+    active: druid-bjzm-test
 #    active: druid-yzt
 #    active: druid-myhk
 #    active: druid-sft

+ 52 - 21
fs-live-app/src/main/java/com/fs/live/task/Task.java

@@ -461,27 +461,58 @@ public class Task {
             return;
         liveDatas.forEach(liveData ->{
 
-            Long resultLikeCount = getAsLong(redisCache, "live:like:" + liveData.getLiveId());
-            resultLikeCount = resultLikeCount > 0L ? resultLikeCount : liveData.getLikes();
-            redisCache.setCacheObject("live:like:" + liveData.getLiveId(), resultLikeCount.intValue());
-            liveData.setLikes(
-                    resultLikeCount
-            );
-
-       /* for (Long liveId : liveIds) {
-            LiveData liveData = liveDataService.selectLiveDataByLiveId(liveId);
-            if (liveData == null) {
-                continue; // 防止空指针异常
-            }*/
-
-
-            // 从 redis 获取数据,并提供默认值,避免 NPE
-            liveData.setPageViews(
-                    Math.max( liveData.getPageViews(), Optional.ofNullable(redisCache.incr(PAGE_VIEWS_KEY + liveData.getLiveId(),0)).orElse(0L))
-            );
-            liveData.setTotalViews(
-                    Math.max( liveData.getTotalViews(), Optional.ofNullable(redisCache.incr(TOTAL_VIEWS_KEY + liveData.getLiveId(),0)).orElse(0L))
-            );
+            Map<String, Integer> flagMap = liveWatchUserService.getLiveFlagWithCache(liveData.getLiveId());
+            Integer liveFlag = flagMap.get("liveFlag");
+
+            // 判断是直播还是回放
+            if (liveFlag != null && liveFlag == 1) {
+                // 直播:更新 likes 和 totalViews
+                Long resultLikeCount = getAsLong(redisCache, "live:like:" + liveData.getLiveId());
+                resultLikeCount = resultLikeCount > 0L ? resultLikeCount : liveData.getLikes();
+                redisCache.setCacheObject("live:like:" + liveData.getLiveId(), resultLikeCount.intValue());
+                liveData.setLikes(resultLikeCount);
+
+                // 从 redis 获取数据,并提供默认值,避免 NPE
+                liveData.setPageViews(
+                        Math.max( liveData.getPageViews(), Optional.ofNullable(redisCache.incr(PAGE_VIEWS_KEY + liveData.getLiveId(),0)).orElse(0L))
+                );
+                liveData.setTotalViews(
+                        Math.max( liveData.getTotalViews(), Optional.ofNullable(redisCache.incr(TOTAL_VIEWS_KEY + liveData.getLiveId(),0)).orElse(0L))
+                );
+            } else {
+                // 回放:使用 Redis 中的数据减去直播的数据,得到回放的数据
+                String likeKey = "live:like:" + liveData.getLiveId();
+                String totalViewsKey = TOTAL_VIEWS_KEY + liveData.getLiveId();
+                
+                // 从 Redis 获取总数据(直播+回放)
+                Long totalLikeCount = getAsLong(redisCache, likeKey);
+                Long totalViewCount = getAsLong(redisCache, totalViewsKey);
+                
+                // 获取数据库中直播的数据
+                Long liveLikeCount = liveData.getLikes() != null ? liveData.getLikes() : 0L;
+                Long liveViewCount = liveData.getTotalViews() != null ? liveData.getTotalViews() : 0L;
+                
+                // 回放数据 = Redis总数据 - 直播数据
+                Long replayLikeNum = totalLikeCount - liveLikeCount;
+                Long replayViewNum = totalViewCount - liveViewCount;
+                
+                // 确保回放数据不为负数
+                if (replayLikeNum < 0L) {
+                    replayLikeNum = 0L;
+                }
+                if (replayViewNum < 0L) {
+                    replayViewNum = 0L;
+                }
+                
+                // 更新回放数据
+                liveData.setReplayLikeNum(replayLikeNum);
+                liveData.setReplayViewNum(replayViewNum);
+
+                // 从 redis 获取数据,并提供默认值,避免 NPE
+                liveData.setPageViews(
+                        Math.max( liveData.getPageViews(), Optional.ofNullable(redisCache.incr(PAGE_VIEWS_KEY + liveData.getLiveId(),0)).orElse(0L))
+                );
+            }
             liveData.setUniqueVisitors(
                     /*Optional.ofNullable(redisCache.getCacheSet(UNIQUE_VISITORS_KEY + liveId))
                             .map(Set::size)  // 获取集合大小

+ 5 - 15
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -263,21 +263,11 @@ public class WebSocketServer {
                             return;
                         }
 
-                        // 根据直播状态设置live_flag或replay_flag
-                        Live msgLive = liveService.selectLiveByLiveId(msg.getLiveId());
-                        if (msgLive != null && msgLive.getFinishTime() != null) {
-                            Date finishTime = java.sql.Timestamp.valueOf(msgLive.getFinishTime());
-                            if (new Date().after(finishTime)) {
-                                liveMsg.setReplayFlag(1);
-                                liveMsg.setLiveFlag(0);
-                            } else {
-                                liveMsg.setLiveFlag(1);
-                                liveMsg.setReplayFlag(0);
-                            }
-                        } else {
-                            liveMsg.setLiveFlag(1);
-                            liveMsg.setReplayFlag(0);
-                        }
+                        Map<String, Integer> flagMap = liveWatchUserService.getLiveFlagWithCache(liveId);
+                        Integer liveFlag = flagMap.get("liveFlag");
+                        Integer replayFlag = flagMap.get("replayFlag");
+                        liveMsg.setLiveFlag(liveFlag);
+                        liveMsg.setReplayFlag(replayFlag);
 
                         liveMsgService.insertLiveMsg(liveMsg);
                     }

+ 25 - 0
fs-service/src/main/java/com/fs/common/VerifyCodeUtil.java

@@ -0,0 +1,25 @@
+package com.fs.common;
+
+import java.security.SecureRandom;
+
+public class VerifyCodeUtil {
+
+    // 使用 SecureRandom 保证安全性
+    private static final SecureRandom random = new SecureRandom();
+
+    /**
+     * 生成随机 6 位数字验证码
+     * @return 六位验证码字符串
+     */
+    public static String generateCode() {
+        int code = 100000 + random.nextInt(900000); // 保证是六位数,范围 100000-999999
+        return String.valueOf(code);
+    }
+
+    public static void main(String[] args) {
+        // 测试
+        for (int i = 0; i < 5; i++) {
+            System.out.println(VerifyCodeUtil.generateCode());
+        }
+    }
+}

+ 2 - 0
fs-service/src/main/java/com/fs/common/service/ISmsService.java

@@ -21,4 +21,6 @@ public interface ISmsService
     R sendOrderMsg(SmsSendUserParam param);
 
     R sendPackageOrderMsg(SmsSendUserParam param);
+
+    R sendCaptcha(String phone, String captcha, String code);
 }

+ 82 - 0
fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java

@@ -36,6 +36,7 @@ import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.google.gson.Gson;
 import lombok.Synchronized;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Service;
@@ -48,6 +49,7 @@ import java.util.Date;
 import java.util.List;
 
 @Service
+@Slf4j
 public class SmsServiceImpl implements ISmsService
 {
     @Autowired
@@ -527,6 +529,86 @@ public class SmsServiceImpl implements ISmsService
         }
     }
 
+    @Override
+    public R sendCaptcha(String phone, String captcha, String code) {
+        log.info(captcha);
+        CompanySmsTemp temp = smsTempService.selectCompanySmsTempByCode(code);
+        if (temp == null) {
+            return R.error("没有模板");
+        }
+        String content = temp.getContent();
+        if (StringUtils.isNotEmpty(captcha)) {
+            content = content.replace("${sms.captcha}", captcha);
+        }
+        String urls = null;
+        SysConfig sysConfig = sysConfigMapper.selectConfigByConfigKey("his.sms");
+        FsSmsConfig sms = JSON.parseObject(sysConfig.getConfigValue(), FsSmsConfig.class);
+        if (sms.getType().equals("rf")) {
+            try {
+                content = content.replace("${sms.sign}",sms.getRfSign());
+                urls = sms.getRfUrl1() + "sms?action=send&account=" + sms.getRfAccount1() + "&password=" + sms.getRfPassword1() + "&mobile=" + phone + "&content=" + URLEncoder.encode(content, "UTF-8") + "&extno=" + sms.getRfCode1() + "&rt=json";
+            } catch (UnsupportedEncodingException e) {
+                e.printStackTrace();
+            }
+            String post = HttpRequest.get(urls)
+                    .execute().body();
+            SmsSendVO vo = JSONUtil.toBean(post, SmsSendVO.class);
+            if (vo.getStatus().equals(0)) {
+                for (SmsSendItemVO itemVO : vo.getList()) {
+                    if (itemVO.getResult().equals("0")) {
+                        CompanySmsLogs logs = new CompanySmsLogs();
+                        logs.setContent(content);
+                        logs.setTempCode(temp.getTempCode());
+                        logs.setTempId(temp.getTempId());
+                        logs.setPhone(phone);
+                        logs.setSendTime(new Date());
+                        logs.setStatus(0);
+                        logs.setType(sms.getType());
+                        logs.setMid(itemVO.getMid());
+                        Integer counts = logs.getContent().length() / 67;
+                        if (logs.getContent().length() % 67 > 0) {
+                            counts = counts + 1;
+                        }
+                        if (counts == 0) {
+                            counts = 1;
+                        }
+                        logs.setNumber(counts);
+                        smsLogsService.insertCompanySmsLogs(logs);
+                    }
+                }
+            }
+        } else if (sms.getType().equals("dh")) {
+            SendSmsReturn sendSmsReturn = null;
+            content = content.replace("${sms.sign}",sms.getDhSign());
+            sendSmsReturn = smsTService.sendSms(sms.getDhAccount1(), sms.getDhPassword1(), content, phone);
+            if (sendSmsReturn != null) {
+                if (sendSmsReturn.getResult() != null && sendSmsReturn.getResult().equals("0")) {
+                    CompanySmsLogs logs = new CompanySmsLogs();
+                    logs.setContent(content);
+                    logs.setTempCode(temp.getTempCode());
+                    logs.setTempId(temp.getTempId());
+                    logs.setPhone(phone);
+                    logs.setSendTime(new Date());
+                    logs.setStatus(0);
+                    logs.setType(sms.getType());
+                    logs.setMid(sendSmsReturn.getMsgid());
+                    Integer counts = logs.getContent().length() / 67;
+                    if (logs.getContent().length() % 67 > 0) {
+                        counts = counts + 1;
+                    }
+                    if (counts == 0) {
+                        counts = 1;
+                    }
+                    logs.setNumber(counts);
+                    smsLogsService.insertCompanySmsLogs(logs);
+                }
+            }
+        }
+
+
+        return R.ok();
+    }
+
 
     @Override
     @Synchronized

+ 3 - 0
fs-service/src/main/java/com/fs/company/domain/CompanyUser.java

@@ -178,6 +178,9 @@ public class CompanyUser extends BaseEntity
     /** 是否允许所有方式注册会员,1-是,0-否,默认1(用于个微注册会员) */
     private Integer isAllowedAllRegister;
 
+    /** 绑定的公司用户ID */
+    private Long bindCompanyUserId;
+
     @TableField(exist = false)
     private List<Long> deptList;
 

+ 12 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyConfigMapper.java

@@ -1,6 +1,7 @@
 package com.fs.company.mapper;
 
 import com.fs.company.domain.CompanyConfig;
+import com.fs.company.vo.CompanyMiniAppVO;
 import com.fs.system.domain.SysConfig;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -74,4 +75,15 @@ public interface CompanyConfigMapper
 
     @Select("select config_value from company_config where company_id=#{companyId} and config_key='redPacket:config' ")
     String selectRedPacketConfigByKey(Long companyId);
+
+    @Select("select \n" +
+            "id,\n" +
+            "name,\n" +
+            "appid\n" +
+            "from\n" +
+            "fs_course_play_source_config\n" +
+            "where \n" +
+            "is_del = 0\n" +
+            "and FIND_IN_SET(#{companyId},set_company_ids)")
+    List<CompanyMiniAppVO> getCompanyMiniAppList(@Param("companyId") Long companyId);
 }

+ 15 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java

@@ -336,4 +336,19 @@ public interface CompanyUserMapper
             "</script>")
     List<Long> selectCompanyQwUserByDept(@Param("companyUserIDs") List<Long> companyUserIDs, @Param("userType") String userType);
 
+    /**
+     * 批量更新公司用户的绑定销售ID
+     * @param userIds 公司用户ID列表
+     * @param bindCompanyUserId 绑定的销售ID
+     * @return 更新结果
+     */
+    int batchUpdateBindCompanyUserId(@Param("userIds") List<Long> userIds, @Param("bindCompanyUserId") Long bindCompanyUserId);
+
+    /**
+     * 根据销售ID查询绑定的fs_user用户列表
+     * @param companyUserId 销售ID
+     * @return 绑定的用户列表
+     */
+    List<com.fs.hisStore.domain.FsUserScrm> selectBoundFsUsersByCompanyUserId(@Param("companyUserId") Long companyUserId);
+
 }

+ 30 - 0
fs-service/src/main/java/com/fs/company/param/SaveCompanyMiniAppParam.java

@@ -0,0 +1,30 @@
+package com.fs.company.param;
+
+import lombok.Data;
+
+/**
+ * @author MixLiu
+ * @date 2025/11/22 下午1:59)
+ */
+
+@Data
+public class SaveCompanyMiniAppParam {
+
+    /**
+     * 公司id
+     */
+    private Long companyId;
+
+    /**
+     * 主要小程序
+     */
+    private String mainMiniAppId;
+
+    /**
+     * 备用小程序
+     */
+    private String backupMiniAppId;
+
+    private Long updateBy;
+
+}

+ 18 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyConfigService.java

@@ -1,6 +1,9 @@
 package com.fs.company.service;
 
+import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyConfig;
+import com.fs.company.param.SaveCompanyMiniAppParam;
+import com.fs.company.vo.CompanyMiniAppVO;
 
 import java.util.List;
 
@@ -69,4 +72,19 @@ public interface ICompanyConfigService
     CompanyConfig selectCompanyConfigByServerKey(String key);
 
     String selectRedPacketConfigByKey(Long companyId);
+
+    /**
+     * 获取公司可配置小程序列表
+     * @param companyId
+     * @return
+     */
+    List<CompanyMiniAppVO> getCompanyMiniAppList(Long companyId);
+
+    SaveCompanyMiniAppParam getCurrentCompanyMiniApp(Long companyId);
+    /**
+     * 公司编辑保存主备小程序数据
+     * @param param
+     * @return
+     */
+    R saveCompanyMiniApp(SaveCompanyMiniAppParam param);
 }

+ 15 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -249,4 +249,19 @@ public interface ICompanyUserService {
     R updateBatchUserRoles(BatchUserRolesVO batchUserRolesVO);
 
     List<Long> selectCompanyQwUserByDept(List<Long> deptList,String userType);
+
+    /**
+     * 批量更新公司用户的绑定销售ID
+     * @param userIds 公司用户ID列表
+     * @param bindCompanyUserId 绑定的销售ID
+     * @return 更新结果
+     */
+    int batchUpdateBindCompanyUserId(List<Long> userIds, Long bindCompanyUserId);
+
+    /**
+     * 根据销售ID查询绑定的fs_user用户列表
+     * @param companyUserId 销售ID
+     * @return 绑定的用户列表
+     */
+    List<com.fs.hisStore.domain.FsUserScrm> selectBoundFsUsersByCompanyUserId(Long companyUserId);
 }

+ 90 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyConfigServiceImpl.java

@@ -1,19 +1,26 @@
 package com.fs.company.service.impl;
 
+import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
 import com.fs.common.core.text.Convert;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyConfig;
+import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.mapper.CompanyConfigMapper;
+import com.fs.company.mapper.CompanyMiniappMapper;
+import com.fs.company.param.SaveCompanyMiniAppParam;
 import com.fs.company.service.ICompanyConfigService;
+import com.fs.company.vo.CompanyMiniAppVO;
 import com.fs.system.domain.SysConfig;
 import org.apache.http.util.Asserts;
 import org.redisson.api.RedissonClient;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
+import java.util.Date;
 import java.util.List;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.TimeUnit;
@@ -38,6 +45,8 @@ public class CompanyConfigServiceImpl implements ICompanyConfigService
     private static final String REDIS_KEY_PREFIX = "red_packet_config:";
     private static final long CACHE_TIMEOUT = 24 * 60 * 60;
 
+    @Autowired
+    CompanyMiniappMapper companyMiniappMapper;
     /**
      * 查询参数配置
      *
@@ -171,4 +180,85 @@ public class CompanyConfigServiceImpl implements ICompanyConfigService
     private static Object getSynchronizationObject(Long companyId) {
         return LOCKS.computeIfAbsent(companyId, k -> new Object());
     }
+
+    /**
+     * 获取公司可配置小程序列表
+     * @param companyId
+     * @return
+     */
+    public List<CompanyMiniAppVO> getCompanyMiniAppList(Long companyId){
+        return companyConfigMapper.getCompanyMiniAppList(companyId);
+    }
+
+    //主要小程序
+    Integer type_main = 0;
+    //备用小程序
+    Integer type_backup = 1;
+
+    @Override
+    public SaveCompanyMiniAppParam getCurrentCompanyMiniApp(Long companyId){
+        SaveCompanyMiniAppParam result = new SaveCompanyMiniAppParam();
+        CompanyMiniapp companyMiniapp = new CompanyMiniapp();
+        companyMiniapp.setCompanyId(companyId);
+        List<CompanyMiniapp> companyMiniapps = companyMiniappMapper.selectCompanyMiniappList(companyMiniapp);
+        if(null != companyMiniapps && !companyMiniapps.isEmpty() && companyMiniapps.size() == 2){
+            for (CompanyMiniapp miniapp : companyMiniapps) {
+                //主要小程序更新
+                if(type_main.equals(miniapp.getType())){
+                    result.setMainMiniAppId(miniapp.getAppId());
+                }
+                //备用小程序更新
+                if(type_backup.equals(miniapp.getType())){
+                    result.setBackupMiniAppId(miniapp.getAppId());
+                }
+            }
+        }
+
+        return result;
+    }
+
+
+    /**
+     * 公司编辑保存主备小程序数据
+     * @param param
+     * @return
+     */
+    @Override
+    @Transactional
+    public R saveCompanyMiniApp(SaveCompanyMiniAppParam param){
+        CompanyMiniapp companyMiniapp = new CompanyMiniapp();
+        companyMiniapp.setCompanyId(param.getCompanyId());
+
+        List<CompanyMiniapp> companyMiniapps = companyMiniappMapper.selectCompanyMiniappList(companyMiniapp);
+        if(null != companyMiniapps && !companyMiniapps.isEmpty() && companyMiniapps.size() == 2){
+            for (CompanyMiniapp miniapp : companyMiniapps) {
+                //主要小程序更新
+                if(type_main.equals(miniapp.getType())){
+                    miniapp.setAppId(param.getMainMiniAppId());
+                }
+                //备用小程序更新
+                if(type_backup.equals(miniapp.getType())){
+                    miniapp.setAppId(param.getBackupMiniAppId());
+                }
+                miniapp.setUpdateTime(new Date());
+                int i = companyMiniappMapper.updateCompanyMiniapp(miniapp);
+            }
+        }else{
+            CompanyMiniapp mainMiniapp = new CompanyMiniapp();
+            mainMiniapp.setCreateTime(new Date());
+            mainMiniapp.setType(type_main);
+            mainMiniapp.setAppId(param.getMainMiniAppId());
+            mainMiniapp.setSortNum(0);
+            mainMiniapp.setCompanyId(param.getCompanyId());
+            int i = companyMiniappMapper.insertCompanyMiniapp(mainMiniapp);
+            CompanyMiniapp backupMiniapp = new CompanyMiniapp();
+            backupMiniapp.setCreateTime(new Date());
+            backupMiniapp.setType(type_backup);
+            backupMiniapp.setAppId(param.getBackupMiniAppId());
+            backupMiniapp.setSortNum(0);
+            backupMiniapp.setCompanyId(param.getCompanyId());
+            int  j = companyMiniappMapper.insertCompanyMiniapp(backupMiniapp);
+        }
+        return R.ok();
+    }
 }

+ 10 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -1086,4 +1086,14 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     public List<Long> selectCompanyQwUserByDept(List<Long> deptList,String userType) {
         return companyUserMapper.selectCompanyQwUserByDept(deptList,userType);
     }
+
+    @Override
+    public int batchUpdateBindCompanyUserId(List<Long> userIds, Long bindCompanyUserId) {
+        return companyUserMapper.batchUpdateBindCompanyUserId(userIds, bindCompanyUserId);
+    }
+
+    @Override
+    public List<com.fs.hisStore.domain.FsUserScrm> selectBoundFsUsersByCompanyUserId(Long companyUserId) {
+        return companyUserMapper.selectBoundFsUsersByCompanyUserId(companyUserId);
+    }
 }

+ 32 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyMiniAppVO.java

@@ -0,0 +1,32 @@
+package com.fs.company.vo;
+
+import lombok.Data;
+
+/**
+ * @author MixLiu
+ * @date 2025/11/22 下午1:42)
+ */
+
+@Data
+public class CompanyMiniAppVO {
+    /**
+     * 主键ID
+     */
+    private Long id;
+
+    /**
+     * 小程序/公众号名称
+     */
+    private String name;
+
+    /**
+     * 小程序/公众号appid
+     */
+    private String appid;
+
+    /**
+     * 小程序所属公司id
+     */
+    private Long companyId;
+
+}

+ 4 - 0
fs-service/src/main/java/com/fs/course/domain/FsCoursePlaySourceConfig.java

@@ -82,6 +82,10 @@ public class FsCoursePlaySourceConfig {
      */
     private Long companyId;
 
+    /**
+     * 销售公司ids 用于判定销售公司可见编辑列表
+     */
+    private String setCompanyIds;
     /**
      * 销售ID
      */

+ 5 - 0
fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigCreateParam.java

@@ -45,6 +45,11 @@ public class FsCoursePlaySourceConfigCreateParam {
 
     @ApiModelProperty("所属公司")
     private Long companyId;
+    /**
+     * 销售公司ids 用于判定销售公司可见编辑列表
+     */
+    @ApiModelProperty("销售公司ids 用于判定销售公司可见编辑列表")
+    private String setCompanyIds;
 
     @ApiModelProperty("是否是互医/商城小程序")
     private Integer isMall;

+ 6 - 0
fs-service/src/main/java/com/fs/course/param/FsCoursePlaySourceConfigEditParam.java

@@ -43,6 +43,12 @@ public class FsCoursePlaySourceConfigEditParam {
     @ApiModelProperty("所属公司")
     private Long companyId;
 
+    /**
+     * 销售公司ids 用于判定销售公司可见编辑列表
+     */
+    @ApiModelProperty("销售公司ids 用于判定销售公司可见编辑列表")
+    private String setCompanyIds;
+
     @ApiModelProperty("是否是互医/商城小程序")
     private Integer isMall;
     private Long createDeptId;

+ 1 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -620,6 +620,7 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         //找当前群中的用户匹配
         if(StringUtils.isNotBlank(param.getChatId()) && null == qwExternalContact){
             List<QwExternalContact> groupChatUserByChatIdAndUserName = qwExternalContactMapper.getGroupChatUserByChatIdAndUserName(qwGroupChat.getOwner(), user.getNickName(), param.getCorpId(), param.getChatId());
+            log.info("群聊用户查询结果,参数user_id:{},name:{},corp_id:{},chatId:{},groupChatUserByChatIdAndUserName:{}",qwGroupChat.getOwner(),user.getNickName(),param.getCorpId(),param.getChatId(),groupChatUserByChatIdAndUserName);
             //没找到用户 || 找到的用户数量大于1 使用userid查询匹配
             if(null == groupChatUserByChatIdAndUserName || groupChatUserByChatIdAndUserName.isEmpty() || groupChatUserByChatIdAndUserName.size() > 1){
                 log.error("群聊用户昵称匹配异常,参数user_id:{},name:{},corp_id:{},chatId:{}",qwGroupChat.getOwner(),user.getNickName(),param.getCorpId(),param.getChatId());

+ 6 - 0
fs-service/src/main/java/com/fs/course/vo/FsCoursePlaySourceConfigVO.java

@@ -42,6 +42,12 @@ public class FsCoursePlaySourceConfigVO {
     @ApiModelProperty("所属公司")
     private Long companyId;
 
+    /**
+     * 销售公司ids 用于判定销售公司可见编辑列表
+     */
+    @ApiModelProperty("销售公司ids 用于判定销售公司可见编辑列表")
+    private String setCompanyIds;
+
     @ApiModelProperty("创建时间")
     @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private LocalDateTime createTime;

+ 4 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -33,6 +33,8 @@ import org.apache.ibatis.annotations.*;
  */
 public interface FsUserMapper
 {
+    @Select("select * from fs_user where phone=#{phone}")
+    List<FsUser> selectFsUsersByPhoneLimitOne(String phone);
     /**
      * 查询用户
      *
@@ -465,4 +467,6 @@ public interface FsUserMapper
      */
     @Update("update fs_user set order_count = order_count + 1, total_amount = IFNULL(total_amount, 0) + #{amount} where user_id = #{userId}")
     void updateUserOrderCountAndAmount(@Param("userId") Long userId, @Param("amount") BigDecimal amount);
+
+    List<FsUser> selectFsUserListByPhone(String phone);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserService.java

@@ -228,4 +228,6 @@ public interface IFsUserService
     void increaseIntegral(List<Long> longs, Long integral);
 
     HisFsUserVO getHisUserIntegralWithLogs(FsUser fsUser);
+
+    List<FsUser> selectFsUserListByPhone(String phone);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java

@@ -1561,4 +1561,9 @@ public class FsUserServiceImpl implements IFsUserService {
         return new HisFsUserVO();
     }
 
+    @Override
+    public List<FsUser> selectFsUserListByPhone(String phone) {
+        return fsUserMapper.selectFsUserListByPhone(phone);
+    }
+
 }

+ 20 - 0
fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java

@@ -77,4 +77,24 @@ public class PhoneUtil {
 
         return text;
     }
+    /**
+     * 用于查询 使用老的数据加密
+     * @param text
+     * @return
+     */
+    private static String OLD_KEY = "2c8d1a7f4e9b3c6ae6d5c4b3a291f8c9";
+    public static String encryptPhoneOldKey(String text) {
+        String encryptedText=null;
+        try {
+            SecretKeySpec secretKey = new SecretKeySpec(OLD_KEY.getBytes(), "AES");
+            Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");
+            // Encryption
+            cipher.init(Cipher.ENCRYPT_MODE, secretKey);
+            byte[] encryptedBytes = cipher.doFinal(text.getBytes());
+            encryptedText = Base64.getEncoder().encodeToString(encryptedBytes);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return encryptedText;
+    }
 }

+ 10 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsUserScrm.java

@@ -215,6 +215,16 @@ public class FsUserScrm extends BaseEntity
     private String companyName;
     private String rank;
     private String react;
+    /** 绑定的公司用户ID */
+    private Long bindCompanyUserId;
+
+    public Long getBindCompanyUserId() {
+        return bindCompanyUserId;
+    }
+
+    public void setBindCompanyUserId(Long bindCompanyUserId) {
+        this.bindCompanyUserId = bindCompanyUserId;
+    }
 
     /**
      * 项目ID

+ 2 - 1
fs-service/src/main/java/com/fs/hisStore/enums/ShipperCodeEnum.java

@@ -6,7 +6,8 @@ import lombok.Getter;
 @Getter
 @AllArgsConstructor
 public enum  ShipperCodeEnum {
-    SF("SF","顺丰速运");
+    SF("SF","顺丰速运"),
+    ZTO("ZTO","中通快递");
 
     private String value;
     private String desc;

+ 2 - 2
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java

@@ -181,7 +181,7 @@ public interface FsStoreProductScrmMapper
     @Select("select * from fs_store_product_scrm where  is_del=0 and is_show=1 order by sort desc limit #{count}")
     List<FsStoreProductListQueryVO> selectFsStoreProductByCateIdQuery(Long cateId);
     @Select({"<script> " +
-            "select p.* from fs_store_product_scrm p  " +
+            "select distinct p.* from fs_store_product_scrm p  " +
             //新增审核状态及所属店铺审核状态
             "<if test = 'maps.isStores != null and maps.isStores == 1   '>"+
             "inner join fs_store_scrm fs on fs.store_id = p.store_id and fs.is_audit = 1 " +
@@ -388,7 +388,7 @@ public interface FsStoreProductScrmMapper
     List<FsStoreProductScrm> getStoreProductInProductIds(List<Long> productIds);
 
     @Select({"<script> " +
-            "SELECT fsp.* FROM fs_store_product_scrm fsp " +
+            "SELECT distinct fsp.* FROM fs_store_product_scrm fsp " +
             " left join fs_store_product_attr_value_scrm fspav on fsp.product_id = fspav.product_id  " +
             "WHERE fsp.is_show = 1 and (fspav.bar_code is not null)  and " +
             " fsp.product_id NOT IN (" +

+ 7 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsUserScrmMapper.java

@@ -125,6 +125,13 @@ public interface FsUserScrmMapper
     @Select("select * from fs_user where phone=#{phone}")
     FsUserScrm selectFsUserByPhone(String phone);
 
+    /**
+     * 根据手机号码精确查询用户列表(完全匹配)
+     * @param phone 手机号码
+     * @return 用户列表
+     */
+    List<FsUserScrm> selectFsUserListByPhoneExact(String phone);
+
 
     @Select("select  b.total_amount,b.last_buy_time,p.pay_money as number,p.payment_id,p.pay_time," +
             " u.* FROM fs_user u LEFT JOIN  (" +

+ 9 - 6
fs-service/src/main/java/com/fs/hisStore/service/IFsExpressScrmService.java

@@ -7,10 +7,11 @@ import com.fs.api.vo.ExpressVO;
 import com.fs.common.core.domain.R;
 import com.fs.hisStore.domain.FsExpressScrm;
 import com.fs.hisStore.dto.ExpressInfoDTO;
+import com.fs.hisStore.param.FsStoreOrderExpressParam;
 
 /**
  * 快递公司Service接口
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
@@ -18,7 +19,7 @@ public interface IFsExpressScrmService
 {
     /**
      * 查询快递公司
-     * 
+     *
      * @param id 快递公司ID
      * @return 快递公司
      */
@@ -26,7 +27,7 @@ public interface IFsExpressScrmService
 
     /**
      * 查询快递公司列表
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 快递公司集合
      */
@@ -34,7 +35,7 @@ public interface IFsExpressScrmService
 
     /**
      * 新增快递公司
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 结果
      */
@@ -42,7 +43,7 @@ public interface IFsExpressScrmService
 
     /**
      * 修改快递公司
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 结果
      */
@@ -50,7 +51,7 @@ public interface IFsExpressScrmService
 
     /**
      * 批量删除快递公司
-     * 
+     *
      * @param ids 需要删除的快递公司ID
      * @return 结果
      */
@@ -78,4 +79,6 @@ public interface IFsExpressScrmService
 
 
     List<ExpressVO> getExpressInfoAPI(ExpressParam param);
+
+    R getLiveExpressByDeliverId(FsStoreOrderExpressParam param);
 }

+ 7 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsUserScrmService.java

@@ -107,6 +107,13 @@ public interface IFsUserScrmService
 
     FsUserScrm selectFsUserByPhone(String phone);
 
+    /**
+     * 根据手机号码精确查询用户列表(完全匹配)
+     * @param phone 手机号码
+     * @return 用户列表
+     */
+    List<FsUserScrm> selectFsUserListByPhoneExact(String phone);
+
     TableDataInfo selectCusListPage(SelectCusListPageParam param);
 
     List<FsCompanyUserListQueryVO> selectFsCompanyUserListQuery(FsUserScrm fsUser);

+ 64 - 13
fs-service/src/main/java/com/fs/hisStore/service/impl/FsExpressScrmServiceImpl.java

@@ -24,7 +24,11 @@ import com.fs.hisStore.dto.ExpressInfoDTO;
 import com.fs.hisStore.dto.TracesDTO;
 import com.fs.hisStore.enums.ShipperCodeEnum;
 import com.fs.hisStore.mapper.FsStoreOrderScrmMapper;
+import com.fs.hisStore.param.FsStoreOrderExpressParam;
+import com.fs.live.domain.LiveOrder;
+import com.fs.live.mapper.LiveOrderMapper;
 import com.fs.system.service.ISysConfigService;
+import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -36,12 +40,12 @@ import org.springframework.util.Base64Utils;
 
 /**
  * 快递公司Service业务层处理
- * 
+ *
  * @author fs
  * @date 2022-03-15
  */
 @Service
-public class FsExpressScrmServiceImpl implements IFsExpressScrmService 
+public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 {
     Logger logger = LoggerFactory.getLogger(FsExpressScrmServiceImpl.class);
     @Autowired
@@ -51,9 +55,11 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
     @Autowired
     private ISysConfigService configService;
 
+    @Autowired
+    private LiveOrderMapper liveOrderMapper;
     /**
      * 查询快递公司
-     * 
+     *
      * @param id 快递公司ID
      * @return 快递公司
      */
@@ -65,7 +71,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
     /**
      * 查询快递公司列表
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 快递公司
      */
@@ -77,7 +83,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
     /**
      * 新增快递公司
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 结果
      */
@@ -90,7 +96,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
     /**
      * 修改快递公司
-     * 
+     *
      * @param fsExpress 快递公司
      * @return 结果
      */
@@ -103,7 +109,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
     /**
      * 批量删除快递公司
-     * 
+     *
      * @param ids 需要删除的快递公司ID
      * @return 结果
      */
@@ -115,7 +121,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
     /**
      * 删除快递公司信息
-     * 
+     *
      * @param id 快递公司ID
      * @return 结果
      */
@@ -130,7 +136,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
         //处理顺丰查询轨迹需手机号码后4位
         String requestData;
-        if (ShipperCode.equals(ShipperCodeEnum.SF.getValue())) {
+        if (ShipperCode.equals(ShipperCodeEnum.SF.getValue()) || ShipperCode.equals(ShipperCodeEnum.ZTO.getValue())) {
             requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "','CustomerName':'" + lastFourNumber + "'}";
         } else {
             requestData = "{'OrderCode':'" + OrderCode + "','ShipperCode':'" + ShipperCode + "','LogisticCode':'" + LogisticCode + "'}";
@@ -177,7 +183,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
     public void subscribeEspress(String orderCode, String deliverySn, String deliveryId, String userPhone) {
         //处理顺丰查询轨迹需手机号码后4位
         String requestData;
-        if (deliverySn.equals(ShipperCodeEnum.SF.getValue())) {
+        if (deliverySn.equals(ShipperCodeEnum.SF.getValue()) || deliverySn.equals(ShipperCodeEnum.ZTO.getValue())) {
             requestData = "{'OrderCode':'" + orderCode + "','ShipperCode':'" + deliverySn + "','LogisticCode':'" + deliveryId + "','CustomerName':'" + userPhone + "'}";
         } else {
             requestData = "{'OrderCode':'" + orderCode + "','ShipperCode':'" + deliverySn + "','LogisticCode':'" + deliveryId + "'}";
@@ -189,7 +195,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
             FSSysConfig sysConfig= JSON.parseObject(json,FSSysConfig.class);
             params.put("RequestData", URLEncoder.encode(requestData, "UTF-8"));
             params.put("EBusinessID",sysConfig.getKdnId().trim());
-            params.put("RequestType", "8008");
+            params.put("RequestType", "8001");
             String dataSign = encrypt(requestData, sysConfig.getKdnKeyId().trim(), "UTF-8");
             params.put("DataSign", URLEncoder.encode(dataSign, "UTF-8"));
             params.put("DataType", "2");
@@ -235,7 +241,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
         if(order!=null){
 
             String lastFourNumber = "";
-            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())  || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
                 lastFourNumber = order.getUserPhone();
                 if (lastFourNumber.length() == 11) {
                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -244,7 +250,7 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
             //处理顺丰查询轨迹需手机号码后4位
             String requestData;
-            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())  || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
                 requestData = "{'OrderCode':'" + order.getOrderCode() + "','ShipperCode':'" + order.getDeliverySn() + "','LogisticCode':'" + param.getPackageno() + "','CustomerName':'" + lastFourNumber + "'}";
             } else {
                 requestData = "{'OrderCode':'" + order.getOrderCode() + "','ShipperCode':'" + order.getDeliverySn() + "','LogisticCode':'" + param.getPackageno() + "'}";
@@ -285,6 +291,51 @@ public class FsExpressScrmServiceImpl implements IFsExpressScrmService
 
     }
 
+    @Override
+    public R getLiveExpressByDeliverId(FsStoreOrderExpressParam param) {
+        // 添加日志 - 开始
+        Logger logger = LoggerFactory.getLogger(this.getClass());
+        logger.info("查询物流信息开始,参数:{}", param);
+        LiveOrder liveOrder = liveOrderMapper.selectLiveOrderByOrderId(String.valueOf(param.getOrderId()));
+        // 添加日志 - 订单信息
+        logger.info("查询到订单信息:{}", liveOrder);
+        if (liveOrder == null) {
+            return R.error("未查询到订单信息");
+        }
+        //顺丰轨迹查询处理
+        String lastFourNumber = "";
+        if (StringUtils.equals(liveOrder.getDeliveryCode(),ShipperCodeEnum.SF.getValue())) {
+            lastFourNumber = getLastFourNum(liveOrder.getUserPhone());
+            // 添加日志 - 顺丰单号
+            logger.info("顺丰单号处理,获取用户手机号后四位:{}", lastFourNumber);
+        }
+        ExpressInfoDTO dto = null;
+        try {
+            dto = this.getExpressInfo(liveOrder.getOrderCode(),
+                    liveOrder.getDeliveryCode(),
+                    liveOrder.getDeliverySn(),
+                    lastFourNumber);
+            // 添加日志 - 成功获取物流信息
+            logger.info("成功获取物流信息,订单号:{},物流单号:{}, 快递公司ID:{}, 返回数据:{}", liveOrder.getOrderCode(), liveOrder.getDeliveryCode(),liveOrder.getDeliverySn(), dto);
+        } catch (Exception e) {
+            // 添加日志 - 异常
+            logger.error("获取物流信息异常,订单号:{},物流单号:{},快递公司ID:{}", liveOrder.getOrderCode(), liveOrder.getDeliveryCode(), liveOrder.getDeliverySn(), e);
+        }
+        // 添加日志 - 结束
+        logger.info("查询物流信息结束,订单号:{}", param.getOrderId());
+
+        return R.ok().put("data",dto);
+    }
+
+    public static String getLastFourNum(String phone) {
+
+        String lastFourNumber = phone;
+        if (lastFourNumber.length() == 11) {
+            lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+        }
+        return lastFourNumber;
+    }
+
     /**
      * Sign签名生成
      *

+ 10 - 9
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -408,6 +408,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
                 FsUserScrm fsUser = userService.selectFsUserByUserId(fsWxExpressTask.getUserId());
 
+                // 目前支持商城订单和直播订单
                 ExpressToWxService service = ExpressToWxHolder.findBest(fsWxExpressTask.getType(),fsWxExpressTask.getOrderCode());
                 Asserts.notNull(service,"订单类型不被支持!");
 
@@ -1359,7 +1360,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                     OrderLogEnum.DELIVERY_GOODS.getDesc());
             //订阅物流回调
             String lastFourNumber = "";
-            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())  || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
                 lastFourNumber = order.getUserPhone();
                 if (lastFourNumber.length() == 11) {
                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -1408,7 +1409,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                         OrderLogEnum.DELIVERY_GOODS.getDesc());
                 //订阅物流回调
                 String lastFourNumber = "";
-                if (express.getCode().equals(ShipperCodeEnum.SF.getValue())) {
+                if (express.getCode().equals(ShipperCodeEnum.SF.getValue())  || express.getCode().equals(ShipperCodeEnum.ZTO.getValue())) {
                     lastFourNumber = order.getUserPhone();
                     if (lastFourNumber.length() == 11) {
                         lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -1467,7 +1468,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     public R getExpress(FsStoreOrderScrm order) {
         //顺丰轨迹查询处理
         String lastFourNumber = "";
-        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
             lastFourNumber = order.getUserPhone();
             if (lastFourNumber.length() == 11) {
                 lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -1560,7 +1561,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         // 由于套餐制单前面有生成oderkey,并且要取修改的价格,所以这里判断,如果有传就用传的orderkey,如果没有就生成(代表走的是直接购买)
         String uuid;
         BigDecimal totalMoney;
-        if(param.getCreateOrderKey().isEmpty() ){
+        if(StringUtils.isEmpty(param.getCreateOrderKey())){
             //直接购买
             uuid = IdUtil.randomUUID();
             totalMoney = storeProductPackage.getPayMoney();
@@ -2517,7 +2518,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     public R syncExpress(FsStoreOrderExpressEditParam param) {
         FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderById(param.getOrderId());
         String lastFourNumber = "";
-        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
             lastFourNumber = order.getUserPhone();
             if (lastFourNumber.length() == 11) {
                 lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -3214,7 +3215,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                             if ((!dto.isSuccess() && dto.getReason().equals("三天无轨迹")) || (!dto.isSuccess() && dto.getReason().equals("七天内无轨迹变化"))) {
                                 //订阅物流回调
                                 String lastFourNumber = "";
-                                if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+                                if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())  || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
                                     lastFourNumber = order.getUserPhone();
                                     if (lastFourNumber.length() == 11) {
                                         lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -3570,7 +3571,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 FsStoreScrm store = fsStoreMapper.selectFsStoreByStoreId(o.getStoreId());
                 int i = fsStoreOrderMapper.updateFsStoreOrderByOrderCode(fsStoreOrder);
                 String lastFourNumber = "";
-                if (fsStoreOrder.getDeliveryCode().equals(com.fs.his.enums.ShipperCodeEnum.SF.getValue())) {
+                if (fsStoreOrder.getDeliveryCode().equals(com.fs.his.enums.ShipperCodeEnum.SF.getValue())  || fsStoreOrder.getDeliveryCode().equals(ShipperCodeEnum.ZTO.getValue())) {
                     if (store.getSendPhone() != null) {
                         lastFourNumber = store.getSendPhone();
                     } else {
@@ -3670,7 +3671,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         fsStoreOrderLogsMapper.insertFsStoreOrderLogs(Logs);
 
         String lastFourNumber = "";
-        if (order.getDeliveryCode().equals(com.fs.his.enums.ShipperCodeEnum.SF.getValue())) {
+        if (order.getDeliveryCode().equals(com.fs.his.enums.ShipperCodeEnum.SF.getValue())  || order.getDeliveryCode().equals(ShipperCodeEnum.ZTO.getValue())) {
             lastFourNumber = order.getUserPhone();
             if (lastFourNumber.length() == 11) {
                 lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -3998,7 +3999,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                     FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderByOrderCode(dto.getOrderNumber());
                     //订阅物流回调
                     String lastFourNumber = "";
-                    if (dto.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+                    if (dto.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())  || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
                         lastFourNumber = order.getUserPhone();
                         if (lastFourNumber.length() == 11) {
                             lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);

+ 5 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserScrmServiceImpl.java

@@ -247,6 +247,11 @@ public class FsUserScrmServiceImpl implements IFsUserScrmService
         return fsUserMapper.selectFsUserByPhone(phone);
     }
 
+    @Override
+    public List<FsUserScrm> selectFsUserListByPhoneExact(String phone) {
+        return fsUserMapper.selectFsUserListByPhoneExact(phone);
+    }
+
     @Override
     public TableDataInfo selectCusListPage(SelectCusListPageParam param) {
         Asserts.check(ObjectUtils.isNotNull(param.getPageNum()), "页数不能为空");

+ 2 - 0
fs-service/src/main/java/com/fs/live/domain/LiveOrder.java

@@ -340,7 +340,9 @@ public class LiveOrder extends BaseEntity {
     private String productName;
     private String productSpec;
     private String productNum;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTimeStart;
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
     private Date createTimeEnd;
 
     private Integer price;

+ 2 - 2
fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java

@@ -104,7 +104,7 @@ public interface LiveOrderMapper {
     @Select("select * from live_order where `status` = 3 AND TIMESTAMPDIFF(HOUR, start_time, NOW()) >= 48  ")
     List<LiveOrder> selectLiveOrderByFinish();
 
-    @Select("select * from live_order where `status` = 1 and extend_order_id is not null ")
+    @Select("select * from live_order where `status` = 1 and extend_order_id is not null and delivery_sn is null ")
     List<LiveOrder> selectUpdateExpress();
 
     @Select("select order_id from live_order where `status` = 2")
@@ -369,7 +369,7 @@ public interface LiveOrderMapper {
     int batchUpdateErpByOrderIds(@Param("maps")ArrayList<Map<String, String>> maps);
 
     @Select({"<script> " +
-            "select o.order_id,o.order_code,o.item_json,o.pay_price,o.status,o.delivery_sn as delivery_id,o.finish_time  from live_order o  " +
+            "select o.order_id ,o.order_code,o.item_json,o.pay_price,o.status,o.delivery_sn as delivery_id,o.finish_time  from live_order o  " +
             "where o.is_del=0 " +
             "<if test = 'maps.status != null and maps.status != \"\"     '> " +
             "and o.status =#{maps.status} " +

+ 2 - 2
fs-service/src/main/java/com/fs/live/mapper/LiveUserFirstEntryMapper.java

@@ -78,8 +78,8 @@ public interface LiveUserFirstEntryMapper {
     LiveUserFirstEntry selectEntityByLiveIdUserId(@Param("liveId") long liveId,@Param("userId") long userId);
 
     @Select("SELECT  " +
-            "  cu.user_name companyUserName,  " +
-            "  count( 1 ) AS invite_num   " +
+            "  cu.nick_name as userName,  " +
+            "  sum( case when company_user_id > 0 then 1 else 0 end ) AS invite_num   " +
             "FROM  " +
             "  live_user_first_entry lufe  " +
             "  LEFT JOIN company_user cu ON lufe.company_user_id = cu.user_id   " +

+ 4 - 0
fs-service/src/main/java/com/fs/live/param/LiveDataParam.java

@@ -91,4 +91,8 @@ public class LiveDataParam {
     private Date endTime;
 
 
+    private Integer pageNum;
+    private Integer pageSize;
+
+
 }

+ 31 - 33
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -275,7 +275,6 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
     @Autowired
     private FsWxExpressTaskMapper fsWxExpressTaskMapper;
 
-
     //ERP 类型到服务的映射
     private Map<Integer, IErpOrderService> erpServiceMap;
     @PostConstruct
@@ -809,12 +808,6 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
 //            liveOrder.setDeliveryStatus(delivers.getStatus());
 //            liveOrder.setDeliveryType(String.valueOf(delivers.getStateEx()));
 //        } else {
-            liveOrder.setDeliveryCode(null);
-            liveOrder.setDeliveryName(null);
-            liveOrder.setDeliverySn(null);
-
-            liveOrder.setDeliveryStatus(null);
-            liveOrder.setDeliveryType(null);
 //        }
         return liveOrder;
     }
@@ -1688,7 +1681,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
             FsExpressScrm express = expressService.selectFsExpressByOmsCode(deliverCode);
             if (express != null) {
                 order.setDeliveryName(deliverName);
-                order.setDeliverySn(express.getCode());
+                order.setDeliveryCode(express.getCode());
             }
             order.setStatus(OrderInfoEnum.STATUS_2.getValue());
             order.setDeliverySn(deliveryId);
@@ -1699,13 +1692,13 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                     OrderLogEnum.DELIVERY_GOODS.getDesc());
             //订阅物流回调
             String lastFourNumber = "";
-            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliveryCode().equals(ShipperCodeEnum.ZTO.getValue())) {
                 lastFourNumber = order.getUserPhone();
                 if (lastFourNumber.length() == 11) {
                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
                 }
             }
-            expressService.subscribeEspress(order.getOrderCode(), order.getDeliverySn(), order.getDeliverySn(), lastFourNumber);
+            expressService.subscribeEspress(order.getOrderCode(), order.getDeliveryCode(), order.getDeliverySn(), lastFourNumber);
 
             TemplateBean templateBean = TemplateBean.builder()
                     .orderId(order.getOrderId().toString())
@@ -2058,32 +2051,37 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
 
     @Override
     public R getExpressMulti(LiveOrder order) {
-//        //顺丰轨迹查询处理
-//        String lastFourNumber = PhoneUtils.getLastFourNum(order.getUserPhone());
-//        // 获取该订单关联的物流信息
-//        List<FsStoreDelivers> fsStoreDelivers = fsStoreDeliversMapper.findByOrderIdWithType(order.getOrderId(),1);
-//        if(CollectionUtils.isEmpty(fsStoreDelivers)){
-//            return R.ok("当前订单号暂无物流信息");
-//        }
-//
-//        List<ExpressInfoDTO> result = new ArrayList<>();
-//        for (FsStoreDelivers fsStoreDeliver : fsStoreDelivers) {
-//            ExpressInfoDTO dto=expressService.getExpressInfo(order.getOrderCode(),
-//                    fsStoreDeliver.getDeliverSn(),
-//                    fsStoreDeliver.getDeliverId(),
-//                    lastFourNumber);
-//            result.add(dto);
-//        }
+        //顺丰轨迹查询处理
+        String lastFourNumber = getLastFourNum(order.getUserPhone());
 
-//        return R.ok().put("data",result);
-        return R.ok();
+
+        ExpressInfoDTO expressInfoDTO =null;
+        if (StringUtils.isNotEmpty(order.getDeliverySn())) {
+            if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
+                lastFourNumber = order.getUserPhone();
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+            expressInfoDTO = expressService.getExpressInfo(order.getOrderCode(), order.getDeliveryCode(), order.getDeliverySn(), lastFourNumber);
+        }
+        return R.ok().put("data", expressInfoDTO);
+    }
+
+    public static String getLastFourNum(String phone) {
+
+        String lastFourNumber = phone;
+        if (lastFourNumber.length() == 11) {
+            lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+        }
+        return lastFourNumber;
     }
 
     @Override
     public R getExpress(LiveOrder order) {
         //顺丰轨迹查询处理
         String lastFourNumber = "";
-        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue())) {
+        if (order.getDeliverySn().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliverySn().equals(ShipperCodeEnum.ZTO.getValue())) {
             lastFourNumber = order.getUserPhone();
             if (lastFourNumber.length() == 11) {
                 lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -2576,7 +2574,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
     public R syncExpress(Long id) {
         LiveOrder order = baseMapper.selectLiveOrderByOrderId(String.valueOf(id));
         String lastFourNumber = "";
-        if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+        if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliveryCode().equals(ShipperCodeEnum.ZTO.getValue())) {
             lastFourNumber = order.getUserPhone();
             if (lastFourNumber.length() == 11) {
                 lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -2592,7 +2590,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         }
         if("0".equals(dto.getStateEx())&&"0".equals(dto.getState())){
             lastFourNumber = "19923690275";
-            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue()) || order.getDeliveryCode().equals(ShipperCodeEnum.ZTO.getValue())) {
                 lastFourNumber = order.getUserPhone();
                 if (lastFourNumber.length() == 11) {
                     lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -2655,7 +2653,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 baseMapper.updateLiveOrder(updateEntity);
                 // 订阅物流回调
                 String lastFourNumber = "";
-                if (fsExpress.getCode().equals(ShipperCodeEnum.SF.getValue())) {
+                if (fsExpress.getCode().equals(ShipperCodeEnum.SF.getValue())  || fsExpress.getCode().equals(ShipperCodeEnum.ZTO.getValue())) {
                     lastFourNumber = existOrder.getUserPhone();
                     if (lastFourNumber.length() == 11) {
                         lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
@@ -3289,7 +3287,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         liveOrder.setPayType("1");
         liveOrder.setTotalPrice(payPrice);
         liveOrder.setPayMoney(BigDecimal.ZERO);
-        liveOrder.setPayPrice(liveOrder.getTotalPrice().subtract(liveOrder.getDiscountMoney()));
+        liveOrder.setPayPrice(payPrice);
         try {
             if (baseMapper.insertLiveOrder(liveOrder) > 0) {
                 LiveOrderItemDTO dto=new LiveOrderItemDTO();

+ 1 - 0
fs-service/src/main/java/com/fs/live/vo/FsMyLiveOrderListQueryVO.java

@@ -24,6 +24,7 @@ public class FsMyLiveOrderListQueryVO implements Serializable
 
     /** 订单ID */
     private Long id;
+    private Long orderId;
 
     /** 订单号 */
     private String orderCode;

+ 1 - 0
fs-service/src/main/java/com/fs/live/vo/LiveDataListVo.java

@@ -78,3 +78,4 @@ public class LiveDataListVo {
 
 
 
+

+ 1 - 0
fs-service/src/main/java/com/fs/live/vo/LiveDataStatisticsVo.java

@@ -59,3 +59,4 @@ public class LiveDataStatisticsVo {
 
 
 
+

+ 6 - 4
fs-service/src/main/java/com/fs/live/vo/LiveOrderVoZm.java

@@ -123,6 +123,10 @@ public class LiveOrderVoZm{
     @Excel(name = "结算价格")
     private BigDecimal fPrice;
 
+    /** 支付金额 */
+    @Excel(name = "支付金额")
+    private BigDecimal payMoney;
+
     /** 详细地址 */
     @Excel(name = "收货地址")
     private String userAddress;
@@ -165,9 +169,7 @@ public class LiveOrderVoZm{
 //    @Excel(name = "实际支付金额")
     private BigDecimal payPrice;
 
-    /** 支付金额 */
-//    @Excel(name = "支付金额")
-    private BigDecimal payMoney;
+
 
     /** 支付状态 待支付 1已支付 */
 //    @Excel(name = "支付状态 待支付 1已支付")
@@ -189,7 +191,7 @@ public class LiveOrderVoZm{
     private String payType;
 
     /** 订单状态(-1 : 申请退款 -2 : 退货成功 0:已取消 1:待支付 2:待发货;3:待收货;4:待评价;5:已完成) */
-    @Excel(name = "订单状态",dictType="sys_order_status")
+    @Excel(name = "订单状态",dictType="sys_live_order_status")
     private Integer status;
 
     /** 对应供应商 */

+ 10 - 11
fs-service/src/main/java/com/fs/wx/order/service/impl/LiveExpressToWxService.java

@@ -1,10 +1,12 @@
 package com.fs.wx.order.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.fs.his.domain.FsStoreOrder;
 import com.fs.his.domain.FsStorePayment;
+import com.fs.his.domain.FsStoreProduct;
 import com.fs.his.mapper.FsStoreOrderMapper;
 import com.fs.his.mapper.FsStorePaymentMapper;
 import com.fs.live.domain.LiveOrder;
@@ -40,8 +42,8 @@ public class LiveExpressToWxService extends ExpressToWxService {
         if(ObjectUtil.isNull(liveOrder)) {
             throw new IllegalArgumentException(String.format("该订单 %s 未找到!",getOrderCode()));
         }
-        LiveOrderPayment fsStorePayments = liveOrderPaymentMapper.selectLiveOrderLatestPayByOrderId(liveOrder.getOrderId());
-        if(fsStorePayments == null){
+        this.liveOrderPayment = liveOrderPaymentMapper.selectLiveOrderLatestPayByOrderId(liveOrder.getOrderId());
+        if(ObjectUtil.isNull(liveOrderPayment)){
             throw new IllegalArgumentException(String.format("该订单 %s 未找到对应支付记录!", getOrderCode()));
         }
     }
@@ -92,15 +94,12 @@ public class LiveExpressToWxService extends ExpressToWxService {
 //            JSONObject jsonObject = JSON.parseObject(packageJson);
 //            title = new StringBuilder(jsonObject.getString("title"));
 //        } else {
-            String itemJson = order.getItemJson();
-            com.alibaba.fastjson.JSONArray arrays = JSON.parseArray(itemJson);
-            for(int i=0;i<arrays.size();i++){
-                JSONObject jsonObject = arrays.getJSONObject(i);
-                String jsonInfo = jsonObject.getString("jsonInfo");
-                JSONObject jsonObject1 = JSON.parseObject(jsonInfo);
-                String productName = jsonObject1.getString("productName");
-                title.append(productName).append("\n");
-            }
+
+            FsStoreProduct product = JSONUtil.toBean(order.getItemJson(), FsStoreProduct.class);
+
+            String productName = product.getProductName();
+            title.append(productName).append("\n");
+
 //        }
         return title.toString();
     }

+ 19 - 0
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -43,6 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="isNeedRegisterMember"    column="is_need_register_member"    />
         <result property="isAllowedAllRegister"    column="is_allowed_all_register"    />
         <result property="doctorId"    column="doctor_id"    />
+        <result property="bindCompanyUserId"    column="bind_company_user_id"    />
         <association property="dept"    column="dept_id" javaType="CompanyDept" resultMap="deptResult" />
         <collection  property="roles"   javaType="java.util.List"        resultMap="RoleResult" />
     </resultMap>
@@ -712,4 +713,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </foreach>
     </select>
 
+    <!-- 批量更新公司用户的绑定销售ID -->
+    <update id="batchUpdateBindCompanyUserId">
+        update fs_user
+        set bind_company_user_id = #{bindCompanyUserId}
+        where user_id in
+        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </update>
+
+    <!-- 根据销售ID查询绑定的fs_user用户列表 -->
+    <select id="selectBoundFsUsersByCompanyUserId" resultType="com.fs.hisStore.domain.FsUserScrm">
+        SELECT *
+        FROM fs_user
+        WHERE bind_company_user_id = #{companyUserId}
+        AND is_del = 0
+    </select>
+
 </mapper>

+ 3 - 0
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -2409,6 +2409,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND log.create_time &lt;= #{endTime}
         </if>
     </select>
+    <select id="selectFsUserListByPhone" resultType="com.fs.his.domain.FsUser">
+        select * from fs_user where phone=#{phone}
+    </select>
 
 
 </mapper>

+ 8 - 1
fs-service/src/main/resources/mapper/hisStore/FsUserScrmMapper.xml

@@ -70,10 +70,11 @@
         <result property="rank"    column="rank"    />
         <result property="react"    column="react"    />
         <result property="orderCount"    column="order_count"    />
+        <result property="bindCompanyUserId"    column="bind_company_user_id"    />
     </resultMap>
 
     <sql id="selectFsUserVo">
-        select user_id, username, nick_name, avatar, phone, integral, status, `level`, spread_user_id, spread_time, user_type, is_promoter, pay_count, spread_count, addres, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, nickname, create_time, update_time, last_ip, now_money, brokerage_price, balance, sign_num, integral_status, is_buy, password, real_name, birthday, id_card, jpush_id, is_vip, vip_start_date, vip_end_date, vip_level, vip_status, sex, store_open_id, is_official_account_auth, is_push, is_individuation_push, is_weixin_auth, company_id, company_user_id, register_date, register_code, test, login_device, source, is_add_qw, qw_user_id, is_show, parent_id, course_ma_open_id, history_app, qw_ext_id, `rank`, react,order_count from fs_user
+        select user_id, username, nick_name, avatar, phone, integral, status, `level`, spread_user_id, spread_time, user_type, is_promoter, pay_count, spread_count, addres, tui_user_id, tui_time, tui_user_count, ma_open_id, mp_open_id, union_id, is_del, user_code, remark, nickname, create_time, update_time, last_ip, now_money, brokerage_price, balance, sign_num, integral_status, is_buy, password, real_name, birthday, id_card, jpush_id, is_vip, vip_start_date, vip_end_date, vip_level, vip_status, sex, store_open_id, is_official_account_auth, is_push, is_individuation_push, is_weixin_auth, company_id, company_user_id, register_date, register_code, test, login_device, source, is_add_qw, qw_user_id, is_show, parent_id, course_ma_open_id, history_app, qw_ext_id, `rank`, react,order_count,bind_company_user_id from fs_user
     </sql>
 
     <select id="selectFsUserList" parameterType="FsUserScrm" resultMap="FsUserResult">
@@ -2024,4 +2025,10 @@
         </if>
     </select>
 
+    <!-- 根据手机号码精确查询用户列表(完全匹配) -->
+    <select id="selectFsUserListByPhoneExact" parameterType="String" resultMap="FsUserResult">
+        <include refid="selectFsUserVo"/>
+        where phone = #{phone}
+    </select>
+
 </mapper>

+ 51 - 51
fs-service/src/main/resources/mapper/live/LiveDataMapper.xml

@@ -283,58 +283,59 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <!-- 查询直播间统计数据 -->
     <select id="selectLiveDataStatistics" resultType="com.fs.live.vo.LiveDataStatisticsVo">
         SELECT
-            COUNT(DISTINCT lwu.user_id) AS totalViewers,
-            COUNT(DISTINCT CASE WHEN l.live_type = 1 THEN lwu.user_id END) AS liveViewers,
-            COUNT(DISTINCT CASE WHEN l.live_type = 3 THEN lwu.user_id END) AS playbackViewers,
-            COALESCE(AVG(CASE WHEN l.live_type = 1 THEN lwu.online_seconds END), 0) AS liveAvgDuration,
-            COALESCE(AVG(CASE WHEN l.live_type = 3 THEN lwu.online_seconds END), 0) AS playbackAvgDuration,
-            COUNT(DISTINCT CASE 
-                WHEN lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0 
-                THEN lwu.user_id 
+            COUNT( lwu.user_id) AS totalViewers,
+            COUNT( CASE WHEN lwu.live_flag = 1 and lwu.replay_flag = 0 THEN lwu.user_id END) AS liveViewers,
+            COUNT( CASE WHEN lwu.live_flag = 0 and lwu.replay_flag = 1 THEN lwu.user_id END) AS playbackViewers,
+            COALESCE(AVG(CASE WHEN lwu.live_flag = 1 and lwu.replay_flag = 0 THEN lwu.online_seconds END), 0) AS liveAvgDuration,
+            COALESCE(AVG(CASE WHEN lwu.live_flag = 0 and lwu.replay_flag = 1 THEN lwu.online_seconds END), 0) AS playbackAvgDuration,
+            COUNT( CASE
+                WHEN lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0
+                THEN lwu.user_id
             END) AS totalCompletedCourses,
-            COUNT(DISTINCT CASE 
-                WHEN l.live_type = 1 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0 
-                THEN lwu.user_id 
+            COUNT( CASE
+                WHEN lwu.live_flag = 1 and lwu.replay_flag = 0 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0
+                THEN lwu.user_id
             END) AS liveCompletedCourses,
-            COUNT(DISTINCT CASE 
-                WHEN l.live_type = 3 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0 
-                THEN lwu.user_id 
+            COUNT( CASE
+                WHEN lwu.live_flag = 0 and lwu.replay_flag = 1 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0
+                THEN lwu.user_id
             END) AS playbackCompletedCourses,
             COALESCE((
-                SELECT SUM(pay_price) 
-                FROM live_order 
-                WHERE live_id IN 
+                SELECT SUM( pay_price)
+                FROM live_order
+                WHERE live_id IN
                 <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
                     #{liveId}
                 </foreach>
                 AND is_pay = '1'
             ), 0) AS gmv,
             COALESCE((
-                SELECT COUNT(DISTINCT user_id) 
-                FROM live_order 
-                WHERE live_id IN 
-                <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
-                    #{liveId}
-                </foreach>
-                AND is_pay = '1'
+                select sum(acs.paid) from (SELECT COUNT(DISTINCT user_id) as paid
+                    FROM live_order
+                    WHERE live_id IN
+                    <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
+                        #{liveId}
+                    </foreach>
+                    AND is_pay = '1'
+                    group by live_id
+                ) acs
             ), 0) AS paidUsers,
             COALESCE((
-                SELECT COUNT(DISTINCT order_id) 
-                FROM live_order 
-                WHERE live_id IN 
+                SELECT COUNT(DISTINCT order_id)
+                FROM live_order
+                WHERE live_id IN
                 <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
                     #{liveId}
                 </foreach>
                 AND is_pay = '1'
             ), 0) AS paidOrders,
             COALESCE((
-                SELECT COUNT(DISTINCT order_id) 
-                FROM live_order 
-                WHERE live_id IN 
+                SELECT COUNT(DISTINCT order_id)
+                FROM live_order
+                WHERE live_id IN
                 <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
                     #{liveId}
                 </foreach>
-                AND is_pay = '1'
             ), 0) AS salesCount
         FROM live l
         LEFT JOIN live_watch_user lwu ON l.live_id = lwu.live_id
@@ -359,22 +360,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             l.status AS status,
             l.start_time AS startTime,
             l.finish_time AS finishTime,
-            COUNT(DISTINCT lwu.user_id) AS totalViewers,
-            COUNT(DISTINCT CASE WHEN l.live_type = 1 THEN lwu.user_id END) AS liveViewers,
-            COUNT(DISTINCT CASE WHEN l.live_type = 3 THEN lwu.user_id END) AS playbackViewers,
-            COALESCE(AVG(CASE WHEN l.live_type = 1 THEN lwu.online_seconds END), 0) AS liveAvgDuration,
-            COALESCE(AVG(CASE WHEN l.live_type = 3 THEN lwu.online_seconds END), 0) AS playbackAvgDuration,
-            COUNT(DISTINCT CASE 
-                WHEN lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0 
-                THEN lwu.user_id 
+            COUNT(1) AS totalViewers,
+            COUNT(CASE WHEN lwu.live_flag = 1 and lwu.replay_flag = 0 THEN lwu.user_id END) AS liveViewers,
+            COUNT(CASE WHEN lwu.live_flag = 0 and lwu.replay_flag = 1 THEN lwu.user_id END) AS playbackViewers,
+            COALESCE(AVG(CASE WHEN lwu.live_flag = 1 and lwu.replay_flag = 0 THEN lwu.online_seconds END), 0) AS liveAvgDuration,
+            COALESCE(AVG(CASE WHEN lwu.live_flag = 0 and lwu.replay_flag = 1 THEN lwu.online_seconds END), 0) AS playbackAvgDuration,
+            COUNT(CASE
+                WHEN lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0
+                THEN lwu.user_id
             END) AS totalCompletedCourses,
-            COUNT(DISTINCT CASE 
-                WHEN l.live_type = 1 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0 
-                THEN lwu.user_id 
+            COUNT(CASE
+                WHEN lwu.live_flag = 1  and lwu.replay_flag = 0 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0
+                THEN lwu.user_id
             END) AS liveCompletedCourses,
-            COUNT(DISTINCT CASE 
-                WHEN l.live_type = 3 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0 
-                THEN lwu.user_id 
+            COUNT(CASE
+                WHEN lwu.live_flag = 0  and lwu.replay_flag = 1 AND lwu.online_seconds >= COALESCE(video_duration.total_duration, 0) AND video_duration.total_duration > 0
+                THEN lwu.user_id
             END) AS playbackCompletedCourses,
             COALESCE(order_stats.gmv, 0) AS gmv,
             COALESCE(order_stats.paidUsers, 0) AS paidUsers,
@@ -389,21 +390,20 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             GROUP BY live_id
         ) video_duration ON l.live_id = video_duration.live_id
         LEFT JOIN (
-            SELECT 
+            SELECT
                 live_id,
-                SUM(pay_price) AS gmv,
-                COUNT(DISTINCT user_id) AS paidUsers,
-                COUNT(DISTINCT order_id) AS paidOrders,
+                SUM( case when is_pay = '1' then pay_price else 0 end) AS gmv,
+                COUNT(distinct CASE WHEN is_pay = '1' THEN user_id END) AS paidUsers,
+                sum(CASE WHEN is_pay = '1' THEN 1 else 0 END) AS paidOrders,
                 COUNT(DISTINCT order_id) AS salesCount
             FROM live_order
-            WHERE is_pay = '1'
             GROUP BY live_id
         ) order_stats ON l.live_id = order_stats.live_id
         WHERE l.live_id IN
         <foreach collection="liveIds" item="liveId" open="(" separator="," close=")">
             #{liveId}
         </foreach>
-        GROUP BY l.live_id, l.live_name, l.live_type, l.status, l.start_time, l.finish_time, 
+        GROUP BY l.live_id, l.live_name, l.live_type, l.status, l.start_time, l.finish_time,
                  order_stats.gmv, order_stats.paidUsers, order_stats.paidOrders, order_stats.salesCount
         ORDER BY l.start_time DESC
     </select>

+ 4 - 0
fs-service/src/main/resources/mapper/live/LiveMsgMapper.xml

@@ -65,6 +65,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">update_by,</if>
             <if test="updateTime != null">update_time,</if>
             <if test="remark != null">remark,</if>
+            <if test="liveFlag != null">live_flag,</if>
+            <if test="replayFlag != null">replay_flag,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="liveId != null">#{liveId},</if>
@@ -76,6 +78,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="updateBy != null">#{updateBy},</if>
             <if test="updateTime != null">#{updateTime},</if>
             <if test="remark != null">#{remark},</if>
+            <if test="liveFlag != null">#{liveFlag},</if>
+            <if test="replayFlag != null">#{replayFlag},</if>
          </trim>
     </insert>
 

+ 5 - 4
fs-service/src/main/resources/mapper/live/LiveOrderMapper.xml

@@ -949,6 +949,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             o.is_pay,
             o.pay_time,
             o.pay_type,
+            o.pay_money,
             o.create_time,
             o.update_time,
             o.status,
@@ -1055,16 +1056,16 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userAddress != null and userAddress != ''">
                 AND o.user_address LIKE CONCAT('%', #{userAddress}, '%')
             </if>
-            <if test="createTimeStart != null and createTimeStart != ''">
+            <if test="createTimeStart != null ">
                 AND o.create_time &gt;= #{createTimeStart}
             </if>
-            <if test="createTimeEnd != null and createTimeEnd != ''">
+            <if test="createTimeEnd != null ">
                 AND o.create_time &lt;= #{createTimeEnd}
             </if>
-            <if test="payStartTime != null and payStartTime != ''">
+            <if test="payStartTime != null ">
                 AND o.pay_time &gt;= #{payStartTime}
             </if>
-            <if test="payEndTime != null and payEndTime != ''">
+            <if test="payEndTime != null ">
                 AND o.pay_time &lt;= #{payEndTime}
             </if>
             <if test="userPhone != null and userPhone != ''">

+ 1 - 1
fs-service/src/main/resources/mapper/sop/QwSopTempMapper.xml

@@ -68,7 +68,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         select * from qw_sop_temp_temp
     </select>
     <select id="selectListByIds" resultType="com.fs.sop.domain.QwSopTemp">
-        select * from qw_sop_temp  where send_type = 11 and id in
+        select * from qw_sop_temp  where id in
         <foreach item="id" collection="ids" open="(" separator="," close=")">
             #{id}
         </foreach>

+ 144 - 22
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -1,13 +1,16 @@
 package com.fs.app.controller;
 
 
+import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DateTime;
 import com.fs.app.annotation.Login;
 import com.fs.app.param.*;
 import com.fs.app.utils.WxUtil;
+import com.fs.common.VerifyCodeUtil;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.service.ISmsService;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.core.config.WxOpenProperties;
 import com.fs.his.config.FsSysConfig;
@@ -35,13 +38,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDateTime;
-import java.util.Calendar;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.*;
 import java.util.concurrent.TimeUnit;
 
 import static com.fs.his.utils.PhoneUtil.encryptPhone;
+import static com.fs.his.utils.PhoneUtil.encryptPhoneOldKey;
 
 @Api("app登录接口")
 @RestController
@@ -60,6 +61,9 @@ public class AppLoginController extends AppBaseController{
 
     @Autowired
     private RedisCache redisCache;
+
+    @Autowired
+    private ISmsService smsService;
     @ApiOperation("注册app用户")
     @PostMapping("/register")
     @RepeatSubmit
@@ -293,44 +297,142 @@ public class AppLoginController extends AppBaseController{
         return R.ok(map);
     }
 
+//    private R handleLoginType1(FsUserLoginParam param) {
+//        if (StringUtils.isEmpty(param.getPhone()) || StringUtils.isEmpty(param.getPassword())) {
+//            return R.error("账号或密码不能为空");
+//        }
+//
+//        FsUser user = findUserByPhone(param.getPhone());
+//
+//        // 校验用户是否存在及账号状态
+//        if (user == null) {
+//            return R.error("账号不存在,请先注册账号");
+//        } else if (user.getStatus() == 0) {
+//            return R.error("账号已停用");
+//        } else if (StringUtils.isEmpty(user.getPassword())) {
+//            return R.error("账号不存在,请先注册账号");
+//        }
+//
+//        if (StringUtils.isNotEmpty(param.getJpushId())) {
+//            updateExistingUserJpushId(user, param.getJpushId());
+//        }
+//
+//        if (!Md5Utils.hash(param.getPassword()).equals(user.getPassword())) {
+//            return R.error("密码不正确");
+//        }
+//
+//        return generateTokenAndReturn(user);
+//
+//    }
+
     private R handleLoginType1(FsUserLoginParam param) {
         if (StringUtils.isEmpty(param.getPhone()) || StringUtils.isEmpty(param.getPassword())) {
             return R.error("账号或密码不能为空");
         }
 
-        FsUser user = findUserByPhone(param.getPhone());
-
-        // 校验用户是否存在及账号状态
-        if (user == null) {
-            return R.error("账号不存在,请先注册账号");
-        } else if (user.getStatus() == 0) {
-            return R.error("账号已停用");
-        } else if (StringUtils.isEmpty(user.getPassword())) {
+        FsUser user = null;
+        List<FsUser> usersByPhone = findUsersByPhone(param.getPhone());
+        if (CollectionUtil.isEmpty(usersByPhone)){
             return R.error("账号不存在,请先注册账号");
         }
+        //当前手机号只绑定了单个微信,直接登录
+        if (usersByPhone.size()==1){
+            user = usersByPhone.get(0);
+            // 校验用户是否存在及账号状态
+            if (user == null) {
+                return R.error("账号不存在,请先注册账号");
+            } else if (user.getStatus() == 0&&StringUtils.isNotEmpty(param.getSource())&&!param.getSource().equals("iOS")) {
+                return R.error("账号已停用");
+            } else if (StringUtils.isEmpty(user.getPassword())) {
+                return R.error("账号不存在,请先注册账号");
+            }
 
-        if (StringUtils.isNotEmpty(param.getJpushId())) {
-            updateExistingUserJpushId(user, param.getJpushId());
-        }
+            if (StringUtils.isNotEmpty(param.getJpushId())) {
+                updateExistingUserJpushId(user, param.getJpushId());
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(user);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
+            }
 
-        if (!Md5Utils.hash(param.getPassword()).equals(user.getPassword())) {
-            return R.error("密码不正确");
+            if (!Md5Utils.hash(param.getPassword()).equals(user.getPassword())) {
+                return R.error("密码不正确");
+            }
+            //登录成功以后写入达人表
+            //fsUserTalentService.addFsUserTalent(fsUser.getUserId());
+            return generateTokenAndReturn(user);
+        }else {
+            return R.ok().put("users",usersByPhone);
         }
 
-        return generateTokenAndReturn(user);
 
     }
 
+    private List<FsUser> findUsersByPhone(String phone) {
+        // 先根据加密手机号查询用户
+        String jiami = (encryptPhone(phone));
+        List<FsUser> fsUsers = userMapper.selectFsUsersByPhoneLimitOne(jiami);
+        if (CollectionUtil.isEmpty(fsUsers)) {
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(encryptPhoneOldKey(phone));
+        }
+        // 如果没有找到用户,再根据手机号查询
+        if (CollectionUtil.isEmpty(fsUsers)) {
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(phone);
+
+        }
+        return fsUsers;
+    }
+
+//    private R handleLoginType3(FsUserLoginParam param) {
+//        if (StringUtils.isEmpty(param.getPhone())) {
+//            return R.error("获取手机号失败");
+//        }
+//        // 根据手机号查询用户
+//        FsUser user = findUserByPhone(param.getPhone());
+//        if (user == null) {
+//            createNewUser(param);
+//            return R.ok().put("isNew",true).put("phone",encryptPhone(param.getPhone()));
+//        } else {
+//            if (user.getUnionId()==null){
+//                if (user.getPhone().length()<=11){
+//                    FsUser fsUser = new FsUser();
+//                    fsUser.setUserId(user.getUserId());
+//                    fsUser.setPhone(encryptPhone(param.getPhone()));
+//                    userMapper.updateFsUser(fsUser);
+//                    logger.info("zyp \n【手机加密】:{}",encryptPhone(param.getPhone()));
+//                }
+//                return R.ok().put("isNew",true).put("phone",encryptPhone(param.getPhone()));
+//            }
+//            if (StringUtils.isNotEmpty(param.getJpushId())) {
+//                updateExistingUserJpushId(user, param.getJpushId());
+//            }
+//        }
+//        return generateTokenAndReturn(user);
+//    }
+
     private R handleLoginType3(FsUserLoginParam param) {
         if (StringUtils.isEmpty(param.getPhone())) {
             return R.error("获取手机号失败");
         }
         // 根据手机号查询用户
-        FsUser user = findUserByPhone(param.getPhone());
-        if (user == null) {
-            createNewUser(param);
+        FsUser user = null;
+        List<FsUser> usersByPhone = findUsersByPhone(param.getPhone());
+        if (CollectionUtil.isEmpty(usersByPhone)){
+            FsUser newUser = createNewUser(param);
+            if (StringUtils.isNotEmpty(newUser.getJpushId())) {
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(newUser);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
+            }
             return R.ok().put("isNew",true).put("phone",encryptPhone(param.getPhone()));
-        } else {
+        }
+        if (usersByPhone.size()==1){
+            user = usersByPhone.get(0);
             if (user.getUnionId()==null){
                 if (user.getPhone().length()<=11){
                     FsUser fsUser = new FsUser();
@@ -343,7 +445,27 @@ public class AppLoginController extends AppBaseController{
             }
             if (StringUtils.isNotEmpty(param.getJpushId())) {
                 updateExistingUserJpushId(user, param.getJpushId());
+//                try {
+//                    //发送注册优惠券
+//                    fsUserCouponService.sendRegisterCoupon(user);
+//                } catch (Exception e) {
+//                    logger.error("发送注册优惠券失败:{}",e.getMessage());
+//                }
             }
+        }else {
+            return R.ok().put("users",usersByPhone);
+        }
+        return generateTokenAndReturn(user);
+    }
+
+    @PostMapping("/loginByUserId")
+    public R loginByUserId(@RequestBody FsUserLoginByWeChatParam param){
+        FsUser user = userService.selectFsUserByUserId(param.getUserId());
+        if (user == null){
+            return R.error("用户不存在");
+        }
+        if (StringUtils.isNotEmpty(param.getJpushId())){
+            updateExistingUserJpushId(user, param.getJpushId());
         }
         return generateTokenAndReturn(user);
     }

+ 2 - 2
fs-user-app/src/main/java/com/fs/app/controller/UserController.java

@@ -201,7 +201,7 @@ public class UserController extends  AppBaseController {
     public R editUser(@RequestBody @Valid FsUserEditParam param, HttpServletRequest request){
         param.setUserId(Long.parseLong(getUserId()));
         log.info("【修改用户头像昵称】:{}",param);
-        if (param.getNickname().length()>50){
+        if (param.getNickName().length()>50){
             return R.error("请授权正确的昵称!");
         }
         if (StringUtils.isEmpty(param.getAvatar())){
@@ -211,7 +211,7 @@ public class UserController extends  AppBaseController {
         user.setUserId(Long.parseLong(getUserId()));
         user.setAvatar(param.getAvatar());
         // 前端传了nickname 和 nickName 但是只有nickName是正确的
-        user.setNickName(StringUtils.isNotEmpty(param.getNickName())?param.getNickName():param.getNickname());
+        user.setNickName(StringUtils.isNotEmpty(param.getNickName())?param.getNickName():param.getNickName());
         if (ObjectUtils.isNotEmpty(param.getIsWeixinAuth())){
             user.setIsWeixinAuth(param.getIsWeixinAuth());
         }

+ 15 - 0
fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java

@@ -1159,6 +1159,21 @@ public class LiveOrderController extends AppBaseController
         return orderService.getExpress(order);
     }
 
+    @Login
+    @ApiOperation("物流查询多运单号")
+    @PostMapping("/getExpressMulti")
+    public R getExpressMulti( @Validated @RequestBody FsStoreOrderExpressParam param){
+        log.info("物流查询多运单号 请求参数: {}", JSON.toJSONString(param));
+        LiveOrder order=orderService.selectLiveOrderByOrderId(String.valueOf(param.getOrderId()));
+        if (ObjectUtil.isNull(order)) {
+            throw new CustomException("订单不存在");
+        }
+//        if (order.getStatus() < 2) {
+//            throw new CustomException("未发货订单不能查询");
+//        }
+        return orderService.getExpressMulti(order);
+    }
+
 
 
     @Login

+ 21 - 21
fs-user-app/src/main/java/com/fs/app/param/FsUserEditParam.java

@@ -12,13 +12,13 @@ import java.io.Serializable;
 
 @JsonIgnoreProperties(ignoreUnknown = true)
 public class FsUserEditParam implements Serializable {
-    @NotNull(message = "用户昵称不能为空!")
-    @JsonAlias("nickname")
-    private String nickname;
+//    @NotNull(message = "用户昵称不能为空!")
+//    @JsonAlias("nickname")
+//    private String nickname;
 
     //    @NotBlank(message = "用户头像不能为空!")
     private String avatar;
-
+    @NotNull(message = "用户昵称不能为空!")
     @JsonAlias("nickName")
     private String nickName;
 
@@ -26,13 +26,13 @@ public class FsUserEditParam implements Serializable {
     private Integer isWeixinAuth;
 
 
-    public @NotNull(message = "用户昵称不能为空!") String getNickname() {
-        return nickname;
-    }
-
-    public void setNickname(@NotNull(message = "用户昵称不能为空!") String nickname) {
-        this.nickname = nickname;
-    }
+//    public @NotNull(message = "用户昵称不能为空!") String getNickname() {
+//        return nickname;
+//    }
+//
+//    public void setNickname(@NotNull(message = "用户昵称不能为空!") String nickname) {
+//        this.nickname = nickname;
+//    }
 
     public String getAvatar() {
         return avatar;
@@ -66,14 +66,14 @@ public class FsUserEditParam implements Serializable {
         this.isWeixinAuth = isWeixinAuth;
     }
 
-    @Override
-    public String toString() {
-        return "FsUserEditParam{" +
-                "nickname='" + nickname + '\'' +
-                ", avatar='" + avatar + '\'' +
-                ", nickName='" + nickName + '\'' +
-                ", userId=" + userId +
-                ", isWeixinAuth=" + isWeixinAuth +
-                '}';
-    }
+//    @Override
+//    public String toString() {
+//        return "FsUserEditParam{" +
+//                "nickname='" + nickname + '\'' +
+//                ", avatar='" + avatar + '\'' +
+//                ", nickName='" + nickName + '\'' +
+//                ", userId=" + userId +
+//                ", isWeixinAuth=" + isWeixinAuth +
+//                '}';
+//    }
 }

+ 1 - 0
fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByWeChatParam.java

@@ -16,4 +16,5 @@ public class FsUserLoginByWeChatParam implements Serializable {
 
     private String source; //app来源
 
+    private Long userId;
 }

+ 1 - 1
fs-user-app/src/main/resources/application.yml

@@ -13,4 +13,4 @@ spring:
 #    active: druid-sxjz
 #    active: druid-qdtst
 #    active: druid-yzt
-    active: dev
+    active: druid-bjzm-test