Просмотр исходного кода

销售公司备用小程序和销售更换企微主体

xw 9 часов назад
Родитель
Сommit
8fb3d9a968

+ 18 - 2
fs-company/src/main/java/com/fs/company/controller/company/CompanyConfigController.java

@@ -8,6 +8,7 @@ import com.fs.common.utils.StringUtils;
 import com.fs.company.domain.CompanyConfig;
 import com.fs.company.domain.CompanyConfig;
 import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.param.SaveCompanyMiniAppParam;
 import com.fs.company.param.SaveCompanyMiniAppParam;
+import com.fs.company.param.UpdateMiniAppMasterServerParam;
 import com.fs.company.service.ICompanyConfigService;
 import com.fs.company.service.ICompanyConfigService;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.company.service.ICompanyMiniappService;
 import com.fs.company.vo.CompanyMiniAppVO;
 import com.fs.company.vo.CompanyMiniAppVO;
@@ -87,11 +88,25 @@ public class CompanyConfigController extends BaseController
 
 
     }
     }
 
 
+    /**
+     * 更新主备小程序(miniAppMaster、miniAppServer)
+     * 仅允许修改当前登录用户所属公司的配置,companyId 从登录态获取,不可篡改
+     */
+    @PutMapping(value = "/miniAppMasterServer")
+    public R updateMiniAppMasterServer(@RequestBody UpdateMiniAppMasterServerParam param)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (loginUser == null || loginUser.getCompany() == null) {
+            return R.error("用户信息错误");
+        }
+        Long companyId = loginUser.getCompany().getCompanyId();
+        return companyConfigService.updateMiniAppMasterServer(companyId, param);
+    }
+
     /**
     /**
      * 获取公司可配置小程序列表
      * 获取公司可配置小程序列表
      * @return
      * @return
      */
      */
-    @PreAuthorize("@ss.hasPermi('company:miniConfig:list')")
     @GetMapping(value = "/getCompanyMiniAppList")
     @GetMapping(value = "/getCompanyMiniAppList")
     public R getCompanyMiniAppList()
     public R getCompanyMiniAppList()
     {
     {
@@ -100,7 +115,8 @@ public class CompanyConfigController extends BaseController
             return R.error("用户信息错误");
             return R.error("用户信息错误");
         }
         }
         Long companyId = loginUser.getCompany().getCompanyId();
         Long companyId = loginUser.getCompany().getCompanyId();
-        List<CompanyMiniAppVO> companyMiniAppList = companyConfigService.getCompanyMiniAppList(companyId);
+        // 公司端配置主备小程序时,只展示当前公司在 fs_course_play_source_config 中配置的小程序
+        List<CompanyMiniAppVO> companyMiniAppList = companyConfigService.getCompanyMiniAppListByCompany(companyId);
         SaveCompanyMiniAppParam param = companyConfigService.getCurrentCompanyMiniApp(companyId);
         SaveCompanyMiniAppParam param = companyConfigService.getCurrentCompanyMiniApp(companyId);
         return R.ok().put("data",companyMiniAppList).put("current",param);
         return R.ok().put("data",companyMiniAppList).put("current",param);
 
 

+ 200 - 0
fs-company/src/main/java/com/fs/company/controller/qw/QwCompanyController.java

