瀏覽代碼

批量分单(个贷)

wucl 1 年之前
父節點
當前提交
df99c1a1ab

+ 22 - 0
biz-base/src/main/java/com/dayou/controller/PersonalController.java

@@ -1,6 +1,7 @@
 package com.dayou.controller;
 
 
+import com.dayou.dto.PersonalAllotOrderDTO;
 import com.dayou.dto.TaskRecordDTO;
 import com.dayou.dto.WorkNodeCommit;
 import com.dayou.vo.PersonalVO;
@@ -151,6 +152,27 @@ public class PersonalController extends BaseController {
         return RestResponse.data(pages);
     }
 
+    /**
+     * 个贷业务待分单订单列表
+     * @param page
+     * @return
+     */
+    @GetMapping("/waitingAllot")
+    public RestResponse<Page<PersonalVO>> waitingAllotOrderPage(Page page){
+        Page<PersonalVO> ret = personalService.waitingAllotOrderPage(page);
+        return RestResponse.data(ret);
+    }
+
+    /**
+     * 批量分单
+     * @param dto
+     * @return
+     */
+    @PostMapping("/batchAllot")
+    public RestResponse<Boolean> doAllotOrder(@RequestBody @Valid PersonalAllotOrderDTO dto){
+        Boolean ret = personalService.doAllotOrder(dto);
+        return RestResponse.data(ret);
+    }
 
 }
 

+ 3 - 0
common/src/main/java/com/dayou/exception/ErrorCode.java

