package com.boco.nbd.wios.flow.process;

import cn.hutool.core.collection.CollUtil;
import com.boco.nbd.cams.core.util.LambdaUtils;
import com.boco.nbd.framework.workflow.entity.SubmitFlowRequest;
import com.boco.nbd.framework.workflow.entity.SubmitTypeEnum;
import com.boco.nbd.framework.workflow.entity.exception.FlowException;
import com.boco.nbd.framework.workflow.flow.AbstractFlow;
import com.boco.nbd.wios.flow.entity.bo.LocalSubmitFlowBO;
import com.boco.nbd.wios.flow.entity.po.OrderPO;
import com.boco.nbd.wios.flow.enums.FlowNodeEnum;
import com.boco.nbd.wios.flow.service.IOrderService;
import com.boco.nbd.wios.flow.util.ProcessUtil;
import com.boco.nbd.wios.manage.entity.cams.enums.UploadFileType;
import com.boco.nbd.wios.manage.entity.common.bo.UploadFile;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * @author:cao hai
 * @date:2022/6/30 17:04
 * @version:V1.0
 * @description:Process105
 * @modify:
 */
@Service("Process105")
public class Process105 extends AbstractFlow {

    @Autowired
    protected IOrderService orderService;

    /**
     * 预处理(业务数据调整)
     *
     * @param request
     */
    @Override
    protected void preProcess(SubmitFlowRequest request) {
        LocalSubmitFlowBO bo = (LocalSubmitFlowBO) request;
        if (SubmitTypeEnum.Transfer.equals(bo.getSubmitType())) {
            bo.userNamesHandler();
            bo.setCommentMsg(bo.getCurrentNodeEnum().getValue() + "工单转派" + bo.getBusiness().getSurveyStaffName());
        } else if (SubmitTypeEnum.TaskFlow.equals(bo.getSubmitType())) {
            StringBuffer builder = new StringBuffer();
            boolean electricExpand = ProcessUtil.compare(bo.getBusiness().getElectricExpand(), 1);
            builder.append(electricExpand ? "电力报装" : "");
            if (electricExpand) {
                bo.setNextNodeEnum(FlowNodeEnum.NODE_115);
            } else {
                bo.setNextNodeEnum(FlowNodeEnum.NODE_106);
                //下一节点流转至当前勘测电工
                if (bo.getOldBusiness().getSurveyStaffId() == null) {
                    throw new FlowException(bo.getWorkId() + "下一节点操作用户缺失!");
                }
                bo.getUserNames().add(bo.getOldBusiness().getSurveyStaffId() + "");
                bo.getBusiness().setSurveyFinishTime(new Date());
                bo.getTaskParam().put(LambdaUtils.getFieldName(OrderPO::getSurveyFinishTime), bo.getBusiness().getSurveyFinishTime());
                builder.append(FlowNodeEnum.NODE_105.getValue());
            }
            bo.setCommentMsg(builder.toString());
            //不更新order中address
            bo.getBusiness().setAddress(null);
        }
    }

    /**
     * 验证参数
     *
     * @param request
     */
    @Override
    protected void verifyParam(SubmitFlowRequest request) {

    }

    /**
     * 后续处理
     *
     * @param request
     */
    @Override
    protected void postProcess(SubmitFlowRequest request) {
        LocalSubmitFlowBO bo = (LocalSubmitFlowBO) request;
        //处理增项费用、高附加值
        orderService.saveInstallItem((LocalSubmitFlowBO) request);
        //附件
        String fieldName = LambdaUtils.getFieldName(OrderPO::getFiles);
        if (CollUtil.isNotEmpty(bo.getFormData()) && bo.getFormData().containsKey(fieldName)) {
            List<UploadFile> fileList = UploadFile.jsonHandle(bo.getFormData().get(fieldName) + "", true);
            orderService.saveReportItem(fileList, UploadFileType.SURVEY_MATERIAL, request.getWorkId() + "");
            orderService.saveReportItem(fileList, UploadFileType.SURVEY_PHOTO, request.getWorkId() + "");
        }
    }
}