liujie
6 天以前 7693272d85e41ad3ea843ca2011311c8cf75ce9b
Merge branch 'master' of http://120.76.84.145:10101/gitblit/r/java/haizhentong
1个文件已删除
19个文件已修改
8个文件已添加
1176 ■■■■ 已修改文件
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmBranchController.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmClinicController.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmSalespersonController.java 31 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java 139 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysBannerController.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysQualificationsController.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java 212 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TSysUserResp.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TTenantResp.java 70 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUserApplet.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmClinicMapper.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysOrderMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/query/TCrmClinicQuery.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmClinicService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmClinicServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAppUserServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TCrmClinicVO.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysAppUserVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TCrmClinicMapper.xml 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmBranchController.java
@@ -1,12 +1,14 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.TCrmBranchDTO;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TCrmBranchQuery;
@@ -42,14 +44,16 @@
    private final ISysUserService sysUserService;
    private final TCrmChangePointsService crmChangePointsService;
    private final TCrmPositionService crmPositionService;
    private final TokenService tokenService;
    @Autowired
    public TCrmBranchController(TCrmBranchService crmBranchService, TCrmBranchAreaService crmBranchAreaService, TCrmBranchSalaryService crmBranchSalaryService, ISysUserService sysUserService, TCrmChangePointsService crmChangePointsService, TCrmPositionService crmPositionService) {
    public TCrmBranchController(TCrmBranchService crmBranchService, TCrmBranchAreaService crmBranchAreaService, TCrmBranchSalaryService crmBranchSalaryService, ISysUserService sysUserService, TCrmChangePointsService crmChangePointsService, TCrmPositionService crmPositionService, TokenService tokenService) {
        this.crmBranchService = crmBranchService;
        this.crmBranchAreaService = crmBranchAreaService;
        this.crmBranchSalaryService = crmBranchSalaryService;
        this.sysUserService = sysUserService;
        this.crmChangePointsService = crmChangePointsService;
        this.crmPositionService = crmPositionService;
        this.tokenService = tokenService;
    }
    /**
@@ -67,9 +71,14 @@
    @ApiOperation(value = "获取crm分公司管理列表")
    @PostMapping(value = "/list")
    public R<List<TCrmBranch>> list() {
        return R.ok(crmBranchService.list(Wrappers.lambdaQuery(TCrmBranch.class)
                .eq(TCrmBranch::getStatus,1)
                .orderByDesc(TCrmBranch::getCreateTime)));
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        Long userId = tokenService.getLoginUser().getUserId();
        LambdaQueryWrapper<TCrmBranch> wrapper = new LambdaQueryWrapper<>();
        if (roleType == 1) {
            wrapper.eq(TCrmBranch::getUserId, userId);
        }
        wrapper.eq(TCrmBranch::getStatus,1).orderByDesc(TCrmBranch::getCreateTime);
        return R.ok(crmBranchService.list(wrapper));
    }
    /**
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmClinicController.java
@@ -1,18 +1,17 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.TCrmClinicAuditDTO;
import com.ruoyi.system.dto.TCrmClinicDTO;
import com.ruoyi.system.model.TCrmBranch;
import com.ruoyi.system.model.TCrmClinic;
import com.ruoyi.system.model.TCrmSalesperson;
import com.ruoyi.system.model.TCrmWarehouse;
import com.ruoyi.system.model.*;
import com.ruoyi.system.query.TCrmClinicQuery;
import com.ruoyi.system.service.*;
import com.ruoyi.system.vo.TCrmClinicVO;
@@ -20,6 +19,7 @@
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@@ -46,14 +46,18 @@
    private final TCrmWarehouseService crmWarehouseService;
    private final TCrmSalespersonService crmSalespersonService;
    private final ISysUserService sysUserService;
    private final TCrmDeviceService crmDeviceService;
    private final TokenService tokenService;
    @Autowired
    public TCrmClinicController(TCrmClinicService crmClinicService, TCrmSupplierService crmSupplierService, TCrmBranchService crmBranchService, TCrmWarehouseService crmWarehouseService, TCrmSalespersonService crmSalespersonService, ISysUserService sysUserService) {
    public TCrmClinicController(TCrmClinicService crmClinicService, TCrmSupplierService crmSupplierService, TCrmBranchService crmBranchService, TCrmWarehouseService crmWarehouseService, TCrmSalespersonService crmSalespersonService, ISysUserService sysUserService, TCrmDeviceService crmDeviceService, TokenService tokenService) {
        this.crmClinicService = crmClinicService;
        this.crmSupplierService = crmSupplierService;
        this.crmBranchService = crmBranchService;
        this.crmWarehouseService = crmWarehouseService;
        this.crmSalespersonService = crmSalespersonService;
        this.sysUserService = sysUserService;
        this.crmDeviceService = crmDeviceService;
        this.tokenService = tokenService;
    }
    /**
@@ -62,18 +66,44 @@
    @ApiOperation(value = "获取crm诊所管理分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TCrmClinicVO>> pageList(@RequestBody TCrmClinicQuery query) {
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        Long userId = tokenService.getLoginUser().getUserId();
        if(roleType == 2 || roleType == 3){
            query.setUserId(userId);
            query.setRoleType(roleType);
        }
        return R.ok(crmClinicService.pageList(query));
    }
    /**
     * 获取crm诊所管理管理列表
     */
    @ApiOperation(value = "获取crm诊所管理列表")
    @ApiOperation(value = "获取crm诊所管理审核分页列表")
    @PostMapping(value = "/pageAuditList")
    public R<PageInfo<TCrmClinicVO>> pageAuditList(@RequestBody TCrmClinicQuery query) {
        return R.ok(crmClinicService.pageAuditList(query));
    }
    /**
     * 获取crm诊所管理管理列表
     */
    @ApiOperation(value = "获取crm诊所管理列表",notes = "type 1=设备使用 2=其他")
    @PostMapping(value = "/list")
    public R<List<TCrmClinic>> list() {
        return R.ok(crmClinicService.list(Wrappers.lambdaQuery(TCrmClinic.class)
                .eq(TCrmClinic::getStatus,1)
                .orderByDesc(TCrmClinic::getCreateTime)));
    public R<List<TCrmClinic>> list(@RequestParam(value = "type") Integer type) {
        if(type == 1){
            List<TCrmDevice> list = crmDeviceService.list();
            LambdaQueryWrapper<TCrmClinic> wrapper = new LambdaQueryWrapper<>();
            if(!CollectionUtils.isEmpty(list)){
                List<String> clinicIds = list.stream().map(TCrmDevice::getClinicId).collect(Collectors.toList());
                wrapper.notIn(TCrmClinic::getId,clinicIds);
            }
            wrapper.eq(TCrmClinic::getStatus,3).orderByDesc(TCrmClinic::getCreateTime);
            return R.ok(crmClinicService.list(wrapper));
        }else {
            return R.ok(crmClinicService.list(Wrappers.lambdaQuery(TCrmClinic.class)
                    .eq(TCrmClinic::getStatus,3)
                    .orderByDesc(TCrmClinic::getCreateTime)));
        }
    }
    /**
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TCrmSalespersonController.java
@@ -1,12 +1,14 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.dto.TCrmSalespersonDTO;
import com.ruoyi.system.model.TCrmBranch;
import com.ruoyi.system.model.TCrmChangePoints;
@@ -45,12 +47,14 @@
    private final ISysUserService sysUserService;
    private final TCrmChangePointsService crmChangePointsService;
    private final TCrmBranchService crmBranchService;
    private final TokenService tokenService;
    @Autowired
    public TCrmSalespersonController(TCrmSalespersonService crmSalespersonService, ISysUserService sysUserService, TCrmChangePointsService crmChangePointsService, TCrmBranchService crmBranchService) {
    public TCrmSalespersonController(TCrmSalespersonService crmSalespersonService, ISysUserService sysUserService, TCrmChangePointsService crmChangePointsService, TCrmBranchService crmBranchService, TokenService tokenService) {
        this.crmSalespersonService = crmSalespersonService;
        this.sysUserService = sysUserService;
        this.crmChangePointsService = crmChangePointsService;
        this.crmBranchService = crmBranchService;
        this.tokenService = tokenService;
    }
    /**
@@ -59,6 +63,15 @@
    @ApiOperation(value = "获取crm业务员管理分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TCrmSalespersonVO>> pageList(@RequestBody TCrmSalespersonQuery query) {
        Long userId = tokenService.getLoginUser().getUser().getUserId();
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        if(roleType == 2){
            // 查询分公司信息
            TCrmBranch crmBranch = crmBranchService.getOne(Wrappers.lambdaQuery(TCrmBranch.class)
                    .eq(TCrmBranch::getUserId, userId)
                    .last("LIMIT 1"));
            query.setBranchId(crmBranch.getId());
        }
        return R.ok(crmSalespersonService.pageList(query));
    }
@@ -68,9 +81,19 @@
    @ApiOperation(value = "获取crm业务员管理列表")
    @PostMapping(value = "/list")
    public R<List<TCrmSalesperson>> list() {
        return R.ok(crmSalespersonService.list(Wrappers.lambdaQuery(TCrmSalesperson.class)
                .eq(TCrmSalesperson::getStatus,1)
                .orderByDesc(TCrmSalesperson::getCreateTime)));
        Long userId = tokenService.getLoginUser().getUser().getUserId();
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        LambdaQueryWrapper<TCrmSalesperson> wrapper = new LambdaQueryWrapper<>();
        if(roleType == 2){
            // 查询分公司信息
            TCrmBranch crmBranch = crmBranchService.getOne(Wrappers.lambdaQuery(TCrmBranch.class)
                    .eq(TCrmBranch::getUserId, userId)
                    .last("LIMIT 1"));
            wrapper.eq(TCrmSalesperson::getBranchId,crmBranch.getId());
        }
        wrapper.eq(TCrmSalesperson::getStatus,1)
                .orderByDesc(TCrmSalesperson::getCreateTime);
        return R.ok(crmSalespersonService.list(wrapper));
    }
    /**
ruoyi-admin/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
@@ -24,6 +24,8 @@
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.Arrays;
import java.util.List;
@@ -129,6 +131,10 @@
        // 订单信息
        List<TSysOrderVO> sysOrders = sysOrderService.queryListByAppUserId(id);
        sysAppUserVO.setSysOrders(sysOrders);
        if(sysAppUserVO.getBirthTime() != null){
            long age = ChronoUnit.YEARS.between(sysAppUserVO.getBirthTime(), LocalDateTime.now());
            sysAppUserVO.setAge(age);
        }
        return R.ok(sysAppUserVO);
    }
@@ -146,7 +152,7 @@
    /**
     * 查看用户管理详情
     */
    @ApiOperation(value = "查看用户管理详情")
    @ApiOperation(value = "查看用户购药详情")
    @GetMapping(value = "/getOrderByAppUserId")
    public R<List<TSysOrderVO>> getOrderByAppUserId(@RequestParam String appUserId) {
        List<TSysOrderVO> sysOrders = sysOrderService.queryListByAppUserId(appUserId);
@@ -174,7 +180,7 @@
    }
    /**
     * 批量删除用户管理
     * 分公司管理解冻冻结
     */
    @Log(title = "用户管理信息-分公司管理解冻冻结", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "分公司管理解冻冻结",notes = "状态 1=使用中 2=冻结")
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysActivityController.java
New file
@@ -0,0 +1,69 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TSysActivity;
import com.ruoyi.system.query.TSysActivityQuery;
import com.ruoyi.system.service.TSysActivityService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * 热门活动 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-08-20
 */
@Api(tags = "热门活动")
@RestController
@RequestMapping("/t-sys-activity")
public class TSysActivityController {
    private final TSysActivityService sysActivityService;
    private final TokenService tokenService;
    @Autowired
    public TSysActivityController(TSysActivityService sysActivityService, TokenService tokenService) {
        this.sysActivityService = sysActivityService;
        this.tokenService = tokenService;
    }
    /**
     * 获取热门活动管理列表
     */
    @ApiOperation(value = "获取热门活动分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TSysActivity>> pageList(@RequestBody TSysActivityQuery query) {
        return R.ok(sysActivityService.pageList(query));
    }
    /**
     * 获取热门活动管理列表
     */
    @ApiOperation(value = "获取热门活动列表")
    @PostMapping(value = "/list")
    public R<List<TSysActivity>> list() {
        return R.ok(sysActivityService.list(Wrappers.lambdaQuery(TSysActivity.class).orderByDesc(TSysActivity::getCreateTime)));
    }
    /**
     * 查看热门活动详情
     */
    @ApiOperation(value = "查看热门活动详情")
    @GetMapping(value = "/getDetailById")
    public R<TSysActivity> getDetailById(@RequestParam String id) {
        return R.ok(sysActivityService.getById(id));
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysAppUserController.java
New file
@@ -0,0 +1,139 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TSysAppUser;
import com.ruoyi.system.model.TSysChronicDisease;
import com.ruoyi.system.model.TSysInspection;
import com.ruoyi.system.query.TSysAppUserQuery;
import com.ruoyi.system.service.TSysAppUserService;
import com.ruoyi.system.service.TSysChronicDiseaseService;
import com.ruoyi.system.service.TSysInspectionService;
import com.ruoyi.system.service.TSysOrderService;
import com.ruoyi.system.vo.TSysAppUserVO;
import com.ruoyi.system.vo.TSysOrderVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Arrays;
import java.util.List;
/**
 * <p>
 * 用户管理 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-08-20
 */
@Api(tags = "用户管理")
@RestController
@RequestMapping("/t-sys-app-user")
public class TSysAppUserController {
    private final TSysAppUserService sysAppUserService;
    private final TSysInspectionService sysInspectionService;
    private final TSysOrderService sysOrderService;
    private final TSysChronicDiseaseService sysChronicDiseaseService;
    private final TokenService tokenService;
    private final RedisCache redisCache;
    @Autowired
    public TSysAppUserController(TSysAppUserService sysAppUserService, TSysInspectionService sysInspectionService, TSysOrderService sysOrderService, TSysChronicDiseaseService sysChronicDiseaseService, TokenService tokenService, RedisCache redisCache) {
        this.sysAppUserService = sysAppUserService;
        this.sysInspectionService = sysInspectionService;
        this.sysOrderService = sysOrderService;
        this.sysChronicDiseaseService = sysChronicDiseaseService;
        this.tokenService = tokenService;
        this.redisCache = redisCache;
    }
    /**
     * 获取用户管理管理列表
     */
    @ApiOperation(value = "获取用户管理分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TSysAppUserVO>> pageList(@RequestBody TSysAppUserQuery query) {
        return R.ok(sysAppUserService.pageList(query));
    }
    /**
     * 修改用户管理
     */
    @Log(title = "用户管理信息-修改用户管理", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "修改用户管理")
    @PostMapping(value = "/update")
    public R<Boolean> update(@Validated @RequestBody TSysAppUser dto) {
        return R.ok(sysAppUserService.updateById(dto));
    }
    /**
     * 查看用户管理详情
     */
    @ApiOperation(value = "查看用户管理详情")
    @GetMapping(value = "/getDetailById")
    public R<TSysAppUserVO> getDetailById(@RequestParam String id) {
        TSysAppUser sysAppUser = sysAppUserService.getById(id);
        TSysAppUserVO sysAppUserVO = new TSysAppUserVO();
        BeanUtils.copyProperties(sysAppUser, sysAppUserVO);
        // 查询慢性病
        String chronicDiseaseId = sysAppUserVO.getChronicDiseaseId();
        if(StringUtils.isNotBlank(chronicDiseaseId)){
            String[] split = chronicDiseaseId.split(",");
            List<TSysChronicDisease> sysChronicDiseases = sysChronicDiseaseService.list(Wrappers.lambdaQuery(TSysChronicDisease.class).in(TSysChronicDisease::getId, Arrays.asList(split)));
            sysAppUserVO.setSysChronicDiseases(sysChronicDiseases);
        }
        // 查询检测信息
        List<TSysInspection> sysInspections = sysInspectionService.list(Wrappers.lambdaQuery(TSysInspection.class).eq(TSysInspection::getAppUserId, id));
        sysAppUserVO.setSysInspections(sysInspections);
        // 订单信息
        List<TSysOrderVO> sysOrders = sysOrderService.queryListByAppUserId(id);
        sysAppUserVO.setSysOrders(sysOrders);
        return R.ok(sysAppUserVO);
    }
    /**
     * 根据用户id查询检测信息
     */
    @ApiOperation(value = "根据用户id查询检测信息")
    @GetMapping(value = "/getInspectionByAppUserId")
    public R<List<TSysInspection>> getInspectionByAppUserId(@RequestParam String appUserId) {
        // 订单信息
        List<TSysInspection> sysInspections = sysInspectionService.list(Wrappers.lambdaQuery(TSysInspection.class).eq(TSysInspection::getAppUserId, appUserId));
        return R.ok(sysInspections);
    }
    /**
     * 查看用户管理详情
     */
    @ApiOperation(value = "查看用户购药详情")
    @GetMapping(value = "/getOrderByAppUserId")
    public R<List<TSysOrderVO>> getOrderByAppUserId(@RequestParam String appUserId) {
        List<TSysOrderVO> sysOrders = sysOrderService.queryListByAppUserId(appUserId);
        return R.ok(sysOrders);
    }
    /**
     * 退出登录
     */
    @Log(title = "用户管理信息-退出登录", businessType = BusinessType.UPDATE)
    @ApiOperation(value = "退出登录")
    @PostMapping(value = "/loginOut")
    public R<Boolean> loginOut() {
        String token = tokenService.getLoginUserApplet().getToken();
        redisCache.deleteObject(tokenService.getTokenKey(token));
        return R.ok();
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysBannerController.java
New file
@@ -0,0 +1,66 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.model.TSysBanner;
import com.ruoyi.system.query.TSysBannerQuery;
import com.ruoyi.system.service.TSysBannerService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * banner管理 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-08-20
 */
@Api(tags = "banner管理")
@RestController
@RequestMapping("/t-sys-banner")
public class TSysBannerController {
    private final TSysBannerService sysBannerService;
    @Autowired
    public TSysBannerController(TSysBannerService sysBannerService) {
        this.sysBannerService = sysBannerService;
    }
    /**
     * 获取banner管理管理列表
     */
    @ApiOperation(value = "获取banner管理分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TSysBanner>> pageList(@RequestBody TSysBannerQuery query) {
        return R.ok(sysBannerService.pageList(query));
    }
    /**
     * 获取banner管理管理列表
     */
    @ApiOperation(value = "获取banner管理列表")
    @PostMapping(value = "/list")
    public R<List<TSysBanner>> list() {
        return R.ok(sysBannerService.list(Wrappers.lambdaQuery(TSysBanner.class).orderByDesc(TSysBanner::getCreateTime)));
    }
    /**
     * 查看banner管理详情
     */
    @ApiOperation(value = "查看banner管理详情")
    @GetMapping(value = "/getDetailById")
    public R<TSysBanner> getDetailById(@RequestParam String id) {
        return R.ok(sysBannerService.getById(id));
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysConfigController.java
New file
@@ -0,0 +1,46 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.model.TSysConfig;
import com.ruoyi.system.service.TSysConfigService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
 * <p>
 * 系统配置-协议管理-其他设置 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-08-20
 */
@Api(tags = "系统配置-协议管理-其他设置")
@RestController
@RequestMapping("/t-sys-config")
public class TSysConfigController {
    private final TSysConfigService sysConfigService;
    @Autowired
    public TSysConfigController(TSysConfigService sysConfigService) {
        this.sysConfigService = sysConfigService;
    }
    /**
     * 查看系统配置-协议管理-其他设置详情
     */
    @ApiOperation(value = "查看系统配置-协议管理-其他设置详情",notes = "配置类型 1=用户协议 2=隐私协议 3=其他设置")
    @GetMapping(value = "/getDetailById")
    public R<TSysConfig> getDetailById(@RequestParam Integer configType) {
        TSysConfig sysConfig = sysConfigService.getOne(Wrappers.<TSysConfig>lambdaQuery().eq(TSysConfig::getConfigType, configType)
                .last("LIMIT 1"));
        return R.ok(sysConfig);
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysEducationalInfoController.java
New file
@@ -0,0 +1,74 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TSysEducationalInfo;
import com.ruoyi.system.query.TSysEducationalInfoQuery;
import com.ruoyi.system.service.TSysEducationalInfoService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * 教育资讯 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-08-20
 */
@Api(tags = "教育资讯")
@RestController
@RequestMapping("/t-sys-educational-info")
public class TSysEducationalInfoController {
    private final TSysEducationalInfoService sysEducationalInfoService;
    private final TokenService tokenService;
    @Autowired
    public TSysEducationalInfoController(TSysEducationalInfoService sysEducationalInfoService, TokenService tokenService) {
        this.sysEducationalInfoService = sysEducationalInfoService;
        this.tokenService = tokenService;
    }
    /**
     * 获取教育资讯管理列表
     */
    @ApiOperation(value = "获取教育资讯分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TSysEducationalInfo>> pageList(@RequestBody TSysEducationalInfoQuery query) {
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        if(roleType == 5){
            query.setRoleType(roleType);
        }
        return R.ok(sysEducationalInfoService.pageList(query));
    }
    /**
     * 获取教育资讯管理列表
     */
    @ApiOperation(value = "获取教育资讯列表")
    @PostMapping(value = "/list")
    public R<List<TSysEducationalInfo>> list() {
        return R.ok(sysEducationalInfoService.list(Wrappers.lambdaQuery(TSysEducationalInfo.class).orderByDesc(TSysEducationalInfo::getCreateTime)));
    }
    /**
     * 查看教育资讯详情
     */
    @ApiOperation(value = "查看教育资讯详情")
    @GetMapping(value = "/getDetailById")
    public R<TSysEducationalInfo> getDetailById(@RequestParam String id) {
        return R.ok(sysEducationalInfoService.getById(id));
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysProductIntroductionController.java
New file
@@ -0,0 +1,74 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TSysProductIntroduction;
import com.ruoyi.system.query.TSysProductIntroductionQuery;
import com.ruoyi.system.service.TSysProductIntroductionService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * 产品介绍 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-08-20
 */
@Api(tags = "产品介绍")
@RestController
@RequestMapping("/t-sys-product-introduction")
public class TSysProductIntroductionController {
    private final TSysProductIntroductionService sysProductIntroductionService;
    private final TokenService tokenService;
    @Autowired
    public TSysProductIntroductionController(TSysProductIntroductionService sysProductIntroductionService, TokenService tokenService) {
        this.sysProductIntroductionService = sysProductIntroductionService;
        this.tokenService = tokenService;
    }
    /**
     * 获取产品介绍管理列表
     */
    @ApiOperation(value = "获取产品介绍分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TSysProductIntroduction>> pageList(@RequestBody TSysProductIntroductionQuery query) {
        Integer roleType = tokenService.getLoginUser().getUser().getRoleType();
        if(roleType == 5){
            query.setRoleType(roleType);
        }
        return R.ok(sysProductIntroductionService.pageList(query));
    }
    /**
     * 获取产品介绍管理列表
     */
    @ApiOperation(value = "获取产品介绍列表")
    @PostMapping(value = "/list")
    public R<List<TSysProductIntroduction>> list() {
        return R.ok(sysProductIntroductionService.list(Wrappers.lambdaQuery(TSysProductIntroduction.class).orderByDesc(TSysProductIntroduction::getCreateTime)));
    }
    /**
     * 查看产品介绍详情
     */
    @ApiOperation(value = "查看产品介绍详情")
    @GetMapping(value = "/getDetailById")
    public R<TSysProductIntroduction> getDetailById(@RequestParam String id) {
        return R.ok(sysProductIntroductionService.getById(id));
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/TSysQualificationsController.java
New file
@@ -0,0 +1,67 @@
package com.ruoyi.web.controller.api;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.basic.PageInfo;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.system.model.TSysQualifications;
import com.ruoyi.system.query.TSysQualificationsQuery;
import com.ruoyi.system.service.TSysQualificationsService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * 资质管理 前端控制器
 * </p>
 *
 * @author xiaochen
 * @since 2025-08-20
 */
@Api(tags = "资质管理")
@RestController
@RequestMapping("/t-sys-qualifications")
public class TSysQualificationsController {
    private final TSysQualificationsService sysQualificationsService;
    @Autowired
    public TSysQualificationsController(TSysQualificationsService sysQualificationsService) {
        this.sysQualificationsService = sysQualificationsService;
    }
    /**
     * 获取资质管理管理列表
     */
    @ApiOperation(value = "获取资质管理分页列表")
    @PostMapping(value = "/pageList")
    public R<PageInfo<TSysQualifications>> pageList(@RequestBody TSysQualificationsQuery query) {
        return R.ok(sysQualificationsService.pageList(query));
    }
    /**
     * 获取资质管理管理列表
     */
    @ApiOperation(value = "获取资质管理列表")
    @PostMapping(value = "/list")
    public R<List<TSysQualifications>> list() {
        return R.ok(sysQualificationsService.list(Wrappers.lambdaQuery(TSysQualifications.class).orderByDesc(TSysQualifications::getCreateTime)));
    }
    /**
     * 查看资质管理详情
     */
    @ApiOperation(value = "查看资质管理详情")
    @GetMapping(value = "/getDetailById")
    public R<TSysQualifications> getDetailById(@RequestParam String id) {
        return R.ok(sysQualificationsService.getById(id));
    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/api/WxLoginController.java
@@ -2,22 +2,21 @@
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.TTenantResp;
import com.ruoyi.common.core.domain.entity.TSysUserResp;
import com.ruoyi.common.core.domain.model.LoginBody;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import com.ruoyi.common.core.utils.HttpUtils;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TSysAppUser;
import com.ruoyi.system.service.TSysAppUserService;
import com.ruoyi.system.utils.wx.body.resp.Code2SessionRespBody;
import com.ruoyi.system.utils.wx.body.resq.Code2SessionResqBody;
import com.ruoyi.system.utils.wx.model.WeixinProperties;
@@ -27,6 +26,7 @@
import com.ruoyi.system.utils.wx.tools.WxUtils;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -57,86 +57,80 @@
    private RestTemplate wxRestTemplate;
    @Resource
    private RedisService redisService;
    /**
     * 上传文件存储在本地的根路径
     */
//    @Value("${file.upload.location}")
//    private String localFilePath;
    @Resource
    private TSysAppUserService sysAppUserService;
    @Resource
    private TokenService tokenService;
    @Autowired
    private SysLoginService loginService;
    /**
     * 账号密码登录
     *
     * @param loginBody 登录信息
     * @return 结果
     */
    @ApiOperation(value = "账号密码登录",notes = "管理员账号密码登录")
    @PostMapping("/login")
    public AjaxResult login(@RequestBody LoginBody loginBody)
    {
        AjaxResult ajax = AjaxResult.success();
        // 生成令牌
        LoginUser loginUser = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
                loginBody.getUuid());
        ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
        List<SysRole> roles = loginUser.getUser().getRoles();
        if(CollectionUtils.isEmpty(roles)){
            return AjaxResult.error("请关联角色!");
        }
        if(roles.get(0).getStatus() == 1){
            return AjaxResult.error("该账号角色已被禁用!");
        }
        return ajax;
    }
    @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"})
    @PostMapping("/openIdByJsCode")
    public R<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) {
        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode());
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode()));
        String openid = body.getOpenid();
        String sessionKey = body.getSessionKey();
        // 用户信息解密 数据验签
//        if (StringUtils.isNotBlank(data.getSignature())) {
//            WxUtils.verifySignature(data.getRawData(), sessionKey, data.getSignature());
//    /**
//     * 账号密码登录
//     *
//     * @param loginBody 登录信息
//     * @return 结果
//     */
//    @ApiOperation(value = "账号密码登录",notes = "管理员账号密码登录")
//    @PostMapping("/login")
//    public AjaxResult login(@RequestBody LoginBody loginBody)
//    {
//        AjaxResult ajax = AjaxResult.success();
//        // 生成令牌
//        LoginUser loginUser = loginService.login(loginBody.getUsername(), loginBody.getPassword(), loginBody.getCode(),
//                loginBody.getUuid());
//        ajax.put(Constants.TOKEN, tokenService.createToken(loginUser));
//        List<SysRole> roles = loginUser.getUser().getRoles();
//        if(CollectionUtils.isEmpty(roles)){
//            return AjaxResult.error("请关联角色!");
//        }
        if(StringUtils.isEmpty(data.getEncryptedData()) || StringUtils.isEmpty(data.getIv())){
            return R.fail("已拒绝授权");
        }
        AppletUserDecodeData appletUserDecodeData = WxUtils.encryptedData(data.getEncryptedData(), sessionKey,  data.getIv());
        appletUserDecodeData.setOpenId(openid);
        // 先使用openId和当前手机号进行查询
//        TTenant tenant = tTenantService.getOne(Wrappers.lambdaQuery(TTenant.class)
//                .and(e->e.eq(TTenant::getOpenId, appletUserDecodeData.getOpenId()).or()
//                .eq(TTenant::getPhone, appletUserDecodeData.getPhoneNumber())));
//        if (tenant==null){
//        if(roles.get(0).getStatus() == 1){
//            return AjaxResult.error("该账号角色已被禁用!");
//        }
//        return ajax;
//    }
//
//    @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"})
//    @PostMapping("/openIdByJsCode")
//    public R<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) {
//        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode());
//        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
//        Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode()));
//        String openid = body.getOpenid();
//        String sessionKey = body.getSessionKey();
//        // 用户信息解密 数据验签
////        if (StringUtils.isNotBlank(data.getSignature())) {
////            WxUtils.verifySignature(data.getRawData(), sessionKey, data.getSignature());
////        }
//        if(StringUtils.isEmpty(data.getEncryptedData()) || StringUtils.isEmpty(data.getIv())){
//            return R.fail("已拒绝授权");
//        }
//        AppletUserDecodeData appletUserDecodeData = WxUtils.encryptedData(data.getEncryptedData(), sessionKey,  data.getIv());
//        appletUserDecodeData.setOpenId(openid);
//        // 先使用openId和当前手机号进行查询
//        TSysAppUser sysAppUser = sysAppUserService.getOne(Wrappers.lambdaQuery(TSysAppUser.class)
//                .and(e->e.eq(TSysAppUser::getOpenId, appletUserDecodeData.getOpenId()).or()
//                .eq(TSysAppUser::getPhone, appletUserDecodeData.getPhoneNumber())));
//        if (sysAppUser==null){
////            appUser.setTenantAttributes();
////            appUser.setTenantType();
//            tenant = new TTenant();
//            tenant.setPhone(appletUserDecodeData.getPhoneNumber());
//            tenant.setAccount(appletUserDecodeData.getPhoneNumber());
//            tenant.setPassword(SecurityUtils.encryptPassword(appletUserDecodeData.getPhoneNumber().substring(5)));
//            tenant.setOpenId(appletUserDecodeData.getOpenId());
//            sysAppUser = new TSysAppUser();
//            sysAppUser.setPhone(appletUserDecodeData.getPhoneNumber());
////            sysAppUser.setAccount(appletUserDecodeData.getPhoneNumber());
////            sysAppUser.setPassword(SecurityUtils.encryptPassword(appletUserDecodeData.getPhoneNumber().substring(5)));
//            sysAppUser.setOpenId(appletUserDecodeData.getOpenId());
//            // 手机号中间四位替换为*
//            tenant.setResidentName(appletUserDecodeData.getPhoneNumber().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
//            tTenantService.save(tenant);
//            sysAppUser.setNickName(appletUserDecodeData.getPhoneNumber().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
//            sysAppUserService.save(sysAppUser);
//        }
//        LoginUserApplet loginUserApplet = new LoginUserApplet();
//        TTenantResp tTenantResp = new TTenantResp();
//        BeanUtils.copyProperties(tenant, tTenantResp);
//        tTenantResp.setResidentName(appletUserDecodeData.getPhoneNumber());
//        loginUserApplet.setUser(tTenantResp);
//        loginUserApplet.setUserId(tenant.getId());
        Map<String, Object> tokenInfos = new HashMap<>();
//        TSysUserResp sysUserResp = new TSysUserResp();
//        BeanUtils.copyProperties(sysAppUser, sysUserResp);
//        loginUserApplet.setUser(sysUserResp);
//        loginUserApplet.setUserId(sysAppUser.getId());
//        Map<String, Object> tokenInfos = new HashMap<>();
//        tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet));
//        tokenInfos.put("info",loginUserApplet);
        return R.ok(tokenInfos);
    }
//        return R.ok(tokenInfos);
//    }
    
    
@@ -210,41 +204,41 @@
    }
    
    
    /**
     * 敏感词检测
     * @param content
     * @param openid
     * @return
     */
    @PostMapping("/sensitiveWordDetection")
    public R<Boolean> sensitiveWordDetection (@RequestParam("content") String content, @RequestParam("openid") String openid){
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        String accessToken = appletTools.getAccessToken("");
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("content", content);
        jsonObject.put("version", 2);
        jsonObject.put("scene", 2);
        jsonObject.put("openid", openid);
        String post = HttpUtils.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + accessToken, jsonObject.toString());
        JSONObject object = JSONObject.parseObject(post);
        Integer errcode = object.getInteger("errcode");
        if(0 != errcode){
            throw new RuntimeException(object.getString("errmsg"));
        }
        JSONArray detail = object.getJSONArray("detail");
        for (int i = 0; i < detail.size(); i++) {
            JSONObject jsonObject1 = detail.getJSONObject(i);
            Integer errcode1 = jsonObject1.getInteger("errcode");
            if(0 == errcode1){
                String suggest = jsonObject1.getString("suggest");
                Integer label = jsonObject1.getInteger("label");
                String keyword = jsonObject1.getString("keyword");
                Integer prob = jsonObject1.getInteger("prob");
                if(("risky".equals(suggest) || "review".equals(suggest)) && 100 != label && com.ruoyi.common.utils.StringUtils.isNotEmpty(keyword) && 80 <= prob){
                    return R.ok(true);
                }
            }
        }
        return R.ok(false);
    }
//    /**
//     * 敏感词检测
//     * @param content
//     * @param openid
//     * @return
//     */
//    @PostMapping("/sensitiveWordDetection")
//    public R<Boolean> sensitiveWordDetection (@RequestParam("content") String content, @RequestParam("openid") String openid){
//        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
//        String accessToken = appletTools.getAccessToken("");
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("content", content);
//        jsonObject.put("version", 2);
//        jsonObject.put("scene", 2);
//        jsonObject.put("openid", openid);
//        String post = HttpUtils.post("https://api.weixin.qq.com/wxa/msg_sec_check?access_token=" + accessToken, jsonObject.toString());
//        JSONObject object = JSONObject.parseObject(post);
//        Integer errcode = object.getInteger("errcode");
//        if(0 != errcode){
//            throw new RuntimeException(object.getString("errmsg"));
//        }
//        JSONArray detail = object.getJSONArray("detail");
//        for (int i = 0; i < detail.size(); i++) {
//            JSONObject jsonObject1 = detail.getJSONObject(i);
//            Integer errcode1 = jsonObject1.getInteger("errcode");
//            if(0 == errcode1){
//                String suggest = jsonObject1.getString("suggest");
//                Integer label = jsonObject1.getInteger("label");
//                String keyword = jsonObject1.getString("keyword");
//                Integer prob = jsonObject1.getInteger("prob");
//                if(("risky".equals(suggest) || "review".equals(suggest)) && 100 != label && com.ruoyi.common.utils.StringUtils.isNotEmpty(keyword) && 80 <= prob){
//                    return R.ok(true);
//                }
//            }
//        }
//        return R.ok(false);
//    }
}
ruoyi-applet/src/main/java/com/ruoyi/web/controller/system/SysLoginController.java
@@ -1,17 +1,34 @@
package com.ruoyi.web.controller.system;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.ruoyi.common.core.domain.R;
import com.ruoyi.common.core.domain.entity.SysRole;
import com.ruoyi.common.core.domain.entity.TSysUserResp;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import com.ruoyi.common.core.redis.RedisCache;
import com.ruoyi.common.redis.service.RedisService;
import com.ruoyi.framework.web.service.TokenService;
import com.ruoyi.system.model.TSysAppUser;
import com.ruoyi.system.service.ISysRoleService;
import com.ruoyi.system.service.TSysAppUserService;
import com.ruoyi.system.utils.wx.body.resp.Code2SessionRespBody;
import com.ruoyi.system.utils.wx.body.resq.Code2SessionResqBody;
import com.ruoyi.system.utils.wx.model.WeixinProperties;
import com.ruoyi.system.utils.wx.pojo.AppletUserDecodeData;
import com.ruoyi.system.utils.wx.pojo.AppletUserEncrypteData;
import com.ruoyi.system.utils.wx.tools.WxAppletTools;
import com.ruoyi.system.utils.wx.tools.WxUtils;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
@@ -25,12 +42,16 @@
import com.ruoyi.framework.web.service.SysLoginService;
import com.ruoyi.framework.web.service.SysPermissionService;
import com.ruoyi.system.service.ISysMenuService;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
/**
 * 登录验证
 * 
 * @author ruoyi
 */
@Slf4j
@Api(tags = "登录")
@RestController
public class SysLoginController
@@ -49,7 +70,14 @@
    private TokenService tokenService;
    @Autowired
    private ISysRoleService roleService;
    @Autowired
    private WeixinProperties wxConfig;
    @Autowired
    private RestTemplate wxRestTemplate;
    @Resource
    private RedisService redisService;
    @Resource
    private TSysAppUserService sysAppUserService;
    /**
     * 账号密码登录
     * 
@@ -81,6 +109,50 @@
        return ajax;
    }
    @ApiOperation(value = "通过code获得openid,获取用户信息",tags = {"微信小程序登录"})
    @PostMapping("/openIdByJsCode")
    public R<Map<String, Object>> openIdByJsCode(@RequestBody AppletUserEncrypteData data) {
        log.info("<<<<<<<<换取openid开始<<<<<<<<:{}", data.getCode());
        WxAppletTools appletTools = new WxAppletTools(wxRestTemplate, wxConfig, redisService);
        Code2SessionRespBody body = appletTools.getOpenIdByJscode2session(new Code2SessionResqBody().build(data.getCode()));
        String openid = body.getOpenid();
        String sessionKey = body.getSessionKey();
        // 用户信息解密 数据验签
//        if (StringUtils.isNotBlank(data.getSignature())) {
//            WxUtils.verifySignature(data.getRawData(), sessionKey, data.getSignature());
//        }
        if(StringUtils.isEmpty(data.getEncryptedData()) || StringUtils.isEmpty(data.getIv())){
            return R.fail("已拒绝授权");
        }
        AppletUserDecodeData appletUserDecodeData = WxUtils.encryptedData(data.getEncryptedData(), sessionKey,  data.getIv());
        appletUserDecodeData.setOpenId(openid);
        // 先使用openId和当前手机号进行查询
        TSysAppUser sysAppUser = sysAppUserService.getOne(Wrappers.lambdaQuery(TSysAppUser.class)
                .and(e->e.eq(TSysAppUser::getOpenId, appletUserDecodeData.getOpenId()).or()
                        .eq(TSysAppUser::getPhone, appletUserDecodeData.getPhoneNumber())));
        if (sysAppUser==null){
//            appUser.setTenantAttributes();
//            appUser.setTenantType();
            sysAppUser = new TSysAppUser();
            sysAppUser.setPhone(appletUserDecodeData.getPhoneNumber());
//            sysAppUser.setAccount(appletUserDecodeData.getPhoneNumber());
//            sysAppUser.setPassword(SecurityUtils.encryptPassword(appletUserDecodeData.getPhoneNumber().substring(5)));
            sysAppUser.setOpenId(appletUserDecodeData.getOpenId());
            // 手机号中间四位替换为*
            sysAppUser.setNickName(appletUserDecodeData.getPhoneNumber().replaceAll("(\\d{3})\\d{4}(\\d{4})", "$1****$2"));
            sysAppUserService.save(sysAppUser);
        }
        LoginUserApplet loginUserApplet = new LoginUserApplet();
        TSysUserResp sysUserResp = new TSysUserResp();
        BeanUtils.copyProperties(sysAppUser, sysUserResp);
        loginUserApplet.setUser(sysUserResp);
        loginUserApplet.setUserId(sysAppUser.getId());
        Map<String, Object> tokenInfos = new HashMap<>();
        tokenInfos.put("token",tokenService.createTokenApplet(loginUserApplet));
        tokenInfos.put("info",loginUserApplet);
        return R.ok(tokenInfos);
    }
    /**
     * 账号密码登录
     *
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TSysUserResp.java
New file
@@ -0,0 +1,61 @@
package com.ruoyi.common.core.domain.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.BaseModel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.validation.constraints.NotBlank;
import java.time.LocalDate;
import java.time.LocalDateTime;
/**
 * <p>
 * 租户
 * </p>
 *
 * @author xiaochen
 * @since 2025-01-20
 */
@Data
@EqualsAndHashCode(callSuper = false)
@ApiModel(value="TTenant对象", description="登录返回")
public class TSysUserResp  {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.ASSIGN_ID)
    private String id;
    @ApiModelProperty(value = "用户姓名")
    private String nickName;
    @ApiModelProperty(value = "手机号")
    private String phone;
    @ApiModelProperty(value = "出生日期")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime birthTime;
    @ApiModelProperty(value = "性别 1=男 2=女")
    private Integer sex;
    @ApiModelProperty(value = "微信openid")
    private String openId;
    @ApiModelProperty(value = "慢性病id,逗号分割")
    private String chronicDiseaseId;
    @ApiModelProperty(value = "状态 1=使用中 2=冻结")
    private Integer status;
    @ApiModelProperty(value = "上次短信提醒时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime lastReminderTime;
}
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/entity/TTenantResp.java
File was deleted
ruoyi-common/src/main/java/com/ruoyi/common/core/domain/model/LoginUserApplet.java
@@ -2,7 +2,7 @@
import com.alibaba.fastjson2.annotation.JSONField;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TTenantResp;
import com.ruoyi.common.core.domain.entity.TSysUserResp;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
@@ -73,20 +73,20 @@
    /**
     * 用户信息
     */
    private TTenantResp user;
    private TSysUserResp user;
    public LoginUserApplet()
    {
    }
    public LoginUserApplet(TTenantResp user, Set<String> permissions)
    public LoginUserApplet(TSysUserResp user, Set<String> permissions)
    {
        this.user = user;
        this.permissions = permissions;
    }
    public LoginUserApplet(String userId, Long deptId, TTenantResp user, Set<String> permissions)
    public LoginUserApplet(String userId, Long deptId, TSysUserResp user, Set<String> permissions)
    {
        this.userId = userId;
        this.deptId = deptId;
@@ -128,13 +128,13 @@
    @Override
    public String getPassword()
    {
        return user.getPassword();
        return null;
    }
    @Override
    public String getUsername()
    {
        return user.getResidentName();
        return user.getNickName();
    }
    /**
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/SysLoginService.java
@@ -5,7 +5,7 @@
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.UserConstants;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.common.core.domain.entity.TTenantResp;
import com.ruoyi.common.core.domain.entity.TSysUserResp;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.core.domain.model.LoginUserApplet;
import com.ruoyi.common.core.redis.RedisCache;
ruoyi-framework/src/main/java/com/ruoyi/framework/web/service/TokenService.java
@@ -353,7 +353,7 @@
        return token;
    }
    private String getTokenKey(String uuid)
    public String getTokenKey(String uuid)
    {
        return CacheConstants.LOGIN_TOKEN_KEY + uuid;
    }
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TCrmClinicMapper.java
@@ -26,5 +26,12 @@
     * @return
     */
    List<TCrmClinicVO> pageList(@Param("query") TCrmClinicQuery query, @Param("pageInfo")PageInfo<TCrmClinicVO> pageInfo);
    /**
     * 分页列表
     * @param query
     * @param pageInfo
     * @return
     */
    List<TCrmClinicVO> pageAuditList(@Param("query") TCrmClinicQuery query, @Param("pageInfo")PageInfo<TCrmClinicVO> pageInfo);
}
ruoyi-system/src/main/java/com/ruoyi/system/mapper/TSysOrderMapper.java
@@ -20,8 +20,8 @@
    /**
     * 根据appUserId查询订单列表
     *
     * @param id appUserId
     * @param appUserId
     * @return 订单列表
     */
    List<TSysOrderVO> queryListByAppUserId(@Param("id") String id);
    List<TSysOrderVO> queryListByAppUserId(@Param("appUserId") String appUserId);
}
ruoyi-system/src/main/java/com/ruoyi/system/query/TCrmClinicQuery.java
@@ -30,4 +30,9 @@
    @ApiModelProperty(value = "状态 1=待审核 2=已拒绝 3=使用中 4=冻结")
    private Integer status;
    @ApiModelProperty(value = "前端忽略")
    private Long userId;
    @ApiModelProperty(value = "前端忽略")
    private Integer roleType;
}
ruoyi-system/src/main/java/com/ruoyi/system/service/TCrmClinicService.java
@@ -24,6 +24,12 @@
     * @return
     */
    PageInfo<TCrmClinicVO> pageList(TCrmClinicQuery query);
    /**
     * 获取crm诊所管理审核分页列表
     * @param query
     * @return
     */
    PageInfo<TCrmClinicVO> pageAuditList(TCrmClinicQuery query);
    /**
     * 添加crm诊所管理
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TCrmClinicServiceImpl.java
@@ -46,6 +46,17 @@
    }
    @Override
    public PageInfo<TCrmClinicVO> pageAuditList(TCrmClinicQuery query) {
        // TODO 业绩状态查询处理
        PageInfo<TCrmClinicVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TCrmClinicVO> list = this.baseMapper.pageAuditList(query,pageInfo);
        pageInfo.setRecords(list);
        return pageInfo;
    }
    @Override
    public R<Boolean> addClinic(TCrmClinicDTO dto) {
        // 判断账号是否已存在
        SysUser sysUser = sysUserService.selectUserByUserName(dto.getPhone());
ruoyi-system/src/main/java/com/ruoyi/system/service/impl/TSysAppUserServiceImpl.java
@@ -17,6 +17,8 @@
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.time.temporal.ChronoUnit;
import java.util.List;
import java.util.stream.Collectors;
@@ -38,6 +40,16 @@
    public PageInfo<TSysAppUserVO> pageList(TSysAppUserQuery query) {
        PageInfo<TSysAppUserVO> pageInfo = new PageInfo<>(query.getPageNum(), query.getPageSize());
        List<TSysAppUserVO> list = this.baseMapper.pageList(query,pageInfo);
        if(CollectionUtils.isEmpty(list)){
            return pageInfo;
        }
        // 年龄计算
        list.forEach(tSysAppUserVO -> {
            if(tSysAppUserVO.getBirthTime() != null){
                long age = ChronoUnit.YEARS.between(tSysAppUserVO.getBirthTime(), LocalDateTime.now());
                tSysAppUserVO.setAge(age);
            }
        });
        pageInfo.setRecords(list);
        return pageInfo;
    }
ruoyi-system/src/main/java/com/ruoyi/system/vo/TCrmClinicVO.java
@@ -5,6 +5,8 @@
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
@Data
@ApiModel(value = "crm诊所管理VO")
public class TCrmClinicVO extends TCrmClinic {
@@ -18,4 +20,10 @@
    @ApiModelProperty(value = "仓库名称")
    private String warehouseName;
    @ApiModelProperty(value = "当月采购金额")
    private BigDecimal monthPurchaseAmount;
    @ApiModelProperty(value = "业绩状态 1=未达成 2=已达成")
    private Integer performanceStatus;
}
ruoyi-system/src/main/java/com/ruoyi/system/vo/TSysAppUserVO.java
@@ -31,4 +31,7 @@
    @ApiModelProperty(value = "慢性病名称拼接")
    private String sysChronicDiseaseNames;
    @ApiModelProperty(value = "年龄")
    private Long age;
}
ruoyi-system/src/main/resources/mapper/system/TCrmClinicMapper.xml
@@ -61,6 +61,49 @@
            <if test="query.status != null">
                and tcc.status = #{query.status}
            </if>
            <if test="query.userId != null and query.userId == 2">
                and tcc.branch_id = #{query.userId}
            </if>
            <if test="query.userId != null and query.userId == 3">
                and tcc.salesperson_id = #{query.userId}
            </if>
            AND tcc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
        ORDER BY tcc.create_time DESC
    </select>
    <select id="pageAuditList" resultType="com.ruoyi.system.vo.TCrmClinicVO">
        SELECT
        tcc.id, tcc.branch_id, tcc.salesperson_id, tcc.warehouse_id,tcc.user_id, tcc.clinic_name, tcc.person_charge_name,
        tcc.phone, tcc.low_procurement_money, tcc.clinic_address, tcc.qualification_picture, tcc.status,tcc.audit_remark,
        tcc.create_time, tcc.update_time, tcc.create_by, tcc.update_by, tcc.disabled,
        tcb.branch_name, tcs.salesperson_name, tcw.warehouse_name
        from t_crm_clinic tcc
        left join t_crm_branch tcb on tcc.branch_id = tcb.id
        left join t_crm_salesperson tcs on tcc.salesperson_id = tcs.id
        left join t_crm_warehouse tcw on tcc.warehouse_id = tcw.id
        <where>
            <if test="query.clinicName != null and query.clinicName != ''">
                and tcc.clinic_name like concat('%',#{query.clinicName},'%')
            </if>
            <if test="query.personChargeName != null and query.personChargeName != ''">
                and tcc.person_charge_name like concat('%',#{query.personChargeName},'%')
            </if>
            <if test="query.phone != null and query.phone != ''">
                and tcc.phone like concat('%',#{query.phone},'%')
            </if>
            <if test="query.branchId != null and query.branchId != ''">
                and tcc.branch_id = #{query.branchId}
            </if>
            <if test="query.salespersonId != null and query.salespersonId != ''">
                and tcc.salesperson_id = #{query.salespersonId}
            </if>
<!--            <if test="query.performanceStatus != null">-->
<!--                and tcc.salesperson_id = #{query.performanceStatus}-->
<!--            </if>-->
            <if test="query.status != null">
                and tcc.status = #{query.status}
            </if>
            and tcc.status in (1,2)
            AND tcc.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
        ORDER BY tcc.create_time DESC
ruoyi-system/src/main/resources/mapper/system/TSysAppUserMapper.xml
@@ -68,6 +68,7 @@
            <if test="query.inspectionId != null and query.inspectionId != ''">
                and FIND_IN_SET(#{query.inspectionId},tsau.chronic_disease_id)
            </if>
            AND tsau.chronic_disease_id IS NOT NULL
            AND tsau.disabled = ${@com.ruoyi.common.enums.DisabledEnum@NO.getCode()}
        </where>
        ORDER BY tsau.create_time DESC