Browse Source

新增子机构管理页面接口,修改bug

xie.kaifeng 11 months ago
parent
commit
b7760a435a
19 changed files with 756 additions and 11 deletions
  1. 38 2
      mtp3-century/src/main/java/com/muchinfo/mtp3century/controller/OrganSonController.java
  2. 12 2
      mtp3-century/src/main/java/com/muchinfo/mtp3century/service/IOrganSonService.java
  3. 303 3
      mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/OrganSonServiceService.java
  4. 14 0
      mtp3-century/src/main/resources/mapper/TradepositionMapper.xml
  5. 106 1
      mtp3-century/src/main/resources/mapper/UseraccountMapper.xml
  6. 2 0
      mtp3-century/src/main/resources/message_en.properties
  7. 2 0
      mtp3-century/src/main/resources/message_th.properties
  8. 2 0
      mtp3-century/src/main/resources/message_zh-CN.properties
  9. 2 0
      mtp3-century/src/main/resources/message_zh-HK.properties
  10. 2 0
      mtp3-century/src/main/resources/message_zh-TW.properties
  11. 3 1
      mtp3-common/src/main/java/com/muchinfo/mtp3common/enumtype/MessageType.java
  12. 16 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IInvestortransferMapper.java
  13. 2 0
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/ITradepositionMapper.java
  14. 14 2
      mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUseraccountMapper.java
  15. 119 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Investortransfer.java
  16. 2 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganAddSonOrganParam.java
  17. 43 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganSonTransferAddParam.java
  18. 29 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganSonTransferParam.java
  19. 45 0
      mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganSonTransferResult.java

+ 38 - 2
mtp3-century/src/main/java/com/muchinfo/mtp3century/controller/OrganSonController.java

@@ -8,11 +8,12 @@ import com.muchinfo.mtp3common.enumtype.MessageType;
 import com.muchinfo.mtp3common.vo.AjaxResult;
 import com.muchinfo.mtp3common.vo.AjaxResult;
 import com.muchinfo.mtp3common.utils.JsonUtils;
 import com.muchinfo.mtp3common.utils.JsonUtils;
 import com.muchinfo.mtp3common.vo.PageResult;
 import com.muchinfo.mtp3common.vo.PageResult;
+import com.muchinfo.mtp3pojos.vo.common.OrganSelectResult;
 import com.muchinfo.mtp3pojos.vo.investor.InvestorModifyAuditParam;
 import com.muchinfo.mtp3pojos.vo.investor.InvestorModifyAuditParam;
+import com.muchinfo.mtp3pojos.vo.organ.OrganRoleModifyParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
-import com.muchinfo.mtp3pojos.vo.organ.son.OrganAddSonOrganParam;
-import com.muchinfo.mtp3pojos.vo.organ.son.OrganSonDetailResult;
+import com.muchinfo.mtp3pojos.vo.organ.son.*;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
 import io.swagger.annotations.ApiResponse;
@@ -134,4 +135,39 @@ public class OrganSonController {
     public AjaxResult modifyAudit(InvestorModifyAuditParam param, HttpServletRequest request) {
     public AjaxResult modifyAudit(InvestorModifyAuditParam param, HttpServletRequest request) {
         return iUseraccountService.modifyAudit(param, request);
         return iUseraccountService.modifyAudit(param, request);
     }
     }
+
+    @ApiOperation("会员机构管理-->子机构管理-->子机构转移-->获取机构列表")
+    @RequestMapping(method = RequestMethod.GET, value = "/queryOrganSonTransfer")
+    @ApiResponse(code = 200, message = "成功", response = PageResult.class)
+    private PageResult<OrganSonTransferResult> queryOrganSonTransfer(OrganSonTransferParam param, HttpServletRequest request) {
+        return iOrganSonService.queryOrganSonTransfer(param, request);
+    }
+
+    @ApiOperation("会员机构管理-->子机构管理-->子机构转移-->执行转移")
+    @RequestMapping(method = RequestMethod.GET, value = "/executeTransfer")
+    @ApiResponse(code = 200, message = "成功", response = AjaxResult.class)
+    private AjaxResult executeTransfer(HttpServletRequest request) {
+        return iOrganSonService.executeTransfer(request);
+    }
+
+    @ApiOperation("会员机构管理-->子机构管理-->子机构转移-->撤销")
+    @RequestMapping(method = RequestMethod.GET, value = "/backtranfor")
+    @ApiResponse(code = 200, message = "成功", response = AjaxResult.class)
+    private AjaxResult backtranfor(Long autoid, HttpServletRequest request) {
+        return iOrganSonService.backtranfor(autoid, request);
+    }
+
+    @ApiOperation("会员机构管理-->子机构管理-->子机构转移-->新增-->获取转出子机构")
+    @RequestMapping(method = RequestMethod.GET, value = "/querySonOrganPageByLevel")
+    @ApiResponse(code = 200, message = "成功", response = AjaxResult.class)
+    private AjaxResult<OrganSelectResult> querySonOrganPageByLevel(Integer subarealevel, String searchcode, HttpServletRequest request) {
+        return iOrganSonService.querySonOrganPageByLevel(subarealevel,searchcode, request);
+    }
+
+    @ApiOperation("会员机构管理-->子机构管理-->子机构转移-->新增")
+    @RequestMapping(method = RequestMethod.POST, value = "/organSonTransferAdd")
+    @ApiResponse(code = 200, message = "成功", response = AjaxResult.class)
+    private AjaxResult organSonTransferAdd(@RequestBody OrganSonTransferAddParam vo, HttpServletRequest request) {
+        return iOrganSonService.organSonTransferAdd(vo, request);
+    }
 }
 }

+ 12 - 2
mtp3-century/src/main/java/com/muchinfo/mtp3century/service/IOrganSonService.java

@@ -2,10 +2,10 @@ package com.muchinfo.mtp3century.service;
 
 
 import com.muchinfo.mtp3common.vo.AjaxResult;
 import com.muchinfo.mtp3common.vo.AjaxResult;
 import com.muchinfo.mtp3common.vo.PageResult;
 import com.muchinfo.mtp3common.vo.PageResult;
+import com.muchinfo.mtp3pojos.vo.common.OrganSelectResult;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
-import com.muchinfo.mtp3pojos.vo.organ.son.OrganAddSonOrganParam;
-import com.muchinfo.mtp3pojos.vo.organ.son.OrganSonDetailResult;
+import com.muchinfo.mtp3pojos.vo.organ.son.*;
 
 
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletRequest;
 
 
@@ -34,4 +34,14 @@ public interface IOrganSonService {
     AjaxResult auditorganson(Long userid, Long auditflag, String msg, HttpServletRequest request);
     AjaxResult auditorganson(Long userid, Long auditflag, String msg, HttpServletRequest request);
 
 
     PageResult<UserAccountRspResult> queryOrganSonModify(UserAccountReqParam param, HttpServletRequest request);
     PageResult<UserAccountRspResult> queryOrganSonModify(UserAccountReqParam param, HttpServletRequest request);
+
+    PageResult<OrganSonTransferResult> queryOrganSonTransfer(OrganSonTransferParam param, HttpServletRequest request);
+
+    AjaxResult executeTransfer(HttpServletRequest request);
+
+    AjaxResult backtranfor(Long autoid, HttpServletRequest request);
+
+    AjaxResult<OrganSelectResult> querySonOrganPageByLevel(Integer subarealevel, String searchcode, HttpServletRequest request);
+
+    AjaxResult organSonTransferAdd(OrganSonTransferAddParam vo, HttpServletRequest request);
 }
 }

