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

1.恒春来更新侧边栏代客下单功能

jzp 3 napja
szülő
commit
c5e1785ae0
35 módosított fájl, 1540 hozzáadás és 3 törlés
  1. 1 0
      fs-qw-api-msg/src/main/java/com/fs/framework/config/SecurityConfig.java
  2. 138 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/AddressScrmController.java
  3. 283 0
      fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java
  4. 23 0
      fs-qwhook-sop/src/main/java/com/fs/app/params/vo/CityVO.java
  5. 85 0
      fs-qwhook-sop/src/main/java/com/fs/app/utils/CityTreeUtil.java
  6. 2 0
      fs-service/src/main/java/com/fs/course/mapper/FsCourseWatchLogMapper.java
  7. 3 0
      fs-service/src/main/java/com/fs/course/service/IFsCourseWatchLogService.java
  8. 5 0
      fs-service/src/main/java/com/fs/course/service/impl/FsCourseWatchLogServiceImpl.java
  9. 363 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrmSidebarParam.java
  10. 3 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java
  11. 4 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  12. 19 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductCategoryScrmMapper.java
  13. 37 0
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  14. 2 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreCartDelParam.java
  15. 3 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreCartNumParam.java
  16. 2 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreCartParam.java
  17. 3 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCartScrmService.java
  18. 10 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  19. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductCategoryScrmService.java
  20. 3 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  21. 79 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java
  22. 298 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  23. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductCategoryScrmServiceImpl.java
  24. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  25. 87 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderScrmSidebarVO.java
  26. 4 1
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListQueryVO.java
  27. 2 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  28. 5 0
      fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java
  29. 5 0
      fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java
  30. 8 0
      fs-service/src/main/java/com/fs/sop/service/impl/QwSopServiceImpl.java
  31. 1 1
      fs-service/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml
  32. 4 0
      fs-service/src/main/resources/mapper/course/FsCourseWatchLogMapper.xml
  33. 27 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  34. 7 0
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml
  35. 12 1
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java

+ 1 - 0
fs-qw-api-msg/src/main/java/com/fs/framework/config/SecurityConfig.java

@@ -114,6 +114,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter
                 .antMatchers("/msg/**").anonymous()
                 .antMatchers("/msg/**/**").anonymous()
                 .antMatchers("/msg").anonymous()
+                .antMatchers("/app/common/**").anonymous()
                 .antMatchers("/testSop").anonymous()
                 .antMatchers("/common/getId**").anonymous()
                 .antMatchers("/common/uploadOSS**").anonymous()

+ 138 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/AddressScrmController.java

@@ -0,0 +1,138 @@
+package com.fs.app.controller;
+
+
+import cn.hutool.core.bean.BeanUtil;
+
+import com.fs.app.params.vo.CityVO;
+import com.fs.app.utils.CityTreeUtil;
+import com.fs.common.core.domain.R;
+import com.fs.hisStore.domain.FsCityScrm;
+import com.fs.hisStore.domain.FsUserAddressScrm;
+import com.fs.hisStore.param.FsAddressParseParam;
+import com.fs.hisStore.param.FsUserAddressAddEditParam;
+import com.fs.hisStore.service.IFsCityScrmService;
+import com.fs.hisStore.service.IFsExpressScrmService;
+import com.fs.hisStore.service.IFsUserAddressScrmService;
+import com.google.common.collect.Lists;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import springfox.documentation.annotations.Cacheable;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.validation.Valid;
+import java.util.List;
+
+
+
+@Api("地址接口")
+@RestController
+@RequestMapping(value="/store/app/address")
+public class AddressScrmController {
+
+    @Autowired
+    private IFsExpressScrmService expressService;
+    @Autowired
+    private IFsUserAddressScrmService addressService;
+
+    @Autowired
+    private IFsCityScrmService cityService;
+
+
+    /*@ApiOperation("获取城市数据")
+    @GetMapping("/getCity")
+    @Cacheable("citys")
+    public R getCity(HttpServletRequest request){
+        List<FsCityScrm> list=cityService.selectFsCitys();
+        return R.ok().put("data", list);
+
+    }*/
+
+    @ApiOperation("获取城市数据")
+    @GetMapping("/getCitys")
+    @Cacheable("cityData")
+    public R getCitys(HttpServletRequest request){
+        List<FsCityScrm> list=cityService.selectFsCitys();
+        List<CityVO> cityVOS = Lists.newArrayList();
+        for (FsCityScrm city : list){
+            CityVO cityVO = new CityVO();
+            cityVO.setV(city.getCityId());
+            cityVO.setN(city.getCityName());
+            cityVO.setPid(city.getParentId());
+            cityVOS.add(cityVO);
+        }
+        return R.ok().put("data", CityTreeUtil.list2TreeConverter(cityVOS, "0"));
+
+    }
+
+    @GetMapping("/getAddressList")
+    public R getAddressList(FsUserAddressScrm fsUserAddress){
+        fsUserAddress.setIsDel(0);
+        List<FsUserAddressScrm> list = addressService.selectFsUserAddressList(fsUserAddress);
+        return R.ok().put("data", list);
+    }
+
+    @GetMapping("/getAddressById")
+    public R getAddressById(@RequestParam("id")Long id){
+        FsUserAddressScrm address=addressService.selectFsUserAddressById(id);
+        return R.ok().put("data",address);
+    }
+    @ApiOperation("添加地址")
+    @PostMapping("/addAddress")
+    public R addAddress(@Valid @RequestBody FsUserAddressAddEditParam address, HttpServletRequest request){
+        Long userId = address.getUserId();
+        //处理地址数量 最大20个
+        Integer count=addressService.selectFsUserAddressCountsByUserId(userId);
+        if(count>20){
+            return R.error("最多可创建20个地址");
+        }
+        if(address.getIsDefault()==1){
+            //处理默认地址
+            addressService.clearIsDefalut(userId);
+        }
+        address.setPhone(address.getPhone().trim());
+        FsUserAddressScrm userAddress=new FsUserAddressScrm();
+        BeanUtil.copyProperties(address, userAddress);
+        addressService.insertFsUserAddress(userAddress);
+        return R.ok("操作成功").put("addressId", userAddress.getId());
+    }
+
+    @ApiOperation("编辑地址")
+    @PostMapping("/editAddress")
+    public R editAddress(@Valid @RequestBody FsUserAddressAddEditParam address, HttpServletRequest request){
+        Long userId = address.getUserId();
+        if(address.getIsDefault()==1){
+            //处理默认地址
+            addressService.clearIsDefalut(userId);
+        }
+        FsUserAddressScrm userAddress=new FsUserAddressScrm();
+        BeanUtil.copyProperties(address, userAddress);
+        addressService.updateFsUserAddress(userAddress);
+        return R.ok("操作成功");
+    }
+
+    @ApiOperation("删除地址")
+    @PostMapping("/delAddress")
+    public R delAddress(@RequestBody FsUserAddressAddEditParam address, HttpServletRequest request){
+        addressService.deleteFsUserAddressById(address.getId());
+        return R.ok("操作成功");
+    }
+
+    @ApiOperation("地址解析")
+    @PostMapping("/parseAddress")
+    public R parseAddress(@RequestBody FsAddressParseParam param){
+        return expressService.parseAddress(param.getContent());
+    }
+
+
+    @ApiOperation("删除所有地址")
+    @PostMapping("/delAllAddress")
+    public R delAllAddress(@RequestBody FsUserAddressAddEditParam address){
+        Long userId = address.getUserId();
+        addressService.delAllAddress(userId);
+        return R.ok("操作成功");
+    }
+
+
+}

+ 283 - 0
fs-qwhook-sop/src/main/java/com/fs/app/controller/FsUserCourseVideoController.java

@@ -1,11 +1,17 @@
 package com.fs.app.controller;
 
+import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
+import com.fs.app.annotation.Login;
 import com.fs.common.annotation.RepeatSubmit;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.ResponseResult;
 import com.fs.common.utils.CloudHostUtils;
+import com.fs.common.utils.ParseUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.domain.FsUserCourse;
 import com.fs.course.param.FsCourseLinkCreateParam;
@@ -24,10 +30,17 @@ import com.fs.course.vo.newfs.FsUserCourseVideoDetailsVO;
 import com.fs.course.vo.newfs.FsUserCourseVideoPageListVO;
 import com.fs.course.vo.newfs.FsUserVideoListVO;
 import com.fs.his.utils.ConfigUtil;
+import com.fs.hisStore.domain.*;
+import com.fs.hisStore.enums.OrderInfoEnum;
 import com.fs.hisStore.enums.SysConfigEnum;
+import com.fs.hisStore.param.*;
+import com.fs.hisStore.service.*;
+import com.fs.hisStore.vo.*;
+import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.domain.QwUser;
 import com.fs.qw.service.IQwExternalContactService;
 import com.fs.qw.service.IQwUserService;
+import com.fs.store.config.StoreConfig;
 import com.fs.system.service.ISysConfigService;
 import com.fs.voice.utils.StringUtil;
 import com.github.pagehelper.PageHelper;
@@ -36,8 +49,15 @@ import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+import java.text.SimpleDateFormat;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.GregorianCalendar;
 import java.util.List;
 
 
