Explorar o código

Merge branch 'master' into 企微聊天

# Conflicts:
#	fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
ct hai 2 días
pai
achega
80490c856e
Modificáronse 37 ficheiros con 412 adicións e 51 borrados
  1. 26 0
      fs-admin/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java
  2. 27 0
      fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java
  3. 1 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java
  4. 6 2
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  5. 1 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseProductOrderServiceImpl.java
  6. 4 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  7. 8 0
      fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogStatisticsListVO.java
  8. 2 0
      fs-service/src/main/java/com/fs/his/service/impl/FsInquiryOrderServiceImpl.java
  9. 8 2
      fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java
  10. 1 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java
  11. 1 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java
  12. 1 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionServiceImpl.java
  13. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java
  14. 1 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  15. 6 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserAddressScrmServiceImpl.java
  16. 15 0
      fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2TradePaymentScanpayRefundRequest.java
  17. 13 1
      fs-service/src/main/java/com/fs/huifuPay/service/impl/HuiFuServiceImpl.java
  18. 1 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java
  19. 2 0
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  20. 2 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  21. 3 2
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  22. 3 0
      fs-service/src/main/java/com/fs/sop/domain/QwSopTempRules.java
  23. 19 0
      fs-service/src/main/java/com/fs/sop/mapper/QwSopTempRulesMapper.java
  24. 2 0
      fs-service/src/main/java/com/fs/sop/service/IQwSopTempContentService.java
  25. 1 0
      fs-service/src/main/java/com/fs/sop/service/IQwSopTempDayService.java
  26. 2 0
      fs-service/src/main/java/com/fs/sop/service/IQwSopTempRulesService.java
  27. 6 0
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempContentServiceImpl.java
  28. 7 0
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempDayServiceImpl.java
  29. 7 2
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempRulesServiceImpl.java
  30. 111 35
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java
  31. 1 1
      fs-service/src/main/resources/application-config-druid-ddgy.yml
  32. 3 1
      fs-service/src/main/resources/application-druid-cfryt.yml
  33. 93 0
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  34. 1 0
      fs-service/src/main/resources/mapper/hisStore/FsUserAddressScrmMapper.xml
  35. 9 1
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml
  36. 15 0
      fs-user-app/src/main/java/com/fs/app/controller/IntegralController.java
  37. 1 1
      fs-user-app/src/main/java/com/fs/app/controller/store/AddressScrmController.java

+ 26 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCourseWatchLogController.java

@@ -134,6 +134,32 @@ public class FsCourseWatchLogController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 会员看课统计导出
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseWatchLog:statisticsExport')")
+    @Log(title = "会员看课统计导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/statisticsExport")
+    public AjaxResult statisticsExport(@RequestBody FsCourseWatchLogStatisticsListParam param)
+    {
+
+        // 如果看指定用户就不用设置公司
+        if(param.getCompanyId() == null){
+            if(param.getUserId() == null) {
+                throw new CustomException("查看公司或者用户必填!");
+            }
+        }
+        if (param.getSTime()==null||param.getETime()==null){
+            throw new CustomException("必须选择开始时间和结束时间!");
+        }
+
+        List<FsCourseWatchLogStatisticsListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogStatisticsListVONew(param);
+
+        ExcelUtil<FsCourseWatchLogStatisticsListVO> util = new ExcelUtil<FsCourseWatchLogStatisticsListVO>(FsCourseWatchLogStatisticsListVO.class);
+        return util.exportExcel(list, "会员看课统计");
+    }
+
+
     /**
      * 导出短链课程看课记录列表
      */

+ 27 - 0
fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java

@@ -89,6 +89,33 @@ public class QwFsCourseWatchLogController extends BaseController
         return getDataTable(list);
     }
 
+    /**
+     * 会员看课统计导出
+     */
+    @PreAuthorize("@ss.hasPermi('course:courseWatchLog:statisticsExport')")
+    @Log(title = "企微看课统计导出", businessType = BusinessType.EXPORT)
+    @PostMapping("/statisticsExport")
+    public AjaxResult statisticsExport(@RequestBody FsCourseWatchLogStatisticsListParam param)
+    {
+
+        if (param.getSTime()==null||param.getETime()==null){
+            throw new CustomException("必须选择开始时间和结束时间!");
+        }
+
+        param.setSendType(2); //企微
+        List<FsCourseWatchLogStatisticsListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogStatisticsListVO(param);
+        if("济南联志健康".equals(signProjectName)){
+            FsCourseWatchLogStatisticsListVO totalData = fsCourseWatchLogService.getTotalDataAddItem(param);
+            list.add(totalData);
+        }
+
+        ExcelUtil<FsCourseWatchLogStatisticsListVO> util = new ExcelUtil<FsCourseWatchLogStatisticsListVO>(FsCourseWatchLogStatisticsListVO.class);
+
+        return util.exportExcel(list, "企微看课统计");
+    }
+
+
+
     @GetMapping("/getSignProjectName")
     public R getSignProjectName(){
         return R.ok().put("signProjectName", signProjectName);

+ 1 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStorePaymentScrmController.java

@@ -223,6 +223,7 @@ public class FsStorePaymentScrmController extends BaseController
                 request.setOrdAmt(payment.getPayMoney().toString());
                 request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                 request.setReqSeqId("refund-"+payment.getPayCode());
+                request.setAppId(payment.getAppId());
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                 request.setExtendInfo(extendInfoMap);

+ 6 - 2
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -265,10 +265,10 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
             "       and  send_type= #{sendType} " +
             "</if>\n" +
             "<if test= 'sTime != null '> " +
-            "       and DATE(o.create_time) &gt;= DATE(#{sTime})\n" +
+            "       and o.create_time &gt;= #{sTime}\n" +
             "</if>\n" +
             "<if test='eTime != null '> " +
-            "      and DATE(o.create_time) &lt;= DATE(#{eTime})\n" +
+            "      and o.create_time &lt; DATE_ADD(#{eTime}, INTERVAL 1 DAY)\n" +
             "</if>" +
             "<if test ='sendType != 1 and nickName !=null and nickName!=\"\"'>\n" +
             "   and qu.qw_user_name like concat( #{nickName}, '%')\n" +
@@ -295,6 +295,10 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
             "</script>"})
     List<FsCourseWatchLogStatisticsListVO> selectFsCourseWatchLogStatisticsListVO(FsCourseWatchLogStatisticsListParam param);
 
