TaskProcessAspect.java 13.4 KB
package com.huaheng.framework.aspectj;



import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.huaheng.common.constant.QuantityConstant;
import com.huaheng.common.support.Convert;
import com.huaheng.common.utils.AddressUtils;
import com.huaheng.common.utils.ServletUtils;
import com.huaheng.common.utils.StringUtils;
import com.huaheng.common.utils.security.ShiroUtils;
import com.huaheng.framework.aspectj.lang.annotation.ApiLogger;
import com.huaheng.framework.aspectj.lang.annotation.Log;
import com.huaheng.framework.aspectj.lang.annotation.ProcessTrack;
import com.huaheng.framework.aspectj.lang.constant.BusinessStatus;
import com.huaheng.framework.aspectj.lang.constant.ProcessCode;
import com.huaheng.framework.web.domain.AjaxResult;
import com.huaheng.framework.web.domain.RetCode;
import com.huaheng.pc.config.address.service.AddressService;
import com.huaheng.pc.monitor.apilog.service.IApiLogService;
import com.huaheng.pc.monitor.operlog.domain.OperLog;
import com.huaheng.pc.monitor.operlog.service.IOperLogService;
import com.huaheng.pc.monitor.process.domain.TaskProcess;
import com.huaheng.pc.monitor.process.domain.TaskProcessRelation;
import com.huaheng.pc.monitor.process.service.TaskProcessRelationService;
import com.huaheng.pc.monitor.process.service.TaskProcessService;
import com.huaheng.pc.receipt.receiptContainerDetail.domain.ReceiptContainerDetail;
import com.huaheng.pc.shipment.shipmentHeader.domain.ShipmentHeader;
import com.huaheng.pc.system.user.domain.User;
import com.huaheng.pc.task.taskHeader.domain.TaskHeader;
import com.huaheng.pc.task.taskHeader.service.TaskHeaderService;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.AfterThrowing;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.lang.reflect.Method;
import java.util.*;
import java.util.stream.Collectors;

/**
 * 任务过程追踪处理
 *
 * @author xcq
 */

@Aspect
@Component
@EnableAsync
public class TaskProcessAspect {

    private static final Logger log = LoggerFactory.getLogger(TaskProcessAspect.class);


    private  static TaskProcessRelationService taskProcessRelationService;

    private static TaskProcessService taskProcessService;

    private static TaskHeaderService taskHeaderService;

    @Autowired
    public void setTaskProcessRelationService(TaskProcessRelationService processRelationService){
        TaskProcessAspect.taskProcessRelationService = processRelationService;
    }

    @Autowired
    public void setTaskProcessService(TaskProcessService processService){
        TaskProcessAspect.taskProcessService = processService;
    }

    @Autowired
    public void setTaskHeaderService(TaskHeaderService taskHeaderService){
        TaskProcessAspect.taskHeaderService = taskHeaderService;
    }


    /**配置织入点**/
    @Pointcut("@annotation(com.huaheng.framework.aspectj.lang.annotation.ProcessTrack)")
    public void processPointCut()
    {
    }


//    @Around("processPointCut()  && @annotation(processTrack)")
    public Object around(ProceedingJoinPoint point, ProcessTrack processTrack)
    {
        return aroundXXX2Wms(point, processTrack);
    }



    /**处理xxx调用wms接口的日志**/
    private Object aroundXXX2Wms(ProceedingJoinPoint point, ProcessTrack process){
        TaskProcess taskProcess = null;
        Object obj = null;
        TaskProcessRelation taskProcessRelation = null;
        taskProcess = this.iniTaskProcess(process, point );
        taskProcessRelation = this.getTaskProcessRelation(process, point);
        try {
            obj = point.proceed();
        }catch (Exception e){
            this.errDealWith(taskProcess, e);
            if (obj == null){
                obj = AjaxResult.error(e.getMessage());
            }
        } finally {
            if (taskProcessRelation != null){
                this.getClassValue(taskProcess, taskProcessRelation, obj);
            }
            this.finishProcess(taskProcess, obj);
            return obj;
        }
    }