@@ -86,6 +86,9 @@ public class ErrorCode {
     public static final ErrorCode NEXT_NODE_NOT_EXISTS = ErrorCode("10040", "下一节点未找到,请联系系统管理员。");
 
     public static final ErrorCode P_AMOUNT_BIGGER_O_AMOUNT = ErrorCode("10041", "订单号:[{0}]下的报告号分配金额之后大于订单认领金额,请检查后再认领。");
+
+    public static final ErrorCode DATA_OUT_OFF = ErrorCode("10042", "页面数据超时,请刷新页面。");
+
     private String code;
     private String errorMsg;
 

+ 4 - 0
dao/src/main/java/com/dayou/mapper/PersonalMapper.java

@@ -31,4 +31,8 @@ public interface PersonalMapper extends CustomBaseMapper<Personal> {
     Page<PersonalVO> saveFileDone(Page page, @Param("personal")PersonalVO personal ,@Param("keyword") String keyword);
 
     Page<PersonalVO> myOrder(Page page, @Param("personal")PersonalVO personal ,@Param("keyword") String keyword);
+
+    Page<PersonalVO> waitingAllotOrderPage(Page page);
+
+    void batchUpdateOutWardStaffId(@Param("userId") Long userId, @Param("list") List<Long> orderIds);
 }

+ 2 - 0
dao/src/main/java/com/dayou/mapper/WorkTaskRecordMapper.java

@@ -51,4 +51,6 @@ public interface WorkTaskRecordMapper extends CustomBaseMapper<WorkTaskRecord> {
      * @return List<AssetsTaskDoneVO>
      */
     Page<AssetsTaskDoneVO> getAssetsTaskDoneList(@Param("assetsSelectDTO") AssetsSelectDTO assetsSelectDTO, Page page);
+
+    void batchFinishTaskByInstanceId(@Param("list") List<Long> instanceIds);
 }

+ 37 - 0
dao/src/main/resources/mapper/PersonalMapper.xml

@@ -364,4 +364,41 @@
             and cc2.NAME like concat('%',#{personal.clientSubName},'%')
         </if>
     </select>
+    
+    <select id="waitingAllotOrderPage" resultType="com.dayou.vo.PersonalVO">
+        SELECT
+            wfni.*,
+            p.location,
+            p.clientele_type,
+            p.agent,
+            p.bailorA,
+            p.bailorA_tel,
+            p.bailorB,
+            p.bailorB_tel,
+            cc1.NAME AS clientName,
+            cc2.NAME AS clientSubName,
+            cl1.NAME AS contactName,
+            cl1.mobile AS contactTel,
+            u.NAME AS clientManager
+        FROM
+            ( SELECT wf.id as currentNodeId, wn.name as currentNodeName,wf.node_id, wf.business_id as id, wf.business_sub_id as orderId FROM work_flow_node_instance wf
+                                                                                                                                                 left join work_node wn on (wn.id = wf.node_id and wf.flow_id = wn.flow_id)
+              WHERE wf.business_type = 'PERSONAL_BUSINESS' AND wf.state = 'PENDING' AND wf.deleted = 0  and wn.code = 'DEPARTMENT_ALLOCATION') wfni
+                LEFT JOIN personal p ON p.id = wfni.id
+                LEFT JOIN customer_company cc1 ON cc1.id = p.clientele_id
+                LEFT JOIN customer_company cc2 ON cc2.id = p.clientele_sub_id
+                LEFT JOIN customer_linkman cl1 ON cl1.id = p.clientele_contact_id
+                LEFT JOIN `user` u ON u.id = p.client_manager_id
+        WHERE
+            p.deleted = 0
+        order by p.created DESC
+    </select>
+
+    <update id="batchUpdateOutWardStaffId">
+        update personal set outward_staff = #{userId} where id in (
+            <foreach collection="list" item="item" separator="," index="index">
+                #{item}
+            </foreach>
+            )
+    </update>
 </mapper>

+ 8 - 0
dao/src/main/resources/mapper/WorkTaskRecordMapper.xml

@@ -601,4 +601,12 @@
         </if>
         ORDER BY log.created DESC
     </select>
+
+    <update id="batchFinishTaskByInstanceId" parameterType="java.util.List">
+        update work_task_record set finished = 1 , finish_time = now() where instance_id in (
+            <foreach collection="list" index="index" item="item" separator="," >
+                #{item}
+            </foreach>
+            )
+    </update>
 </mapper>

+ 24 - 0
domain/src/main/java/com/dayou/dto/PersonalAllotOrderDTO.java

@@ -0,0 +1,24 @@
+package com.dayou.dto;
+
+import com.dayou.vo.PersonalVO;
+import com.github.liangbaika.validate.annations.AbcValidate;
+import com.github.liangbaika.validate.enums.Check;
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class PersonalAllotOrderDTO {
+
+    /**
+     * 外业人员id
+     */
+    @AbcValidate(required = true,message = "人员id不能为空",fun = Check.NotNull)
+    private Long id;
+
+    /**
+     * 订单集合
+     */
+    @AbcValidate(required = true,message = "订单不能为空",fun = Check.NotNull)
+    private List<PersonalVO> orders;
+}

+ 5 - 0
service/src/main/java/com/dayou/service/IPersonalService.java

@@ -1,5 +1,6 @@
 package com.dayou.service;
 import com.dayou.dto.OrderReportDTO;
+import com.dayou.dto.PersonalAllotOrderDTO;
 import com.dayou.dto.TaskRecordDTO;
 import com.dayou.dto.WorkNodeCommit;
 import com.dayou.entity.Personal;
@@ -53,4 +54,8 @@ public interface IPersonalService extends IService<Personal> {
     Boolean personalAllotRealAmount(List<OrderReportDTO> claimOrders);
 
     Boolean doPersonalAllotRealAmount(List<OrderReportDTO> claimOrders);
+
+    Page<PersonalVO> waitingAllotOrderPage(Page page);
+
+    Boolean doAllotOrder(PersonalAllotOrderDTO dto);
 }

+ 52 - 9
service/src/main/java/com/dayou/service/impl/PersonalServiceImpl.java

@@ -5,15 +5,11 @@ import cn.hutool.core.util.StrUtil;
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.dayou.common.BaseEntity;
-import com.dayou.configuration.DfsConfig;
 import com.dayou.dto.*;
 import com.dayou.entity.*;
 import com.dayou.enums.CertificateEnum;
 import com.dayou.enums.GlobalConfigEnum;
-import com.dayou.enums.MainBusinessEnum;
 import com.dayou.enums.workflow.HandlerPermissionEnum;
-import com.dayou.enums.workflow.NodeLogEnum;
-import com.dayou.enums.workflow.NodeStateEnum;
 import com.dayou.enums.workflow.WorkflowNodeEnum;
 import com.dayou.exception.ErrorCode;
 import com.dayou.mapper.*;
@@ -24,9 +20,9 @@ import com.dayou.service.workflow.IWorkFlowService;
 import com.dayou.service.workflow.IWorkNodeService;
 import com.dayou.service.workflow.IWorkNodeTaskService;
 import com.dayou.utils.LoginContext;
-import com.dayou.utils.QRCodeUtil;
 import com.dayou.vo.PersonalVO;
 import com.dayou.vo.TaskTodoVO;
+import com.dayou.workflow.handler.PersonalNodeHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -36,14 +32,14 @@ import java.math.BigDecimal;
 import java.time.LocalDateTime;
 import java.util.Date;
 import java.util.List;
-import java.util.Map;
 import java.util.stream.Collectors;
 
 import org.springframework.transaction.annotation.Transactional;
 
 import static com.dayou.common.Constants.PERSONAL_INWARD;
-import static com.dayou.common.Constants.PROD_VALIDATE_URI;
 import static com.dayou.enums.MainBusinessEnum.PERSONAL_BUSINESS;
+import static com.dayou.enums.workflow.NodeLogEnum.PASS;
+import static com.dayou.enums.workflow.NodeStateEnum.PENDING;
 
 /**
  * <p>
@@ -107,6 +103,9 @@ public class PersonalServiceImpl extends ServiceImpl<PersonalMapper, Personal> i
     @Autowired
     private IBusinessProductionService businessProductionService;
 
+    @Autowired
+    private PersonalNodeHandler personalNodeHandler;
+
 
     @Override
     @SuppressWarnings("unchecked")
@@ -183,7 +182,7 @@ public class PersonalServiceImpl extends ServiceImpl<PersonalMapper, Personal> i
             try {
                 for (WorkFlowNodeInstance workFlowNodeInstance: exists){
                     if (workFlowNodeInstance.getSequence().equals(0)){
-                        workFlowNodeInstance.setState(NodeStateEnum.PENDING.name());
+                        workFlowNodeInstance.setState(PENDING.name());
                         workFlowNodeInstanceService.updateById(workFlowNodeInstance);
                     }else {
                         workFlowNodeInstanceService.removeById(workFlowNodeInstance.getId());
@@ -237,7 +236,7 @@ public class PersonalServiceImpl extends ServiceImpl<PersonalMapper, Personal> i
                     log.setBusinessType(PERSONAL_BUSINESS.name());
                     log.setHandingTime(new Date().getTime() - x.getTaskCreated().getTime());
                     log.setHandlerId(currentUserId);
-                    log.setState(NodeLogEnum.PASS.name());
+                    log.setState(PASS.name());
                     log.setInstanceId(x.getCurrentNodeId());
                     log.setBusinessSubId(x.getOrderId());
                     return log;
@@ -356,4 +355,48 @@ public class PersonalServiceImpl extends ServiceImpl<PersonalMapper, Personal> i
         }
         return Boolean.FALSE;
     }
+
+    @Override
+    public Page<PersonalVO> waitingAllotOrderPage(Page page) {
+        return personalMapper.waitingAllotOrderPage(page);
+    }
+
+    @Transactional
+    @Override
+    public Boolean doAllotOrder(PersonalAllotOrderDTO dto) {
+        List<PersonalVO> orders = dto.getOrders();
+        if (CollectionUtil.isNotEmpty(orders)){
+            Long userId = dto.getId();
+            List<Long> orderIds = orders.stream().map(BaseEntity::getId).collect(Collectors.toList());
+            List<Long> instanceIds = orders.stream().map(PersonalVO::getCurrentNodeId).collect(Collectors.toList());
+
+            batchCheckNodeState(instanceIds);
+            //更新订单业务表的外业人员
+            personalMapper.batchUpdateOutWardStaffId(userId,orderIds);
+            //任务状态更新为已完成
+            workTaskRecordMapper.batchFinishTaskByInstanceId(instanceIds);
+            orders.stream().forEach(x->{
+                WorkNodeCommit workNodeCommit = new WorkNodeCommit();
+                workNodeCommit.setState(PASS);
+                workNodeCommit.setIfCheckTask(true);
+                workNodeCommit.setComments("批量分单");
+                workNodeCommit.setInstanceNodeId(x.getCurrentNodeId());
+                workNodeCommit.setBusinessSubId(x.getOrderId());
+                workNodeCommit.setNextHandlerId(userId);
+                personalNodeHandler.forward(workNodeCommit);
+            });
+            return Boolean.TRUE;
+        }
+        return Boolean.FALSE;
+    }
+
+    private void batchCheckNodeState(List<Long> instanceIds) {
+        List<WorkFlowNodeInstance> list = workFlowNodeInstanceService.list(new LambdaQueryWrapper<WorkFlowNodeInstance>()
+                .select(WorkFlowNodeInstance::getState).in(BaseEntity::getId, instanceIds).eq(BaseEntity::getDeleted, Boolean.FALSE));
+        for (WorkFlowNodeInstance instance : list) {
+            if (!instance.getState().equals(PENDING.name())){
+                ErrorCode.throwBusinessException(ErrorCode.DATA_OUT_OFF);
+            }
+        }
+    }
 }

+ 3 - 0
service/src/main/java/com/dayou/workflow/config/WorkNodeProcessable.java

@@ -90,6 +90,9 @@ public class WorkNodeProcessable {
     protected WorkNodeDTO beforeForward(WorkNodeCommit commit,WorkFlowNodeInstance currentInstanceNode){
         //节点控制前置处理。
         //当任务不需要当前节点处理人产生业务数据的时候,则把任务状态改为已完成。
+        if (!currentInstanceNode.getState().equals(PENDING.name())){
+            ErrorCode.throwBusinessException(ErrorCode.COMMIT_STATE_ERROR);
+        }
         List<Long> notBusinessHandleTaskId = workTaskRecordMapper.getNotBusinessHandleTaskId(currentInstanceNode.getId());
         if (CollectionUtil.isNotEmpty(notBusinessHandleTaskId)){
             workTaskRecordService.update(new LambdaUpdateWrapper<WorkTaskRecord>().set(WorkTaskRecord::getFinished,Boolean.TRUE)