@@ -0,0 +1,200 @@
+package com.fs.company.controller.qw;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import cn.hutool.json.JSONUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fs.common.core.domain.R;
+import com.fs.common.utils.ServletUtils;
+import com.fs.framework.security.LoginUser;
+import com.fs.course.config.CourseConfig;
+import com.fs.course.domain.FsCoursePlaySourceConfig;
+import com.fs.course.service.IFsCoursePlaySourceConfigService;
+import com.fs.framework.service.TokenService;
+import com.fs.qw.vo.QwOptionsVO;
+import com.fs.system.service.ISysConfigService;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.beans.factory.annotation.Autowired;
+
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.PutMapping;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+import com.fs.common.annotation.Log;
+import com.fs.common.core.controller.BaseController;
+import com.fs.common.core.domain.AjaxResult;
+import com.fs.common.enums.BusinessType;
+import com.fs.qw.domain.QwCompany;
+import com.fs.qw.service.IQwCompanyService;
+import com.fs.common.utils.poi.ExcelUtil;
+import com.fs.common.core.page.TableDataInfo;
+
+/**
+ * 企微主体Controller
+ *
+ * @author fs
+ * @date 2024-10-09
+ */
+@RestController
+@RequestMapping("/qw/qwCompany")
+public class QwCompanyController extends BaseController
+{
+    @Autowired
+    private IQwCompanyService qwCompanyService;
+    @Autowired
+    private TokenService tokenService;
+    @Autowired
+    private ISysConfigService configService;
+    @Autowired
+    private IFsCoursePlaySourceConfigService coursePlaySourceConfigService;
+
+    /**
+     * 查询企微主体列表(仅查询登录公司下的主体)
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwCompany:list')")
+    @GetMapping("/list")
+    public TableDataInfo list(QwCompany qwCompany)
+    {
+        startPage();
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        // 只查询登录公司下的主体
+        if (loginUser != null && loginUser.getCompany() != null && loginUser.getCompany().getCompanyId() != null) {
+            qwCompany.setCompanyIds(String.valueOf(loginUser.getCompany().getCompanyId()));
+        }
+        List<QwCompany> list = qwCompanyService.selectQwCompanyList(qwCompany);
+        return getDataTable(list);
+    }
+
+
+    @GetMapping("/all")
+    public R all()
+    {
+        Long userId = null;
+        Long deptId = null;
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        String json = configService.selectConfigByKey("course.config");
+        CourseConfig config = json != null ? JSONUtil.toBean(json, CourseConfig.class) : null;
+        boolean isAdmin = loginUser != null && loginUser.getUser() != null && loginUser.getUser().isAdmin();
+        if (!isAdmin && config != null) {
+            if (Boolean.TRUE.equals(config.getDept())) {
+                deptId = loginUser.getUser() != null ? loginUser.getUser().getDeptId() : null;
+            } else {
+                userId = loginUser.getUser() != null ? loginUser.getUser().getUserId() : null;
+            }
+        }
+        List<QwOptionsVO> list = qwCompanyService.selectQwCompanyListOptionsVO(userId, deptId);
+        return R.ok().put("data", list);
+    }
+    /**
+     * 导出企微主体列表
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwCompany:export')")
+    @Log(title = "企微主体", businessType = BusinessType.EXPORT, isStoreLog = true)
+    @GetMapping("/export")
+    public AjaxResult export(QwCompany qwCompany)
+    {
+        List<QwCompany> list = qwCompanyService.selectQwCompanyList(qwCompany);
+        ExcelUtil<QwCompany> util = new ExcelUtil<QwCompany>(QwCompany.class);
+        return util.exportExcel(list, "企微主体数据");
+    }
+
+    /**
+     * 获取企微主体详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwCompany:query')")
+    @GetMapping(value = "/{id}")
+    public AjaxResult getInfo(@PathVariable("id") Long id)
+    {
+        return AjaxResult.success(qwCompanyService.selectQwCompanyById(id));
+    }
+
+    /**
+     * 新增企微主体
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwCompany:add')")
+    @Log(title = "企微主体", businessType = BusinessType.INSERT, isStoreLog = true)
+    @PostMapping
+    public AjaxResult add(@RequestBody QwCompany qwCompany)
+    {
+        LoginUser loginUser = tokenService.getLoginUser(ServletUtils.getRequest());
+        if (loginUser.getUser() != null) {
+            qwCompany.setCreateUserId(loginUser.getUser().getUserId());
+            qwCompany.setCreateDeptId(loginUser.getUser().getDeptId());
+        }
+        return toAjax(qwCompanyService.insertQwCompany(qwCompany));
+    }
+
+    /**
+     * 修改企微主体
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwCompany:edit')")
+    @Log(title = "企微主体", businessType = BusinessType.UPDATE, isStoreLog = true)
+    @PutMapping
+    public AjaxResult edit(@RequestBody QwCompany qwCompany)
+    {
+        return toAjax(qwCompanyService.updateQwCompany(qwCompany));
+    }
+
+
+    /**
+     * 批量更换勾选主体的小程序
+     */
+    @Log(title = "批量更换小程序", businessType = BusinessType.UPDATE)
+    @PostMapping("/batchUpdateMiniAppId")
+    public R batchUpdateMiniAppId(@RequestBody QwCompany qwCompany)
+    {
+        if (qwCompany.getMiniAppId() == null || qwCompany.getMiniAppId().trim().isEmpty()) {
+            return R.error("请选择小程序");
+        }
+        if (qwCompany.getIds() == null || qwCompany.getIds().length == 0) {
+            return R.error("请至少勾选一个企业微信主体");
+        }
+        return qwCompanyService.batchUpdateMiniAppId(qwCompany.getMiniAppId(), qwCompany.getIds());
+    }
+
+    /**
+     * 获取小程序配置列表
+     */
+    @GetMapping("/getMiniAppList")
+    public R getMiniAppList()
+    {
+        QueryWrapper<FsCoursePlaySourceConfig> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("type", 1);
+        queryWrapper.eq("is_del", 0);
+        queryWrapper.orderByDesc("create_time");
+
+        List<FsCoursePlaySourceConfig> configs = coursePlaySourceConfigService.list(queryWrapper);
+        if (configs == null || configs.isEmpty()) {
+            return R.ok().put("data", new ArrayList<>());
+        }
+        List<Map<String, String>> list = new ArrayList<>();
+        for (FsCoursePlaySourceConfig config : configs) {
+            if (config.getAppid() != null && !config.getAppid().trim().isEmpty()) {
+                Map<String, String> map = new HashMap<>();
+                map.put("label", config.getName() != null ? config.getName() : config.getAppid());
+                map.put("value", config.getAppid());
+                list.add(map);
+            }
+        }
+
+        return R.ok().put("data", list);
+    }
+
+    /**
+     * 删除企微主体
+     */
+    @PreAuthorize("@ss.hasPermi('qw:qwCompany:remove')")
+    @Log(title = "企微主体", businessType = BusinessType.DELETE, isStoreLog = true)
+	@DeleteMapping("/{ids}")
+    public AjaxResult remove(@PathVariable Long[] ids)
+    {
+        return toAjax(qwCompanyService.deleteQwCompanyByIds(ids));
+    }
+}

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