+    List<FsCourseWatchLogStatisticsListVO> selectFsCourseWatchLogStatisticsListVO_COUNT(FsCourseWatchLogStatisticsListParam param);
+
+
+
     @Select({"<script> " +
             " \tselect \n" +
             "\t'总合计' as qw_user_name,\n" +

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

@@ -680,6 +680,7 @@ public class FsCourseProductOrderServiceImpl extends ServiceImpl<FsCourseProduct
                     request.setOrdAmt(payment.getPayMoney().toString());
                     request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                     request.setReqSeqId("refund-"+payment.getPayCode());
+                    request.setAppId(payment.getAppId());
                     Map<String, Object> extendInfoMap = new HashMap<>();
                     extendInfoMap.put("org_req_seq_id", "product-"+payment.getPayCode());
                     request.setExtendInfo(extendInfoMap);

+ 4 - 2
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -300,8 +300,10 @@ public class FsUserCourseVideoServiceImpl extends ServiceImpl<FsUserCourseVideoM
             fsUserCourseVideo.setListingStartTime(null);
             fsUserCourseVideo.setListingEndTime(null);
         }
-        String videoRedisKey = "h5user:video:duration:" + fsUserCourseVideo.getVideoId();
-        redisCache.setCacheObject(videoRedisKey, fsUserCourseVideo.getDuration());
+        String videoRedisKey1 = "h5user:video:duration:" + fsUserCourseVideo.getVideoId();
+        redisCache.setCacheObject(videoRedisKey1, fsUserCourseVideo.getDuration());
+        String videoRedisKey2 = "h5wxuser:video:duration:" + fsUserCourseVideo.getVideoId();
+        redisCache.setCacheObject(videoRedisKey2, fsUserCourseVideo.getDuration());
         return fsUserCourseVideoMapper.updateFsUserCourseVideo(fsUserCourseVideo);
     }
 

+ 8 - 0
fs-service/src/main/java/com/fs/course/vo/FsCourseWatchLogStatisticsListVO.java

