Преглед изворни кода

Merge branch 'refs/heads/master' into 企微聊天

# Conflicts:
#	fs-service/src/main/resources/application-config-dev.yml
ct пре 2 недеља
родитељ
комит
707b04adf4
93 измењених фајлова са 1387 додато и 324 уклоњено
  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. 1 1
      fs-company-app/src/main/resources/application.yml
  7. 64 0
      fs-company/src/main/java/com/fs/company/controller/company/CompanyUserController.java
  8. 2 0
      fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java
  9. 2 1
      fs-company/src/main/java/com/fs/company/controller/fastGpt/FastGptRoleController.java
  10. 2 1
      fs-company/src/main/java/com/fs/company/controller/live/LiveDataController.java
  11. 16 37
      fs-company/src/main/java/com/fs/company/controller/live/LiveOrderController.java
  12. 1 2
      fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  13. 1 1
      fs-company/src/main/resources/application.yml
  14. 60 0
      fs-doctor-app/src/main/java/com/fs/app/controller/FsUserInformationCollectionController.java
  15. 8 0
      fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java
  16. 22 3
      fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java
  17. 52 21
      fs-live-app/src/main/java/com/fs/live/task/Task.java
  18. 5 15
      fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java
  19. 1 1
      fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java
  20. 25 0
      fs-service/src/main/java/com/fs/common/VerifyCodeUtil.java
  21. 2 0
      fs-service/src/main/java/com/fs/common/service/ISmsService.java
  22. 82 0
      fs-service/src/main/java/com/fs/common/service/impl/SmsServiceImpl.java
  23. 3 0
      fs-service/src/main/java/com/fs/company/domain/CompanyUser.java
  24. 15 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyUserMapper.java
  25. 15 0
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  26. 10 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  27. 1 1
      fs-service/src/main/java/com/fs/core/utils/OrderCodeUtils.java
  28. 17 1
      fs-service/src/main/java/com/fs/fastGpt/mapper/FastGptRoleMapper.java
  29. 2 0
      fs-service/src/main/java/com/fs/fastGpt/service/IFastGptRoleService.java
  30. 5 0
      fs-service/src/main/java/com/fs/fastGpt/service/impl/FastGptRoleServiceImpl.java
  31. 10 0
      fs-service/src/main/java/com/fs/his/domain/FsInquiryOrder.java
  32. 1 0
      fs-service/src/main/java/com/fs/his/domain/FsStoreOrder.java
  33. 9 0
      fs-service/src/main/java/com/fs/his/domain/FsUserInformationCollection.java
  34. 103 0
      fs-service/src/main/java/com/fs/his/dto/FsUserInformationCollectionDTO.java
  35. 3 1
      fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java
  36. 7 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserInformationCollectionMapper.java
  37. 4 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  38. 2 0
      fs-service/src/main/java/com/fs/his/param/CollectionInfoConfirmParam.java
  39. 1 0
      fs-service/src/main/java/com/fs/his/param/FsInquiryOrderCreateParam.java
  40. 1 0
      fs-service/src/main/java/com/fs/his/param/FsInquiryOrderListPDParam.java
  41. 2 0
      fs-service/src/main/java/com/fs/his/param/FsPackageOrderCreateParam.java
  42. 2 0
      fs-service/src/main/java/com/fs/his/param/FsUserInformationCollectionParam.java
  43. 16 0
      fs-service/src/main/java/com/fs/his/param/UserInformationDoctorType2Param.java
  44. 11 0
      fs-service/src/main/java/com/fs/his/service/IFsUserInformationCollectionService.java
  45. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  46. 6 0
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java
  47. 17 1
      fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java
  48. 126 24
      fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionServiceImpl.java
  49. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  50. 20 0
      fs-service/src/main/java/com/fs/his/utils/PhoneUtil.java
  51. 10 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsUserScrm.java
  52. 2 1
      fs-service/src/main/java/com/fs/hisStore/enums/ShipperCodeEnum.java
  53. 2 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  54. 7 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsUserScrmMapper.java
  55. 9 6
      fs-service/src/main/java/com/fs/hisStore/service/IFsExpressScrmService.java
  56. 7 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsUserScrmService.java
  57. 64 13
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsExpressScrmServiceImpl.java
  58. 10 9
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  59. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserScrmServiceImpl.java
  60. 2 0
      fs-service/src/main/java/com/fs/im/dto/OpenImMsgDTO.java
  61. 5 0
      fs-service/src/main/java/com/fs/im/service/OpenIMService.java
  62. 52 0
      fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java
  63. 2 0
      fs-service/src/main/java/com/fs/live/domain/LiveOrder.java
  64. 2 2
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  65. 2 2
      fs-service/src/main/java/com/fs/live/mapper/LiveUserFirstEntryMapper.java
  66. 4 0
      fs-service/src/main/java/com/fs/live/param/LiveDataParam.java
  67. 31 33
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  68. 2 0
      fs-service/src/main/java/com/fs/live/vo/FsMyLiveOrderListQueryVO.java
  69. 1 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataListVo.java
  70. 1 0
      fs-service/src/main/java/com/fs/live/vo/LiveDataStatisticsVo.java
  71. 6 4
      fs-service/src/main/java/com/fs/live/vo/LiveOrderVoZm.java
  72. 3 3
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopServiceImpl.java
  73. 10 11
      fs-service/src/main/java/com/fs/wx/order/service/impl/LiveExpressToWxService.java
  74. 2 2
      fs-service/src/main/resources/application-config-dev.yml
  75. 1 1
      fs-service/src/main/resources/application-config-druid-jnsyj.yml
  76. 1 1
      fs-service/src/main/resources/application-dev.yml
  77. 19 0
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  78. 6 1
      fs-service/src/main/resources/mapper/his/FsInquiryOrderMapper.xml
  79. 53 2
      fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml
  80. 3 0
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  81. 8 1
      fs-service/src/main/resources/mapper/hisStore/FsUserScrmMapper.xml
  82. 51 51
      fs-service/src/main/resources/mapper/live/LiveDataMapper.xml
  83. 4 0
      fs-service/src/main/resources/mapper/live/LiveMsgMapper.xml
  84. 9 5
      fs-service/src/main/resources/mapper/live/LiveOrderMapper.xml
  85. 1 1
      fs-service/src/main/resources/mapper/sop/QwSopTempMapper.xml
  86. 144 22
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  87. 19 6
      fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java
  88. 7 0
      fs-user-app/src/main/java/com/fs/app/controller/FsUserInformationCollectionController.java
  89. 2 2
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  90. 15 0
      fs-user-app/src/main/java/com/fs/app/controller/live/LiveOrderController.java
  91. 21 21
      fs-user-app/src/main/java/com/fs/app/param/FsUserEditParam.java
  92. 1 0
      fs-user-app/src/main/java/com/fs/app/param/FsUserLoginByWeChatParam.java
  93. 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; //直播间状态缓存过期时间(秒)
 
 
 }

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

@@ -6,4 +6,4 @@ server:
 spring:
   profiles:
 #    active: druid-fcky-test
-    active: druid-bjzm-test
+    active: druid-jnmy-test

+ 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 - 0
fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java