@@ -91,4 +91,13 @@ public interface CompanyConfigMapper
             "\n" +
             "\n" +
             "WHERE cm.`company_id` = #{companyId}")
             "WHERE cm.`company_id` = #{companyId}")
     List<CompanyMiniAppVO> getCompanyMiniAppList(@Param("companyId") Long companyId);
     List<CompanyMiniAppVO> getCompanyMiniAppList(@Param("companyId") Long companyId);
+
+    @Select("SELECT fcpsc.id,\n" +
+            "       fcpsc.company_id,\n" +
+            "       fcpsc.`name`,\n" +
+            "       fcpsc.appid\n" +
+            "FROM fs_course_play_source_config fcpsc\n" +
+            "WHERE fcpsc.is_del = 0\n" +
+            "  AND fcpsc.company_id = #{companyId}")
+    List<CompanyMiniAppVO> getCompanyMiniAppListByCompany(@Param("companyId") Long companyId);
 }
 }

+ 24 - 0
fs-service/src/main/java/com/fs/company/param/UpdateMiniAppMasterServerParam.java

@@ -0,0 +1,24 @@
+package com.fs.company.param;
+
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 更新主备小程序(miniAppMaster、miniAppServer)入参
+ *
+ * @author fs
+ */
+@Data
+public class UpdateMiniAppMasterServerParam {
+
+    /**
+     * 主小程序 appId 列表
+     */
+    private List<String> miniAppMaster;
+
+    /**
+     * 备小程序 appId 列表
+     */
+    private List<String> miniAppServer;
+}

+ 20 - 1
fs-service/src/main/java/com/fs/company/service/ICompanyConfigService.java

@@ -3,6 +3,7 @@ package com.fs.company.service;
 import com.fs.common.core.domain.R;
 import com.fs.common.core.domain.R;
 import com.fs.company.domain.CompanyConfig;
 import com.fs.company.domain.CompanyConfig;
 import com.fs.company.param.SaveCompanyMiniAppParam;
 import com.fs.company.param.SaveCompanyMiniAppParam;
+import com.fs.company.param.UpdateMiniAppMasterServerParam;
 import com.fs.company.vo.CompanyMiniAppVO;
 import com.fs.company.vo.CompanyMiniAppVO;
 
 
 import java.util.List;
 import java.util.List;
@@ -74,12 +75,20 @@ public interface ICompanyConfigService
     String selectRedPacketConfigByKey(Long companyId);
     String selectRedPacketConfigByKey(Long companyId);
 
 
     /**
     /**
-     * 获取公司可配置小程序列表
+     * 获取公司可配置小程序列表(原有接口,给销售等场景使用,保持原行为)
      * @param companyId
      * @param companyId
      * @return
      * @return
      */
      */
     List<CompanyMiniAppVO> getCompanyMiniAppList(Long companyId);
     List<CompanyMiniAppVO> getCompanyMiniAppList(Long companyId);
 
 
+    /**
+     * 获取当前公司自身在 fs_course_play_source_config 中配置的小程序列表
+     * 仅返回 company_id = 当前公司、is_del = 0 的记录
+     * @param companyId
+     * @return
+     */
+    List<CompanyMiniAppVO> getCompanyMiniAppListByCompany(Long companyId);
+
     SaveCompanyMiniAppParam getCurrentCompanyMiniApp(Long companyId);
     SaveCompanyMiniAppParam getCurrentCompanyMiniApp(Long companyId);
     /**
     /**
      * 公司编辑保存主备小程序数据
      * 公司编辑保存主备小程序数据
@@ -87,4 +96,14 @@ public interface ICompanyConfigService
      * @return
      * @return
      */
      */
     R saveCompanyMiniApp(SaveCompanyMiniAppParam param);
     R saveCompanyMiniApp(SaveCompanyMiniAppParam param);
