Ver código fonte

Merge branch 'master' into feature_bjws

# Conflicts:
#	fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListVO.java
luolinsong 1 mês atrás
pai
commit
07b6131d92
33 arquivos alterados com 388 adições e 63 exclusões
  1. 4 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java
  2. 35 0
      fs-admin/src/main/java/com/fs/course/controller/FsUserCourseCategoryController.java
  3. 14 0
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  4. 3 3
      fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java
  5. 1 1
      fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactController.java
  6. 1 1
      fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java
  7. 21 0
      fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java
  8. 8 1
      fs-live-app/src/main/resources/application.yml
  9. 9 0
      fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java
  10. 23 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java
  11. 14 0
      fs-service/src/main/java/com/fs/course/dto/FsCourseCategoryImportDTO.java
  12. 12 0
      fs-service/src/main/java/com/fs/course/mapper/FsUserCourseCategoryMapper.java
  13. 8 0
      fs-service/src/main/java/com/fs/course/service/IFsUserCourseCategoryService.java
  14. 89 1
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseCategoryServiceImpl.java
  15. 2 0
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  16. 5 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  17. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreOrderScrmMapper.java
  18. 1 1
      fs-service/src/main/java/com/fs/hisStore/mapper/FsStoreProductScrmMapper.java
  19. 3 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreOrderParam.java
  20. 5 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreOrderScrmService.java
  21. 20 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  22. 0 1
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListVO.java
  23. 3 1
      fs-service/src/main/java/com/fs/live/domain/LiveCouponUser.java
  24. 2 0
      fs-service/src/main/java/com/fs/live/service/ILiveOrderService.java
  25. 15 1
      fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java
  26. 9 9
      fs-service/src/main/resources/application-config-druid-xcsw.yml
  27. 5 0
      fs-service/src/main/resources/application-config-fzbt.yml
  28. 1 0
      fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml
  29. 7 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreOrderScrmMapper.xml
  30. 2 1
      fs-service/src/main/resources/mapper/hisStore/FsStoreProductPackageScrmMapper.xml
  31. 4 19
      fs-service/src/main/resources/mapper/hisStore/MergedOrderMapper.xml
  32. 7 1
      fs-service/src/main/resources/mapper/live/LiveCouponUserMapper.xml
  33. 54 21
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

+ 4 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyUserAllController.java

