Parcourir la source

1.销售公司ipad一键启用停用、用户外部联系人生成半封建小程序、销售填写用户信息,开方信息,还原token校验逻辑

yjwang il y a 1 mois
Parent
commit
eb6cd7e595
36 fichiers modifiés avec 522 ajouts et 71 suppressions
  1. 40 0
      fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java
  2. 14 0
      fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java
  3. 12 0
      fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java
  4. 6 0
      fs-service/src/main/java/com/fs/company/domain/Company.java
  5. 19 0
      fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java
  6. 1 0
      fs-service/src/main/java/com/fs/company/param/CompanyParam.java
  7. 22 0
      fs-service/src/main/java/com/fs/company/service/ICompanyService.java
  8. 95 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java
  9. 3 0
      fs-service/src/main/java/com/fs/company/vo/CompanyVO.java
  10. 21 2
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCourseVideoServiceImpl.java
  11. 20 0
      fs-service/src/main/java/com/fs/his/dto/FsUserWxGenerateDTO.java
  12. 14 0
      fs-service/src/main/java/com/fs/his/mapper/FsUserWxMapper.java
  13. 3 0
      fs-service/src/main/java/com/fs/his/service/IFsUserWxService.java
  14. 44 0
      fs-service/src/main/java/com/fs/his/service/impl/FsUserWxServiceImpl.java
  15. 4 0
      fs-service/src/main/java/com/fs/hisStore/domain/FsStorePreparedPriceChange.java
  16. 2 0
      fs-service/src/main/java/com/fs/hisStore/param/FsStoreCartCountParam.java
  17. 6 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreProductScrmService.java
  18. 26 19
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java
  19. 7 1
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePreparedPriceChangeServiceImpl.java
  20. 8 0
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreProductScrmServiceImpl.java
  21. 1 1
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCartGroupStoreScrmVO.java
  22. 3 0
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreCartQueryVO.java
  23. 4 1
      fs-service/src/main/java/com/fs/hisStore/vo/FsStoreProductActivityListVO.java
  24. 1 1
      fs-service/src/main/java/com/fs/hospital580/vo/CacheOpenInformationVo.java
  25. 5 0
      fs-service/src/main/java/com/fs/qw/mapper/QwExternalContactMapper.java
  26. 25 0
      fs-service/src/main/resources/mapper/company/CompanyMapper.xml
  27. 28 0
      fs-service/src/main/resources/mapper/his/FsUserWxMapper.xml
  28. 10 1
      fs-service/src/main/resources/mapper/hisStore/FsStorePreparedPriceChangeMapper.xml
  29. 13 0
      fs-service/src/main/resources/mapper/hisStore/FsStoreScrmMapper.xml
  30. 9 0
      fs-service/src/main/resources/mapper/qw/QwExternalContactMapper.xml
  31. 21 20
      fs-user-app/src/main/java/com/fs/app/controller/Hospital580Controller.java
  32. 16 19
      fs-user-app/src/main/java/com/fs/app/controller/UserAddressController.java
  33. 1 0
      fs-user-app/src/main/java/com/fs/app/controller/UserController.java
  34. 12 0
      fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java
  35. 5 5
      fs-user-app/src/main/java/com/fs/app/interceptor/AuthorizationInterceptor.java
  36. 1 1
      fs-user-app/src/main/java/com/fs/app/param/FsUserAddressAddEditParam.java

+ 40 - 0
fs-admin/src/main/java/com/fs/his/controller/FsCompanyController.java

@@ -16,6 +16,7 @@ import com.fs.company.domain.CompanyDeduct;
 import com.fs.company.domain.CompanyRecharge;
 import com.fs.company.param.CompanyDeductParam;
 import com.fs.company.param.CompanyDivConfigUpdateParam;
+import com.fs.company.param.CompanyParam;
 import com.fs.company.param.CompanyRechargeParam;
 import com.fs.company.service.*;
 import com.fs.company.vo.CompanyVO;
@@ -270,4 +271,43 @@ public class FsCompanyController extends BaseController
         return companyDivConfigService.setDiv(param);
     }
 
+
+    /***
+     * paid一键禁用
+     * @paparam companyIds 销售公司ID
+     * @return R
+     * **/
+    @PreAuthorize("@ss.hasPermi('his:company:oneClickDisable')")
+    @Log(title = "一键禁用销售企业IPDA发送", businessType = BusinessType.UPDATE)
+    @PostMapping("/oneClickDisable")
+    public R oneClickDisable(@RequestBody CompanyParam param){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(loginUser == null){
+            return R.error("操作失败,操作用户不存在!");
+        }
+        if(param.getCompanyIds() == null || param.getCompanyIds().length == 0){
+            return R.error("操作失败,封禁信息不能为空!");
+        }
+        return companyService.oneClickDisable(param.getCompanyIds(),loginUser);
+    }
+
+    /***
+     * paid一键启用
+     * @paparam companyIds 销售公司ID
+     * @return R
+     * **/
+    @PreAuthorize("@ss.hasPermi('his:company:oneClickDisable')")
+    @Log(title = "一键启用用销售企业IPDA发送", businessType = BusinessType.UPDATE)
+    @PostMapping("/oneClickEnable")
+    public R oneClickEnable(@RequestBody CompanyParam param){
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if(loginUser == null){
+            return R.error("操作失败,操作用户不存在!");
+        }
+        if(param.getCompanyIds() == null || param.getCompanyIds().length == 0){
+            return R.error("操作失败,启用信息不能为空!");
+        }
+        return companyService.oneClickEnable(param.getCompanyIds(),loginUser);
+    }
+
 }

+ 14 - 0
fs-ipad-task/src/main/java/com/fs/app/service/IpadSendServer.java

@@ -9,7 +9,9 @@ import com.fs.common.utils.StringUtils;
 import com.fs.common.utils.date.DateUtil;
 import com.fs.common.utils.spring.SpringUtils;
 import com.fs.company.domain.CompanyMiniapp;
+import com.fs.company.mapper.CompanyMapper;
 import com.fs.company.service.ICompanyMiniappService;
+import com.fs.company.service.ICompanyService;
 import com.fs.course.domain.FsCoursePlaySourceConfig;
 import com.fs.course.domain.FsCourseWatchLog;
 import com.fs.course.mapper.FsCoursePlaySourceConfigMapper;