+ 303 - 3
mtp3-century/src/main/java/com/muchinfo/mtp3century/service/impl/OrganSonServiceService.java

@@ -25,14 +25,14 @@ import com.muchinfo.mtp3common.vo.PageResult;
 import com.muchinfo.mtp3common.vo.ProtoHelper;
 import com.muchinfo.mtp3common.vo.ProtoHelper;
 import com.muchinfo.mtp3interface.mapper.*;
 import com.muchinfo.mtp3interface.mapper.*;
 import com.muchinfo.mtp3pojos.entity.*;
 import com.muchinfo.mtp3pojos.entity.*;
+import com.muchinfo.mtp3pojos.vo.common.OrganSelectResult;
 import com.muchinfo.mtp3pojos.vo.investor.DetailAfterResult;
 import com.muchinfo.mtp3pojos.vo.investor.DetailAfterResult;
 import com.muchinfo.mtp3pojos.vo.investor.DetailBeforeResult;
 import com.muchinfo.mtp3pojos.vo.investor.DetailBeforeResult;
 import com.muchinfo.mtp3pojos.vo.investor.UserAccountDetailVo;
 import com.muchinfo.mtp3pojos.vo.investor.UserAccountDetailVo;
 import com.muchinfo.mtp3pojos.vo.investor.UserinfoDetailVo;
 import com.muchinfo.mtp3pojos.vo.investor.UserinfoDetailVo;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
-import com.muchinfo.mtp3pojos.vo.organ.son.OrganAddSonOrganParam;
-import com.muchinfo.mtp3pojos.vo.organ.son.OrganSonDetailResult;
+import com.muchinfo.mtp3pojos.vo.organ.son.*;
 import org.slf4j.Logger;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.slf4j.LoggerFactory;
 import org.springframework.amqp.core.Message;
 import org.springframework.amqp.core.Message;
@@ -101,6 +101,10 @@ public class OrganSonServiceService implements IOrganSonService {
     private IRoleuserMapper iRoleuserMapper;
     private IRoleuserMapper iRoleuserMapper;
     @Resource
     @Resource
     private IQuoterMapper iQuoterMapper;
     private IQuoterMapper iQuoterMapper;
+    @Resource
+    private IInvestortransferMapper iInvestortransferMapper;
+    @Resource
+    private ISubareagroupdetailMapper iSubareagroupdetailMapper;
 
 
     @Override
     @Override
     public PageResult<UserAccountRspResult> querySon(UserAccountReqParam param, HttpServletRequest request) {
     public PageResult<UserAccountRspResult> querySon(UserAccountReqParam param, HttpServletRequest request) {
@@ -625,7 +629,9 @@ public class OrganSonServiceService implements IOrganSonService {
                 }
                 }
             }
             }
         }
         }
-
+        if (param.getAccountstatus() != null && param.getAccountstatus().equals(2)) {
+            organ.setAccountstatus(param.getAccountstatus());
+        }
         organ.setAccountname(param.getAccountname());
         organ.setAccountname(param.getAccountname());
         organ.setModifierid(systemmanager.getAutoid());
         organ.setModifierid(systemmanager.getAutoid());
         organ.setModifytime(new Date());
         organ.setModifytime(new Date());
@@ -748,6 +754,9 @@ public class OrganSonServiceService implements IOrganSonService {
                 sm.setManagerstatus(2);
                 sm.setManagerstatus(2);
                 iSystemmanagerMapper.update(sm, new QueryWrapper<Systemmanager>().eq("autoid", sm.getAutoid()));
                 iSystemmanagerMapper.update(sm, new QueryWrapper<Systemmanager>().eq("autoid", sm.getAutoid()));
             }
             }
