瀏覽代碼

医健宝代码提交。APP总后台相关优化

yjwang 1 天之前
父節點
當前提交
cd202442d1
共有 26 個文件被更改,包括 345 次插入51 次删除
  1. 1 1
      fs-admin/src/main/java/com/fs/FSApplication.java
  2. 15 0
      fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficController.java
  3. 8 0
      fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java
  4. 11 1
      fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreScrmController.java
  5. 8 0
      fs-admin/src/main/java/com/fs/qw/controller/QwCompanyController.java
  6. 2 2
      fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java
  7. 44 0
      fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordDeductParam.java
  8. 11 0
      fs-service/src/main/java/com/fs/company/service/ICompanyTrafficRecordService.java
  9. 134 0
      fs-service/src/main/java/com/fs/company/service/impl/CompanyTrafficRecordServiceImpl.java
  10. 4 2
      fs-service/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java
  11. 11 3
      fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java
  12. 3 3
      fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java
  13. 1 1
      fs-service/src/main/java/com/fs/his/service/IFsUserService.java
  14. 11 7
      fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java
  15. 2 2
      fs-service/src/main/java/com/fs/his/service/impl/FsUserServiceImpl.java
  16. 14 2
      fs-service/src/main/java/com/fs/hisStore/mapper/FsDataScrmMapper.java
  17. 2 0
      fs-service/src/main/java/com/fs/hisStore/service/IFsStoreScrmService.java
  18. 17 2
      fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreScrmServiceImpl.java
  19. 8 0
      fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java
  20. 8 8
      fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java
  21. 1 0
      fs-service/src/main/java/com/fs/system/mapper/SysDeptConfigMapper.java
  22. 4 4
      fs-service/src/main/resources/application-config-druid-yjb.yml
  23. 1 1
      fs-service/src/main/resources/mapper/his/FsUserMapper.xml
  24. 6 0
      fs-service/src/main/resources/mapper/qw/QwUserMapper.xml
  25. 16 11
      fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java
  26. 2 1
      fs-user-app/src/main/java/com/fs/app/facade/impl/Hospital580FacadeServiceImpl.java

+ 1 - 1
fs-admin/src/main/java/com/fs/FSApplication.java

@@ -16,7 +16,7 @@ import org.springframework.transaction.annotation.Transactional;
 @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })
 @Transactional
 @EnableAsync