    private void getClassValue(TaskProcess taskProcess, TaskProcessRelation taskProcessRelation, Object obj){
        switch (taskProcessRelation.getCode()){
            case ProcessCode.RECEIPT_TASK_CODE:
            case ProcessCode.SHIPMENT_TASK_CODE:
                this.dataAnalysisReceipt(taskProcess, taskProcessRelation, obj);
                break;
            case ProcessCode.RECEIPT_BILL_CODE:
                this.dataAnalysisReceiptBill(taskProcess, taskProcessRelation, obj);
                break;
            case ProcessCode.SHIPMENT_BILL_CODE:
                this.dataAnalysisShipmentBill(taskProcess, taskProcessRelation, obj);
                break;
            default:
                break;
        }
    }


    /**
     * 解析出库单据key值
     * @param taskProcess
     * @param taskProcessRelation
     * @param obj
     */
    private void dataAnalysisShipmentBill(TaskProcess taskProcess, TaskProcessRelation taskProcessRelation, Object obj){
        //  从请求结果取value
        if (ProcessCode.METHOD_RESULT.equals(taskProcessRelation.getMethodCode()) && obj.getClass() == AjaxResult.class){
            AjaxResult ajaxResult = ((AjaxResult<?>) obj);
            List<ShipmentHeader> shipmentHeaderList = (List<ShipmentHeader>) ajaxResult.getData();
            if (shipmentHeaderList.size() != 0){
                List<Integer> strings = shipmentHeaderList.stream().map(ShipmentHeader::getId).collect(Collectors.toList());
                taskProcess.setClassValue(String.valueOf(strings));
            }
        }
        if (ProcessCode.METHOD_HEAD.equals(taskProcessRelation.getMethodCode())){
            String json = taskProcess.getRequestBody();
            if (json != null && ProcessCode.MODIFICATION_EDIT.equals(taskProcessRelation.getClassName())){
                ShipmentHeader header = JSON.parseObject(json, ShipmentHeader.class);
                if (header != null){
                    taskProcess.setClassValue(String.valueOf(header.getId()));
                    return;
                }
            }
            if (ProcessCode.REVIEW.equals(taskProcessRelation.getClassName())){
                taskProcess.setClassValue(json);
            }
            if (ProcessCode.PUSH_SALES_DELIVERY.equals(taskProcessRelation.getClassName())){
                String value = this.dataAnalysis(taskProcess, taskProcessRelation);
                if (StringUtils.isNotEmpty(value)){
                    taskProcess.setClassValue(value);
                }
            }

        }
    }

    /**
     * 解析入库单据key值
     * @param taskProcess
     * @param taskProcessRelation
     * @param obj
     */
    private void dataAnalysisReceiptBill(TaskProcess taskProcess, TaskProcessRelation taskProcessRelation, Object obj){
        //入库或出库组盘头ID
        String allocationHeadId = this.dataAnalysis(taskProcess, taskProcessRelation);
        if (StringUtils.isEmpty(allocationHeadId)){
            return;
        }
        taskProcess.setClassValue(allocationHeadId);
    }

    /**解析入库key值**/
    private void dataAnalysisReceipt(TaskProcess taskProcess, TaskProcessRelation taskProcessRelation, Object obj){
        //  从请求结果取value
        if (ProcessCode.METHOD_RESULT.equals(taskProcessRelation.getMethodCode())){
            if (obj.getClass() == AjaxResult.class){
                AjaxResult ajaxResult = ((AjaxResult<?>) obj);
//                String ids = ajaxResult.getData().toString();
//                List idList = Arrays.asList(Convert.toIntArray(ids));
                taskProcess.setClassValue(ajaxResult.getData().toString());
            }
        }
        //  从请求头取value
        if (ProcessCode.METHOD_HEAD.equals(taskProcessRelation.getMethodCode())){
            String value = this.dataAnalysis(taskProcess, taskProcessRelation);
            taskProcess.setClassValue(value);
        }
    }

