Bläddra i källkod

Merge remote-tracking branch 'origin/master'

yjwang 1 vecka sedan
förälder
incheckning
23a98ee4ba
25 ändrade filer med 589 tillägg och 25 borttagningar
  1. 11 0
      fs-admin/src/main/java/com/fs/his/task/Task.java
  2. 2 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreUserEndCategoryScrmController.java
  3. 1 1
      fs-admin/src/main/java/com/fs/third/controller/WeizouController.java
  4. 65 0
      fs-ipad-task/src/main/java/com/fs/app/controller/CommonController.java
  5. 1 0
      fs-service/src/main/java/com/fs/erp/utils/WeizouApiClient.java
  6. 5 0
      fs-service/src/main/java/com/fs/his/service/IFsStoreOrderService.java
  7. 123 0
      fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java
  8. 2 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductUserEndCategoryMapper.java
  9. 2 2
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  10. 2 2
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreUserEndCategoryScrmService.java
  11. 4 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  12. 5 5
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreUserEndCategoryScrmServiceImpl.java
  13. 2 0
      fs-service/src/main/java/com/fs/statis/mapper/ConsumptionBalanceMapper.java
  14. 10 1
      fs-service/src/main/java/com/fs/statis/service/impl/StatisticsCompanyServiceImpl.java
  15. 9 2
      fs-service/src/main/java/com/fs/statis/service/impl/StatisticsServiceImpl.java
  16. 1 0
      fs-service/src/main/java/com/fs/wxwork/utils/WxWorkHttpUtilNew.java
  17. 1 0
      fs-service/src/main/resources/application-config-druid-xcsw.yml
  18. 163 0
      fs-service/src/main/resources/application-druid-jsbk.yml
  19. 5 4
      fs-service/src/main/resources/application-druid-zlwh-test.yml
  20. 2 0
      fs-service/src/main/resources/application-druid-zlwh.yml
  21. 6 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml
  22. 6 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductUserEndCategoryMapper.xml
  23. 13 0
      fs-service/src/main/resources/mapper/statis/ConsumptionBalanceMapper.xml
  24. 143 0
      fs-user-app/src/main/java/com/fs/app/controller/CourseH5Controller.java
  25. 5 3
      fs-user-app/src/main/java/com/fs/app/controller/store/IndexScrmController.java

+ 11 - 0
fs-admin/src/main/java/com/fs/his/task/Task.java

@@ -916,6 +916,17 @@ public class Task {
         }
     }
 
+    public void CreateWeizouErpPush() {
+        List<Long> omsList = fsStoreOrderMapper.selectFsStoreOrderNoCreateOms();
+        logger.info("推送订单id====>{}", omsList);
+        for (Long l : omsList) {
+            try {
+                fsStoreOrderService.weizouPush(l);
+            } catch (Exception e) {
+                logger.error("推送订单异常:", e);
+            }
+        }
+    }
     public void CreateOmsAndHis() {
         List<Long> omsList = fsStoreOrderMapper.selectFsStoreOrderNoCreateOms();
         logger.info("推送订单id====>{}", omsList);

+ 2 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreUserEndCategoryScrmController.java

@@ -47,10 +47,11 @@ public class FsStoreUserEndCategoryScrmController extends BaseController {
     @GetMapping("/products")
     public TableDataInfo listProductsByCategoryId(
             @RequestParam Long id,
+            @RequestParam(value = "keyword", required = false) String keyword,
             @RequestParam(defaultValue = "1") Integer pageNum,
             @RequestParam(defaultValue = "10") Integer pageSize) {
         startPage();
-        List<FsStoreUserEndCategoryProductVO> list = userEndCategoryService.listProductsByCategoryId(id);
+        List<FsStoreUserEndCategoryProductVO> list = userEndCategoryService.listProductsByCategoryId(id,keyword);
         return getDataTable(list);
     }
 

+ 1 - 1
fs-admin/src/main/java/com/fs/third/controller/WeizouController.java

@@ -51,6 +51,6 @@ public class WeizouController extends BaseController {
         }
         fsStoreOrder.setDeliveryName((String) map.get("deliveryName"));
 
-        return toAjax(fsStoreOrderService.sendGoods(fsStoreOrder, "微走发货同步"));
+        return toAjax(fsStoreOrderService.sendGoodsWeizou(fsStoreOrder, "微走发货同步"));
     }
 }