@@ -61,6 +63,11 @@ public class IpadSendServer {
     private final IFsCoursePlaySourceConfigService playSourceConfigService;
     private final FsUserMapper fsUserMapper;
     private static final List<String> PROJECT_NAMES = Arrays.asList("济南联志健康", "北京存在文化","宽益堂","医健宝");
+
+    private ICompanyService companyService;
+
+    private final String IPAD_DEACTIVATE = "ipadDeactivate:";
+
     private void sendMiniProgram(BaseVo vo, QwSopCourseFinishTempSetting.Setting content, Map<String, FsCoursePlaySourceConfig> miniMap, Long companyId) {
         // 发送参数原本的appid
         String appid = content.getMiniprogramAppid();
@@ -364,6 +371,13 @@ public class IpadSendServer {
     }
 
     public boolean isSendLogs(QwSopLogs qwSopLogs, QwSopCourseFinishTempSetting setting, QwUser qwUser) {
+        //验证销售公司状态
+        if(companyService.checkIpadDisable(qwUser.getCompanyId())){
+            log.info("销售公司ipad被禁用不发送:{}", qwUser.getQwUserId());
+            qwSopLogsService.updateQwSopLogsByWatchLogType(qwSopLogs.getId(), "销售公司ipad被禁用");
+            return false;
+        }
+
         if(qwSopLogs.getSendStatus() != 3){
             log.info("状态异常不发送:{}, LOGID: {}", qwUser.getQwUserName(), qwSopLogs.getId());
             return false;

+ 12 - 0
fs-qw-task/src/main/java/com/fs/app/controller/CommonController.java

@@ -25,6 +25,7 @@ import com.fs.course.service.*;
 import com.fs.course.vo.FsUserCourseVideoQVO;
 import com.fs.his.domain.FsUser;
 import com.fs.his.service.IFsInquiryOrderService;
+import com.fs.his.service.IFsUserWxService;
 import com.fs.his.utils.qrcode.QRCodeUtils;
 import com.fs.hisStore.config.MedicalMallConfig;
 import com.fs.qw.domain.QwCompany;
@@ -146,6 +147,9 @@ public class CommonController {
     @Autowired
     public RedisCache redisCache;
 
+    @Autowired
+    private IFsUserWxService userWxService;
+
     /**
      * 获取跳转微信小程序的链接地址
      */
@@ -408,4 +412,12 @@ public class CommonController {
         return R.ok();
     }
 
+    /**
+     * 生成半封微信用户信息
+     * **/
+    @GetMapping("/generateUserWXInfo")
+    public R generateUserWXInfo(){
+        return  userWxService.generateUserWXInfo();
+    }
+
 }

+ 6 - 0
fs-service/src/main/java/com/fs/company/domain/Company.java

@@ -146,4 +146,10 @@ public class Company extends BaseEntity
     @TableField(exist = false)
     private String queryAppName;
 
+    /**
+     * ipad是否一键停用0否1是
+     * **/
+    @TableField(exist = false)
+    private Integer ipadDeactivate;
+
 }

+ 19 - 0
fs-service/src/main/java/com/fs/company/mapper/CompanyMapper.java

@@ -205,4 +205,23 @@ public interface CompanyMapper
     List<OptionsVO> getCompanyListByCorpId(@Param("corpId") String corpId);
 
     List<Company> selectCompanyMoneyAllList();
+
+    /**
+     * @param companyIds 销售ID
+     * @return List<Company>
+     * **/
+    List<Company> selectCompantyInfoByCompanyIds(@Param("companyIds") List<Long> companyIds);
+
+    /**
+     * 批量禁用销售IPAD
+     * @param companyIds 销售ID
+     * **/
+    void batchUpadteCompanyIpadDeactivateByIds(@Param("ipadDeactivate") Integer ipadDeactivate,@Param("companyIds") List<Long> companyIds);
+
+    /**
+     * 获取销售公司校验信息
+     * @param companyId 企业ID
+     * @return  company
+     * **/
+    Company selectCheckCompanyById(@Param("companyId") Long companyId);
 }

+ 1 - 0
fs-service/src/main/java/com/fs/company/param/CompanyParam.java

@@ -15,4 +15,5 @@ public class CompanyParam
     private Integer status;
     private String phonenumber;
     private Long deptId;
+    private Long[] companyIds;
 }

+ 22 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyService.java

@@ -5,6 +5,7 @@ import java.time.LocalTime;
 import java.util.List;
 
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.model.LoginUser;
 import com.fs.company.domain.Company;
 import com.fs.company.domain.CompanyUser;
 import com.fs.company.param.CompanyParam;
@@ -170,4 +171,25 @@ public interface ICompanyService
     void subtractCompanyMoneyHourse(BigDecimal money, Long companyId, LocalTime start, LocalTime end);
 
     void syncCompanyBalance();
+
+    /**
+     * ipad一键封禁
+     * @param loginUser 用户信息
+     * @param companyIds 封禁企业ID
+     ***/
+    R oneClickDisable(Long[] companyIds, LoginUser loginUser);
+
+    /**
+     * ipad一键启用
+     * @param loginUser 用户信息
+     * @param companyIds 封禁企业ID
+     ***/
+    R oneClickEnable(Long[] companyIds, LoginUser loginUser);
+
+    /**
+     * ipad
+     * @param companyId
+     * @return boolean true:封禁 false:未封禁
+     * **/
+    boolean checkIpadDisable(Long companyId);
 }

+ 95 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyServiceImpl.java

@@ -3,6 +3,7 @@ package com.fs.company.service.impl;
 import java.math.BigDecimal;
 import java.time.LocalTime;
 import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.stream.Collectors;
 
 import cn.hutool.core.util.ObjectUtil;
@@ -10,7 +11,9 @@ import cn.hutool.json.JSONUtil;
 import com.alibaba.fastjson.JSON;
 import com.fs.common.constant.FsConstants;
 import com.fs.common.core.domain.R;
+import com.fs.common.core.domain.model.LoginUser;
 import com.fs.common.core.redis.RedisCache;
+import com.fs.common.exception.ServiceException;
 import com.fs.common.exception.base.BaseException;
 import com.fs.common.utils.DateUtils;
 import com.fs.common.utils.SecurityUtils;
@@ -117,11 +120,15 @@ public class CompanyServiceImpl implements ICompanyService
     @Autowired
     private TransactionTemplate transactionTemplate;
 
+    private static final ConcurrentHashMap<String, Object> KEY_LOCKS = new ConcurrentHashMap<>();
+
     @Override
     public List<OptionsVO> selectAllCompanyList(Long deptId) {
         return companyMapper.selectAllCompanyList(deptId);
     }
 