    private  String dataAnalysis(TaskProcess taskProcess, TaskProcessRelation taskProcessRelation){
        String body = taskProcess.getRequestBody();
        Map map = JSON.parseObject(body);
        String value = null;
        if (map != null){
            value = String.valueOf(map.get(taskProcessRelation.getClassKey()));
        }
        return value;
    }

    private void errDealWith(TaskProcess process, Exception exception){
        try {
            // 错误信息
            process.setResponseBody(exception.getMessage());
            process.setState(String.valueOf(RetCode.FAIL.getValue()));
        }catch (Exception e){
            e.printStackTrace();
        }
    }


    private TaskProcess iniTaskProcess(ProcessTrack process, ProceedingJoinPoint point){
        TaskProcess taskProcess = new TaskProcess();
        try {
            // 请求时间
            taskProcess.setRequestTime(new Date());
            HttpServletRequest request = ServletUtils.getRequest();
            // 获取流程编码
            taskProcess.setProcessRelationCode(process.processCode());
            // 获取任务名称
            taskProcess.setTaskName(process.taskName());
            // 获取执行的方法名
            MethodSignature signature = (MethodSignature) point.getSignature();
            taskProcess.setClassName(signature.getName());
            // 接口调用方
            taskProcess.setRequestFrom(process.from());
            Object[] args = point.getArgs();
            String body = JSONObject.toJSONString(args[0]);
            taskProcess.setRequestBody(args == null ? null : body);
//            if (QuantityConstant.WMS_TYPE.equals(process.from())) {
//                this.rebuildRequestBody(taskProcess, request);
//            }else {
//                Object[] args = point.getArgs();
//                String body = JSONObject.toJSONString(args[0]);
//                taskProcess.setRequestBody(args == null ? null : body);
//            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return taskProcess;
    }

    private TaskProcessRelation getTaskProcessRelation(ProcessTrack process, ProceedingJoinPoint point){
        MethodSignature signature = (MethodSignature) point.getSignature();
        // 根据请求编码和方法查询流程关系
        LambdaQueryWrapper<TaskProcessRelation> queryWrapper = Wrappers.lambdaQuery();
        queryWrapper.eq(TaskProcessRelation::getCode, process.processCode())
                .eq(TaskProcessRelation::getClassName, signature.getName());
        TaskProcessRelation taskProcessRelation;
        try {
            taskProcessRelation = taskProcessRelationService.getOne(queryWrapper);
        }catch (Exception e){
            return null;
        }
        return taskProcessRelation;
    }


    /**先从post参数中构造request body*/
    private void rebuildRequestBody(TaskProcess taskProcess, HttpServletRequest request){
        try{
            Set<String> keySet = request.getParameterMap().keySet();
            Iterator<String> it = keySet.iterator();
            StringBuffer sbf = new StringBuffer();
            while(it.hasNext()){
                String key = it.next();
                String value = request.getParameter(key);
                sbf.append(key).append("=").append(value);
                if(it.hasNext()) {
                    sbf.append("&");
                }
            }
            // 获取请求内容
            taskProcess.setRequestBody(sbf.toString());
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    private void finishProcess(TaskProcess process, Object obj){
        try {
            if (StringUtils.isEmpty(process.getState())){
                // 获取响应内容
                process.setResponseBody(JSONObject.toJSON(obj).toString());
                // 获取响应状态
                HttpServletResponse resp = ServletUtils.getResponse();
                process.setState(String.valueOf(resp.getStatus()));
            }
        }catch (Exception e){
            e.printStackTrace();
        }finally {
            saveTaskProcess(process);
        }
    }

    @Async
    public void saveTaskProcess(TaskProcess process){
        try {
            String value = process.getClassValue();
            if (StringUtils.isNotEmpty(value)){
                value = value.replace("\"", "");
                List idList = Arrays.asList(Convert.toIntArray(value));
                if (idList != null && idList.size() > 0){
                    idList.forEach(item->{
                        String classValue = String.valueOf(item);
                        process.setClassValue(classValue);
                        taskProcessService.saveOrUpdate(process);
                    });
                    return;
                }


            }
//
        }catch (Exception e){
            e.printStackTrace();
        }

    }

}