@@ -415,6 +415,8 @@ public class CompanyUserAllController extends BaseController {
     /**
      * 批量修改 销售的所属区域(临时的)
      */
+    @PreAuthorize("@ss.hasPermi('company:user:updateCompanyUserAreaList')")
+    @Log(title = "用户管理", businessType = BusinessType.UPDATE)
     @PostMapping("/updateCompanyUserAreaList")
     public R updateCompanyUserAreaList(@RequestBody CompanyUserAreaParam param)
     {
@@ -432,6 +434,7 @@ public class CompanyUserAllController extends BaseController {
         return  R.ok().put("data",subDomain);
     }
 
+    @PreAuthorize("@ss.hasPermi('company:user:setRegister')")
     @Log(title = "设置是否需要单独注册会员", businessType = BusinessType.UPDATE)
     @PutMapping("/setRegister")
     public AjaxResult setIsRegisterMember(@RequestParam Boolean status, @RequestBody List<Long> userIds) {
@@ -443,6 +446,7 @@ public class CompanyUserAllController extends BaseController {
         }
     }
 
+    @PreAuthorize("@ss.hasPermi('company:user:allowedAllRegister')")
     @Log(title = "是否允许所有方式注册会员", businessType = BusinessType.UPDATE)
     @PutMapping("/allowedAllRegister")
     public AjaxResult isAllowedAllRegister(@RequestParam Boolean status, @RequestBody List<Long> userIds) {

+ 35 - 0
fs-admin/src/main/java/com/fs/course/controller/FsUserCourseCategoryController.java

@@ -5,6 +5,7 @@ import java.util.List;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.utils.ServletUtils;
+import com.fs.course.dto.FsCourseCategoryImportDTO;
 import com.fs.framework.web.service.TokenService;
 import com.fs.his.domain.FsStoreProductCategory;
 import com.fs.his.vo.FsStoreProductCategoryVO;
@@ -33,6 +34,7 @@ import com.fs.course.domain.FsUserCourseCategory;
 import com.fs.course.service.IFsUserCourseCategoryService;
 import com.fs.common.utils.poi.ExcelUtil;
 import com.fs.common.core.page.TableDataInfo;
+import org.springframework.web.multipart.MultipartFile;
 
 /**
  * 课堂分类Controller
@@ -174,4 +176,37 @@ public class FsUserCourseCategoryController extends BaseController
         List<OptionsVO> list = fsUserCourseCategoryService.selectCateListByPid(pid);
         return R.ok().put("data", list);
     }
+
+    // 下载模板
+    @GetMapping("/importTemplate")
+    public AjaxResult importTemplate() {
+        ExcelUtil<FsCourseCategoryImportDTO> util = new ExcelUtil<>(FsCourseCategoryImportDTO.class);
+        return util.importTemplateExcel("课堂分类导入模板");
+    }
+
+    @Log(title = "导入", businessType = BusinessType.IMPORT)
+    @PreAuthorize("@ss.hasPermi('course:userCourseCategory:importData')")
+    @PostMapping("/importData")
+    public AjaxResult importData(MultipartFile file) throws Exception {
+        ExcelUtil<FsCourseCategoryImportDTO> util = new ExcelUtil<>(FsCourseCategoryImportDTO.class);
+        List<FsCourseCategoryImportDTO> list = util.importExcel(file.getInputStream());
+
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        Long userId = loginUser.getUser().getUserId();
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = JSONUtil.toBean(json, CourseConfig.class);
+        if (ObjectUtil.isEmpty(config.getIsBound()) || !config.getIsBound()){
+            userId = null;
+        }
+
+        return AjaxResult.success(fsUserCourseCategoryService.importData(list, userId));
+    }
+
+    @PreAuthorize("@ss.hasPermi('course:userCourseCategory:exportFail')")
+    @Log(title = "课堂分类", businessType = BusinessType.EXPORT)
+    @PostMapping("/exportFail")
+    public AjaxResult exportFail(@RequestBody List<FsCourseCategoryImportDTO> list) {
+        ExcelUtil<FsCourseCategoryImportDTO> util = new ExcelUtil<>(FsCourseCategoryImportDTO.class);
+        return util.exportExcel(list, "课堂分类错误数据");
+    }
 }

+ 14 - 0
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -1137,6 +1137,20 @@ public class FsStoreOrderScrmController extends BaseController {
         return R.ok("成功审核 " + count + " 条订单");
     }
 
+    @ApiOperation("订单备注")
+    @Log(title = "订单管理", businessType = BusinessType.UPDATE)
+    @PreAuthorize("@ss.hasPermi('store:storeOrder:remark')")
+    @PostMapping("/remark")
+    public R remark(@Validated @RequestBody FsStoreOrderScrm param) {
+        if (param.getId() == null || param.getId() == 0) {
+            return R.error("订单ID错误");
+        }
+        if (StringUtils.isEmpty(param.getOrderRemark())) {
+            return R.error("订单备注不能为空");
+        }
+        return fsStoreOrderService.orderRemark(param);
+    }
+
     private FsStoreOrderDf getDFInfo(String loginAccount) {
         //查询订单账户 判断是否存在该订单账户
         List<FsDfAccount> erpAccounts = fsDfAccountService.selectFsDfAccountList(null);

+ 3 - 3
fs-admin/src/main/java/com/fs/hisStore/task/LiveTask.java

@@ -331,10 +331,10 @@ public class LiveTask {
     public void deliveryOp() {
         List<LiveOrder> list = liveOrderService.selectUpdateExpress();
         if(list == null || list.isEmpty()) return;
-
+        Date now = new Date();
         for (LiveOrder order : list) {
-            order.setUpdateTime(new Date());
-            liveOrderService.updateLiveOrder(order);
+            order.setUpdateTime(now);
+            liveOrderService.updateTime(order);
             ErpOrderQueryRequert request = new ErpOrderQueryRequert();
             request.setCode(order.getExtendOrderId());
             IErpOrderService erpOrderService = getErpOrderService();

+ 1 - 1
fs-admin/src/main/java/com/fs/qw/controller/QwExternalContactController.java

@@ -170,7 +170,7 @@ public class QwExternalContactController extends BaseController
     {
         return toAjax(qwExternalContactService.deleteQwExternalContactByIds(ids));
     }
-
+    @PreAuthorize("@ss.hasPermi('qw:externalContact:getUserInfo')")
     @GetMapping(value = "getUserInfo/{id}")
     public R getUserInfo(@PathVariable("id") Long id)
     {

+ 1 - 1
fs-company/src/main/java/com/fs/company/controller/qw/QwExternalContactController.java

@@ -722,7 +722,7 @@ public class QwExternalContactController extends BaseController
 
         return  qwExternalContactService.setCustomerCourseSopList(param);
     }
-    @PreAuthorize("@ss.hasPermi('qw:externalContact:edit')")
+    @PreAuthorize("@ss.hasPermi('qw:externalContact:edit') or @ss.hasPermi('qw:externalContact:deptEdit') or @ss.hasPermi('qw:externalContact:myEdit')")
     @Log(title = "批量修改备注", businessType = BusinessType.UPDATE)
     @PostMapping("/batchUpdateExternalContactNotes")
     public R batchUpdateExternalContactNotes(@RequestBody QwExternalContactUpdateNoteParam param) throws JSONException {

+ 21 - 0
fs-company/src/main/java/com/fs/hisStore/controller/FsStoreOrderScrmController.java

@@ -15,6 +15,9 @@ import com.fs.common.utils.ParseUtils;
 import com.fs.common.utils.ServletUtils;
 import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.company.domain.CompanyUser;
+import com.fs.company.service.ICompanyUserService;
+import com.fs.config.cloud.CloudHostProper;
 import com.fs.crm.domain.CrmCustomer;
 import com.fs.crm.service.ICrmCustomerService;
 import com.fs.framework.security.LoginUser;
@@ -46,6 +49,7 @@ import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
  * 订单Controller
@@ -80,6 +84,10 @@ public class FsStoreOrderScrmController extends BaseController
     private IFsStoreOrderAuditLogScrmService orderAuditLogService;
     @Autowired
     private ISysConfigService configService;
+    @Autowired
+    private ICompanyUserService companyUserService;
+    @Autowired
+    private CloudHostProper cloudHostProper;
 
     /**
      * 查询订单列表
@@ -90,6 +98,19 @@ public class FsStoreOrderScrmController extends BaseController
     {
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
         param.setCompanyId(loginUser.getCompany().getCompanyId());
+
+        // 郑多燕需求
+        if("广州郑多燕".equals(cloudHostProper.getCompanyName())){
+            // 根据当前销售所属的数据权限过滤订单;
+            List<CompanyUser> companyUsers = companyUserService.getDataScopeCompanyUser(loginUser.getUser().getUserId());
+            if(!companyUsers.isEmpty()){
+                List<Long> companyUserIds = companyUsers.stream().map(CompanyUser::getUserId).collect(Collectors.toList());
+                param.setCompanyUserIds(companyUserIds);
+            } else {
+                // 表示数据权限是本人
+                param.setCompanyUserId(loginUser.getUser().getUserId());
+            }
+        }
         startPage();
         if(!StringUtils.isEmpty(param.getCreateTimeRange())){
             param.setCreateTimeList(param.getCreateTimeRange().split("--"));

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

@@ -2,8 +2,15 @@
 server:
   # 服务器的HTTP端口,默认为
   port: 7114
+  tomcat:
+    max-connections: 1000000
+    max-threads: 32
+    connection-timeout: 600000
+    accept-count: 10000
+  compression:
+    enabled: true
 
 # Spring配置
 spring:
   profiles:
-    active: dev-test
+    active: druid-bjzm-test

+ 9 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyUserService.java

@@ -264,4 +264,13 @@ public interface ICompanyUserService {
      * @return 绑定的用户列表
      */
     List<com.fs.hisStore.domain.FsUserScrm> selectBoundFsUsersByCompanyUserId(Long companyUserId);
+
+
+    /**
+     * 根据当前销售所属的数据权限过滤订单;
+     * @auth Caoliqin
+     * @param companyUserId
+     * @return
+     */
+    List<CompanyUser> getDataScopeCompanyUser(Long companyUserId);
 }

+ 23 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyUserServiceImpl.java

@@ -128,6 +128,9 @@ public class CompanyUserServiceImpl implements ICompanyUserService
 //    @Autowired
 //    private ICompanyUserRoleService userRoleService;
 
+    @Autowired
+    private CompanyRoleMapper companyRoleMapper;
+
 
     /**
      * 查询物业公司管理员信息
@@ -1096,4 +1099,24 @@ public class CompanyUserServiceImpl implements ICompanyUserService
     public List<com.fs.hisStore.domain.FsUserScrm> selectBoundFsUsersByCompanyUserId(Long companyUserId) {
         return companyUserMapper.selectBoundFsUsersByCompanyUserId(companyUserId);
     }
+
+    @Override
+    public List<CompanyUser> getDataScopeCompanyUser(Long companyUserId) {
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(companyUserId);
+        List<CompanyRole> companyRoles = companyRoleMapper.selectRolePermissionByUserId(companyUserId);
+        List<CompanyUser> companyUsers;
+        // 是否是管理员或者包含 1:全部数据权限
+        if (companyUser.isAdmin() || companyRoles.stream().anyMatch(r -> "1".equals(r.getDataScope()))) {
+            companyUsers = companyUserService.getCompanyUserListByCompanyIdAndDeptId(companyUser.getCompanyId(), null);
+        }
+        // 是否包含 3:本部门数据权限 4:本部门及以下数据权限
+        else if (companyRoles.stream().anyMatch(r -> "3".equals(r.getDataScope()) || "4".equals(r.getDataScope()))) {
+            companyUsers = companyUserService.getCompanyUserListByCompanyIdAndDeptId(companyUser.getCompanyId(), companyUser.getDeptId());
+        }
+        // 默认空,判断是否包含 5:仅可查看本人
+        else {
+            companyUsers = new ArrayList<>();
+        }
+        return companyUsers;
+    }
 }

+ 14 - 0
fs-service/src/main/java/com/fs/course/dto/FsCourseCategoryImportDTO.java

@@ -0,0 +1,14 @@
+package com.fs.course.dto;
+
+import com.fs.common.annotation.Excel;
+import lombok.Data;
+
+@Data
+public class FsCourseCategoryImportDTO {
+
+    @Excel(name = "父分类")
+    private String rootCate;
+
+    @Excel(name = "子分类")
+    private String subCate;
+}

+ 12 - 0
fs-service/src/main/java/com/fs/course/mapper/FsUserCourseCategoryMapper.java

@@ -101,4 +101,16 @@ public interface FsUserCourseCategoryMapper
 
     @Select("select cate_id dict_value, cate_name dict_label  from fs_user_course_category WHERE pid = 0 and is_del=0 ")
     List<OptionsVO> selectAllFsUserCourseCategoryPidList();
+
+    /**
+     * 根据名称和上级ID查询分类
+     */
+    @Select("select * from fs_user_course_category where cate_name = #{name} and pid = #{parentId} and is_del = 0")
+    FsUserCourseCategory selectFsUserCourseCategoryByNameAndParentId(@Param("name") String name, @Param("parentId") Long parentId);
+
+    /**
+     * 获取序号
+     */
+    @Select("select ifnull(max(sort), 0) + 1 from fs_user_course_category where pid = #{parentId}")
+    Long getSortByParentId(@Param("parentId") Long parentId);
 }

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

@@ -1,7 +1,10 @@
 package com.fs.course.service;
 
 import java.util.List;
+import java.util.Map;
+
 import com.fs.course.domain.FsUserCourseCategory;
+import com.fs.course.dto.FsCourseCategoryImportDTO;
 import com.fs.his.vo.OptionsVO;
 
 /**
@@ -68,4 +71,9 @@ public interface IFsUserCourseCategoryService
     List<OptionsVO> selectFsUserCourseCategoryPidList(Long userId);
 
     List<OptionsVO> selectCateListByPid(Long pid);
+
+    /**
+     * 课堂分类导入
+     */
+    Map<String, Object> importData(List<FsCourseCategoryImportDTO> list, Long userId);
 }