@@ -63,6 +83,30 @@ public class FsUserCourseVideoController {
 
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private IFsStoreProductScrmService productService;
+    @Autowired
+    private ICompanyUserService companyUserService;
+    @Autowired
+    private IFsStoreOrderScrmService orderService;
+    @Autowired
+    private IFsStoreCartScrmService cartService;
+    @Autowired
+    private IFsStoreProductCategoryScrmService categoryService;
+    @Autowired
+    private IFsStoreScrmService storeScrmService;
+    @Autowired
+    private IFsStoreProductAttrScrmService attrService;
+    @Autowired
+    private IFsStoreProductAttrValueScrmService attrValueService;
+    @Autowired
+    private IFsStoreProductRelationScrmService productRelationService;
+    @Autowired
+    private IFsStoreProductPurchaseLimitScrmService purchaseLimitService;
+    @Autowired
+    private IFsPrescribeScrmService prescribeService;
+    @Autowired
+    private IFsStoreOrderItemScrmService itemService;
 
 
     @ApiOperation("课程视频详情")
@@ -71,6 +115,245 @@ public class FsUserCourseVideoController {
         return fsUserCourseVideoService.getVideoDetails(videoId);
     }
 
+    @ApiOperation("获取侧边栏商品列表")
+    @PostMapping("/getSalesProductsBySidebar")
+    public R getSalesProductsBySidebar(@RequestBody FsStoreOrderScrmSidebarVO param){
+        //
+        QwUser qwUser = qwExternalContactService.getQwUserByRedis(param.getCorpId().trim(),param.getQwUserId().trim());
+
+        if (qwUser == null || qwUser.getCompanyId() == null) {
+            return R.error("员工未绑定 销售公司 或 未获取到员工信息,请重试!");
+        }
+        String externalUserId = param.getExternalUserId();
+        QwExternalContact qwExternalContact = qwExternalContactService.selectQwExternalContactByExternalUserIdSidebar(externalUserId, param.getCorpId());
+
+        if(qwExternalContact == null || qwExternalContact.getFsUserId() == null){
+            return R.error("用户未绑定,暂时无法下单");
+        }
+        param.setCompanyId(qwUser.getCompanyId());
+
+        PageHelper.startPage(param.getPage(), param.getPageSize());
+        param.setIsDisplay(0);
+        List<FsStoreProductListQueryVO> productList = productService.selectFsStoreProductSidebarListQuery(param);
+        for (FsStoreProductListQueryVO fsStoreProductListQueryVO : productList) {
+            fsStoreProductListQueryVO.setCompanyId(qwUser.getCompanyId());
+            fsStoreProductListQueryVO.setCompanyUserId(qwUser.getCompanyUserId());
+        }
+        PageInfo<FsStoreProductListQueryVO> listPageInfo=new PageInfo<>(productList);
+        return R.ok().put("data",listPageInfo).put("qwUser",qwUser).put("extUser",qwExternalContact);
+    }
+    @ApiOperation("获取商品详情")
+    @GetMapping("/getProductDetails")
+    public R getProductDetails(@RequestParam(value="productId") Long productId,@RequestParam(value="storeId")String storeId,@RequestParam(value="userId") Long userId){
+        FsStoreProductQueryVO product=productService.selectFsStoreProductByIdQuery(productId, storeId);
+        if(product==null){
+            return R.error("商品不存在或已下架");
+        }
+        //增加店铺信息
+        FsStoreScrm fsStoreScrm = null;
+        if(StringUtils.isNotEmpty(product.getStoreId())){
+            fsStoreScrm = storeScrmService.selectFsStoreByStoreId(Long.parseLong(product.getStoreId()));
+        }
+        List<FsStoreProductAttrScrm> productAttr=attrService.selectFsStoreProductAttrByProductId(product.getProductId());
+        List<FsStoreProductAttrValueScrm> productValues=attrValueService.selectFsStoreProductAttrValueByProductId(product.getProductId());
+
+        //获取用户的TOKEN写入足迹
+        if(userId!=null){
+            FsStoreProductRelationScrm productRelation=new FsStoreProductRelationScrm();
+            productRelation.setIsDel(0);
+            productRelation.setUserId(userId);
+            productRelation.setProductId(product.getProductId());
+            productRelation.setType("foot");
+            List<FsStoreProductRelationScrm> productRelations=productRelationService.selectFsStoreProductRelationList(productRelation);
+            if(productRelations!=null&&productRelations.size()>0){
+                FsStoreProductRelationScrm relation=productRelations.get(0);
+                relation.setUpdateTime(new Date());
+                productRelationService.updateFsStoreProductRelation(relation);
+            }
+            else{
+                FsStoreProductRelationScrm relation=new FsStoreProductRelationScrm();
+                relation.setUserId(userId);
+                relation.setIsDel(0);
+                relation.setProductId(product.getProductId());
+                relation.setUpdateTime(new Date());
+                relation.setType("foot");
+                relation.setCreateTime(new Date());
+                relation.setUpdateTime(new Date());
+                productRelationService.insertFsStoreProductRelation(relation);
+            }
+        }
+
+        // 查询限购信息
+        Integer remainingPurchaseLimit = null; // 剩余可购买数量
+        Integer purchasedNum = 0; // 已购买数量
+        if (product.getPurchaseLimit() != null && product.getPurchaseLimit() > 0) {
+            // 商品有限购,查询用户是否购买过
+            if (userId != null) {
+                FsStoreProductPurchaseLimitScrm purchaseLimit = purchaseLimitService.selectByProductIdAndUserId(
+                        product.getProductId(), userId);
+                if (purchaseLimit != null) {
+                    purchasedNum = purchaseLimit.getNum();
+                }
+                // 计算剩余可购买数量
+                remainingPurchaseLimit = product.getPurchaseLimit() - purchasedNum;
+                if (remainingPurchaseLimit < 0) {
+                    remainingPurchaseLimit = 0;
+                }
+            } else {
+                // 未登录用户,剩余可购买数量等于限购数量
+                remainingPurchaseLimit = product.getPurchaseLimit();
+            }
+        }
+
+        return R.ok().put("product",product)
+                .put("productAttr",productAttr)
+                .put("productValues",productValues)
+                .put("store",fsStoreScrm)
+                .put("remainingPurchaseLimit", remainingPurchaseLimit) // 剩余可购买数量
+                .put("purchasedNum", purchasedNum); // 已购买数量
+    }
+
+    @ApiOperation("侧边栏制单")
+    @PostMapping("/createSalesOrderBySidebar")
+    public R createSalesOrderBySidebar(@RequestBody FsStoreOrderScrmSidebarVO param){
+        String cartIds = param.getCartIds();
+
+        CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
+        if(companyUser==null||companyUser.getDelFlag().equals("1")){
+            return R.error("用户不存在");
+        }
+        if(!companyUser.getStatus().equals("0")){
+            return R.error("用户已禁用");
+        }
+        return orderService.createSalesOrderBySidebar(companyUser,cartIds);
+    }
+
+    @ApiOperation("获取我的订单详情")
+    @GetMapping("/getMyStoreOrderById")
+    public R getMyStoreOrderById(@RequestParam("orderId") Long orderId, HttpServletRequest request){
+        FsStoreOrderScrm order=orderService.selectFsStoreOrderById(orderId);
+        order.setUserPhone(ParseUtils.parsePhone(order.getUserPhone()));
+        order.setUserAddress(ParseUtils.parseIdCard(order.getUserAddress()));
+        List<FsStoreOrderItemVO> list=itemService.selectFsStoreOrderItemListByOrderId(orderId);
+        Calendar calendar = Calendar.getInstance();
+        calendar.setTime(order.getCreateTime());
+        String json=configService.selectConfigByKey("his.store");
+        StoreConfig config= JSONUtil.toBean(json,StoreConfig.class);
+        calendar.add(Calendar.MINUTE,config.getUnPayTime());
+        SimpleDateFormat format = new   SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        String payLimitTime = format.format(calendar.getTime() );
+        FsPrescribeScrm prescribe=null;
+        if(order.getPrescribeId()!=null){
+            prescribe=prescribeService.selectFsPrescribeById(order.getPrescribeId());
+        }
+        //处理是否可以申请售后
+        Integer isAfterSales=0;
+        if(order.getStatus().equals(OrderInfoEnum.STATUS_3.getValue())) {
+            //已完成订单
+            isAfterSales=1;
+            if (order.getFinishTime() != null) {
+                if (config.getStoreAfterSalesDay() != null && config.getStoreAfterSalesDay() > 0) {
+                    //判断完成时间是否超过指定时间
+                    Calendar calendarAfterSales = new GregorianCalendar();
+                    calendarAfterSales.setTime(order.getFinishTime());
+                    calendarAfterSales.add(calendarAfterSales.DATE, config.getStoreAfterSalesDay()); //把日期往后增加一天,整数  往后推,负数往前移动
+                    if (calendarAfterSales.getTime().getTime() < new Date().getTime()) {
+                        isAfterSales = 0;
+                    }
+                }
+            }
+        }
+        else if(order.getStatus()==1||order.getStatus()==2){
+            isAfterSales=1;
+        }
+        return R.ok().put("isAfterSales",isAfterSales).put("order",order).put("items",list).put("payLimitTime",payLimitTime).put("prescribe",prescribe);
+    }
+    @ApiOperation("创建订单 侧边栏")
+    @PostMapping("/createBySidebar")
+    public R createBySidebar(@Validated @RequestBody FsStoreOrderScrmSidebarVO param){
+        log.info("开始创建订单,客户id:{}", param.getUserId());
+        return orderService.createOrderBySidebar(param);
+    }
+
+    @ApiOperation("获取制单信息 侧边栏")
+    @GetMapping("/getOrderInfoBySidebar")
+    public R getOrderInfoBySidebar(@RequestParam("orderKey") String orderKey,@RequestParam("userId")Long userId){
+        return orderService.getOrderInfoBySidebar(orderKey,userId);
+    }
+
+
+    @ApiOperation("改订单价格  侧边栏")
+    @PostMapping("/editOrderMoneyBySidebar")
+    @Transactional
+    public R editOrderMoneyBySidebar(@RequestBody FsStoreOrderScrmSidebarVO param){
+        return orderService.editOrderMoneyBySidebar(param);
+    }
+
+    @ApiOperation("获取客户订单列表 侧边栏")
+    @GetMapping("/getStoreOrderListBySidebar")
+    public R getStoreOrderListBySidebar(FsStoreOrderScrmSidebarVO param){
+
+        String externalUserId = param.getExternalUserId();
+        QwExternalContact qwExternalContact = qwExternalContactService.selectQwExternalContactByExternalUserIdSidebar(externalUserId, param.getCorpId());
+
+        if(qwExternalContact == null || qwExternalContact.getFsUserId() == null){
+            return R.error("用户未绑定,无法查询订单");
+        }
+        PageHelper.startPage(param.getPage(), param.getPageSize());
+
+        param.setUserId(qwExternalContact.getFsUserId());
+        param.setCompanyUserId(param.getCompanyUserId());
+
+        List<FsMyStoreOrderListQueryVO> list=orderService.selectFsStoreOrderListBySidebarVO(param);
+        PageInfo<FsMyStoreOrderListQueryVO> listPageInfo=new PageInfo<>(list);
+        return R.ok().put("data",listPageInfo);
+    }
+    @ApiOperation("获取分类 侧边栏")
+    @GetMapping("/getProductCateBySidebar")
+    public R getProductCateBySidebar(@RequestParam(value="pid") Long pid, @RequestParam(value="storeId",required = false) Long storeId){
+        try {
+            FsStoreProductCategoryScrm param=new FsStoreProductCategoryScrm();
+            param.setIsShow(1);
+            param.setIsDel(0);
+            param.setPid(pid);
+            param.setStoreId(storeId);
+            List<FsStoreProductCategoryScrm> list=categoryService.selectFsStoreProductCategoryListQueryBySidebar(param);
+            return R.ok().put("data",list);
+        } catch (Exception e){
+            return R.error("操作异常");
+        }
+    }
+
+    @ApiOperation("添加购物车 侧边栏")
+    @PostMapping("/addCartBySidebar")
+    public R addCartBySidebar(@Validated @RequestBody FsStoreCartParam cartParam){
+        return cartService.addCartBySidebar(cartParam.getUserId(),cartParam);
+    }
+    @ApiOperation("获取购物车列表 侧边栏")
+    @GetMapping("/getCartsBySidebar")
+    public R getCartsBySidebar(@RequestParam("userId") Long userId){
+        List<FsStoreCartVO> carts= cartService.selectFsStoreCartListByUid(userId);
+        return R.ok().put("carts",carts);
+    }
+
+    @ApiOperation("计算购物车商品总价 侧边栏")
+    @GetMapping("/getCartsTotalBySidebar")
+    public R getCartsTotalBySidebar(@RequestParam("cartIds") String cartIds){
+        return cartService.selectFsStoreCartTotalByCarts(cartIds);
+    }
+
+    @ApiOperation("改变购物车数量 侧边栏")
+    @PostMapping("/cartNumBySidebar")
+    public R cartNumBySidebar(@Validated @RequestBody FsStoreCartNumParam cartParam){
+        return cartService.changeNum(cartParam.getUserId(),cartParam);
+    }
+    @ApiOperation("删除购物车 侧边栏")
+    @PostMapping("/delCartBySidebar")
+    public R delCartBySidebar(@Validated @RequestBody FsStoreCartDelParam cartParam){
+        return cartService.delCart(cartParam.getUserId(),cartParam);
+    }
+
+
     @PostMapping("/getFsCourseListBySidebar")
     @ApiOperation("获取视频课程下拉列表 侧边栏")
     public R getFsCourseListBySidebar(@RequestBody FsCourseListBySidebarParam param) {

+ 23 - 0
fs-qwhook-sop/src/main/java/com/fs/app/params/vo/CityVO.java

@@ -0,0 +1,23 @@
+package com.fs.app.params.vo;
+
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Getter
+@Setter
+@ToString
+public class CityVO implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    private String v; //id
+
+    private String n; //名称
+
+    private String pid;
+
+    private List<CityVO> c; //子集
+}

+ 85 - 0
fs-qwhook-sop/src/main/java/com/fs/app/utils/CityTreeUtil.java

@@ -0,0 +1,85 @@
+package com.fs.app.utils;
+import com.fs.app.params.vo.CityVO;
+import org.springframework.util.CollectionUtils;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @ClassName 树形工具类
+ **/
+public class CityTreeUtil {
+    /**
+     * 获得指定节点下所有归档
+     *
+     * @param list
+     * @param parentId
+     * @return
+     */
+    public static List<CityVO> list2TreeConverter(List<CityVO> list, String parentId) {
+        List<CityVO> returnList = new ArrayList<>();
+
+        for (CityVO res : list) {
+            //判断对象是否为根节点
+
+            if (res.getPid().equals(parentId)) {
+                //该节点为根节点,开始递归
+
+                //通过递归为节点设置childList
+                recursionFn(list, res);
+
+                returnList.add(res);
+            }
+        }
+
+        return returnList;
+    }
+
+    /**
+     * 递归列表
+     * 通过递归,给指定t节点设置childList
+     *
+     * @param list
+     * @param t
+     */
+    public static void recursionFn(List<CityVO> list, CityVO t) {
+        //只能获取当前t节点的子节点集,并不是所有子节点集
+        List<CityVO> childsList = getChildList(list, t);
+
+        //设置他的子集对象集
+        t.setC(childsList);
+
+        //迭代子集对象集
+
+        //遍历完,则退出递归
+        for (CityVO nextChild : childsList) {
+
+            //判断子集对象是否还有子节点
+            if (!CollectionUtils.isEmpty(childsList)) {
+                //有下一个子节点,继续递归
+                recursionFn(list, nextChild);
+            }
+        }
+    }
+
+    /**
+     * 获得指定节点下的所有子节点
+     *
+     * @param list
+     * @param t
+     * @return
+     */
+    public static List<CityVO> getChildList(List<CityVO> list, CityVO t) {
+        List<CityVO> childsList = new ArrayList<>();
+        //遍历集合元素,如果元素的Parentid==指定元素的id,则说明是该元素的子节点
+        for (CityVO t1 : list) {
+            if (t1.getPid().equals(t.getV())) {
+                childsList.add(t1);
+            }
+        }
+
+        return childsList;
+    }
+
+
+}

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

@@ -750,4 +750,6 @@ public interface FsCourseWatchLogMapper extends BaseMapper<FsCourseWatchLog> {
     List<FsCourseReportVO> selectWatchStatistics(FsCourseWatchLogStatisticsListParam param);
 
     List<FsSopMyCourseH5LinkVO> getSopCourseH5StudyList(@Param("userId") Long userId);
+
+    List<FsCourseWatchLog> selectFsUserWatchLogByExtId(QwExternalContact qwExternalContact);
 }

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

@@ -5,6 +5,7 @@ import com.fs.common.core.domain.R;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.param.*;
 import com.fs.course.vo.*;
+import com.fs.qw.domain.QwExternalContact;
 import com.fs.qw.param.QwSidebarStatsParam;
 import com.fs.qw.vo.QwWatchLogStatisticsListVO;
 
@@ -166,4 +167,6 @@ public interface IFsCourseWatchLogService extends IService<FsCourseWatchLog> {
     R encryptLink(String url);
 
     R decryptLink(String url);
+
+    List<FsCourseWatchLog> selectFsUserWatchLogByExtId(QwExternalContact qwExternalContact);
 }

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

@@ -1719,4 +1719,9 @@ public class FsCourseWatchLogServiceImpl extends ServiceImpl<FsCourseWatchLogMap
         return R.ok().put("data", data);
     }
 