+ 65 - 0
fs-ipad-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -0,0 +1,65 @@
+package com.fs.app.controller;
+
+
+import com.baidu.dev2.thirdparty.swagger.annotations.Api;
+import com.fs.app.service.IpadSendServer;
+import com.fs.app.task.SendSmsMsg;
+import com.fs.common.core.redis.RedisCacheT;
+import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.qw.mapper.QwPushCountMapper;
+import com.fs.qw.mapper.QwUserMapper;
+import com.fs.qw.service.impl.AsyncSopTestService;
+import com.fs.sop.mapper.QwSopLogsMapper;
+import com.fs.sop.service.IQwSopLogsService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Api("公共接口")
+@RestController
+@RequestMapping(value="/app/common")
+@Slf4j
+public class CommonController {
+
+    private final SendSmsMsg sendSmsMsg;
+    @Autowired
+    private QwUserMapper qwUserMapper;
+    @Autowired
+    private QwSopLogsMapper qwSopLogsMapper;
+    @Autowired
+    private IQwSopLogsService qwSopLogsService;
+    @Autowired
+    private AsyncSopTestService asyncSopTestService;
+
+    @Autowired
+    private RedisCacheT<Long> redisCache;
+    @Autowired
+    private QwPushCountMapper qwPushCountMapper;
+
+
+    @Autowired
+    private IFsCourseWatchLogService watchLogService;
+
+    @Autowired
+    private IpadSendServer sendServer;
+
+    private final Map<Long, Long> qwMap = new ConcurrentHashMap<>();
+
+    @Autowired
+    public CommonController(SendSmsMsg sendSmsMsg) {
+        this.sendSmsMsg = sendSmsMsg;
+    }
+
+
+    @RequestMapping("/startSendSmsMsg/{num}")
+    public void startSendSmsMsg(@PathVariable String  num) {
+        log.info("开始启动定时任务");
+        sendSmsMsg.sendSms(num);
+    }
+
+}

+ 1 - 0
fs-service/src/main/java/com/fs/erp/utils/WeizouApiClient.java