+ 89 - 1
fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseCategoryServiceImpl.java

@@ -1,8 +1,14 @@
 package com.fs.course.service.impl;
 
-import java.util.List;
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.fs.common.exception.CustomException;
 import com.fs.common.utils.DateUtils;
+import com.fs.common.utils.StringUtils;
+import com.fs.course.dto.FsCourseCategoryImportDTO;
 import com.fs.his.vo.OptionsVO;
+import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.fs.course.mapper.FsUserCourseCategoryMapper;
@@ -15,6 +21,7 @@ import com.fs.course.service.IFsUserCourseCategoryService;
  * @author fs
  * @date 2024-05-15
  */
+@Slf4j
 @Service
 public class FsUserCourseCategoryServiceImpl implements IFsUserCourseCategoryService
 {
@@ -118,4 +125,85 @@ public class FsUserCourseCategoryServiceImpl implements IFsUserCourseCategorySer
     public List<OptionsVO> selectCateListByPid(Long pid) {
         return fsUserCourseCategoryMapper.selectCateListByPid(pid);
     }
+
+    /**
+     * 课堂分类导入
+     */
+    @Override
+    public Map<String, Object> importData(List<FsCourseCategoryImportDTO> list, Long userId) {
+        int suCnt = 0;
+        int filCnt = 0;
+        List<FsCourseCategoryImportDTO> failedList = new ArrayList<>();
+
+        if (list == null || list.isEmpty()) {
+            throw new CustomException("导入数据不能为空");
+        }
+
+        Map<String, List<FsCourseCategoryImportDTO>> rootMap = list.stream()
+                .filter(dto -> StringUtils.isNotBlank(dto.getRootCate()))
+                .collect(Collectors.groupingBy(FsCourseCategoryImportDTO::getRootCate));
+        for (Map.Entry<String, List<FsCourseCategoryImportDTO>> entry : rootMap.entrySet()) {
+            if (StringUtils.isBlank(entry.getKey())) {
+                failedList.addAll(entry.getValue());
+                filCnt += entry.getValue().size();
+                continue;
+            }
+
+            String rootCate = entry.getKey().trim();
+            FsUserCourseCategory root = fsUserCourseCategoryMapper.selectFsUserCourseCategoryByNameAndParentId(rootCate, 0L);
+            if (Objects.isNull(root)) {
+                root = new FsUserCourseCategory();
+                root.setPid(0L);
+                root.setCateName(rootCate);
+                root.setSort(fsUserCourseCategoryMapper.getSortByParentId(0L));
+                root.setIsShow(1);
+                root.setCreateTime(new Date());
+                root.setIsDel(0);
+                root.setUserId(userId);
+                fsUserCourseCategoryMapper.insertFsUserCourseCategory(root);
+            }
+
+            Long parentId = root.getCateId();
+            long curSort = fsUserCourseCategoryMapper.getSortByParentId(root.getCateId());
+            List<FsCourseCategoryImportDTO> subList = entry.getValue();
+            for (FsCourseCategoryImportDTO child : subList) {
+                try {
+                    if (StringUtils.isBlank(child.getSubCate())) {
+                        failedList.add(child);
+                        filCnt++;
+                        continue;
+                    }
+
+                    String cateName = child.getSubCate().trim();
+                    FsUserCourseCategory sub = fsUserCourseCategoryMapper.selectFsUserCourseCategoryByNameAndParentId(cateName, parentId);
+                    if (Objects.nonNull(sub)) {
+                        failedList.add(child);
+                        filCnt++;
+                        continue;
+                    }
+
+                    sub = new FsUserCourseCategory();
+                    sub.setPid(parentId);
+                    sub.setCateName(cateName);
+                    sub.setSort(curSort++);
+                    sub.setIsShow(1);
+                    sub.setCreateTime(new Date());
+                    sub.setIsDel(0);
+                    sub.setUserId(userId);
+                    fsUserCourseCategoryMapper.insertFsUserCourseCategory(sub);
+
+                    suCnt++;
+                } catch (Exception e) {
+                    filCnt++;
+                    log.error("导入子分类失败: {}", child, e);
+                }
+            }
+        }
+
+        String message = "导入完成!成功" + suCnt + "条,失败" + filCnt + "条。";
+        Map<String, Object> resp = new HashMap<>();
+        resp.put("message", message);
+        resp.put("failList", failedList);
+        return resp;
+    }
 }

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

