Forráskód Böngészése

Merge remote-tracking branch 'origin/master'

ct 1 hete
szülő
commit
e47219a577
25 módosított fájl, 445 hozzáadás és 127 törlés
  1. 13 0
      fs-admin/src/main/java/com/fs/course/controller/qw/QwFsCourseWatchLogController.java
  2. 12 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java
  3. 27 2
      fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java
  4. 24 5
      fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java
  5. 6 0
      fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java
  6. 1 1
      fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriod.java
  7. 92 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  8. 8 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java
  9. 1 1
      fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java
  10. 23 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  11. 24 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java
  12. 90 89
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  13. 19 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreProductScrm.java
  14. 20 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java
  15. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  16. 15 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  17. 2 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListQueryVO.java
  18. 1 1
      fs-service/src/main/java/com/fs/live/mapper/LiveOrderMapper.java
  19. 3 3
      fs-service/src/main/java/com/fs/live/service/impl/LiveAfterSalesServiceImpl.java
  20. 22 17
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  21. 8 3
      fs-service/src/main/java/com/fs/live/vo/LiveOrderVoZm.java
  22. 2 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  23. 1 1
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductPackageScrmMapper.xml
  24. 24 2
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml
  25. 5 1
      fs-user-app/src/main/java/com/fs/app/controller/store/CompanyOrderScrmController.java

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

@@ -23,6 +23,7 @@ import com.fs.qw.param.QwWatchLogStatisticsListParam;
 import com.fs.qw.service.IQwWatchLogService;
 import com.fs.qw.vo.QwWatchLogAllStatisticsListVO;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
@@ -39,6 +40,9 @@ import java.util.List;
 @RequestMapping("/qw/course/courseWatchLog")
 public class QwFsCourseWatchLogController extends BaseController
 {
+    @Value("${cloud_host.company_name}")
+    private String signProjectName;
+
     @Autowired
     private IFsCourseWatchLogService fsCourseWatchLogService;
 
@@ -78,9 +82,18 @@ public class QwFsCourseWatchLogController extends BaseController
         }
         param.setSendType(2); //企微
         List<FsCourseWatchLogStatisticsListVO> list = fsCourseWatchLogService.selectFsCourseWatchLogStatisticsListVO(param);
+        if("济南联志健康".equals(signProjectName)){
+            FsCourseWatchLogStatisticsListVO totalData = fsCourseWatchLogService.getTotalDataAddItem(param);
+            list.add(totalData);
+        }
         return getDataTable(list);
     }
 
+    @GetMapping("/getSignProjectName")
+    public R getSignProjectName(){
+        return R.ok().put("signProjectName", signProjectName);
+    }
+
     @GetMapping("/statisticsListByCompany")
     public R statisticsListByCompany(FsCourseWatchLogStatisticsListParam param)
     {

+ 12 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreProductScrmController.java

@@ -113,6 +113,18 @@ public class FsStoreProductScrmController extends BaseController
     }
 
 
+    /**
+     * 导出商品列表
+     */
+    @PreAuthorize("@ss.hasPermi('store:storeProduct:copy')")
+    @Log(title = "商品管理", businessType = BusinessType.INSERT, isStoreLog = true,logParam = {"商品","复制商品信息"})
+    @GetMapping("/copyStoreProduct")
+    public R copyStoreProduct(@RequestParam Long productId)
+    {
+        return fsStoreProductService.copyStoreProduct(productId);
+    }
+
+
     @Log(title = "商品管理", businessType = BusinessType.IMPORT,isStoreLog = true,logParam = {"商品","商品导入"})
     @PreAuthorize("@ss.hasPermi('store:storeProduct:import')")
     @PostMapping("/importData")

+ 27 - 2
fs-admin/src/main/java/com/fs/live/controller/LiveOrderController.java

@@ -6,6 +6,7 @@ import com.fs.common.annotation.Log;
 import com.fs.common.core.controller.BaseController;
 import com.fs.common.core.domain.AjaxResult;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ParseUtils;
@@ -32,6 +33,7 @@ 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.task.LiveTask;
 import com.fs.hisStore.vo.FsStoreOrderVO;
 import com.fs.live.domain.*;
 import com.fs.live.dto.LiveOrderCustomerExportDTO;
@@ -43,6 +45,7 @@ import com.fs.live.enums.LiveOrderCancleReason;
 import com.fs.live.param.LiveOrderScrmSetErpPhoneParam;
 import com.fs.live.service.*;
 import com.fs.live.vo.*;
+import com.fs.qw.utils.RSAUtils;
 import com.fs.store.domain.FsStoreDelivers;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.mapper.SysConfigMapper;
@@ -109,6 +112,11 @@ public class LiveOrderController extends BaseController
     @Autowired
     private ILiveOrderDfService liveOrderDfService;
 
+    @Autowired
+    private LiveTask liveTask;
+
+
+
 
     @GetMapping("/importTemplate")
     public AjaxResult importTemplate() {
@@ -153,6 +161,7 @@ public class LiveOrderController extends BaseController
     public TableDataInfo listZm(LiveOrder liveOrder)
     {
         startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         List<LiveOrderVoZm> list = liveOrderService.selectLiveOrderListZm(liveOrder);
         for (LiveOrderVoZm vo : list){
             vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
@@ -160,7 +169,15 @@ public class LiveOrderController extends BaseController
             vo.setUserBindPhone(ParseUtils.parsePhone(vo.getUserBindPhone()));
             vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
             vo.setCost(BigDecimal.ZERO);
-            vo.setCostPrice(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())));
+            } else {
+                vo.setCostPrice(BigDecimal.ZERO);
+                vo.setFPrice(BigDecimal.ZERO);
+            }
+
         }
         return getDataTable(list);
     }
@@ -174,13 +191,21 @@ public class LiveOrderController extends BaseController
     public AjaxResult exportZm(LiveOrder liveOrder)
     {
         List<LiveOrderVoZm> list = liveOrderService.selectLiveOrderListZm(liveOrder);
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         for (LiveOrderVoZm vo : list){
             vo.setUserPhone(ParseUtils.parsePhone(vo.getUserPhone()));
             vo.setCompanyUserPhone(ParseUtils.parsePhone(vo.getCompanyUserPhone()));
             vo.setUserBindPhone(ParseUtils.parsePhone(vo.getUserBindPhone()));
             vo.setUserAddress(ParseUtils.parseAddress(vo.getUserAddress()));
             vo.setCost(BigDecimal.ZERO);
-            vo.setCostPrice(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())));
+            } else {
+                vo.setCostPrice(BigDecimal.ZERO);
+                vo.setFPrice(BigDecimal.ZERO);
+            }
         }
         ExcelUtil<LiveOrderVoZm> util = new ExcelUtil<LiveOrderVoZm>(LiveOrderVoZm.class);
         return util.exportExcel(list, "订单数据");