@@ -169,6 +169,7 @@ public class WeizouApiClient {
 
         try (Response response = httpClient.newCall(request).execute()) {
             if (!response.isSuccessful()) {
+                log.error("订单推送失败:"+response.code()+response.message());
                 throw new IOException("订单推送失败,HTTP状态码: " + response.code());
             }
             return response.body().string();

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

@@ -1,5 +1,6 @@
 package com.fs.his.service;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.text.ParseException;
 import java.util.List;
@@ -283,4 +284,8 @@ public interface IFsStoreOrderService
     FsStoreOrder confirmOrder(FsPackageOrder packageOrder,Long doctorId);
 
     List<FsStoreOrder> selectOutTimeOrderList(Integer unPayTime);
+
+    void weizouPush(Long l) throws IOException;
+
+    int sendGoodsWeizou(FsStoreOrder fsStoreOrder, String opeName);
 }

+ 123 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsStoreOrderServiceImpl.java

@@ -34,6 +34,7 @@ import com.fs.erp.domain.*;
 import com.fs.erp.dto.*;
 import com.fs.erp.dto.df.*;
 import com.fs.erp.service.IErpOrderService;
+import com.fs.erp.utils.WeizouApiClient;
 import com.fs.event.*;
 import com.fs.gtPush.service.uniPush2Service;
 import com.fs.his.config.FsSysConfig;
@@ -119,6 +120,7 @@ import java.sql.Timestamp;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
 import java.util.*;
+import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import static com.fs.his.utils.PhoneUtil.decryptPhone;
@@ -313,6 +315,8 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
     private Map<Integer, IErpOrderService> erpServiceMap;
     @Autowired
     private IFsStoreOrderScrmService orderScrmService;
+    @Autowired
+    private IFsStoreProductService fsStoreProductService;
     @PostConstruct
     public void initErpServiceMap() {
         erpServiceMap = new HashMap<>();
@@ -4543,4 +4547,123 @@ public class FsStoreOrderServiceImpl implements IFsStoreOrderService {
         return fsStoreOrderMapper.selectOutTimeOrderList(unPayTime);
     }
 
+    @Override
+    public void weizouPush(Long l) throws IOException {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderId(l);
+        if (order.getShippingType() != null && order.getShippingType() == 2)return;
+        WeizouApiPushOrderParam param = new WeizouApiPushOrderParam();
+        param.setPaid(order.getIsPay()).setRealName(order.getUserName()).setPhone(order.getUserPhone())
+                .setFreightPrice(order.getFreightPrice()).setExtendOrderId(order.getOrderId().toString())
+                .setPayType(order.getPayType()==1?"02":"04")
+                .setPaymentType(order.getPayType()==1?"01":"02").setDeliveryType("顺丰快递")
+        ;
+        //商品
+        FsStoreOrderItem itemMap = new FsStoreOrderItem();
+        itemMap.setOrderId(order.getOrderId());
+        List<FsStoreOrderItem> orderItems = storeOrderItemService.selectFsStoreOrderItemList(itemMap);//查订单商品
+        ArrayList<WeizouOrderEntry> orders = new ArrayList<>();
+        List<Long> productIds = orderItems.stream().map(FsStoreOrderItem::getProductId).collect(Collectors.toList());
+        List<FsStoreProduct> fsStoreProducts = fsStoreProductService.getStoreProductInProductIds(productIds);
+        Map<Long, FsStoreProduct> productMap = fsStoreProducts.stream().collect(Collectors.toMap(FsStoreProduct::getProductId,Function.identity()));
+        orderItems.forEach(item -> {
+            WeizouOrderEntry entry = new WeizouOrderEntry();
+            FsStoreProduct fsStoreProduct = productMap.get(item.getProductId());
+            entry.setSkuNumber(fsStoreProduct.getBarCode()).setRetailPrice(fsStoreProduct.getPrice())
+                    .setTaxPrice(fsStoreProduct.getPrice()).setTaxTotalAmount(fsStoreProduct.getPrice().multiply(new BigDecimal(item.getNum())))
+                    .setCount(Integer.parseInt(item.getNum().toString()));
+            orders.add(entry);
+        });
+        //设置地址-省市区
+        String[] address = order.getUserAddress().split(" ");
+        try{
+            if (address.length < 3) {
+                String kdnAddress = fsUserAddressService.getKdnAddress(order.getUserAddress());
+                Map<String, Object> addDAta = (Map<String, Object>) JSON.parse(kdnAddress);
+                Map<String, String> add = (Map<String, String>) addDAta.get("Data");
+                param.setProvince(add.get("ProvinceName")).setCity(add.get("CityName"))
+                        .setDistrict(add.get("ExpAreaName"))
+                        .setUserAddress(add.get("StreetName") + add.get("Address"));
+
+            } else {
+                param.setProvince(address[0]).setCity(address[1]).setDistrict(address[2]);
+                //处理地址多空隔问题
+                if (address.length > 3) {
+                    StringBuffer addrs = new StringBuffer();
+                    for (int i = 3; i < address.length; i++) {
+                        addrs.append(address[i]);
+                    }
+                    param.setUserAddress(addrs.toString());
+                } else {
+                    param.setUserAddress(address[2]);
+                }
+            }
+        }catch (Exception e){
+            log.error("地址错误:{}",e);
+            throw new CustomException("地址格式不对请正确写入详细地址!!");
+        }
+        param.setEntryList(orders);
+        String s = WeizouApiClient.pushOrder(param);
+        log.info("微走推送结果:{}",s);
+    }
+
+    @Override
+    public int sendGoodsWeizou(FsStoreOrder fsStoreOrder, String opeName) {
+        FsStoreOrder order = fsStoreOrderMapper.selectFsStoreOrderByOrderId(fsStoreOrder.getOrderId());
+        if (order == null) throw new CustomException("订单不存在");
+        if (order.getStatus() == 2){
+            FsStoreOrder o1 = new FsStoreOrder();
+            o1.setOrderId(fsStoreOrder.getOrderId());
+            o1.setStatus(3);
+            o1.setUpdateTime(new DateTime());
+            o1.setDeliveryCode(fsStoreOrder.getDeliveryCode());
+            o1.setDeliveryName(fsStoreOrder.getDeliveryName());
+            o1.setDeliverySn(fsStoreOrder.getDeliverySn());
+            SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String dateString = formatter.format(new Date());
+            o1.setDeliveryTime(dateString);
+            int i = fsStoreOrderMapper.updateFsStoreOrder(o1);
+            if (order.getCompanyId() != null) {
+                companyService.subtractCompanyMoney(order);
+            }
+            FsStoreOrderLogs Logs = new FsStoreOrderLogs();
+            Logs.setChangeMessage(opeName+" 订单发货");
+            Logs.setOrderId(fsStoreOrder.getOrderId());
+            Logs.setChangeTime(new DateTime());
+            Logs.setChangeType("delivery_goods");
+            Optional.ofNullable(fsStoreOrder.getOperator()).ifPresent(Logs::setOperator);
+            fsStoreOrderLogsMapper.insertFsStoreOrderLogs(Logs);
+            String lastFourNumber = "";
+            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = order.getUserPhone();
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+            expressService.subscribeEspress(order.getOrderCode(), fsStoreOrder.getDeliveryCode(), fsStoreOrder.getDeliverySn(), lastFourNumber);
+            return i;
+        }else {
+            log.info("微走修改快递单号",fsStoreOrder.getDeliverySn());
+            FsStoreOrder o1 = new FsStoreOrder();
+            o1.setOrderId(fsStoreOrder.getOrderId());
+            o1.setDeliveryCode(fsStoreOrder.getDeliveryCode());
+            int i = fsStoreOrderMapper.updateFsStoreOrder(o1);
+            FsStoreOrderLogs Logs = new FsStoreOrderLogs();
+            Logs.setChangeMessage(opeName+"订单单号更新");
+            Logs.setOrderId(fsStoreOrder.getOrderId());
+            Logs.setChangeTime(new DateTime());
+            Logs.setChangeType("delivery_goods");
+            Logs.setOperator("微走快递单号更新");
+            fsStoreOrderLogsMapper.insertFsStoreOrderLogs(Logs);
+            String lastFourNumber = "";
+            if (order.getDeliveryCode().equals(ShipperCodeEnum.SF.getValue())) {
+                lastFourNumber = order.getUserPhone();
+                if (lastFourNumber.length() == 11) {
+                    lastFourNumber = StrUtil.sub(lastFourNumber, lastFourNumber.length(), -4);
+                }
+            }
+            expressService.subscribeEspress(order.getOrderCode(), fsStoreOrder.getDeliveryCode(), fsStoreOrder.getDeliverySn(), lastFourNumber);
+            return i;
+        }
+
+    }
 }

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

@@ -20,8 +20,8 @@ public interface FsStoreProductUserEndCategoryMapper {
     int deleteByCategoryIds(@Param("categoryIds") Long[] categoryIds);
 
     /** 按用户端分类ID查询去重后的商品ID列表(用于分页,配合 PageHelper) */
-    List<Long> selectDistinctProductIdsByCategoryId(@Param("categoryId") Long categoryId);
+    List<Long> selectDistinctProductIdsByCategoryId(@Param("categoryId") Long categoryId, @Param("keyword") String keyword);
 
     /** 关联表内全部去重商品ID(不按分类,配合 PageHelper 用于「全部」) */
-    List<Long> selectDistinctProductIds();
+    List<Long> selectDistinctProductIds(@Param("keyword") String keyword);
 }

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

@@ -105,10 +105,10 @@ public interface IFsStoreProductScrmService
     List<FsStoreProductListQueryVO> selectFsStoreProductHotQuery(int count, String appId);
 
     /** 绿色有机分页(与 selectFsStoreProductNewQuery 条件一致,支持分页) */
-    List<FsStoreProductListQueryVO> selectFsStoreProductNewQueryPage(int pageNum, int pageSize, String appId);
+    List<FsStoreProductListQueryVO> selectFsStoreProductNewQueryPage(int pageNum, int pageSize, String appId, String keyword);
 
     /** 上新推荐分页(与 selectFsStoreProductHotQuery 条件一致,支持分页) */
-    List<FsStoreProductListQueryVO> selectFsStoreProductHotQueryPage(int pageNum, int pageSize, String appId);
+    List<FsStoreProductListQueryVO> selectFsStoreProductHotQueryPage(int pageNum, int pageSize, String appId, String keyword);
 
     List<FsStoreProductListQueryVO> selectFsStoreProductGoodQuery(int count);
 

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

@@ -24,10 +24,10 @@ public interface IFsStoreUserEndCategoryScrmService {
     List<FsStoreUserEndCategoryScrm> selectTop8ByPosition(Long storeId, Integer position);
 
     /** 按用户端分类ID分页查询关联商品(去重商品ID分页,再查商品简表+标签并组装) */
-    List<FsStoreUserEndCategoryProductVO> listProductsByCategoryId(Long categoryId);
+    List<FsStoreUserEndCategoryProductVO> listProductsByCategoryId(Long categoryId, String keyword);
 
     /** 首页商品列表:id 为空查全部(分页商品ID后查简表+标签),id 不为空按用户端分类查;返回 list+total */
-    java.util.Map<String, Object> listProductsForApp(Long id, Integer pageNum, Integer pageSize);
+    java.util.Map<String, Object> listProductsForApp(Long id, String keyword, Integer pageNum, Integer pageSize);
 
     int insert(FsStoreUserEndCategoryScrm entity);
 

+ 4 - 2
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -1177,19 +1177,21 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     }
 
     @Override
-    public List<FsStoreProductListQueryVO> selectFsStoreProductNewQueryPage(int pageNum, int pageSize, String appId) {
+    public List<FsStoreProductListQueryVO> selectFsStoreProductNewQueryPage(int pageNum, int pageSize, String appId, String keyword) {
         HashMap<String, Object> map = new HashMap<>();
         map.put("config", medicalMallConfig);
         map.put("appId", appId);
+        map.put("keyword", keyword);
         com.github.pagehelper.PageHelper.startPage(pageNum, pageSize);
         return fsStoreProductMapper.selectFsStoreProductNewQueryPage(map);
     }
 
     @Override
-    public List<FsStoreProductListQueryVO> selectFsStoreProductHotQueryPage(int pageNum, int pageSize, String appId) {
+    public List<FsStoreProductListQueryVO> selectFsStoreProductHotQueryPage(int pageNum, int pageSize, String appId, String keyword) {
         HashMap<String, Object> map = new HashMap<>();
         map.put("config", medicalMallConfig);
         map.put("appId", appId);
+        map.put("keyword", keyword);
         com.github.pagehelper.PageHelper.startPage(pageNum, pageSize);
         return fsStoreProductMapper.selectFsStoreProductHotQueryPage(map);
     }

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

@@ -41,9 +41,9 @@ public class FsStoreUserEndCategoryScrmServiceImpl implements IFsStoreUserEndCat
     private FsStoreProductTagRelationScrmMapper productTagRelationMapper;
 
     @Override
-    public List<FsStoreUserEndCategoryProductVO> listProductsByCategoryId(Long categoryId) {
+    public List<FsStoreUserEndCategoryProductVO> listProductsByCategoryId(Long categoryId, String keyword) {
         if (categoryId == null) return new ArrayList<>();
-        List<Long> productIds = productUserEndCategoryMapper.selectDistinctProductIdsByCategoryId(categoryId);
+        List<Long> productIds = productUserEndCategoryMapper.selectDistinctProductIdsByCategoryId(categoryId, keyword);
         if (productIds == null || productIds.isEmpty()) return new ArrayList<>();
         List<FsStoreProductScrm> products = fsStoreProductScrmMapper.getStoreProductInProductIds(productIds);
         Map<Long, FsStoreProductScrm> productMap = products.stream().collect(Collectors.toMap(FsStoreProductScrm::getProductId, p -> p, (a, b) -> a));
@@ -79,15 +79,15 @@ public class FsStoreUserEndCategoryScrmServiceImpl implements IFsStoreUserEndCat
     }
 
     @Override
-    public Map<String, Object> listProductsForApp(Long id, Integer pageNum, Integer pageSize) {
+    public Map<String, Object> listProductsForApp(Long id, String keyword, Integer pageNum, Integer pageSize) {
         Map<String, Object> out = new HashMap<>();
         out.put("list", new ArrayList<FsStoreUserEndCategoryProductVO>());
         out.put("total", 0L);
         if (pageNum == null || pageSize == null || pageSize <= 0) return out;
         PageHelper.startPage(pageNum, pageSize);
         List<Long> productIds = (id != null && id != 0L)
-                ? productUserEndCategoryMapper.selectDistinctProductIdsByCategoryId(id)
-                : productUserEndCategoryMapper.selectDistinctProductIds();
+                ? productUserEndCategoryMapper.selectDistinctProductIdsByCategoryId(id, keyword)
+                : productUserEndCategoryMapper.selectDistinctProductIds(keyword);
         long total = productIds instanceof Page ? ((Page<?>) productIds).getTotal() : (productIds != null ? productIds.size() : 0);
         if (productIds == null || productIds.isEmpty()) {
             out.put("total", total);

+ 2 - 0
fs-service/src/main/java/com/fs/statis/mapper/ConsumptionBalanceMapper.java

@@ -141,4 +141,6 @@ public interface ConsumptionBalanceMapper {
     BigDecimal getCurrentBalanceCompanyId(@Param("companyId") Long companyId);
 
     Long smsBalanceCompany(@Param("companyId") Long companyId);
+
+    Long selectFsCourseTrafficLogCount(AnalysisPreviewQueryDTO param);
 }

+ 10 - 1
fs-service/src/main/java/com/fs/statis/service/impl/StatisticsCompanyServiceImpl.java

@@ -29,6 +29,7 @@ import com.hc.openapi.tool.util.StringUtils;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -83,6 +84,9 @@ public class StatisticsCompanyServiceImpl implements IStatisticsCompanyService {
 
     @Autowired
     private QwUserMapper qwUserMapper;
+
+    @Value("${cloud_host.company_name}")
+    private String signProjectName;
     @Override
     public void dataOverviewTask() {
         List<OptionsVO> optionsVOS = companyService.selectAllCompanyList(null);
@@ -882,7 +886,12 @@ public class StatisticsCompanyServiceImpl implements IStatisticsCompanyService {
             dto.setCompletedRate("0");
         }
 
-        Long watchCount = consumptionBalanceMapper.queryWatchCount(param);
+        Long watchCount = null;
+        if("泽林文化".equals(signProjectName)){
+            watchCount =   consumptionBalanceMapper.selectFsCourseTrafficLogCount(param);
+        }else {
+            watchCount = consumptionBalanceMapper.queryWatchCount(param);
+        }
         Long completedCount = consumptionBalanceMapper.queryCompletedCount(param);
 
         if(watchCount == null){

+ 9 - 2
fs-service/src/main/java/com/fs/statis/service/impl/StatisticsServiceImpl.java

@@ -34,6 +34,7 @@ import com.hc.openapi.tool.util.ObjectUtils;
 import com.hc.openapi.tool.util.StringUtils;
 import org.apache.http.util.Asserts;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
@@ -89,7 +90,8 @@ public class StatisticsServiceImpl implements IStatisticsService {
     @Autowired
     private IQwIpadServerService qwIpadServerService;
 
-
+    @Value("${cloud_host.company_name}")
+    private String signProjectName;
 
     @Override
     public void dataOverviewTask() {
@@ -792,7 +794,12 @@ public class StatisticsServiceImpl implements IStatisticsService {
             dto.setCompletedRate("0");
         }
 
-        Long watchCount = consumptionBalanceMapper.queryWatchCount(param);
+        Long watchCount = null;
+        if("泽林文化".equals(signProjectName)){
+            watchCount =   consumptionBalanceMapper.selectFsCourseTrafficLogCount(param);
+        }else {
+            watchCount = consumptionBalanceMapper.queryWatchCount(param);
+        }
         Long completedCount = consumptionBalanceMapper.queryCompletedCount(param);
 
         if(watchCount == null){

+ 1 - 0
fs-service/src/main/java/com/fs/wxwork/utils/WxWorkHttpUtilNew.java

@@ -89,6 +89,7 @@ public class WxWorkHttpUtilNew {
     public static <T> T postWithType(String url, Object jsonBody, TypeReference<T> type, Long serverId) {
         String json = JSON.toJSONString(jsonBody);
         String post = post(url, json, null, serverId);
+        log.info("请求服务器地址:{},请求参数:{},返回数据:{},请求时间:{}", url, json, post, LocalDateTime.now());
         WxWorkResponseCodeDTO respone = JSON.parseObject(post, WxWorkResponseCodeDTO.class);
         if(respone.getErrcode() != 0){
             log.error("请求服务器地址:{},请求参数:{},返回数据:{},请求时间:{}", url, json, JSON.toJSONString(respone), LocalDateTime.now());

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

@@ -96,6 +96,7 @@ ipad:
   ipadUrl: http://ipad.zgfjfzxhxc.com
   aiApi:
   voiceApi:
+  wxIpadUrl:
   commonApi: http://192.168.0.160:7771
 wx_miniapp_temp:
   pay_order_temp_id:

+ 163 - 0
fs-service/src/main/resources/application-druid-jsbk.yml

@@ -0,0 +1,163 @@
+# 数据源配置
+spring:
+  profiles:
+    include: config-druid-jsbk,common
+  # redis 配置
+  redis:
+    host: 172.16.16.26
+    port: 6379
+    # 数据库索引
+    database: 0
+    # 密码
+    password: Ylrztek250218!3@.
+    # 连接超时时间
+    timeout: 10s
+    lettuce:
+      pool:
+        # 连接池中的最小空闲连接
+        min-idle: 0
+        # 连接池中的最大空闲连接
+        max-idle: 8
+        # 连接池的最大数据库连接数
+        max-active: 8
+        # #连接池最大阻塞等待时间(使用负值表示没有限制)
+        max-wait: -1ms
+  datasource:
+    mysql:
+      type: com.alibaba.druid.pool.DruidDataSource
+      driverClassName: com.mysql.cj.jdbc.Driver
+      druid:
+        # 主库数据源
+        master:
+          url: jdbc:mysql://172.16.16.29:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+          username: root
+          password: Ylrz_tM818782145I@
+        # 从库数据源
+        slave:
+          # 从数据源开关/默认关闭
+          url: jdbc:mysql://172.16.16.29:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+          username: root
+          password: Ylrz_tM818782145I@
+        # 初始连接数
+        initialSize: 5
+        # 最小连接池数量
+        minIdle: 10
+        # 最大连接池数量
+        maxActive: 2000
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        # 配置一个连接在池中最大生存的时间,单位是毫秒
+        maxEvictableIdleTimeMillis: 900000
+        # 配置检测连接是否有效
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        webStatFilter:
+          enabled: true
+        statViewServlet:
+          enabled: true
+          # 设置白名单,不填则允许所有访问
+          allow:
+          url-pattern: /druid/*
+          # 控制台管理用户名和密码
+          login-username: fs
+          login-password: 123456
+        filter:
+          stat:
+            enabled: true
+            # 慢SQL记录
+            log-slow-sql: true
+            slow-sql-millis: 1000
+            merge-sql: true
+          wall:
+            config:
+              multi-statement-allow: true
+    sop:
+      type: com.alibaba.druid.pool.DruidDataSource
+      driverClassName: com.mysql.cj.jdbc.Driver
+      druid:
+        # 主库数据源
+        master:
+          url: jdbc:mysql://172.16.16.29:3306/sop?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
+          username: root
+          password: Ylrz_tM818782145I@
+        # 初始连接数
+        initialSize: 5
+        # 最小连接池数量
+        minIdle: 10
+        # 最大连接池数量
+        maxActive: 200
+        # 配置获取连接等待超时的时间
+        maxWait: 60000
+        # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
+        timeBetweenEvictionRunsMillis: 60000
+        # 配置一个连接在池中最小生存的时间,单位是毫秒
+        minEvictableIdleTimeMillis: 300000
+        # 配置一个连接在池中最大生存的时间,单位是毫秒
+        maxEvictableIdleTimeMillis: 900000
+        # 配置检测连接是否有效
+        validationQuery: SELECT 1 FROM DUAL
+        testWhileIdle: true
+        testOnBorrow: false
+        testOnReturn: false
+        webStatFilter:
+          enabled: true
+        statViewServlet:
+          enabled: true
+          # 设置白名单,不填则允许所有访问
+          allow:
+          url-pattern: /druid/*
+          # 控制台管理用户名和密码
+          login-username: fs
+          login-password: 123456
+        filter:
+          stat:
+            enabled: true
+            # 慢SQL记录
+            log-slow-sql: true
+            slow-sql-millis: 1000
+            merge-sql: true
+          wall:
+            config:
+              multi-statement-allow: true
+rocketmq:
+  name-server: rmq-1243b25nj.rocketmq.gz.public.tencenttdmq.com:8080 # RocketMQ NameServer 地址
+  producer:
+    group: my-producer-group
+    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+  consumer:
+    group: voice-group
+    access-key: ak1243b25nj17d4b2dc1a03 # 替换为实际的 accessKey
+    secret-key: sk08a7ea1f9f4b0237 # 替换为实际的 secretKey
+custom:
+  token: "1o62d3YxvdHd4LEUiltnu7sK"
+  encoding-aes-key: "UJfTQ5qKTKlegjkXtp1YuzJzxeHlUKvq5GyFbERN1iU"
+  corp-id: "ww51717e2b71d5e2d3"
+  secret: "6ODAmw-8W4t6h9mdzHh2Z4Apwj8mnsyRnjEDZOHdA7k"
+  private-key-path: "privatekey.pem"
+  webhook-url: "https://your-server.com/wecom/archive"
+# token配置
+token:
+  # 令牌自定义标识
+  header: Authorization
+  # 令牌密钥
+  secret: abcdefghijklmnopqrstuvwxyz
+  # 令牌有效期(默认30分钟)
+  expireTime: 180
+openIM:
+  secret: openIM123
+  userID: imAdmin
+  url: https://web.im.ya.top/api
+#是否使用新im
+im:
+  type: OPENIM
+#是否为新商户,新商户不走mpOpenId
+isNewWxMerchant: false
+enableRedPackAccount: 0
+

+ 5 - 4
fs-service/src/main/resources/application-druid-zlwh-test.yml

@@ -39,9 +39,9 @@ spring:
             druid:
                 # 主库数据源
                 master:
-                    url: jdbc:mysql://139.186.77.83:3306/zlwh_fs_his_test?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
-                    username: Rtroot
-                    password: Rtroot
+                    url: jdbc:mysql://101.245.80.133:3306/fs_his?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8&allowMultiQueries=true
+                    username: root
+                    password: Ylrztek250218!3@.
                 # 从库数据源
                 slave:
                     # 从数据源开关/默认关闭
@@ -162,4 +162,5 @@ tag:
         num: 10
     rate:
         limit: 50
-
+ipad:
+    wxIpadUrl:

+ 2 - 0
fs-service/src/main/resources/application-druid-zlwh.yml

@@ -162,3 +162,5 @@ tag:
     rate:
         limit: 50
 
+ipad:
+  wxIpadUrl:

+ 6 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -534,6 +534,9 @@
         <if test='appId != null and appId != ""'>
             and ((FIND_IN_SET(#{appId}, p.app_ids) > 0))
         </if>
+        <if test='keyword != null and keyword != ""'>
+            and p.product_name like CONCAT('%', #{keyword}, '%')
+        </if>
         and p.is_new=1 and p.is_display=1 order by p.sort desc
     </select>
     <select id="selectFsStoreProductHotQuery" resultType="com.fs.hisStore.vo.FsStoreProductListQueryVO">
@@ -562,6 +565,9 @@
         <if test='appId != null and appId != ""'>
             and ((FIND_IN_SET(#{appId}, p.app_ids) > 0))
         </if>
+        <if test='keyword != null and keyword != ""'>
+            and p.product_name like CONCAT('%', #{keyword}, '%')
+        </if>
         and  p.is_hot=1 and p.is_display=1 order by p.sort desc
     </select>
     <select id="selectFsStoreProductGoodListQuery" resultType="com.fs.hisStore.vo.FsStoreProductListQueryVO">

+ 6 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreProductUserEndCategoryMapper.xml

@@ -23,12 +23,18 @@
     <select id="selectDistinctProductIdsByCategoryId" resultType="java.lang.Long">
         select distinct a.product_id from fs_store_product_user_end_category a left join fs_store_product_scrm c on a.product_id = c.product_id
         where a.user_end_category_id = #{categoryId} and c.is_del = 0 and c.is_show = 1
+        <if test="keyword != null and keyword != ''">
+            and c.product_name like CONCAT('%', #{keyword}, '%')
+        </if>
         order by c.sort desc, c.create_time desc, a.product_id
     </select>
 
     <select id="selectDistinctProductIds" resultType="java.lang.Long">
         select distinct a.product_id from fs_store_product_user_end_category  a left join fs_store_product_scrm c on a.product_id = c.product_id
         where c.is_del = 0 and c.is_show = 1
+        <if test="keyword != null and keyword != ''">
+            and c.product_name like CONCAT('%', #{keyword}, '%')
+        </if>
         order by c.sort desc, c.create_time desc, a.product_id
     </select>
 </mapper>

+ 13 - 0
fs-service/src/main/resources/mapper/statis/ConsumptionBalanceMapper.xml

@@ -523,5 +523,18 @@
             AND is_del=0
         </where>
     </select>
+    <select id="selectFsCourseTrafficLogCount" resultType="java.lang.Long">
+        SELECT COUNT(*)
+        FROM fs_course_traffic_log
+        <where>
+            <if test="startTime != null and endTime != null">
+                and create_time &gt;= #{startTime}
+                and create_time &lt;= #{endTime}
+            </if>
+            <if test="companyId != null">
+                AND company_id = #{companyId}
+            </if>
+        </where>
+    </select>
 
 </mapper>

+ 143 - 0
fs-user-app/src/main/java/com/fs/app/controller/CourseH5Controller.java

@@ -0,0 +1,143 @@
+package com.fs.app.controller;
+
+
+import cn.hutool.json.JSONUtil;
+import com.fs.common.core.domain.R;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.course.param.FsCourseH5ListParam;
+import com.fs.course.param.FsUserCourseVideoFinishUParam;
+import com.fs.course.service.IFsCourseLinkService;
+import com.fs.course.service.IFsCourseWatchLogService;
+import com.fs.course.service.IFsUserCourseService;
+import com.fs.course.service.IFsUserCourseVideoService;
+import com.fs.course.vo.FsUserCourseVideoH5DVO;
+import com.fs.course.vo.FsUserCourseVideoH5VO;
+import com.fs.system.service.ISysConfigService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletRequest;
+
+@Api("h5课堂接口")
+@RestController
+@RequestMapping(value="/app/course/h5")
+public class CourseH5Controller extends  AppBaseController{
+    Logger logger= LoggerFactory.getLogger(getClass());
+    @Autowired
+    private IFsUserCourseService courseService;
+
+    @Autowired
+    private IFsUserCourseVideoService courseVideoService;
+
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private IFsCourseLinkService courseLinkService;
+
+    @Autowired
+    private IFsCourseLinkService linkService;
+
+    @Autowired
+    private IFsCourseWatchLogService courseWatchLogService;
+
+
+    @ApiOperation("h5课程简介")
+    @GetMapping("/getH5CourseByVideoId")
+    public R getCourseByVideoId(@RequestParam("videoId") Long videoId,HttpServletRequest request)
+    {
+        FsUserCourseVideoH5VO course = courseService.selectFsUserCourseVideoH5VOByVideoId(videoId);
+        return R.ok().put("data",course);
+    }
+
+    @ApiOperation("h5课程详情")
+    @GetMapping("/getH5CourseVideoDetails")
+    public R getCourseVideoDetails(FsUserCourseVideoFinishUParam param)
+    {
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        FsUserCourseVideoH5DVO course = courseService.selectFsUserCourseVideoH5DVOByVideoId(param.getVideoId());
+
+        Long duration = 0L;
+        long tipsTime = 0L;
+        int isFinish = 0;
+        if (param.getLinkType()!=null&&param.getLinkType()==1){
+            return R.ok().put("course",course).put("config",config).put("playDuration",duration).put("tipsTime",tipsTime).put("maxBufferLength",config.getMaxBufferLength());
+        }
+        // 从Redis中获取观看时长
+        String redisKey = "h5user:watch:duration:" + param.getQwUserId()+ ":" + param.getQwExternalId() + ":" + param.getVideoId();
+        String durationStr = redisCache.getCacheObject(redisKey);
+        FsCourseWatchLog log = courseWatchLogService.getWatchCourseVideoH5(param.getVideoId(),param.getQwUserId(),param.getQwExternalId());
+        //redis取不到查库
+        if (durationStr != null) {
+            duration = Long.parseLong(durationStr);
+        }else {
+            duration = log.getDuration();
+        }
+
+        if (course.getDuration()!=null){
+            tipsTime = course.getDuration()/2;
+        }
+        //判断是否完课
+        if (log.getLogType()==2){
+           isFinish=1;
+        }
+
+        //将视频时长也存到redis
+        String videoRedisKey = "h5user:video:duration:" + param.getVideoId();
+        Long videoDuration = redisCache.getCacheObject(videoRedisKey);
+        if (videoDuration==null){
+            redisCache.setCacheObject(videoRedisKey,course.getDuration());
+        }
+
+        return R.ok().put("course",course).put("config",config).put("playDuration",duration).put("tipsTime",tipsTime).put("maxBufferLength",config.getMaxBufferLength()).put("isFinish",isFinish);
+    }
+
+
+
+    @ApiOperation("获取真实链接")
+    @GetMapping("/getRealLink")
+    public R getRealLink(@RequestParam("sortLink")String link)
+    {
+        return courseLinkService.getRealLink(link);
+    }
+
+
+    @ApiOperation("更新看课时长")
+    @PostMapping("/updateWatchDuration")
+    public R updateWatchDuration(@RequestBody FsUserCourseVideoFinishUParam param)
+    {
+        return courseVideoService.updateWatchDuration(param);
+    }
+
+
+    @ApiOperation("获取缓冲流量")
+    @PostMapping("/getInternetTraffic")
+    public R getInternetTraffic(@RequestBody FsUserCourseVideoFinishUParam param) {
+        return courseVideoService.getInternetTraffic(param);
+    }
+
+    @PostMapping("/getErrMsg")
+    public void getErrMsg(@RequestParam("msg") String msg) {
+        logger.error("zyp \n【h5看课中途报错】:{}",msg);
+    }
+
+
+    @ApiOperation("获取我的sop课程-短信链接")
+    @PostMapping("/getSopCourseH5StudyListByMsg")
+    public R getSopCourseH5StudyListByMsg(@RequestBody FsCourseH5ListParam param ){
+        return  courseLinkService.getSopCourseH5StudyListByMsg(param);
+    }
+
+    @ApiOperation("获取我的sop课程详情")
+    @PostMapping("/getSopCourseH5StudyInfo")
+    public R getSopCourseH5StudyInfo(@RequestBody FsCourseH5ListParam  param ){
+        // 查询看课记录
+        return linkService.getLinkInfo(param.getLogId());
+    }
+
+}

+ 5 - 3
fs-user-app/src/main/java/com/fs/app/controller/store/IndexScrmController.java

@@ -120,9 +120,10 @@ public class IndexScrmController extends AppBaseController {
 	@ApiOperation("首页商品列表")
 	@GetMapping("/home/goods")
 	public R homeGoods(@RequestParam(value = "id", required = false) Long id,
+					   @RequestParam(value = "keyword", required = false) String keyword,
 					   @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
 					   @RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
-		java.util.Map<String, Object> data = userEndCategoryScrmService.listProductsForApp(id, pageNum, pageSize);
+		java.util.Map<String, Object> data = userEndCategoryScrmService.listProductsForApp(id, keyword, pageNum, pageSize);
 		return R.ok().put("data", data);
 	}
 
@@ -133,6 +134,7 @@ public class IndexScrmController extends AppBaseController {
 	@GetMapping("/home/goods/recommend")
 	public R homeGoodsRecommend(HttpServletRequest request,
 								@RequestParam(value = "type") String type,
+								@RequestParam(value = "keyword", required = false) String keyword,
 								@RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
 								@RequestParam(value = "pageSize", defaultValue = "10") Integer pageSize) {
 		String appId = request.getParameter("appId");
@@ -140,8 +142,8 @@ public class IndexScrmController extends AppBaseController {
 			return R.ok().put("data", new PageInfo<>(Collections.emptyList()));
 		}
 		List<FsStoreProductListQueryVO> list = "green".equalsIgnoreCase(type)
-				? productService.selectFsStoreProductNewQueryPage(pageNum, pageSize, appId)
-				: productService.selectFsStoreProductHotQueryPage(pageNum, pageSize, appId);
+				? productService.selectFsStoreProductNewQueryPage(pageNum, pageSize, appId, keyword)
+				: productService.selectFsStoreProductHotQueryPage(pageNum, pageSize, appId, keyword);
 		PageInfo<FsStoreProductListQueryVO> pageInfo = new PageInfo<>(list);
 		return R.ok().put("data", pageInfo);
 	}