@@ -98,6 +98,8 @@ public interface IFsUserService
      */
     public int deleteFsUserByUserId(Long userId);
 
+    int realDeleteFsUserByUserId(Long userId);
+
     List<FsUserVO> selectFsUserListVO(FsUserParam fsUser);
 
     FsUser selectFsUserByOpenId(String openId);

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

@@ -286,6 +286,11 @@ public class FsUserServiceImpl implements IFsUserService {
         return fsUserMapper.updateFsUserByUserId(userId);
     }
 
+    @Override
+    public int realDeleteFsUserByUserId(Long userId) {
+        return fsUserMapper.deleteFsUserByUserId(userId);
+    }
+
     /**
      * 列表查询
      * @param fsUser

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

@@ -999,7 +999,7 @@ public interface FsStoreOrderScrmMapper
     @Select("select id from fs_store_order_scrm where status = 2  and DATE(pay_time)>='2023-11-1' and DATE(create_time)<='2024-2-7' and company_id is null ")
     List<Long> selectSyncExpressIds();
 
-    @Select("select id from fs_store_order_scrm where status = 2  and DATE(pay_time)>='2023-11-1' and company_id is null ")
+    @Select("select id from fs_store_order_scrm where status = 2  and DATE(pay_time)>='2025-11-1' and delivery_id is not null and delivery_sn is not null")
     List<Long> selectSyncExpressIdsNoDate();
 
 

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

@@ -256,7 +256,7 @@ public interface FsStoreProductScrmMapper
     @Update("update fs_store_product_scrm set stock=stock-#{num}, sales=sales+#{num}" +
             " where product_id=#{productId} and stock >= #{num}")
     int decProductAttrStock(@Param("productId")Long productId, @Param("num")Integer cartNum);
-    
+
     /**
      * 使用行锁查询商品库存
      */

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