+
+            iDraftUseraccountNewMapper.delete(new QueryWrapper<DraftUseraccountNew>().eq("userid", userid));
+            iDraftUserinfoMapper.delete(new QueryWrapper<DraftUserinfo>().eq("USERID", userid));
         } else {
         } else {
             accountstatus = SysEnums.AccountStatusEnum.NORMAL.getType();
             accountstatus = SysEnums.AccountStatusEnum.NORMAL.getType();
             for (Systemmanager sm : smList) {
             for (Systemmanager sm : smList) {
@@ -774,6 +783,9 @@ public class OrganSonServiceService implements IOrganSonService {
     public PageResult<UserAccountRspResult> queryOrganSonModify(UserAccountReqParam param, HttpServletRequest request) {
     public PageResult<UserAccountRspResult> queryOrganSonModify(UserAccountReqParam param, HttpServletRequest request) {
         IPage<UserAccountRspResult> page = new Page<>(param.getPageNum(), param.getPageSize());
         IPage<UserAccountRspResult> page = new Page<>(param.getPageNum(), param.getPageSize());
         IPage<UserAccountRspResult> userAccountVos = iUseraccountMapper.queryOrganSonModify(page, param);
         IPage<UserAccountRspResult> userAccountVos = iUseraccountMapper.queryOrganSonModify(page, param);
+        userAccountVos.getRecords().forEach(a->{
+
+        });
         PageResult<UserAccountRspResult> pageResult = new PageResult<>();
         PageResult<UserAccountRspResult> pageResult = new PageResult<>();
         pageResult.setCode(Constants.Success_Code_Design);
         pageResult.setCode(Constants.Success_Code_Design);
         pageResult.setMessage(AjaxResult.dealMsg(MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language")));
         pageResult.setMessage(AjaxResult.dealMsg(MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language")));
@@ -785,6 +797,294 @@ public class OrganSonServiceService implements IOrganSonService {
         return pageResult;
         return pageResult;
     }
     }
 
 
+    @Override
+    public PageResult<OrganSonTransferResult> queryOrganSonTransfer(OrganSonTransferParam param, HttpServletRequest request) {
+        param.setTransferusertype(2);
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+        if (systemmanager.getReletype() != 1) {
+            param.setMemberuserid(systemmanager.getAreauserid());
+        }
+        IPage<OrganSonTransferResult> page = new Page<>(param.getPageNum(), param.getPageSize());
+        IPage<OrganSonTransferResult> userAccountVos = iUseraccountMapper.queryOrganSonTransfer(page, param);
+        userAccountVos.getRecords().forEach(a->{
+            a.setOutparentusername(iUseraccountMapper.selectOrganName(a.getAreauserid()));
+            a.setInuseridname(iUseraccountMapper.selectOrganName(a.getNewareauserid()));
+        });
+
+        PageResult<OrganSonTransferResult> pageResult = new PageResult<>();
+        pageResult.setCode(Constants.Success_Code_Design);
+        pageResult.setMessage(AjaxResult.dealMsg(MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language")));
+        pageResult.setPages(userAccountVos.getPages());
+        pageResult.setCurrent(userAccountVos.getCurrent());
+        pageResult.setTotal(userAccountVos.getTotal());
+        pageResult.setPageSize(userAccountVos.getSize());
+        pageResult.setData(userAccountVos.getRecords());
+        return pageResult;
+    }
+
+    @Override
+    public AjaxResult executeTransfer(HttpServletRequest request) {
+        Marketrun mr = iMarketrunMapper.selectOne(new QueryWrapper<Marketrun>().eq("marketid", 0L));
+        if (mr != null && mr.getRunstatus().equals(SysEnums.MarketRunStatus.SYSTEM_RECKON_SUCCESS.getCode())) {
+            // 系统日终处理成功时执行,用于自动执行出错时手动执行
+            organSonTransferExecute();
+            return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+        }
+        return AjaxResult.error(Constants.Error_Code_Design, MessageType.MESSAGE_ERROR_CODE_SYSTEM018.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public AjaxResult backtranfor(Long autoid, HttpServletRequest request) {
+        Investortransfer div = iInvestortransferMapper.selectOne(new QueryWrapper<Investortransfer>().eq("autoid", autoid));
+        if (div != null && div.getTransferstatus().equals(1)) {
+            div.setTransferstatus(4);
+            iInvestortransferMapper.updateById(div);
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    @Override
+    public AjaxResult<OrganSelectResult> querySonOrganPageByLevel(Integer subarealevel, String searchcode, HttpServletRequest request) {
+        List<OrganSelectResult> results = iUseraccountMapper.querySonOrganPageByLevel(subarealevel,searchcode);
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"),results);
+    }
+
+    @Override
+    public AjaxResult organSonTransferAdd(OrganSonTransferAddParam vo, HttpServletRequest request) {
+        // 转移交易商(单个+批量)、转移子机构
+        Systemmanager systemmanager = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("LOGINCODE", iCommonService.getUserLoginCode(request)));
+
+        Marketrun mr = iMarketrunMapper.selectOne(new QueryWrapper<Marketrun>().eq("marketid", 0L));
+        //申请,不转移
+        Investortransfer it = new Investortransfer();
+        it.setAreauserid(vo.getOutparentuserid());
+        it.setBrokeruserid(vo.getOutborkerid());
+        it.setInvestoruserid(vo.getOutinvestor());
+        it.setMemberuserid(vo.getOutmemberuserid());
+        it.setNewareauserid(vo.getInuserid());
+        it.setNewmemberuserid(vo.getInmemberuserid());
+        it.setNewbrokeruserid(vo.getInborker());
+        it.setOperatorid(systemmanager.getAutoid().toString());
+        it.setTransfertype(vo.getDiversiontype() + 1);
+        it.setCreatetime(new Date());
+        it.setTransferstatus(1);
+        it.setTransfermode(vo.getTransfermode());
+
+        if (mr != null && mr.getRunstatus() != 26) {
+            iInvestortransferMapper.insert(it);
+            return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM021.getCode(), request.getHeader("Accept-Language"));
+        } else {
+            // 执行中
+            it.setTransferstatus(5);
+            iInvestortransferMapper.insert(it);
+
+            investorTransfer2(it);
+        }
+        return AjaxResult.success(Constants.Success_Code_Design, MessageType.MESSAGE_CODE_SYSTEM001.getCode(), request.getHeader("Accept-Language"));
+    }
+
+    private void organSonTransferExecute() {
+        log.info("------开始转移--start---------------------------");
+        // 1:单个转移(交易商)  2:批量转移(交易商) 3:子机构转移
+        List<Investortransfer> list = iInvestortransferMapper.selectList(new QueryWrapper<Investortransfer>().eq("transferstatus", 1));
+        for (Investortransfer investortransfer : list) {
+            investorTransfer2(investortransfer);
+        }
+        log.info("------转移---------end--------------------");
+    }
+
+    private void investorTransfer2(Investortransfer it) {
+        log.info("---转移------------------------{}", it.getAutoid());
+        try {
+            Systemmanager user = iSystemmanagerMapper.selectOne(new QueryWrapper<Systemmanager>().eq("autoid", it.getOperatorid()));
+            // 1:单个转移(交易商)  2:批量转移(交易商) 3:子机构转移
+            switch (it.getTransfertype()) {
+                case 1:
+                case 2:
+                    log.info("---转移交易商------------------------{}", it.getAutoid());
+                    investorTransfer(it, user);
+                    break;
+                case 3:
+                    log.info("---转移子机构------------------------{}", it.getAutoid());
+                    organSonTransfer(it);
+                    break;
+                default:
+                    break;
+            }
+            it.setUpdatetime(new Date());
+            iInvestortransferMapper.updateById(it);
+        } catch (Exception e) {
+            log.error("当前转移失败,失败id:" + it.getAutoid() + ",失败原因:" + e.getMessage());
+
+            it.setTransferstatus(3);
+            it.setRemark(e.getMessage().substring(0, 250));
+            it.setUpdatetime(new Date());
+            iInvestortransferMapper.updateById(it);
+        }
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void organSonTransfer(Investortransfer it) {
+        if (it.getAreauserid().equals(it.getNewareauserid())) {
+            it.setTransferstatus(3);
+            it.setRemark("转出转入机构相等");
+            return;
+        }
+
+        Useraccount outUser = iUseraccountMapper.selectOne(new QueryWrapper<Useraccount>().eq("userid", it.getAreauserid()));
+        Useraccount inUser = iUseraccountMapper.selectOne(new QueryWrapper<Useraccount>().eq("userid", it.getNewareauserid()));
+
+        // 转移前的Subarealevelpath
+        String oldSubPath = outUser.getSubarealevelpath();
+        // 整体转移后的 Subarealevelpath
+        String newSubPath = inUser.getSubarealevelpath() + outUser.getUserid() + ",";
+
+        // 更新所有下级子机构及交易商的memberuserid、parentuserid、Subarealevelpath
+        List<Useraccount> list = iUseraccountMapper.queryUser("," + outUser.getUserid() + ",");
+
+        if (it.getTransfermode() != null && it.getTransfermode().equals(1)) {
+            // 转移下级
+            for (Useraccount ua : list) {
+                if (ua.getUserid().equals(outUser.getUserid())) {
+                    // 忽略自己
+                    continue;
+                }
+
+                if (ua.getParentuserid().equals(outUser.getUserid())) {
+                    // 更新当前子机构的直属下级的上级
+                    ua.setParentuserid(inUser.getUserid());
+                }
+
+                ua.setMemberuserid(inUser.getMemberuserid());
+                // levelpath 用转入机构的path替换转出机构的path
+                String descPath = ua.getSubarealevelpath().replace(oldSubPath, inUser.getSubarealevelpath());
+                ua.setSubarealevelpath(descPath);
+
+                iUseraccountMapper.update(ua, new QueryWrapper<Useraccount>().eq("userid", ua.getUserid()));
+            }
+
+            // 转移下级时,删除转出机构分润分组内的下一级子机构
+            iUseraccountMapper.deleteSubAreaGroupDetailByUserid(outUser.getUserid());
+
+        } else if (it.getTransfermode() != null && it.getTransfermode().equals(2)) {
+            // 整体转移
+            for (Useraccount ua : list) {
+                ua.setMemberuserid(inUser.getMemberuserid());
+
+                if (ua.getUserid().equals(outUser.getUserid())) {
+                    // 转移的当前子机构更新上级为经纪会员
+                    ua.setParentuserid(inUser.getUserid());
+                    // 更新 Subarealevelpath
+                    ua.setSubarealevelpath(newSubPath);
+                } else {
+                    // 转移的下级子机构及交易商
+                    String descPath = ua.getSubarealevelpath().replace(oldSubPath, newSubPath);
+                    ua.setSubarealevelpath(descPath);
+                }
+
+                iUseraccountMapper.update(ua, new QueryWrapper<Useraccount>().eq("userid", ua.getUserid()));
+            }
+
+            // 整体转移时,删除自己所在分润组的记录
+            iSubareagroupdetailMapper.delete(new QueryWrapper<Subareagroupdetail>().eq("userid", outUser.getUserid()));
+        }
+        it.setTransferstatus(2);
+        it.setRemark("执行成功");
+    }
+
+    @Transactional(rollbackFor = Exception.class)
+    public void investorTransfer(Investortransfer it, Systemmanager user) {
+        Long in_id = it.getNewareauserid() == null ? it.getNewmemberuserid() : it.getNewareauserid();
+        if ((it.getTransfertype() - 1) == 0) {
+            // 1:单个转移
+            Useraccount investor = iUseraccountMapper.selectOne(new QueryWrapper<Useraccount>().eq("userid", it.getInvestoruserid()));
+            if (investor.getParentuserid().equals(in_id)) {
+                it.setTransferstatus(3);
+                it.setRemark("投资者不能在同一机构下转移");
+                return;
+            }
+
+            //会员转时也不用,只有所平台转移才需要检验
+            //因为所属会员不变更,不影响单据
+            if (user.getReletype() != 1 && investor.getMemberuserid().compareTo(user.getAreauserid()) != 0) {
+                it.setTransferstatus(3);
+                it.setRemark("不能转移非会员下级投资者");
+                return;
+            } else {
+                String chkmsg = checkInvestorTransfor(it.getInvestoruserid());
+                if (chkmsg != null) {
+                    it.setTransferstatus(3);
+                    it.setRemark(chkmsg);
+                    return;
+                }
+            }
+
+            if (investor.getModifystatus() == 3 || investor.getModifystatus() == 4) {
+                investor.setModifystatus(1);
+                iDraftUseraccountNewMapper.delete(new QueryWrapper<DraftUseraccountNew>().eq("userid", it.getInvestoruserid()));
+            }
+
+            Useraccount in = iUseraccountMapper.selectOne(new QueryWrapper<Useraccount>().eq("userid", in_id));
+            investor.setParentuserid(in.getUserid());
+            investor.setMemberuserid(in.getMemberuserid());
+            investor.setBroker(it.getNewbrokeruserid());
+            investor.setSubarealevelpath(in.getSubarealevelpath() + investor.getUserid() + ",");
+            iUseraccountMapper.update(investor, new QueryWrapper<Useraccount>().eq("userid", in.getUserid()));
+        } else if ((it.getTransfertype() - 1) == 1) {
+            // 2:批量转移
+            Long out_id = it.getAreauserid() == null ? it.getMemberuserid() : it.getAreauserid();
+
+            if (out_id.equals(in_id)) {
+                it.setTransferstatus(3);
+                it.setRemark("投资者不能在同一机构下转移");
+                return;
+            }
+            List<Useraccount> list = iUseraccountMapper.getInvestorTODiversion(it.getMemberuserid(), it.getAreauserid(), it.getBrokeruserid());
+            if (CollectionUtils.isNotEmpty(list)) {
+                Useraccount in = iUseraccountMapper.selectOne(new QueryWrapper<Useraccount>().eq("userid", in_id));
+                if (user.getReletype() != 1 && in.getMemberuserid().compareTo(user.getAreauserid()) != 0) {
+                    it.setTransferstatus(3);
+                    it.setRemark("不能转移非本会员下级投资者");
+                    return;
+                }
+
+                for (Useraccount ua : list) {
+                    if (user.getReletype() == 1) {
+                        String chkmsg = checkInvestorTransfor(ua.getUserid());
+                        if (chkmsg != null) {
+                            it.setTransferstatus(3);
+                            it.setRemark(chkmsg);
+                            return;
+                        }
+                    }
+                    if (ua.getModifystatus() == 3 || ua.getModifystatus() == 4) {
+                        ua.setModifystatus(1);
+                        iDraftUseraccountNewMapper.delete(new QueryWrapper<DraftUseraccountNew>().eq("userid", it.getInvestoruserid()));
+                    }
+                    ua.setParentuserid(in.getUserid());
+                    ua.setMemberuserid(in.getMemberuserid());
+                    ua.setBroker(it.getNewbrokeruserid());
+                    ua.setSubarealevelpath(in.getSubarealevelpath() + ua.getUserid() + ",");
+                    iUseraccountMapper.update(ua, new QueryWrapper<Useraccount>().eq("userid", ua.getUserid()));
+                }
+            }
+        }
+        it.setTransferstatus(2);
+        it.setRemark("执行成功");
+    }
+
+    private String checkInvestorTransfor(Long userid) {
+        //管理端-投资者管理 > 投资者批量转移: 没有做市收益权模式持仓单时,可以进行投资者转移
+        List<Taaccount> tas = iTaaccountMapper.selectList(new QueryWrapper<Taaccount>().eq("userid", userid));
+        if (tas != null && !tas.isEmpty()) {
+            Integer count = iTradepositionMapper.queryPositionByUserid(userid);
+            if (count > 0) {
+                return "要转移的投资者存在做市收益权持仓单,不能转移";
+            }
+        }
+        return null;
+    }
+
     public void addSonOrgan(OrganAddSonOrganParam param, Systemmanager systemmanager) {
     public void addSonOrgan(OrganAddSonOrganParam param, Systemmanager systemmanager) {
         String lPwd = iCommonService.getSystemParam(Constants.REDIS_HEADER_SYSPARAM, SysConstants.SYSPARAM_CODE_DEFAULT_PWD);
         String lPwd = iCommonService.getSystemParam(Constants.REDIS_HEADER_SYSPARAM, SysConstants.SYSPARAM_CODE_DEFAULT_PWD);
         Useraccount organ = new Useraccount();
         Useraccount organ = new Useraccount();

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

@@ -48,4 +48,18 @@
           and r.sellcurpositionqty >0 and t.userid=#{areaid}
           and r.sellcurpositionqty >0 and t.userid=#{areaid}
     </select>
     </select>
 
 
+    <select id="queryPositionByUserid" resultType="java.lang.Integer" parameterType="java.lang.Long">
+        select count(t.*)
+        from tradeposition t,
+             taaccount ta,
+             goods g,
+             market m
+        where t.accountid = ta.accountid
+          and t.goodsid = g.goodsid
+          and g.marketid = m.marketid
+          and m.trademode = 10
+          and t.tradeproperty = 1
+          and ta.userid = #{userid}
+    </select>
+
 </mapper>
 </mapper>

+ 106 - 1
mtp3-century/src/main/resources/mapper/UseraccountMapper.xml

@@ -50,6 +50,9 @@
                      select="com.muchinfo.mtp3interface.mapper.ISystemmanagerMapper.selectUsersName"></association>
                      select="com.muchinfo.mtp3interface.mapper.ISystemmanagerMapper.selectUsersName"></association>
         <association property="parentname" column="PARENTUSERID"
         <association property="parentname" column="PARENTUSERID"
                      jdbcType="VARCHAR" select="selectOrganName"></association>
                      jdbcType="VARCHAR" select="selectOrganName"></association>
+        <association property="memberusername" column="MEMBERUSERID"
+                     jdbcType="VARCHAR"
+                     select="selectOrganName"></association>
         <association property="roleIds" column="USERID" jdbcType="VARCHAR"
         <association property="roleIds" column="USERID" jdbcType="VARCHAR"
                      javaType="java.lang.String"
                      javaType="java.lang.String"
                      select="com.muchinfo.mtp3interface.mapper.IArearoleMapper.getRolesByAreaid"></association>
                      select="com.muchinfo.mtp3interface.mapper.IArearoleMapper.getRolesByAreaid"></association>
@@ -126,6 +129,12 @@
     <sql id="Base_Column_List">
     <sql id="Base_Column_List">
         USERID, USERTYPE, MODIFYSTATUS, ACCOUNTNAME, PARENTUSERID, BROKER, SUBAREALEVELPATH, REFEREEUSERID, MEMBERUSERID, ACCOUNTSTATUS, RECKONACCOUNTID, CREATETIME, CREATORID, AUDITTIME, AUDITUSERID, AUDITREMARK, CANCELTIME, CANCELUSERID, MODIFYTIME, MODIFIERID, MODIFYREMARK, MAXINVESTORNUM, HASAUTH, REFERCOUNT, REFERNUM, ISANONYMOUS, PARENTTOPUSER, SUBACCOUNTLEVEL, APPLYSRC, AUDITSRC, ROOTUSERID, CANRECOMMEND, CREATETRADEDATE, SECREFERCOUNT, HASUPLOADED, UPLOADEDTIME, OUTERUSERID, TEAMMANAGERUSERID, SUBJECTID, CREDITQUOTA, MODIFYSRC, SJACCOUNTNO
         USERID, USERTYPE, MODIFYSTATUS, ACCOUNTNAME, PARENTUSERID, BROKER, SUBAREALEVELPATH, REFEREEUSERID, MEMBERUSERID, ACCOUNTSTATUS, RECKONACCOUNTID, CREATETIME, CREATORID, AUDITTIME, AUDITUSERID, AUDITREMARK, CANCELTIME, CANCELUSERID, MODIFYTIME, MODIFIERID, MODIFYREMARK, MAXINVESTORNUM, HASAUTH, REFERCOUNT, REFERNUM, ISANONYMOUS, PARENTTOPUSER, SUBACCOUNTLEVEL, APPLYSRC, AUDITSRC, ROOTUSERID, CANRECOMMEND, CREATETRADEDATE, SECREFERCOUNT, HASUPLOADED, UPLOADEDTIME, OUTERUSERID, TEAMMANAGERUSERID, SUBJECTID, CREDITQUOTA, MODIFYSRC, SJACCOUNTNO
     </sql>
     </sql>
+    <delete id="deleteSubAreaGroupDetailByUserid" parameterType="java.lang.Long">
+        delete
+        from subareagroupdetail t
+        where t.subareagroupid in
+              (select sg.subareagroupid from subareagroup sg where sg.areauserid = #{userid})
+    </delete>
 
 
     <select id="queryOrganSelect"
     <select id="queryOrganSelect"
             parameterType="com.muchinfo.mtp3pojos.vo.common.OrganSelectParam"
             parameterType="com.muchinfo.mtp3pojos.vo.common.OrganSelectParam"
@@ -819,6 +828,7 @@
           and t.userid = #{userid}
           and t.userid = #{userid}
           and t.defaultaccounttype = 2
           and t.defaultaccounttype = 2
     </select>
     </select>
+
     <select id="queryExchSonOrgin" resultType="com.muchinfo.mtp3pojos.vo.common.OrganSelectResult"
     <select id="queryExchSonOrgin" resultType="com.muchinfo.mtp3pojos.vo.common.OrganSelectResult"
             parameterType="com.muchinfo.mtp3pojos.vo.common.OrganSelectParam">
             parameterType="com.muchinfo.mtp3pojos.vo.common.OrganSelectParam">
         <![CDATA[select t.userid,t.accountname,t.parentuserid,t.memberuserid from useraccount t
         <![CDATA[select t.userid,t.accountname,t.parentuserid,t.memberuserid from useraccount t
@@ -836,7 +846,8 @@
         </where>
         </where>
         and rownum &lt;= 10
         and rownum &lt;= 10
     </select>
     </select>
-    <select id="queryOrganSonModify" resultType="com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult">
+
+    <select id="queryOrganSonModify" resultMap="PageResultMap">
         select o.*
         select o.*
         from draft_useraccount_new o
         from draft_useraccount_new o
         left join (SELECT (LEVEL - 1) subarealevel, t.*
         left join (SELECT (LEVEL - 1) subarealevel, t.*
@@ -860,4 +871,98 @@
         </where>
         </where>
         order by o.modifytime desc,o.accountstatus,o.userid
         order by o.modifytime desc,o.accountstatus,o.userid
     </select>
     </select>
+
+    <select id="queryOrganSonTransfer" resultType="com.muchinfo.mtp3pojos.vo.organ.son.OrganSonTransferResult">
+        select outua.subarealevel "outlevel", inua.subarealevel "inlevel", t.* from investortransfer t
+        left join
+        (SELECT (LEVEL - 1) subarealevel, t.*
+        FROM useraccount t
+        where t.usertype in (2,3)
+        START
+        WITH t.userid = 1
+        CONNECT BY PRIOR t.userid = t.parentuserid
+        ORDER BY LEVEL) outua on t.areauserid = outua.userid
+        left join
+        (SELECT (LEVEL - 1) subarealevel, t.*
+        FROM useraccount t
+        where t.usertype in (2,3)
+        START
+        WITH t.userid = 1
+        CONNECT BY PRIOR t.userid = t.parentuserid
+        ORDER BY LEVEL) inua on t.newareauserid = inua.userid
+        <where>
+            <if test="vo.outmemberuserid != null and vo.outmemberuserid!=0">
+                and (t.memberuserid = #{vo.outmemberuserid} or t.areauserid = #{vo.outmemberuserid}
+                or t.brokeruserid = #{vo.outmemberuserid})
+            </if>
+            <if test="vo.inuserid != null and vo.inuserid!=0">
+                and (t.newmemberuserid = #{vo.inuserid} or t.newareauserid = #{vo.inuserid}
+                or t.newbrokeruserid = #{vo.inuserid})
+            </if>
+            <if test="vo.transferstatus != null">
+                and t.transferstatus = #{vo.transferstatus}
+            </if>
+            <choose>
+                <when test="vo.transferusertype != null and vo.transferusertype == 1">
+                    and t.transfertype in (1,2)
+                </when>
+                <when test="vo.transferusertype != null and vo.transferusertype == 2">
+                    and t.transfertype in (3)
+                </when>
+            </choose>
+        </where>
+        order by t.autoid desc
+    </select>
+
+    <select id="getInvestorTODiversion" resultType="com.muchinfo.mtp3pojos.entity.Useraccount">
+        select * from useraccount o
+        <where>
+            and 1=1
+            and o.usertype =5
+            <if test="memberuserid != null">
+                and o.memberuserid = #{memberuserid}
+            </if>
+            <if test="brokeruserid != null">
+                and o.broker = #{brokeruserid}
+            </if>
+            <if test="areauserid != null">
+                start with o.userid = #{areauserid}
+                connect by prior o.userid = o.parentuserid
+            </if>
+        </where>
+    </select>
+
+    <select id="queryUser" resultType="com.muchinfo.mtp3pojos.entity.Useraccount"
+            parameterType="java.lang.String">
+        select ua.*
+        from useraccount ua
+        left join useraccount tua on ua.teammanageruserid = tua.userid
+        left join userinfo ui on ua.userid = ui.userid
+        left join division p on ui.provinceid = p.autoid
+        left join division c on ui.cityid = c.autoid
+        left join division d on ui.districtid = d.autoid
+        <where>
+            <if test="subarealevelpath!=null and subarealevelpath!=''">
+                and ua.subarealevelpath like '%' || #{subarealevelpath}||'%'
+            </if>
+        </where>
+        order by ua.userid
+    </select>
+
+    <select id="querySonOrganPageByLevel" resultType="com.muchinfo.mtp3pojos.vo.common.OrganSelectResult">
+        select ua.*,
+        ua1.userid || '/' || ua1.accountname "memberusername" ,
+        ua2.userid || '/' || ua2.accountname "parentname"
+        from useraccount ua
+        left join useraccount ua1 on ua.memberuserid = ua1.userid
+        left join useraccount ua2 on ua.parentuserid = ua2.userid
+        where ua.usertype=3
+        <if test="subarealevel != null and subarealevel != '' ">
+            and (LENGTH(ua.subarealevelpath) - LENGTH(REPLACE(ua.subarealevelpath, ',', ''))-2) = #{subarealevel}
+        </if>
+        <if test="searchcode != null and searchcode != '' ">
+            and ((ua.accountname like '%'||#{searchcode}||'%')
+            or(ua.userid like '%'||#{searchcode}||'%'))
+        </if>
+    </select>
 </mapper>
 </mapper>

+ 2 - 0
mtp3-century/src/main/resources/message_en.properties

@@ -17,6 +17,7 @@ message_code_system017=Application successful
 message_code_system018=The contact information for performance has been sent. Please check again later
 message_code_system018=The contact information for performance has been sent. Please check again later
 message_code_system019=Execution succeeded
 message_code_system019=Execution succeeded
 message_code_system020=Batch import of position transfer successful
 message_code_system020=Batch import of position transfer successful
+message_code_system021=Submitted successfully, automatic transfer will be performed after market closure
 
 
 message_error_code_system001=Token invalid, please log in again!
 message_error_code_system001=Token invalid, please log in again!
 message_error_code_system002=operation failed
 message_error_code_system002=operation failed
@@ -35,6 +36,7 @@ message_error_code_system014=User account disabled
 message_error_code_system015=There are unprocessed breach requests that cannot be initiated repeatedly
 message_error_code_system015=There are unprocessed breach requests that cannot be initiated repeatedly
 message_error_code_system016=The steps of the performance plan have been changed and an extension cannot be applied for
 message_error_code_system016=The steps of the performance plan have been changed and an extension cannot be applied for
 message_error_code_system017=Deposit transfer market, please select the issuer of the product【{0}】
 message_error_code_system017=Deposit transfer market, please select the issuer of the product【{0}】
+message_error_code_system018=Please execute when the system completes processing successfully at the end of the day
 
 
 login_error_code_001=Account or password error
 login_error_code_001=Account or password error
 login_error_code_002=Unauthorized access is not allowed! Please contact the administrator to handle it!
 login_error_code_002=Unauthorized access is not allowed! Please contact the administrator to handle it!

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

@@ -17,6 +17,7 @@ message_code_system017=สมัครสำเร็จ
 message_code_system018=ข้อมูลการติดต่อการปฏิบัติงานได้ถูกส่งไปแล้ว กรุณาสอบถามอีกครั้งในภายหลัง
 message_code_system018=ข้อมูลการติดต่อการปฏิบัติงานได้ถูกส่งไปแล้ว กรุณาสอบถามอีกครั้งในภายหลัง
 message_code_system019=ความสำเร็จในการดำเนินการ
 message_code_system019=ความสำเร็จในการดำเนินการ
 message_code_system020=การนำเข้าแบทช์การเปิดสถานะสำเร็จแล้ว
 message_code_system020=การนำเข้าแบทช์การเปิดสถานะสำเร็จแล้ว
+message_code_system021=ส่งเรียบร้อยแล้วโอนเงินโดยอัตโนมัติหลังจากปิดตลาด
 
 
 message_error_code_system001=โทเค็นล้มเหลวโปรดเข้าสู่ระบบอีกครั้ง!
 message_error_code_system001=โทเค็นล้มเหลวโปรดเข้าสู่ระบบอีกครั้ง!
 message_error_code_system002=การดำเนินการล้มเหลว!
 message_error_code_system002=การดำเนินการล้มเหลว!
@@ -35,6 +36,7 @@ message_error_code_system014=บัญชีผู้ใช้ถูกปิด
 message_error_code_system015=มีการยื่นขอผิดนัดที่ยังไม่ได้ดำเนินการและไม่สามารถเริ่มต้นซ้ำได้
 message_error_code_system015=มีการยื่นขอผิดนัดที่ยังไม่ได้ดำเนินการและไม่สามารถเริ่มต้นซ้ำได้
 message_error_code_system016=ขั้นตอนการใช้สิทธิมีการเปลี่ยนแปลงและไม่สามารถขอขยายเวลาได้
 message_error_code_system016=ขั้นตอนการใช้สิทธิมีการเปลี่ยนแปลงและไม่สามารถขอขยายเวลาได้
 message_error_code_system017=ตลาดโอนเงินมัดจำ โปรดเลือกผู้ออกสินค้า【{0}】
 message_error_code_system017=ตลาดโอนเงินมัดจำ โปรดเลือกผู้ออกสินค้า【{0}】
+message_error_code_system018=โปรดดำเนินการเมื่อการประมวลผลสิ้นสุดวันที่ระบบสำเร็จ
 
 
 login_error_code_001=บัญชีหรือรหัสผ่านไม่ถูกต้อง
 login_error_code_001=บัญชีหรือรหัสผ่านไม่ถูกต้อง
 login_error_code_002=ไม่สามารถเข้าถึงได้โดยไม่ได้รับอนุญาต! กรุณาติดต่อผู้ดูแลระบบเพื่อจัดการ!
 login_error_code_002=ไม่สามารถเข้าถึงได้โดยไม่ได้รับอนุญาต! กรุณาติดต่อผู้ดูแลระบบเพื่อจัดการ!

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

@@ -17,6 +17,7 @@ message_code_system017=申请成功
 message_code_system018=履约联络信息已发送,稍后请重新查询
 message_code_system018=履约联络信息已发送,稍后请重新查询
 message_code_system019=执行成功
 message_code_system019=执行成功
 message_code_system020=批量导入持仓过户成功
 message_code_system020=批量导入持仓过户成功
+message_code_system021=提交成功,闭市后自动进行转移
 
 
 message_error_code_system001=令牌失效,请重新登录!
 message_error_code_system001=令牌失效,请重新登录!
 message_error_code_system002=操作失败
 message_error_code_system002=操作失败
@@ -35,6 +36,7 @@ message_error_code_system014=用户账户已禁用
 message_error_code_system015=存在未处理的违约申请,不能重复发起
 message_error_code_system015=存在未处理的违约申请,不能重复发起
 message_error_code_system016=履约计划步骤已发生变更,无法申请延期
 message_error_code_system016=履约计划步骤已发生变更,无法申请延期
 message_error_code_system017=定金转让市场,请选择商品发行方【{0}】
 message_error_code_system017=定金转让市场,请选择商品发行方【{0}】
+message_error_code_system018=请于系统日终处理成功时执行
 
 
 login_error_code_001=账户或密码错误
 login_error_code_001=账户或密码错误
 login_error_code_002=未经允许,不可访问!请联系管理员处理!
 login_error_code_002=未经允许,不可访问!请联系管理员处理!

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

@@ -17,6 +17,7 @@ message_code_system017=申請成功
 message_code_system018=履約聯絡資訊已發送,稍後請重新查詢
 message_code_system018=履約聯絡資訊已發送,稍後請重新查詢
 message_code_system019=執行成功
 message_code_system019=執行成功
 message_code_system020=批量導入持倉過戶成功
 message_code_system020=批量導入持倉過戶成功
+message_code_system021=提交成功,閉市後自動進行轉移
 
 
 message_error_code_system001=權杖失效,請重新登入!
 message_error_code_system001=權杖失效,請重新登入!
 message_error_code_system002=操作失敗
 message_error_code_system002=操作失敗
@@ -35,6 +36,7 @@ message_error_code_system014=用戶帳戶已禁用
 message_error_code_system015=存在未處理的違約申請,不能重複發起
 message_error_code_system015=存在未處理的違約申請,不能重複發起
 message_error_code_system016=履約計畫步驟已發生變更,無法申請延期
 message_error_code_system016=履約計畫步驟已發生變更,無法申請延期
 message_error_code_system017=定金轉讓市場,請選擇商品發行方【{0}】
 message_error_code_system017=定金轉讓市場,請選擇商品發行方【{0}】
+message_error_code_system018=請於系統日終處理成功時執行
 
 
 login_error_code_001=帳戶或密碼錯誤
 login_error_code_001=帳戶或密碼錯誤
 login_error_code_002=未經允許,不可訪問! 請聯系管理員處理!
 login_error_code_002=未經允許,不可訪問! 請聯系管理員處理!

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

@@ -17,6 +17,7 @@ message_code_system017=申請成功
 message_code_system018=履約聯絡資訊已發送,稍後請重新查詢
 message_code_system018=履約聯絡資訊已發送,稍後請重新查詢
 message_code_system019=執行成功
 message_code_system019=執行成功
 message_code_system020=批量導入持倉過戶成功
 message_code_system020=批量導入持倉過戶成功
+message_code_system021=提交成功,閉市後自動進行轉移
 
 
 message_error_code_system001=權杖失效,請重新登入!
 message_error_code_system001=權杖失效,請重新登入!
 message_error_code_system002=操作失敗
 message_error_code_system002=操作失敗
@@ -35,6 +36,7 @@ message_error_code_system014=用戶帳戶已禁用
 message_error_code_system015=存在未處理的違約申請,不能重複發起
 message_error_code_system015=存在未處理的違約申請,不能重複發起
 message_error_code_system016=履約計畫步驟已發生變更,無法申請延期
 message_error_code_system016=履約計畫步驟已發生變更,無法申請延期
 message_error_code_system017=定金轉讓市場,請選擇商品發行方【{0}】
 message_error_code_system017=定金轉讓市場,請選擇商品發行方【{0}】
+message_error_code_system018=請於系統日終處理成功時執行
 
 
 login_error_code_001=帳戶或密碼錯誤
 login_error_code_001=帳戶或密碼錯誤
 login_error_code_002=未經允許,不可訪問! 請聯系管理員處理!
 login_error_code_002=未經允許,不可訪問! 請聯系管理員處理!

+ 3 - 1
mtp3-common/src/main/java/com/muchinfo/mtp3common/enumtype/MessageType.java

@@ -23,7 +23,8 @@ public enum MessageType {
     MESSAGE_CODE_SYSTEM017("message_code_system017", "申请成功"),
     MESSAGE_CODE_SYSTEM017("message_code_system017", "申请成功"),
     MESSAGE_CODE_SYSTEM018("message_code_system018", "履约联络信息已发送,稍后请重新查询"),
     MESSAGE_CODE_SYSTEM018("message_code_system018", "履约联络信息已发送,稍后请重新查询"),
     MESSAGE_CODE_SYSTEM019("message_code_system019", "执行成功"),
     MESSAGE_CODE_SYSTEM019("message_code_system019", "执行成功"),
-    MESSAGE_CODE_SYSTEM020("message_code_system020", "执行成功"),
+    MESSAGE_CODE_SYSTEM020("message_code_system020", "批量导入持仓过户成功"),
+    MESSAGE_CODE_SYSTEM021("message_code_system021", "提交成功,闭市后自动进行转移"),
 
 
     MESSAGE_ERROR_CODE_SYSTEM001("message_error_code_system001", "令牌失效,请重新登录!"),
     MESSAGE_ERROR_CODE_SYSTEM001("message_error_code_system001", "令牌失效,请重新登录!"),
     MESSAGE_ERROR_CODE_SYSTEM002("message_error_code_system002", "操作失败"),
     MESSAGE_ERROR_CODE_SYSTEM002("message_error_code_system002", "操作失败"),
@@ -42,6 +43,7 @@ public enum MessageType {
     MESSAGE_ERROR_CODE_SYSTEM015("message_error_code_system015", "存在未处理的违约申请,不能重复发起"),
     MESSAGE_ERROR_CODE_SYSTEM015("message_error_code_system015", "存在未处理的违约申请,不能重复发起"),
     MESSAGE_ERROR_CODE_SYSTEM016("message_error_code_system016", "履约计划步骤已发生变更,无法申请延期"),
     MESSAGE_ERROR_CODE_SYSTEM016("message_error_code_system016", "履约计划步骤已发生变更,无法申请延期"),
     MESSAGE_ERROR_CODE_SYSTEM017("message_error_code_system017", "定金转让市场,请选择商品发行方【{0}】"),
     MESSAGE_ERROR_CODE_SYSTEM017("message_error_code_system017", "定金转让市场,请选择商品发行方【{0}】"),
+    MESSAGE_ERROR_CODE_SYSTEM018("message_error_code_system018", "请于系统日终处理成功时执行"),
 
 
     LOGIN_ERROR_CODE_001("login_error_code_001", "账户或密码错误"),
     LOGIN_ERROR_CODE_001("login_error_code_001", "账户或密码错误"),
     LOGIN_ERROR_CODE_002("login_error_code_002", "未经允许,不可访问!请联系管理员处理"),
     LOGIN_ERROR_CODE_002("login_error_code_002", "未经允许,不可访问!请联系管理员处理"),

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

@@ -0,0 +1,16 @@
+package com.muchinfo.mtp3interface.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.muchinfo.mtp3pojos.entity.Investortransfer;
+
+/**
+ * <p>
+ * 投资者转移表 Mapper 接口
+ * </p>
+ *
+ * @author XKF
+ * @since 2025-01-02
+ */
+public interface IInvestortransferMapper extends BaseMapper<Investortransfer> {
+
+}

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

@@ -19,4 +19,6 @@ import java.util.List;
 public interface ITradepositionMapper extends BaseMapper<Tradeposition> {
 public interface ITradepositionMapper extends BaseMapper<Tradeposition> {
 
 
     List<Tradeposition> queryAmount(@Param("areaid") Long areaid);
     List<Tradeposition> queryAmount(@Param("areaid") Long areaid);
+
+    Integer queryPositionByUserid(Long userid);
 }
 }

+ 14 - 2
mtp3-interface/src/main/java/com/muchinfo/mtp3interface/mapper/IUseraccountMapper.java

@@ -11,6 +11,8 @@ import com.muchinfo.mtp3pojos.vo.common.OrganSelectResult;
 import com.muchinfo.mtp3pojos.vo.investor.*;
 import com.muchinfo.mtp3pojos.vo.investor.*;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountReqParam;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
 import com.muchinfo.mtp3pojos.vo.organ.UserAccountRspResult;
+import com.muchinfo.mtp3pojos.vo.organ.son.OrganSonTransferParam;
+import com.muchinfo.mtp3pojos.vo.organ.son.OrganSonTransferResult;
 import com.muchinfo.mtp3pojos.vo.profitshar.ProfitSharGroupOrganResult;
 import com.muchinfo.mtp3pojos.vo.profitshar.ProfitSharGroupOrganResult;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
 import org.apache.ibatis.annotations.Param;
@@ -83,9 +85,19 @@ public interface IUseraccountMapper extends BaseMapper<Useraccount> {
 
 
     List<Useraccount> queryUserAccount(@Param("userid") Long userid);
     List<Useraccount> queryUserAccount(@Param("userid") Long userid);
 
 
-    List<Userreckonaccount> queryUra(@Param("userid")Long userid);
+    List<Userreckonaccount> queryUra(@Param("userid") Long userid);
 
 
     List<OrganSelectResult> queryExchSonOrgin(@Param("vo") OrganSelectParam vo);
     List<OrganSelectResult> queryExchSonOrgin(@Param("vo") OrganSelectParam vo);
 
 
-    IPage<UserAccountRspResult> queryOrganSonModify(IPage<UserAccountRspResult> page,@Param("vo") UserAccountReqParam param);
+    IPage<UserAccountRspResult> queryOrganSonModify(IPage<UserAccountRspResult> page, @Param("vo") UserAccountReqParam param);
+
+    IPage<OrganSonTransferResult> queryOrganSonTransfer(IPage<OrganSonTransferResult> page, @Param("vo") OrganSonTransferParam param);
+
+    List<Useraccount> getInvestorTODiversion(Long memberuserid, Long areauserid, Long brokeruserid);
+
+    List<Useraccount> queryUser(String subarealevelpath);
+
+    void deleteSubAreaGroupDetailByUserid(Long userid);
+
+    List<OrganSelectResult> querySonOrganPageByLevel(Integer subarealevel, String searchcode);
 }
 }

+ 119 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/entity/Investortransfer.java

@@ -0,0 +1,119 @@
+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 2025-01-02
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("INVESTORTRANSFER")
+@ApiModel(value="Investortransfer对象", description="投资者转移表")
+@KeySequence(value = "SEQ_INVESTORTRANSFER")
+public class Investortransfer extends Model<Investortransfer> {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "AutoID")
+    @TableId(value = "AUTOID", type = IdType.INPUT)
+    private Long autoid;
+
+    @ApiModelProperty(value = "转移类型 - 1:单个转移(交易商)  2:批量转移(交易商) 3:子机构转移")
+    @TableField("TRANSFERTYPE")
+    private Integer transfertype;
+
+    @ApiModelProperty(value = "转出投资者[单个转移]")
+    @TableField("INVESTORUSERID")
+    private Long investoruserid;
+
+    @ApiModelProperty(value = "转出会员 [批量转移]")
+    @TableField("MEMBERUSERID")
+    private Long memberuserid;
+
+    @ApiModelProperty(value = "转出机构 [批量转移]")
+    @TableField("AREAUSERID")
+    private Long areauserid;
+
+    @ApiModelProperty(value = "转出经纪人 [批量转移]")
+    @TableField("BROKERUSERID")
+    private Long brokeruserid;
+
+    @ApiModelProperty(value = "转入会员")
+    @TableField("NEWMEMBERUSERID")
+    private Long newmemberuserid;
+
+    @ApiModelProperty(value = "转入机构")
+    @TableField("NEWAREAUSERID")
+    private Long newareauserid;
+
+    @ApiModelProperty(value = "转入经纪人")
+    @TableField("NEWBROKERUSERID")
+    private Long newbrokeruserid;
+
+    @ApiModelProperty(value = "转移状态 - 1:未执行 2:执行成功 3:执行失败 4:已撤销 5:执行中")
+    @TableField("TRANSFERSTATUS")
+    private Integer transferstatus;
+
+    @ApiModelProperty(value = "错误码")
+    @TableField("RETCODE")
+    private String retcode;
+
+    @ApiModelProperty(value = "备注")
+    @TableField("REMARK")
+    private String remark;
+
+    @ApiModelProperty(value = "操作人")
+    @TableField("OPERATORID")
+    private String operatorid;
+
+    @ApiModelProperty(value = "创建时间")
+    @TableField("CREATETIME")
+    private Date createtime;
+
+    @ApiModelProperty(value = "更新时间")
+    @TableField("UPDATETIME")
+    private Date updatetime;
+
+    @ApiModelProperty(value = "转出运营中心 [批量转移]")
+    @TableField("OPCENTERUSERID")
+    private Long opcenteruserid;
+
+    @ApiModelProperty(value = "转出代理商 [批量转移]")
+    @TableField("AGENTUSERID")
+    private Long agentuserid;
+
+    @ApiModelProperty(value = "转入运营中心 [批量转移]")
+    @TableField("NEWOPCENTERUSERID")
+    private Long newopcenteruserid;
+
+    @ApiModelProperty(value = "转入代理商 [批量转移]")
+    @TableField("NEWAGENTUSERID")
+    private Long newagentuserid;
+
+    @ApiModelProperty(value = "转移方式(3:子机构转移) 1:转下级 2:整体转移")
+    @TableField("TRANSFERMODE")
+    private Integer transfermode;
+
+
+    @Override
+    public Serializable pkVal() {
+        return this.autoid;
+    }
+
+}

+ 2 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganAddSonOrganParam.java

@@ -120,6 +120,8 @@ public class OrganAddSonOrganParam {
     @ApiModelProperty(value = "附件2 ")
     @ApiModelProperty(value = "附件2 ")
     private String attachment2;
     private String attachment2;
 
 
+    private Integer accountstatus;
+
     private Long reckonaccountid;
     private Long reckonaccountid;
 
 
 }
 }

+ 43 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganSonTransferAddParam.java

@@ -0,0 +1,43 @@
+package com.muchinfo.mtp3pojos.vo.organ.son;
+
+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 = "OrganSonTransferAddParam对象", description = "子机构转移")
+public class OrganSonTransferAddParam {
+
+    private Integer diversiontype;
+
+    @ApiModelProperty(value = "转出类型")
+    private Integer diversionoutlevel;
+
+    @ApiModelProperty(value = "转出机构")
+    private Long outparentuserid;
+
+    @ApiModelProperty(value = "转入方式")
+    private Integer transfermode;
+
+    @ApiModelProperty(value = "转入类型")
+    private Integer diversioninlevel;
+
+    @ApiModelProperty(value = "转出机构")
+    private Long inuserid;
+
+    private Long outborkerid;
+
+    private Long outinvestor;
+
+    private Long outmemberuserid;
+
+    private Long inmemberuserid;
+
+    private Long inborker;
+}

+ 29 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganSonTransferParam.java

@@ -0,0 +1,29 @@
+package com.muchinfo.mtp3pojos.vo.organ.son;
+
+import io.swagger.annotations.ApiModel;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Builder
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+@ApiModel(value = "OrganSonTransferParam对象", description = "子机构转移")
+public class OrganSonTransferParam {
+
+    private Integer transferusertype;
+
+    private Long outmemberuserid;
+
+    private Long inuserid;
+
+    private Integer transferstatus;
+
+    private Long memberuserid;
+
+    private Integer pageNum;
+
+    private Integer pageSize;
+}

+ 45 - 0
mtp3-pojos/src/main/java/com/muchinfo/mtp3pojos/vo/organ/son/OrganSonTransferResult.java

@@ -0,0 +1,45 @@
+package com.muchinfo.mtp3pojos.vo.organ.son;
+
+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 = "OrganSonTransferResult对象", description = "子机构转移响应")
+public class OrganSonTransferResult {
+
+    @ApiModelProperty(value = "转出机构")
+    private String outparentusername;
+
+    @ApiModelProperty(value = "转出机构类型")
+    private Integer outlevel;
+
+    @ApiModelProperty(value = "转入机构")
+    private String inuseridname;
+
+    @ApiModelProperty(value = "转入机构类型")
+    private Integer inlevel;
+
+    @ApiModelProperty(value = "转移方式")
+    private Integer transfermode;
+
+    @ApiModelProperty(value = "转移状态")
+    private Integer transferstatus;
+
+    @ApiModelProperty(value = "申请时间")
+    private Date createtime;
+
+    private Long autoid;
+
+    private Long areauserid;
+
+    private Long newareauserid;
+}