@@ -278,6 +278,8 @@ public class FsUserCoursePeriodController extends BaseController {
         PageHelper.startPage(param.getPageNum(), param.getPageSize());
         FsUserCoursePeriod period = fsUserCoursePeriodService.selectFsUserCoursePeriodById(param.getPeriodId());
         param.setMaxDate(LocalDate.now().plusDays(period.getMaxViewNum()));
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setCompanyId(loginUser.getCompany().getCompanyId());
         List<FsPeriodCountVO> list = fsUserCoursePeriodDaysService.periodCourseCount(param);
         long count = fsUserCoursePeriodDaysService.periodCourseByCount(param);
         PageInfo<FsPeriodCountVO> pageInfo = new PageInfo<>(list);

+ 2 - 1
fs-company/src/main/java/com/fs/company/controller/fastGpt/FastGptRoleController.java

@@ -47,7 +47,8 @@ public class FastGptRoleController extends BaseController
         startPage();
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         fastGptRole.setCompanyId(loginUser.getCompany().getCompanyId());
-        List<FastGptRoleVO> list = fastGptRoleService.selectFastGptRoleListVO(fastGptRole);
+        //List<FastGptRoleVO> list = fastGptRoleService.selectFastGptRoleListVO(fastGptRole);
+        List<FastGptRoleVO> list = fastGptRoleService.selectFastGptRoleListVONew(fastGptRole);
         for (FastGptRoleVO fastGptRoleVO : list) {
             String reminderWords = fastGptRoleVO.getReminderWords();
             if (reminderWords!=null && reminderWords.length()>110) {

+ 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 - 2
fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -87,7 +87,6 @@ public class FsStoreOrderScrmController extends BaseController
      */
     @PreAuthorize("@ss.hasPermi('store:storeOrder:list')")
     @GetMapping("/list")
-    @DataScope(deptAlias = "cu",userAlias = "cu")
     public TableDataInfo list(FsStoreOrderParam param)
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
@@ -270,7 +269,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-sxjz-test
+    active: druid-bjzm-test
 #    active: druid-yzt
 #    active: druid-myhk
 #    active: druid-sft

+ 60 - 0
fs-doctor-app/src/main/java/com/fs/app/controller/FsUserInformationCollectionController.java

@@ -0,0 +1,60 @@
+package com.fs.app.controller;
+
+import com.fs.common.core.domain.R;
+import com.fs.his.domain.FsUserInformationCollection;
+import com.fs.his.dto.FsUserInformationCollectionDTO;
+import com.fs.his.param.CollectionInfoConfirmParam;
+import com.fs.his.param.UserInformationDoctorType2Param;
+import com.fs.his.service.IFsUserInformationCollectionService;
+import com.fs.his.vo.FsInquiryOrderListPDVO;
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+@RestController
+@RequestMapping("/user/collection")
+public class FsUserInformationCollectionController extends  AppBaseController {
+    @Autowired
+    private IFsUserInformationCollectionService fsUserInformationCollectionService;
+    @GetMapping("/getUserInformation")
+    public R getUserInformation(@RequestParam("id") Long id) {
+        FsUserInformationCollectionDTO fsUserInformationCollection = fsUserInformationCollectionService.selectFsUserInformationCollectionDTOById(id);
+
+
+        return R.ok().put("data", fsUserInformationCollection);
+    }
+    //医生确认
+    @PostMapping("/doctorConfirm")
+    public R doctorConfirm(@RequestBody FsUserInformationCollection collection){
+        return fsUserInformationCollectionService.doctorConfirm(collection);
+    }
+
+    @GetMapping("/getCollectionList")
+    private R getCollectionList(UserInformationDoctorType2Param userInformationDoctorType2Param) {
+
+        PageHelper.startPage(userInformationDoctorType2Param.getPageNum(), userInformationDoctorType2Param.getPageSize());
+        if (userInformationDoctorType2Param.getDoctorType()==2){
+            userInformationDoctorType2Param.setDoctorType2Id(Long.parseLong(getDoctorId()));
+            List<FsUserInformationCollection> fsUserInformationCollections = fsUserInformationCollectionService.selectFsUserInformationCollectionByDoctorType2(userInformationDoctorType2Param);
+            PageInfo<FsUserInformationCollection> listPageInfo=new PageInfo<>(fsUserInformationCollections);
+            return R.ok().put("data",listPageInfo);
+        }else if (userInformationDoctorType2Param.getDoctorType()==1){
+            userInformationDoctorType2Param.setDoctorId(Long.parseLong(getDoctorId()));
+            List<FsUserInformationCollection> fsUserInformationCollections = fsUserInformationCollectionService.selectFsUserInformationCollectionByDoctorType1(userInformationDoctorType2Param);
+            PageInfo<FsUserInformationCollection> listPageInfo=new PageInfo<>(fsUserInformationCollections);
+            return R.ok().put("data",listPageInfo);
+        }
+        return R.ok().put("data",null);
+
+    }
+
+
+    //药师确认
+    @PostMapping("/doctorType2Confirm")
+    public R doctorType2Confirm(@RequestBody FsUserInformationCollection collection){
+        return fsUserInformationCollectionService.doctorType2Confirm(collection);
+    }
+}

+ 8 - 0
fs-doctor-app/src/main/java/com/fs/app/controller/InquiryOrderController.java

@@ -186,6 +186,14 @@ public class InquiryOrderController extends  AppBaseController {
         return inquiryOrderService.receiveOrder(param);
     }
 
+    @Login
+    @ApiOperation("接用户信息采集订单")
+    @PostMapping("/receiveInformationOrder")
+    public R receiveInformationOrder(@Validated @RequestBody FsInquiryOrderReceiveParam param, HttpServletRequest request) throws JsonProcessingException {
+        param.setDoctorId(Long.parseLong(getDoctorId()));
+        return inquiryOrderService.receiveOrder(param);
+    }
+
     @Login
     @ApiOperation("拒单")
     @PostMapping("/refuseOrder")

+ 22 - 3
fs-doctor-app/src/main/java/com/fs/app/controller/PrescribeController.java

@@ -14,7 +14,9 @@ import com.fs.common.utils.StringUtils;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.his.domain.*;
 import com.fs.his.dto.FsInquiryOrderPatientDTO;
+import com.fs.his.dto.FsUserInformationCollectionDTO;
 import com.fs.his.dto.PayloadDTO;
+import com.fs.his.mapper.FsUserInformationCollectionMapper;
 import com.fs.his.param.*;
 import com.fs.his.service.*;
 import com.fs.his.vo.FsDoctorPrescribeListDVO;
@@ -41,6 +43,8 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 
 @Slf4j
@@ -69,6 +73,8 @@ public class PrescribeController extends  AppBaseController {
     private IImService imService;
     @Autowired
     private OpenIMService openIMService;
+    @Autowired
+    private IFsUserInformationCollectionService fsUserInformationCollectionService;
     @Login
     @GetMapping("/getDoctorPrescribeList")
     public R getDoctorPrescribeList(FsDoctorPrescribeListDParam param)
@@ -372,9 +378,22 @@ public class PrescribeController extends  AppBaseController {
         //fsUserCouponService.updateFsUserCouponStatusByLimtType2();
 //        openIMService.checkAndImportFriendByDianBo(Long.parseLong(map.get("sendId")),map.get("userId"),qwExternalContact.getCorpId());
         //OpenImResponseDTO openImResponseDTO = openIMService.sendCourse(Long.parseLong(map.get("userId")), Long.parseLong(map.get("sendId")), "/pages/courseAnswer/index?link=1932017457275338752", "《五仙传医2.0》","https://cos.his.cdwjyyh.com/fs/20241108/a8ed49ae9a264c7483cec5bdcbcf6060.png");
-        log.info("请求地址{}",IMConfig.URL);
-//        log.info("前缀{}",IMConfig.PREFIX);
-        //OpenImResponseDTO openImResponseDTO = openIMService.sendUtil("D" +map.get("sendId"), "U"+map.get("userId").toString(), 110, map.get("payloadDAata").toString(), "", map.get("title").toString(), "", "3135749",ex);
+//        log.info("请求地址{}",IMConfig.URL);
+////        log.info("前缀{}",IMConfig.PREFIX);
+//        OpenImResponseDTO openImResponseDTO = openIMService.sendUserInformation(4050279479l,10086l,1l);
+        CollectionInfoConfirmParam collectionInfoConfirmParam = new CollectionInfoConfirmParam();
+        collectionInfoConfirmParam.setId(1l);
+        collectionInfoConfirmParam.setUserId(4050279479l);
+        collectionInfoConfirmParam.setUserAdvice("wdgcvghfsmjgfjgdgfnbb mjkhkljhgk");
+        fsUserInformationCollectionService.userConfirm(collectionInfoConfirmParam);
         return R.ok().put("data",null);
     }
+
+    @GetMapping("/getUserInformation")
+    public R getUserInformation(@RequestParam("id") Long id) {
+        FsUserInformationCollectionDTO fsUserInformationCollection = fsUserInformationCollectionService.selectFsUserInformationCollectionDTOById(id);
+
+
+        return R.ok().put("data", fsUserInformationCollection);
+    }
 }

+ 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);
                     }

+ 1 - 1
fs-qw-task/src/main/java/com/fs/app/taskService/impl/SopLogsTaskServiceImpl.java

@@ -1074,7 +1074,7 @@ public class SopLogsTaskServiceImpl implements SopLogsTaskService {
                     setting.setLinkUrl(linkByApp.getSortLink().replaceAll("^[\\s\\u2005]+", ""));
                     setting.setAppLinkUrl(linkByApp.getAppMsgLink().replaceAll("^[\\s\\u2005]+", ""));
                     setting.setCourseUrl(setting.getLinkImageUrl());
-                    setting.setTitle(setting.getLinkTitle());
+                    setting.setTitle(setting.getLinkDescribe()); //小节名称
 
                     break;
                 //自定义小程序

+ 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;
 

+ 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);
+
 }