+ 24 - 5
fs-company/src/main/java/com/fs/company/controller/course/FsUserCoursePeriodController.java

@@ -10,6 +10,7 @@ import com.fs.common.core.page.TableDataInfo;
 import com.fs.common.enums.BusinessType;
 import com.fs.common.exception.CustomException;
 import com.fs.common.utils.ServletUtils;
+import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.course.domain.FsUserCoursePeriod;
 import com.fs.course.domain.FsUserCoursePeriodDays;
@@ -37,10 +38,7 @@ import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
 
 import java.time.LocalDate;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
+import java.util.*;
 
 
 /**
@@ -104,6 +102,20 @@ public class FsUserCoursePeriodController extends BaseController {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         fsUserCoursePeriod.setCompanyIdList(Collections.singletonList(loginUser.getCompany().getCompanyId()));
         List<FsUserCoursePeriodVO> list = fsUserCoursePeriodService.selectFsUserCoursePeriodPage(fsUserCoursePeriod);
+        // 使用Stream API的简洁写法
+        Long currentCompanyId = loginUser.getCompany().getCompanyId();
+        for (FsUserCoursePeriodVO vo : list) {
+            String isNeedRegisterMember = vo.getIsNeedRegisterMember();
+
+            if (StringUtils.isNotEmpty(isNeedRegisterMember)) {
+                boolean containsCurrentCompany = Arrays.stream(isNeedRegisterMember.split(","))
+                        .map(String::trim)
+                        .anyMatch(id -> id.equals(String.valueOf(currentCompanyId)));
+                vo.setIsNeedRegisterMember(containsCurrentCompany ? "1" : "0");
+            } else {
+                vo.setIsNeedRegisterMember("0");
+            }
+        }
         PageInfo<FsUserCoursePeriodVO> pageInfo = new PageInfo<>(list);
         Map<String, Object> result = new HashMap<>();
         result.put("rows", pageInfo.getList());
@@ -173,7 +185,14 @@ public class FsUserCoursePeriodController extends BaseController {
     @PutMapping("/editIsNeedRegisterMember")
     public AjaxResult editIsNeedRegisterMember(@RequestBody FsUserCoursePeriod fsUserCoursePeriod)
     {
-        return toAjax(fsUserCoursePeriodService.editIsNeedRegisterMember(fsUserCoursePeriod));
+        FsUserCoursePeriod fsUserCoursePeriod1 = fsUserCoursePeriodService.selectFsUserCoursePeriodById(fsUserCoursePeriod.getPeriodId());
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (ObjectUtil.isEmpty(fsUserCoursePeriod.getIsNeedRegisterMember())){
+            throw new CustomException("修改失败!");
+        }
+
+        return toAjax(fsUserCoursePeriodService.editIsNeedRegisterMember(fsUserCoursePeriod,loginUser.getCompany().getCompanyId().toString()));
+
     }
 
     /**

+ 6 - 0
fs-live-app/src/main/java/com/fs/live/websocket/service/WebSocketServer.java

@@ -465,6 +465,12 @@ public class WebSocketServer {
     //错误时调用
     @OnError
     public void onError(Session session, Throwable throwable) {
+
+        try {
+            this.onClose(session);
+        } catch (Exception e) {
+            log.error("webSocket 错误 onError", e);
+        }
         if (throwable instanceof EOFException) {
             log.info("WebSocket连接被客户端正常关闭(EOF),sessionId: {}", session.getId());
         } else {

+ 1 - 1
fs-service/src/main/java/com/fs/course/domain/FsUserCoursePeriod.java

@@ -118,5 +118,5 @@ public class FsUserCoursePeriod
      */
     private Date periodLine;
     /** 是否需要单独注册会员,1-是,0-否(用于个微销售分享看课) */
-    private Integer isNeedRegisterMember;
+    private String isNeedRegisterMember;
 }

+ 92 - 0
fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java

@@ -295,6 +295,98 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
             "</script>"})
     List<FsCourseWatchLogStatisticsListVO> selectFsCourseWatchLogStatisticsListVO(FsCourseWatchLogStatisticsListParam param);
 