+    @Override
+    public List<FsCourseWatchLog> selectFsUserWatchLogByExtId(QwExternalContact qwExternalContact) {
+        return fsCourseWatchLogMapper.selectFsUserWatchLogByExtId(qwExternalContact);
+    }
+
 }

+ 363 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStoreOrderScrmSidebarParam.java

@@ -0,0 +1,363 @@
+package com.fs.hisStore.domain;
+
+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;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+
+@Data
+public class FsStoreOrderScrmSidebarParam extends BaseEntity {
+    private static final long serialVersionUID = 1L;
+
+    /** 订单ID */
+    private Long id;
+
+    /** 订单号 */
+    @Excel(name = "订单号")
+    private String orderCode;
+
+    /** 额外订单号 */
+    private String extendOrderId;
+
+    private String payOrderId;
+
+    private String bankOrderId;
+
+    /** 用户id */
+    private Long userId;
+
+    /** 用户姓名 */
+    @Excel(name = "收货人")
+    private String realName;
+
+    /** 用户电话 */
+    @Excel(name = "手机号")
+    private String userPhone;
+
+    /** 详细地址 */
+    @Excel(name = "详细地址")
+    private String userAddress;
+
+    /** 购物车id */
+    private String cartId;
+
+    /** 运费金额 */
+    private BigDecimal freightPrice;
+
+    /** 订单商品总数 */
+    @Excel(name = "订单商品总数")
+    private Long totalNum;
+
+    /** 订单总价 */
+    @Excel(name = "订单总价")
+    private BigDecimal totalPrice;
+
+    /** 邮费 */
+    private BigDecimal totalPostage;
+
+    /** 实际支付金额 */
+    @Excel(name = "应付金额")
+    private BigDecimal payPrice;
+
+    /** 支付邮费 */
+    private BigDecimal payPostage;
+
+    @Excel(name = "物流代收金额")
+    private BigDecimal payDelivery;
+
+    @Excel(name = "支付金额")
+    private BigDecimal payMoney;
+
+    /** 抵扣金额 */
+    private BigDecimal deductionPrice;
+
+    /** 优惠券id */
+    private Long couponId;
+
+    /** 优惠券金额 */
+    private BigDecimal couponPrice;
+
+    /** 支付状态 */
+    @Excel(name = "支付状态 1已支付 0未支付 2支付中")
+    private Integer paid;
+
+    /** 支付时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "支付时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date payTime;
+
+    /** 支付方式 */
+    @Excel(name = "支付方式 1线上 2物流代收")
+    private String payType;
+
+    private Integer status;
+
+    /** 0 未退款 1 申请中 2 已退款 */
+    private Integer refundStatus;
+
+    /** 退款图片 */
+    @Excel(name = "退款图片")
+    private String refundReasonWapImg;
+
+    /** 退款用户说明 */
+    @Excel(name = "退款用户说明")
+    private String refundReasonWapExplain;
+
+    /** 退款时间 */
+
+    private Date refundReasonTime;
+
+    /** 前台退款原因 */
+    private String refundReasonWap;
+
+    /** 不退款的理由 */
+    private String refundReason;
+
+    /** 退款金额 */
+    private BigDecimal refundPrice;
+
+    /** 快递公司编号 */
+    @Excel(name = "快递公司编号")
+    private String deliverySn;
+
+    /** 快递名称/送货人姓名 */
+    @Excel(name = "快递名称")
+    private String deliveryName;
+
+    /** 发货类型 */
+    private String deliveryType;
+
+    /** 快递单号/手机号 */
+    @Excel(name = "快递单号")
+    private String deliveryId;
+
+    /** 消费赚取积分 */
+    private BigDecimal gainIntegral;
+
+    /** 使用积分 */
+    @Excel(name = "使用积分")
+    private BigDecimal useIntegral;
+
+    /** 实际支付积分 */
+    @Excel(name = "实际支付积分")
+    private BigDecimal payIntegral;
+
+    /** 给用户退了多少积分 */
+    private BigDecimal backIntegral;
+
+    /** 备注 */
+    @Excel(name = "备注")
+    private String mark;
+
+
+    /** 是否删除 */
+    private Integer isDel;
+
+    /** 成本价 */
+    private BigDecimal cost;
+
+    /** 核销码 */
+    private String verifyCode;
+
+    /** 门店id */
+    private Long storeId;
+
+    /** 配送方式 1=快递 ,2=门店自提 */
+    private Integer shippingType;
+
+    /** 支付渠道(0微信公众号1微信小程序) */
+    private Integer isChannel;
+
+    /** 是否提醒 */
+    private Integer isRemind;
+
+    /** 是否系统删除 */
+    private Integer isSysDel;
+
+    private Integer isPrescribe;
+
+    private Long prescribeId;
+
+    private Long companyId;
+
+    private Long companyUserId;
+
+    private Integer isPackage;
+
+    private String packageJson;
+
+    private String itemJson;
+
+    // 直播订单类型:2
+    private Integer orderType;
+
+    private Long packageId;
+
+    private Integer orderCreateType;
+
+    private String storeHouseCode;
+
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "完成时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date finishTime;
+
+    private Integer deliveryStatus;
+
+    private Integer deliveryPayStatus;
+
+    @Excel(name = "快递帐单日期")
+    private String deliveryTime;
+
+    @Excel(name = "快递结算日期")
+    private String deliveryPayTime;
+
+    private BigDecimal deliveryPayMoney;
+
+    private BigDecimal tuiMoney;
+
+    private Integer tuiMoneyStatus;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "回单导入时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date deliveryImportTime;
+
+    private Long tuiUserId;
+
+    private Integer tuiUserMoneyStatus;
+
+    private Long deptId;
+
+    private Integer isEditMoney;
+
+    private Long customerId;
+
+    private Integer isPayRemain;
+
+
+    @Excel(name = "剩余金额")
+    @TableField(exist = false)
+    private BigDecimal payRemain;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "发货时间", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss")
+    private Date deliverySendTime;
+
+    //凭证
+    private String certificates;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date uploadTime;
+
+    private Long scheduleId; //归属档期id
+
+    private String orderVisit; //订单跟随阶段
+
+    private BigDecimal serviceFee;
+
+    private Integer orderMedium; //媒体来源
+
+
+    @Excel(name = "医生ID")
+    private Long doctorId;
+
+    /** 支付状态 待支付 1已支付 */
+    @Excel(name = "支付状态 待支付 1已支付")
+    private Integer isPay;
+
+    /** 退款图片 */
+    @Excel(name = "退款图片")
+    private String refundImg;
+
+    /** 退款用户说明 */
+    @Excel(name = "退款用户说明")
+    private String refundExplain;
+
+    /** 退款时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @Excel(name = "退款时间", width = 30, dateFormat = "yyyy-MM-dd")
+    private Date refundTime;
+
+    /** 退款金额 */
+    @Excel(name = "退款金额")
+    private BigDecimal refundMoney;
+
+    /** 快递公司编号 */
+    @Excel(name = "快递公司编号")
+    private String deliveryCode;
+
+    /** 成本价 */
+    @Excel(name = "成本价")
+    private BigDecimal costPrice;
+
+    private BigDecimal discountMoney;
+
+    private Long userCouponId;
+
+    private Long inquiryOrderId;
+
+    private Long packageOrderId;
+
+    private String remark;
+
+    private Integer isAfterSales;
+
+    private BigDecimal prescribePrice;
+
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date followTime;
+
+    private Long followDoctorId;
+    private Integer cycle;
+    private Integer followNum;
+
+
+    private Long orderBuyType;//购买类型,同药品商城的订单订单类型
+    private String channel;//公众号/渠道
+
+    private String orderChannel;//订单渠道
+
+    private String qwSubject;
+
+    private String packageName;
+
+    private String packageSecondName;
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date followEndTime;
+
+    private Integer followStatus;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date deliveryUpdateTime;
+
+    private Integer isFirst;
+
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date tuiMoneyTime;
+
+    private Integer source;
+    private BigDecimal billPrice;
+    private String erpPhone;
+
+    @TableField(exist = false)
+    private String bankTransactionId;
+
+    // 是否审核,1-是,0-否
+    private Integer isAudit;
+
+    // 订单总后台备注
+    private String orderRemark;
+
+    // 后台修改商品类型,0-未修改过;1-总后台;2-销售后台
+    private Integer backendEditProductType;
+
+    // 线下支付金额
+    private BigDecimal offlinePayAmount;
+}

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreCartScrmMapper.java