+ 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);
 }

+ 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);
+    }
 }

+ 1 - 1
fs-service/src/main/java/com/fs/core/utils/OrderCodeUtils.java

@@ -53,7 +53,7 @@ public class OrderCodeUtils {
             return vo.getOrderCode();
         }
         else return null;
-        //return OrderCodeUtils.genOrderSn();
+//        return OrderCodeUtils.genOrderSn();
 
     }
 

+ 17 - 1
fs-service/src/main/java/com/fs/fastGpt/mapper/FastGptRoleMapper.java

@@ -97,5 +97,21 @@ public interface FastGptRoleMapper
 
     List<FastgptEventLogTotalVo> selectFastGptRoleAppKeyList();
 
-
+    @Select("<script> " +
+            "select fr.*,qc.corp_name as corpName  from fastgpt_role fr left join qw_company qc on fr.bind_corp_id=qc.corp_id " +
+            "         <where>  \n" +
+            "            <if test=\"roleName != null  and roleName != ''\"> and role_name like concat('%', #{roleName}, '%')</if>\n" +
+            "            <if test=\"companyId != null \"> and company_id = #{companyId}</if>\n" +
+            "            <if test=\"roleType != null \"> and role_type = #{roleType}</if>\n" +
+            "            <if test=\"modeConfigJson != null  and modeConfigJson != ''\"> and mode_config_json = #{modeConfigJson}</if>\n" +
+            "            <if test=\"mode != null \"> and mode = #{mode}</if>\n" +
+            "            <if test=\"kfId != null  and kfId != ''\"> and kf_id = #{kfId}</if>\n" +
+            "            <if test=\"kfUrl != null  and kfUrl != ''\"> and kf_url = #{kfUrl}</if>\n" +
+            "            <if test=\"avatar != null  and avatar != ''\"> and avatar = #{avatar}</if>\n" +
+            "            <if test=\"kfMediaId != null  and kfMediaId != ''\"> and kf_media_id = #{kfMediaId}</if>\n" +
+            "            <if test=\"reminderWords != null  and reminderWords != ''\"> and reminder_words = #{reminderWords}</if>\n" +
+            "            <if test=\"bindCorpId != null  and bindCorpId != ''\"> and (bind_corp_id = #{bindCorpId} or bind_corp_id is null)</if>\n" +
+            "        </where>" +
+            "</script> ")
+    List<FastGptRoleVO> selectFastGptRoleListVONew(FastGptRole fastGptRole);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/fastGpt/service/IFastGptRoleService.java

@@ -81,4 +81,6 @@ public interface IFastGptRoleService
 
     List<FastGptRoleDataVO> selectFastGptRoleAppKeyList();
 
+    List<FastGptRoleVO> selectFastGptRoleListVONew(FastGptRole fastGptRole);
+
 }

+ 5 - 0
fs-service/src/main/java/com/fs/fastGpt/service/impl/FastGptRoleServiceImpl.java

@@ -248,5 +248,10 @@ public class FastGptRoleServiceImpl implements IFastGptRoleService
         return roleDataList;
     }
 
+    @Override
+    public List<FastGptRoleVO> selectFastGptRoleListVONew(FastGptRole fastGptRole) {
+        return fastGptRoleMapper.selectFastGptRoleListVONew(fastGptRole);
+    }
+
 
 }

+ 10 - 0
fs-service/src/main/java/com/fs/his/domain/FsInquiryOrder.java

@@ -145,6 +145,16 @@ public class FsInquiryOrder extends BaseEntity
 
     private Long triageUserId;
 
+    private Integer isUserInformation;
+
+    public Integer getIsUserInformation() {
+        return isUserInformation;
+    }
+
+    public void setIsUserInformation(Integer isUserInformation) {
+        this.isUserInformation = isUserInformation;
+    }
+
     public Long getTriageUserId() {
         return triageUserId;
     }

+ 1 - 0
fs-service/src/main/java/com/fs/his/domain/FsStoreOrder.java

@@ -265,5 +265,6 @@ public class FsStoreOrder extends BaseEntity
     private Integer source;
     private BigDecimal billPrice;
     private String erpPhone;
+    private Integer doctorType2Confirm;
 
 }

+ 9 - 0
fs-service/src/main/java/com/fs/his/domain/FsUserInformationCollection.java