+    @Select({"<script> " +
+            " \tselect \n" +
+            "\t'总合计' as qw_user_name,\n" +
+            "\tsum(t1.type1) as type1,\n" +
+            "\tsum(t1.type2) as type2,\n" +
+            "\tsum(t1.type3) as type3,\n" +
+            "\tsum(t1.type4) as type4,\n" +
+            "\t (\n" +
+            "     sum(t1.type1)+\n" +
+            "     sum(t1.type2) +\n" +
+            "     sum(t1.type4)\n" +
+            "   ) AS on_line_num,\n" +
+            "\t sum(send_number) as send_number,\n" +
+            "\t sum(is_user_wait_number) as is_user_wait_number,\n" +
+            "\t sum(no_user_wait_number) as no_user_wait_number,\n" +
+            "\t sum(red_amount) as red_amount\n" +
+            "\tfrom  ( select t.* " +
+            "<if test= 'sendType != 1 '> " +
+            " ,concat(round(if(t.send_number=0,0,(t.on_line_num/t.send_number)*100),2),'%') on_line_rate" +
+            " ,concat(round(if(t.send_number=0,0,(t.type2/t.send_number)*100),2),'%') finished_rate" +
+            "</if> " +
+            "from (" +
+            "SELECT \n" +
+            "o.video_id,o.company_id,o.qw_user_id,DATE(o.create_time) create_time," +
+            "<if test= 'sendType != 1 '> " +
+            " qu.qw_user_name qw_user_name," +
+            "</if>\n" +
+            "<if test= 'sendType == 1 '> " +
+            " cu.nick_name qw_user_name," +
+            "</if>\n" +
+            "v.title videoName,uc.course_name,\n" +
+            "SUM(CASE WHEN o.log_type = '1' THEN 1 ELSE 0 END) AS type1,\n" +
+            "SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END) AS type2,\n" +
+            "SUM(CASE WHEN o.log_type = '3' THEN 1 ELSE 0 END) AS type3,\n" +
+            "SUM(CASE WHEN o.log_type = '4' THEN 1 ELSE 0 END) AS type4,\n" +
+            "(\n" +
+            "  SUM(CASE WHEN o.log_type = '1' THEN 1 ELSE 0 END) +\n" +
+            "  SUM(CASE WHEN o.log_type = '2' THEN 1 ELSE 0 END) +\n" +
+            "  SUM(CASE WHEN o.log_type = '4' THEN 1 ELSE 0 END)\n" +
+            ") AS on_line_num " +
+            "<if test= 'sendType != 1 '> " +
+            " ,count(o.log_id) send_number" +
+            " ,sum(if((o.user_id is not null or o.user_id>0) and o.log_type=3,1,0)) is_user_wait_number" +
+            " ,sum(if((o.user_id is null or o.user_id=0) and o.log_type=3,1,0)) no_user_wait_number" +
+//            " ,sum(ifnull(fcr.amount,0)) red_amount" +
+            ",(SELECT SUM(amount) FROM fs_course_red_packet_log \n" +
+            "     WHERE user_id = o.user_id AND video_id = o.video_id) as red_amount " +
+            "</if> " +
+            "FROM fs_course_watch_log o " +
+            "<if test= 'sendType != 1 '> " +
+            " LEFT JOIN qw_user qu on qu.id=o.qw_user_id " +
+//            " LEFT JOIN fs_course_red_packet_log fcr on o.user_id = fcr.user_id and fcr.video_id = o.video_id" + //会有笛卡尔积问题
+            "</if>\n" +
+            "LEFT JOIN fs_user_course_video v on v.video_id=o.video_id \n" +
+            "LEFT JOIN fs_user_course uc on uc.course_id=v.course_id\n" +
+            "<if test= 'sendType == 1 '> " +
+            " LEFT JOIN company_user cu on cu.user_id=o.company_user_id\n" +
+            "</if>\n" +
+            "where o.company_id=#{companyId} " +
+            "<if test= 'sendType != null '> " +
+            "       and  send_type= #{sendType} " +
+            "</if>\n" +
+            "<if test= 'sTime != null '> " +
+            "       and DATE(o.create_time) &gt;= DATE(#{sTime})\n" +
+            "</if>\n" +
+            "<if test='eTime != null '> " +
+            "      and DATE(o.create_time) &lt;= DATE(#{eTime})\n" +
+            "</if>" +
+            "<if test ='sendType != 1 and nickName !=null and nickName!=\"\"'>\n" +
+            "   and qu.qw_user_name like concat( #{nickName}, '%')\n" +
+            "</if>" +
+            "<if test ='sendType == 1 and nickName !=null and nickName!=\"\"'>\n" +
+            "   and cu.nick_name like concat( #{nickName}, '%')\n" +
+            "</if>" +
+            "<if test ='courseId !=null'> " +
+            "     and o.course_id = #{courseId} " +
+            "</if>" +
+            "<if test ='videoId !=null'> " +
+            "     and o.video_id = #{videoId} " +
+            "</if>" +
+            "GROUP BY o.video_id," +
+            "<if test= 'sendType != 1 '> " +
+            " o.qw_user_id," +
+            "</if>\n" +
+            "<if test= 'sendType == 1 '> " +
+            " o.company_user_id," +
+            "</if>\n" +
+            "DATE(o.create_time)\n" +
+            "ORDER BY o.video_id ,DATE(o.create_time) " +
+            ") t ) t1 \n"+
+            "</script>"})
+    FsCourseWatchLogStatisticsListVO getTotalDataAddItem(FsCourseWatchLogStatisticsListParam param);
     @Select({"<script> " +
             "SELECT COUNT(*) FROM (" +
             "    SELECT 1 " +

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

@@ -88,6 +88,14 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
     void testFinishMsg();
 
     List<FsCourseWatchLogStatisticsListVO> selectFsCourseWatchLogStatisticsListVO(FsCourseWatchLogStatisticsListParam param);
+
+    /**
+     * 新增企微看课统计汇总行查询
+     * @param param
+     * @return
+     */
+    FsCourseWatchLogStatisticsListVO getTotalDataAddItem(FsCourseWatchLogStatisticsListParam param);
+
     List<FsCourseWatchLogStatisticsListByCompanyVO> selectFsCourseWatchLogStatisticsListByCompanyVO(FsCourseWatchLogStatisticsListParam param);
 
     void scheduleBatchUpdateToDatabase();

+ 1 - 1
fs-service/src/main/java/com/fs/course/service/IFsUserCoursePeriodService.java

@@ -102,7 +102,7 @@ public interface IFsUserCoursePeriodService
 
     List<Long> selectFsUserCoursePeriodListByPeriodId(List<Long> periodIds,Long companyId);
 
-    int editIsNeedRegisterMember(FsUserCoursePeriod fsUserCoursePeriod);
+    int editIsNeedRegisterMember(FsUserCoursePeriod fsUserCoursePeriod,String s);
 
     List<SysDictData> selectFsUserCoursePeriodListLabel(FsUserCoursePeriod fsUserCoursePeriod);
 }

+ 23 - 0
fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java

@@ -59,6 +59,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Propagation;
 import org.springframework.transaction.annotation.Transactional;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.time.Duration;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -764,6 +766,27 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         return fsCourseWatchLogMapper.selectFsCourseWatchLogStatisticsListVO(param);
     }
 