@@ -112,4 +112,7 @@ public interface FsStoreCartScrmMapper
             "</if>" +
             "</script>"})
     Integer selectFsStoreCartCount(@Param("maps") FsStoreCartCountParam param);
+
+    @Select("select * from fs_store_cart_scrm c inner join fs_store_product_scrm p on p.product_id=c.product_id where c.is_pay=0 and c.is_del=0 and c.is_buy=0 and p.is_show=1 and p.is_del=0 and c.user_id = #{userId}")
+    List<FsStoreCartVO> selectFsStoreCartByUserId(Long userId);
 }

+ 4 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java

@@ -1485,4 +1485,8 @@ public interface FsStoreOrderScrmMapper
     List<FsStoreOrderScrm> selectFsStoreOrderByUserIDexcludeCurrentOrderId(@Param("userId") Long userId, @Param("notOrderId") Long notOrderId,@Param("offset") Integer offset, @Param("limit") Integer limit);
     @Select("SELECT count(*) FROM fs_store_order_scrm WHERE user_id = #{userId} AND id != #{notOrderId}")
     int selectFsStoreOrderByUserIDexcludeCurrentOrderIdCount(@Param("userId") Long userId, @Param("notOrderId") Long notOrderId);
+
+
+    List<FsMyStoreOrderListQueryVO> selectFsStoreOrderListBySidebarVO(@Param("maps") FsStoreOrderScrmSidebarVO param);
+
 }

+ 19 - 0
fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductCategoryScrmMapper.java

@@ -116,4 +116,23 @@ public interface FsStoreProductCategoryScrmMapper
     List<OptionsVO> selectFsStoreProductPidList();
 
     List<Long> selectCateIdsByName(FsStoreProductCategoryScrm fsStoreProductCategoryScrm);