-@EnableScheduling
+//@EnableScheduling
 public class FSApplication
 {
     public static void main(String[] args)

+ 15 - 0
fs-admin/src/main/java/com/fs/company/controller/CompanyTrafficController.java

@@ -12,6 +12,7 @@ import com.fs.common.enums.BusinessType;
 import com.fs.common.utils.ServletUtils;
 import com.fs.company.domain.CompanyTrafficRecord;
 import com.fs.company.param.CompanyTrafficRecordChargeParam;
+import com.fs.company.param.CompanyTrafficRecordDeductParam;
 import com.fs.company.param.CompanyTrafficRecordQueryParam;
 import com.fs.company.service.ICompanyTrafficRecordService;
 import com.fs.course.config.CourseConfig;
@@ -78,6 +79,20 @@ public class CompanyTrafficController extends BaseController {
         return R.ok();
     }
 
+    /** 扣减流量 */
+    @PreAuthorize("@ss.hasPermi('company:traffic:deduct')")
+    @Log(title = "公司流量扣减", businessType = BusinessType.UPDATE)
+    @PostMapping(value = "/deductTraffic")
+    public R deductTraffic(@RequestBody CompanyTrafficRecordDeductParam param) {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        param.setUserId(loginUser.getUser().getUserId());
+        param.setUserName(loginUser.getUser().getUserName());
+        param.setDeptId(loginUser.getUser().getDeptId());
+        param.setIsAdmin(loginUser.isAdmin());
+        companyTrafficRecordService.deduct(param);
+        return R.ok();
+    }
+
     /** 流量充值记录查询 */
     @PreAuthorize("@ss.hasPermi('company:traffic:list')")
     @GetMapping(value = "/list")

+ 8 - 0
fs-admin/src/main/java/com/fs/course/controller/FsCoursePlaySourceConfigController.java

@@ -105,6 +105,10 @@ public class FsCoursePlaySourceConfigController extends BaseController {
     @Log(title = "点播播放源配置", businessType = BusinessType.INSERT)
     @PostMapping
     public AjaxResult add(@Valid @RequestBody FsCoursePlaySourceConfigCreateParam param) {
+        // appid去除前后空格
+        if (param.getAppid() != null) {
+            param.setAppid(param.getAppid().trim());
+        }
         Wrapper<FsCoursePlaySourceConfig> queryWrapper = Wrappers.<FsCoursePlaySourceConfig>lambdaQuery()
                 .eq(FsCoursePlaySourceConfig::getAppid, param.getAppid())
                 .eq(FsCoursePlaySourceConfig::getIsDel, 0);
@@ -133,6 +137,10 @@ public class FsCoursePlaySourceConfigController extends BaseController {
     @Log(title = "点播播放源配置", businessType = BusinessType.UPDATE)
     @PutMapping
     public AjaxResult edit(@Valid @RequestBody FsCoursePlaySourceConfigEditParam param) {
+        // appid去除前后空格
+        if (param.getAppid() != null) {
+            param.setAppid(param.getAppid().trim());
+        }
         FsCoursePlaySourceConfig config = fsCoursePlaySourceConfigService.getById(param.getId());
         if (Objects.isNull(config)) {
             return AjaxResult.error("点播播放源配置不存在");

+ 11 - 1
fs-admin/src/main/java/com/fs/hisStore/controller/FsStoreScrmController.java

@@ -179,7 +179,7 @@ public class FsStoreScrmController extends BaseController {
 
 
     /**
-     * 一键启用店铺(含资质证书有效期验证)
+     * 一键启用店铺(含资质证书有效期验证,提交审核
      */
     @PreAuthorize("@ss.hasPermi('his:store:edit')")
     @Log(title = "店铺管理", businessType = BusinessType.UPDATE, logParam = {"店铺","一键启用店铺"}, isStoreLog = true)
@@ -188,6 +188,16 @@ public class FsStoreScrmController extends BaseController {
         return fsStoreService.enableStore(storeId);
     }
 
+    /**
+     * 一键停用店铺(直接停用,不需审核)
+     */
+    @PreAuthorize("@ss.hasPermi('his:store:edit')")
+    @Log(title = "店铺管理", businessType = BusinessType.UPDATE, logParam = {"店铺","一键停用店铺"}, isStoreLog = true)
+    @PutMapping("/disable/{storeId}")
+    public R disable(@PathVariable Long storeId) {
+        return fsStoreService.disableStore(storeId);
+    }
+
     /**
      * 店铺审核日志
      * */

+ 8 - 0
fs-admin/src/main/java/com/fs/qw/controller/QwCompanyController.java

@@ -120,6 +120,10 @@ public class QwCompanyController extends BaseController
     @PostMapping
     public AjaxResult add(@RequestBody QwCompany qwCompany)
     {
+        // miniAppId去除前后空格
+        if (qwCompany.getMiniAppId() != null) {
+            qwCompany.setMiniAppId(qwCompany.getMiniAppId().trim());
+        }
         LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
 
         qwCompany.setCreateUserId(loginUser.getUserId());
@@ -137,6 +141,10 @@ public class QwCompanyController extends BaseController
     @PutMapping
     public AjaxResult edit(@RequestBody QwCompany qwCompany)
     {
+        // miniAppId去除前后空格
+        if (qwCompany.getMiniAppId() != null) {
+            qwCompany.setMiniAppId(qwCompany.getMiniAppId().trim());
+        }
         return toAjax(qwCompanyService.updateQwCompany(qwCompany));
     }
 

+ 2 - 2
fs-quartz/src/main/java/com/fs/quartz/config/ScheduleConfig.java

@@ -50,8 +50,8 @@ public class ScheduleConfig
         // 启动时更新己存在的Job,这样就不用每次修改targetObject后删除qrtz_job_details表对应记录了
         factory.setOverwriteExistingJobs(true);
         // 设置自动启动,默认为true
-        factory.setAutoStartup(true);
-//        factory.setAutoStartup(false);
+//        factory.setAutoStartup(true);
+        factory.setAutoStartup(false);
 
         return factory;
     }

+ 44 - 0
fs-service/src/main/java/com/fs/company/param/CompanyTrafficRecordDeductParam.java

@@ -0,0 +1,44 @@
+package com.fs.company.param;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.fs.company.domain.Company;
+import lombok.Data;
+
+/**
+ * 经销商流量扣减入参
+ */
+@Data
+public class CompanyTrafficRecordDeductParam {
+
+    /** 经销商ID */
+    private Long companyId;
+
+    /** 扣减数值 */
+    private Long deductValue;
+
+    /** 单位:KB / MB / GB */
+    private String unit;
+
+    /** 备注 */
+    private String remark;
+
+    /** 操作人ID(由 Controller 注入,前端不传) */
+    @TableField(exist = false)
+    private Long userId;
+
+    /** 操作人名称(由 Controller 注入,前端不传) */
+    @TableField(exist = false)
+    private String userName;
+
+    /** 操作人部门ID(由 Controller 注入,前端不传) */
+    @TableField(exist = false)
+    private Long deptId;
+
+    /** 是否超级管理员(由 Controller 注入,前端不传) */
+    @TableField(exist = false)
+    private Boolean isAdmin;
+
+    /** 公司实例(Service 内回填,用于 Redis 缓存维度) */
+    @TableField(exist = false)
+    private Company company;
+}

+ 11 - 0
fs-service/src/main/java/com/fs/company/service/ICompanyTrafficRecordService.java

@@ -2,6 +2,7 @@ package com.fs.company.service;
 
 import com.fs.company.domain.CompanyTrafficRecord;
 import com.fs.company.param.CompanyTrafficRecordChargeParam;
+import com.fs.company.param.CompanyTrafficRecordDeductParam;
 import com.fs.company.param.CompanyTrafficRecordQueryParam;
 
 import java.util.List;
@@ -14,6 +15,16 @@ public interface ICompanyTrafficRecordService {
 
     //添加流量记录
     boolean recharge(CompanyTrafficRecordChargeParam record);
+
+    /**
+     * 经销商流量扣减
+     * <p>业务规则:
+     *  - 必须可扣(公司存在且余额足够),否则抛异常
+     *  - 普通部门操作:扣减后的流量返还到部门 sys_dept_config.flow_num
+     *  - 总公司部门(deptId=1) 或 admin:不返还
+     *  - 同步写 company_traffic_record_log(operationType=2)
+     */
+    boolean deduct(CompanyTrafficRecordDeductParam record);
     //查询流量记录列表
     List<CompanyTrafficRecord> selectList(CompanyTrafficRecordQueryParam record);
     //查询流量记录

+ 134 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyTrafficRecordServiceImpl.java

@@ -14,6 +14,7 @@ import com.fs.company.domain.CompanyTrafficRecord;
 import com.fs.company.domain.CompanyTrafficRecordLog;
 import com.fs.company.mapper.CompanyTrafficRecordMapper;
 import com.fs.company.param.CompanyTrafficRecordChargeParam;
+import com.fs.company.param.CompanyTrafficRecordDeductParam;
 import com.fs.company.param.CompanyTrafficRecordQueryParam;
 import com.fs.company.service.ICompanyService;
 import com.fs.company.service.ICompanyTrafficRecordLogService;
@@ -249,6 +250,139 @@ public class CompanyTrafficRecordServiceImpl extends ServiceImpl<CompanyTrafficR
         }
     }
 
+    /**
+     * 扣减场景下的公司有效性校验(与 validCompany(charge) 逻辑一致,仅 param 类型不同)
+     */
+    private boolean validCompany(CompanyTrafficRecordDeductParam record) {
+        Company company = new Company();
+        company.setCompanyId(record.getCompanyId());
+        company.setIsDel(0);
+        List<Company> companies = companyService.selectCompanyList(company);
+        if (companies != null && companies.size() == 1) {
+            record.setCompany(companies.get(0));
+            return true;
+        } else {
+            return false;
+        }
+    }
+
+    /**
+     * 经销商流量扣减主逻辑
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean deduct(CompanyTrafficRecordDeductParam record) {
+        if (record.getCompanyId() == null || !validCompany(record)) {
+            throw new IllegalArgumentException("销售公司异常");
+        }
+
+        if (record.getDeductValue() == null || record.getDeductValue() <= 0) {
+            throw new BaseException("扣减流量必须大于 0");
+        }
+        long ratio;
+        long unitLimit;
+        String unit = record.getUnit() == null ? "" : record.getUnit().toUpperCase();
+        switch (unit) {
+            case "KB":
+                ratio = 1L;
+                unitLimit = 1024L;
+                break;
+            case "MB":
+                ratio = 1024L;
+                unitLimit = 1024L;
+                break;
+            case "GB":
+                ratio = 1024L * 1024L;
+                unitLimit = 1024L;
+                break;
+            case "TB":
+                ratio = 1024L * 1024L * 1024L;
+                unitLimit = 10L;
+                break;
+            default:
+                throw new BaseException("非法的扣减单位,仅支持 KB/MB/GB/TB");
+        }
+        if (record.getDeductValue() > unitLimit) {
+            throw new BaseException("单次扣减数值不能超过 " + unitLimit + " " + unit + ",请分次操作");
+        }
+        long deductKB = record.getDeductValue() * ratio;
+        if (deductKB <= 0) {
+            throw new BaseException("扣减流量必须大于 0");
+        }
+
+        CompanyTrafficRecord companyRecord = baseMapper.selectOne(new LambdaQueryWrapper<CompanyTrafficRecord>()
+                .eq(CompanyTrafficRecord::getCompanyId, record.getCompanyId()));
+        if (companyRecord == null) {
+            throw new BaseException("公司流量记录不存在,无法扣减");
+        }
+        long beforeBalance = companyRecord.getBalance() == null ? 0L : companyRecord.getBalance();
+        if (beforeBalance < deductKB) {
+            throw new BaseException("公司流量余额不足,扣减失败");
+        }
+        long afterBalance = beforeBalance - deductKB;
+
+        CompanyTrafficRecord update = CompanyTrafficRecord.builder()
+                .id(companyRecord.getId())
+                .balance(afterBalance)
+                .updateTime(new Date())
+                .updateBy(record.getUserId())
+                .build();
+        baseMapper.updateById(update);
+
+        boolean refundToDept = !Boolean.TRUE.equals(record.getIsAdmin())
+                && record.getDeptId() != null
+                && !record.getDeptId().equals(1L);
+        if (refundToDept) {
+            SysDeptConfig deptConfig = sysDeptConfigService.getDeptConfig(record.getDeptId());
+            if (deptConfig == null) {
+                throw new BaseException("部门配置不存在,无法返还流量");
+            }
+            long oldFlow = deptConfig.getFlowNum() == null ? 0L : deptConfig.getFlowNum();
+            long newFlow = oldFlow + deductKB;
+            deptConfig.setFlowNum(newFlow);
+            deptConfig.setUpdateBy(record.getUserName());
+            deptConfig.setUpdateTime(new Date());
+            sysDeptConfigService.updateById(deptConfig);
+            sysDeptConfigLogService.addLog(
+                    deptConfig.getDeptId(),
+                    1,
+                    0,
+                    String.valueOf(deductKB),
+                    String.valueOf(oldFlow),
+                    String.valueOf(newFlow),
+                    record.getUserName(),
+                    "经销商流量扣减返还,公司ID=" + record.getCompanyId()
+            );
+        }
+
+        try {
+            Long cacheDeptId = record.getCompany() != null && record.getCompany().getDeptId() != null
+                    ? record.getCompany().getDeptId() : companyRecord.getDeptId();
+            if (cacheDeptId != null) {
+                redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + cacheDeptId + ":" + record.getCompanyId(),
+                        -deductKB);
+                redisCache.incr(CompanyTrafficConstants.CACHE_KEY + ":" + cacheDeptId, -deductKB);
+            }
+        } catch (Exception e) {
+            log.warn("扣减流量后 Redis 缓存更新异常,companyId={}, deductKB={}, err={}",
+                    record.getCompanyId(), deductKB, e.getMessage());
+        }
+        
+        String userRemark = record.getRemark() == null ? "" : record.getRemark();
+        String tag = refundToDept ? "[非公司部门操作,已返还部门]" : "[公司部门操作,不返还部门]";
+        return companyTrafficRecordLogService.save(CompanyTrafficRecordLog.builder()
+                .companyId(record.getCompanyId())
+                .userId(record.getUserId())
+                .userName(record.getUserName())
+                .operationType(2)
+                .trafficAmount(deductKB)
+                .chargeAmount(null)
+                .balance(afterBalance)
+                .remark(userRemark + tag)
+                .createTime(new Date())
+                .build());
+    }
+
     /**
      * 更新Redis缓存
      *

+ 4 - 2
fs-service/src/main/java/com/fs/course/mapper/FsUserCoursePeriodDaysMapper.java

@@ -90,14 +90,16 @@ public interface FsUserCoursePeriodDaysMapper extends BaseMapper<FsUserCoursePer
     /**
      * 开启课程
      * @param now  时间
+     * @return 影响行数
      */
-    void startPeriodCourse(@Param("now") LocalDateTime now);
+    int startPeriodCourse(@Param("now") String now);
 
     /**
      * 关闭课程
      * @param now  时间
+     * @return 影响行数
      */
-    void endPeriodCourse(@Param("now") LocalDateTime now);
+    int endPeriodCourse(@Param("now") String now);
 
     /**
      * 查询视频相关信息

+ 11 - 3
fs-service/src/main/java/com/fs/course/service/impl/FsUserCoursePeriodDaysServiceImpl.java

@@ -39,6 +39,8 @@ import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
 import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.function.Function;
@@ -753,16 +755,22 @@ public class FsUserCoursePeriodDaysServiceImpl extends ServiceImpl<FsUserCourseP
 
     /**
      * 更新营期课程状态
+     * 注意:营期开课/关课的 start_date_time、end_date_time 均按北京时间录入,
+     * 这里强制使用 Asia/Shanghai 时区,避免容器/JVM 默认 UTC 导致 8 小时偏移。
      */
     @Transactional(rollbackFor = RuntimeException.class)
     @Override
     public void changePeriodCourseStatus() {
-        log.info("更新营期课程状态--------------------------》");
+        LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai"));
+        String nowStr = now.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
+        log.info("更新营期课程状态--------------------------》now={}", nowStr);
         // 开启
-        fsUserCoursePeriodDaysMapper.startPeriodCourse(LocalDateTime.now());
+        int startRows = fsUserCoursePeriodDaysMapper.startPeriodCourse(nowStr);
+        log.info("营期课程[开启]影响行数={}", startRows);
 
         // 关闭
-        fsUserCoursePeriodDaysMapper.endPeriodCourse(LocalDateTime.now());
+        int endRows = fsUserCoursePeriodDaysMapper.endPeriodCourse(nowStr);
+        log.info("营期课程[关闭]影响行数={}", endRows);
     }
 
     @Override

+ 3 - 3
fs-service/src/main/java/com/fs/his/mapper/FsUserMapper.java

@@ -452,11 +452,11 @@ public interface FsUserMapper
      * **/
     FsUser getUserLookAppIdByuserId(@Param("userId") Long userId);
 
-    List<FsUser> selectFsUserListByPhone(String phone);
+    List<FsUser> selectFsUserListByPhone(@Param("phone") String phone, @Param("appid") String appid);
 
     void updatePasswordByPhone(@Param("password")String password, @Param("encryptPhone")String encryptPhone);
 
-    @Select("select * from fs_user where phone=#{phone}")
-    List<FsUser> selectFsUsersByPhoneLimitOne(String phone);
+    @Select("select * from fs_user where phone=#{phone} AND app_id LIKE CONCAT('%',#{appid},'%')")
+    List<FsUser> selectFsUsersByPhoneLimitOne(@Param("phone") String phone, @Param("appid") String appid);
 
 }

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

@@ -248,7 +248,7 @@ public interface IFsUserService
      * **/
     R addUserAndSaleFriend(FsUser user,Long compayUserId, Long externalUserId);
 
-    List<FsUser> selectFsUserListByPhone(String phone);
+    List<FsUser> selectFsUserListByPhone(String phone,String appid);
 
     R updatePasswordByPhone(String password, String encryptPhone);
 

+ 11 - 7
fs-service/src/main/java/com/fs/his/service/impl/FsPrescribeServiceImpl.java

@@ -810,14 +810,18 @@ public class FsPrescribeServiceImpl implements IFsPrescribeService
         for (Hospital580PrescriptionScrmEntity fsPrescribe : prescriptionScrmEntities) {
 
             // 查询商品信息
-            FsStoreProductScrm fsStoreProductScrm = productScrmService.selectFsStoreProductById(fsPrescribe.getStoreOrderId());
+//            FsStoreProductScrm fsStoreProductScrm = productScrmService.selectFsStoreProductById(fsPrescribe.getStoreOrderId());
             // 西药
-            FsDoctor id = doctorMapper.findByStoreId(fsStoreProductScrm.getStoreId());
-            FsPrescribeAuditParam param=new FsPrescribeAuditParam();
-            param.setDoctorId(id.getDoctorId());
-            param.setPrescribeId(fsPrescribe.getPreId());
-            param.setStatus(1);
-            audit580(param);
+            if(fsPrescribe.getStoreId() != null && fsPrescribe.getStoreId() != 0){
+                FsDoctor id = doctorMapper.findByStoreId(fsPrescribe.getStoreSysId());
+                if(id != null){
+                    FsPrescribeAuditParam param=new FsPrescribeAuditParam();
+                    param.setDoctorId(id.getDoctorId());
+                    param.setPrescribeId(fsPrescribe.getPreId());
+                    param.setStatus(1);
+                    audit580(param);
+                }
+            }
         }
     }
 

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

@@ -1482,8 +1482,8 @@ public class FsUserServiceImpl implements IFsUserService {
     }
 
     @Override
-    public List<FsUser> selectFsUserListByPhone(String phone) {
-        return fsUserMapper.selectFsUserListByPhone(phone);
+    public List<FsUser> selectFsUserListByPhone(String phone,String appid) {
+        return fsUserMapper.selectFsUserListByPhone(phone,appid);
     }
 
     @Override

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

@@ -726,7 +726,12 @@ public interface FsDataScrmMapper {
 
 
     @Select({"<script> " +
-            "SELECT ANY_VALUE(x.product_id) product_id,SUM(x.num) num, ANY_VALUE(p.product_name) product_name,ANY_VALUE(p.price) price,ANY_VALUE(p.bar_code) as barCode FROM fs_store_order_item_scrm x LEFT JOIN fs_store_product_scrm p ON p.product_id=x.product_id WHERE order_id IN (SELECT order_id FROM fs_store_order_scrm WHERE `status`>1 " +
+            "SELECT ANY_VALUE(x.product_id) product_id,SUM(x.num) num, CASE\n" +
+            "\tWHEN p.product_name != '-' THEN\n" +
+            "\t\tANY_VALUE(p.product_name)\n" +
+            "\tELSE\n" +
+            "\t\tANY_VALUE(p.common_name)\n" +
+            "END AS  product_name,ANY_VALUE(p.price) price,ANY_VALUE(p.bar_code) as barCode FROM fs_store_order_item_scrm x LEFT JOIN fs_store_product_scrm p ON p.product_id=x.product_id WHERE order_id IN (SELECT order_id FROM fs_store_order_scrm WHERE `status`>1 " +
             "<if test = 'maps.storeId != null'> " +
             "and store_id = #{maps.storeId} " +
             "</if>" +
@@ -761,6 +766,7 @@ public interface FsDataScrmMapper {
             "and  YEAR(create_time) = YEAR(DATE_SUB(NOW(),INTERVAL 1 YEAR))" +
             "</if>" +
             ") \n" +
+            "AND p.product_name IS NOT NULL \n"+
             "GROUP BY x.product_id  ORDER BY num desc"+
             "</script>"})
     List<ChartProdVO> ChartProdVO(@Param("maps") DataDTO dto);
@@ -779,7 +785,12 @@ public interface FsDataScrmMapper {
     @Select("select COUNT(id) FROM fs_store_order_scrm WHERE store_id=#{id} AND `status`=2")
     Long getGetStore(Long id);
     @Select({"<script> " +
-            "SELECT SUM(x.num) score,ANY_VALUE(p.product_name) name FROM fs_store_order_item_scrm x LEFT JOIN fs_store_product_scrm p ON p.product_id=x.product_id WHERE order_id IN (SELECT order_id FROM fs_store_order_scrm WHERE 1=1 " +
+            "SELECT SUM(x.num) AS score,CASE\n" +
+            "\tWHEN p.product_name != '-' THEN\n" +
+            "\t\tANY_VALUE(p.product_name)\n" +
+            "\tELSE\n" +
+            "\t\tANY_VALUE(p.common_name)\n" +
+            "END AS name FROM fs_store_order_item_scrm x LEFT JOIN fs_store_product_scrm p ON p.product_id=x.product_id WHERE order_id IN (SELECT order_id FROM fs_store_order_scrm WHERE 1=1 " +
             "<if test = 'storeId != null'> " +
             "and store_id = #{storeId} " +
             "</if>" +
@@ -814,6 +825,7 @@ public interface FsDataScrmMapper {
             "and  YEAR(create_time) = YEAR(DATE_SUB(NOW(),INTERVAL 1 YEAR))" +
             "</if>" +
             ") \n" +
+            "AND p.product_name IS NOT NULL \n"+
             "GROUP BY x.product_id  ORDER BY score desc limit 10"+
             "</script>"})
     List<DoctorChartVO> ChartStoreProdVo(@Param("type") Integer type, @Param("storeId") Long storeId);

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

@@ -101,6 +101,8 @@ public interface IFsStoreScrmService
 
     R enableStore(Long storeId);
 
+    R disableStore(Long storeId);
+
     List<FsStoreScrm> selectFsStoreListOption(FsStoreScrm fsStore);
 
     /**

+ 17 - 2
fs-service/src/main/java/com/fs/hisStore/service/impl/FsStoreScrmServiceImpl.java

@@ -621,12 +621,27 @@ public class FsStoreScrmServiceImpl implements IFsStoreScrmService {
                 return R.error("启用失败:食品经营许可证/备案凭证已过期,请更新后重试");
             }
         }
+        // 资质验证通过,进入待审核状态,等待管理员审核后才真正启用
         FsStoreScrm updateStore = new FsStoreScrm();
         updateStore.setStoreId(storeId);
-        updateStore.setStatus(1);
+        updateStore.setIsAudit(0);
+        fsStoreMapper.updateFsStore(updateStore);
+        storeAuditLogUtil.addOperLog(storeId);
+        return R.ok("已提交审核,请等待管理员审核通过后启用");
+    }
+
+    @Override
+    public R disableStore(Long storeId) {
+        FsStoreScrm store = fsStoreMapper.selectFsStoreByStoreId(storeId);
+        if (store == null) {
+            return R.error("店铺不存在");
+        }
+        FsStoreScrm updateStore = new FsStoreScrm();
+        updateStore.setStoreId(storeId);
+        updateStore.setStatus(0);
         fsStoreMapper.updateFsStore(updateStore);
         storeAuditLogUtil.addOperLog(storeId);
-        return R.ok("启用成功");
+        return R.ok("用成功");
     }
 
     private boolean isExcludedField(String fieldName) {

+ 8 - 0
fs-service/src/main/java/com/fs/qw/mapper/QwUserMapper.java

@@ -443,4 +443,12 @@ public interface QwUserMapper extends BaseMapper<QwUser>
     List<QwOptionsVO> selectQwCompanyListOptionsVOBySys();
 
     List<QwUser> selectQwUserByTest();
+
+    /**
+     * 修改企微用户
+     *
+     * @param qwUser 企微用户
+     * @return 结果
+     */
+    public int updateQwUserServerById(QwUser qwUser);
 }

+ 8 - 8
fs-service/src/main/java/com/fs/qw/service/impl/QwUserServiceImpl.java

@@ -186,11 +186,11 @@ public class QwUserServiceImpl implements IQwUserService
     @Override
     public R delQwIpad(QwLoginHookParam loginParam) {
         QwUser qwUser = qwUserMapper.selectQwUserById(loginParam.getQwUserId());
-        Integer serverStatus = qwUser.getServerStatus();
+//        Integer serverStatus = qwUser.getServerStatus();
         Long serverId = qwUser.getServerId();
-        if (serverStatus==0){
-            return R.error("不需要解绑");
-        }
+//        if (serverStatus==0){
+//            return R.error("不需要解绑");
+//        }
         if (serverId==null){
             return R.error("serverId不存在");
         }
@@ -198,7 +198,7 @@ public class QwUserServiceImpl implements IQwUserService
         u.setId(qwUser.getId());
         u.setServerId(null);
         u.setServerStatus(0);
-        qwUserMapper.updateQwUser(u);
+        qwUserMapper.updateQwUserServerById(u);
         ipadServerService.addServer(serverId);
         QwIpadServerLog qwIpadServerLog = new QwIpadServerLog();
         qwIpadServerLog.setType(2);
@@ -210,9 +210,9 @@ public class QwUserServiceImpl implements IQwUserService
         qwIpadServerLog.setCreateTime(new Date());
         qwIpadServerLogService.insertQwIpadServerLog(qwIpadServerLog);
         qwIpadServerUserService.deleteQwIpadServerUserByQwUserId(qwUser.getId());
-        WxWorkGetQrCodeDTO wxWorkGetQrCodeDTO = new WxWorkGetQrCodeDTO();
-        wxWorkGetQrCodeDTO.setUuid(qwUser.getUid());
-        wxWorkService.LoginOut(wxWorkGetQrCodeDTO,qwUser.getServerId());
+//        WxWorkGetQrCodeDTO wxWorkGetQrCodeDTO = new WxWorkGetQrCodeDTO();
+//        wxWorkGetQrCodeDTO.setUuid(qwUser.getUid());
+//        wxWorkService.LoginOut(wxWorkGetQrCodeDTO,qwUser.getServerId());
         updateIpadStatus(qwUser.getId(),0);
         return R.ok();
     }

+ 1 - 0
fs-service/src/main/java/com/fs/system/mapper/SysDeptConfigMapper.java

@@ -11,6 +11,7 @@ import com.fs.system.domain.SysDeptConfig;
  * @date 2025-09-22
  */
 public interface SysDeptConfigMapper extends BaseMapper<SysDeptConfig>{
+
     /**
      * 查询部门配置
      * 

+ 4 - 4
fs-service/src/main/resources/application-config-druid-yjb.yml

@@ -10,10 +10,10 @@ logging:
     me.chanjar.weixin: DEBUG
 wx:
   open:
-      appId: wx7796a33a71912e32 #互易享(三方入驻APP)
-      secret: 51601ec1e3247fe1615ef7b55baf95c7 #互易享(三方入驻APP)
-#      appId: wx98abee0aa8ccdd3c #鸿良(看课APP)
-#      secret: 6c269d8ee939d1a241721d0dea834568 #鸿良(看课APP)
+#      appId: wx7796a33a71912e32 #互易享(三方入驻APP)
+#      secret: 51601ec1e3247fe1615ef7b55baf95c7 #互易享(三方入驻APP)
+      appId: wx98abee0aa8ccdd3c #鸿良(看课APP)
+      secret: 6c269d8ee939d1a241721d0dea834568 #鸿良(看课APP)
   miniapp:
     configs:
       - appid: wx9e61312fe7ac85c4   #医健宝

+ 1 - 1
fs-service/src/main/resources/mapper/his/FsUserMapper.xml

@@ -2309,7 +2309,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
     </select>
 
     <select id="selectFsUserListByPhone" resultType="com.fs.his.domain.FsUser">
-        select * from fs_user where phone=#{phone}
+        select * from fs_user where phone=#{phone} AND app_id LIKE CONCAT('%',#{appid},'%')
     </select>
 
     <update id="updatePasswordByPhone">

+ 6 - 0
fs-service/src/main/resources/mapper/qw/QwUserMapper.xml

@@ -181,6 +181,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
         where id = #{id}
     </update>
 
+
+
     <update id="updateQwUserByAppKey" parameterType="QwUser">
         update qw_user set login_status = #{loginStatus},remark = NULL
         <if test="version != null">,version = #{version} </if>
@@ -301,4 +303,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
             #{serverId}
         </foreach>
     </select>
+
+    <update id="updateQwUserServerById"  parameterType="QwUser">
+        update qw_user set server_id = #{serverId},server_status = #{serverStatus} where id = #{id}
+    </update>
 </mapper>

+ 16 - 11
fs-user-app/src/main/java/com/fs/app/controller/AppLoginController.java

@@ -685,9 +685,10 @@ public class AppLoginController extends AppBaseController{
         }
 
         String encryptPhone = encryptPhone(phone);
-        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        String appid = openProperties.getAppId();
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone,appid);
         if(CollectionUtil.isEmpty(user)){
-            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone),appid);
         }
         if (!CollectionUtil.isEmpty(user)){
             return R.error("此电话号码已注册");
@@ -723,10 +724,11 @@ public class AppLoginController extends AppBaseController{
         String code = map.get("code");
         String password = map.get("password");
         String encryptPhone = encryptPhone(phone);
-        List<FsUser> users = userService.selectFsUserListByPhone(encryptPhone);
+        String appid = openProperties.getAppId();
+        List<FsUser> users = userService.selectFsUserListByPhone(encryptPhone,appid);
         if (users == null || CollectionUtil.isEmpty(users)){
             String s = encryptPhoneOldKey(phone);
-            users = userService.selectFsUserListByPhone(s);
+            users = userService.selectFsUserListByPhone(s,appid);
         }
         if (!CollectionUtil.isEmpty(users)){
             return R.error("此账号已经注册");
@@ -760,9 +762,10 @@ public class AppLoginController extends AppBaseController{
         String phone = map.get("phone");
         String code = map.get("code");
         String encryptPhone = encryptPhone(phone);
-        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        String appid = openProperties.getAppId();
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone,appid);
         if (CollectionUtil.isEmpty(user)){
-            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone),appid);
         }
 
         if (CollectionUtil.isEmpty(user)){
@@ -802,9 +805,10 @@ public class AppLoginController extends AppBaseController{
             throw new ServiceException("两次输入密码不一致,请检查");
         }
         String encryptPhone = encryptPhone(phone);
-        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone);
+        String appid = openProperties.getAppId();
+        List<FsUser> user = userService.selectFsUserListByPhone(encryptPhone,appid);
         if (CollectionUtil.isEmpty(user)){
-            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone));
+            user = userService.selectFsUserListByPhone(encryptPhoneOldKey(phone),appid);
         }
         if (CollectionUtil.isEmpty(user)){
             return R.error("此电话号码未绑定用户");
@@ -856,15 +860,16 @@ public class AppLoginController extends AppBaseController{
     }
 
     private List<FsUser> findUsersByPhone(String phone) {
+        String appid = openProperties.getAppId();
         // 先根据加密手机号查询用户
         String jiami = (encryptPhone(phone));
-        List<FsUser> fsUsers = userMapper.selectFsUsersByPhoneLimitOne(jiami);
+        List<FsUser> fsUsers = userMapper.selectFsUsersByPhoneLimitOne(jiami,appid);
         if (CollectionUtil.isEmpty(fsUsers)) {
-            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(encryptPhoneOldKey(phone));
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(encryptPhoneOldKey(phone),appid);
         }
         // 如果没有找到用户,再根据手机号查询
         if (CollectionUtil.isEmpty(fsUsers)) {
-            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(phone);
+            fsUsers = userMapper.selectFsUsersByPhoneLimitOne(phone,appid);
 
         }
         return fsUsers;

+ 2 - 1
fs-user-app/src/main/java/com/fs/app/facade/impl/Hospital580FacadeServiceImpl.java

@@ -157,7 +157,8 @@ public class Hospital580FacadeServiceImpl implements Hospital580FacadeService {
             textRecordDto.setAnswer(item.getAnswer());
             textRecordDto.setAnswerMedicine(item.getAnswerMedicine());
             return textRecordDto;
-        }).collect(Collectors.toList()));
+        }).sorted(Comparator.comparing(BeforeAiData::getSubjectId))
+                .collect(Collectors.toList()));
         Result580 result580 = hospital580Service.initPreDemand(dto);
         order.setJumpUrl(result580.getData());
         order.updateById();