+
+    /**
+     * 新增企微看课统计汇总行查询
+     * @param param
+     * @return
+     */
+    public FsCourseWatchLogStatisticsListVO getTotalDataAddItem(FsCourseWatchLogStatisticsListParam param){
+        FsCourseWatchLogStatisticsListVO addItem =  fsCourseWatchLogMapper.getTotalDataAddItem(param);
+        if(null != addItem && null != addItem.getOnLineNum() && 0 != addItem.getOnLineNum() && null != addItem.getSendNumber()){
+            addItem.setOnLineRate(new BigDecimal(addItem.getOnLineNum())
+                    .multiply(new BigDecimal(100))
+                    .divide(new BigDecimal(addItem.getSendNumber()),2,BigDecimal.ROUND_HALF_UP)
+                     + "%");
+
+            addItem.setFinishedRate(new BigDecimal(addItem.getType2())
+                    .multiply(new BigDecimal(100))
+                    .divide(new BigDecimal(addItem.getSendNumber()),2,BigDecimal.ROUND_HALF_UP) + "%");
+        }
+        return addItem;
+    }
+
     @Override
     public List<FsCourseWatchLogStatisticsListByCompanyVO> selectFsCourseWatchLogStatisticsListByCompanyVO(FsCourseWatchLogStatisticsListParam param) {
         return fsCourseWatchLogMapper.selectFsCourseWatchLogStatisticsListByCompanyVO(param);

+ 24 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodServiceImpl.java

@@ -313,7 +313,30 @@ public class FsUserCoursePeriodServiceImpl implements IFsUserCoursePeriodService
     }
 
     @Override
-    public int editIsNeedRegisterMember(FsUserCoursePeriod fsUserCoursePeriod) {
+    public int editIsNeedRegisterMember(FsUserCoursePeriod fsUserCoursePeriod,String companyId) {
+        String currentValue = fsUserCoursePeriod.getIsNeedRegisterMember();
+
+        if (currentValue.equals("0")) {
+            // 移除指定的 companyId
+            String updatedValue = Arrays.stream(currentValue.split(","))
+                    .map(String::trim)
+                    .filter(id -> !id.equals(companyId))
+                    .collect(Collectors.joining(","));
+            fsUserCoursePeriod.setIsNeedRegisterMember(updatedValue);
+        } else {
+            // 添加 companyId,并过滤掉 "0"
+            String updatedValue = Arrays.stream(currentValue.split(","))
+                    .map(String::trim)
+                    .filter(id -> !id.equals("0")) // 清除 "0"
+                    .collect(Collectors.collectingAndThen(
+                            Collectors.toCollection(LinkedHashSet::new),
+                            set -> {
+                                set.add(companyId);
+                                return String.join(",", set);
+                            }
+                    ));
+            fsUserCoursePeriod.setIsNeedRegisterMember(updatedValue);
+        }
         return fsUserCoursePeriodMapper.updateFsUserCoursePeriod(fsUserCoursePeriod);
     }
 

+ 90 - 89
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java

@@ -604,26 +604,69 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         if(qwGroupChatUsers == null || qwGroupChatUsers.isEmpty()){
             return R.error("群参数异常");
         }
-        QwExternalContact qwExternalContact =
-                qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+        //群聊寻找用户新逻辑
+        QwExternalContact qwExternalContact = null;
+        if( null != param.getUserId() && null == qwExternalContact){
+            try {
+                qwExternalContact =  qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
                         .eq("user_id", qwGroupChat.getOwner())
                         .eq("fs_user_id", param.getUserId())
                         .eq("corp_id", param.getCorpId())
                         .eq("status",0));
-        if(null == qwExternalContact){
-            try{
-                //修改成通过昵称匹配
-                qwExternalContact =
-                        qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
-                                .eq("user_id", qwGroupChat.getOwner())
-                                .eq("name", user.getNickName())
-                                .eq("corp_id", param.getCorpId())
-                                .eq("status",0));
-            } catch(Exception e){
-                log.error("群聊用户昵称匹配异常,参数user_id:{},name:{},corp_id:{}",qwGroupChat.getOwner(),user.getNickName(),param.getCorpId(),e);
+            } catch (Exception e){
+                log.error("群聊用户id匹配异常,参数user_id:{},fs_user_id:{},corp_id:{}",qwGroupChat.getOwner(),param.getUserId(),param.getCorpId(),e);
+            }
+        }
+        //找当前群中的用户匹配
+        if(StringUtils.isNotBlank(param.getChatId()) && null == qwExternalContact){
+            List<QwExternalContact> groupChatUserByChatIdAndUserName = qwExternalContactMapper.getGroupChatUserByChatIdAndUserName(qwGroupChat.getOwner(), user.getNickName(), param.getCorpId(), param.getChatId());
+            //没找到用户 || 找到的用户数量大于1 使用userid查询匹配
+            if(null == groupChatUserByChatIdAndUserName || groupChatUserByChatIdAndUserName.isEmpty() || groupChatUserByChatIdAndUserName.size() > 1){
+                log.error("群聊用户昵称匹配异常,参数user_id:{},name:{},corp_id:{},chatId:{}",qwGroupChat.getOwner(),user.getNickName(),param.getCorpId(),param.getChatId());
+            } else {
+                qwExternalContact =  groupChatUserByChatIdAndUserName.get(0);
             }
-
         }
+//        QwExternalContact qwExternalContact =  qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+//                            .eq("user_id", qwGroupChat.getOwner())
+//                            .eq("fs_user_id", param.getUserId())
+//                            .eq("corp_id", param.getCorpId())
+//                            .eq("status",0));
+//
+//        if(null == qwExternalContact){
+//            try{
+//                //修改成通过昵称匹配
+//                qwExternalContact =
+//                        qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+//                                .eq("user_id", qwGroupChat.getOwner())
+//                                .eq("name", user.getNickName())
+//                                .eq("corp_id", param.getCorpId())
+//                                .eq("status",0));
+//            } catch(Exception e){
+//                log.error("群聊用户昵称匹配异常,参数user_id:{},name:{},corp_id:{}",qwGroupChat.getOwner(),user.getNickName(),param.getCorpId(),e);
+//            }
+//
+//        }
+//        QwExternalContact qwExternalContact =
+//                qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+//                        .eq("user_id", qwGroupChat.getOwner())
+//                        .eq("fs_user_id", param.getUserId())
+//                        .eq("corp_id", param.getCorpId())
+//                        .eq("status",0));
+//        if(null == qwExternalContact){
+//            try{
+//                //修改成通过昵称匹配
+//                qwExternalContact =
+//                        qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>()
+//                                .eq("user_id", qwGroupChat.getOwner())
+//                                .eq("name", user.getNickName())
+//                                .eq("corp_id", param.getCorpId())
+//                                .eq("status",0));
+//            } catch(Exception e){
+//                log.error("群聊用户昵称匹配异常,参数user_id:{},name:{},corp_id:{}",qwGroupChat.getOwner(),user.getNickName(),param.getCorpId(),e);
+//            }
+//
+//        }
         if(qwExternalContact==null){
             return addCustomerService(param.getQwUserId(),msg);
         }
@@ -723,82 +766,36 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 return R.error(567,"群聊通用链接").put("qwExternalId", contact.getId());
             }
         }