+
+    @Select({"<script> " +
+            "select c.* from fs_store_product_category_scrm c " +
+            "where 1=1 " +
+            "<if test = 'maps.isDel != null    '> " +
+            "and c.is_del=#{maps.isDel} " +
+            "</if>" +
+            "<if test = 'maps.isShow != null    '> " +
+            "and c.is_show =#{maps.isShow} " +
+            "</if>" +
+            "<if test = 'maps.pid != null    '> " +
+            "and c.pid =#{maps.pid} " +
+            "</if>" +
+            "<if test = 'maps.storeId != null    '> " +
+            "and c.store_id =#{maps.storeId} " +
+            "</if>" +
+            " order by c.sort asc "+
+            "</script>"})
+    List<FsStoreProductCategoryScrm> selectFsStoreProductCategoryListQueryBySidebar(@Param("maps") FsStoreProductCategoryScrm param);
 }

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

@@ -448,4 +448,41 @@ public interface FsStoreProductScrmMapper
     List<FsStoreProductListVO> liveList(@Param("maps") LiveGoods maps);
 
     List<FsStoreProductScrm> selectFsStoreProductByProductIds(@Param("productIds") List<Long> productIdsLong);
+
+    @Select({"<script> " +
+            "select distinct p.* from fs_store_product_scrm p  " +
+            "where p.is_del=0 and p.is_show=1  and p.is_audit = '1'" +
+            "<if test = 'maps.productName != null and  maps.productName !=\"\"    '> " +
+            "and (p.product_name like CONCAT('%',#{maps.productName},'%')  or p.keyword like concat('%',#{maps.productName},'%') ) " +
+            "</if>" +
+            "<if test = 'maps.isDisplay != null and maps.isDisplay == 1   '> " +
+            "and p.is_display =#{maps.isDisplay}  " +
+            "</if>" +
+            "<if test = 'maps.companyId != null'> " +
+            "and find_in_set(#{maps.companyId}, p.company_ids) " +
+            "</if>" +
+            "<if test = 'maps.cateId != null    '> " +
+            "and p.cate_id =#{maps.cateId}  " +
+            "</if>" +
+            "<if test = 'maps.defaultOrder != null and maps.defaultOrder==\"desc\"  '> " +
+            "order by p.sort asc,product_id desc" +
+            "</if>" +
+            "<if test = 'maps.priceOrder != null and maps.priceOrder==\"desc\"   '> " +
+            "order by p.price desc " +
+            "</if>" +
+            "<if test = 'maps.priceOrder != null and maps.priceOrder==\"asc\"   '> " +
+            "order by p.price asc " +
+            "</if>" +
+            "<if test = 'maps.salesOrder != null  and maps.salesOrder==\"desc\" '> " +
+            "order by p.sales desc " +
+            "</if>" +
+            "<if test = 'maps.salesOrder != null  and maps.salesOrder==\"asc\" '> " +
+            "order by p.sales asc " +
+            "</if>" +
+            "<if test = 'maps.newOrder != null and maps.newOrder==\"desc\" '> " +
+            "and p.is_new =1 order by p.create_time desc  " +
+            "</if>" +
+            "</script>"})
+    List<FsStoreProductListQueryVO> selectFsStoreProductSidebarListQuery(@Param("maps")FsStoreOrderScrmSidebarVO param);
+
 }

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

@@ -14,4 +14,6 @@ public class FsStoreCartDelParam {
     @ApiModelProperty(value = "购物车ID,多个用,分隔开")
     Long[] ids;
 
+    //侧边栏需要
+    private Long userId;
 }

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/param/FsStoreCartNumParam.java

@@ -21,5 +21,8 @@ public class FsStoreCartNumParam {
     @ApiModelProperty(value = "购物车ID")
     private Long id;
 
+    //侧边栏需要
+    private Long userId;
+
 
 }

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

@@ -28,5 +28,7 @@ public class FsStoreCartParam {
     @ApiModelProperty(value = "是否购买")
     private Integer isBuy=0;
 
+    //侧边栏需要
+    private Long userId;
 
 }

+ 3 - 0
fs-service/src/main/java/com/fs/hisStore/service/IFsStoreCartScrmService.java

@@ -81,4 +81,7 @@ public interface IFsStoreCartScrmService
 
     Integer selectFsStoreCartCount(FsStoreCartCountParam param);
 
+    R selectFsStoreCartTotalByCarts(String carts);
+
+    R addCartBySidebar(Long userId, FsStoreCartParam cartParam);
 }

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

@@ -180,6 +180,8 @@ public interface IFsStoreOrderScrmService
 
     R createSalesOrder(CompanyUser companyUser, String cateIds,Integer orderType,Integer orderMedium);
 
+    R createSalesOrderBySidebar(CompanyUser companyUser, String cateIds);
+
     R getSalesOrder(String createOrderKey);
 
     R addUserCart(long userId, String createOrderKey);
@@ -377,4 +379,12 @@ public interface IFsStoreOrderScrmService
     List<FsStoreOrderScrm> selectFsStoreOrderByUserIDexcludeCurrentOrderId(Long userId, Long notOrderId,Integer offset, Integer limit);
 
     int selectFsStoreOrderByUserIDexcludeCurrentOrderIdCount(Long userId, Long notOrderId);
+
+    List<FsMyStoreOrderListQueryVO> selectFsStoreOrderListBySidebarVO(FsStoreOrderScrmSidebarVO param);
+
+    R createOrderBySidebar(FsStoreOrderScrmSidebarVO param);
+
+    R getOrderInfoBySidebar(String orderId,Long userId);
+
+    R editOrderMoneyBySidebar(FsStoreOrderScrmSidebarVO param);
 }

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

@@ -78,4 +78,6 @@ public interface IFsStoreProductCategoryScrmService
     List<FsStoreProductCategorysVO> selectFsStoreProductCategorysVOList(Long storeId);
 
     List<FsStoreProductCategoryVO> getPidList(Long storeId);
+
+    List<FsStoreProductCategoryScrm> selectFsStoreProductCategoryListQueryBySidebar(FsStoreProductCategoryScrm param);
 }

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

@@ -90,6 +90,9 @@ public interface IFsStoreProductScrmService
 
     List<FsStoreProductListQueryVO> selectFsStoreProductListQuery(FsStoreProductQueryParam param);
 
+    List<FsStoreProductListQueryVO> selectFsStoreProductSidebarListQuery(FsStoreOrderScrmSidebarVO param);
+
+
     FsStoreProductQueryVO selectFsStoreProductByIdQuery(Long productId,String storeId);
 
     void decProductStock(Long productId, Long productAttrValueId, Integer cartNum);

+ 79 - 0
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreCartScrmServiceImpl.java

@@ -29,12 +29,14 @@ import com.fs.hisStore.service.IFsStoreProductPurchaseLimitScrmService;
 import com.fs.hisStore.service.IFsStoreProductScrmService;
 import com.fs.hisStore.domain.FsStoreProductPurchaseLimitScrm;
 import com.fs.hisStore.domain.FsStoreProductScrm;
+import com.fs.hisStore.vo.FsStoreCartQueryVO;
 import com.fs.hisStore.vo.FsStoreCartVO;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
 import java.util.Date;
 import java.util.List;
 
@@ -78,6 +80,8 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
 
     @Autowired
     private IFsStoreProductScrmService productService;
+    @Autowired
+    private FsStoreCartScrmMapper cartMapper;
 
 
 
@@ -413,6 +417,81 @@ public class FsStoreCartScrmServiceImpl implements IFsStoreCartScrmService
         return  fsStoreCartMapper.selectFsStoreCartCount(param);
     }
 
+    @Override
+    public R selectFsStoreCartTotalByCarts(String cartIds) {
+        List<FsStoreCartQueryVO> carts = cartMapper.selectFsStoreCartListByIds(cartIds);
+
+        BigDecimal totalMoney = BigDecimal.ZERO;
+        for (FsStoreCartQueryVO vo : carts) {
+            totalMoney = totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
+        }
+        return R.ok().put("totalMoney", totalMoney);
+    }
+
+    @Override
+    public R addCartBySidebar(Long uid, FsStoreCartParam cartParam) {
+        // 检查并调整限购数量
+        Integer adjustedNum = adjustPurchaseLimit(uid, cartParam.getProductId(), cartParam.getCartNum());
+        cartParam.setCartNum(adjustedNum);
+
+        //如果是直接购买,直接写入记录
+        if(cartParam.getIsBuy()==1){
+            FsStoreCartScrm storeCart = FsStoreCartScrm.builder()
+                    .cartNum(cartParam.getCartNum())
+                    .productAttrValueId(cartParam.getAttrValueId())
+                    .productId(cartParam.getProductId())
+                    .userId(uid)
+                    .cartNum(cartParam.getCartNum())
+                    .isPay(0)
+                    .isDel(0)
+                    .isBuy(cartParam.getIsBuy())
+                    .build();
+            storeCart.setCreateTime(new Date());
+            checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+            fsStoreCartMapper.insertFsStoreCart(storeCart);
+            return R.ok().put("id",storeCart.getId());
+
+        }
+        else{
+            FsStoreCartScrm cartMap=new FsStoreCartScrm();
+            cartMap.setUserId(uid);
+            cartMap.setIsPay(0);
+            cartMap.setIsBuy(0);
+            cartMap.setProductId(cartParam.getProductId());
+            cartMap.setProductAttrValueId(cartParam.getAttrValueId());
+            List<FsStoreCartScrm> cart = fsStoreCartMapper.selectFsStoreCartList(cartMap);
+            FsStoreCartScrm storeCart;
+            if(cart==null||cart.size()==0){
+                storeCart = FsStoreCartScrm.builder()
+                        .cartNum(cartParam.getCartNum())
+                        .productAttrValueId(cartMap.getProductAttrValueId())
+                        .productId(cartMap.getProductId())
+                        .userId(uid)
+                        .cartNum(cartParam.getCartNum())
+                        .isPay(0)
+                        .isDel(0)
+                        .isBuy(0)
+                        .build();
+                storeCart.setCreateTime(new Date());
+                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+                fsStoreCartMapper.insertFsStoreCart(storeCart);
+                return R.ok().put("id",storeCart.getId());
+            }
+            else{
+                storeCart=cart.get(0);
+                int newCartNum = cartParam.getCartNum() + cart.get(0).getCartNum();
+                // 检查并调整限购数量(需要检查新的总数量)
+                Integer adjustedNewNum = adjustPurchaseLimit(uid, cartParam.getProductId(), newCartNum);
+                storeCart.setCartNum(adjustedNewNum);
+                storeCart.setUpdateTime(new Date());
+                checkProductStock(cartParam.getProductId(),storeCart.getProductAttrValueId());
+                fsStoreCartMapper.updateFsStoreCart(storeCart);
+                return R.ok().put("id",storeCart.getId());
+            }
+
+        }
+    }
+
     private IErpGoodsService getErpService(){
         //判断是否开启erp
         IErpGoodsService goodsService = null;

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

@@ -2827,6 +2827,22 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return R.ok().put("orderKey", uuid).put("carts", carts);
     }
 