+
+    /**
+     * 更新当前公司 miniAppConfig 中的主备小程序(miniAppMaster、miniAppServer)
+     * 仅允许修改本公司配置,companyId 必须为登录用户所属公司
+     *
+     * @param companyId 公司ID(必须为当前登录用户公司ID)
+     * @param param     主备小程序列表
+     * @return
+     */
+    R updateMiniAppMasterServer(Long companyId, UpdateMiniAppMasterServerParam param);
 }
 }

+ 57 - 0
fs-service/src/main/java/com/fs/company/service/impl/CompanyConfigServiceImpl.java

@@ -10,7 +10,10 @@ import com.fs.company.domain.CompanyMiniapp;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.mapper.CompanyConfigMapper;
 import com.fs.company.mapper.CompanyMiniappMapper;
 import com.fs.company.mapper.CompanyMiniappMapper;
 import com.fs.company.param.SaveCompanyMiniAppParam;
 import com.fs.company.param.SaveCompanyMiniAppParam;
+import com.fs.company.param.UpdateMiniAppMasterServerParam;
 import com.fs.company.service.ICompanyConfigService;
 import com.fs.company.service.ICompanyConfigService;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
 import com.fs.company.vo.CompanyMiniAppVO;
 import com.fs.company.vo.CompanyMiniAppVO;
 import com.fs.system.domain.SysConfig;
 import com.fs.system.domain.SysConfig;
 import org.apache.http.util.Asserts;
 import org.apache.http.util.Asserts;
@@ -190,6 +193,16 @@ public class CompanyConfigServiceImpl implements ICompanyConfigService
         return companyConfigMapper.getCompanyMiniAppList(companyId);
         return companyConfigMapper.getCompanyMiniAppList(companyId);
     }
     }
 
 
+    /**
+     * 获取当前公司自身在 fs_course_play_source_config 中配置的小程序列表
+     * @param companyId
+     * @return
+     */
+    @Override
+    public List<CompanyMiniAppVO> getCompanyMiniAppListByCompany(Long companyId) {
+        return companyConfigMapper.getCompanyMiniAppListByCompany(companyId);
+    }
+
     //主要小程序
     //主要小程序
     Integer type_main = 0;
     Integer type_main = 0;
     //备用小程序
     //备用小程序
@@ -261,4 +274,48 @@ public class CompanyConfigServiceImpl implements ICompanyConfigService
         }
         }
         return R.ok();
         return R.ok();
     }
     }
+
+    private static final String CONFIG_KEY_MINI_APP = "miniAppConfig";
+
+    @Override
+    @Transactional
+    public R updateMiniAppMasterServer(Long companyId, UpdateMiniAppMasterServerParam param) {
+        if (companyId == null) {
+            return R.error("公司ID不能为空");
+        }
+        CompanyConfig config = companyConfigMapper.selectCompanyConfigByKey(companyId, CONFIG_KEY_MINI_APP);
+        if (config == null) {
+            return R.error("未找到本公司的小程序配置,请先维护小程序配置");
+        }
+        if (!companyId.equals(config.getCompanyId())) {
+            return R.error("无权修改其他公司配置");
+        }
+        String configValue = config.getConfigValue();
+        JSONObject json = StringUtils.isNotEmpty(configValue) ? JSON.parseObject(configValue) : new JSONObject();
+        // 填充 companyId,避免前端看到为 null
+        json.put("companyId", companyId);
+        if (param.getMiniAppMaster() != null) {
+            json.put("miniAppMaster", param.getMiniAppMaster());
+        }
+        if (param.getMiniAppServer() != null) {
+            json.put("miniAppServer", param.getMiniAppServer());
+        }
+        config.setConfigValue(json.toJSONString());
+        companyConfigMapper.updateCompanyConfig(config);
+
+        // 同步更新 company_miniapp 表,沿用 saveCompanyMiniApp 的逻辑
+        SaveCompanyMiniAppParam saveParam = new SaveCompanyMiniAppParam();
+        saveParam.setCompanyId(companyId);
+        // 目前前端是单选下拉,取数组第一个元素作为主/备小程序
+        if (param.getMiniAppMaster() != null && !param.getMiniAppMaster().isEmpty()) {
+            saveParam.setMainMiniAppId(param.getMiniAppMaster().get(0));
+        }
+        if (param.getMiniAppServer() != null && !param.getMiniAppServer().isEmpty()) {
+            saveParam.setBackupMiniAppId(param.getMiniAppServer().get(0));
+        }
+        // 这里不强制 updateBy,由调用方在需要时补充;目前公司端只按公司维度更新
+        saveCompanyMiniApp(saveParam);
+
+        return R.ok("操作成功");
+    }
 }
 }