@@ -121,4 +121,7 @@ public class FsStoreOrderParam extends BaseEntity implements Serializable
 
     // 是否审核,1-是,0-否
     private Integer isAudit;
+
+    // 多个销售id
+    private List<Long> companyUserIds;
 }

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

@@ -357,4 +357,9 @@ public interface IFsStoreOrderScrmService
      * @return 更新条数
      */
     int batchAuditOrder(FsStoreOrderBatchAuditParam param);
+
+    /**
+     * 订单备注
+     */
+    R orderRemark(FsStoreOrderScrm orderScrm);
 }

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

@@ -2747,6 +2747,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             }
         }
         ExpressInfoDTO dto = expressService.getExpressInfo(order.getOrderCode(), order.getDeliverySn(), order.getDeliveryId(), lastFourNumber);
+        if (dto == null || dto.getState() == null || dto.getStateEx() == null) {
+            return null;
+        }
         FsStoreOrderScrm map = new FsStoreOrderScrm();
         map.setDeliveryStatus(Integer.parseInt(dto.getState()));
         map.setId(order.getId());
@@ -5592,6 +5595,23 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         return fsStoreOrderMapper.batchUpdateAuditStatus(param.getOrderIds(), param.getIsAudit());
     }
 
+    @Override
+    public R orderRemark(FsStoreOrderScrm orderScrm) {
+        FsStoreOrderScrm order = fsStoreOrderMapper.selectFsStoreOrderById(orderScrm.getId());
+        if (order != null) {
+            FsStoreOrderScrm map = new FsStoreOrderScrm();
+            map.setId(orderScrm.getId());
+            map.setOrderRemark(orderScrm.getOrderRemark());
+
+            if (fsStoreOrderMapper.updateFsStoreOrder(map) > 0) {
+                return R.ok();
+            } else {
+                return R.error("备注失败");
+            }
+        }
+        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"));

+ 0 - 1
fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductListVO.java

@@ -35,7 +35,6 @@ public class FsStoreProductListVO  implements Serializable
 
     /** 产品条码(一维码) */
     private String barCode;
-
     /** 分类id */
     private Long cateId;
 

+ 3 - 1
fs-service/src/main/java/com/fs/live/domain/LiveCouponUser.java

@@ -73,5 +73,7 @@ public class LiveCouponUser extends BaseEntity
     @Excel(name = "商品ID")
     private Long goodsId;
 
-
+    //非数据库实体 只是返回
+    private String nickname;
+    private String phone;
 }

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

@@ -270,4 +270,6 @@ public interface ILiveOrderService {
     Long isExistPayedRecord(Long orderId);
 
     void payConfirmPayment(Long existPayedRecordId);
+
+    void updateTime(LiveOrder order);
 }

+ 15 - 1
fs-service/src/main/java/com/fs/live/service/impl/LiveOrderServiceImpl.java