+    @Override
+    public R createSalesOrderBySidebar(CompanyUser companyUser, String cartIds) {
+        List<FsStoreCartQueryVO> carts = cartMapper.selectFsStoreCartListByIds(cartIds);
+        String uuid = IdUtil.randomUUID();
+        redisCache.setCacheObject("createOrderKey:" + uuid, companyUser.getCompanyId() + "-" + companyUser.getUserId(), 24, TimeUnit.HOURS);
+        redisCache.setCacheObject("orderCarts:" + uuid, carts, 24, TimeUnit.HOURS);
+        //计算总价
+        BigDecimal totalMoney = BigDecimal.ZERO;
+        for (FsStoreCartQueryVO vo : carts) {
+            totalMoney = totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
+        }
+        redisCache.setCacheObject("orderKey:" + uuid, cartIds, 300, TimeUnit.SECONDS);
+        redisCache.setCacheObject("createOrderMoney:" + uuid, totalMoney, 24, TimeUnit.HOURS);
+        return R.ok().put("orderKey", uuid).put("carts", carts);
+    }
+
     @Override
     public R getSalesOrder(String createOrderKey) {
         String key = redisCache.getCacheObject("createOrderKey:" + createOrderKey);
@@ -5665,6 +5681,288 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return fsStoreOrderMapper.selectFsStoreOrderByUserIDexcludeCurrentOrderIdCount(userId,notOrderId);
     }
 