+        if ("今正科技".equals(cloudHostProper.getCompanyName())) {
+            QwExternalContact UnionEXt = qwExternalContactMapper.selectQwExternalByUnionID(user.getUnionId());
+            if (UnionEXt!=null){
+                log.info("匹配到的第一个企微用户:"+UnionEXt.getUserId());
+                log.info("企微id:"+UnionEXt.getId());
+                log.info("用户:"+param.getVideoId());
+                log.info("企微用户:"+param.getQwUserId());
+                param.setQwExternalId(UnionEXt.getId());
+                FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(UnionEXt.getId(), param.getVideoId(),param.getQwUserId());
+                if (log==null){
+                    param.setUserId(user.getUserId());
+                    createWatchLog(param);
+                }else {
+                    if (log.getUserId()==null||log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())){
+                        log.setUserId(param.getUserId());
+                    }
+                    log.setUpdateTime(new Date());
+                    courseWatchLogMapper.updateFsCourseWatchLog(log);
+                }
+                return R.error(567,"群聊通用链接").put("qwExternalId", UnionEXt.getId());
+            }
+        }
+
+
         String msg = "<div style=\"color: red;margin-bottom: 15px;font-weight: bold;\">本课程为群会员独享<br>请长按二维码</div>\n" +
                 "\t\t\t\t\t<div style=\"color: #999;font-size: 14px;font-weight: bold;\">添加伴学助手免费领取会员权限</div>";
 
         return addCustomerService(param.getQwUserId(),msg);
 
-//        QwGroupChatDetailsResult result = qwApiService.groupChatDetails(courseLink.getChatId(), param.getCorpId());
-//        if(result.getErrCode() != 0){
-//            log.info("企微接口请求失败,请联系管理员:" +result.getErrMsg());
-//            return R.error("不是此群成员");
-//        }
-//        List<QwGroupChatDetailsResult.Member> collect = result.getGroupChat().getMemberList().stream().filter(e -> e.getType() == 2).collect(Collectors.toList());
-//        if(collect.isEmpty()){
-//            logger.info("群聊里面为空弹二维码:"+param.getCorpId()+":"+param.getQwUserId()+":"+param.getChatId()+":"+param.getUserId());
-//            return addCustomerService(param.getQwUserId(),msg);
-//        }
-//        Optional<QwGroupChatDetailsResult.Member> optional = collect.stream().filter(e -> e.getName().equals(user.getNickName()) || e.getName().equals(param.getNickName())).findFirst();
-//        if(!optional.isPresent()){
-//            logger.info("昵称未匹配上弹二维码:"+param.getCorpId()+":"+param.getQwUserId()+":"+param.getChatId()+":"+param.getUserId());
-//
-//            return addCustomerService(param.getQwUserId(),msg);
-//        }
-//        QwGroupChatDetailsResult.Member member = optional.get();
-//        QwExternalContact qwExternalContact = qwExternalContactMapper.selectOne(new QueryWrapper<QwExternalContact>().eq("user_id", result.getGroupChat().getOwner()).eq("external_user_id", member.getUserId()));
-//        if(qwExternalContact==null){
-//            logger.info("外部联系人为空弹二维码:"+param.getCorpId()+":"+param.getQwUserId()+":"+param.getChatId()+":"+param.getUserId()+":"+member.getUserId()+param.getNickName());
-//            return addCustomerService(param.getQwUserId(),msg);
-//        }
-//        Long qwExternalId = qwExternalContact.getId();
-//        log.info("外部联系人数据:{}", qwExternalContact);
-////        addCompanyCompanyFsUser(param);
-//        FsCourseWatchLog log = courseWatchLogMapper.getWatchCourseVideoByExt(qwExternalId, param.getVideoId(),param.getQwUserId());
-//        if (log==null ){
-//            logger.info("看课记录为空弹二维码:"+param.getCorpId()+":"+param.getQwUserId()+":"+param.getChatId()+":"+param.getUserId()+qwExternalId+":"+param.getVideoId()+":"+param.getQwUserId());
-//            return addCustomerService(param.getQwUserId(),msg);
-//        }
-//        //判断外部联系人有没有绑定userId
-//        if (qwExternalContact.getFsUserId()!=null){
-//            //有客户有小程序id  但 登录的小程序id和根据外部联系人id查出来的小程序id不一致
-//            if (!qwExternalContact.getFsUserId().equals(param.getUserId())) {
-//                logger.info("小程序id不一致空弹二维码:"+param.getCorpId()+":"+param.getQwUserId()+":"+param.getChatId()+":"+param.getUserId());
-//                return addCustomerService(param.getQwUserId(),msg);
-//            }
-//            List<QwExternalContact> qwExternalContacts = qwExternalContactMapper.selectQwExternalContactByMiniUserId(param.getUserId());
-//            //匹配客户公司id
-//            if (qwExternalContacts.stream().noneMatch(contact -> contact.getCorpId().equals(param.getCorpId()))){
-//                logger.info("未匹配上公司空弹二维码:"+param.getCorpId()+":"+param.getQwUserId()+":"+param.getChatId()+":"+param.getUserId());
-//                return addCustomerService(param.getQwUserId(),msg);
-//            }
-//
-//            //看课记录中userId为0绑定userId
-//            if (log.getUserId()==null||log.getUserId().equals(0L) || !log.getUserId().equals(param.getUserId())){
-//                log.setUserId(param.getUserId());
-//            }
-//
-//            log.setUpdateTime(new Date());
-//            courseWatchLogMapper.updateFsCourseWatchLog(log);
-//
-//            iSopUserLogsInfoService.updateSopUserInfoByExternalId(qwExternalId,param.getUserId());
-//        }else {
-//            //没绑定fsUser直接绑定fsUser
-//            QwExternalContact contact = new QwExternalContact();
-//            contact.setId(qwExternalId);
-//            contact.setFsUserId(param.getUserId());
-//            qwExternalContactMapper.updateQwExternalContact(contact);
-//            FsUser fsUser = new FsUser();
-//            fsUser.setUserId(user.getUserId());
-//            fsUser.setIsAddQw(1);
-//            fsUserMapper.updateFsUser(fsUser);
-//            //绑定上之后 更新观看记录
-//            //看课记录中userId为0绑定userId
-//            log.setUserId(param.getUserId());
-//            log.setUpdateTime(new Date());
-//            courseWatchLogMapper.updateFsCourseWatchLog(log);
-//        }
-//
-//        return R.error(567,"群聊通用链接").put("qwExternalId", qwExternalContact.getId());
+
     }
 
     private void createWatchLog(FsUserCourseVideoAddKfUParam param) {
@@ -2184,11 +2181,15 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
                 if((companyUser.getIsAllowedAllRegister() !=null && companyUser.getIsAllowedAllRegister() != 1)){
                     return ResponseResult.fail(504,"当前销售禁止绑定会员,请联系销售!");
                 }
+                // 使用 Stream API 检查是否包含 companyId
+                // 修正类型转换问题
                 if (companyUser.getIsNeedRegisterMember() == null || companyUser.getIsNeedRegisterMember() == 1
-                        ||(ObjectUtils.isNotEmpty(fsUserCoursePeriod)
-                        &&ObjectUtils.isNotEmpty(fsUserCoursePeriod.getIsNeedRegisterMember())
-                        &&fsUserCoursePeriod.getIsNeedRegisterMember().equals(1))){
-                    return ResponseResult.fail(504,"请联系销售发送邀请链接成为会员!");
+                        || (ObjectUtils.isNotEmpty(fsUserCoursePeriod)
+                        && ObjectUtils.isNotEmpty(fsUserCoursePeriod.getIsNeedRegisterMember())
+                        && Arrays.stream(fsUserCoursePeriod.getIsNeedRegisterMember().split(","))
+                        .map(String::trim)
+                        .anyMatch(id -> id.equals(String.valueOf(company.getCompanyId()))))) {
+                    return ResponseResult.fail(504, "请联系销售发送邀请链接成为会员!");
                 }
                 int defaultStatus = (company != null ? company.getFsUserIsDefaultBlack() : 0) == 1 ? 0 : 1;
                 userCompanyUser = userCompanyUserService.bindRelationship(param.getUserId(), courseProject, companyUser.getCompanyId(), companyUser.getUserId(), defaultStatus);

+ 19 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreProductScrm.java

@@ -1,9 +1,11 @@
 package com.fs.hisStore.domain;
 
 import java.math.BigDecimal;
+import java.util.Date;
 
 import com.baomidou.mybatisplus.annotation.FieldStrategy;
 import com.baomidou.mybatisplus.annotation.TableField;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.common.core.domain.BaseEntity;
 import lombok.Data;
@@ -320,4 +322,21 @@ public class FsStoreProductScrm extends BaseEntity
     private String returnAddress;
 
 
+    /** 原产地 */
+    @Excel(name = "原产地")
+    private String originPlace;
+
+    /** 净含量 */
+    @Excel(name = "净含量")
+    private String netContent;
+
+    /** 有效日期 */
+    @Excel(name = "有效日期")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date shelfLife;
+
+    /** 国产或进口 */
+    @Excel(name = "国产或进口")
+    private String domesticImported;
+
 }

