浏览代码

添加交易商个性化菜单功能

xie.kaifeng 1 年之前
父节点
当前提交
d01ddfd9e8
共有 46 个文件被更改,包括 2023 次插入66 次删除
  1. 145 2
      mtp3-century/src/main/java/com/muchinfo/mtp3century/controller/InvestorController.java
  2. 3 0
      mtp3-century/src/main/java/com/muchinfo/mtp3century/service/ISendMsgService.java
  3. 38 0
      mtp3-century/src/main/java/com/muchinfo/mtp3century/service/IUseraccountService.java
  4. 40 0
      mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/SendMsgServiceImpl.java
  5. 734 39
      mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/UseraccountServiceImpl.java
  6. 18 14
      mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/WskhUserinfoServiceImpl.java
  7. 9 1
      mtp3-century/src/main/resources/mapper/GoodsMapper.xml
  8. 14 0
      mtp3-century/src/main/resources/mapper/MarketMapper.xml
  9. 132 8
      mtp3-century/src/main/resources/mapper/UseraccountMapper.xml
  10. 7 1
      mtp3-century/src/main/resources/message_en.properties
  11. 6 0
      mtp3-century/src/main/resources/message_th.properties
  12. 7 0
      mtp3-century/src/main/resources/message_zh-CN.properties
  13. 6 0
      mtp3-century/src/main/resources/message_zh-HK.properties
  14. 6 0
      mtp3-century/src/main/resources/message_zh-TW.properties
  15. 6 0
      mtp3-common/src/main/java/com/muchinfo/mtp3common/enumtype/MessageType.java
  16. 8 0
      mtp3-common/src/main/java/com/muchinfo/mtp3common/vo/AjaxResult.java
  17. 16 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IAccountriskconfigMapper.java
  18. 2 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IGoodsMapper.java
  19. 2 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IMarketMapper.java
  20. 12 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUseraccountMapper.java
  21. 17 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUsergroupMapper.java
  22. 16 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUsergroupdetailMapper.java
  23. 17 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUsergrouptradeconfigMapper.java
  24. 58 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Accountriskconfig.java
  25. 64 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Usergroup.java
  26. 56 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Usergroupdetail.java
  27. 89 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Usergrouptradeconfig.java
  28. 1 1
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Userreceiveinfo.java
  29. 25 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/AccountRiskConfigAddParam.java
  30. 30 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/AccountRiskConfigParam.java
  31. 31 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/AccountRiskConfigResult.java
  32. 41 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/FeesConfigVo.java
  33. 19 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorForPerAddParam.java
  34. 23 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorInitBZResult.java
  35. 32 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorInitPerAddResult.java
  36. 33 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPerDetailQueryParam.java
  37. 27 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPerDetailQueryResult.java
  38. 36 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonAddParam.java
  39. 21 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonDeleteParam.java
  40. 23 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonViewParam.java
  41. 28 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonalizedAddParam.java
  42. 2 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonalizedResult.java
  43. 35 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/RulesConfigVo.java
  44. 29 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/UserGroupTradeConfigTreeVo.java
  45. 30 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/UserGroupTradeConfigVo.java
  46. 29 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/UserGroupTreeResult.java

+ 145 - 2
mtp3-century/src/main/java/com/muchinfo/mtp3century/controller/InvestorController.java

@@ -268,11 +268,154 @@ public class InvestorController {
         return iUseraccountService.queryPersonalized(groupname, pageNum, pageSize, request);
     }
 
-    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->获取所选客户信息")
+    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->获取所选客户信息对应风险率")
     @ResponseBody
     @RequestMapping(method = RequestMethod.GET, value = "/getRiskRatioTypeForMarketer")