@@ -72,6 +72,9 @@ public class FsUserInformationCollection extends BaseEntity{
     //套餐包订单号
     private String packageOrderCode;
 
+    //套餐包订单id
+    private Long packageOrderId;
+
     //用户第二次确认状态
     private Integer userConfirm2;
 
@@ -95,5 +98,11 @@ public class FsUserInformationCollection extends BaseEntity{
     private String remark;
 
     private Long patientId;
+    private String patientName;
+
+    private Long companyId;
+    private Long doctorType2Id;
+    private Integer doctorType2Confirm;
+    private String doctorType2Sign;
 
 }

+ 103 - 0
fs-service/src/main/java/com/fs/his/dto/FsUserInformationCollectionDTO.java

@@ -0,0 +1,103 @@
+package com.fs.his.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+public class FsUserInformationCollectionDTO {
+    /** $column.columnComment */
+    private Long id;
+
+    /** 问答id */
+    @Excel(name = "问答id")
+    private Long questionId;
+
+    /** 用户id */
+    @Excel(name = "用户id")
+    private Long userId;
+
+    /** 信息采集json数据 */
+    @Excel(name = "信息采集json数据")
+    private String jsonInfo;
+
+    /** 用户确认状态 0-未确认 1-已确认 */
+    @Excel(name = "用户确认状态 0-未确认 1-已确认")
+    private Integer userConfirm;
+
+    /** 医生确认状态 0-未确认 2-已确认 */
+    @Excel(name = "医生确认状态 0-未确认 2-已确认")
+    private Integer doctorConfirm;
+
+    // 医生id
+    private Long doctorId;
+
+    //销售id
+    private Long companyUserId;
+
+    //套餐包id
+    private Long packageId;
+
+    //支付类型 0-全款 1-物流代收
+    private Integer payType;
+
+    //代收金额
+    private BigDecimal amount;
+
+    //用户补充说明
+    private String userAdvice;
+
+    //医生建议
+    private String doctorAdvice;
+
+    //是否关联套餐包 0-不关联 1-关联
+    private Integer isPackage;
+
+    //套餐包订单号
+    private String packageOrderCode;
+
+    //用户第二次确认状态
+    private Integer userConfirm2;
+
+    //确认状态 1第一次确认 2第二次确认
+    private Integer status;
+
+    //医生确认时间
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date doctorConfirmTime;
+
+    //用户性别 0女 1男
+    private Integer sex;
+    //用户姓名
+    private String userName;
+    //用户电话后四位
+    private String userPhoneFour;
+
+    //是否过敏
+    private String allergy;
+    //备注
+    private String remark;
+
+    private Long patientId;
+
+    private String patientName;
+
+    private String companyUserName;
+
+    private String doctorName;
+
+    private String packageName;
+
+    private String questionJson;
+
+    private String doctorSign;
+
+    private String doctorType2Name;
+    private Long doctorType2Id;
+    private Integer doctorType2Confirm;
+    private String doctorType2Sign;
+
+}

+ 3 - 1
fs-service/src/main/java/com/fs/his/dto/PayloadDTO.java

@@ -1,5 +1,6 @@
 package com.fs.his.dto;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import lombok.Data;
 
 import java.io.Serializable;
@@ -12,6 +13,7 @@ public class PayloadDTO implements Serializable {
     private String description;
 
     @Data
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     public static class Extension implements Serializable{
         private String title;
         private String patientName;
@@ -33,7 +35,7 @@ public class PayloadDTO implements Serializable {
         private Long companyId;
         private Long companyUserId;
         private Long doctorId;
-
+        private Long userInformationId;
     }
 
 }

+ 7 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserInformationCollectionMapper.java

@@ -2,7 +2,9 @@ package com.fs.his.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsUserInformationCollection;
+import com.fs.his.dto.FsUserInformationCollectionDTO;
 import com.fs.his.param.FsUserInformationCollectionListDParam;
+import com.fs.his.param.UserInformationDoctorType2Param;
 import com.fs.his.vo.FsUserInformationCollectionListDVO;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Select;
@@ -92,4 +94,9 @@ public interface FsUserInformationCollectionMapper extends BaseMapper<FsUserInfo
      */
     @Select("SELECT * FROM fs_user_information_collection WHERE is_package = 0 AND user_confirm = 1 AND doctor_confirm = 1 AND user_confirm2 = 0 AND doctor_confirm_time <= DATE_SUB(NOW(), INTERVAL 2 HOUR)")
     List<FsUserInformationCollection> selectAutoConfirm();
+
+    FsUserInformationCollectionDTO selectFsUserInformationCollectionDTOById(Long id);
+
+    List<FsUserInformationCollection>selectFsUserInformationCollectionByDoctorType2(@Param("maps") UserInformationDoctorType2Param userInformationDoctorType2Param);
+    List<FsUserInformationCollection>selectFsUserInformationCollectionByDoctorType1(@Param("maps") UserInformationDoctorType2Param userInformationDoctorType2Param);
 }

+ 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/param/CollectionInfoConfirmParam.java

@@ -13,4 +13,6 @@ public class CollectionInfoConfirmParam {
 
     //用户建议
     private String userAdvice;
+
+    private Long patientId;
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsInquiryOrderCreateParam.java

@@ -48,5 +48,6 @@ public class FsInquiryOrderCreateParam implements Serializable {
     private Long companyId;
     private Long companyUserId;
     private Integer source;//订单来源 1:小程序 2:app  3:H5
+    private Integer isUserInformation = 1;
 
 }

+ 1 - 0
fs-service/src/main/java/com/fs/his/param/FsInquiryOrderListPDParam.java

@@ -22,5 +22,6 @@ public class FsInquiryOrderListPDParam  extends BaseParam implements Serializabl
     Long userId;
     private String eTime;
     private String sTime;
+    private Integer isUserInformation = 0;
 
 }

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

@@ -21,6 +21,8 @@ public class FsPackageOrderCreateParam implements Serializable {
     private Integer source;//订单来源 1:小程序 2:app  3:H5
     private String createPackageOrderKey;
     private Integer payType;
+    private Integer isUserInformation = 0;
+    private Long userInformationId;
 
 
 

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

@@ -47,4 +47,6 @@ public class FsUserInformationCollectionParam {
     private Long patientId;
 
     private String doctorSign;
+
+    private String packageOrderCode;
 }

+ 16 - 0
fs-service/src/main/java/com/fs/his/param/UserInformationDoctorType2Param.java

@@ -0,0 +1,16 @@
+package com.fs.his.param;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class UserInformationDoctorType2Param extends BaseParam implements Serializable {
+    private Integer doctorType2Confirm;
+    private String patientName;
+    private String packageOrderCode;
+    private Long doctorType2Id;
+    private Long doctorType;
+    private Long doctorId;
+    private Integer doctorConfirm;
+}

+ 11 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserInformationCollectionService.java

@@ -3,9 +3,11 @@ package com.fs.his.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsUserInformationCollection;
+import com.fs.his.dto.FsUserInformationCollectionDTO;
 import com.fs.his.param.CollectionInfoConfirmParam;
 import com.fs.his.param.FsUserInformationCollectionListDParam;
 import com.fs.his.param.FsUserInformationCollectionParam;
+import com.fs.his.param.UserInformationDoctorType2Param;
 import com.fs.his.vo.FsUserInfoCollectionUVO;
 import com.fs.his.vo.FsUserInformationCollectionAndPatientVO;
 import com.fs.his.vo.FsUserInformationCollectionListDVO;
@@ -28,6 +30,8 @@ public interface IFsUserInformationCollectionService extends IService<FsUserInfo
      */
     FsUserInformationCollection selectFsUserInformationCollectionById(Long id);
 
+
+
     /**
      * 查询用户信息采集列表
      *
@@ -36,6 +40,9 @@ public interface IFsUserInformationCollectionService extends IService<FsUserInfo
      */
     List<FsUserInformationCollection> selectFsUserInformationCollectionList(FsUserInformationCollection fsUserInformationCollection);
 
+    List<FsUserInformationCollection> selectFsUserInformationCollectionByDoctorType2(UserInformationDoctorType2Param userInformationDoctorType2Param);
+    List<FsUserInformationCollection> selectFsUserInformationCollectionByDoctorType1(UserInformationDoctorType2Param userInformationDoctorType2Param);
+
     /**
      * 新增用户信息采集
      *
@@ -91,6 +98,7 @@ public interface IFsUserInformationCollectionService extends IService<FsUserInfo
     R getWxaCodePackageOrderUnLimit(Long collectionId);
 
     R doctorConfirm(FsUserInformationCollection collection);
+    R doctorType2Confirm(FsUserInformationCollection collection);
 
     FsUserInfoCollectionUVO info(Long id, Long userId);
 
@@ -101,4 +109,7 @@ public interface IFsUserInformationCollectionService extends IService<FsUserInfo
 
     FsUserInformationCollectionVO getCollectionByUserId(Long userId);
 
+    FsUserInformationCollectionDTO selectFsUserInformationCollectionDTOById(Long id);
+
+    int updatePackageOrderCode(FsUserInformationCollection fsUserInformationCollection);
 }

+ 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);
 }

+ 6 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java

@@ -1084,6 +1084,8 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
         return R.ok("抢单成功");
     }
 
+
+
     @Override
     @Transactional
     public R receiveOrder(FsInquiryOrderReceiveParam param) throws JsonProcessingException {
@@ -1125,6 +1127,10 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
 
             }
         }
+        //是用户信息采集的订单发送用户信息给医生
+//        if (order.getIsUserInformation()==1){
+//            sendUserInformation(order.getUserId(),order.getDoctorId());
+//        }
         MsgDTO msgDTO=new MsgDTO();
         MsgCustomDTO customDTO=new MsgCustomDTO();
         customDTO.setType("startInquiry");

+ 17 - 1
fs-service/src/main/java/com/fs/his/service/impl/FsPackageOrderServiceImpl.java

@@ -168,6 +168,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
     @Autowired
     private CloudHostProper cloudHostProper;
 
+    @Autowired
+    private IFsUserInformationCollectionService fsUserInformationCollectionService;
+
     /**
      * 查询套餐订单
      *
@@ -494,6 +497,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
     @Override
     public R createOrder(FsPackageOrderCreateParam param) {
         FsUser user=userService.selectFsUserByUserId(param.getUserId());
+        if (user == null){
+            return R.error("请重新登录重试");
+        }
         if(user.getStatus()!=1){
             return R.error("非法用户操作");
         }
@@ -606,7 +612,9 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         c.setTime(order.getStartTime());
         c.add(Calendar.DAY_OF_MONTH, fsPackage.getCycle());
         order.setFinishTime(c.getTime());
-        order.setFormJson(param.getFormJson());
+        if (param.getIsUserInformation() != 1){
+            order.setFormJson(param.getFormJson());
+        }
         order.setPackageJson(JSONUtil.toJsonStr(fsPackage));
         order.setCreateTime(new Date());
         if(patient!=null){
@@ -618,6 +626,14 @@ public class FsPackageOrderServiceImpl implements IFsPackageOrderService
         order.setCycle(fsPackage.getCycle());
         order.setCostDiscountMoney(fsPackage.getTotalCostPrice().subtract(fsPackage.getTotalPrice()));
         if(fsPackageOrderMapper.insertFsPackageOrder(order)>0){
+            if (param.getIsUserInformation()!=null && param.getIsUserInformation() == 1){
+                FsUserInformationCollection fsUserInformationCollection = fsUserInformationCollectionService.selectFsUserInformationCollectionById(param.getUserInformationId());
+                if (fsUserInformationCollection != null) {
+                    fsUserInformationCollection.setPackageOrderCode(order.getOrderSn());
+                    fsUserInformationCollection.setPackageOrderId(order.getOrderId());
+                    fsUserInformationCollectionService.updatePackageOrderCode(fsUserInformationCollection);
+                }
+            }
             String redisKey = String.valueOf(StrUtil.format("{}{}", FsConstants.REDIS_PACKAGE_ORDER_UNPAY, order.getOrderId()));
             redisCache.setCacheObject(redisKey,order.getOrderId(),30, TimeUnit.MINUTES);
             return R.ok().put("order",order);

+ 126 - 24
fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionServiceImpl.java

@@ -21,11 +21,10 @@ import com.fs.core.config.WxPayProperties;
 import com.fs.core.utils.OrderCodeUtils;
 import com.fs.his.config.FsSysConfig;
 import com.fs.his.domain.*;
+import com.fs.his.dto.FsUserInformationCollectionDTO;
 import com.fs.his.enums.FsStoreOrderStatusEnum;
 import com.fs.his.mapper.*;
-import com.fs.his.param.CollectionInfoConfirmParam;
-import com.fs.his.param.FsUserInformationCollectionListDParam;
-import com.fs.his.param.FsUserInformationCollectionParam;
+import com.fs.his.param.*;
 import com.fs.his.service.*;
 import com.fs.his.utils.ConfigUtil;
 import com.fs.his.vo.*;
@@ -33,6 +32,7 @@ import com.fs.huifuPay.domain.HuiFuRefundResult;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentDelaytransConfirmrefundRequest;
 import com.fs.huifuPay.sdk.opps.core.request.V2TradePaymentScanpayRefundRequest;
 import com.fs.huifuPay.service.HuiFuService;
+import com.fs.im.service.OpenIMService;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
 import com.fs.system.oss.CloudStorageService;
@@ -145,6 +145,10 @@ public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserIn
     private FsStoreOrderLogsMapper fsStoreOrderLogsMapper;
     @Autowired
     private DoctorMsgMapper doctorMsgMapper;
+    @Autowired
+    private IFsInquiryOrderService fsInquiryOrderService;
+    @Autowired
+    private OpenIMService openIMService;
     /**
      * 查询用户信息采集
      *
@@ -169,6 +173,17 @@ public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserIn
         return baseMapper.selectFsUserInformationCollectionList(fsUserInformationCollection);
     }
 
+    @Override
+    public List<FsUserInformationCollection> selectFsUserInformationCollectionByDoctorType2(UserInformationDoctorType2Param userInformationDoctorType2Param) {
+        return fsUserInformationCollectionMapper.selectFsUserInformationCollectionByDoctorType2(userInformationDoctorType2Param);
+
+    }
+    @Override
+    public List<FsUserInformationCollection> selectFsUserInformationCollectionByDoctorType1(UserInformationDoctorType2Param userInformationDoctorType2Param) {
+        return fsUserInformationCollectionMapper.selectFsUserInformationCollectionByDoctorType1(userInformationDoctorType2Param);
+
+    }
+
     /**
      * 新增用户信息采集
      *
@@ -460,6 +475,10 @@ public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserIn
         map.setDoctorConfirm(1);
         //医生确认时间
         map.setDoctorConfirmTime(DateUtils.getNowDate());
+        //写入医生签名
+        FsDoctor fsDoctor = doctorMapper.selectFsDoctorByDoctorId(fsUserInformationCollection.getDoctorId());
+        map.setDoctorSign(fsDoctor.getSignUrl());
+        map.setDoctorAdvice(collection.getDoctorAdvice());
         if (answerVOS != null && !answerVOS.isEmpty()) {
             map.setJsonInfo(JSON.toJSONString(answerVOS));
         }
@@ -496,22 +515,79 @@ public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserIn
         if (fsUserInformationCollectionMapper.updateFsUserInformationCollection(map) > 0) {
 
             //更新医生确认信息
-            FsDoctorConfirm doctorConfirm = redisCache.getCacheObject("doctorConfirm:" + collection.getId());
-            if(doctorConfirm == null) {
-                return R.error("没有医生确认信息");
-            }
-            doctorConfirm.setDoctorEndTime(DateUtils.getNowDate());
-            Long seconds = DateUtil.between(doctorConfirm.getStartTime(), doctorConfirm.getDoctorEndTime(), DateUnit.SECOND);
-            doctorConfirm.setConfirmSecond(seconds);
-            doctorConfirmService.updateFsDoctorConfirm(doctorConfirm);
-            redisCache.deleteObject("doctorConfirm:" + collection.getId());
-
+//            FsDoctorConfirm doctorConfirm = redisCache.getCacheObject("doctorConfirm:" + collection.getId());
+//            if(doctorConfirm == null) {
+//                return R.error("没有医生确认信息");
+//            }
+//            doctorConfirm.setDoctorEndTime(DateUtils.getNowDate());
+//            Long seconds = DateUtil.between(doctorConfirm.getStartTime(), doctorConfirm.getDoctorEndTime(), DateUnit.SECOND);
+//            doctorConfirm.setConfirmSecond(seconds);
+//            doctorConfirmService.updateFsDoctorConfirm(doctorConfirm);
+//            redisCache.deleteObject("doctorConfirm:" + collection.getId());
 
+            openIMService.doctorSendMsgToUser(collection.getUserId(),collection.getDoctorId());
             return R.ok();
         }
         return R.error("医生确认失败");
     }
 
+    @Override
+    @Transactional
+    public R doctorType2Confirm(FsUserInformationCollection collection) {
+        FsUserInformationCollection fsUserInformationCollection = fsUserInformationCollectionMapper.selectFsUserInformationCollectionById(collection.getId());
+        if (fsUserInformationCollection == null) {
+            return R.error("没有用户采集信息");
+        }
+        if (fsUserInformationCollection.getUserConfirm() == 0){
+            return R.error("用户未确认");
+        }
+        if (fsUserInformationCollection.getDoctorType2Confirm() == 1){
+            return R.error("药师已确认");
+        }
+        if (fsUserInformationCollection.getDoctorConfirm() != 1) {
+            return R.error("医生未签字无法确认");
+        }
+        if(StringUtils.isEmpty(fsUserInformationCollection.getPackageOrderCode())){
+            return R.error("用户未下单,无需确认");
+        }
+        List<AnswerVO> answerVOS = null;
+        //医生确认确认状态为true(用于封档)
+        if (StringUtils.isNotEmpty(fsUserInformationCollection.getJsonInfo()) ){
+            answerVOS = JSONArray.parseArray(fsUserInformationCollection.getJsonInfo(), AnswerVO.class);
+            answerVOS.forEach(answerVO -> {
+                answerVO.setFlag(true);
+            });
+        }
+        FsUserInformationCollection map = new FsUserInformationCollection();
+        map.setId(collection.getId());
+        map.setDoctorType2Confirm(1);
+        //医生确认时间
+        map.setDoctorConfirmTime(DateUtils.getNowDate());
+        //写入药师签名
+        FsDoctor fsDoctor = doctorMapper.selectFsDoctorByDoctorId(fsUserInformationCollection.getDoctorType2Id());
+        if(fsDoctor.getDoctorType()!=2){
+            return R.error("不是药师身份,无法确认");
+        }
+        map.setDoctorType2Sign(fsDoctor.getSignUrl());
+        map.setDoctorAdvice(collection.getDoctorAdvice());
+        if (answerVOS != null && !answerVOS.isEmpty()) {
+            map.setJsonInfo(JSON.toJSONString(answerVOS));
+        }
+//
+
+        if (fsUserInformationCollectionMapper.updateFsUserInformationCollection(map) > 0) {
+            FsPackageOrder fsPackageOrder = packageOrderMapper.selectFsPackageOrderByOrderSn(collection.getPackageOrderCode());
+            if(fsPackageOrder.getStoreOrderId()==null||fsPackageOrder.getStoreOrderId()==0){
+                return R.error("用户未支付,无需确认");
+            }
+            FsStoreOrder fsStoreOrder = storeOrderService.selectFsStoreOrderByOrderId(fsPackageOrder.getStoreOrderId());
+            fsStoreOrder.setDoctorType2Confirm(1);
+            storeOrderService.updateFsStoreOrder(fsStoreOrder);
+            return R.ok();
+        }
+        return R.error("药师确认失败");
+    }
+
     @Override
     public FsUserInfoCollectionUVO info(Long id, Long userId) {
         FsUserInfoCollectionUVO vo = new FsUserInfoCollectionUVO();
@@ -602,19 +678,35 @@ public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserIn
         map.setId(param.getId());
         map.setUserConfirm(1);
         map.setUserAdvice(param.getUserAdvice());
+        if (param.getPatientId() == null|| param.getPatientId() == 0) {
+            return R.error("请提交就诊人信息");
+        }
+        map.setPatientId(param.getPatientId());
         if (collection.getStatus() == 1) {
-            //用户第一次确认添加医生消息
-            DoctorMsg msg = new DoctorMsg();
-            String name = collection.getUserName() != null ? collection.getUserName() : "-";
-            //没套餐包的添加医生信息采集建议消息
-            msg.setTitle("用户采集信息建议");
-            msg.setType(3);
-            msg.setContent("患者:" + name + "的信息采集,前往建议");
-            msg.setDoctorId(collection.getDoctorId());
-            msg.setCreateTime(DateUtils.getNowDate());
-            //插入医生消息
+
+            openIMService.sendUserInformation(collection.getUserId(),collection.getDoctorId(),collection.getId());
+            //用户确认后创建一个问诊订单,待医生接单
+//            FsInquiryOrderCreateParam fsInquiryOrderCreateParam = new FsInquiryOrderCreateParam();
+//            fsInquiryOrderCreateParam.setIsUserInformation(1);
+//            fsInquiryOrderCreateParam.setUserId(collection.getUserId());
+//            fsInquiryOrderCreateParam.setPatientId(collection.getPatientId());
+//            fsInquiryOrderCreateParam.setOrderType(1);
+//            fsInquiryOrderCreateParam.setInquiryType(1);
+//            fsInquiryOrderCreateParam.setIsVisit("1");
+//            fsInquiryOrderCreateParam.setInquirySubType(3);
+//            fsInquiryOrderService.createOrder(fsInquiryOrderCreateParam);
+//            //用户第一次确认添加医生消息
+//            DoctorMsg msg = new DoctorMsg();
+//            String name = collection.getUserName() != null ? collection.getUserName() : "-";
+//            //没套餐包的添加医生信息采集建议消息
+//            msg.setTitle("用户采集信息建议");
+//            msg.setType(3);
+//            msg.setContent("患者:" + name + "的信息采集,前往建议");
+//            msg.setDoctorId(collection.getDoctorId());
+//            msg.setCreateTime(DateUtils.getNowDate());
+//            //插入医生消息
 //            doctorMsgMapper.insertDoctorMsg(msg);
-            //第一次确认
+//            //第一次确认
             map.setStatus(2);
             baseMapper.updateFsUserInformationCollection(map);
         }
@@ -841,6 +933,16 @@ public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserIn
         return vo;
     }
 
+    @Override
+    public FsUserInformationCollectionDTO selectFsUserInformationCollectionDTOById(Long id) {
+        return fsUserInformationCollectionMapper.selectFsUserInformationCollectionDTOById(id);
+    }
+
+    @Override
+    public int updatePackageOrderCode(FsUserInformationCollection fsUserInformationCollection) {
+        return fsUserInformationCollectionMapper.updateFsUserInformationCollection(fsUserInformationCollection);
+    }
+
     private List<AnswerVO> getAnswerVOs(List<AnswerVO> target,List<AnswerVO> source) {
         target.addAll(source);
         return target.stream()

+ 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/im/dto/OpenImMsgDTO.java

@@ -1,5 +1,6 @@
 package com.fs.im.dto;
 
+import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fs.his.dto.PayloadDTO;
 import lombok.Data;
 
@@ -23,6 +24,7 @@ public class OpenImMsgDTO {
 
 
     @Data
+    @JsonInclude(JsonInclude.Include.NON_NULL)
     public static class Content {
         private String content;
         private String data;

+ 5 - 0
fs-service/src/main/java/com/fs/im/service/OpenIMService.java

@@ -84,4 +84,9 @@ public interface OpenIMService {
 
     OpenImResponseDTO sendInquiryUtil(String sendID, String recvID, Integer contentType, String payloadData,String inquiryName,String type,Long companyId,Long companyUserId,String doctorId);
 
+
+    OpenImResponseDTO sendUserInformation(Long userId,Long doctorId,Long userInformationId);
+
+    OpenImResponseDTO doctorSendMsgToUser(Long userId,Long doctorId);
+
 }

+ 52 - 0
fs-service/src/main/java/com/fs/im/service/impl/OpenIMServiceImpl.java

@@ -1575,4 +1575,56 @@ public class OpenIMServiceImpl implements OpenIMService {
             return null;
         }
     }
+
+    //发送用户信息采集数据
+    @Override
+    public OpenImResponseDTO sendUserInformation(Long userId,Long doctorId,Long userInformationId) {
+        try {
+            accountCheck("U"+userId,"1");
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        ObjectMapper objectMapper = new ObjectMapper();
+        openImMsgDTO.setSendID("U"+userId);
+        openImMsgDTO.setRecvID("D"+doctorId);
+        //110为im的自定义消息类型
+        openImMsgDTO.setContentType(110);
+        openImMsgDTO.setSenderPlatformID(5);
+        openImMsgDTO.setSessionType(1);
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        //content.setContent(ext);
+        PayloadDTO payload = new PayloadDTO();
+        payload.setDescription("userInformation");
+        payload.setData("userInformation");
+        PayloadDTO.Extension extension = new PayloadDTO.Extension();
+
+        extension.setDoctorId(doctorId);
+        extension.setUserInformationId(userInformationId);
+        payload.setExtension(extension);
+        OpenImMsgDTO.ImData imData = new OpenImMsgDTO.ImData();
+
+        imData.setPayload(payload);
+
+        String imJson = objectMapper.writeValueAsString(imData);
+        content.setData(imJson);
+        openImMsgDTO.setContent(content);
+        return openIMSendMsg(openImMsgDTO);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return null;
+        }
+    }
+
+    @Override
+    public OpenImResponseDTO doctorSendMsgToUser(Long userId, Long doctorId) {
+        OpenImMsgDTO openImMsgDTO = new OpenImMsgDTO();
+        ObjectMapper objectMapper = new ObjectMapper();
+        openImMsgDTO.setRecvID("U"+userId);
+        openImMsgDTO.setSendID("D"+doctorId);
+        openImMsgDTO.setContentType(101);
+        openImMsgDTO.setSenderPlatformID(5);
+        openImMsgDTO.setSessionType(1);
+        OpenImMsgDTO.Content content = new OpenImMsgDTO.Content();
+        content.setContent("您的用户信息已确认");
+        openImMsgDTO.setContent(content);
+        return openIMSendMsg(openImMsgDTO);
+    }
 }

+ 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.total_num ,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();

+ 2 - 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;
@@ -35,6 +36,7 @@ public class FsMyLiveOrderListQueryVO implements Serializable
     private Integer status;
 
     private Integer isPackage;
+    private Integer totalNum;
 
     private String  packageJson;
 

+ 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;
 
     /** 对应供应商 */

+ 3 - 3
fs-service/src/main/java/com/fs/sop/service/impl/QwSopServiceImpl.java

@@ -199,9 +199,9 @@ public class QwSopServiceImpl implements IQwSopService
         qwSop.setCreateTime(sdf.format(new Date()));
         QwSopTemp qwSopTemp = qwSopTempMapper.selectById(qwSop.getTempId());
         qwSop.setProject(qwSopTemp.getProject());
-        if(qwSop.getAutoGroup() == 1){
-            qwSop.setPullTime(qwSop.getStartTime());
-        }
+//        if(qwSop.getAutoGroup() == 1){
+//            qwSop.setPullTime(qwSop.getStartTime());
+//        }
         return qwSopMapper.insert(qwSop);
     }
 

+ 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();
     }