+    @Override
+    public List<FsMyStoreOrderListQueryVO> selectFsStoreOrderListBySidebarVO(FsStoreOrderScrmSidebarVO param) {
+        List<FsMyStoreOrderListQueryVO> list = fsStoreOrderMapper.selectFsStoreOrderListBySidebarVO(param);
+        for (FsMyStoreOrderListQueryVO vo : list) {
+            if (StringUtils.isNotEmpty(vo.getItemJson())) {
+                JSONArray jsonArray = JSONUtil.parseArray(vo.getItemJson());
+                List<FsStoreOrderItemVO> items = JSONUtil.toList(jsonArray, FsStoreOrderItemVO.class);
+                if (!items.isEmpty()) {
+                    vo.setItems(items);
+                }
+            }
+        }
+        return list;
+    }
+
+    @Override
+    public R createOrderBySidebar(FsStoreOrderScrmSidebarVO param) {
+        Long userId = param.getUserId();
+        log.error("进入到数据");
+        if (ObjectUtil.isEmpty(param.getAddressId())){
+            return R.error("地址不能为空!");
+        }
+        FsStoreOrderComputedParam computedParam = new FsStoreOrderComputedParam();
+        BeanUtils.copyProperties(param, computedParam);
+        //计算金额
+        FsStoreOrderComputeDTO dto;
+        try {
+            dto = this.computedOrder(userId, computedParam);
+        } catch (ServiceException e) {
+            // 捕获运费模板检查异常,直接返回错误
+            if ("偏远地区暂不可购买".equals(e.getMessage())) {
+                return R.error("偏远地区暂不可购买");
+            }
+            throw e;
+        }
+        String cartIds = redisCache.getCacheObject("orderKey:" + param.getOrderKey());
+        Integer payType = redisCache.getCacheObject("createOrderPayType:" + param.getCreateOrderKey());
+        if (payType != null) {
+            param.setPayType(payType.toString());
+        }
+//        Integer totalNum = 0;
+        BigDecimal integral = BigDecimal.ZERO;
+        if (cartIds != null) {
+            //获取购物车列表
+            List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
+            //获取地址
+            FsUserAddressScrm address = userAddressMapper.selectFsUserAddressById(param.getAddressId());
+            //生成分布式唯一值
+
+            String orderSn = SnowflakeUtil.nextIdStr();
+            //是否使用积分
+            Boolean isIntegral = false;
+            //组合数据
+            FsStoreOrderScrm storeOrder = new FsStoreOrderScrm();
+            storeOrder.setStoreHouseCode("CK01");
+            storeOrder.setCompanyId(param.getCompanyId());
+            storeOrder.setCompanyUserId(param.getCompanyUserId());
+
+            String json = configService.selectConfigByKey("store.config");
+            StoreConfig config= JSONUtil.toBean(json, StoreConfig.class);
+
+            CompanyUserUser map=new CompanyUserUser();
+            map.setCompanyUserId(param.getCompanyUserId());
+            map.setUserId(userId);
+            List<CompanyUserUser> list= companyUserUserMapper.selectCompanyUserUserList(map);
+            if(list==null||list.size()==0){
+                CompanyUser companyUser=companyUserService.selectCompanyUserById(param.getCompanyUserId());
+                if(companyUser!=null&&companyUser.getStatus().equals("0")){
+                    map.setCompanyId(companyUser.getCompanyId());
+                    companyUserUserMapper.insertCompanyUserUser(map);
+                }
+            }
+
+            storeOrder.setUserId(userId);
+            storeOrder.setOrderCode(orderSn);
+            if (ObjectUtil.isNotEmpty(address)){
+                storeOrder.setRealName(address.getRealName());
+                storeOrder.setUserPhone(address.getPhone());
+                storeOrder.setUserAddress(address.getProvince() + " " + address.getCity() +
+                        " " + address.getDistrict() + " " + address.getDetail().trim());
+            }
+            storeOrder.setCartId(cartIds);
+            storeOrder.setTotalNum(Long.parseLong(String.valueOf(carts.size())));
+            storeOrder.setTotalPrice(dto.getTotalPrice());
+            storeOrder.setTotalPostage(dto.getPayPostage());
+
+            storeOrder.setPayPostage(dto.getPayPostage());
+            storeOrder.setDeductionPrice(dto.getDeductionPrice());
+            storeOrder.setPaid(0);
+            storeOrder.setPayType(param.getPayType());
+            if (isIntegral) {
+                storeOrder.setPayIntegral(integral);
+            }
+            storeOrder.setUseIntegral(BigDecimal.valueOf(dto.getUsedIntegral()));
+            storeOrder.setBackIntegral(BigDecimal.ZERO);
+            storeOrder.setGainIntegral(BigDecimal.ZERO);
+            storeOrder.setMark(param.getMark());
+            //todo 获取成本价
+            BigDecimal costPrice = this.getOrderSumPrice(carts, "costPrice");
+            storeOrder.setCost(costPrice);
+            storeOrder.setIsChannel(1);
+            storeOrder.setShippingType(1);
+            storeOrder.setCreateTime(new Date());
+
+//            String json = configService.selectConfigByKey("store.config");
+//            StoreConfig config = JSONUtil.toBean(json, StoreConfig.class);
+            if (config.getServiceFee() != null) {
+                storeOrder.setServiceFee(config.getServiceFee());
+            }
+
+            //后台制单处理
+            if (param.getPayPrice() != null && param.getPayPrice().compareTo(BigDecimal.ZERO) > 0) {
+                if (param.getPayPrice().compareTo(dto.getTotalPrice()) > 0) {
+                    return R.error("改价价格不能大于商品总价");
+                }
+                storeOrder.setPayPrice(param.getPayPrice());
+                storeOrder.setPayMoney(param.getPayPrice());
+            } else {
+                storeOrder.setPayPrice(dto.getPayPrice());
+                storeOrder.setPayMoney(dto.getPayPrice());
+            }
+
+            storeOrder.setStatus(1);
+            storeOrder.setPaid(1);
+            storeOrder.setPayTime(new Date());
+            Boolean isPay = false;
+
+            storeOrder.setOrderCreateType(param.getOrderCreateType());
+            Long prescribe = carts.stream().filter(item -> item.getProductType() != null && item.getProductType() == 2).count();
+            if (prescribe > 0) {
+                storeOrder.setIsPrescribe(1);
+            } else {
+                storeOrder.setIsPrescribe(0);
+            }
+
+            FsStoreOrderScrm tempOrder = redisCache.getCacheObject("orderInfo:" + param.getCreateOrderKey());
+            if (tempOrder != null) {
+                storeOrder.setOrderType(tempOrder.getOrderType());
+                storeOrder.setOrderMedium(tempOrder.getOrderMedium());
+                redisCache.deleteObject("orderInfo:" + param.getCreateOrderKey());
+            }
+            Integer flag = fsStoreOrderMapper.insertFsStoreOrder(storeOrder);
+            if (flag == 0) {
+                return R.error("订单创建失败");
+            }
+            if (!isPay && storeOrder.getCompanyId() != null) {
+                // 添加订单审核
+                addOrderAudit(storeOrder);
+            }
+            //使用了积分扣积分
+            if (dto.getUsedIntegral() > 0) {
+                this.decIntegral(userId, dto.getUsedIntegral(), dto.getDeductionPrice(), storeOrder.getId().toString());
+            }
+            //减库存加销量
+            this.deStockIncSale(carts);
+            //保存OrderItem
+            List<FsStoreOrderItemScrm> listOrderItem = new ArrayList<>();
+            //保存购物车商品信息
+            for (FsStoreCartQueryVO vo : carts) {
+                // 检查限购
+                checkAndRecordPurchaseLimit(userId, vo.getProductId(), vo.getCartNum());
+
+                FsStoreCartDTO fsStoreCartDTO = new FsStoreCartDTO();
+                fsStoreCartDTO.setProductId(vo.getProductId());
+                fsStoreCartDTO.setPrice(vo.getPrice());
+                fsStoreCartDTO.setSku(vo.getProductAttrName());
+                fsStoreCartDTO.setProductName(vo.getProductName());
+                fsStoreCartDTO.setNum(vo.getCartNum());
+                fsStoreCartDTO.setBarCode(vo.getBarCode());
+                fsStoreCartDTO.setGroupBarCode(vo.getGroupBarCode());
+                fsStoreCartDTO.setBrokerage(vo.getBrokerage());
+                fsStoreCartDTO.setBrokerageTwo(vo.getBrokerageTwo());
+                fsStoreCartDTO.setBrokerageThree(vo.getBrokerageThree());
+                if (StringUtils.isEmpty(vo.getProductAttrImage())) {
+                    fsStoreCartDTO.setImage(vo.getProductImage());
+                } else {
+                    fsStoreCartDTO.setImage(vo.getProductAttrImage());
+                }
+
+                FsStoreOrderItemScrm item = new FsStoreOrderItemScrm();
+                item.setOrderId(storeOrder.getId());
+                item.setOrderCode(orderSn);
+                item.setCartId(vo.getId());
+                item.setProductId(vo.getProductId());
+                item.setJsonInfo(JSONUtil.toJsonStr(fsStoreCartDTO));
+                item.setNum(vo.getCartNum());
+                item.setIsAfterSales(0);
+                //处方药
+                if (vo.getProductType().equals(2)) {
+                    item.setIsPrescribe(1);
+                }
+                fsStoreOrderItemMapper.insertFsStoreOrderItem(item);
+                listOrderItem.add(item);
+
+            }
+            if (listOrderItem.size() > 0) {
+                String itemJson = JSONUtil.toJsonStr(listOrderItem);
+                storeOrder.setItemJson(itemJson);
+                fsStoreOrderMapper.updateFsStoreOrder(storeOrder);
+            }
+            //购物车状态修改
+            cartMapper.updateIsPay(cartIds);
+
+            //删除缓存
+            redisCache.deleteObject("orderKey:" + param.getOrderKey());
+            if (config.getIsBrushOrders() == null || !(config.getIsBrushOrders() && param.getCompanyUserId() != null)) {//未开启刷单
+                redisCache.deleteObject("orderCarts:" + param.getOrderKey());
+            }
+
+            //添加记录
+            orderStatusService.create(storeOrder.getId(), OrderLogEnum.CREATE_ORDER.getValue(),
+                    OrderLogEnum.CREATE_ORDER.getDesc());
+
+            //加入redis,24小时自动取消
+            String redisKey = String.valueOf(StrUtil.format("{}{}",
+                    StoreConstants.REDIS_ORDER_OUTTIME_UNPAY, storeOrder.getId()));
+
+            if (config.getUnPayTime() != null && config.getUnPayTime() > 0) {
+                redisCache.setCacheObject(redisKey, storeOrder.getId(), config.getUnPayTime(), TimeUnit.MINUTES);
+            } else {
+                redisCache.setCacheObject(redisKey, storeOrder.getId(), 30, TimeUnit.MINUTES);
+            }
+            //添加支付到期时间
+            Calendar calendar = Calendar.getInstance();
+            calendar.setTime(storeOrder.getCreateTime());
+            if (config.getUnPayTime() != null) {
+                calendar.add(Calendar.MINUTE, config.getUnPayTime());
+            }
+            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+            String payLimitTime = format.format(calendar.getTime());
+            redisCache.setCacheObject("orderAmount:" + storeOrder.getId(), storeOrder.getPayMoney(), 24, TimeUnit.HOURS);//物流代收自定义金额
+            //删除推荐订单KEY
+            String createOrderKey = param.getCreateOrderKey();
+
+            if (StringUtils.isNotEmpty(createOrderKey)) {
+                if (config.getIsBrushOrders() == null || !(config.getIsBrushOrders() && param.getCompanyUserId() != null)) {//未开启刷单
+                    redisCache.deleteObject("createOrderKey:" + createOrderKey);
+                    redisCache.deleteObject("orderCarts:" + createOrderKey);
+                    redisCache.deleteObject("createOrderMoney:" + createOrderKey);
+                }
+
+                //货到付款自定义金额 key改为id存储
+                BigDecimal amount = redisCache.getCacheObject("createOrderAmount:" + createOrderKey);
+                redisCache.deleteObject("createOrderAmount:" + createOrderKey);
+            }
+            return R.ok().put("order", storeOrder).put("payLimitTime", payLimitTime);
+        } else {
+            return R.error("订单已过期");
+        }
+    }
+
+    @Override
+    public R getOrderInfoBySidebar(String orderKey,Long userId) {
+        List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + orderKey);
+        BigDecimal money = redisCache.getCacheObject("createOrderMoney:" + orderKey);
+        if(carts == null || money == null){
+            return R.error("订单信息已过期,请重新制单");
+        }
+        FsUserAddressScrm address = userAddressMapper.selectFsUserAddressByDefaultAddress(userId);
+        return R.ok().put("money", money).put("carts", carts).put("address",address);
+    }
+
+    @Override
+    public R editOrderMoneyBySidebar(FsStoreOrderScrmSidebarVO param) {
+        String orderKey = param.getOrderKey();
+        BigDecimal moneyOld = redisCache.getCacheObject("createOrderMoney:" + orderKey);
+        BigDecimal money = param.getMoney();
+        if(moneyOld != null){
+            if(money.compareTo(moneyOld)>0){
+                return R.error("金额不能超过订单金额");
+            }
+            if(money.compareTo(BigDecimal.ZERO)<0){
+                return R.error("金额必须大于等于0");
+            }
+            redisCache.setCacheObject("createOrderMoney:" + orderKey, money);
+            return R.ok("改价成功");
+        }
+        else{
+            return R.error("非法操作");
+        }
+    }
+
     private static final DateTimeFormatter CST_FORMATTER = DateTimeFormatter
             .ofPattern("EEE MMM dd HH:mm:ss zzz yyyy", Locale.US)
             .withZone(ZoneId.of("Asia/Shanghai"));

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

@@ -188,4 +188,9 @@ public class FsStoreProductCategoryScrmServiceImpl implements IFsStoreProductCat
         list.add(vo);
         return list;
     }
+
+    @Override
+    public List<FsStoreProductCategoryScrm> selectFsStoreProductCategoryListQueryBySidebar(FsStoreProductCategoryScrm param) {
+        return fsStoreProductCategoryMapper.selectFsStoreProductCategoryListQueryBySidebar(param);
+    }
 }

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

@@ -1092,6 +1092,11 @@ public class FsStoreProductScrmServiceImpl implements IFsStoreProductScrmService
         return fsStoreProductMapper.selectFsStoreProductListQuery(param);
     }
 