@@ -1654,6 +1654,12 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
                 userService.subLiveTuiMoney(liveOrder);
             }
         }
+        //优惠券返回
+        if(order.getUserCouponId()!=null){
+            // 退券
+            order.setCouponUserId(Long.parseLong(order.getUserId()));
+            this.refundCoupon(order);
+        }
         // 删除限购记录
         deletePurchaseLimitRecordsForLiveOrder(order);
 
@@ -3673,6 +3679,14 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         this.payConfirm(1, null, payment.getPayCode(), payment.getTradeNo(), payment.getBankSerialNo(), payment.getBankSerialNo());
     }
 
+    @Override
+    public void updateTime(LiveOrder order) {
+        LiveOrder liveOrder = new LiveOrder();
+        liveOrder.setOrderId(order.getOrderId());
+        liveOrder.setUpdateTime(order.getUpdateTime());
+        liveOrderMapper.updateLiveOrder(liveOrder);
+    }
+
     public void deStockIncSale(List<FsStoreCartQueryVO> cartInfo) {
         for (FsStoreCartQueryVO storeCartVO : cartInfo) {
             fsStoreProductService.decProductStock(storeCartVO.getProductId(),
@@ -4037,7 +4051,7 @@ public class LiveOrderServiceImpl implements ILiveOrderService {
         // 使用 productService.decProductStock 方法,该方法已包含库存检查逻辑
         fsStoreProductService.decProductStock(productId, attrValueId, num);
     }
-    
+
     private void checkPurchaseLimitForLiveOrder(Long userId, Long productId, Integer num) {
         // 查询商品信息
         FsStoreProductScrm product = fsStoreProductService.selectFsStoreProductById(productId);

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

@@ -10,8 +10,8 @@ logging:
 wx:
   miniapp:
     configs:
-      - appid: wx94951f52d3ac5e25   #北京存在文化
-        secret: bfe27b20c6e3c4232a1d4ef36228e84b #北京存在文化
+      - appid: wx94951f52d3ac5e25   #星辰生物
+        secret: bfe27b20c6e3c4232a1d4ef36228e84b #星辰生物
         token: Ncbnd7lJvkripxxna6NAWCxCrvC
         aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
         msgDataFormat: JSON
@@ -57,11 +57,11 @@ watch:
   password3: v9xsKuqn_$d2y
 
 fs :
-  commonApi: http://10.206.0.12:7771
-  h5CommonApi: http://10.206.0.12:7771
+  commonApi: http://192.168.0.160:7771
+  h5CommonApi: http://192.168.0.160:7771
   jwt:
     # 加密秘钥
-    secret: 3e6d9c0b4a7f1e2d5c4e0d3c6b9a2f5e
+    secret: 666d9c0b4a7f1e2d5c4e0d3c6b9a2fff
     # token有效时长,7天,单位秒
     expire: 31536000
     header: AppToken
@@ -93,10 +93,10 @@ headerImg:
   imgUrl:
 
 ipad:
-  ipadUrl: http://ipad.ljhehualu.com
-  aiApi: http://49.232.181.28:3000/api
-  voiceApi: http://129.28.187.88:8667
-  commonApi: http://129.28.187.88:7771
+  ipadUrl: http://ipad.zgfjfzxhxc.com
+  aiApi:
+  voiceApi:
+  commonApi: http://192.168.0.160:7771
 wx_miniapp_temp:
   pay_order_temp_id:
   inquiry_temp_id:

+ 5 - 0
fs-service/src/main/resources/application-config-fzbt.yml

@@ -10,6 +10,11 @@ logging:
 wx:
   miniapp:
     configs:
+      - appid: wx4115995705bb0ea0   #中康智慧
+        secret: 58910ae743005c396012b029c7def579
+        token: Ncbnd7lJvkripVOpyTFAna6NAWCxCrvC
+        aesKey: HlEiBB55eaWUaeBVAQO3cWKWPYv1vOVQSq7nFNICw4E
+        msgDataFormat: JSON
   cp:
     corpId: wwb2a1055fb6c9a7c2
     appConfigs:

+ 1 - 0
fs-service/src/main/resources/mapper/company/CompanyUserMapper.xml

@@ -97,6 +97,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         u.is_need_register_member,u.is_allowed_all_register,
         u.avatar,u.address_id,
         u.qw_user_id,
+        u.doctor_id,
         d.dept_name,
         d.leader
         from

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

@@ -434,6 +434,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="followTime != null">follow_time = #{followTime},</if>
             <if test="followDoctorId != null">follow_doctor_id = #{followDoctorId},</if>
             <if test="cycle != null">cycle = #{cycle},</if>
+            <if test="orderRemark != null">order_remark = #{orderRemark},</if>
         </trim>
         where id = #{id}
     </update>
@@ -1743,6 +1744,12 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="maps.isAudit != null   ">
                 and o.is_audit = #{maps.isAudit}
             </if>
+            <if test="maps.companyUserIds != null  and maps.companyUserIds.size > 0">
+                and o.company_user_id in
+                <foreach collection="maps.companyUserIds" item="companyUserId" open="(" close=")" separator=",">
+                    #{companyUserId}
+                </foreach>
+            </if>
         </where>
         ${maps.params.dataScope}
 <!--        <if test="maps.productName != null and  maps.productName !=  ''   ">-->

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

@@ -136,8 +136,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                                             </if>
                                              <if test="companyId !=null">
                                                  company_id = #{companyId},
-                                                 products = null
+                                                 products = null,
                                              </if>
+                                                 store_id = null
                                          where package_id in
         <foreach item="packageId" collection="packageIds" open="(" separator="," close=")">
             #{packageId}

+ 4 - 19
fs-service/src/main/resources/mapper/hisStore/MergedOrderMapper.xml

@@ -119,12 +119,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND DATE(delivery_import_time) BETWEEN SUBSTRING_INDEX(#{maps.deliveryImportTimeRange}, '--', 1) AND SUBSTRING_INDEX(#{maps.deliveryImportTimeRange}, '--', -1)
           </if>
         ORDER BY create_time DESC
-        <if test="maps.pageSize != null and maps.pageSize > 0">
-          LIMIT #{maps.pageSize}
-          <if test="maps.offset != null and maps.offset >= 0">
-            OFFSET #{maps.offset}
-          </if>
-        </if>
+        limit 1000
       ) o
       left join ( SELECT fsois.*, ROW_NUMBER() OVER ( PARTITION BY fsois.order_id ORDER BY fsois.item_id ) AS rn FROM fs_store_order_item_scrm fsois ) item_latest ON item_latest.order_id = o.id and item_latest.rn = 1
       LEFT JOIN fs_user u ON o.user_id = u.user_id
@@ -164,7 +159,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         </if>
           group by o.id
           UNION ALL
-          -- 商城订单(没有company_user_id的商城订单)
+
       SELECT
       o.id,
       '商城订单' AS order_type_name,
@@ -278,12 +273,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND DATE(delivery_import_time) BETWEEN SUBSTRING_INDEX(#{maps.deliveryImportTimeRange}, '--', 1) AND SUBSTRING_INDEX(#{maps.deliveryImportTimeRange}, '--', -1)
           </if>
         ORDER BY create_time DESC
-        <if test="maps.pageSize != null and maps.pageSize > 0">
-          LIMIT #{maps.pageSize}
-          <if test="maps.offset != null and maps.offset >= 0">
-            OFFSET #{maps.offset}
-          </if>
-        </if>
+      limit 1000
       ) o
         left join ( SELECT fsois.*, ROW_NUMBER() OVER ( PARTITION BY fsois.order_id ORDER BY fsois.item_id ) AS rn FROM fs_store_order_item_scrm fsois ) item_latest ON item_latest.order_id = o.id and item_latest.rn = 1
       LEFT JOIN fs_user u ON o.user_id = u.user_id
@@ -434,12 +424,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             AND DATE(delivery_send_time) BETWEEN SUBSTRING_INDEX(#{maps.deliverySendTimeRange}, '--', 1) AND SUBSTRING_INDEX(#{maps.deliverySendTimeRange}, '--', -1)
           </if>
         ORDER BY create_time DESC
-        <if test="maps.pageSize != null and maps.pageSize > 0">
-          LIMIT #{maps.pageSize}
-          <if test="maps.offset != null and maps.offset >= 0">
-            OFFSET #{maps.offset}
-          </if>
-        </if>
+      limit 1000
       ) o
       left join live_order_item loi on loi.order_id = o.order_id
       LEFT JOIN fs_user u ON o.user_id = u.user_id

+ 7 - 1
fs-service/src/main/resources/mapper/live/LiveCouponUserMapper.xml

@@ -27,7 +27,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </sql>
 
     <select id="selectLiveCouponUserList" parameterType="LiveCouponUser" resultMap="LiveCouponUserResult">
-        <include refid="selectLiveCouponUserVo"/>
+
+        select cou.id, cou.coupon_id, cou.user_id, cou.coupon_title, cou.coupon_price, cou.use_min_price, cou.create_time, cou.update_time, cou.limit_time, cou.use_time, cou.type, cou.status, cou.is_fail, cou.is_del,cou.goods_id,
+        u.nick_name,u.phone
+
+        from live_coupon_user as  cou
+         left join fs_user u on cou.user_id=u.user_id
+
         <where>
             <if test="couponId != null "> and coupon_id = #{couponId}</if>
             <if test="userId != null "> and user_id = #{userId}</if>

+ 54 - 21
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -277,7 +277,7 @@ public class AppLoginController extends AppBaseController{
                     userMap.setAppId(updatedAppId);
                     userService.updateFsUser(userMap);
                 }
-                
+
                 if (StringUtils.isNotEmpty(param.getJpushId())) {
                     updateExistingUserJpushId(user, param.getJpushId());
                 }
@@ -358,6 +358,7 @@ public class AppLoginController extends AppBaseController{
 
     @ApiOperation("绑定手机号")
     @PostMapping("/setPhone")
+    @Transactional(rollbackFor = Exception.class)
     public R setPhone(@Validated @RequestBody FsUserEditPhoneParam param) {
         logger.info("fcj 绑定手机号入参:{}", param);
         FsUser user = userService.selectFsUserByUnionid(param.getUnionId());
@@ -365,9 +366,20 @@ public class AppLoginController extends AppBaseController{
             return R.error("用户数据不存在");
         }
         FsUser userMap = findUserByPhone(param.getPhone());
-//        if (userMap!=null){
-//            return R.error("该手机号已绑定其他账号");
-//        }
+        //绑定的手机号已存在用户的情况,将微信登录的时候创建的新号的UnionId移动到老号中,删除新号(将两个号合并)
+        if (userMap!=null){
+            if (StringUtils.isNotEmpty(userMap.getUnionId())&&!userMap.getUnionId().equals(user.getUnionId())){
+                return R.error("该手机号已绑定其他微信");
+            }
+            userMap.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
+            userMap.setSource(param.getSource());
+            userMap.setUnionId(user.getUnionId());
+            if (userService.updateFsUser(userMap)>0){
+                userService.realDeleteFsUserByUserId(user.getUserId());
+                return generateTokenAndReturn(userMap);
+            }
+            return R.error("绑定手机号失败");
+        }
         user.setPhone(param.getPhone());
         user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null );
         user.setSource(param.getSource()!= null ? param.getSource() : null);
@@ -384,10 +396,14 @@ public class AppLoginController extends AppBaseController{
 
     @ApiOperation("绑定微信")
     @PostMapping("/bindWeChat")
+    @Transactional(rollbackFor = Exception.class)
     public R bindWeChat(@Validated @RequestBody FsUserEditUnionidParam param) {
         try {
             logger.info("zyp app绑定微信,param:{}", param);
             Map result = WxUtil.getAccessToken(param.getCode(), openProperties.getAppId(), openProperties.getSecret());
+            if (!result.containsKey("access_token")) {
+                return R.error("微信授权失败");
+            }
             String accessToken = result.get("access_token").toString();
             String unionid = result.get("unionid").toString();
             String openid = result.get("openid").toString();
@@ -398,21 +414,38 @@ public class AppLoginController extends AppBaseController{
             FsUser user = findUserByPhone(param.getPhone());
             if (user!=null && StringUtils.isEmpty(user.getUnionId())){
                 FsUser userByUnionId = userMapper.selectFsUserByUnionid(unionid);
-//                if (userByUnionId!=null){
-//                    return R.error("该微信已绑定其他用户,请勿重复绑定!");
-//                }
-                user.setSource(param.getSource() != null ? param.getSource() : null );
-                user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
-                user.setNickName(nickname);
-                user.setAvatar(avatar);
-                user.setSex(sex);
-                user.setUnionId(unionid);
-                if (userService.updateFsUser(user)>0){
-                    return generateTokenAndReturn(user);
+                //绑定的微信已存在用户的情况,将手机号一键登录的时候创建的新号的UnionId移动到老号中,删除新号(将两个号合并)
+                if (userByUnionId!=null){
+                    if (StringUtils.isNotEmpty(userByUnionId.getPhone())&&!user.getPhone().equals(userByUnionId.getPhone())){
+                        return R.error("该微信已绑定其他手机号");
+                    }
+                    userByUnionId.setPhone(user.getPhone());
+                    userByUnionId.setSource(param.getSource() != null ? param.getSource() : null );
+                    userByUnionId.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
+                    userByUnionId.setNickName(nickname);
+                    userByUnionId.setAvatar(avatar);
+                    userByUnionId.setSex(sex);
+                    if (userService.updateFsUser(userByUnionId)>0){
+                        userService.realDeleteFsUserByUserId(user.getUserId());
+                        return generateTokenAndReturn(userByUnionId);
+                    }
+                    else {
+                        return R.error("绑定微信失败");
+                    }
+                }else {
+                    user.setSource(param.getSource() != null ? param.getSource() : null );
+                    user.setLoginDevice(param.getLoginDevice() != null ? param.getLoginDevice() : null);
+                    user.setNickName(nickname);
+                    user.setAvatar(avatar);
+                    user.setSex(sex);
+                    user.setUnionId(unionid);
+                    if (userService.updateFsUser(user)>0){
+                        return generateTokenAndReturn(user);
+                    }
+                    else {
+                        return R.error("绑定微信失败");
+                    }
                 }
-//                else {
-//                    return R.error("绑定微信失败");
-//                }
             }
             return R.error("数据参数异常!");
         }catch (Exception e){
@@ -736,12 +769,12 @@ public class AppLoginController extends AppBaseController{
         if (StringUtils.isEmpty(newAppId)) {
             return currentAppIds == null ? "" : currentAppIds;
         }
-        
+
         // 如果当前appId为空,直接返回新appId
         if (StringUtils.isEmpty(currentAppIds)) {
             return newAppId;
         }
-        
+
         // 检查是否已存在
         String[] appIdArray = currentAppIds.split(",");
         for (String appId : appIdArray) {
@@ -750,7 +783,7 @@ public class AppLoginController extends AppBaseController{
                 return currentAppIds;
             }
         }
-        
+
         // 不存在,追加到末尾
         return currentAppIds + "," + newAppId;
     }