-    public AjaxResult<Riskratiotype> getRiskRatioTypeForMarketer(Integer customertype ,HttpServletRequest request) {
+    public AjaxResult<Riskratiotype> getRiskRatioTypeForMarketer(Integer customertype, HttpServletRequest request) {
         return iUseraccountService.getRiskRatioTypeForMarketer(customertype, request);
     }
 
+    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->新增/修改")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "/addPersonalized")
+    public AjaxResult addPersonalized(@RequestBody String param, HttpServletRequest request) {
+        try {
+            InvestorPersonalizedAddParam updateParam = JsonUtils.toBean(CenturyDecryptUtil.decryptForJson(param, request), InvestorPersonalizedAddParam.class);
+            return iUseraccountService.addPersonalized(updateParam, request);
+        } catch (Exception e) {
+            log.error("交易商分组新增失败,失败原因:" + e);
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM002.getCode(), request.getHeader("Accept-Language"));
+        }
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->分组交易商获取列表")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/queryPersonalizedDetail")
+    public PageResult<InvestorPerDetailQueryResult> queryPersonalizedDetail(InvestorPerDetailQueryParam param, HttpServletRequest request) {
+        return iUseraccountService.queryPersonalizedDetail(param, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->分组交易商获取列表-->初始化交易商")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/queryInvestorForPer")
+    public AjaxResult<Useraccount> queryInvestorForPer(Long usergroupid, HttpServletRequest request) {
+        return iUseraccountService.queryInvestorForPer(usergroupid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->分组交易商获取列表-->新增")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "/addInvestorForPer")
+    public AjaxResult addInvestorForPer(@RequestBody String param, HttpServletRequest request) {
+        try {
+            InvestorForPerAddParam updateParam = JsonUtils.toBean(CenturyDecryptUtil.decryptForJson(param, request), InvestorForPerAddParam.class);
+            return iUseraccountService.addInvestorForPer(updateParam, request);
+        } catch (Exception e) {
+            log.error("分组交易商新增失败,失败原因:" + e);
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM002.getCode(), request.getHeader("Accept-Language"));
+        }
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->分组交易商获取列表-->删除")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/delInvestorForPer")
+    public AjaxResult delInvestorForPer(Long userid, HttpServletRequest request) {
+        return iUseraccountService.delInvestorForPer(userid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商分组管理-->删除")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/delInvest")
+    public AjaxResult delInvest(Long autoid, HttpServletRequest request) {
+        return iUseraccountService.delInvest(autoid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->风控个性化-->获取列表")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/queryAccountRiskConfig")
+    public PageResult<AccountRiskConfigResult> queryAccountRiskConfig(AccountRiskConfigParam param, HttpServletRequest request) {
+        return iUseraccountService.queryAccountRiskConfig(param, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->风控个性化-->新增获取交易商资金账户信息")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/getTaaccountList")
+    public AjaxResult getTaaccountList(Long userid, HttpServletRequest request) {
+        return iUseraccountService.getTaaccountList(userid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->风控个性化-->新增/修改")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "/addAccountRiskConfig")
+    public AjaxResult addAccountRiskConfig(@RequestBody String param, HttpServletRequest request) {
+        try {
+            AccountRiskConfigAddParam updateParam = JsonUtils.toBean(CenturyDecryptUtil.decryptForJson(param, request), AccountRiskConfigAddParam.class);
+            return iUseraccountService.addAccountRiskConfig(updateParam, request);
+        } catch (Exception e) {
+            log.error("分组交易商新增失败,失败原因:" + e);
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM002.getCode(), request.getHeader("Accept-Language"));
+        }
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->风控个性化-->详情")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/view")
+    public AjaxResult<Accountriskconfig> view(Long accountid, HttpServletRequest request) {
+        return iUseraccountService.view(accountid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->风控个性化-->删除")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/deleteConfig")
+    public AjaxResult deleteConfig(Long accountid, HttpServletRequest request) {
+        return iUseraccountService.deleteConfig(accountid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商个性化-->获取树结构")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/getTree")
+    public AjaxResult<UserGroupTreeResult> getTree(HttpServletRequest request) {
+        return iUseraccountService.getTree(request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商个性化-->新增-->初始化市场以及分组")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/initMarketAndGroup")
+    public AjaxResult<InvestorInitPerAddResult> initMarketAndGroup(Long usergroupid, Long marketid, HttpServletRequest request) {
+        return iUseraccountService.initMarketAndGroup(usergroupid, marketid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商个性化-->新增-->初始化商品及保证金类别")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/initGoodsAndBZ")
+    public AjaxResult<InvestorInitPerAddResult> initGoodsAndBZ(Long usergroupid, Long marketid, Long goodsid, HttpServletRequest request) {
+        return iUseraccountService.initGoodsAndBZ(usergroupid, marketid, goodsid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商个性化-->新增-->选择商品获取规则配置")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/initGoodsForRuleAndFee")
+    public AjaxResult<InvestorInitPerAddResult> initGoodsForRuleAndFee(Long marketid, Long goodsid, HttpServletRequest request) {
+        return iUseraccountService.initGoodsForRuleAndFee(marketid, goodsid, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商个性化-->新增/修改")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "/traderPersonAdd")
+    public AjaxResult traderPersonAdd(@RequestBody InvestorPersonAddParam param, HttpServletRequest request) {
+        return iUseraccountService.traderPersonAdd(param, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商个性化-->删除")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.POST, value = "/deleteTraderConfig")
+    public AjaxResult deleteTraderConfig(@RequestBody InvestorPersonDeleteParam param, HttpServletRequest request) {
+        return iUseraccountService.deleteTraderConfig(param, request);
+    }
+
+    @ApiOperation("交易商管理-->个性化管理-->交易商个性化-->详情")
+    @ResponseBody
+    @RequestMapping(method = RequestMethod.GET, value = "/tradeConfigView")
+    public AjaxResult<UserGroupTradeConfigVo> tradeConfigView(InvestorPersonViewParam param, HttpServletRequest request) {
+        return iUseraccountService.tradeConfigView(param, request);
+    }
 }

+ 3 - 0
mtp3-century/src/main/java/com/muchinfo/mtp3century/service/ISendMsgService.java

@@ -20,4 +20,7 @@ public interface ISendMsgService {
     void sendLoginMsg(Set<Long> set_msg, Integer type, Integer ntfmode);
 
     void sendM2BUnregistCustomerInfo(List<Taaccount> tas);
+
+    void sendAccountConfigChangeNtf(Integer nt, Integer ct, Long userid, Long accountid, Long goodsid, Long groupid, Integer rt);
+
 }

+ 38 - 0
mtp3-century/src/main/java/com/muchinfo/mtp3century/service/IUseraccountService.java

@@ -3,6 +3,7 @@ package com.muchinfo.mtp3century.service;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.muchinfo.mtp3common.vo.AjaxResult;
 import com.muchinfo.mtp3common.vo.PageResult;
+import com.muchinfo.mtp3pojos.entity.Accountriskconfig;
 import com.muchinfo.mtp3pojos.entity.Riskratiotype;
 import com.muchinfo.mtp3pojos.entity.Useraccount;
 import com.muchinfo.mtp3pojos.vo.investor.*;
@@ -38,4 +39,41 @@ public interface IUseraccountService extends IService<Useraccount> {
     PageResult<InvestorPersonalizedResult> queryPersonalized(String groupname, Integer pageNum, Integer pageSize, HttpServletRequest request);
 
     AjaxResult<Riskratiotype> getRiskRatioTypeForMarketer(Integer customertype, HttpServletRequest request);
+
+    AjaxResult addPersonalized(InvestorPersonalizedAddParam param, HttpServletRequest request);
+
+    PageResult<InvestorPerDetailQueryResult> queryPersonalizedDetail(InvestorPerDetailQueryParam param, HttpServletRequest request);
+
+    AjaxResult<Useraccount> queryInvestorForPer(Long usergroupid, HttpServletRequest request);
+
+    AjaxResult addInvestorForPer(InvestorForPerAddParam param, HttpServletRequest request);
+
+    AjaxResult delInvestorForPer(Long userid, HttpServletRequest request);
+
+    AjaxResult delInvest(Long autoid, HttpServletRequest request);
+
+    PageResult<AccountRiskConfigResult> queryAccountRiskConfig(AccountRiskConfigParam param, HttpServletRequest request);
+
+    AjaxResult getTaaccountList(Long userid, HttpServletRequest request);
+
+    AjaxResult addAccountRiskConfig(AccountRiskConfigAddParam param, HttpServletRequest request);
+
+    AjaxResult<Accountriskconfig> view(Long accountid, HttpServletRequest request);
+
+    AjaxResult deleteConfig(Long accountid, HttpServletRequest request);
+
+    AjaxResult<UserGroupTreeResult> getTree(HttpServletRequest request);
+
+    AjaxResult<InvestorInitPerAddResult> initMarketAndGroup(Long usergroupid,Long marketid, HttpServletRequest request);
+
+    AjaxResult<InvestorInitPerAddResult> initGoodsAndBZ(Long usergroupid, Long marketid, Long goodsid, HttpServletRequest request);
+
+    AjaxResult traderPersonAdd(InvestorPersonAddParam param, HttpServletRequest request);
+
+    AjaxResult<InvestorInitPerAddResult> initGoodsForRuleAndFee(Long marketid, Long goodsid, HttpServletRequest request);
+
+    AjaxResult deleteTraderConfig(InvestorPersonDeleteParam param, HttpServletRequest request);
+
+    AjaxResult<UserGroupTradeConfigVo> tradeConfigView(InvestorPersonViewParam param, HttpServletRequest request);
+
 }

+ 40 - 0
mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/SendMsgServiceImpl.java

@@ -250,4 +250,44 @@ public class SendMsgServiceImpl implements ISendMsgService {
 
         log.info(builder.build().toString());
     }
+
+    /**
+     * 管理端个性化风控通知
+     */
+    @Override
+    public void sendAccountConfigChangeNtf(Integer nt, Integer ct, Long userid, Long accountid,
+                                           Long goodsid, Long groupid, Integer rt) {
+        NotifyMI1.AccountConfigChangeNtf.Builder builder = NotifyMI1.AccountConfigChangeNtf.newBuilder();
+        Common.MessageHead.Builder mh = Common.MessageHead.newBuilder();
+        mh.setFunCode(FunCodeConstants.FunCode_Trade_AccountConfigChangeNtf);
+        builder.setHeader(mh);
+        PublicMI1.NotifyHead.Builder nf = PublicMI1.NotifyHead.newBuilder();
+        nf.setNtfMode(0);
+        builder.setNtfHeader(nf);
+        builder.setNtfType(nt);
+        builder.setChangType(ct);
+        if (userid != null) {
+            builder.setUserid(userid);
+        }
+        if (accountid != null) {
+            builder.setAccountid(accountid);
+        }
+        if (goodsid != null) {
+            builder.setGoodsid(goodsid);
+        }
+        if (rt != null) {
+            if (rt == 2) {
+                builder.setRoletype(2);
+            } else if (userid <= 9999) {
+                builder.setRoletype(1);
+            }
+        }
+        if (groupid != null) {
+            builder.setGroupid(groupid);
+        }
+
+        log.info(builder.build().toString());
+        byte[] body = ProtoHelper.getNTAS(builder.build().toByteArray(), FunCodeConstants.FunCode_Trade_AccountConfigChangeNtf, 0);
+        rabbitTemplate.send(SysConstants.RabbitNtfKey, new Message(body, new MessageProperties()));
+    }
 }

+ 734 - 39
mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/UseraccountServiceImpl.java

@@ -94,7 +94,16 @@ public class UseraccountServiceImpl extends ServiceImpl<IUseraccountMapper, User
     private ITaaccountMapper iTaaccountMapper;
     @Resource
     private IRiskratiotypeMapper iRiskratiotypeMapper;
-
+    @Resource
+    private IUsergroupMapper iUsergroupMapper;
+    @Resource
+    private IUsergroupdetailMapper iUsergroupdetailMapper;
+    @Resource
+    private IUsergrouptradeconfigMapper iUsergrouptradeconfigMapper;
+    @Resource
+    private IAccountriskconfigMapper iAccountriskconfigMapper;
+    @Resource
+    private IEnumdicitemMapper iEnumdicitemMapper;
 
     @Override
     public PageResult<DealerQueryResult> queryOrganPage(DealerQueryParam dealerQueryParam, HttpServletRequest request) {
@@ -790,59 +799,745 @@ public class UseraccountServiceImpl extends ServiceImpl<IUseraccountMapper, User
                 .eq("customertype", customertype)
                 .eq("riskcontrolmode", 1));
 
-        BigDecimal cNum = new BigDecimal(100);
-        if (riskRatioType.getRecovertraderiskratio() != null) {
-            riskRatioType.setRecovertraderiskratio(riskRatioType.getRecovertraderiskratio()
-                    .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+        if (Objects.nonNull(riskRatioType)) {
+            BigDecimal cNum = new BigDecimal(100);
+            if (riskRatioType.getRecovertraderiskratio() != null) {
+                riskRatioType.setRecovertraderiskratio(riskRatioType.getRecovertraderiskratio()
+                        .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+            }
+            if (riskRatioType.getNotemarginriskratio() != null) {
+                riskRatioType.setNotemarginriskratio(riskRatioType.getNotemarginriskratio()
+                        .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+            }
+            if (riskRatioType.getAddmarginriskratio() != null) {
+                riskRatioType.setAddmarginriskratio(riskRatioType.getAddmarginriskratio()
+                        .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+            }
+            if (riskRatioType.getCutriskratio() != null) {
+                riskRatioType.setCutriskratio(riskRatioType.getCutriskratio().multiply(cNum)
+                        .setScale(2, RoundingMode.HALF_UP));
+            }
+            if (riskRatioType.getCutbackriskratio() != null) {
+                riskRatioType.setCutbackriskratio(riskRatioType.getCutbackriskratio()
+                        .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+            }
+
+            //安全度
+            if (riskRatioType.getNotesaferatio() != null) {
+                riskRatioType.setNotesaferatio(riskRatioType.getNotesaferatio().multiply(cNum)
+                        .setScale(2, RoundingMode.HALF_UP));
+            }
+            if (riskRatioType.getAddsaferatio() != null) {
+                riskRatioType.setAddsaferatio(riskRatioType.getAddsaferatio().multiply(cNum)
+                        .setScale(2, RoundingMode.HALF_UP));
+            }
+            if (riskRatioType.getRecoversaferatio() != null) {
+                riskRatioType.setRecoversaferatio(riskRatioType.getRecoversaferatio()
+                        .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+            }
+            if (riskRatioType.getCutsaferatio() != null) {
+                riskRatioType.setCutsaferatio(riskRatioType.getCutsaferatio()
+                        .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+            }
+
+            List<Market> marketList = iMarketMapper.selectList(new QueryWrapper<Market>().in(StringUtils.isNotBlank(riskRatioType.getCutmarginseq()), "marketid",
+                    Arrays.stream(riskRatioType.getCutmarginseq().split(",")).filter(s -> !s.trim().isEmpty()).map(Long::valueOf).collect(Collectors.toList())));
+            StringBuilder stringBuilder = new StringBuilder();
+            for (int i = 0; i < marketList.size(); i++) {
+                if (i == marketList.size() - 1) {
+                    stringBuilder.append(marketList.get(i).getMarketname());
+                } else {
+                    stringBuilder.append(marketList.get(i).getMarketname()).append(",");
+                }
+            }
+            riskRatioType.setMarkets(stringBuilder.toString());
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), riskRatioType);
+    }
+
+    @Override
+    public AjaxResult addPersonalized(InvestorPersonalizedAddParam param, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (param.getAutoid() == null) {
+            if (param.getAreauserid() == null) {
+                param.setAreauserid(systemmanager.getAreauserid());
+            }
+            List<Usergroup> usergroups = iUsergroupMapper.selectList(new QueryWrapper<Usergroup>()
+                    .eq("groupname", param.getGroupname())
+                    .eq("areauserid", param.getAreauserid()));
+            if (CollectionUtils.isNotEmpty(usergroups)) {
+                return AjaxResult.error(Constants.Error_Code_Design, MessageType.INVESTOR_ERROR_CODE_006.getCode(), request.getHeader("Accept-Language"));
+            }
+            Usergroup ug = new Usergroup();
+            BeanUtils.copyProperties(param, ug);
+            ug.setCreatorid(systemmanager.getAutoid());
+            ug.setCreatetime(new Date());
+            iUsergroupMapper.insert(ug);
+        } else {
+            Usergroup ug = iUsergroupMapper.selectOne(new QueryWrapper<Usergroup>().eq("AUTOID", param.getAutoid()));
+            if (!iCommonService.checkUserAccountRole(systemmanager, ug.getAreauserid())) {
+                return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM003.getCode(), request.getHeader("Accept-Language"));
+            }
+
+            if (!param.getGroupname().equals(ug.getGroupname())) {
+                List<Usergroup> usergroups = iUsergroupMapper.selectList(new QueryWrapper<Usergroup>()
+                        .eq("groupname", param.getGroupname())
+                        .eq("areauserid", param.getAreauserid()));
+                if (CollectionUtils.isNotEmpty(usergroups)) {
+                    return AjaxResult.error(Constants.Error_Code_Design, MessageType.INVESTOR_ERROR_CODE_006.getCode(), request.getHeader("Accept-Language"));
+                }
+            }
+            ug.setCustomertype(param.getCustomertype());
+            ug.setGroupname(param.getGroupname());
+            iUsergroupMapper.updateById(ug);
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public PageResult<InvestorPerDetailQueryResult> queryPersonalizedDetail(InvestorPerDetailQueryParam param, HttpServletRequest request) {
+        if (StringUtils.isNotBlank(param.getCardnum()))
+            param.setCardnum(EncryptionUtils.encryptByAES(param.getCardnum()));
+        if (StringUtils.isNotBlank(param.getMobilephone()))
+            param.setMobilephone(EncryptionUtils.encryptByAES(param.getMobilephone()));
+        IPage<InvestorPerDetailQueryResult> page = new Page<>(param.getPageNum(), param.getPageSize());
+        IPage<InvestorPerDetailQueryResult> modifyPage = iUseraccountMapper.queryPersonalizedDetail(page, param);
+        PageResult<InvestorPerDetailQueryResult> pageResult = new PageResult<>();
+        pageResult.setCode(Constants.Success_Code_Design);
+        pageResult.setMessage(AjaxResult.dealMsg(MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language")));
+        pageResult.setPages(modifyPage.getPages());
+        pageResult.setCurrent(modifyPage.getCurrent());
+        pageResult.setTotal(modifyPage.getTotal());
+        pageResult.setPageSize(modifyPage.getSize());
+        pageResult.setData(modifyPage.getRecords());
+        return pageResult;
+    }
+
+    @Override
+    public AjaxResult<Useraccount> queryInvestorForPer(Long usergroupid, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        Long userid;
+        Usergroup ug = iUsergroupMapper.selectOne(new QueryWrapper<Usergroup>().eq("AUTOID", usergroupid));
+        if (systemmanager.getReletype().intValue() == SysConstants.SYS_TYPE_MANAGE) {
+            userid = ug.getAreauserid();
+        } else {
+            userid = systemmanager.getAreauserid();
+        }
+        QueryWrapper<Useraccount> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("usertype", 5);
+        queryWrapper.eq("memberuserid", userid);
+        String notExistsSql = "NOT EXISTS (SELECT 1 FROM usergroupdetail u WHERE u.userid = useraccount.userid)";
+        queryWrapper.apply(notExistsSql);
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), iUseraccountMapper.selectList(queryWrapper));
+    }
+
+    @Override
+    public AjaxResult addInvestorForPer(InvestorForPerAddParam param, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (StringUtils.isEmpty(param.getAdduserids())) {
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.INVESTOR_ERROR_CODE_007.getCode(), request.getHeader("Accept-Language"));
         }
-        if (riskRatioType.getNotemarginriskratio() != null) {
-            riskRatioType.setNotemarginriskratio(riskRatioType.getNotemarginriskratio()
-                    .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+        String[] ids = param.getAdduserids().split(",");
+        for (String id : ids) {
+            if (!iCommonService.checkUserAccountRole(systemmanager, Long.valueOf(id))) {
+                return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM003.getCode(), request.getHeader("Accept-Language"));
+            }
         }
-        if (riskRatioType.getAddmarginriskratio() != null) {
-            riskRatioType.setAddmarginriskratio(riskRatioType.getAddmarginriskratio()
-                    .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+        //确定勾选的交易商是否分了组
+        List<Usergroupdetail> list = iUsergroupdetailMapper.selectList(new QueryWrapper<Usergroupdetail>()
+                .in("userid", Arrays.stream(ids).filter(s -> !s.trim().isEmpty())
+                        .map(Long::valueOf).collect(Collectors.toList())));
+        if (CollectionUtils.isNotEmpty(list)) {
+            Object[] res = {list.get(0)};
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.INVESTOR_ERROR_CODE_008.getCode(), res, request.getHeader("Accept-Language"));
         }
-        if (riskRatioType.getCutriskratio() != null) {
-            riskRatioType.setCutriskratio(riskRatioType.getCutriskratio().multiply(cNum)
-                    .setScale(2, RoundingMode.HALF_UP));
+
+        for (String id : ids) {
+            Usergroupdetail ug = new Usergroupdetail();
+            ug.setUserid(Long.valueOf(id));
+            ug.setUsergroupid(param.getUsergroupid());
+            ug.setCreatetime(new Date());
+            ug.setCreatorid(systemmanager.getAutoid());
+            iUsergroupdetailMapper.insert(ug);
+            iSendMsgService.sendAccountConfigChangeNtf(2, 1, Long.valueOf(id), null, null, param.getUsergroupid(), null);
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public AjaxResult delInvestorForPer(Long userid, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (!iCommonService.checkUserAccountRole(systemmanager, userid)) {
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM003.getCode(), request.getHeader("Accept-Language"));
         }
-        if (riskRatioType.getCutbackriskratio() != null) {
-            riskRatioType.setCutbackriskratio(riskRatioType.getCutbackriskratio()
-                    .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+        Usergroupdetail us = iUsergroupdetailMapper.selectOne(new QueryWrapper<Usergroupdetail>().eq("userid", userid));
+        iUsergroupdetailMapper.delete(new QueryWrapper<Usergroupdetail>().eq("userid", userid));
+
+        iSendMsgService.sendAccountConfigChangeNtf(2, 1, userid, null, null, us.getUsergroupid(), null);
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public AjaxResult delInvest(Long autoid, HttpServletRequest request) {
+        Usergroup ug = iUsergroupMapper.selectOne(new QueryWrapper<Usergroup>().eq("AUTOID", autoid));
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (!iCommonService.checkUserAccountRole(systemmanager, ug.getAreauserid())) {
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM003.getCode(), request.getHeader("Accept-Language"));
         }
 
-        //安全度
-        if (riskRatioType.getNotesaferatio() != null) {
-            riskRatioType.setNotesaferatio(riskRatioType.getNotesaferatio().multiply(cNum)
-                    .setScale(2, RoundingMode.HALF_UP));
+        List<Usergrouptradeconfig> tc = iUsergrouptradeconfigMapper.selectList(new QueryWrapper<Usergrouptradeconfig>().eq("usergroupid", autoid));
+        if (CollectionUtils.isNotEmpty(tc)) {
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.INVESTOR_ERROR_CODE_010.getCode(), request.getHeader("Accept-Language"));
+        }
+        List<Usergroupdetail> usergroupid = iUsergroupdetailMapper.selectList(new QueryWrapper<Usergroupdetail>().eq("usergroupid", autoid));
+        if (CollectionUtils.isNotEmpty(usergroupid)) {
+            return AjaxResult.error(Constants.Error_Code_Design, MessageType.INVESTOR_ERROR_CODE_009.getCode(), request.getHeader("Accept-Language"));
         }
-        if (riskRatioType.getAddsaferatio() != null) {
-            riskRatioType.setAddsaferatio(riskRatioType.getAddsaferatio().multiply(cNum)
-                    .setScale(2, RoundingMode.HALF_UP));
+
+        iUsergroupMapper.deleteById(ug);
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public PageResult<AccountRiskConfigResult> queryAccountRiskConfig(AccountRiskConfigParam param, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (systemmanager.getReletype().intValue() == SysConstants.SYS_TYPE_CLIENT) {
+            param.setMemberuserid(systemmanager.getAreauserid());
         }
-        if (riskRatioType.getRecoversaferatio() != null) {
-            riskRatioType.setRecoversaferatio(riskRatioType.getRecoversaferatio()
-                    .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+        IPage<AccountRiskConfigResult> page = new Page<>(param.getPageNum(), param.getPageSize());
+        IPage<AccountRiskConfigResult> modifyPage = iUseraccountMapper.queryAccountRiskConfigPage(page, param);
+        PageResult<AccountRiskConfigResult> pageResult = new PageResult<>();
+        pageResult.setCode(Constants.Success_Code_Design);
+        pageResult.setMessage(AjaxResult.dealMsg(MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language")));
+        pageResult.setPages(modifyPage.getPages());
+        pageResult.setCurrent(modifyPage.getCurrent());
+        pageResult.setTotal(modifyPage.getTotal());
+        pageResult.setPageSize(modifyPage.getSize());
+        pageResult.setData(modifyPage.getRecords());
+        return pageResult;
+    }
+
+    @Override
+    public AjaxResult getTaaccountList(Long userid, HttpServletRequest request) {
+        QueryWrapper<Taaccount> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("userid", userid);
+        String notExistsSql = "NOT EXISTS (select 1 from AccountRiskConfig a where a.accountid = TAACCOUNT.accountid)";
+        queryWrapper.apply(notExistsSql);
+        List<Taaccount> taaccounts = iTaaccountMapper.selectList(queryWrapper);
+        List<Long> collect = taaccounts.stream().map(Taaccount::getAccountid).collect(Collectors.toList());
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), collect);
+    }
+
+    @Override
+    public AjaxResult addAccountRiskConfig(AccountRiskConfigAddParam param, HttpServletRequest request) {
+        Accountriskconfig config = iAccountriskconfigMapper.selectOne(new QueryWrapper<Accountriskconfig>()
+                .eq("accountid", param.getAccountid())
+                .eq("userid", param.getUserid()));
+
+        if (Objects.isNull(config)) {
+            Accountriskconfig accountriskconfig = new Accountriskconfig();
+            accountriskconfig.setUserid(param.getUserid());
+            accountriskconfig.setCustomertype(param.getCustomertype());
+            accountriskconfig.setAccountid(param.getAccountid());
+            iAccountriskconfigMapper.insert(accountriskconfig);
+            iSendMsgService.sendAccountConfigChangeNtf(1, 1, param.getUserid(), param.getAccountid(), null, null, null);
+        } else {
+            config.setCustomertype(param.getCustomertype());
+            iAccountriskconfigMapper.update(config, new QueryWrapper<Accountriskconfig>()
+                    .eq("accountid", param.getAccountid())
+                    .eq("userid", param.getUserid()));
+            iSendMsgService.sendAccountConfigChangeNtf(1, 2, param.getUserid(), param.getAccountid(), null, null, null);
+        }
+
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public AjaxResult<Accountriskconfig> view(Long accountid, HttpServletRequest request) {
+        Accountriskconfig config = iAccountriskconfigMapper.selectOne(new QueryWrapper<Accountriskconfig>().eq("accountid", accountid));
+        Useraccount ua = iUseraccountMapper.selectOne(new QueryWrapper<Useraccount>().eq("userid", config.getUserid()));
+        if (ua.getUsertype() == 2) {
+            Taaccount ta = iTaaccountMapper.selectOne(new QueryWrapper<Taaccount>().eq("accountid", config.getAccountid()));
+            config.setIsmarketacc(ta.getIsmarketaccount());
+        }
+        config.setUsertype(ua.getUsertype());
+        config.setAccountname(ua.getAccountname());
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), config);
+    }
+
+    @Override
+    public AjaxResult deleteConfig(Long accountid, HttpServletRequest request) {
+        Accountriskconfig config = iAccountriskconfigMapper.selectOne(new QueryWrapper<Accountriskconfig>().eq("accountid", accountid));
+        iAccountriskconfigMapper.delete(new QueryWrapper<Accountriskconfig>().eq("accountid", accountid));
+
+        iSendMsgService.sendAccountConfigChangeNtf(1, 3, config.getUserid(), config.getAccountid(), null, null, null);
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public AjaxResult<UserGroupTreeResult> getTree(HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        List<Usergroup> groupList = iUsergroupMapper.selectList(new QueryWrapper<>());
+        List<UserGroupTradeConfigTreeVo> result = new ArrayList<>();
+        List<Usergrouptradeconfig> list = iUsergrouptradeconfigMapper.selectList(new QueryWrapper<Usergrouptradeconfig>().eq("memberuserid", systemmanager.getAreauserid()));
+        if (CollectionUtils.isNotEmpty(list)) {
+            Map<Long, List<Usergrouptradeconfig>> group = new HashMap<>();
+            for (Usergrouptradeconfig fig : list) {
+                Market marketid = iMarketMapper.selectOne(new QueryWrapper<Market>().eq("marketid", fig.getMarketid()));
+                fig.setMarketname(marketid.getMarketname());
+                Goods goods = iGoodsMapper.selectOne(new QueryWrapper<Goods>().eq("goodsid", fig.getGoodsid()));
+                fig.setGoodsname(goods.getGoodsname());
+                Long key = fig.getUsergroupid();
+                if (group.containsKey(key)) {
+                    group.get(key).add(fig);
+                } else {
+                    List<Usergrouptradeconfig> temp = new ArrayList<>();
+                    temp.add(fig);
+                    group.put(key, temp);
+                }
+            }
+
+            Map<Long, Map<Long, List<Usergrouptradeconfig>>> groups = new HashMap<>();
+            for (Map.Entry<Long, List<Usergrouptradeconfig>> entry : group.entrySet()) {
+                Map<Long, List<Usergrouptradeconfig>> market = new HashMap<>();
+                List<Usergrouptradeconfig> temp = entry.getValue();
+                for (Usergrouptradeconfig fig : temp) {
+                    Long key = fig.getMarketid();
+                    if (market.containsKey(key)) {
+                        market.get(key).add(fig);
+                    } else {
+                        List<Usergrouptradeconfig> _temp = new ArrayList<>();
+                        _temp.add(fig);
+                        market.put(key, _temp);
+                    }
+                }
+                groups.put(entry.getKey(), market);
+            }
+            Set<String> set = new HashSet<>();
+
+            for (Map.Entry<Long, Map<Long, List<Usergrouptradeconfig>>> entry : groups.entrySet()) {
+                Usergrouptradeconfig base = null;
+                for (Map.Entry<Long, List<Usergrouptradeconfig>> _entry : entry.getValue().entrySet()) {
+                    List<Usergrouptradeconfig> temp = _entry.getValue();
+                    for (int i = 0; i < temp.size(); i++) {
+                        Usergrouptradeconfig fig = temp.get(i);
+                        if (i == 0) {
+                            base = fig;
+                        }
+                        String setKey = fig.getUsergroupid() + "" + fig.getMarketid() + "" + fig.getGoodsid();
+                        if (!set.contains(setKey)) {
+                            set.add(setKey);
+                            //商品级
+                            UserGroupTradeConfigTreeVo vo2 = new UserGroupTradeConfigTreeVo();
+                            vo2.setId(fig.getGoodsid().toString());
+                            vo2.setPid(fig.getUsergroupid() + "" + fig.getMarketid());
+                            vo2.setLevel(3);
+                            //商品名称
+                            vo2.setName(fig.getGoodsname());
+                            vo2.setUsergroupid(fig.getUsergroupid());
+                            vo2.setMarketid(fig.getMarketid());
+                            vo2.setGoodsid(fig.getGoodsid());
+                            result.add(vo2);
+                        }
+                    }
+                    //市场级
+                    UserGroupTradeConfigTreeVo vo1 = new UserGroupTradeConfigTreeVo();
+                    vo1.setId(base.getUsergroupid() + "" + base.getMarketid());
+                    vo1.setPid("z" + base.getUsergroupid().toString());
+                    vo1.setLevel(2);
+                    //市场名称
+                    vo1.setName(base.getMarketname());
+                    vo1.setUsergroupid(base.getUsergroupid());
+                    vo1.setMarketid(base.getMarketid());
+                    result.add(vo1);
+                }
+            }
         }
-        if (riskRatioType.getCutsaferatio() != null) {
-            riskRatioType.setCutsaferatio(riskRatioType.getCutsaferatio()
-                    .multiply(cNum).setScale(2, RoundingMode.HALF_UP));
+        //默认分组
+        UserGroupTradeConfigTreeVo defaultVO = new UserGroupTradeConfigTreeVo();
+        defaultVO.setId("z0");
+        defaultVO.setPid("-1");
+        defaultVO.setLevel(1);
+        defaultVO.setName("默认配置");
+        defaultVO.setUsergroupid(0L);
+        result.add(defaultVO);
+
+        //分组级
+        int len = groupList.size();
+        for (int i = 0; i < len; i++) {
+            Usergroup ug = groupList.get(i);
+            UserGroupTradeConfigTreeVo temp = new UserGroupTradeConfigTreeVo();
+            temp.setId("z" + ug.getAutoid().toString());
+            temp.setPid("-1");
+            temp.setLevel(1);
+            //分组名称
+            temp.setName(ug.getGroupname());
+            temp.setUsergroupid(ug.getAutoid());
+            result.add(temp);
         }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), result);
+    }
 
-        List<Market> marketList = iMarketMapper.selectList(new QueryWrapper<Market>().in(StringUtils.isNotBlank(riskRatioType.getCutmarginseq()), "marketid",
-                Arrays.stream(riskRatioType.getCutmarginseq().split(",")).filter(s -> !s.trim().isEmpty()).map(Long::valueOf).collect(Collectors.toList())));
-        StringBuilder stringBuilder = new StringBuilder();
-        for (int i = 0; i < marketList.size(); i++) {
-            if (i == marketList.size() - 1) {
-                stringBuilder.append(marketList.get(i).getMarketname());
+    @Override
+    public AjaxResult<InvestorInitPerAddResult> initMarketAndGroup(Long usergroupid, Long marketid, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        InvestorInitPerAddResult result = new InvestorInitPerAddResult();
+        if (usergroupid == null) {
+            QueryWrapper<Usergroup> wrapper = new QueryWrapper<>();
+            wrapper.eq("areauserid", systemmanager.getAreauserid());
+            // 添加不存在子查询的条件
+            wrapper.notExists(
+                    "select 1 from usergrouptradeconfig u " +
+                            "where " +
+                            "<if test='memberuserid != null'>u.memberuserid = #{memberuserid} and </if>" +
+                            "USERGROUP.autoid = u.usergroupid"
+            );
+            result.setUserGroups(iUsergroupMapper.selectList(wrapper));
+            result.setMarkets(iMarketMapper.getNoTradeConfigMarkets(systemmanager.getAreauserid(), usergroupid));
+        } else {
+            if (marketid == null) {
+                result.setMarkets(iMarketMapper.getNoTradeConfigMarkets(systemmanager.getAreauserid(), usergroupid));
             } else {
-                stringBuilder.append(marketList.get(i).getMarketname()).append(",");
+                result.setGoods(iGoodsMapper.getNoTradeConfigGoods(systemmanager.getAreauserid(), usergroupid, marketid));
+            }
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), result);
+    }
+
+    @Override
+    public AjaxResult<InvestorInitPerAddResult> initGoodsAndBZ(Long usergroupid, Long marketid, Long goodsid, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        InvestorInitPerAddResult result = new InvestorInitPerAddResult();
+        if (marketid != null) {
+            result.setGoods(iGoodsMapper.getNoTradeConfigGoods(systemmanager.getAreauserid(), usergroupid, marketid));
+        } else {
+            //客户类别
+            result.setResults(iUseraccountMapper.getCustomerTypeByGoodsid(goodsid, null));
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), result);
+    }
+
+    @Override
+    public AjaxResult traderPersonAdd(InvestorPersonAddParam param, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (param.getFlag() == 0) {
+            AjaxResult Error_Code_Design = addTrader(param, request);
+            if (Error_Code_Design != null) return Error_Code_Design;
+
+            iSendMsgService.sendAccountConfigChangeNtf(3, 1, null, null, param.getGoodsid(), param.getUsergroupid(), null);
+        } else {
+            QueryWrapper<Usergrouptradeconfig> queryWrapper = new QueryWrapper<>();
+            queryWrapper.eq("goodsid", param.getGoodsid());
+            queryWrapper.eq("marketid", param.getMarketid());
+            queryWrapper.eq("memberuserid", systemmanager.getAreauserid());
+            queryWrapper.eq("usergroupid", param.getUsergroupid());
+            iUsergrouptradeconfigMapper.delete(queryWrapper);
+
+            AjaxResult Error_Code_Design = addTrader(param, request);
+            if (Error_Code_Design != null) return Error_Code_Design;
+
+            iSendMsgService.sendAccountConfigChangeNtf(3, 2, null, null, param.getGoodsid(), param.getUsergroupid(), null);
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    private AjaxResult addTrader(InvestorPersonAddParam param, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (param.getParamid() != null) {
+            Usergrouptradeconfig config = getUsergrouptradeconfig(param, systemmanager);
+            iUsergrouptradeconfigMapper.insert(config);
+        }
+
+        Object o = redisServiceUtil.getCacheMapValue(Constants.REDIS_HEADER_SYSPARAM, "007");
+        //币种小数位
+        BigDecimal Cude = null;
+        //成交量小数位
+        BigDecimal qtyde = null;
+        if (o != null && "1".equals(o.toString())) {
+            Goods goods = iGoodsMapper.selectOne(new QueryWrapper<Goods>().eq("goodsid", param.getGoodsid()));
+            Enumdicitem item = iEnumdicitemMapper.selectOne(new QueryWrapper<Enumdicitem>()
+                    .eq("enumdiccode", "currency")
+                    .eq("enumitemname", goods.getCurrencyid()));
+            if (item != null && StringUtils.isNotBlank(item.getParam1())) {
+                Cude = new BigDecimal(Math.pow(10, Integer.valueOf(item.getParam1())));
+            }
+            qtyde = new BigDecimal(Math.pow(10, goods.getQtydecimalplace()));
+        }
+
+        List<Usergrouptradeconfig> ruleList = param.getRuleList();
+        if (ruleList != null && !ruleList.isEmpty()) {
+            for (Usergrouptradeconfig fig : ruleList) {
+                if (fig.getParamid() == null || fig.getParamid() == 0
+                        || fig.getParamvalue() == null) {
+                    continue;
+                }
+
+                //小数位放大
+                if (qtyde != null && fig.getParamid() >= 101 && fig.getParamid() <= 104) {
+                    fig.setParamvalue(fig.getParamvalue().multiply(qtyde));
+                }
+
+                fig.setFeealgorithm(2);
+                fig.setUsergroupid(param.getUsergroupid());
+                fig.setMemberuserid(systemmanager.getAreauserid());
+                fig.setMarketid(param.getMarketid());
+                fig.setGoodsid(param.getGoodsid());
+                fig.setRuletype(2);
+                fig.setCreatetime(new Date());
+                fig.setCreatorid(systemmanager.getAutoid());
+                iUsergrouptradeconfigMapper.insert(fig);
+            }
+        }
+
+        List<Usergrouptradeconfig> feeList = param.getFeeList();
+        if (feeList != null && !feeList.isEmpty()) {
+            for (Usergrouptradeconfig fig : feeList) {
+                if (fig.getParamid() == null || fig.getParamid() == 0
+                        || fig.getFeealgorithm() == null || fig.getParamvalue() == null) {
+                    continue;
+                }
+                if (fig.getFeealgorithm() == 1) {
+                    if (fig.getParamvalue().compareTo(new BigDecimal(10000)) > 0) {
+                        return AjaxResult.error(Constants.Error_Code_Design, MessageType.INVESTOR_ERROR_CODE_011.getCode(), request.getHeader("Accept-Language"));
+                    }
+                    fig.setParamvalue(fig.getParamvalue().divide(new BigDecimal(10000)));
+                } else if (Cude != null) {
+                    fig.setParamvalue(fig.getParamvalue().multiply(Cude));
+                }
+                fig.setUsergroupid(param.getUsergroupid());
+                fig.setMemberuserid(systemmanager.getAreauserid());
+                fig.setMarketid(param.getMarketid());
+                fig.setGoodsid(param.getGoodsid());
+                fig.setRuletype(3);
+                fig.setCreatetime(new Date());
+                fig.setCreatorid(systemmanager.getAutoid());
+                iUsergrouptradeconfigMapper.insert(fig);
             }
         }
-        riskRatioType.setMarkets(stringBuilder.toString());
-        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"),riskRatioType);
+        return null;
+    }
+
+    private Usergrouptradeconfig getUsergrouptradeconfig(InvestorPersonAddParam param, Systemmanager systemmanager) {
+        Usergrouptradeconfig config = new Usergrouptradeconfig();
+        config.setUsergroupid(param.getUsergroupid());
+        config.setMemberuserid(systemmanager.getAreauserid());
+        config.setMarketid(param.getMarketid());
+        config.setGoodsid(param.getGoodsid());
+        config.setRuletype(1);
+        config.setParamid(param.getParamid());
+        config.setCreatetime(new Date());
+        config.setCreatorid(systemmanager.getAutoid());
+        config.setFeealgorithm(param.getFeealgorithm());
+        return config;
+    }
+
+    @Override
+    public AjaxResult<InvestorInitPerAddResult> initGoodsForRuleAndFee(Long marketid, Long goodsid, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        InvestorInitPerAddResult result = new InvestorInitPerAddResult();
+        List<FeesConfigVo> feeVo = getTradeFeeDescriptions(marketid, goodsid, systemmanager.getAreauserid());
+        result.setFeesConfigVos(feeVo);
+        List<RulesConfigVo> rulesVos = getTradeRuleDescriptions(marketid, goodsid, systemmanager.getAreauserid());
+        result.setRulesConfigVos(rulesVos);
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), result);
+    }
+
+    @Override
+    public AjaxResult deleteTraderConfig(InvestorPersonDeleteParam param, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        QueryWrapper<Usergrouptradeconfig> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("goodsid", param.getGoodsid());
+        queryWrapper.eq("marketid", param.getMarketid());
+        queryWrapper.eq("memberuserid", systemmanager.getAreauserid());
+        queryWrapper.eq("usergroupid", param.getUsergroupid());
+        iUsergrouptradeconfigMapper.delete(queryWrapper);
+
+        iSendMsgService.sendAccountConfigChangeNtf(3, 3, null, null, param.getGoodsid(), param.getUsergroupid(), null);
+
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public AjaxResult<UserGroupTradeConfigVo> tradeConfigView(InvestorPersonViewParam param, HttpServletRequest request) {
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+
+        List<RulesConfigVo> ruleList = iUseraccountMapper.getTradeRuleDescriptions(param.getMarketid(), param.getGoodsid(), systemmanager.getAreauserid());
+        List<FeesConfigVo> feeList = iUseraccountMapper.getTradeFeeDescriptions(param.getMarketid(), param.getGoodsid(), systemmanager.getAreauserid());
+
+        Object o = redisServiceUtil.getCacheMapValue(Constants.REDIS_HEADER_SYSPARAM, "007");
+        if (o != null && "1".equals(o.toString())) {
+            //成交量小数位
+            Goods goods = iGoodsMapper.selectOne(new QueryWrapper<Goods>().eq("goodsid", param.getGoodsid()));
+            if (ruleList != null && !ruleList.isEmpty()) {
+                //成交量小数位
+                if (goods.getQtydecimalplace() != null && goods.getQtydecimalplace() != 0) {
+                    BigDecimal qtyde = new BigDecimal(Math.pow(10, goods.getQtydecimalplace()));
+                    for (int i = 0; i < ruleList.size(); i++) {
+                        //小数位放大
+                        if (ruleList.get(i).getRuleid() >= 101 && ruleList.get(i).getRuleid() <= 104) {
+                            if (ruleList.get(i).getParamvalue() != null &&
+                                    ruleList.get(i).getParamvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                ruleList.get(i).setParamvalue(ruleList.get(i).getParamvalue().
+                                        divide(new BigDecimal(Math.pow(10, ruleList.get(i).getQtydecimalplace()))));
+                            }
+                            if (ruleList.get(i).getGvalue() != null &&
+                                    ruleList.get(i).getGvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                ruleList.get(i).setGvalue(ruleList.get(i).getGvalue().divide(qtyde));
+                            }
+                            if (ruleList.get(i).getDvalue() != null &&
+                                    ruleList.get(i).getDvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                ruleList.get(i).setDvalue(ruleList.get(i).getDvalue().divide(qtyde));
+                            }
+                            if (ruleList.get(i).getCvalue() != null &&
+                                    ruleList.get(i).getCvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                ruleList.get(i).setCvalue(ruleList.get(i).getCvalue().divide(qtyde));
+                            }
+                        }
+                    }
+                }
+            }
 
+            if (feeList != null && !feeList.isEmpty()) {
+                //币种小数位
+                Enumdicitem item = iEnumdicitemMapper.selectOne(new QueryWrapper<Enumdicitem>()
+                        .eq("enumdiccode", "currency")
+                        .eq("enumitemname", goods.getCurrencyid()));
+                if (item != null && StringUtils.isNotBlank(item.getParam1()) && !"0".equals(item.getParam1())) {
+                    BigDecimal Cude = new BigDecimal(Math.pow(10, Integer.valueOf(item.getParam1())));
+                    for (int i = 0; i < feeList.size(); i++) {
+                        //小数位放大
+                        if (feeList.get(i).getFeealgorithm() == 2) {
+                            if (feeList.get(i).getExchangevalue() != null
+                                    && feeList.get(i).getExchangevalue().compareTo(BigDecimal.ZERO) != 0) {
+                                feeList.get(i).setExchangevalue(feeList.get(i).getExchangevalue().divide(Cude));
+                            }
+                            if (feeList.get(i).getDvalue() != null
+                                    && feeList.get(i).getDvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                feeList.get(i).setDvalue(feeList.get(i).getDvalue().divide(Cude));
+                            }
+                            if (feeList.get(i).getGvalue() != null
+                                    && feeList.get(i).getGvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                feeList.get(i).setGvalue(feeList.get(i).getGvalue().divide(Cude));
+                            }
+                            if (feeList.get(i).getCvalue() != null
+                                    && feeList.get(i).getCvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                feeList.get(i).setCvalue(feeList.get(i).getCvalue().divide(Cude));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        UserGroupTradeConfigVo detail = new UserGroupTradeConfigVo();
+
+        detail.setDruleList(ruleList);
+        detail.setDfeeList(feeList);
+        QueryWrapper<Usergrouptradeconfig> queryWrapper = new QueryWrapper<>();
+        queryWrapper.eq("goodsid", param.getGoodsid());
+        queryWrapper.eq("marketid", param.getMarketid());
+        queryWrapper.eq("memberuserid", systemmanager.getAreauserid());
+        queryWrapper.eq("usergroupid", param.getUsergroupid());
+        queryWrapper.eq("ruletype", 1);
+        Usergrouptradeconfig config = iUsergrouptradeconfigMapper.selectOne(queryWrapper);
+        detail.setGoodsid(param.getGoodsid());
+        detail.setMemberuserid(systemmanager.getAreauserid());
+        detail.setMarketid(param.getMarketid());
+        detail.setUsergroupid(param.getUsergroupid());
+        if (config != null) {
+            detail.setParamid(config.getParamid());
+
+            // 查询商品保证金设置值
+            List<InvestorInitBZResult> results = iUseraccountMapper.getCustomerTypeByGoodsid(param.getGoodsid(), config.getParamid());
+            if (CollectionUtils.isNotEmpty(results)) {
+                detail.setMarginalgorithm(Integer.parseInt(results.get(0).getMarginalgorithm().toString()));
+                detail.setMarketmarginvalue(new BigDecimal(results.get(0).getMarketmarginvalue().toString()));
+                if (detail.getMarginalgorithm().equals(1)) {
+                    detail.setMarketmarginvaluedisplay(detail.getMarketmarginvalue().multiply(new BigDecimal(100)).setScale(2).toString() + "%");
+                } else {
+                    detail.setMarketmarginvaluedisplay(detail.getMarketmarginvalue().toString());
+                }
+            }
+        }
+
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"), detail);
+    }
+
+    private List<RulesConfigVo> getTradeRuleDescriptions(Long marketid, Long goodsid, Long areauserid) {
+        List<RulesConfigVo> list = iUseraccountMapper.getTradeRuleDescriptions(marketid, goodsid, areauserid);
+
+        if (list != null && !list.isEmpty()) {
+            Object o = redisServiceUtil.getCacheMapValue(Constants.REDIS_HEADER_SYSPARAM, "007");
+            if (o != null && "1".equals(o.toString())) {
+                //成交量小数位
+                Goods goods = iGoodsMapper.selectOne(new QueryWrapper<Goods>().eq("goodsid", goodsid));
+                if (goods.getQtydecimalplace() != null && goods.getQtydecimalplace() != 0) {
+                    BigDecimal qtyde = new BigDecimal(Math.pow(10, goods.getQtydecimalplace()));
+                    for (int i = 0; i < list.size(); i++) {
+                        //小数位放大
+                        if (list.get(i).getRuleid() >= 101 && list.get(i).getRuleid() <= 104) {
+                            //平台 为商品本身的 小数位可能是商品的也可能是商品组的
+                            if (list.get(i).getParamvalue() != null &&
+                                    list.get(i).getParamvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setParamvalue(list.get(i).getParamvalue().divide(new BigDecimal(Math.pow(10, list.get(i).getQtydecimalplace()))));
+                            }
+                            if (list.get(i).getGvalue() != null &&
+                                    list.get(i).getGvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setGvalue(list.get(i).getGvalue().divide(qtyde));
+                            }
+                            if (list.get(i).getDvalue() != null &&
+                                    list.get(i).getDvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setDvalue(list.get(i).getDvalue().divide(qtyde));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return list;
+    }
+
+    private List<FeesConfigVo> getTradeFeeDescriptions(Long marketid, Long goodsid, Long areauserid) {
+        List<FeesConfigVo> list = iUseraccountMapper.getTradeFeeDescriptions(marketid, goodsid, areauserid);
+        if (list != null && !list.isEmpty()) {
+            Object o = redisServiceUtil.getCacheMapValue(Constants.REDIS_HEADER_SYSPARAM, "007");
+            if (o != null && "1".equals(o.toString())) {
+                //币种小数位
+                Goods goods = iGoodsMapper.selectOne(new QueryWrapper<Goods>().eq("goodsid", goodsid));
+                Enumdicitem item = iEnumdicitemMapper.selectOne(new QueryWrapper<Enumdicitem>()
+                        .eq("enumdiccode", "currency")
+                        .eq("enumitemname", goods.getCurrencyid()));
+                if (item != null && StringUtils.isNotBlank(item.getParam1()) && !"0".equals(item.getParam1())) {
+                    BigDecimal Cude = new BigDecimal(Math.pow(10, Integer.valueOf(item.getParam1())));
+                    for (int i = 0; i < list.size(); i++) {
+                        //小数位放大
+                        if (list.get(i).getFeealgorithm() == 2) {
+                            if (list.get(i).getExchangevalue() != null
+                                    && list.get(i).getExchangevalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setExchangevalue(list.get(i).getExchangevalue().divide(Cude));
+                            }
+                            if (list.get(i).getDvalue() != null
+                                    && list.get(i).getDvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setDvalue(list.get(i).getDvalue().divide(Cude));
+                            }
+                            if (list.get(i).getGvalue() != null
+                                    && list.get(i).getGvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setGvalue(list.get(i).getGvalue().divide(Cude));
+                            }
+
+                            if (list.get(i).getMembermaxvalue() != null
+                                    && list.get(i).getMembermaxvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setMembermaxvalue(list.get(i).getMembermaxvalue().divide(Cude));
+                            }
+                            if (list.get(i).getMemberminvalue() != null
+                                    && list.get(i).getMemberminvalue().compareTo(BigDecimal.ZERO) != 0) {
+                                list.get(i).setMemberminvalue(list.get(i).getMemberminvalue().divide(Cude));
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return list;
     }
 
     private Integer getUserESignRecordCount(Long userid, Long areauserid) {

+ 18 - 14
mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/WskhUserinfoServiceImpl.java

@@ -35,6 +35,7 @@ import org.springframework.transaction.annotation.Transactional;
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletRequest;
 import java.util.*;
+import java.util.stream.Collectors;
 
 /**
  * <p>
@@ -336,7 +337,7 @@ public class WskhUserinfoServiceImpl extends ServiceImpl<IWskhUserinfoMapper, Ws
     @Override
     public AjaxResult<WskhUserinfo> querySunDetail(Long userId, HttpServletRequest request) {
         Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
-        if (checkWskhAccountRole(systemmanager, userId)) {
+        if (!checkWskhAccountRole(systemmanager, userId)) {
             return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM003.getCode(), request.getHeader("Accept-Language"));
         }
         return queryDetail(userId, request);
@@ -345,7 +346,7 @@ public class WskhUserinfoServiceImpl extends ServiceImpl<IWskhUserinfoMapper, Ws
     @Override
     public AjaxResult editWskhUserinfo(WskhUserinfo currentVo, Systemmanager systemmanager, HttpServletRequest request) {
         WskhUserinfo base = iWskhUserinfoMapper.selectOne(new QueryWrapper<WskhUserinfo>().eq("USERID", currentVo.getUserid()));
-        if (checkWskhAccountRole(systemmanager, currentVo.getUserid())) {
+        if (!checkWskhAccountRole(systemmanager, currentVo.getUserid())) {
             return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM003.getCode(), request.getHeader("Accept-Language"));
         }
         List<WskhBlacklist> wskhBlacklists = iWskhBlacklistMapper.selectList(new QueryWrapper<WskhBlacklist>()
@@ -599,8 +600,9 @@ public class WskhUserinfoServiceImpl extends ServiceImpl<IWskhUserinfoMapper, Ws
         } else {
             ua.setAccountname(wui.getUsername());
         }
-
-        ua.setBroker(Long.valueOf(wui.getBrokerid()));
+        if(StringUtils.isNotBlank(wui.getBrokerid())){
+            ua.setBroker(Long.valueOf(wui.getBrokerid()));
+        }
         ua.setAccountstatus(4);
         ua.setModifystatus(1);
         ua.setCreatetime(new Date());
@@ -879,18 +881,20 @@ public class WskhUserinfoServiceImpl extends ServiceImpl<IWskhUserinfoMapper, Ws
         if (wui.getBrokerid() != null) {
             ids[2] = Long.valueOf(wui.getBrokerid());
         }
-        Map<String, Object> result = new HashMap<String, Object>();
-        result.put("userid", ids);
+        List<Long> idList = new ArrayList<>();
+        for (Long id : ids) {
+            if (id != null) {
+                idList.add(id);
+            }
+        }
         List<Useraccount> organ = iUseraccountMapper.selectList(new QueryWrapper<Useraccount>()
-                .in("userid", ids));
+                .in(CollectionUtils.isNotEmpty(idList),"userid", idList));
 
         if (CollectionUtils.isNotEmpty(organ)) {
             for (Useraccount ua : organ) {
-
                 if (ua.getAccountstatus() == 4) {
                     break;
                 }
-
                 if (ua.getUsertype() == 2) {
                     return AjaxResult.error(Constants.Error_Code_Design, MessageType.ORGAN_ERROR_CODE_023.getCode(), request.getHeader("Accept-Language"));
                 } else if (ua.getUsertype() == 3) {
@@ -906,21 +910,21 @@ public class WskhUserinfoServiceImpl extends ServiceImpl<IWskhUserinfoMapper, Ws
 
     protected boolean checkWskhAccountRole(Systemmanager systemmanager, Long userId) {
         if (systemmanager.getReletype() == 1) {
-            return false;
+            return true;
         }
         WskhUserinfo ws = iWskhUserinfoMapper.selectOne(new QueryWrapper<WskhUserinfo>().eq("USERID", userId));
         if (Objects.isNull(ws)) {
-            return true;
+            return false;
         }
         //会员
         if (systemmanager.getReletype() == 2) {
-            return !systemmanager.getAreauserid().equals(ws.getMemberareaid());
+            return systemmanager.getAreauserid().equals(ws.getMemberareaid());
         }
         //子机构
         if (systemmanager.getReletype() == 3) {
-            return !systemmanager.getAreauserid().equals(ws.getAreaid());
+            return systemmanager.getAreauserid().equals(ws.getAreaid());
         }
-        return true;
+        return false;
     }
 
     private Userinfo insertUserInfo(WskhUserinfo vo, WskhUserinfo wui, Systemmanager systemmanager) {

+ 9 - 1
mtp3-century/src/main/resources/mapper/GoodsMapper.xml

@@ -91,5 +91,13 @@
         order by g.goodscode
     </select>
 
-
+    <select id="getNoTradeConfigGoods" parameterType="map" resultMap="BaseResultMap">
+        select * from goods t where t.marketid = #{marketid} and t.goodsstatus in (2,3)
+        and not exists (
+        select 1 from usergrouptradeconfig u where u.goodsid = t.goodsid
+        and
+        <if test="areauserid != null">u.memberuserid=#{areauserid} and</if>
+        u.marketid = #{marketid} and u.usergroupid=#{usergroupid}
+        )
+    </select>
 </mapper>

+ 14 - 0
mtp3-century/src/main/resources/mapper/MarketMapper.xml

@@ -74,4 +74,18 @@
         group by m.marketid,m.marketname,m.trademode,o.roletype,
         o.spotrighttype,o.buyspotrighttype,m.tradeproperty
     </select>
+
+
+    <select id="getNoTradeConfigMarkets" resultMap="BaseResultMap">
+        select t.* from market t
+        where t.tradeproperty in (1,2,3) and t.marketstatus!=3
+        and t.trademode not in(40,41)
+        and t.marketid in ( select marketid from arearolemarket a
+        where <if test="areauserid != null">a.areauserid = #{areauserid} and</if>  a.roletype = 7)
+        <if test="usergroupid != null">
+            and not exists ( select 1 from usergrouptradeconfig u
+            where <if test="areauserid != null">u.memberuserid=#{areauserid} and</if> u.marketid = t.marketid
+            and u.usergroupid = #{usergroupid})
+        </if>
+    </select>
 </mapper>

+ 132 - 8
mtp3-century/src/main/resources/mapper/UseraccountMapper.xml

@@ -506,23 +506,23 @@
 
     <select id="queryModifyPage" resultMap="InvestorModifyResult"
             parameterType="com.muchinfo.mtp3pojos.vo.investor.InvestorModifyParam">
-        select o.userid ,o.memberuserid ,o.parentuserid,o.audittime,o.modifystatus
+        select o.userid ,o.memberuserid ,o.parentuserid,o.audittime,o.modifystatus,
         lo.loginids || '/' || ua.accountname as accountnamedisplay
         from draft_useraccount_new o
         left join useraccount ua on o.userid = ua.userid
         left join VIEW_USER_LOGINIDS lo on o.userid = lo.userid
         <where>
             and o.usertype = 5
-            <if test="parentname != null and parentname != '' ">
-                and (o.memberuserid = ${parentname} or o.parentuserid = ${parentname})
+            <if test="vo.parentname != null and vo.parentname != '' ">
+                and (o.memberuserid = ${vo.parentname} or o.parentuserid = ${vo.parentname})
             </if>
-            <if test="accountname != null and accountname != '' ">
-                and ((o.accountname like '%'||#{accountname,jdbcType=VARCHAR}||'%')
-                or(o.userid like '%'||#{accountname,jdbcType=VARCHAR}||'%'))
+            <if test="vo.accountname != null and vo.accountname != '' ">
+                and ((o.accountname like '%'||#{vo.accountname,jdbcType=VARCHAR}||'%')
+                or(o.userid like '%'||#{vo.accountname,jdbcType=VARCHAR}||'%'))
             </if>
             <choose>
-                <when test="memberuserid != null">
-                    and o.memberuserid = #{memberuserid} and o.modifystatus = 3
+                <when test="vo.memberuserid != null">
+                    and o.memberuserid = #{vo.memberuserid} and o.modifystatus = 3
                 </when>
                 <otherwise>
                     and o.modifystatus in (3,4)
@@ -587,4 +587,128 @@
         </where>
         order by t.autoid
     </select>
+
+
+    <select id="queryPersonalizedDetail" resultType="com.muchinfo.mtp3pojos.vo.investor.InvestorPerDetailQueryResult"
+            parameterType="com.muchinfo.mtp3pojos.vo.investor.InvestorPerDetailQueryParam">
+        select t.*,u.accountname from usergroupdetail t ,useraccount u ,userinfo i
+        <where>
+            t.userid = u.userid and u.userid = i.userid
+            <if test="vo.usergroupid != null">
+                and t.usergroupid = #{vo.usergroupid}
+            </if>
+            <if test="vo.accountname != null and vo.accountname != '' ">
+                and ((u.accountname like '%'||#{vo.accountname,jdbcType=VARCHAR}||'%')
+                or (u.userid like '%'||#{vo.accountname,jdbcType=VARCHAR}||'%'))
+            </if>
+            <if test="vo.mobilephone != null and vo.mobilephone != '' ">
+                and i.mobile = #{vo.mobilephone,jdbcType=VARCHAR}
+            </if>
+            <if test="vo.cardnum != null and vo.cardnum != '' ">
+                and i.cardnum = #{vo.cardnum,jdbcType=VARCHAR}
+            </if>
+        </where>
+        order by t.userid
+    </select>
+
+
+    <select id="queryAccountRiskConfigPage" parameterType="com.muchinfo.mtp3pojos.vo.investor.AccountRiskConfigParam"
+            resultType="com.muchinfo.mtp3pojos.vo.investor.AccountRiskConfigResult">
+        select a.userid,a.accountid,a.customertype,u.accountname as username , ua.userid || '/' || ua.accountname as memberusername
+        from AccountRiskConfig a
+        left join useraccount u on a.userid = u.userid
+        left join useraccount ua on ua.userid = u.memberuserid
+        left join taaccount t on a.accountid=t.accountid
+        <where>
+            and u.accountstatus = 4
+            and u.usertype=5
+            <if test="vo.accountid != null">
+                and a.accountid = #{accountid}
+            </if>
+            <if test="vo.username != null and vo.username != ''">
+                and ((u.accountname like
+                '%'||#{vo.username,jdbcType=VARCHAR}||'%')
+                or(u.userid like '%'||#{vo.username,jdbcType=VARCHAR}||'%'))
+            </if>
+            <if test="vo.memberuserid != null">
+                and a.userid in (
+                select t.userid from useraccount t where u.usertype=5 start with t.userid =#{vo.memberuserid}
+                connect by prior t.userid = t.parentuserid
+                and t.usertype !=2
+                )
+            </if>
+            order by a.userid ,a.accountid
+        </where>
+
+    </select>
+
+    <select id="getCustomerTypeByGoodsid" resultType="com.muchinfo.mtp3pojos.vo.investor.InvestorInitBZResult">
+        select g.marginalgorithm,e.enumdicname,e.enumitemname,
+        g.marginalgorithm, g.marketmarginvalue
+        from goodsmarginconfig g,enumdicitem e,riskratiotype r
+        where g.customertypeid = e.enumitemname
+        and e.enumitemstatus = 1 and g.goodsid = #{goodsid}
+        and e.enumitemname = r.customertype
+        and r.riskcontrolmode=1
+        <if test="customertypeid != null  and customertypeid != ''">
+            and g.customertypeid=#{customertypeid}
+        </if>
+    </select>
+
+
+    <select id="getTradeRuleDescriptions" resultType="com.muchinfo.mtp3pojos.vo.investor.RulesConfigVo">
+        with cf as(select u.paramid,u.paramvalue from usergrouptradeconfig u
+        where u.ruletype=2 and u.memberuserid = #{areauserid} and
+        u.usergroupid=0
+        and u.marketid = #{marketid} and u.goodsid = #{goodsid}
+        ),
+        baserule as (
+        select t.ruleid,t.paramvalue from goodstraderule t where t.goodsid = #{goodsid}
+        ),
+        jjs as (
+        select gs.qtydecimalplace,t.ruleid,t.paramvalue from goodstraderule t,goods gs
+        where t.goodsid=gs.goodsid and t.goodsid = #{goodsid}
+        union
+        select gp.qtydecimalplace,t.ruleid,t.paramvalue from GoodsGroupTradeRule t, goodsgroup gp
+        where t.goodsgroupid = gp.goodsgroupid and t.ruleid not in (select ruleid from baserule)
+        and t.goodsgroupid=(select g.goodsgroupid from goods g where g.goodsid=#{goodsid})
+        )
+        select t.*,g.qtydecimalplace,g.paramvalue,cf.paramvalue dvalue
+        from traderuledescription t
+        left join traderuleconfig c on t.ruleid = c.ruleid and c.ispersonalized = 1
+        left join jjs g on t.ruleid = g.ruleid
+        left join cf cf on t.ruleid = cf.paramid
+        where c.trademodeid = (select m.trademode from market m where m.marketid = #{marketid} )
+    </select>
+
+    <select id="getTradeFeeDescriptions" resultType="com.muchinfo.mtp3pojos.vo.investor.FeesConfigVo">
+        with cf as(
+        select u.paramid,u.feealgorithm, u.paramvalue
+        from usergrouptradeconfig u
+        where u.ruletype=3 <if test="areauserid != null">and u.memberuserid = #{areauserid}</if>   and
+        u.usergroupid=0
+        and u.marketid = #{marketid} and u.goodsid = #{goodsid}
+        ),
+        basefee as (
+        select t.tradefeeid,t.feealgorithm,t.exchangevalue,t.memberdefaultvalue,t.memberminvalue,t.membermaxvalue
+        from GoodsTradeFee t where t.goodsid = #{goodsid}
+        ),
+        jjs as (
+        select * from basefee t
+        union
+        select t.tradefeeid,t.feealgorithm,t.exchangevalue,t.memberdefaultvalue,t.memberminvalue,t.membermaxvalue
+        from GoodsGroupTradeFee t
+        where t.goodsgroupid=(select g.goodsgroupid from goods g where g.goodsid=#{goodsid})
+        and t.tradefeeid not in (select tradefeeid from basefee)
+        )
+        select t.*,g.feealgorithm, g.memberminvalue,g.membermaxvalue,
+        cf.feealgorithm drithm, cf.paramvalue dvalue
+       ,g.memberdefaultvalue exchangevalue
+        from tradefeedescription t
+        left join jjs g on t.tradefeeid = g.tradefeeid
+        left join tradefeeconfig c on t.tradefeedescriptionid = c.tradefeedescriptionid and c.ispersonalized = 1
+        left join cf cf on t.tradefeeid = cf.paramid
+        where c.tradepropertyid=(select m.tradeproperty from market m where m.marketid = #{marketid})
+        and g.feealgorithm is not null
+    </select>
 </mapper>

+ 7 - 1
mtp3-century/src/main/resources/message_en.properties

@@ -92,4 +92,10 @@ investor_error_code_001=No funds account found
 investor_error_code_002=Non investor accounts cannot be closed for review
 investor_error_code_003=The fund account cannot be closed as it has not been terminated
 investor_error_code_004=The account contains relevant information such as funds and positions, and cannot be cancelled
-investor_error_code_005=The fund account request has not been responded to.
+investor_error_code_005=The fund account request has not been responded to.
+investor_error_code_006=Duplicate group names.
+investor_error_code_007=Please select investors.
+investor_error_code_008={0}Assigned groups.
+investor_error_code_009=Please remove all investors under this group first.
+investor_error_code_010=Please delete the personalized settings of this group first.
+investor_error_code_011=The ratio value cannot exceed 10000

+ 6 - 0
mtp3-century/src/main/resources/message_th.properties

@@ -92,3 +92,9 @@ investor_error_code_002=บัญชีที่ไม่ใช่นักล
 investor_error_code_003=บัญชีเงินไม่ถูกยกเลิก ขายไม่ออก
 investor_error_code_004=บัญชีมีข้อมูลที่เกี่ยวข้อง เช่น เงินทุน การเปิดโพซิชั่น และไม่สามารถออกจากระบบได้
 investor_error_code_005=ไม่มีการตอบสนองต่อการร้องขอบัญชีเงินทุน.
+investor_error_code_006=ชื่อกลุ่มซ้ำ.
+investor_error_code_007=กรุณาเลือกนักลงทุน.
+investor_error_code_008={0}การจัดกลุ่มที่ได้รับมอบหมาย.
+investor_error_code_009=โปรดลบนักลงทุนทั้งหมดภายใต้กลุ่มนี้ก่อน.
+investor_error_code_010=โปรดลบการตั้งค่าส่วนบุคคลของกลุ่มนั้นก่อน.
+investor_error_code_011=ค่าอัตราส่วนต้องไม่เกิน 10,000

+ 7 - 0
mtp3-century/src/main/resources/message_zh-CN.properties

@@ -92,3 +92,10 @@ investor_error_code_002=非投资者账户,不能销户审核.
 investor_error_code_003=资金账户未解约,不能销户.
 investor_error_code_004=账户存在资金、持仓等相关信息,不能注销.
 investor_error_code_005=资金账户请求没有回应.
+investor_error_code_006=分组名重复.
+investor_error_code_007=请选择投资者.
+investor_error_code_008={0}已分配分组.
+investor_error_code_009=请先移除该分组下所有投资者.
+investor_error_code_010=请先删除该分组的个性化设置.
+investor_error_code_011=比率值不能大于10000
+

+ 6 - 0
mtp3-century/src/main/resources/message_zh-HK.properties

@@ -92,3 +92,9 @@ investor_error_code_002=非投資者帳戶,不能銷戶稽核.
 investor_error_code_003=資金帳戶未解約,不能銷戶.
 investor_error_code_004=帳戶存在資金、持倉等相關資訊,不能註銷.
 investor_error_code_005=資金帳戶請求沒有回應.
+investor_error_code_006=分組名重複.
+investor_error_code_007=請選擇投資者.
+investor_error_code_008={0}已分配分組.
+investor_error_code_009=請先移除該分組下所有投資者.
+investor_error_code_010=請先删除該分組的個性化設定.
+investor_error_code_011=比率值不能大於10000

+ 6 - 0
mtp3-century/src/main/resources/message_zh-TW.properties

@@ -92,3 +92,9 @@ investor_error_code_002=非投資者帳戶,不能銷戶稽核.
 investor_error_code_003=資金帳戶未解約,不能銷戶.
 investor_error_code_004=帳戶存在資金、持倉等相關資訊,不能註銷.
 investor_error_code_005=資金帳戶請求沒有回應.
+investor_error_code_006=分組名重複.
+investor_error_code_007=請選擇投資者.
+investor_error_code_008={0}已分配分組.
+investor_error_code_009=請先移除該分組下所有投資者.
+investor_error_code_010=請先删除該分組的個性化設定.
+investor_error_code_011=比率值不能大於10000

+ 6 - 0
mtp3-common/src/main/java/com/muchinfo/mtp3common/enumtype/MessageType.java

@@ -100,6 +100,12 @@ public enum MessageType {
     INVESTOR_ERROR_CODE_003("investor_error_code_003", "资金账户未解约,不能销户."),
     INVESTOR_ERROR_CODE_004("investor_error_code_004", "账户存在资金、持仓等相关信息,不能注销."),
     INVESTOR_ERROR_CODE_005("investor_error_code_005", "资金账户请求没有回应."),
+    INVESTOR_ERROR_CODE_006("investor_error_code_006", "分组名重复."),
+    INVESTOR_ERROR_CODE_007("investor_error_code_007", "请选择投资者."),
+    INVESTOR_ERROR_CODE_008("investor_error_code_008", "{0}已分配分组."),
+    INVESTOR_ERROR_CODE_009("investor_error_code_009", "请先移除该分组下所有投资者."),
+    INVESTOR_ERROR_CODE_010("investor_error_code_010", "请先删除该分组的个性化设置."),
+    INVESTOR_ERROR_CODE_011("investor_error_code_011", "比率值不能大于10000."),
     ;
 
     private String code;

+ 8 - 0
mtp3-common/src/main/java/com/muchinfo/mtp3common/vo/AjaxResult.java

@@ -87,6 +87,14 @@ public class AjaxResult<T> {
         return ajaxResult;
     }
 
+    public static AjaxResult error(Integer code, String message, Object[] parameters, String languages) {
+        message = dealMsgForParam(message, languages, parameters);
+        AjaxResult ajaxResult = new AjaxResult();
+        ajaxResult.setMessage(message);
+        ajaxResult.setCode(code);
+        return ajaxResult;
+    }
+
     public static String dealMsg(String message, String languages) {
         try {
             //处理语种

+ 16 - 0
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IAccountriskconfigMapper.java

@@ -0,0 +1,16 @@
+package com.muchinfo.mtp3interface.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.muchinfo.mtp3pojos.entity.Accountriskconfig;
+
+/**
+ * <p>
+ * 账号风险率个性化表 Mapper 接口
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-05
+ */
+public interface IAccountriskconfigMapper extends BaseMapper<Accountriskconfig> {
+
+}

+ 2 - 0
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IGoodsMapper.java

@@ -20,4 +20,6 @@ import java.util.List;
 public interface IGoodsMapper extends BaseMapper<Goods> {
 
     List<GoodsSelectResult> queryGoodsSelect(@Param("split") String[] split,@Param("marketId")  Long marketId,@Param("searchCode")  String searchCode);
+
+    List<Goods> getNoTradeConfigGoods(@Param("areauserid")Long areauserid,@Param("usergroupid") Long usergroupid,@Param("marketid") Long marketid);
 }

+ 2 - 0
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IMarketMapper.java

@@ -20,4 +20,6 @@ import java.util.List;
 public interface IMarketMapper extends BaseMapper<Market> {
 
     List<Marketvo> getMarketsNameByUseridAndrole(@Param("uid") Long uid, @Param("roletype") int roletype);
+
+    List<Market> getNoTradeConfigMarkets(@Param("areauserid")Long areauserid, @Param("usergroupid")Long usergroupid);
 }

+ 12 - 0
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUseraccountMapper.java

@@ -66,4 +66,16 @@ public interface IUseraccountMapper extends BaseMapper<Useraccount> {
     List<ProfitSharGroupOrganResult> getNoGroupSubOrgan(@Param("areauserid") Long areauserid);
 
     IPage<InvestorPersonalizedResult> queryPersonalized(IPage<InvestorPersonalizedResult> page,@Param("groupname") String groupname, @Param("userid")Long userid);
+
+    IPage<InvestorPerDetailQueryResult> queryPersonalizedDetail(IPage<InvestorPerDetailQueryResult> page, @Param("vo") InvestorPerDetailQueryParam param);
+
+    IPage<AccountRiskConfigResult> queryAccountRiskConfigPage(IPage<AccountRiskConfigResult> page, @Param("vo")AccountRiskConfigParam param);
+
+    List<AccountRiskConfigResult> queryAccountRiskConfigPage( @Param("vo")AccountRiskConfigParam param);
+
+    List<InvestorInitBZResult> getCustomerTypeByGoodsid(@Param("goodsid")Long goodsid,@Param("customertypeid")Integer customertypeid);
+
+    List<RulesConfigVo> getTradeRuleDescriptions(@Param("marketid")Long marketid,@Param("goodsid") Long goodsid,@Param("areauserid") Long areauserid);
+
+    List<FeesConfigVo> getTradeFeeDescriptions(@Param("marketid")Long marketid,@Param("goodsid") Long goodsid,@Param("areauserid") Long areauserid);
 }

+ 17 - 0
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUsergroupMapper.java

@@ -0,0 +1,17 @@
+package com.muchinfo.mtp3interface.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.muchinfo.mtp3pojos.entity.Usergroup;
+
+/**
+ * <p>
+ * 用户分组表
+AreaUserID = 1为平台对机构分组 Mapper 接口
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-04
+ */
+public interface IUsergroupMapper extends BaseMapper<Usergroup> {
+
+}

+ 16 - 0
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUsergroupdetailMapper.java

@@ -0,0 +1,16 @@
+package com.muchinfo.mtp3interface.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.muchinfo.mtp3pojos.entity.Usergroupdetail;
+
+/**
+ * <p>
+ * 用户分组明细表 Mapper 接口
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-05
+ */
+public interface IUsergroupdetailMapper extends BaseMapper<Usergroupdetail> {
+
+}

+ 17 - 0
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUsergrouptradeconfigMapper.java

@@ -0,0 +1,17 @@
+package com.muchinfo.mtp3interface.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.muchinfo.mtp3pojos.entity.Usergrouptradeconfig;
+
+/**
+ * <p>
+ * 用户分组交易参数配置表
+(个性化到用户分组或资金账号) Mapper 接口
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-05
+ */
+public interface IUsergrouptradeconfigMapper extends BaseMapper<Usergrouptradeconfig> {
+
+}

+ 58 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Accountriskconfig.java

@@ -0,0 +1,58 @@
+package com.muchinfo.mtp3pojos.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+/**
+ * <p>
+ * 账号风险率个性化表
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("ACCOUNTRISKCONFIG")
+@ApiModel(value="Accountriskconfig对象", description="账号风险率个性化表")
+public class Accountriskconfig extends Model<Accountriskconfig> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "资金账号ID")
+    private Long accountid;
+
+    @ApiModelProperty(value = "用户ID")
+    @TableField("USERID")
+    private Long userid;
+
+    @ApiModelProperty(value = "投资者风险率客户类别")
+    @TableField("CUSTOMERTYPE")
+    private Integer customertype;
+
+    @TableField(select = false)
+    private String accountname;
+
+    @TableField(select = false)
+    private Integer usertype;
+
+    @TableField(select = false)
+    private Integer ismarketacc;
+    @Override
+    public Serializable pkVal() {
+        return this.accountid;
+    }
+
+}

+ 64 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Usergroup.java

@@ -0,0 +1,64 @@
+package com.muchinfo.mtp3pojos.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户分组表
+AreaUserID = 1为平台对机构分组
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-04
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("USERGROUP")
+@ApiModel(value="Usergroup对象", description="用户分组表 AreaUserID = 1为平台对机构分组")
+@KeySequence(value = "SEQ_USERGROUP")
+public class Usergroup extends Model<Usergroup> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "自增ID")
+    @TableId(value = "AUTOID",  type=IdType.INPUT)
+    private Long autoid;
+
+    @ApiModelProperty(value = "用户分组名称")
+    @TableField("GROUPNAME")
+    private String groupname;
+
+    @ApiModelProperty(value = "所属机构ID[AreaUserID = 1为平台对机构分组]")
+    @TableField("AREAUSERID")
+    private Long areauserid;
+
+    @ApiModelProperty(value = "风险率客户类别")
+    @TableField("CUSTOMERTYPE")
+    private Integer customertype;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("CREATETIME")
+    private Date createtime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("CREATORID")
+    private Long creatorid;
+
+
+    @Override
+    public Serializable pkVal() {
+        return this.autoid;
+    }
+
+}

+ 56 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Usergroupdetail.java

@@ -0,0 +1,56 @@
+package com.muchinfo.mtp3pojos.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户分组明细表
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("USERGROUPDETAIL")
+@ApiModel(value="Usergroupdetail对象", description="用户分组明细表")
+public class Usergroupdetail extends Model<Usergroupdetail> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "用户ID")
+    private Long userid;
+
+    @ApiModelProperty(value = "用户分组ID")
+    @TableField("USERGROUPID")
+    private Long usergroupid;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("CREATETIME")
+    private Date createtime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("CREATORID")
+    private Long creatorid;
+
+
+    @Override
+    public Serializable pkVal() {
+        return this.userid;
+    }
+
+}

+ 89 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Usergrouptradeconfig.java

@@ -0,0 +1,89 @@
+package com.muchinfo.mtp3pojos.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * <p>
+ * 用户分组交易参数配置表
+(个性化到用户分组或资金账号)
+ * </p>
+ *
+ * @author XKF
+ * @since 2024-09-05
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("USERGROUPTRADECONFIG")
+@KeySequence(value = "SEQ_USERGROUPTRADECONFIG")
+@ApiModel(value="Usergrouptradeconfig对象", description="用户分组交易参数配置表 (个性化到用户分组或资金账号)")
+
+public class Usergrouptradeconfig extends Model<Usergrouptradeconfig> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "自增ID")
+    @TableId(value = "AUTOID", type = IdType.INPUT)
+    private Long autoid;
+
+    @ApiModelProperty(value = "用户分组ID(0的为会员默认设置)")
+    @TableField("USERGROUPID")
+    private Long usergroupid;
+
+    @ApiModelProperty(value = "所属会员ID")
+    @TableField("MEMBERUSERID")
+    private Long memberuserid;
+
+    @ApiModelProperty(value = "商品ID")
+    @TableField("GOODSID")
+    private Long goodsid;
+
+    @ApiModelProperty(value = "市场ID")
+    @TableField("MARKETID")
+    private Long marketid;
+
+    @ApiModelProperty(value = "参数类型 -1.保证金类 2.交易规则 3.交易费用")
+    @TableField("RULETYPE")
+    private Integer ruletype;
+
+    @ApiModelProperty(value = "个性化参数ID - 1. 参照交易模式规则费用对应-参考表 可个性化类型 2.保证金类保存交易所创建的投资者客户类别ID")
+    @TableField("PARAMID")
+    private Integer paramid;
+
+    @ApiModelProperty(value = "费用算法 - 1:比率 2:固定")
+    @TableField("FEEALGORITHM")
+    private Integer feealgorithm;
+
+    @ApiModelProperty(value = "参数值(保证金类此项为空)")
+    @TableField("PARAMVALUE")
+    private BigDecimal paramvalue;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("CREATETIME")
+    private Date createtime;
+
+    @ApiModelProperty(value = "创建人")
+    @TableField("CREATORID")
+    private Long creatorid;
+
+    @TableField(select = false)
+    private String goodsname;
+
+    @TableField(select = false)
+    private String marketname;
+    @Override
+    public Serializable pkVal() {
+        return this.autoid;
+    }
+
+}

+ 1 - 1
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Userreceiveinfo.java

@@ -32,7 +32,7 @@ public class Userreceiveinfo extends Model<Userreceiveinfo> {
     private static final long serialVersionUID = 1L;
 
     @ApiModelProperty(value = "AutoID")
-    @TableId(value = "USERID", type=IdType.INPUT)
+    @TableId(value = "autoid", type=IdType.INPUT)
     private Long autoid;
 
     @ApiModelProperty(value = "用户ID")

+ 25 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/AccountRiskConfigAddParam.java

@@ -0,0 +1,25 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "AccountRiskConfigAddParam对象", description = "风控个性化列表")
+public class AccountRiskConfigAddParam {
+
+    @ApiModelProperty(value = "交易商  ")
+    private Long userid;
+
+    @ApiModelProperty(value = "资金账户")
+    private Long accountid;
+
+    @ApiModelProperty(value = "风险率类型")
+    private Integer customertype;
+}

+ 30 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/AccountRiskConfigParam.java

@@ -0,0 +1,30 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "AccountRiskConfigParam对象", description = "风控个性化列表")
+public class AccountRiskConfigParam {
+
+    @ApiModelProperty(value = "交易商")
+    private String username;
+
+    @ApiModelProperty(value = "资金账户")
+    private Long accountid;
+
+    private Long memberuserid;
+
+    @ApiModelProperty(value = "* 页码 *")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "* 页大小 *")
+    private Integer pageSize;
+}

+ 31 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/AccountRiskConfigResult.java

@@ -0,0 +1,31 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "AccountRiskConfigParam对象", description = "风控个性化列表")
+public class AccountRiskConfigResult {
+
+    @ApiModelProperty(value = "所属会员")
+    private String memberusername;
+
+    @ApiModelProperty(value = "交易商代码")
+    private Long userid;
+
+    @ApiModelProperty(value = "交易商名称")
+    private String username;
+
+    @ApiModelProperty(value = "资金账户")
+    private Long accountid;
+
+    @ApiModelProperty(value = "风险率类型(客户类别)")
+    private Integer customertype;
+}

+ 41 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/FeesConfigVo.java

@@ -0,0 +1,41 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class FeesConfigVo {
+
+    private Long tradefeeid;
+
+    private String tradefeename;
+
+    private Integer feealgorithm;
+
+    private BigDecimal exchangevalue;
+
+    private Integer drithm;
+
+    private BigDecimal memberminvalue;
+
+    private BigDecimal membermaxvalue;
+
+    private Integer crithm;
+
+    private BigDecimal cvalue;//个性化
+
+    private Integer grithm;
+
+    private BigDecimal dvalue;//会员
+
+    private BigDecimal gvalue;//分组
+
+    private Integer qtydecimalplace;//成交量小数位
+}

+ 19 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorForPerAddParam.java

@@ -0,0 +1,19 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorForPerAddParam对象", description = "交易商个性化设置分组交易商新增")
+public class InvestorForPerAddParam {
+
+    private Long  usergroupid;
+
+    private String  adduserids;
+}

+ 23 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorInitBZResult.java

@@ -0,0 +1,23 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorInitBZResult对象", description = "保证金类别信息")
+public class InvestorInitBZResult {
+
+    private Integer marginalgorithm;
+
+    private String enumdicname;
+
+    private String enumitemname;
+
+    private Double marketmarginvalue;
+}

+ 32 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorInitPerAddResult.java

@@ -0,0 +1,32 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import com.muchinfo.mtp3pojos.entity.Goods;
+import com.muchinfo.mtp3pojos.entity.Market;
+import com.muchinfo.mtp3pojos.entity.Usergroup;
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorForPerAddParam对象", description = "交易商个性化设置分组交易商列表")
+public class InvestorInitPerAddResult {
+
+    private List<Usergroup> userGroups;
+
+    private List<Market> markets;
+
+    private List<Goods> goods;
+
+    private List<InvestorInitBZResult> results;
+
+    private List<FeesConfigVo> feesConfigVos;
+
+    private List<RulesConfigVo> rulesConfigVos;
+}

+ 33 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPerDetailQueryParam.java

@@ -0,0 +1,33 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorPerDetailQueryParam对象", description = "交易商个性化设置分组交易商列表")
+public class InvestorPerDetailQueryParam {
+
+    private Long usergroupid;
+
+    @ApiModelProperty(value = "交易商")
+    private String accountname;
+
+    @ApiModelProperty(value = "手机号")
+    private String mobilephone;
+
+    @ApiModelProperty(value = "证件号码")
+    private String cardnum;
+
+    @ApiModelProperty(value = "页码")
+    private Integer pageNum;
+
+    @ApiModelProperty(value = "页大小")
+    private Integer pageSize;
+}

+ 27 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPerDetailQueryResult.java

@@ -0,0 +1,27 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.Date;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorPerDetailQueryResult对象", description = "交易商个性化设置分组交易商列表")
+public class InvestorPerDetailQueryResult {
+
+    @ApiModelProperty(value = "交易商代码")
+    private Long userid;
+
+    @ApiModelProperty(value = "交易商名称")
+    private String accountname;
+
+    @ApiModelProperty(value = "创建时间")
+    private Date createtime;
+}

+ 36 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonAddParam.java

@@ -0,0 +1,36 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import com.muchinfo.mtp3pojos.entity.Usergrouptradeconfig;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.List;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorPersonAddParam对象", description = "交易商个性化新增")
+public class InvestorPersonAddParam {
+
+    private Long usergroupid;
+
+    private Long marketid;
+
+    private Long goodsid;
+
+    private Integer feealgorithm;
+
+    private Integer paramid;
+
+    @ApiModelProperty(value = "新增0,修改1")
+    private Integer flag;
+
+    private List<Usergrouptradeconfig> ruleList;
+
+    private List<Usergrouptradeconfig> feeList;
+}

+ 21 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonDeleteParam.java

@@ -0,0 +1,21 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorPersonDeleteParam对象", description = "删除")
+public class InvestorPersonDeleteParam {
+
+    private Long usergroupid;
+
+    private Long marketid;
+
+    private Long goodsid;
+}

+ 23 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonViewParam.java

@@ -0,0 +1,23 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorPersonViewParam对象", description = "详情")
+public class InvestorPersonViewParam {
+
+    private Long usergroupid;
+
+    private Long marketid;
+
+    private Long goodsid;
+
+    private Integer goodsname;
+}

+ 28 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonalizedAddParam.java

@@ -0,0 +1,28 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "InvestorPersonalizedAddParam对象", description = "交易商分组个性化设置新增")
+public class InvestorPersonalizedAddParam {
+
+    private Long autoid;
+
+    @ApiModelProperty(value = "经纪会员")
+    private Long areauserid;
+
+    @ApiModelProperty(value = "名称")
+    private String groupname;
+
+    @ApiModelProperty(value = "风险类型 code:customerType")
+    private Integer customertype;
+
+}

+ 2 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/InvestorPersonalizedResult.java

@@ -22,6 +22,8 @@ public class InvestorPersonalizedResult {
     @ApiModelProperty(value = "会员名称")
     private String areausername;
 
+    private Long areauserid;
+
     @ApiModelProperty(value = "分组名称")
     private String groupname;
 

+ 35 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/RulesConfigVo.java

@@ -0,0 +1,35 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.math.BigDecimal;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class RulesConfigVo {
+
+    private Long ruleid;
+
+    private String rulename;
+
+    private String regexpress;
+
+    private String remark;
+
+    private BigDecimal defaultvalue;
+
+    private BigDecimal paramvalue;
+
+    private BigDecimal dvalue;
+
+    private BigDecimal gvalue;
+
+    private BigDecimal cvalue;
+
+    private Integer qtydecimalplace;//成交量小数位
+}

+ 29 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/UserGroupTradeConfigTreeVo.java

@@ -0,0 +1,29 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "UserGroupTradeConfigTreeVo对象", description = "交易商个性化树结构")
+public class UserGroupTradeConfigTreeVo {
+
+    private String id;
+
+    private String pid;
+
+    private String name;
+
+    private Integer level;
+
+    private Long usergroupid;
+
+    private Long marketid;
+
+    private Long goodsid;
+}

+ 30 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/UserGroupTradeConfigVo.java

@@ -0,0 +1,30 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import com.muchinfo.mtp3pojos.entity.Usergrouptradeconfig;
+import io.swagger.annotations.ApiModel;
+import lombok.*;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@EqualsAndHashCode(callSuper = true)
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "UserGroupTradeConfigVo对象", description = "详情")
+public class UserGroupTradeConfigVo extends Usergrouptradeconfig{
+
+    private String groupname;
+
+    private Usergrouptradeconfig config;
+
+    private List<Usergrouptradeconfig> ruleList;
+    private List<Usergrouptradeconfig> feeList;
+
+    private List<RulesConfigVo> druleList;
+    private List<FeesConfigVo> dfeeList;
+
+    private Integer marginalgorithm; // 保证金计算方式
+    private BigDecimal marketmarginvalue; // 保证金值设置值
+    private String marketmarginvaluedisplay; // 保证金值设置显示值
+}

+ 29 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/investor/UserGroupTreeResult.java

@@ -0,0 +1,29 @@
+package com.muchinfo.mtp3pojos.vo.investor;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "UserGroupTreeResult对象", description = "交易商个性化树结构")
+public class UserGroupTreeResult {
+
+    private String id;
+
+    private String pid;
+
+    private String name;
+
+    private Integer level;
+
+    private Long usergroupid;
+
+    private Long marketid;
+
+    private Long goodsid;
+}