+ 20 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreProductAddEditParam.java

@@ -1,5 +1,6 @@
 package com.fs.hisStore.param;
 
+import com.fasterxml.jackson.annotation.JsonFormat;
 import com.fs.common.annotation.Excel;
 import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
 import com.fs.hisStore.dto.ProductArrtDTO;
@@ -7,6 +8,7 @@ import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -276,4 +278,22 @@ public class FsStoreProductAddEditParam implements Serializable
         // 指定企业
     private String companyIds;
 
+
+    /** 原产地 */
+    @Excel(name = "原产地")
+    private String originPlace;
+
+    /** 净含量 */
+    @Excel(name = "净含量")
+    private String netContent;
+
+    /** 有效日期 */
+    @Excel(name = "有效日期")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+    private Date shelfLife;
+
+    /** 国产或进口 */
+    @Excel(name = "国产或进口")
+    private String domesticImported;
+
 }

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

@@ -143,4 +143,6 @@ public interface IFsStoreProductScrmService
     List<FsStoreProductScrm> getStoreProductInProductIds(List<Long> storeProductIds);
 
     List<FsStoreProductListVO> liveList(LiveGoods liveId);
+
+    R copyStoreProduct(Long productId);
 }

+ 15 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java

@@ -1189,4 +1189,19 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
     public List<FsStoreProductListVO> liveList(LiveGoods liveId) {
         return fsStoreProductMapper.liveList(liveId);
     }
+
+    @Override
+    public R copyStoreProduct(Long productId) {
+        FsStoreProductScrm fsStoreProductScrm = fsStoreProductMapper.selectFsStoreProductById(productId);
+        if (fsStoreProductScrm == null) return R.error("商品不存在");
+
+        FsStoreProductScrm copy = new FsStoreProductScrm();
+        BeanUtils.copyProperties(fsStoreProductScrm, copy);
+        copy.setProductId(null);
+        copy.setIsAudit("0");
+        fsStoreProductMapper.insertFsStoreProduct(copy);
+
+        return R.ok();
+
+    }
 }

+ 2 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListQueryVO.java

@@ -60,6 +60,8 @@ public class FsStoreProductListQueryVO implements Serializable
     private String storeIds;
 
     private Long storeId;
+    private Long companyId;
+    private Long companyUserId;
 
 
 