+    private final String IPAD_DEACTIVATE = "ipadDeactivate:";
+
     /**
      * 查询企业
      *
@@ -305,6 +312,12 @@ public class CompanyServiceImpl implements ICompanyService
     @Override
     public int updateCompany(Company company)
     {
+        Company companyInfo = selectCompanyById(company.getCompanyId());
+
+        if(companyInfo == null){
+            throw new ServiceException("操作失败,销售公司不存在!");
+        }
+
         company.setUpdateTime(DateUtils.getNowDate());
         if(company.isUpdateMiniApp()){
             bindMiniApp(company);
@@ -327,6 +340,15 @@ public class CompanyServiceImpl implements ICompanyService
                 deptConfig.setPadNumSub(subNum);
                 deptConfig.setUpdateBy(company.getCreateBy());
                 deptConfig.setUpdateTime(new Date());
+                //加入ipad停用逻辑
+                Long[] companyIds = {company.getCompanyId()};
+                String key = IPAD_DEACTIVATE + companyInfo.getCompanyId();
+                Integer cacheValue = redisCache.getCacheObject(key);
+                if(company.getStatus() != null && company.getStatus() == 1 && (cacheValue == null || cacheValue == 1)){//启用
+                    oneClickEnable(companyIds,null);
+                }else if(company.getStatus() != null && companyInfo.getIpadDeactivate() == 1 && (cacheValue == null || cacheValue == 0)){//停用
+                    oneClickDisable(companyIds,null);
+                }
                 sysDeptConfigLogService.addLog(deptConfig.getDeptId(), 0, 1, changeNum + "", first + "", subNum + "", deptConfig.getUpdateBy(), "修改公司PAD");
                 sysDeptConfigService.updateById(deptConfig);
             }
@@ -1420,4 +1442,77 @@ public class CompanyServiceImpl implements ICompanyService
                 }));
     }
 
+    @Override
+    public R oneClickDisable(Long[] companyIds, LoginUser loginUser) {
+        List<Long> companyIdList = Arrays.asList(companyIds);
+        List<Company> companyList = companyMapper.selectCompantyInfoByCompanyIds(companyIdList);
+        if(companyList.isEmpty()){
+            return R.error("操作失败,禁用企业不存在!");
+        }
+
+        //筛选未禁用的企业
+        List<Company> updateCompanyList = companyList.stream().filter(company -> company.getIpadDeactivate() == 0).collect(Collectors.toList());
+
+        //批量更新销售公司ipad状态
+        if(!updateCompanyList.isEmpty()){
+            companyMapper.batchUpadteCompanyIpadDeactivateByIds(1,companyIdList);
+        }
+
+        //存入redis禁用
+        companyIdList.forEach(c->{
+            redisCache.setCacheObject(IPAD_DEACTIVATE + c,1);
+        });
+        return R.ok("一键停用Ipad成功!");
+    }
+
+    @Override
+    public R oneClickEnable(Long[] companyIds, LoginUser loginUser) {
+        List<Long> companyIdList = Arrays.asList(companyIds);
+        List<Company> companyList = companyMapper.selectCompantyInfoByCompanyIds(companyIdList);
+        if(companyList.isEmpty()){
+            return R.error("操作失败,启用企业不存在!");
+        }
+
+        //筛选未禁用的企业
+        List<Company> updateCompanyList = companyList.stream().filter(company -> company.getIpadDeactivate() == 1).collect(Collectors.toList());
+
+        //批量更新销售公司ipad状态
+        if(!updateCompanyList.isEmpty()){
+            companyMapper.batchUpadteCompanyIpadDeactivateByIds(0,companyIdList);
+        }
+
+        //缓存redis启用
+        companyIdList.forEach(c->{
+            redisCache.setCacheObject(IPAD_DEACTIVATE + c,0);
+        });
+        return R.ok("一键停用Ipad成功!");
+    }
+
+    @Override
+    public boolean checkIpadDisable(Long companyId) {
+        String key= IPAD_DEACTIVATE + companyId;
+        Integer cacheValue = redisCache.getCacheObject(key);
+        //获取redis是否存在
+        if(cacheValue != null){
+            return cacheValue == 1;
+        }
+
+        Object keyLock = KEY_LOCKS.computeIfAbsent(key, k -> new Object());
+        synchronized(keyLock){
+            cacheValue = redisCache.getCacheObject(key);
+            if(cacheValue != null){
+                return cacheValue == 1;
+            }
+
+            //获取销售公司
+            Company company = companyMapper.selectCheckCompanyById(companyId);
+            boolean isDisabled = company == null || company.getIpadDeactivate() == 1;
+
+            // 设置缓存
+            int valueToCache = isDisabled ? 1 : 0;
+            redisCache.setCacheObject(key, valueToCache);
+            return isDisabled;
+        }
+    }
+
 }

+ 3 - 0
fs-service/src/main/java/com/fs/company/vo/CompanyVO.java

@@ -104,4 +104,7 @@ public class CompanyVO implements Serializable
     //备小程序
     @TableField(exist = false)
     private String backupAppName;
+
+    //ipda禁用0否1是
+    private Integer ipadDeactivate;
 }

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

@@ -488,8 +488,18 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         logger.info("【判断添加客服】:{}",param);
         //查询用户
         FsUser fsUser = fsUserMapper.selectFsUserByUserId(param.getUserId());
+        log.info("【用户----------------->】:{}",fsUser);
+        String dateString = "2026-01-29 19:00:00";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date targetDate = null;
+        try {
+            targetDate = sdf.parse(dateString);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+        
         //用户不存在唤起重新授权
-        if (fsUser==null){
+        if (fsUser==null || fsUser.getCreateTime().before(targetDate)){
             return R.error(401,"未授权");
         }
 
@@ -2157,7 +2167,16 @@ public class FsUserCourseVideoServiceImpl implements IFsUserCourseVideoService
         boolean oneCompanyCourse = config.isOneCompanyCourse();
         //查询用户
        FsUser fsUser = fsUserMapper.selectFsUserById(param.getUserId());
-        if (fsUser == null){
+        String dateString = "2026-01-29 19:00:00";
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date targetDate = null;
+        try {
+            targetDate = sdf.parse(dateString);
+        }catch (Exception e){
+            e.printStackTrace();
+        }
+
+        if (fsUser == null || fsUser.getCreateTime().before(targetDate)){
             return ResponseResult.fail(401,"当前用户信息不存在");
         }
         //公开课

+ 20 - 0
fs-service/src/main/java/com/fs/his/dto/FsUserWxGenerateDTO.java

@@ -0,0 +1,20 @@
+package com.fs.his.dto;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 生成信息类
+ * **/
+@Data
+public class FsUserWxGenerateDTO  implements Serializable {
+    //备份外部联系人ID
+    private Long id;
+    //备份外部联系人ID
+    private Long oldId;
+    //新外部联系人ID
+    private Long newId;
+    //小程序ID
+    private String appId;
+}

+ 14 - 0
fs-service/src/main/java/com/fs/his/mapper/FsUserWxMapper.java