@@ -11,27 +11,35 @@ public class FsCourseWatchLogStatisticsListVO {
 
 
     private Integer project;
+
     @Excel(name = "项目名称")
     private String projectName;
 
     private Long courseId;
+
     @Excel(name = "课程名称")
     private String courseName;
 
     private Long videoId;
+
     @Excel(name = "小节名称")
     private String videoName;
 
     @Excel(name = "看课中")
     private String type1;
+
     @Excel(name = "已完课")
     private String type2;
+
     @Excel(name = "待看课")
     private String type3;
+
     @Excel(name = "看课中断")
     private String type4;
+
     @Excel(name = "上线数")
     private Long onLineNum;
+
     @Excel(name = "企业微信员工名称")
     private String qwUserName;
 

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

@@ -457,6 +457,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
                         request.setOrdAmt(payment.getPayMoney().toString());
                         request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                         request.setReqSeqId("refund-"+payment.getPayCode());
+                        request.setAppId(payment.getAppId());
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_req_seq_id", "inquiry-"+payment.getPayCode());
                         request.setExtendInfo(extendInfoMap);
@@ -1593,6 +1594,7 @@ public class FsInquiryOrderServiceImpl implements IFsInquiryOrderService
                     request.setOrdAmt(payment.getPayMoney().toString());
                     request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                     request.setReqSeqId("refund-"+payment.getPayCode());
+                    request.setAppId(payment.getAppId());
                     Map<String, Object> extendInfoMap = new HashMap<>();
                     extendInfoMap.put("org_req_seq_id", "inquiry-"+payment.getPayCode());
                     request.setExtendInfo(extendInfoMap);

+ 8 - 2
fs-service/src/main/java/com/fs/his/service/impl/FsIntegralOrderServiceImpl.java

@@ -380,15 +380,21 @@ public class FsIntegralOrderServiceImpl implements IFsIntegralOrderService
 
         if(fsIntegralOrderMapper.insertFsIntegralOrder(order)>0){
             if (order.getPayType() != 2) {
+                // 验证积分是否足够,防止出现负数
+                long remainingIntegral = user.getIntegral() - totalIntegral;
+                if (remainingIntegral < 0) {
+                    throw new CustomException("积分不足,无法创建订单");
+                }
+                
                 //写入日志
                 FsUser userMap=new FsUser();
                 userMap.setUserId(user.getUserId());
-                userMap.setIntegral(user.getIntegral()-totalIntegral);
+                userMap.setIntegral(remainingIntegral);
                 fsUserMapper.updateFsUser(userMap);
                 FsUserIntegralLogs logs = new FsUserIntegralLogs();
                 logs.setIntegral(-totalIntegral);
                 logs.setUserId(order.getUserId());
-                logs.setBalance(userMap.getIntegral());
+                logs.setBalance(remainingIntegral);
                 logs.setLogType(5);
                 logs.setBusinessId(order.getOrderId().toString());
                 logs.setCreateTime(new Date());

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreAfterSalesServiceImpl.java

@@ -557,6 +557,7 @@ public class FsStoreAfterSalesServiceImpl implements IFsStoreAfterSalesService {
                 request.setOrgReqDate(new SimpleDateFormat("yyyyMMdd").format(payment.getCreateTime()));
                 request.setReqSeqId("refund-" + payment.getPayCode());
                 Map<String, Object> extendInfoMap = new HashMap<>();
+                request.setAppId(payment.getAppId());
                 extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
 
                 //处理分账退款

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStorePaymentServiceImpl.java

@@ -520,6 +520,7 @@ public class FsStorePaymentServiceImpl implements IFsStorePaymentService {
                 request.setReqSeqId("refund-"+fsStorePayment.getPayCode());
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_req_seq_id", orderType+"-"+fsStorePayment.getPayCode());
+                request.setAppId(fsStorePayment.getAppId());
                 request.setExtendInfo(extendInfoMap);
                 //处理分账退款
                 //1.判断是否是全额退款

+ 1 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserInformationCollectionServiceImpl.java

@@ -938,6 +938,7 @@ public class FsUserInformationCollectionServiceImpl extends ServiceImpl<FsUserIn
         Map<String, Object> extendInfoMap = new HashMap<>();
         extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
         request.setExtendInfo(extendInfoMap);
+        request.setAppId(payment.getAppId());
         HuiFuRefundResult refund = huiFuService.refund(request);
         logger.info("订单退款返回结果:退款订单id:" + orderId + refund);
         if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreAfterSalesScrmServiceImpl.java

@@ -847,6 +847,7 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                         request.setExtendInfo(extendInfoMap);
+                        request.setAppId(payment.getAppId());
                         HuiFuRefundResult refund = huiFuService.refund(request);
                         logger.info("退款:"+refund);
                         if((refund.getResp_code().equals("00000000")||refund.getResp_code().equals("00000100"))&&(refund.getTrans_stat().equals("S")||refund.getTrans_stat().equals("P"))){
@@ -1566,6 +1567,7 @@ public class FsStoreAfterSalesScrmServiceImpl implements IFsStoreAfterSalesScrmS
                 Map<String, Object> extendInfoMap = new HashMap<>();
                 extendInfoMap.put("org_req_seq_id", orderType + "-" + payment.getPayCode());
                 request.setExtendInfo(extendInfoMap);
+                request.setAppId(payment.getAppId());
                 HuiFuRefundResult refund = huiFuService.refund(request);
                 logger.info("订单退款返回结果:退款订单id:" + order.getOrderId() + refund);
                 if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {

+ 1 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -2509,6 +2509,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                         request.setExtendInfo(extendInfoMap);
+                        request.setAppId(payment.getAppId());
                         HuiFuRefundResult refund = huiFuService.refund(request);
                         logger.info("退款:" + refund);
                         if ((refund.getResp_code().equals("00000000") || refund.getResp_code().equals("00000100")) && (refund.getTrans_stat().equals("S") || refund.getTrans_stat().equals("P"))) {

+ 6 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsUserAddressScrmServiceImpl.java

@@ -68,7 +68,12 @@ public class FsUserAddressScrmServiceImpl implements IFsUserAddressScrmService
     {
         fsUserAddress.setDetail(fsUserAddress.getDetail().trim());
         fsUserAddress.setCreateTime(DateUtils.getNowDate());
-        return fsUserAddressMapper.insertFsUserAddress(fsUserAddress);
+        int result = fsUserAddressMapper.insertFsUserAddress(fsUserAddress);
+        // 将自增id赋值给addressId字段
+        if (result > 0 && fsUserAddress.getId() != null) {
+            fsUserAddress.setAddressId(fsUserAddress.getId());
+        }
+        return result;
     }
 
     /**

+ 15 - 0
fs-service/src/main/java/com/fs/huifuPay/sdk/opps/core/request/V2TradePaymentScanpayRefundRequest.java

@@ -52,6 +52,12 @@ public class V2TradePaymentScanpayRefundRequest extends BaseRequest {
     private String acctSplitBunch;
 
 
+    /**
+     *小程序
+     * **/
+    private String appId;
+
+
     @Override
     public FunctionCodeEnum getFunctionCode() {
         return FunctionCodeEnum.V2_TRADE_PAYMENT_SCANPAY_REFUND;
@@ -124,4 +130,13 @@ public class V2TradePaymentScanpayRefundRequest extends BaseRequest {
     public void setAcctSplitBunch(String acctSplitBunch) {
         this.acctSplitBunch = acctSplitBunch;
     }
+
+
+    public String getAppId() {
+        return appId;
+    }
+
+    public void setAppId(String appId) {
+        this.appId = appId;
+    }
 }

+ 13 - 1
fs-service/src/main/java/com/fs/huifuPay/service/impl/HuiFuServiceImpl.java

@@ -152,7 +152,19 @@ public class HuiFuServiceImpl implements HuiFuService {
     public HuiFuRefundResult refund(V2TradePaymentScanpayRefundRequest request) {
         HuiFuRefundResult huiFuRefundResult=null;
         try {
-            doInit(getMerConfig());
+            if (request.getAppId() != null) {
+                FsHfpayConfigMapper fsHfpayConfigMapper = SpringUtils.getBean(FsHfpayConfigMapper.class);
+                FsHfpayConfig fsHfpayConfig = fsHfpayConfigMapper.selectByAppId(request.getAppId());
+                if (fsHfpayConfig != null) {
+                    //多汇付支付获取配置
+                    doInit(getMerConfig(fsHfpayConfig));
+                } else {
+                    //多小程序
+                    doInit(getMerConfig());
+                }
+            } else {
+                doInit(getMerConfig());
+            }
             request.setReqDate(DateTools.getCurrentDateYYYYMMDD());
             Map<String, Object> response = doExecute(request);
             String jsonString = JSONObject.toJSONString(response);

+ 1 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java

@@ -1096,6 +1096,7 @@ public class LiveAfterSalesServiceImpl implements ILiveAfterSalesService {
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                         request.setExtendInfo(extendInfoMap);
+                        request.setAppId(payment.getAppId());
                         HuiFuRefundResult refund = huiFuService.refund(request);
                         log.info("退款:" + refund);
                         if (refund != null && ("00000000".equals(refund.getResp_code()) || "00000100".equals(refund.getResp_code()))

+ 2 - 0
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -1308,6 +1308,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                         request.setExtendInfo(extendInfoMap);
+                        request.setAppId(payment.getAppId());
                         HuiFuRefundResult refund = huiFuService.refund(request);
                         log.info("退款:" + refund);
                         if (refund != null && ("00000000".equals(refund.getResp_code()) || "00000100".equals(refund.getResp_code()))
@@ -1504,6 +1505,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                         Map<String, Object> extendInfoMap = new HashMap<>();
                         extendInfoMap.put("org_party_order_id", payment.getBankSerialNo());
                         request.setExtendInfo(extendInfoMap);
+                        request.setAppId(payment.getAppId());
                         HuiFuRefundResult refund = huiFuService.refund(request);
                         log.info("退款:" + refund);
                         if (refund != null && ("00000000".equals(refund.getResp_code()) || "00000100".equals(refund.getResp_code()))

+ 2 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java

@@ -48,6 +48,8 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
 
     public List<QwExternalContact> selectQwExternalContactByIds(@Param("ids") List<Long> ids);
 
+    public List<QwExternalContact> selectQwExternalContactByIdsStatus(@Param("ids") List<Long> ids);
+
     @Select("SELECT id,stage_status,name,fs_user_id from qw_external_contact where id=#{id}")
     public QwExternalContact selectQwExternalContactByIdForStageStatus(@Param("id") Long id);
 

+ 3 - 2
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -1260,10 +1260,11 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
             List<Future<?>> futures = new ArrayList<>();
 
 
-            // 1. 批量查询所有用户数据
+            // 1. 批量查询所有用户数据(流失客户不打了)
             List<QwExternalContact> contacts;
             try {
-                contacts = qwExternalContactMapper.selectQwExternalContactByIds(param.getUserIds());
+//                contacts = qwExternalContactMapper.selectQwExternalContactByIds(param.getUserIds());
+                contacts = qwExternalContactMapper.selectQwExternalContactByIdsStatus(param.getUserIds());
                 if (contacts == null || contacts.isEmpty()) {
                     return R.error("成功:0,失败:" + param.getUserIds().size());
                 }

+ 3 - 0
fs-service/src/main/java/com/fs/sop/domain/QwSopTempRules.java

@@ -68,6 +68,9 @@ public class QwSopTempRules{
     @Excel(name = "排序")
     private Integer sorts;
 
+    @TableField(exist = false)
+    private Long courseSort;
+
     @TableField(exist = false)
     private List<QwSopTempContent> settingList;
     @TableField(exist = false)

+ 19 - 0
fs-service/src/main/java/com/fs/sop/mapper/QwSopTempRulesMapper.java

@@ -70,6 +70,25 @@ public interface QwSopTempRulesMapper extends BaseMapper<QwSopTempRules> {
     @Select("select * from qw_sop_temp_rules where day_num is null ")
     List<QwSopTempRules> rulesNull();
 
+    @DataSource(DataSourceType.SOP)
+    @Select("<script>" +
+            "select tr.* from qw_sop_temp_rules tr " +
+            "left join qw_sop_temp st on tr.temp_id=st.id " +
+            " where tr.course_id = #{courseId}" +
+            " and st.send_type=11 and st.status = 1  " +
+            "</script>")
+    List<QwSopTempRules> listByCourseId(@Param("courseId") Long courseId);
+
+    @DataSource(DataSourceType.SOP)
+    @Select("<script>" +
+            "select tr.* from qw_sop_temp_rules tr " +
+            "left join qw_sop_temp st on tr.temp_id=st.id " +
+            " where tr.course_id = #{courseId}" +
+            " and tr.temp_id=#{tempId} " +
+            " and st.send_type=11 and st.status = 1  " +
+            "</script>")
+    List<QwSopTempRules> listByCourseIdAndTempId(@Param("courseId") Long courseId,@Param("tempId") String tempId);
+
 
 
     void deleteByTempId(@Param("id") String id);

+ 2 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopTempContentService.java

@@ -92,5 +92,7 @@ public interface IQwSopTempContentService extends IService<QwSopTempContent>{
 
     List<QwSopTempContent> listByTempIds(Collection<String> tempIds);
 
+    List<QwSopTempContent> listByTempId(String tempId);
+
     void removeByWrapper(LambdaQueryWrapper<QwSopTempContent> wrapper);
 }

+ 1 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopTempDayService.java

@@ -44,6 +44,7 @@ public interface IQwSopTempDayService extends IService<QwSopTempDay> {
     void removeByWrapper(LambdaQueryWrapper<QwSopTempDay> wrapper);
 
     List<QwSopTempDay> listByTempIds(LambdaQueryWrapper<QwSopTempDay> wrapper);
+    List<QwSopTempDay> listByTempById(LambdaQueryWrapper<QwSopTempDay> wrapper);
 
     void updateByWrapper(UpdateWrapper<QwSopTempDay> wrapper);
 }

+ 2 - 0
fs-service/src/main/java/com/fs/sop/service/IQwSopTempRulesService.java

@@ -94,6 +94,8 @@ public interface IQwSopTempRulesService extends IService<QwSopTempRules>{
 
     List<QwSopTempRules> listByCourseId(Long courseId);
 
+    List<QwSopTempRules> listByCourseIdAndTempId(Long courseId,String tempId);
+
     void removeByTempIds(Collection<String> tempIds);
 
     void removeByWrapper(LambdaQueryWrapper<QwSopTempRules> wrapper);

+ 6 - 0
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempContentServiceImpl.java

@@ -165,6 +165,12 @@ public class QwSopTempContentServiceImpl extends ServiceImpl<QwSopTempContentMap
         return baseMapper.selectList(new QueryWrapper<QwSopTempContent>().in("temp_id", tempIds));
     }
 
+    @Override
+    @DataSource(DataSourceType.SOP)
+    public List<QwSopTempContent> listByTempId(String tempId) {
+        return baseMapper.selectList(new QueryWrapper<QwSopTempContent>().eq("temp_id", tempId));
+    }
+
     @Override
     @DataSource(DataSourceType.SOP)
     public void removeByWrapper(LambdaQueryWrapper<QwSopTempContent> wrapper) {

+ 7 - 0
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempDayServiceImpl.java

@@ -109,6 +109,13 @@ public class QwSopTempDayServiceImpl extends ServiceImpl<QwSopTempDayMapper, QwS
         return this.list(wrapper);
     }
 
+    @Override
+    @DataSource(DataSourceType.SOP)
+    public List<QwSopTempDay> listByTempById(LambdaQueryWrapper<QwSopTempDay> wrapper) {
+        return this.list(wrapper);
+    }
+
+
     @Override
     @DataSource(DataSourceType.SOP)
     public void updateByWrapper(UpdateWrapper<QwSopTempDay> wrapper) {

+ 7 - 2
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempRulesServiceImpl.java

@@ -243,9 +243,14 @@ public class QwSopTempRulesServiceImpl extends ServiceImpl<QwSopTempRulesMapper,
     }
 
     @Override
-    @DataSource(DataSourceType.SOP)
     public List<QwSopTempRules> listByCourseId(Long courseId) {
-        return list(new QueryWrapper<QwSopTempRules>().eq("course_id", courseId));
+//        return list(new QueryWrapper<QwSopTempRules>().eq("course_id", courseId));
+        return qwSopTempRulesMapper.listByCourseId(courseId);
+    }
+
+    @Override
+    public List<QwSopTempRules> listByCourseIdAndTempId(Long courseId, String tempId) {
+        return qwSopTempRulesMapper.listByCourseIdAndTempId(courseId,tempId);
     }
 
     @Override

+ 111 - 35
fs-service/src/main/java/com/fs/sop/service/impl/QwSopTempServiceImpl.java

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.fs.common.BeanCopyUtils;
 import com.fs.common.annotation.DataSource;
 import com.fs.common.enums.DataSourceType;
 import com.fs.common.exception.base.BaseException;
@@ -321,6 +322,7 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
         if (day == null) return;
         qwSopTempDayService.removeById(day.getId());
         qwSopTempContentService.removeByDayId(day.getId());
+        qwSopTempRulesService.removeByDayId(day.getId());
         reorder(day.getTempId());
     }
 
@@ -633,6 +635,7 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
         if (CollectionUtils.isEmpty(rulesList)) {
             return;
         }
+
         // 获取这些规则关联的模板ID集合
         Set<String> tempIds = rulesList.stream()
                 .map(QwSopTempRules::getTempId)
@@ -641,11 +644,7 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
 
         FsUserCourse fsUserCourse = fsUserCourseMapper.selectFsUserCourseByCourseId(courseId);
         List<FsUserCourseVideo> videoList = fsUserCourseVideoMapper.selectVideoByCourseId(fsUserCourse.getCourseId());
-        List<QwSopTemp> tempList = qwSopTempMapper.selectListByIds(tempIds);
-        List<QwSopTempContent> contentList = qwSopTempContentService.listByTempIds(tempIds);
-        List<QwSopTempDay> dayList = qwSopTempDayService.listByTempIds(new LambdaQueryWrapper<QwSopTempDay>().in(QwSopTempDay::getTempId, tempIds));
         List<Long> videoIdList = videoList.stream().map(FsUserCourseVideo::getVideoId).collect(Collectors.toList());
-        // videoList转Map key 为videoId value 为 courseSort
         Map<Long, Long> videoSortMap = videoList.stream().collect(Collectors.toMap(FsUserCourseVideo::getVideoId, FsUserCourseVideo::getCourseSort));
 
         // 将课程中已删除的视频在规则和日期中删除
@@ -656,54 +655,131 @@ public class QwSopTempServiceImpl implements IQwSopTempService {
             qwSopTempContentService.removeByWrapper(new LambdaQueryWrapper<QwSopTempContent>().in(QwSopTempContent::getDayId, dayIdList));
         }
 
-        // 需要添加的课程视频
-        List<FsUserCourseVideo> addVideoList = videoList.stream()
-                .filter(e -> rulesList.stream().noneMatch(f -> f.getVideoId().equals(e.getVideoId()))).collect(Collectors.toList());
 
-        if (CollectionUtils.isNotEmpty(addVideoList)) {
-            for (QwSopTemp temp : tempList) {
+        tempIds.forEach(teId->{
+            QwSopTemp sopTemp = qwSopTempMapper.selectQwSopTempById(teId);
+            List<QwSopTempContent> contentList = qwSopTempContentService.listByTempId(teId);
+            List<QwSopTempDay> dayList = qwSopTempDayService.listByTempById(new LambdaQueryWrapper<QwSopTempDay>().in(QwSopTempDay::getTempId, teId));
+            List<QwSopTempRules> tempRulesList = qwSopTempRulesService.listByCourseIdAndTempId(courseId, teId);
+
+            List<FsUserCourseVideo> addVideoList = videoList.stream()
+                    .filter(e -> tempRulesList.stream()
+                            .noneMatch(f -> f.getVideoId().equals(e.getVideoId())))
+                    .collect(Collectors.toList());
+
+            if (CollectionUtils.isNotEmpty(addVideoList)) {
+
                 // 通过历史中的第一课的数据来构建
-                Optional<QwSopTempDay> first = dayList.stream().filter(e -> e.getTempId().equals(temp.getId())).findFirst();
+                Optional<QwSopTempDay> first = dayList.stream().filter(e -> e.getTempId().equals(sopTemp.getId())).findFirst();
                 if (!first.isPresent()) {
-                    break;
+                    return;
                 }
                 QwSopTempDay qwSopTempDay = first.get();
+
                 // 构造timeList timeDesc time
-                temp.setTime(LocalTime.now());
+                sopTemp.setTime(LocalTime.now());
 
-                temp.setTimeList(rulesList.stream()
-                        .filter(e -> e.getTempId().equals(temp.getId()) && Objects.equals(e.getIsOfficial(), "0")
+                sopTemp.setTimeList(tempRulesList.stream()
+                        .filter(e -> e.getTempId().equals(sopTemp.getId()) && Objects.equals(e.getIsOfficial(), "0")
                                 && Objects.equals(e.getDayId(), qwSopTempDay.getId())
                         ).map(QwSopTempRules::getTime)
                         .collect(Collectors.toList()));
 
-                temp.setTimeDesc(contentList.stream().filter(e -> e.getTempId().equals(temp.getId())
+                sopTemp.setTimeDesc(contentList.stream().filter(e -> e.getTempId().equals(sopTemp.getId())
                                 && Objects.isNull(e.getIsBindUrl())
                                 && Objects.equals(qwSopTempDay.getId(), e.getDayId())
                         )
                         .map(m -> JSONObject.parseObject(m.getContent()).getString("value")).collect(Collectors.toList()));
-                temp.setProject(fsUserCourse.getProject());
-                temp.setCourseId(courseId);
-                temp.setOpenOfficial("1");
-                qwSopTempMapper.updateQwSopTemp(temp);
-                createSopTempRules(temp, addVideoList, fsUserCourse);
-            }
-        }
+                sopTemp.setProject(fsUserCourse.getProject());
+                sopTemp.setCourseId(courseId);
+                sopTemp.setOpenOfficial("1");
+
+                qwSopTempMapper.updateQwSopTemp(sopTemp);
+
+                createSopTempRules(sopTemp, addVideoList, fsUserCourse);
+
+                // 更新排序
+                List<QwSopTempRules> newTempRulesList = qwSopTempRulesService.listByCourseIdAndTempId(courseId, teId);
+                // 整理排序
+                Long[] dayIdArray = newTempRulesList.stream().filter(e -> e.getTempId().equals(sopTemp.getId())).sorted(Comparator.comparing(a -> videoSortMap.get(a.getVideoId())))
+                        .map(QwSopTempRules::getDayId).distinct().toArray(Long[]::new);
+                for (int i = 0; i < dayIdArray.length; i++) {
+                    qwSopTempDayService.updateByWrapper(new UpdateWrapper<QwSopTempDay>()
+                            .eq("id", dayIdArray[i])
+                            .set("sorts", i + 1)
+                            .set("name", "第" + (i + 1) + "天")
+                            .set("day_num", i + 1)
+                    );
+                }
 
-        // 整理排序
-        List<QwSopTempRules> afterRuleList = qwSopTempRulesService.listByCourseId(courseId);
-        for (QwSopTemp temp : tempList) {
-            Long[] dayIdArray = afterRuleList.stream().filter(e -> e.getTempId().equals(temp.getId())).sorted(Comparator.comparing(a -> videoSortMap.get(a.getVideoId())))
-                    .map(QwSopTempRules::getDayId).distinct().toArray(Long[]::new);
-            for (int i = 0; i < dayIdArray.length; i++) {
-                qwSopTempDayService.updateByWrapper(new UpdateWrapper<QwSopTempDay>()
-                        .eq("id", dayIdArray[i])
-                        .set("sorts", i + 1)
-                        .set("name", "第" + (i + 1) + "天")
-                        .set("day_num", i + 1)
-                );
             }
-        }
+        });
+
+//        FsUserCourse fsUserCourse = fsUserCourseMapper.selectFsUserCourseByCourseId(courseId);
+//        List<FsUserCourseVideo> videoList = fsUserCourseVideoMapper.selectVideoByCourseId(fsUserCourse.getCourseId());
+//        List<QwSopTemp> tempList = qwSopTempMapper.selectListByIds(tempIds);
+//        List<QwSopTempContent> contentList = qwSopTempContentService.listByTempIds(tempIds);
+//        List<QwSopTempDay> dayList = qwSopTempDayService.listByTempIds(new LambdaQueryWrapper<QwSopTempDay>().in(QwSopTempDay::getTempId, tempIds));
+//        List<Long> videoIdList = videoList.stream().map(FsUserCourseVideo::getVideoId).collect(Collectors.toList());
+//        // videoList转Map key 为videoId value 为 courseSort
+//        Map<Long, Long> videoSortMap = videoList.stream().collect(Collectors.toMap(FsUserCourseVideo::getVideoId, FsUserCourseVideo::getCourseSort));
+
+        // 将课程中已删除的视频在规则和日期中删除
+//        Set<Long> dayIdList = rulesList.stream().filter(e -> !videoIdList.contains(e.getVideoId())).map(QwSopTempRules::getDayId).collect(Collectors.toSet());
+//        if (CollectionUtils.isNotEmpty(dayIdList)) {
+//            qwSopTempDayService.removeByWrapper(new LambdaQueryWrapper<QwSopTempDay>().in(QwSopTempDay::getId, dayIdList));
+//            qwSopTempRulesService.removeByWrapper(new LambdaQueryWrapper<QwSopTempRules>().in(QwSopTempRules::getDayId, dayIdList));
+//            qwSopTempContentService.removeByWrapper(new LambdaQueryWrapper<QwSopTempContent>().in(QwSopTempContent::getDayId, dayIdList));
+//        }
+
+        // 需要添加的课程视频
+//        List<FsUserCourseVideo> addVideoList = videoList.stream()
+//                .filter(e -> rulesList.stream().noneMatch(f -> f.getVideoId().equals(e.getVideoId()))).collect(Collectors.toList());
+
+//        if (CollectionUtils.isNotEmpty(addVideoList)) {
+//            for (QwSopTemp temp : tempList) {
+//                // 通过历史中的第一课的数据来构建
+//                Optional<QwSopTempDay> first = dayList.stream().filter(e -> e.getTempId().equals(temp.getId())).findFirst();
+//                if (!first.isPresent()) {
+//                    break;
+//                }
+//                QwSopTempDay qwSopTempDay = first.get();
+//                // 构造timeList timeDesc time
+//                temp.setTime(LocalTime.now());
+//
+//                temp.setTimeList(rulesList.stream()
+//                        .filter(e -> e.getTempId().equals(temp.getId()) && Objects.equals(e.getIsOfficial(), "0")
+//                                && Objects.equals(e.getDayId(), qwSopTempDay.getId())
+//                        ).map(QwSopTempRules::getTime)
+//                        .collect(Collectors.toList()));
+//
+//                temp.setTimeDesc(contentList.stream().filter(e -> e.getTempId().equals(temp.getId())
+//                                && Objects.isNull(e.getIsBindUrl())
+//                                && Objects.equals(qwSopTempDay.getId(), e.getDayId())
+//                        )
+//                        .map(m -> JSONObject.parseObject(m.getContent()).getString("value")).collect(Collectors.toList()));
+//                temp.setProject(fsUserCourse.getProject());
+//                temp.setCourseId(courseId);
+//                temp.setOpenOfficial("1");
+//                qwSopTempMapper.updateQwSopTemp(temp);
+//                createSopTempRules(temp, addVideoList, fsUserCourse);
+//            }
+//        }
+
+//        // 整理排序
+//        List<QwSopTempRules> afterRuleList = qwSopTempRulesService.listByCourseId(courseId);
+//        for (QwSopTemp temp : tempList) {
+//            Long[] dayIdArray = afterRuleList.stream().filter(e -> e.getTempId().equals(temp.getId())).sorted(Comparator.comparing(a -> videoSortMap.get(a.getVideoId())))
+//                    .map(QwSopTempRules::getDayId).distinct().toArray(Long[]::new);
+//            for (int i = 0; i < dayIdArray.length; i++) {
+//                qwSopTempDayService.updateByWrapper(new UpdateWrapper<QwSopTempDay>()
+//                        .eq("id", dayIdArray[i])
+//                        .set("sorts", i + 1)
+//                        .set("name", "第" + (i + 1) + "天")
+//                        .set("day_num", i + 1)
+//                );
+//            }
+//        }
     }
 
 }

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

@@ -92,7 +92,7 @@ headerImg:
   imgUrl: https://ddgy-1323137866.cos.ap-chongqing.myqcloud.com/fs/20251010/ddgy.jpg
 ipad:
   ipadUrl: http://ipad.dingdangtcm.cn
-  aiApi: http://
+  aiApi: http://49.232.181.28:3000/api
   voiceApi:
   commonApi:
 wx_miniapp_temp:

+ 3 - 1
fs-service/src/main/resources/application-druid-cfryt.yml

@@ -168,5 +168,7 @@ openIM:
 im:
     type: OPENIM
 #是否为新商户,新商户不走mpOpenId
-isNewWxMerchant: true
+isNewWxMerchant: false
+
+enableRedPackAccount: 0
 

+ 93 - 0
fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml

@@ -1027,4 +1027,97 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         order by fcwl.create_time desc
     </select>
 
+
+    <select id="selectFsCourseWatchLogStatisticsListVO_COUNT"
+            resultType="java.lang.Long">
+        SELECT COUNT(*) FROM (
+        SELECT
+        o.video_id,
+        <!-- 用choose保证sendType逻辑互斥,避免GROUP BY字段缺失 -->
+        <choose>
+            <when test="sendType != 1">
+                o.qw_user_id,
+            </when>
+            <when test="sendType == 1">
+                o.company_user_id,
+            </when>
+            <!-- sendType为null时兜底,避免空指针 -->
+            <otherwise>
+                o.qw_user_id,
+            </otherwise>
+        </choose>
+        DATE(o.create_time) create_time
+        FROM fs_course_watch_log o
+        <!-- 动态关联qw_user表 -->
+        <if test="sendType != 1">
+            LEFT JOIN qw_user qu ON qu.id = o.qw_user_id
+        </if>
+        LEFT JOIN fs_user_course_video v ON v.video_id = o.video_id
+        LEFT JOIN fs_user_course uc ON uc.course_id = v.course_id
+        <!-- 动态关联company_user表 -->
+        <if test="sendType == 1">
+            LEFT JOIN company_user cu ON cu.user_id = o.company_user_id
+        </if>
+        WHERE o.company_id = #{companyId}
+        <!-- 发送类型筛选 -->
+        <if test="sendType != null">
+            AND send_type = #{sendType}
+        </if>
+        <!-- 开始时间筛选:区分String/Date类型,避免类型比较异常 -->
+        <if test="sTime != null">
+            <choose>
+                <!-- sTime是String类型(yyyy-MM-dd) -->
+                <when test="sTime instanceof java.lang.String and sTime.trim() != ''">
+                    AND o.create_time &gt;= STR_TO_DATE(#{sTime}, '%Y-%m-%d')
+                </when>
+                <!-- sTime是Date类型 -->
+                <otherwise>
+                    AND o.create_time &gt;= #{sTime}
+                </otherwise>
+            </choose>
+        </if>
+        <!-- 结束时间筛选:区分String/Date类型 -->
+        <if test="eTime != null">
+            <choose>
+                <when test="eTime instanceof java.lang.String and eTime.trim() != ''">
+                    AND o.create_time &lt; DATE_ADD(STR_TO_DATE(#{eTime}, '%Y-%m-%d'), INTERVAL 1 DAY)
+                </when>
+                <otherwise>
+                    AND o.create_time &lt; DATE_ADD(#{eTime}, INTERVAL 1 DAY)
+                </otherwise>
+            </choose>
+        </if>
+        <!-- 昵称筛选:sendType!=1时关联qw_user -->
+        <if test="sendType != 1 and nickName != null and nickName.trim() != ''">
+            AND qu.qw_user_name LIKE CONCAT(#{nickName}, '%')
+        </if>
+        <!-- 昵称筛选:sendType==1时关联company_user -->
+        <if test="sendType == 1 and nickName != null and nickName.trim() != ''">
+            AND cu.nick_name LIKE CONCAT(#{nickName}, '%')
+        </if>
+        <!-- 课程ID筛选:加>0判断,避免null值拼接 -->
+        <if test="courseId != null and courseId > 0">
+            AND o.course_id = #{courseId}
+        </if>
+        <!-- 视频ID筛选:加>0判断 -->
+        <if test="videoId != null and videoId > 0">
+            AND o.video_id = #{videoId}
+        </if>
+        <!-- 分组条件:与子查询字段一致 -->
+        GROUP BY
+        o.video_id,
+        <choose>
+            <when test="sendType != 1">
+                o.qw_user_id,
+            </when>
+            <when test="sendType == 1">
+                o.company_user_id,
+            </when>
+            <otherwise>
+                o.qw_user_id,
+            </otherwise>
+        </choose>
+        DATE(o.create_time)
+        ) AS t
+    </select>
 </mapper>

+ 1 - 0
fs-service/src/main/resources/mapper/hisStore/FsUserAddressScrmMapper.xml

@@ -6,6 +6,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <resultMap type="FsUserAddressScrm" id="FsUserAddressResult">
         <result property="id"    column="address_id"    />
+        <result property="addressId"    column="address_id"    />
         <result property="userId"    column="user_id"    />
         <result property="realName"    column="real_name"    />
         <result property="phone"    column="phone"    />

+ 9 - 1
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -89,7 +89,15 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 
     <select id="selectQwExternalContactByIds" resultType="com.fs.qw.domain.QwExternalContact">
         select * from qw_external_contact
-        where id in
+        where  id in
+        <foreach collection="ids" item="id" open="(" separator="," close=")">
+            #{id}
+        </foreach>
+    </select>
+
+    <select id="selectQwExternalContactByIdsStatus" resultType="com.fs.qw.domain.QwExternalContact">
+        select * from qw_external_contact
+        where status !=3 and id in
         <foreach collection="ids" item="id" open="(" separator="," close=")">
             #{id}
         </foreach>

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

@@ -66,6 +66,21 @@ public class IntegralController extends  AppBaseController {
     @Cacheable(value = "getIntegralGoodsById", key = "#goodsId")
     public R getIntegralGoodsById(@RequestParam("goodsId")Long goodsId, HttpServletRequest request){
         FsIntegralGoods goods=goodsService.selectFsIntegralGoodsByGoodsId(goodsId);
+        // 填充默认值
+        if (goods != null) {
+            if (goods.getImages() == null) {
+                goods.setImages("");
+            }
+            if (goods.getNum() == null) {
+                goods.setNum(0);
+            }
+            if (goods.getRemark() == null) {
+                goods.setRemark("");
+            }
+            if (goods.getSearchValue() == null) {
+                goods.setSearchValue("");
+            }
+        }
         return R.ok().put("data",goods);
     }
 

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/controller/store/AddressScrmController.java

@@ -113,7 +113,7 @@ public class AddressScrmController extends AppBaseController {
         FsUserAddressScrm userAddress=new FsUserAddressScrm();
         BeanUtil.copyProperties(address, userAddress);
         addressService.insertFsUserAddress(userAddress);
-        return R.ok("操作成功");
+        return R.ok("操作成功").put("addressId", userAddress.getId());
     }
 
     @Login