+ 2 - 2
fs-service/src/main/resources/application-config-dev.yml

@@ -79,8 +79,7 @@ fs :
   h5CommonApi: http://119.29.195.254:8010
   jwt:
     # 加密秘钥
-    #    secret: f4e2e52034348f86b67cde581c0f9eb5
-    secret: dev-zxqzbl
+    secret: e10adc3949ba59abbe56e057f20f883e
     # token有效时长,7天,单位秒
     expire: 31536000
     header: AppToken
@@ -111,6 +110,7 @@ headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png
 ipad:
   ipadUrl: https://contrastably-magnetooptic-gladys.ngrok-free.dev
+#  ipadUrl: http://ipad.cdwjyyh.com
   aiApi: http://152.136.202.157:3000/api
   voiceApi:
   commonApi:

+ 1 - 1
fs-service/src/main/resources/application-config-druid-jnsyj.yml

@@ -89,7 +89,7 @@ cloud_host:
 headerImg:
   imgUrl: https://jz-cos-1356808054.cos.ap-chengdu.myqcloud.com/fs/20250515/0877754b59814ea8a428fa3697b20e68.png
 ipad:
-  ipadUrl: http://ipad.hebeihdt.com
+  ipadUrl: http://ipad.syjcn.top
 #  aiApi: http://152.136.202.157:3000/api
   aiApi: http://49.232.181.28:3000/api
   voiceApi:

+ 1 - 1
fs-service/src/main/resources/application-dev.yml

@@ -235,7 +235,7 @@ token:
 openIM:
     secret: openIM123
     userID: imAdmin
-    url: web.im.ysya.top
+    url: https://web.jnmyim.ylrzfs.com/api
 #是否为新商户,新商户不走mpOpenId
 isNewWxMerchant: true
 #是否使用新im

+ 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>

+ 6 - 1
fs-service/src/main/resources/mapper/his/FsInquiryOrderMapper.xml

@@ -45,10 +45,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="doctorRemark"    column="doctor_remark"    />
         <result property="source"    column="source"    />
         <result property="triageUserId"    column="triage_user_id"    />
+        <result property="isUserInformation"    column="is_user_information"    />
     </resultMap>
 
     <sql id="selectFsInquiryOrderVo">
-        select order_id,doctor_remark,source,triage_user_id, user_coupon_id,dept_id,company_deduct_money,company_id,company_user_id,company_user_remark,is_send_sms,package_order_id,discount_money, order_sn, title, imgs, user_id, patient_id, order_type, money, pay_money, pay_type, is_pay, doctor_id, create_time, pay_time, status, start_time, finish_time, remark, is_ping, department_id, inquiry_type, inquiry_sub_type, patient_json, is_receive, trade_no, is_audit, audit_user_id, audit_time from fs_inquiry_order
+        select order_id,doctor_remark,is_user_information,source,triage_user_id, user_coupon_id,dept_id,company_deduct_money,company_id,company_user_id,company_user_remark,is_send_sms,package_order_id,discount_money, order_sn, title, imgs, user_id, patient_id, order_type, money, pay_money, pay_type, is_pay, doctor_id, create_time, pay_time, status, start_time, finish_time, remark, is_ping, department_id, inquiry_type, inquiry_sub_type, patient_json, is_receive, trade_no, is_audit, audit_user_id, audit_time from fs_inquiry_order
     </sql>
 
     <select id="selectFsInquiryOrderList" parameterType="FsInquiryOrder" resultMap="FsInquiryOrderResult">