@@ -2,6 +2,10 @@ package com.fs.his.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.fs.his.domain.FsUserWx;
+import com.fs.his.dto.FsUserWxGenerateDTO;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 public interface FsUserWxMapper extends BaseMapper<FsUserWx> {
 
@@ -10,4 +14,14 @@ public interface FsUserWxMapper extends BaseMapper<FsUserWx> {
      * @param wx    配置信息
      */
     void insertOrUpdateByUniqueKey(FsUserWx wx);
+
+    /**
+     * 获取生成信息
+     * **/
+    List<FsUserWxGenerateDTO> getGenerateInfo();
+
+    /**
+     * @param userWxList 插入数据
+     * **/
+    void batchInfo(@Param("userWxList") List<FsUserWx> userWxList);
 }

+ 3 - 0
fs-service/src/main/java/com/fs/his/service/IFsUserWxService.java

@@ -1,6 +1,7 @@
 package com.fs.his.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsUserWx;
 
 public interface IFsUserWxService extends IService<FsUserWx> {
@@ -12,4 +13,6 @@ public interface IFsUserWxService extends IService<FsUserWx> {
     void saveOrUpdateByUniqueKey(FsUserWx wx);
 
     FsUserWx selectByAppIdAndUserId(String appId, Long userId,Integer type);
+
+    R generateUserWXInfo();
 }

+ 44 - 0
fs-service/src/main/java/com/fs/his/service/impl/FsUserWxServiceImpl.java

@@ -2,15 +2,27 @@ package com.fs.his.service.impl;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fs.common.core.domain.R;
 import com.fs.his.domain.FsUserWx;
+import com.fs.his.dto.FsUserWxGenerateDTO;
 import com.fs.his.mapper.FsUserWxMapper;
 import com.fs.his.service.IFsUserWxService;
+import com.fs.qw.mapper.QwExternalContactMapper;
+import lombok.Data;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 @Service
 @Slf4j
 public class FsUserWxServiceImpl extends ServiceImpl<FsUserWxMapper, FsUserWx> implements IFsUserWxService {
+    @Autowired
+    private QwExternalContactMapper externalContactMapper;
 
     /**
      * 根据FsUserId和AppId唯一键保存或更新
@@ -32,4 +44,36 @@ public class FsUserWxServiceImpl extends ServiceImpl<FsUserWxMapper, FsUserWx> i
                         .last("LIMIT 1")
         );
     }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R generateUserWXInfo() {
+        //查询数据是否存在
+        List<FsUserWxGenerateDTO> generateInfos = baseMapper.getGenerateInfo();
+        if(!generateInfos.isEmpty()){
+            //进入生成逻辑
+            List<FsUserWx> userWxList = new ArrayList<>(generateInfos.size());
+            List<Long> updateIds = new ArrayList<>(generateInfos.size());
+            Date date= new Date();
+            for (FsUserWxGenerateDTO info: generateInfos){
+                FsUserWx userWx = new FsUserWx();
+                userWx.setAppId(info.getAppId());
+                userWx.setFsUserId(info.getNewId());
+                userWx.setUnionId("1");
+                userWx.setOpenId("通过代码生成");
+                userWxList.add(userWx);
+                userWx.setCreateTime(date);
+                updateIds.add(info.getOldId());//老数据ID更新
+            }
+
+            //批量新增wx数据
+            if(!userWxList.isEmpty()){
+                baseMapper.batchInfo(userWxList);
+            }
+
+            //批量更新备份表状态
+            externalContactMapper.updateQwExternalContactBfByUserId(updateIds);
+        }
+        return R.ok("操作成功!处理-》"+ ((generateInfos.isEmpty() || generateInfos == null)?"0":generateInfos.size()) +"条数据");
+    }
 }

+ 4 - 0
fs-service/src/main/java/com/fs/hisStore/domain/FsStorePreparedPriceChange.java

@@ -42,6 +42,10 @@ public class FsStorePreparedPriceChange extends BaseEntity{
     @Excel(name = "商品合计金额")
     private BigDecimal totalAmount;
 
+    /** 销售公司ID */
+    @Excel(name = "销售公司ID")
+    private Long companyId;
+
     /** 销售ID */
     @Excel(name = "销售ID")
     private Long companyUserId;

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

@@ -3,11 +3,13 @@ package com.fs.hisStore.param;
 import lombok.Data;
 
 import java.io.Serializable;
+import java.util.List;
 
 @Data
 public class FsStoreCartCountParam  implements Serializable
 {
     Long userId;
     Long productId;
+    private String productIds;
 
 }

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

@@ -212,4 +212,10 @@ public interface IFsStoreProductScrmService
      * 普通商品查询
      * **/
     List<FsStoreProductListQueryVO> selectFsStoreProductGoodListList();
+
+    /**
+     * 校验处方药
+     * @param productIds 商品IDs
+     * **/
+    R checkPrescriptionDrug(String productIds);
 }

+ 26 - 19
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreOrderScrmServiceImpl.java

@@ -2590,7 +2590,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
     @Override
     public R createSalesOrder(CompanyUser companyUser, String cateIds, Integer orderType, Integer orderMedium) {
-        List<FsStoreCartScrmQueryVO> carts = cartMapper.selectFsStoreCartMultiStoreListByIds(cateIds,null);
+        List<FsStoreCartQueryVO> carts = cartMapper.selectFsStoreCartListByIds(cateIds);
         String uuid = IdUtil.randomUUID();
         redisCache.setCacheObject("createOrderKey:" + uuid, companyUser.getCompanyId() + "-" + companyUser.getUserId(), 24, TimeUnit.HOURS);
         redisCache.setCacheObject("orderCarts:" + uuid, carts, 24, TimeUnit.HOURS);
@@ -2604,7 +2604,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
         //计算总价
         BigDecimal totalMoney = BigDecimal.ZERO;
-        for (FsStoreCartScrmQueryVO vo : carts) {
+        for (FsStoreCartQueryVO vo : carts) {
             totalMoney = totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
         }
         redisCache.setCacheObject("orderKey:" + uuid, carts.stream().map(c->c.getId().toString()).collect(Collectors.joining(",")) , 24, TimeUnit.HOURS);//处理订单过期问题
@@ -2684,12 +2684,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
     @Transactional
     public R addUserCartMulti(long userId, String createOrderKey) {
         String key = redisCache.getCacheObject("createOrderKey:" + createOrderKey);
-        List<FsStoreCartScrmQueryVO> cartsList = redisCache.getCacheObject("orderCarts:" + createOrderKey);
+        List<FsStoreCartQueryVO> cartsList = redisCache.getCacheObject("orderCarts:" + createOrderKey);
         if (StringUtils.isEmpty(key)) {
             throw new CustomException("订单已过期", 501);
         }
         List<Long> ids = new ArrayList<>();
-        for (FsStoreCartScrmQueryVO vo : cartsList) {
+        for (FsStoreCartQueryVO vo : cartsList) {
             FsStoreCartScrm storeCart = FsStoreCartScrm.builder()
                     .cartNum(vo.getCartNum())
                     .productAttrValueId(vo.getProductAttrValueId())
@@ -2709,15 +2709,15 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         List<FsStoreCartGroupStoreScrmVO> carts = cartsList.stream()
                 .filter(vo -> vo.getStoreId() != null)
                 .collect(Collectors.groupingBy(
-                        FsStoreCartScrmQueryVO::getStoreId,
+                        FsStoreCartQueryVO::getStoreId,
                         LinkedHashMap::new,
                         Collectors.toList()
                 ))
                 .entrySet().stream()
                 .map(entry -> {
                     FsStoreCartGroupStoreScrmVO group = new FsStoreCartGroupStoreScrmVO();
-                    FsStoreCartScrmQueryVO firstItem = entry.getValue().get(0);
-                    group.setStoreId(firstItem.getStoreId());
+                    FsStoreCartQueryVO firstItem = entry.getValue().get(0);
+                    group.setStoreId(firstItem.getStoreId().toString());
                     group.setStoreName(firstItem.getStoreName());
                     group.setCartQueryList(entry.getValue());
                     return group;
@@ -2734,6 +2734,12 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
 
     @Override
     public R updateSalseOrderMoney(String createOrderKey, BigDecimal money, BigDecimal payAmount, BigDecimal totalAmount, Integer payType, Long userId) {
+        //查询销售是否存在
+        CompanyUser companyUser = companyUserService.selectCompanyUserById(userId);
+        if (companyUser == null) {
+            throw new CustomException("用户不存在", 501);
+        }
+
         //货到付款自定义金额
         if (payAmount == null) {
             String configJson = configService.selectConfigByKey("store.config");
@@ -2755,9 +2761,9 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         if (StringUtils.isEmpty(key)) {
             throw new CustomException("订单已过期", 501);
         }
-        List<FsStoreCartScrmQueryVO> carts = redisCache.getCacheObject("orderCarts:" + createOrderKey);
+        List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + createOrderKey);
         BigDecimal totalMoney = BigDecimal.ZERO;
-        for (FsStoreCartScrmQueryVO vo : carts) {
+        for (FsStoreCartQueryVO vo : carts) {
             totalMoney = totalMoney.add(vo.getPrice().multiply(new BigDecimal(vo.getCartNum().toString())));
         }
         if (money.compareTo(totalMoney) == 1) {
@@ -2781,6 +2787,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             preparedPriceChange.setPayType(payType);//支付类型
             preparedPriceChange.setTotalAmount(totalAmount);//合计金额
             preparedPriceChange.setPayAmount(payAmount);//物流改价金额
+            preparedPriceChange.setCompanyId(companyUser.getCompanyId());//公司ID
             preparedPriceChange.setCompanyUserId(userId);//销售ID
             preparedPriceChange.setCreateBy(userId.toString());//创建人
             preparedPriceChange.setCreateOrderKey(createOrderKey);//唯一key
@@ -5087,13 +5094,13 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         String storeId = null;
         if (cartIds != null) {
             //获取购物车列表
-            List<FsStoreCartScrmQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
+            List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
             //获取地址
             FsUserAddressScrm address = userAddressMapper.selectFsUserAddressById(param.getAddressId());
             //检测库存
             //如果是美乳产品,发武汉仓库
             Integer meiruCount = 0;
-            for (FsStoreCartScrmQueryVO cart : carts) {
+            for (FsStoreCartQueryVO cart : carts) {
                 cartService.checkProductStocks(cart.getProductId(), cart.getProductAttrValueId(), cart.getCartNum());
                 totalNum += cart.getCartNum();
                 integral = NumberUtil.add(integral,
@@ -5101,8 +5108,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 if (cart.getCateId() != null && cart.getCateId().equals(176L)) {
                     meiruCount++;
                 }
-                if (StringUtils.isNotEmpty(cart.getStoreId())) {
-                    storeId = cart.getStoreId();
+                if (cart.getStoreId() != null) {
+                    storeId = String.valueOf(cart.getStoreId());
                 }
             }
             //生成分布式唯一值
@@ -5178,7 +5185,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
             storeOrder.setGainIntegral(BigDecimal.ZERO);
             storeOrder.setMark(param.getMark());
             //todo 获取成本价
-            BigDecimal costPrice = this.getOrderSumPriceMultiStore(carts, "costPrice");
+            BigDecimal costPrice = this.getOrderSumPrice(carts, "costPrice");
             storeOrder.setCost(costPrice);
             storeOrder.setIsChannel(1);
             storeOrder.setShippingType(1);
@@ -5220,11 +5227,11 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
                 this.decIntegral(userId, dto.getUsedIntegral(), dto.getDeductionPrice().doubleValue(), storeOrder.getId().toString());
             }
             //减库存加销量
-            this.deStockIncSales(carts);
+            this.deStockIncSale(carts);
             //保存OrderItem
             List<FsStoreOrderItemScrm> listOrderItem = new ArrayList<>();
             //保存购物车商品信息
-            for (FsStoreCartScrmQueryVO vo : carts) {
+            for (FsStoreCartQueryVO vo : carts) {
                 FsStoreCartDTO fsStoreCartDTO = new FsStoreCartDTO();
                 fsStoreCartDTO.setProductId(vo.getProductId());
                 fsStoreCartDTO.setPrice(vo.getPrice());
@@ -5653,8 +5660,8 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         if (ObjectUtil.isNull(cartIds)) {
             throw new CustomException("订单已过期", 501);
         }
-        List<FsStoreCartScrmQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
-        BigDecimal payPrice = getOrderSumPriceMultiStore(carts, "truePrice");
+        List<FsStoreCartQueryVO> carts = redisCache.getCacheObject("orderCarts:" + param.getOrderKey());
+        BigDecimal payPrice = getOrderSumPrice(carts, "truePrice");
         if (StringUtils.isNotEmpty(param.getCreateOrderKey())) {
 //            BigDecimal money = redisCache.getCacheObject("createOrderMoney:" + param.getCreateOrderKey());
 //            if (money != null) {
@@ -5684,7 +5691,7 @@ public class FsStoreOrderScrmServiceImpl implements IFsStoreOrderScrmService {
         if (param.getAddressId() != null) {
             userAddress = userAddressMapper.selectFsUserAddressById(param.getAddressId());
         }
-        FsStoreOrderPriceDTO priceGroup = this.getOrderPriceGroupMultiStore(carts, userAddress);
+        FsStoreOrderPriceDTO priceGroup = this.getOrderPriceGroup(carts, userAddress);
         BigDecimal payPostage = priceGroup.getStorePostage();
         payPrice = NumberUtil.add(payPrice, payPostage);
         FsUserScrm user = userService.selectFsUserById(uid);

+ 7 - 1
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStorePreparedPriceChangeServiceImpl.java

@@ -204,13 +204,19 @@ public class FsStorePreparedPriceChangeServiceImpl extends ServiceImpl<FsStorePr
             redisCache.setCacheObject(orderCarsKey, fsStorePreparedPriceChange.getCartIds(), 300, TimeUnit.SECONDS);
         }
 
+        //销售信息
+        String createOrderKey = "createOrderKey:" + fsStorePreparedPriceChange.getCreateOrderKey();
+        if (!redisCache.hasKey(createOrderKey)) {
+            redisCache.setCacheObject(createOrderKey,fsStorePreparedPriceChange.getCompanyId() + "-" +fsStorePreparedPriceChange.getCompanyUserId(), 300, TimeUnit.SECONDS);
+        }
+
         //购物车信息
         String orderCartsKey = "orderCarts:" + fsStorePreparedPriceChange.getCreateOrderKey();
 //        if (!redisCache.hasKey(orderCartsKey)) {
 //            List<FsStoreCartScrmQueryVO> carts = cartMapper.selectFsStoreCartMultiStoreListByIds(fsStorePreparedPriceChange.getCartIds(),null);
 //            redisCache.setCacheObject(orderCartsKey, carts, 300, TimeUnit.SECONDS);
 //        }
-        List<FsStoreCartScrmQueryVO> carts = cartMapper.selectFsStoreCartMultiStoreListByIds(fsStorePreparedPriceChange.getCartIds(),null);
+        List<FsStoreCartQueryVO> carts = cartMapper.selectFsStoreCartListByIds(fsStorePreparedPriceChange.getCartIds());
         redisCache.setCacheObject(orderCartsKey, carts, 300, TimeUnit.SECONDS);
 
         return R.ok();

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

@@ -1588,6 +1588,14 @@ private void addProductAttr(Long productId, List<ProductArrtDTO> items, List<FsS
         return fsStoreProductMapper.selectFsStoreProductGoodListList();
     }
 
+    @Override
+    public R checkPrescriptionDrug(String productIds) {
+        List<FsStoreProductActivityListVO> products = fsStoreProductMapper.selectFsStoreProductByIds(productIds);
+        boolean isPrescriptionDrug = products.stream()
+                .anyMatch(item -> 2 == item.getProductType());
+        return R.ok().put("data", isPrescriptionDrug);
+    }
+
     @Override
     public List<Map<String, String>> getStoreProductColumns() {
         List<Map<String, String> > list = fsStoreProductMapper.getStoreProductColumns();

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

@@ -11,5 +11,5 @@ public class FsStoreCartGroupStoreScrmVO {
     private String storeId;
     private String storeName;
     private List<FsStoreCartScrmVO> list;
-    private List<FsStoreCartScrmQueryVO> cartQueryList;
+    private List<FsStoreCartQueryVO> cartQueryList;
 }

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

@@ -74,4 +74,7 @@ import java.math.BigDecimal;
     //通用名称
     private String commonName;
 
+    private String erpCode;
+
+    private String erpSkuName;
 }

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

@@ -80,5 +80,8 @@ public class FsStoreProductActivityListVO implements Serializable
      */
     private String productStructure;
 
-
+    /**
+     * 产品类型商品类型:1非处方 2处方 3食品 4器械
+     */
+    private Integer productType;
 }

+ 1 - 1
fs-service/src/main/java/com/fs/hospital580/vo/CacheOpenInformationVo.java

@@ -31,5 +31,5 @@ public class CacheOpenInformationVo implements Serializable {
     private Long companyUserId;
 
     //订单KEY
-    private String orderKey;
+    private String dataKey;
 }

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

@@ -535,4 +535,9 @@ public interface QwExternalContactMapper extends BaseMapper<QwExternalContact> {
     QwExternalContact selectQwUserListVOByQwUserIdAndCorpIdAndExternalUserId(ExternalContactParam externalContactParam);
 
     List<QwExternalContact> getGroupChatUserByChatIdAndUserName(@Param("userId")String userId,@Param("userName")String userName,@Param("corpId") String corpId,@Param("chatId") String chatId);
+
+    /**
+     * 批量更备份表字段
+     * **/
+    void updateQwExternalContactBfByUserId(@Param("userIds")List<Long> userIds);
 }

+ 25 - 0
fs-service/src/main/resources/mapper/company/CompanyMapper.xml

@@ -42,6 +42,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         <result property="groupName"    column="group_name"    />
         <result property="maxPadNum"    column="max_pad_num"    />
         <result property="deptId"   column="dept_id" />
+        <result property="ipadDeactivate"   column="ipad_deactivate" />
     </resultMap>
 
     <sql id="selectCompanyVo">
@@ -122,6 +123,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="groupName != null">group_name,</if>
             <if test="maxPadNum != null">max_pad_num,</if>
             <if test="deptId != null">dept_id,</if>
+            <if test="ipadDeactivate != null">ipad_deactivate,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="companyName != null">#{companyName},</if>
@@ -158,6 +160,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="groupName != null">#{groupName},</if>
             <if test="maxPadNum != null">#{maxPadNum},</if>
             <if test="deptId != null">#{deptId},</if>
+            <if test="ipadDeactivate != null">#{ipadDeactivate},</if>
          </trim>
     </insert>
 
@@ -200,6 +203,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="groupName != null">group_name = #{groupName},</if>
             <if test="maxPadNum != null">max_pad_num = #{maxPadNum},</if>
             <if test="deptId != null">dept_id = #{deptId},</if>
+            <if test="ipadDeactivate != null">ipad_deactivate = #{ipadDeactivate},</if>
         </trim>
         where company_id = #{companyId}
     </update>
@@ -316,6 +320,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
                 AND sc2.`name` LIKE CONCAT('%', #{queryAppName}, '%')
                 )
             </if>
+        <if test="ipadDeactivate != null">
+           AND c.ipad_deactivate = #{ipadDeactivate}
+        </if>
             GROUP BY c.company_id
             ORDER BY c.company_id DESC
     </select>
@@ -337,4 +344,22 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     <select id="selectCompanyMoneyAllList" resultType="com.fs.company.domain.Company">
         select company_id,company_name,money from company where is_del= 0
     </select>
+
+    <select id="selectCompantyInfoByCompanyIds" resultType="com.fs.company.domain.Company">
+        select company_id,company_name,status,ipad_deactivate from company where is_del= 0 and company_id in
+                                                                           <foreach collection="companyIds" index="inxex" item="companyId" open="(" separator="," close=")">
+                                                                               #{companyId}
+                                                                           </foreach>
+    </select>
+
+    <update id="batchUpadteCompanyIpadDeactivateByIds">
+        update company set ipad_deactivate = #{ipadDeactivate} where company_id in
+        <foreach item="companyId" collection="companyIds" open="(" separator="," close=")">
+            #{companyId}
+        </foreach>
+    </update>
+
+    <select id="selectCheckCompanyById" resultType="com.fs.company.domain.Company">
+        select company_id,ipad_deactivate from company where is_del= 0 and company_id = #{companyId}
+    </select>
 </mapper>

+ 28 - 0
fs-service/src/main/resources/mapper/his/FsUserWxMapper.xml

@@ -16,4 +16,32 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             open_id     = VALUES(open_id),
             update_time = VALUES(update_time)
     </insert>
+
+    <select id="getGenerateInfo"  resultType="com.fs.his.dto.FsUserWxGenerateDTO">
+        SELECT DISTINCT
+            cb.fs_user_id AS oldId,
+            ex.fs_user_id AS newId,
+            uw.app_id
+        FROM
+            fs_user_wx uw
+                INNER JOIN qw_external_contact_bf cb ON uw.fs_user_id = cb.fs_user_id
+                AND cb.is_generate = 0
+                INNER JOIN qw_external_contact ex ON ex.id = cb.id
+        WHERE
+            uw.app_id = 'wx74f555c779a127f9'
+          AND ex.fs_user_id IS NOT NULL
+          AND NOT EXISTS ( SELECT 1 FROM fs_user_wx wx2 WHERE wx2.fs_user_id = ex.fs_user_id AND wx2.app_id = 'wx74f555c779a127f9' )
+            LIMIT 3000
+    </select>
+
+    <insert id="batchInfo">
+        insert into fs_user_wx
+        (fs_user_id, app_id, union_id, open_id, create_time)
+        values
+        <foreach collection="userWxList" item="item" separator=",">
+            (#{item.fsUserId}, #{item.appId}, #{item.unionId}, #{item.openId}, #{item.createTime})
+        </foreach>
+        ON DUPLICATE KEY UPDATE
+        update_time = NOW()
+    </insert>
 </mapper>

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

@@ -17,6 +17,7 @@
         <result property="updateBy" column="update_by"/>
         <result property="auditStatus" column="audit_status"/>
         <result property="totalAmount" column="total_amount"/>
+        <result property="companyId" column="company_id"/>
     </resultMap>
 
     <sql id="selectFsStorePreparedPriceChangeVo">
@@ -24,6 +25,7 @@
                cart_ids,
                money,
                pay_amount,
+               company_id,
                company_user_id,
                create_order_key,
                create_time,
@@ -72,6 +74,7 @@
             <if test="payType != null">pay_type,</if>
             <if test="auditRemark != null">audit_remark ,</if>
             <if test="totalAmount != null">total_amount ,</if>
+            <if test="companyId != null">company_id ,</if>
         </trim>
         <trim prefix="values (" suffix=")" suffixOverrides=",">
             <if test="cartIds != null and cartIds != ''">#{cartIds},</if>
@@ -87,6 +90,7 @@
             <if test="payType != null">#{payType},</if>
             <if test="auditRemark != null">#{auditRemark} ,</if>
             <if test="totalAmount != null">#{totalAmount} ,</if>
+            <if test="companyId != null">#{companyId} ,</if>
         </trim>
     </insert>
 
@@ -106,6 +110,7 @@
             <if test="payType != null">pay_type = #{payType},</if>
             <if test="auditRemark != null">audit_remark = #{auditRemark} ,</if>
             <if test="totalAmount != null">total_amount = #{totalAmount} ,</if>
+            <if test="companyId != null">company_id = #{companyId} ,</if>
         </trim>
         where id = #{id}
     </update>
@@ -136,7 +141,11 @@
         SELECT
         pc.*,
         GROUP_CONCAT(
-        ps.product_name
+        CASE
+        WHEN ps.product_name = '-' OR ps.product_name IS NULL OR ps.product_name = ''
+        THEN ps.common_name
+        ELSE ps.product_name
+        END
         SEPARATOR '|'
         ) AS matched_products,
         cu.nick_name

+ 13 - 0
fs-service/src/main/resources/mapper/hisStore/FsStoreScrmMapper.xml

@@ -447,6 +447,19 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             <if test="reportUrl !=null ">report_url = #{reportUrl}, </if>
             <if test="filingUrl !=null ">filing_url = #{filingUrl}, </if>
             <if test="permStatus !=null ">perm_status = #{permStatus}, </if>
+            <if test="medicalDevice2 !=null and medicalDevice2 != ''">medical_device2 = #{medicalDevice2} ,</if>
+            <if test="medicalDevice2BusinessScope !=null and medicalDevice2BusinessScope != ''">medical_device2_business_scope = #{medicalDevice2BusinessScope} ,</if>
+            <if test="medicalDevice2Code !=null and medicalDevice2Code != ''">medical_device2_code = #{medicalDevice2Code} ,</if>
+            <if test="medicalDevice2ExpiryStart !=null">medical_device2_expiry_start = #{medicalDevice2ExpiryStart} ,</if>
+            <if test="medicalDevice2ExpiryEnd !=null"> medical_device2_expiry_end = #{medicalDevice2ExpiryEnd} ,</if>
+            <if test="medicalDevice3 !=null and medicalDevice3 != ''"> medical_device3 = #{medicalDevice3} ,</if>
+            <if test="medicalDevice3ExpiryStart !=null">medical_device3_expiry_start = #{medicalDevice3ExpiryStart} ,</if>
+            <if test="medicalDevice3ExpiryEnd !=null">medical_device3_expiry_end = #{medicalDevice3ExpiryEnd} , ,</if>
+            <if test="medicalDevice3Code !=null and medicalDevice3Code != ''">medical_device3_code = #{medicalDevice3Code} ,</if>
+            <if test="medicalDevice3BusinessScope !=null and medicalDevice3BusinessScope != ''">medical_device3_business_scope = #{medicalDevice3BusinessScope},</if>
+            <if test="foodLicense !=null and foodLicense != ''">food_license = #{foodLicense} ,</if>
+            <if test="foodLicenseExpiryStart !=null">food_license_expiry_start = #{foodLicenseExpiryStart} ,</if>
+            <if test="foodLicenseExpiryEnd !=null">food_license_expiry_end = #{foodLicenseExpiryEnd} ,</if>
         </trim>
         where store_id = #{storeId}
     </update>

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

@@ -794,4 +794,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         and t1.corp_id = #{corpId}
         and t1.status = 0
     </select>
+
+    <update id="updateQwExternalContactBfByUserId">
+        UPDATE qw_external_contact_bf
+        SET is_generate = 1
+        WHERE fs_user_id IN
+        <foreach collection="userIds" item="userId" open="(" separator="," close=")">
+            #{userId}
+        </foreach>
+    </update>
 </mapper>

+ 21 - 20
fs-user-app/src/main/java/com/fs/app/controller/Hospital580Controller.java

@@ -14,6 +14,7 @@ import com.fs.hospital580.vo.req.SaveOrderScrmReq;
 import com.fs.hospital580.vo.res.DiseaseQueryRes;
 import com.fs.hospital580.vo.res.PrescriptionDetailRes;
 import com.fs.hospital580.vo.res.PrescriptionListRes;
+import com.fs.utils.TwelveDigitSnowflake;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -69,42 +70,42 @@ public class Hospital580Controller extends AppBaseController {
     @Login
     @PostMapping("/cacheSquareInformation")
     public R cacheOpenInformation(@RequestBody CacheOpenInformationVo vo){
-        if(StringUtils.isNull(vo.getOrderKey())){
+        if(StringUtils.isNull(vo.getDataKey())){
             return R.error("操作失败,关键信息不能为空!");
         }
-
+        int randomNum = (int)(Math.random() * 10);//随机
+        TwelveDigitSnowflake snowflake = new TwelveDigitSnowflake(randomNum);
+        String key = String.valueOf(snowflake.nextId());
         //缓存开放信息-6小时
-        String redisKey = buildCacheKey(vo.getOrderKey(), vo.getUserId(), vo.getCompanyUserId());
+        String redisKey = buildCacheKey(key,"square",vo.getCompanyUserId());
         redisCache.setCacheObject(redisKey , vo , 6, TimeUnit.HOURS);
-        return R.ok();
+        return R.ok().put("dataKey",key);
     }
 
     @ApiOperation(value = "销售制单分享-获取缓存对应订单客户开方信息")
     @Login
-    @GetMapping("/selectSquareInformation")
-    public R selectOpenInformation(
-            @RequestParam(value = "orderKey", required = false) String orderKey,
-            @RequestParam(value = "userId", required = false) Long userId,
-            @RequestParam(value = "companyUserId", required = false) Long companyUserId) {
-        log.debug("获取缓存开放信息: orderKey={}, userId={}, companyUserId={}",
-                orderKey, userId, companyUserId);
-        String redisKey = buildCacheKey(orderKey, userId, companyUserId);
-        CacheOpenInformationVo vo = redisCache.getCacheObject(redisKey);
-        if (vo == null) {
+    @PostMapping("/selectSquareInformation")
+    public R selectOpenInformation(@RequestBody CacheOpenInformationVo vo) {
+        log.debug("获取缓存开放信息: orderKey={}, companyUserId={}",
+                vo.getDataKey(), vo.getCompanyUserId());
+
+        String redisKey = buildCacheKey(vo.getDataKey(),"square", vo.getCompanyUserId());
+        CacheOpenInformationVo informationVo = redisCache.getCacheObject(redisKey);
+        if (informationVo == null) {
             log.warn("缓存未找到: key={}", redisKey);
             return R.error("未找到对应的开放信息");
         }
-        return R.ok(vo);
+        return R.ok().put("data",informationVo);
     }
 
     /**
      * 构建缓存key
      */
-    private String buildCacheKey(String orderKey, Long userId, Long companyUserId) {
+    private String buildCacheKey(String dataKey, String type, Long companyUserId) {
         StringBuilder keyBuilder = new StringBuilder(CACHE_KEY_PREFIX);
         keyBuilder.append(":");
-        if (userId != null) {
-            keyBuilder.append(userId);
+        if (type != null) {
+            keyBuilder.append(type);
         } else {
             keyBuilder.append("-");
         }
@@ -115,8 +116,8 @@ public class Hospital580Controller extends AppBaseController {
             keyBuilder.append("-");
         }
         keyBuilder.append(":");
-        if (StringUtils.isNotBlank(orderKey)) {
-            keyBuilder.append(orderKey.trim());
+        if (StringUtils.isNotBlank(dataKey)) {
+            keyBuilder.append(dataKey.trim());
         } else {
             keyBuilder.append("-");
         }

+ 16 - 19
fs-user-app/src/main/java/com/fs/app/controller/UserAddressController.java

@@ -16,6 +16,7 @@ import com.fs.his.service.IFsCityService;
 import com.fs.his.service.IFsExpressService;
 import com.fs.his.service.IFsUserAddressService;
 import com.fs.his.service.IFsUserIntegralLogsService;
+import com.fs.utils.TwelveDigitSnowflake;
 import com.google.common.collect.Lists;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
@@ -165,35 +166,31 @@ public class UserAddressController extends  AppBaseController {
             return R.error("操作失败,地址信息不能为空!");
         }
 
-        if(address.getOrderKey() != null){
-            return R.error("操作失败,订单唯一值不为空!");
-        }
-
         //获取地址信息
         FsUserAddress userAddress=addressService.selectFsUserAddressByAddressId(address.getAddressId());
         if(userAddress == null){
            return R.error("操作失败,用户地址不存在!");
         }
-
+        int randomNum = (int)(Math.random() * 10);//随机
+        TwelveDigitSnowflake snowflake = new TwelveDigitSnowflake(randomNum);
+        String key = String.valueOf(snowflake.nextId());
         //缓存地址信息-6小时
-        String redisKey = buildCacheKey(address.getOrderKey(), address.getUserId(), address.getCompanyUserId());
-        redisCache.setCacheObject(redisKey, userAddress , 6, TimeUnit.HOURS);
+        String redisKey = buildCacheKey(key ,"address", address.getCompanyUserId());
+        redisCache.setCacheObject(redisKey, userAddress , 3, TimeUnit.HOURS);
         //后续根据实际需求是否写入到对应用户信息中去
-        return R.ok();
+        return R.ok().put("dataKey", key);
     }
 
     @Login
     @ApiOperation("制单分享-获取缓存地址信息")
     @PostMapping("/selectCacheAddress")
-    public R selectCacheAddress(@RequestParam(value = "orderKey", required = false) String orderKey,
-                                @RequestParam(value = "userId", required = false) Long userId,
-                                @RequestParam(value = "companyUserId", required = false) Long companyUserId){
-        if(StringUtils.isNull(orderKey)){
+    public R selectCacheAddress(@RequestBody FsUserAddressAddEditParam address){
+        if(StringUtils.isNull(address.getDataKey())){
             return R.error("操作失败,关键信息不能为空!");
         }
         log.debug("获取缓存开放信息: orderKey={}, userId={}, companyUserId={}",
-                orderKey, userId, companyUserId);
-        String redisKey = buildCacheKey(orderKey, userId, companyUserId);
+                address.getDataKey(), address.getCompanyUserId());
+        String redisKey = buildCacheKey(address.getDataKey(), "address", address.getCompanyUserId());
         FsUserAddress userAddress= redisCache.getCacheObject(redisKey);
         if(userAddress == null){
             return R.error("操作失败,用户地址不存在!");
@@ -204,11 +201,11 @@ public class UserAddressController extends  AppBaseController {
     /**
      * 构建缓存key
      */
-    private String buildCacheKey(String orderKey, Long userId, Long companyUserId) {
+    private String buildCacheKey(String dataKey, String type, Long companyUserId) {
         StringBuilder keyBuilder = new StringBuilder(CACHE_KEY_PREFIX);
         keyBuilder.append(":");
-        if (userId != null) {
-            keyBuilder.append(userId);
+        if (type != null) {
+            keyBuilder.append(type);
         } else {
             keyBuilder.append("-");
         }
@@ -219,8 +216,8 @@ public class UserAddressController extends  AppBaseController {
             keyBuilder.append("-");
         }
         keyBuilder.append(":");
-        if (StringUtils.isNotBlank(orderKey)) {
-            keyBuilder.append(orderKey.trim());
+        if (StringUtils.isNotBlank(dataKey)) {
+            keyBuilder.append(dataKey.trim());
         } else {
             keyBuilder.append("-");
         }

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

@@ -66,6 +66,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.concurrent.TimeUnit;
 
 import static com.fs.common.utils.SecurityUtils.getUserId;
 import static com.fs.his.utils.PhoneUtil.decryptPhoneMk;

+ 12 - 0
fs-user-app/src/main/java/com/fs/app/controller/store/ProductScrmController.java

@@ -377,6 +377,18 @@ public class ProductScrmController extends AppBaseController {
         return productService.instructionsViewable(param);
     }
 
+    /**
+     * 校验处方药
+     *
+     * **/
+    @PostMapping("/checkPrescriptionDrug")
+    public R checkPrescriptionDrug(@RequestBody FsStoreCartCountParam param){
+        if(StringUtils.isNull(param.getProductIds())){
+            return R.error("操作失败,数据不能为空!");
+        }
+        return productService.checkPrescriptionDrug(param.getProductIds());
+    }
+
     //分类数据拆分
     public List<FsStoreProductCategoryScrm> dataSplit(Integer isDrug,List<FsStoreProductCategoryScrm> list){
         if(isDrug != null && isDrug == 1){

+ 5 - 5
fs-user-app/src/main/java/com/fs/app/interceptor/AuthorizationInterceptor.java

@@ -55,11 +55,11 @@ public class AuthorizationInterceptor extends HandlerInterceptorAdapter {
         if(claims == null || jwtUtils.isTokenExpired(claims.getExpiration())){
             throw new FSException(jwtUtils.getHeader() + "失效,请重新登录", HttpStatus.UNAUTHORIZED.value());
         }
-        //查询用户的TOKEN是否和REDIS中的一样
-        String redisToken=redisCache.getCacheObject("token:"+ Long.parseLong(claims.getSubject()));
-        if(redisToken==null||!redisToken.equals(token)){
-            throw new FSException(jwtUtils.getHeader() + "失效,请重新登录", HttpStatus.UNAUTHORIZED.value());
-        }
+//        //查询用户的TOKEN是否和REDIS中的一样
+//        String redisToken=redisCache.getCacheObject("token:"+ Long.parseLong(claims.getSubject()));
+//        if(redisToken==null||!redisToken.equals(token)){
+//            throw new FSException(jwtUtils.getHeader() + "失效,请重新登录", HttpStatus.UNAUTHORIZED.value());
+//        }
         //设置userId到request里,后续根据userId,获取用户信息
         request.setAttribute(USER_KEY, Long.parseLong(claims.getSubject()));
 

+ 1 - 1
fs-user-app/src/main/java/com/fs/app/param/FsUserAddressAddEditParam.java

@@ -65,7 +65,7 @@ public class FsUserAddressAddEditParam implements Serializable {
     private Long companyUserId;
 
     //订单KEY
-    private String orderKey;
+    private String dataKey;
 
 
 }