+    @Override
+    public List<FsStoreProductListQueryVO> selectFsStoreProductSidebarListQuery(FsStoreOrderScrmSidebarVO param) {
+        return fsStoreProductMapper.selectFsStoreProductSidebarListQuery(param);
+    }
+
     @Override
     public FsStoreProductQueryVO selectFsStoreProductByIdQuery(Long productId,String storeId) {
         return fsStoreProductMapper.selectFsStoreProductByIdQuery(productId,storeId,medicalMallConfig);

+ 87 - 0
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreOrderScrmSidebarVO.java

@@ -0,0 +1,87 @@
+package com.fs.hisStore.vo;
+
+
+import com.fs.common.param.BaseQueryParam;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+import javax.validation.constraints.Size;
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class FsStoreOrderScrmSidebarVO extends BaseQueryParam {
+
+    @ApiModelProperty(value = "分类ID")
+    Long cateId;
+    @ApiModelProperty(value = "商品名")
+    String productName;
+    @ApiModelProperty(value = "默认")
+    private String defaultOrder;
+    @ApiModelProperty(value = "是否新品")
+    private String newOrder;
+    @ApiModelProperty(value = "价格排序")
+    private String priceOrder;
+    @ApiModelProperty(value = "销量排序")
+    private String salesOrder;
+    @ApiModelProperty(value = "1 只显示商城展示的商品 0展示所有")
+    private Integer isDisplay=1;
+
+    // 用户企业ID
+    private Long companyId;
+
+    private Long companyUserId;
+
+    private Long userId;
+
+    /**
+     * 客户信息的长字符串id
+     */
+    private String externalUserId;
+
+    private String corpId;
+
+    private String qwUserId;
+
+    private String cartId;
+
+    private String cartIds;
+
+    private Long orderId;
+
+    private Long productId;
+
+    //订单价格
+    private BigDecimal totalPrice;
+
+    //实际支付价格
+    private BigDecimal payPrice;
+
+    //需要修改的价格
+    private BigDecimal money;
+
+    @ApiModelProperty(value = "地址ID")
+    private Long addressId;
+
+    @ApiModelProperty(value = "orderKey")
+    @NotNull(message = "orderKey不能为空")
+    private String orderKey;
+
+    @Size(max = 200,message = "长度超过了限制")
+    @ApiModelProperty(value = "备注")
+    private String mark;
+
+    @NotBlank(message="请选择支付方式")
+    @ApiModelProperty(value = "支付方式")
+    private String payType;
+
+    private String createOrderKey;
+
+    private Integer orderCreateType;
+
+    private Integer status;
+
+    private String keyword;
+}

+ 4 - 1
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListQueryVO.java

@@ -1,10 +1,13 @@
 package com.fs.hisStore.vo;
 
 import com.fs.common.annotation.Excel;
+import com.fs.hisStore.domain.FsStoreProductAttrValueScrm;
 import lombok.Data;
 
 import java.io.Serializable;
 import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 @Data
@@ -63,7 +66,7 @@ public class FsStoreProductListQueryVO implements Serializable
     private Long companyId;
     private Long companyUserId;
 
-
+    private List<FsStoreProductAttrValueScrm> attrValueList = new ArrayList<>();
 
 
 

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

@@ -649,6 +649,8 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
             "</script>")
     public int batchUpdateQwExternalContactMandatoryRegistration(@Param("map") List<QwMandatoryRegistrParam> batchList);
 
+    QwExternalContact selectQwExternalContactByExternalUserIdSidebar(@Param("externalUserId") String externalUserId, @Param("corpId") String corpId);
+
     @Select("SELECT " +
             "id " +
             "FROM " +

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/IQwExternalContactService.java

@@ -265,4 +265,9 @@ public interface IQwExternalContactService extends IService<QwExternalContact> {
     List<QwMandatoryRegistrParam> selectQwExternalContactMandatoryRegistrationByIds(String corpId);
 
     int batchUpdateQwExternalContactMandatoryRegistration(List<QwMandatoryRegistrParam> batchList);
+
+    /**
+     * 企微用户-查询外部联系人信息
+     */
+    QwExternalContact selectQwExternalContactByExternalUserIdSidebar(String externalUserId, String corpId);
 }

+ 5 - 0
fs-service/src/main/java/com/fs/qw/service/impl/QwExternalContactServiceImpl.java

@@ -6010,6 +6010,11 @@ public class QwExternalContactServiceImpl extends ServiceImpl<QwExternalContactM
         return qwExternalContactMapper.batchUpdateQwExternalContactMandatoryRegistration(batchList);
     }
 
+    @Override
+    public QwExternalContact selectQwExternalContactByExternalUserIdSidebar(String externalUserId, String corpId) {
+        return qwExternalContactMapper.selectQwExternalContactByExternalUserIdSidebar(externalUserId,corpId);
+    }
+
     @Override
     public R getRepeat(RepeatParam param) {
         List<QwExternalContact> list = qwExternalContactMapper.selectList(new QueryWrapper<QwExternalContact>().eq("external_user_id", param.getExternalUserId()));

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

@@ -13,6 +13,7 @@ import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.mapper.CompanyUserMapper;
 import com.fs.company.vo.CompanyQwUserByIdsVo;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.course.config.CourseConfig;
 import com.fs.course.mapper.FsCourseWatchLogMapper;
 import com.fs.course.service.IFsCourseLinkService;
@@ -125,6 +126,9 @@ public class QwSopServiceImpl implements IQwSopService {
     @Autowired
     private ConfigUtil configUtil;
 
+    @Autowired
+    CloudHostProper cloudHostProper;
+
     @Autowired
     public void setIQwSopTempVoiceService(@Lazy IQwSopTempVoiceService qwSopTempVoiceService) {
         this.qwSopTempVoiceService = qwSopTempVoiceService;
@@ -537,6 +541,10 @@ public class QwSopServiceImpl implements IQwSopService {
     @Override
     public void checkSopRuleTime() {
 
+        if("恒春来".equals(cloudHostProper.getCompanyName())){
+            return;
+        }
+
         List<QwSopRuleTimeVO> qwSopList = qwSopMapper.checkSopRuleTime();
 
         CompanyWxUserSopParam wxUserSopParam=new CompanyWxUserSopParam();

+ 1 - 1
fs-service/src/main/resources/mapper/course/FsCourseRedPacketLogMapper.xml

@@ -280,7 +280,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             resultType="com.fs.course.vo.FsCourseWatchLogStatisticsListVO">
         select f1.qw_user_id qwUserId,f1.video_id videoId,f1.course_id courseId,f1.user_id userId,sum(f1.amount) as redAmount,
          date_format(f1.create_time,'%Y-%m-%d') createTime from fs_course_red_packet_log f1
-        left join fs_course_watch_log f2 on f1.user_id = f2.user_id and f1.video_id = f2.video_id
+        left join fs_course_watch_log f2 on f1.watch_log_id = f2.log_id
         <where>
             <if test="param.companyId != null">
                 and f1.company_id = #{param.companyId}

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

@@ -1348,4 +1348,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
           AND l.create_time &lt; CURDATE() + INTERVAL 1 DAY
         order by l.create_time desc
     </select>
+    <select id="selectFsUserWatchLogByExtId" resultType="com.fs.course.domain.FsCourseWatchLog">
+        select log_id logId from fs_course_watch_log where qw_external_contact_id = #{id}
+                                                       and qw_user_id = #{qwUserId} and user_id is null
+    </select>
 </mapper>

+ 27 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml

@@ -2319,6 +2319,33 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                       sos.delivery_send_time
               ) >= 3
     </select>
+    <select id="selectFsStoreOrderListBySidebarVO" resultType="com.fs.hisStore.vo.FsMyStoreOrderListQueryVO">
+        select
+        o.id,
+        o.order_code,
+        o.item_json,
+        o.pay_price,
+        o.status,
+        o.is_package,
+        o.package_json,
+        o.delivery_id,
+        o.finish_time
+        from fs_store_order_scrm o
+        where o.is_del=0 and o.is_sys_del=0
+        <if test="maps.status != null and maps.status != ''">
+            and o.status = #{maps.status}
+        </if>
+        <if test="maps.keyword != null and maps.keyword != ''">
+            and o.order_code like CONCAT('%',#{maps.keyword},'%')
+        </if>
+        <if test="maps.userId != null">
+            and o.user_id = #{maps.userId}
+        </if>
+        <if test="maps.companyUserId != null and maps.companyUserId != ''">
+            and o.company_user_id = #{maps.companyUserId}
+        </if>
+        order by o.id desc
+    </select>
 
     <update id="batchUpdateTime">
         UPDATE fs_store_order_scrm

+ 7 - 0
fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml

@@ -816,4 +816,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             and t1.corp_id = #{corpId}
             and t1.status = 0
      </select>
+    <select id="selectQwExternalContactByExternalUserIdSidebar"
+            resultMap="QwExternalContactResult">
+        <include refid="selectQwExternalContactVo"/>
+        where corp_id = #{corpId} and external_user_id = #{externalUserId}
+        and user_id is not null and company_id is not null
+        limit 1
+    </select>
 </mapper>

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

@@ -17,6 +17,8 @@ import com.fs.common.exception.CustomException;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.sign.Md5Utils;
 import com.fs.core.config.WxMaConfiguration;
+import com.fs.course.domain.FsCourseWatchLog;
+import com.fs.course.service.IFsCourseWatchLogService;
 import com.fs.course.service.IFsUserCourseVideoService;
 import com.fs.his.domain.FsDoctor;
 import com.fs.his.domain.FsUser;
@@ -97,6 +99,8 @@ public class UserController extends  AppBaseController {
 
     @Autowired
     private IQwExternalContactService qwExternalContactService;
+    @Autowired
+    private IFsCourseWatchLogService watchLogService;
 
     @Login
     @ApiOperation("获取用户信息")
@@ -440,7 +444,14 @@ public class UserController extends  AppBaseController {
                 QwExternalContact qwExtContact = new QwExternalContact();
                 qwExtContact.setId(qwExternalContact.getId());
                 qwExtContact.setFsUserId(user.getUserId());
-                qwExternalContactService.updateQwExternalContactBindUserId(qwExtContact);
+                try {
+                    qwExternalContactService.updateQwExternalContactBindUserId(qwExtContact);
+                    List<FsCourseWatchLog> watchLogs = watchLogService.selectFsUserWatchLogByExtId(qwExternalContact);
+                    watchLogs.forEach(watchLog -> watchLog.setUserId(user.getUserId()));
+                    watchLogService.updateBatchById(watchLogs);
+                } catch (Exception e) {
+                    log.error("更新外部联系人绑定用户失败:{}:{}",e.getMessage(),user.getUserId());
+                }
             }
         }
 //        FsUser user=userService.selectFsUserByUserId(param.getUserId());