@@ -80,6 +81,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="auditUserId != null "> and audit_user_id = #{auditUserId}</if>
             <if test="auditTime != null "> and audit_time = #{auditTime}</if>
             <if test="isSendSms != null "> and is_send_sms = #{isSendSms}</if>
+            <if test="isUserInformation != null "> and is_user_information = #{isUserInformation}</if>
         </where>
     </select>
 
@@ -130,6 +132,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorRemark != null">doctor_remark,</if>
             <if test="source != null">source,</if>
             <if test="triageUserId != null">triage_user_id,</if>
+            <if test="isUserInformation != null">is_user_information,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="orderSn != null">#{orderSn},</if>
@@ -171,6 +174,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorRemark != null">#{doctorRemark},</if>
             <if test="source != null">#{source},</if>
             <if test="triageUserId != null">#{triageUserId},</if>
+            <if test="isUserInformation != null">#{isUserInformation},</if>
          </trim>
     </insert>
 
@@ -216,6 +220,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="doctorRemark != null">doctor_remark = #{doctorRemark},</if>
             <if test="source != null">source = #{source},</if>
             <if test="triageUserId != null">triage_user_id = #{triageUserId},</if>
+            <if test="isUserInformation != null">is_user_information = #{isUserInformation},</if>
         </trim>
         where order_id = #{orderId}
     </update>

+ 53 - 2
fs-service/src/main/resources/mapper/his/FsUserInformationCollectionMapper.xml

@@ -21,6 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="isPackage"    column="is_package"    />
         <result property="userConfirm2"    column="user_confirm2"    />
         <result property="packageOrderCode"    column="package_order_code"    />
+        <result property="packageOrderId"    column="package_order_id"    />
         <result property="status"    column="status"    />
         <result property="userAdvice"    column="user_advice"    />
         <result property="doctorSign"    column="doctor_sign"    />
@@ -32,14 +33,17 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="allergy"    column="allergy"    />
         <result property="remark"    column="remark"    />
         <result property="patientId"    column="patient_id"    />
+        <result property="doctorType2Id"    column="doctor_type2_id"    />
+        <result property="doctorType2Confirm"    column="doctor_type2_confirm"    />
+        <result property="doctorType2Sign"    column="doctor_type2_sign"    />
     </resultMap>
 
     <sql id="selectFsUserInformationCollectionVo">
         select id, question_id, user_id, json_info, user_confirm
              , doctor_confirm, create_time, update_time,doctor_id,company_user_id
-             ,package_id,pay_type,amount,is_package,user_confirm2,package_order_code
+             ,package_id,pay_type,amount,is_package,user_confirm2,package_order_code,package_order_id
              ,status,user_advice,doctor_advice,doctor_sign,doctor_confirm_time,sex,user_name,user_phone_four
-             ,allergy,remark,patient_id  from fs_user_information_collection
+             ,allergy,remark,patient_id,doctor_type2_id,doctor_type2_confirm,doctor_type2_sign  from fs_user_information_collection
     </sql>
 
     <select id="selectFsUserInformationCollectionList" parameterType="FsUserInformationCollection" resultMap="FsUserInformationCollectionResult">
@@ -51,6 +55,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userConfirm != null "> and user_confirm = #{userConfirm}</if>
             <if test="doctorConfirm != null "> and doctor_confirm = #{doctorConfirm}</if>
         </where>
+        order by id desc
     </select>
 
     <select id="selectFsUserInformationCollectionById" parameterType="Long" resultMap="FsUserInformationCollectionResult">
@@ -72,6 +77,37 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <include refid="selectFsUserInformationCollectionVo"/>
         where package_order_code = #{orderCode}
     </select>
+    <select id="selectFsUserInformationCollectionDTOById"
+            resultType="com.fs.his.dto.FsUserInformationCollectionDTO">
+        SELECT fui.*,fu.nick_name as userName,fp.patient_name,cu.nick_name as companyUserName,fd.doctor_name,fd1.doctor_name as doctorType2Name,fpkg.package_name,fqa.json_info as questionJson FROM fs_user_information_collection fui
+          LEFT JOIN fs_user fu ON fui.user_id = fu.user_id
+          LEFT JOIN fs_patient fp ON fui.patient_id = fp. patient_id
+          LEFT JOIN company_user cu ON fui.company_user_id = cu.user_id
+          LEFT JOIN fs_doctor fd ON fui.doctor_id = fd.doctor_id
+          LEFT JOIN fs_doctor fd1 ON fui.doctor_type2_id = fd1.doctor_id
+          LEFT JOIN fs_package fpkg ON fui.package_id = fpkg.package_id
+          LEFT JOIN fs_question_and_answer fqa ON fui.question_id = fqa.id
+        WHERE fui.id = #{id}
+    </select>
+    <select id="selectFsUserInformationCollectionByDoctorType2"
+            resultType="com.fs.his.domain.FsUserInformationCollection">
+        select fui.*,fp.patient_name as patientName from fs_user_information_collection fui left join fs_patient fp on fui.patient_id = fp.patient_id
+            <where>
+                <if test="maps.doctorType2Id != null and maps.doctorType2Id != ''"> and fui.doctor_type2_id = #{maps.doctorType2Id}</if>
+                <if test="maps.doctorType2Confirm != null"> and fui.doctor_type2_confirm = #{maps.doctorType2Confirm}</if>
+                <if test="maps.packageOrderCode != null  and maps.packageOrderCode != ''"> and fui.package_order_code = #{maps.packageOrderCode}</if>
+            </where>
+
+    </select>
+    <select id="selectFsUserInformationCollectionByDoctorType1"
+            resultType="com.fs.his.domain.FsUserInformationCollection">
+        select fui.*,fp.patient_name as patientName from fs_user_information_collection fui left join fs_patient fp on fui.patient_id = fp.patient_id
+        <where>
+            <if test="maps.doctorId != null and maps.doctorId != ''"> and fui.doctor_id = #{maps.doctorId}</if>
+            <if test="maps.doctorConfirm != null"> and fui.doctor_confirm = #{maps.doctorConfirm}</if>
+            <if test="maps.packageOrderCode != null  and maps.packageOrderCode != ''"> and fui.package_order_code = #{maps.packageOrderCode}</if>
+        </where>
+    </select>
 
     <insert id="insertFsUserInformationCollection" parameterType="FsUserInformationCollection" useGeneratedKeys="true" keyProperty="id">
         insert into fs_user_information_collection