+ 1 - 1
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` = 2 and extend_order_id is not null ")
+    @Select("select * from live_order where `status` = 1 and extend_order_id is not null ")
     List<LiveOrder> selectUpdateExpress();
 
     @Select("select order_id from live_order where `status` = 2")

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

@@ -585,13 +585,13 @@ public class LiveAfterSalesServiceImpl implements ILiveAfterSalesService {
         }
         if(liveAfterSales.getRefundType().equals(0)){
             //仅退款未发货处理
-            if(liveAfterSales.getOrderStatus().equals(2)){
+            if(liveAfterSales.getOrderStatus().equals(OrderInfoEnum.STATUS_1.getValue())){
                 //审核通过
                 liveAfterSales.setStatus(3);
                 baseMapper.updateLiveAfterSales(liveAfterSales);
             }
             //待收货直接退款
-            else if(liveAfterSales.getOrderStatus().equals(3)){
+            else if(liveAfterSales.getOrderStatus().equals(OrderInfoEnum.STATUS_2.getValue())){
                 liveAfterSales.setStatus(2);
                 baseMapper.updateLiveAfterSales(liveAfterSales);
             //已完成 退货退款
@@ -613,7 +613,7 @@ public class LiveAfterSalesServiceImpl implements ILiveAfterSalesService {
             StoreConfig config=JSONUtil.toBean(json,StoreConfig.class);
             LiveOrder order=liveOrderMapper.selectLiveOrderByOrderId(String.valueOf(liveAfterSales.getOrderId()));
             if(order.getStoreHouseCode()!=null){
-                if(order.getStoreHouseCode().equals("CQDS001")){
+                if(order.getStoreHouseCode().equals("CK01")){
                     liveAfterSales.setConsignee(config.getRefundConsignee());
                     liveAfterSales.setPhoneNumber(config.getRefundPhoneNumber());
                     liveAfterSales.setAddress(config.getRefundAddress());

+ 22 - 17
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -1258,6 +1258,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
     }
 
     @Override
+    @Transactional(rollbackFor = Exception.class)
     public R refundOrderMoney(Long orderId, LiveAfterSales liveAfterSales) {
         IErpOrderService erpOrderService = getErpService();
         FsErpConfig erpConfig = configUtil.generateStructConfigByKey("his.config", FsErpConfig.class);
@@ -1268,7 +1269,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         if (order.getStatus() == -2) {
             return R.error("已退款");
         }
-        if (order.getStatus() != 1 && order.getStatus() != 2) {
+        if (!liveAfterSales.getStatus().equals(AfterSalesStatusEnum.STATUS_3.getValue())) {
             return R.error("非法操作");
         }
         if (erpConfig.getErpOpen() != null
@@ -1277,6 +1278,10 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 && !CloudHostUtils.hasCloudHostName("康年堂")) {
             return R.error("暂未推送至erp,请稍后再试!");
         }
+        liveAfterSales.setRefundAmount(order.getPayPrice());
+        liveAfterSales.setStatus(4);
+        liveAfterSales.setSalesStatus(3);
+        liveAfterSalesService.updateLiveAfterSales(liveAfterSales);
         if (StringUtils.isNotEmpty(order.getExtendOrderId())) {
             ErpRefundUpdateRequest request = new ErpRefundUpdateRequest();
             request.setTid(order.getOrderCode());
@@ -1811,7 +1816,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         totalPrice = totalPrice.add(deliveryMoney);
         liveOrder.setDiscountMoney(totalPrice);
 
-
+        fsStoreProduct.setCost(BigDecimal.ZERO);
         liveOrder.setItemJson(JSON.toJSONString(fsStoreProduct));
         liveOrder.setCreateTime(new Date());
         liveOrder.setUpdateTime(new Date());
@@ -2258,13 +2263,13 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         for (FsMyLiveOrderListQueryVO vo : list) {
 //          List<FsStoreOrderItemVO> items=fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(vo.getId());
 //          vo.setItems(items);
-            if (StringUtils.isNotEmpty(vo.getItemJson())) {
-                JSONArray jsonArray = JSONUtil.parseArray(vo.getItemJson());
-                List<LiveOrderItem> items = JSONUtil.toList(jsonArray, LiveOrderItem.class);
-                if (!items.isEmpty()) {
-                    vo.setItems(items);
-                }
-            }
+//            if (StringUtils.isNotEmpty(vo.getItemJson())) {
+//                JSONArray jsonArray = JSONUtil.parseArray(vo.getItemJson());
+//                List<LiveOrderItem> items = JSONUtil.toList(jsonArray, LiveOrderItem.class);
+//                if (!items.isEmpty()) {
+//                    vo.setItems(items);
+//                }
+//            }
             //处理是否可以申请售后
             vo.setIsAfterSales(0);
             if (vo.getStatus().equals(OrderInfoEnum.STATUS_3.getValue())) {
@@ -2296,13 +2301,13 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         for (FsMyLiveOrderListQueryVO vo : list) {
 //          List<FsStoreOrderItemVO> items=fsStoreOrderItemMapper.selectMyFsStoreOrderItemListByOrderId(vo.getId());
 //          vo.setItems(items);
-            if (StringUtils.isNotEmpty(vo.getItemJson())) {
-                JSONArray jsonArray = JSONUtil.parseArray(vo.getItemJson());
-                List<LiveOrderItem> items = JSONUtil.toList(jsonArray, LiveOrderItem.class);
-                if (items.size() > 0) {
-                    vo.setItems(items);
-                }
-            }
+//            if (StringUtils.isNotEmpty(vo.getItemJson())) {
+//                JSONArray jsonArray = JSONUtil.parseArray(vo.getItemJson());
+//                List<LiveOrderItem> items = JSONUtil.toList(jsonArray, LiveOrderItem.class);
+//                if (items.size() > 0) {
+//                    vo.setItems(items);
+//                }
+//            }
         }
         return list;
     }
@@ -3274,7 +3279,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 }
             }
         }
-
+        fsStoreProduct.setCost(BigDecimal.ZERO);
         liveOrder.setItemJson(JSON.toJSONString(fsStoreProduct));
         liveOrder.setCreateTime(new Date());
         liveOrder.setUpdateTime(new Date());

+ 8 - 3
fs-service/src/main/java/com/fs/live/vo/LiveOrderVoZm.java

@@ -18,6 +18,11 @@ import java.util.Date;
 @Data
 public class LiveOrderVoZm{
 
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+
     /** 订单ID */
     private Long orderId;
 
@@ -115,6 +120,9 @@ public class LiveOrderVoZm{
     @Excel(name = "成本价格")
     private BigDecimal cost;
 
+    @Excel(name = "结算价格")
+    private BigDecimal fPrice;
+
     /** 详细地址 */
     @Excel(name = "收货地址")
     private String userAddress;
@@ -134,9 +142,6 @@ public class LiveOrderVoZm{
 
 
 
-    /** 订单号 */
-//    @Excel(name = "订单号")
-    private String orderCode;
 
 
     /** 收货人 */

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

@@ -542,4 +542,6 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
 
 
     List<QwExternalContact> getGroupChatUserByChatIdAndUserName(@Param("userId")String userId,@Param("userName")String userName,@Param("corpId") String corpId,@Param("chatId") String chatId);
+    @Select("select * from qw_external_contact where unionid = #{unionID} order by create_time asc limit 1 ")
+    QwExternalContact selectQwExternalByUnionID(String unionId);
 }

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

@@ -77,7 +77,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="descs != null">#{descs},</if>
             <if test="content != null">#{content},</if>
             <if test="imgUrl != null">#{imgUrl},</if>
-            <if test="images != null">images,</if>
+            <if test="images != null">#{images},</if>
             <if test="products != null">#{products},</if>
             <if test="money != null">#{money},</if>
             <if test="payMoney != null">#{payMoney},</if>

+ 24 - 2
fs-service/src/main/resources/mapper/hisStore/FsStoreProductScrmMapper.xml

@@ -71,6 +71,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="returnAddress"    column="return_address"    />
         <result property="brand"    column="brand"    />
         <result property="foodProductionLicenseCode"    column="food_production_license_code"    />
+        <result property="originPlace"    column="origin_place"    />
+        <result property="netContent"    column="net_content"    />
+        <result property="shelfLife"    column="shelf_life"    />
+        <result property="domesticImported"    column="domestic_imported"    />
     </resultMap>
 
     <sql id="selectFsStoreProductVo">
@@ -81,7 +85,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                integral, product_type, prescribe_code, prescribe_spec, prescribe_factory, prescribe_name,
                is_display,tui_cate_id,company_ids,is_drug,drug_image,drug_reg_cert_no,common_name,dosage_form,
                unit_price,batch_number,mah,mah_address,manufacturer,manufacturer_address,indications,dosage,
-               adverse_reactions,contraindications,precautions,is_audit,store_id,return_address,brand,food_production_license_code
+               adverse_reactions,contraindications,precautions,is_audit,store_id,return_address,brand,food_production_license_code,
+               origin_place,net_content,shelf_life,domestic_imported
                from fs_store_product_scrm
     </sql>
 
@@ -93,7 +98,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                p.integral, p.product_type, p.prescribe_code, p.prescribe_spec, p.prescribe_factory, p.prescribe_name,
                p.is_display,p.tui_cate_id,p.company_ids,p.is_drug,p.drug_image,p.drug_reg_cert_no,p.common_name,p.dosage_form,
                p.unit_price,p.batch_number,p.mah,p.mah_address,p.manufacturer,p.manufacturer_address,p.indications,p.dosage,
-               p.adverse_reactions,p.contraindications,p.precautions,p.is_audit,p.store_id,p.return_address,p.brand,p.food_production_license_code
+               p.adverse_reactions,p.contraindications,p.precautions,p.is_audit,p.store_id,p.return_address,p.brand,p.food_production_license_code,
+               p.origin_place,p.net_content,p.shelf_life,p.domestic_imported
         from fs_store_product_scrm p
     </sql>
 
@@ -164,6 +170,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="storeId != null and storeId != ''">and store_id = #{storeId} </if>
             <if test="brand != null and brand != ''">and brand = #{brand} </if>
             <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">and food_production_license_code = #{foodProductionLicenseCode} </if>
+            <if test="originPlace != null and originPlace != ''">and origin_place like concat('%', #{originPlace}, '%') </if>
+            <if test="netContent != null and netContent != ''">and net_content = #{netContent} </if>
+            <if test="shelfLife != null">and shelf_life = #{shelfLife} </if>
+            <if test="domesticImported != null and domesticImported != ''">and domestic_imported = #{domesticImported} </if>
         </where>
     </select>
 
@@ -262,6 +272,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="returnAddress != null">return_address,</if>
             <if test="brand != null and brand != ''">brand,</if>
             <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">food_production_license_code,</if>
+            <if test="originPlace != null and originPlace != ''">origin_place,</if>
+            <if test="netContent != null and netContent != ''">net_content,</if>
+            <if test="shelfLife != null">shelf_life,</if>
+            <if test="domesticImported != null and domesticImported != ''">domestic_imported,</if>
          </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="image != null and image != ''">#{image},</if>
@@ -329,6 +343,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="returnAddress != null">#{returnAddress},</if>
             <if test="brand != null and brand != ''">#{brand},</if>
             <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">#{foodProductionLicenseCode},</if>
+            <if test="originPlace != null and originPlace != ''">#{originPlace},</if>
+            <if test="netContent != null and netContent != ''">#{netContent},</if>
+            <if test="shelfLife != null">#{shelfLife},</if>
+            <if test="domesticImported != null and domesticImported != ''">#{domesticImported},</if>
          </trim>
     </insert>
 
@@ -400,6 +418,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="returnAddress != null">return_address = #{returnAddress},</if>
             <if test="brand != null and brand != ''">brand = #{brand},</if>
             <if test="foodProductionLicenseCode != null and foodProductionLicenseCode != ''">food_production_license_code = #{foodProductionLicenseCode},</if>
+            <if test="originPlace != null">origin_place = #{originPlace},</if>
+            <if test="netContent != null">net_content = #{netContent},</if>
+            <if test="shelfLife != null">shelf_life = #{shelfLife},</if>
+            <if test="domesticImported != null">domestic_imported = #{domesticImported},</if>
         </trim>
         where product_id = #{productId}
     </update>

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

@@ -55,7 +55,11 @@ public class CompanyOrderScrmController extends AppBaseController {
 
         PageHelper.startPage(param.getPage(), param.getPageSize());
         param.setIsDisplay(0);
-        List<FsStoreProductListQueryVO> productList=productService.selectFsStoreProductListQuery(param);
+        List<FsStoreProductListQueryVO> productList = productService.selectFsStoreProductListQuery(param);
+        for (FsStoreProductListQueryVO fsStoreProductListQueryVO : productList) {
+            fsStoreProductListQueryVO.setCompanyId(companyUser.getCompanyId());
+            fsStoreProductListQueryVO.setCompanyUserId(companyUser.getUserId());
+        }
         PageInfo<FsStoreProductListQueryVO> listPageInfo=new PageInfo<>(productList);
         return R.ok().put("data",listPageInfo);
     }