@@ -94,6 +130,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isPackage != null">is_package,</if>
             <if test="userConfirm2 != null">user_confirm2,</if>
             <if test="packageOrderCode != null">package_order_code,</if>
+            <if test="packageOrderId != null">package_order_id,</if>
             <if test="status != null">status,</if>
             <if test="doctorConfirmTime != null">doctor_confirm_time,</if>
             <if test="userPhoneFour != null">user_phone_four,</if>
@@ -102,6 +139,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="allergy != null">allergy,</if>
             <if test="remark != null">remark,</if>
             <if test="patientId != null">patient_id,</if>
+            <if test="doctorType2Id != null">doctor_type2_id,</if>
+            <if test="doctorType2Confirm != null">doctor_type2_confirm,</if>
+            <if test="doctorType2Sign != null">doctor_type2_sign,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="questionId != null">#{questionId},</if>
@@ -122,6 +162,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="isPackage != null">#{isPackage},</if>
             <if test="userConfirm2 != null">#{userConfirm2},</if>
             <if test="packageOrderCode != null">#{packageOrderCode},</if>
+            <if test="packageOrderId != null">#{packageOrderId},</if>
             <if test="status != null">#{status},</if>
             <if test="doctorConfirmTime != null">#{doctorConfirmTime},</if>
             <if test="sex != null">#{sex},</if>
@@ -130,6 +171,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="allergy != null">#{allergy},</if>
             <if test="remark != null">#{remark},</if>
             <if test="patientId != null">#{patientId},</if>
+            <if test="patientId != null">#{patientId},</if>
+            <if test="patientId != null">#{patientId},</if>
+            <if test="patientId != null">#{patientId},</if>
+            <if test="doctorType2Id != null">doctorType2Id,</if>
+            <if test="doctorType2Confirm != null">doctorType2Confirm,</if>
+            <if test="doctorType2Sign != null">doctorType2Sign,</if>
          </trim>
     </insert>
 
@@ -154,6 +201,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="userConfirm2 != null">user_confirm2 = #{userConfirm2},</if>
             <if test="isPackage != null">is_package = #{isPackage},</if>
             <if test="packageOrderCode != null">package_order_code = #{packageOrderCode},</if>
+            <if test="packageOrderId != null">package_order_id = #{packageOrderId},</if>
             <if test="status != null">status = #{status},</if>
             <if test="doctorConfirmTime != null">doctor_confirm_time = #{doctorConfirmTime},</if>
             <if test="sex != null">sex = #{sex},</if>
@@ -162,6 +210,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="allergy != null">allergy = #{allergy},</if>
             <if test="remark != null">remark = #{remark},</if>
             <if test="patientId != null">patient_id = #{patientId},</if>
+            <if test="doctorType2Id != null">doctor_type2_id = #{doctorType2Id},</if>
+            <if test="doctorType2Confirm != null">doctor_type2_confirm = #{doctorType2Confirm},</if>
+            <if test="doctorType2Sign != null">doctor_type2_sign = #{doctorType2Sign},</if>
         </trim>
         where id = #{id}
     </update>

+ 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>
 

+ 9 - 5
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,
@@ -1050,21 +1051,24 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND p.prescribe_spec LIKE CONCAT('%', #{productSpec}, '%')
             </if>
             <if test="storeId != null and storeId != ''">
-                AND p.store_id #{storeId}
+                AND p.store_id = #{storeId}
             </if>
             <if test="userAddress != null and userAddress != ''">
                 AND o.user_address LIKE CONCAT('%', #{userAddress}, '%')
             </if>
-            <if test="createTimeStart != null and createTimeStart != ''">
+            <if test="userName != null and userName != ''">
+                AND o.user_name LIKE CONCAT('%', #{userName}, '%')
+            </if>
+            <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);
     }

+ 19 - 6
fs-user-app/src/main/java/com/fs/app/controller/CompanyUserController.java

@@ -34,15 +34,14 @@ import com.fs.fastGpt.domain.FastgptChatVoiceHomo;
 import com.fs.fastGpt.mapper.FastgptChatVoiceHomoMapper;
 import com.fs.fastgptApi.util.AudioUtils;
 import com.fs.fastgptApi.vo.AudioVO;
+import com.fs.his.domain.FsPatient;
 import com.fs.his.domain.FsUserInformationCollection;
 import com.fs.his.param.*;
+import com.fs.his.service.IFsPatientService;
 import com.fs.his.service.IFsPrescribeService;
 import com.fs.his.service.IFsQuestionAndAnswerService;
 import com.fs.his.service.IFsUserInformationCollectionService;
-import com.fs.his.vo.FsPrescribeListDVO;
-import com.fs.his.vo.FsPrescribeListUVO;
-import com.fs.his.vo.FsPrescribeListVO;
-import com.fs.his.vo.OptionsVO;
+import com.fs.his.vo.*;
 import com.fs.sop.domain.QwSopTempVoice;
 import com.fs.sop.service.IQwSopTempVoiceService;
 import com.fs.system.oss.CloudStorageService;
@@ -59,6 +58,7 @@ import org.apache.http.entity.StringEntity;
 import org.apache.http.impl.client.CloseableHttpClient;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.util.EntityUtils;
+import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.validation.annotation.Validated;
@@ -98,6 +98,8 @@ public class CompanyUserController extends  AppBaseController {
     private IFsUserInformationCollectionService fsUserInformationCollectionService;
     @Autowired
     private IFsQuestionAndAnswerService fsQuestionAndAnswerService;
+    @Autowired
+    private IFsPatientService fsPatientService;
 
     public static final String SOP_TEMP_VOICE_KEY = "sop:tempVoice";
     @PostMapping("/login")
@@ -428,7 +430,18 @@ public class CompanyUserController extends  AppBaseController {
     @GetMapping(value = "/informationCollection/{id}")
     public R getInformationCollectionInfo(@PathVariable("id") Long id)
     {
-        return R.ok().put("data",fsUserInformationCollectionService.selectFsUserInformationCollectionById(id));
+        FsUserInformationCollection info = fsUserInformationCollectionService.selectFsUserInformationCollectionById(id);
+        Long patientId = info.getPatientId();
+        if(patientId != null){
+            FsPatient fsPatient = fsPatientService.selectFsPatientByPatientId(patientId);
+            if (fsPatient != null){
+                FsUserInformationCollectionAndPatientVO vo = new FsUserInformationCollectionAndPatientVO();
+                BeanUtils.copyProperties(info, vo);
+                vo.setPatientInfo(fsPatient);
+                return R.ok().put("data", vo);
+            }
+        }
+        return R.ok().put("data",info);
     }
 
     /**
@@ -466,7 +479,7 @@ public class CompanyUserController extends  AppBaseController {
     {
         Long companyUserId = getCompanyUserId();
         fsUserInformationCollection.setCompanyUserId(companyUserId);
-        fsUserInformationCollectionService.updateFsUserInformationCollection(fsUserInformationCollection);
+        fsUserInformationCollectionService.update(fsUserInformationCollection);
         return R.ok();
     }
 

+ 7 - 0
fs-user-app/src/main/java/com/fs/app/controller/FsUserInformationCollectionController.java

@@ -2,6 +2,9 @@ package com.fs.app.controller;
 
 import com.fs.app.annotation.Login;
 import com.fs.common.core.domain.R;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.domain.CompanyUserUser;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.company.service.ICompanyUserUserService;
 import com.fs.his.domain.FsPatient;
 import com.fs.his.domain.FsUserInformationCollection;
@@ -29,6 +32,8 @@ public class FsUserInformationCollectionController extends AppBaseController
     private IFsUserInformationCollectionService fsUserInformationCollectionService;
     @Autowired
     private IFsPatientService fsPatientService;
+    @Autowired
+    private ICompanyUserService companyUserService;
 
 
 
@@ -52,6 +57,8 @@ public class FsUserInformationCollectionController extends AppBaseController
         if (info.getDoctorConfirm() == 0){
             info.setPackageId(null);
         }
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(info.getCompanyUserId());
+        info.setCompanyId(companyUser.getCompanyId());
         Long patientId = info.getPatientId();
         if(patientId != null){
             FsPatient fsPatient = fsPatientService.selectFsPatientByPatientId(patientId);

+ 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