package com.bcxin.risk.zjzw;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.RandomUtil;
import com.alibaba.druid.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.alibaba.gov.api.client.AtgBusClient;
import com.alibaba.gov.api.client.DefaultAtgBusClient;
import com.alibaba.gov.api.domain.AtgBusSecretKey;
import com.alibaba.gov.api.domain.FormFieldDTO;
import com.alibaba.gov.api.domain.ReceptionVO;
import com.alibaba.gov.api.domain.StuffInfoVO;
import com.alibaba.gov.api.request.*;
import com.alibaba.gov.api.response.*;
import com.bcxin.risk.activity.Activity;
import com.bcxin.risk.activity.ActivityDao;
import com.bcxin.risk.activity.ReceiveJson;
import com.bcxin.risk.activity.ReceiveJsonDao;
import com.bcxin.risk.base.domain.util.StringUtil;
import com.bcxin.risk.cache.redis.NewRedisUtil;
import com.bcxin.risk.common.dto.AjaxResultDTO;
import com.bcxin.risk.common.dto.data.SBDataDTO;
import com.bcxin.risk.common.service.NotifyService;
import com.bcxin.risk.common.util.ConfigUtil;
import com.bcxin.risk.communicate.main.MainReqService;
import com.bcxin.risk.constant.DictConst;
import com.bcxin.risk.material.service.MaterialService;
import com.bcxin.risk.org.domain.Org;
import com.bcxin.risk.org.domain.OrgDao;
import com.bcxin.risk.org.dto.OrgDataDto;
import com.bcxin.risk.sys.SysRegionUtil;
import com.bcxin.risk.user.baseUser.service.UserApplicationService;
import com.bcxin.risk.user.baseUser.service.UserService;
import com.bcxin.risk.user.contractor.service.ContractorService;
import com.bcxin.risk.user.dao.UserDao;
import com.bcxin.risk.user.domain.User;
import com.bcxin.risk.user.dto.data.UserDataDto;
import com.bcxin.risk.user.dto.data.UserDto;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.AuthenticationException;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.CompletableFuture;

import static com.bcxin.risk.constant.DictConst.RE_SUBMIT_YES;
import static com.bcxin.risk.constant.DictConst.ZJZW_HEADER_FIRST;

/**
 * 浙江政务2.0
 * 事项：3000202401
 *
 * @author wangjianjun
 * @date 2020/9/3
 */
@Service
@Slf4j
public class ZjZwSbService {
    private static final String APP_ID = "3000202401"; //大活群众性活动安全许可

    @Resource
    private UserService userService;

    @Resource
    private NotifyService notifyService;

    @Resource
    private MainReqService mainReqService;

    @Resource
    private UserApplicationService userApplicationService;

    @Autowired
    private ActivityDao activityDao;

    @Autowired
    private UserDao userDao;

    @Autowired
    private NewRedisUtil newRedisUtil;

    @Autowired
    private ContractorService contractorService;

    @Autowired
    private SysRegionUtil sysRegionUtil;

    @Resource
    private ReceiveJsonDao receiveJsonDao;

    @Resource
    private OrgDao orgDao;

    @Resource
    private MaterialService materialService;

    /**
     * 收件
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean receive(AtgBizAffairReceiveRequest request) throws Exception {
        //将报文存起来
        ReceiveJson receiveJson = new ReceiveJson();
        //若Oid存在则更新
        ReceiveJson receiveJsonOrigin = receiveJsonDao.findByZwid(request.getProjId());
        if (receiveJsonOrigin != null) {
//            receiveJson.setOid(receiveJsonOrigin.getOid());
        } else {
            receiveJson.setZwId(request.getProjId());
            receiveJson.setReceiveJson(JSON.toJSONString(request, SerializerFeature.DisableCircularReferenceDetect));
            receiveJsonDao.saveOrUpdate(receiveJson);
        }
        String reportUrl = "";//评估报告名称
        String aqgzfaUrl = "";//安全工作方案
        String sfzmUrl = "";//身份证明
        String hdfaUrl = "";//活动方案说明
        String hdcszmUrl = "";//活动场所证明
        String cbzzmUrl = "";//保存承办者身份证明
        String addFiles = "";//补充材料
        String otherAddFiles = "";//其他补充材料
        ObjectMapper mapper = new ObjectMapper();
        //基本活动信息
        AffFormInfo affFormInfo = mapper.readValue(request.getAffFormInfo(), AffFormInfo.class);
        //材料
        List<StuffInfoVO> materialList = request.getSuffInfoList();
        if (materialList.size() == 0) return false;
        for (StuffInfoVO stuffInfoVO : materialList) {
            if (StringUtils.equals(DictConst.ZJZW_PGBG, stuffInfoVO.getStuffUniId())) {
                //riskReport即评估报告的id
                reportUrl = stuffInfoVO.getAttachPath();
            }
            if (StringUtils.equals(DictConst.ZJZW_AQGZFA, stuffInfoVO.getStuffUniId())) {
                //安全活动工作方案
                aqgzfaUrl = stuffInfoVO.getAttachPath();
            }
            if (StringUtils.equals(DictConst.ZJZW_SFZM, stuffInfoVO.getStuffUniId())) {
                //安全责任人的身份证明
                sfzmUrl = stuffInfoVO.getAttachPath();
            }
            if (StringUtils.equals(DictConst.ZJZW_HDFA, stuffInfoVO.getStuffUniId())) {
                //活动方案
                hdfaUrl = stuffInfoVO.getAttachPath();
            }
            if (StringUtils.equals(DictConst.ZJZW_HDCSZM, stuffInfoVO.getStuffUniId())) {
                //活动场所证明
                hdcszmUrl = stuffInfoVO.getAttachPath();
            }
            if (StringUtils.equals(DictConst.ZJZW_CBZZM, stuffInfoVO.getStuffUniId())) {
                //承办者证明
                cbzzmUrl = stuffInfoVO.getAttachPath();
            }
            if (StringUtils.equals(DictConst.ZJZW_BCCL, stuffInfoVO.getStuffUniId())) {
                //补充材料
                addFiles = stuffInfoVO.getAttachPath().replace(";", "&&");
            }
            if (StringUtils.equals(DictConst.ZJZW_OTHER_BCCL, stuffInfoVO.getStuffUniId())) {
                //其他补充材料
                otherAddFiles = stuffInfoVO.getAttachPath().replace(";", "&&");
            }
        }
        String areacode = affFormInfo.getActivityArea();
        String province = areacode.substring(0, 2) + "0000";
        String city = areacode.substring(0, 4) + "00";
        //如果用户不存在，则创建一个。假设用户手机号是mobile
        User user = getUser(request.getApplicantVO().getApplyName(), request.getApplicantVO().getContactTelNo(), affFormInfo.getCbdwmc(), province, city, areacode, request.getApplicantVO().getApplyUid());//这里市、区有问题
        //先把表格存数据库，文件存ftp
        //第一次接收办件
        if (!newRedisUtil.hasKey(ZJZW_HEADER_FIRST + request.getProjId()) == true) {
            //保存活动基本信息
            Activity activity = new Activity();
            activity.setZwId(request.getProjId());//办件id
            activity.setSponsor(affFormInfo.getCbdwmc());//承办方
            activity.setName(affFormInfo.getActivityName());//活动名称
            activity.setActivityType(affFormInfo.getActivityType());
            activity.setProvince(sysRegionUtil.getRegionById(province));
            activity.setCity(sysRegionUtil.getRegionById(city));
            activity.setArea(sysRegionUtil.getRegionById(areacode));
            activity.setAddress(affFormInfo.getAddress());
            activity.setNumber(affFormInfo.getNumber());
            activity.setStartDate(DateUtil.format(new Date(Long.valueOf(affFormInfo.getStartDate())), "yyyy-MM-dd HH:mm"));
            activity.setEndDate(DateUtil.format(new Date(Long.valueOf(affFormInfo.getEndDate())), "yyyy-MM-dd HH:mm"));
            activity.setOrg(user.getOrg());
            activity.setUnit(sysRegionUtil.getRegionById(areacode + "01"));
            activity.setActivityNo("OD" + DateUtil.current(false) + RandomUtil.randomNumbers(5));
            activity.setPostMaterial(DictConst.N);
            activity.setUser(user);
            activity.setChannel(user.getChannel());
            activity.setIsPushBadGoodSystem(DictConst.N);
            activity.setCreateOn(new Date());
            activity.setUpdateOn(new Date());
            //todo 随便编的
            activity.setAddressType("1");//活动地址类型
            activity.setGov("0");//非政府
            activity.setActivityStatus(DictConst.ACTIVITYSTATUS_SQZ);
            activity.setApprovalStatus(DictConst.APPROVALSTATUS_DSH);
            activity.setActivitySource(DictConst.ACTIVITYSOURCE_ZXSB);
            activity.setChannel("http://test2.pss360.cn");//todo 这个地址要改成浙江的
            long days = 0L;
            try {
                days = DateUtil.between(DateUtil.parseDate(activity.getStartDate()), DateUtil.parseDate(activity.getEndDate()), DateUnit.DAY);
            } catch (Exception e) {
            }
            activity.setDays(String.valueOf(days));
            activityDao.saveOrUpdate(activity);
            //提交等级评定
            contractorService.submitGradeRank(activity, user, reportUrl, "1", null, null);//commitWay(提交方式)默认采取第一种
            //如果有补充材料，就打个报批材料
            if (org.apache.commons.lang.StringUtils.isNotBlank(addFiles)) {
                materialService.submitXKMaterialToSP(activity, user, addFiles);
            }
        } else {
            String multiReceiveId = request.getExtInfo().get("multiReceiveId");//二阶段提交时才处理
            if (org.apache.commons.lang.StringUtils.isNotBlank(multiReceiveId)) {
                Activity activity = activityDao.findActivityByZwId(request.getProjId());
                //如果不是，判断是否勾选重新等级评定
                if (RE_SUBMIT_YES.equalsIgnoreCase(affFormInfo.getReSubmit())) {//
                    //todo 重新进行等级评定
                    //根据zwId查出活动id
                    //调用重新进行等级评定的接口
                    CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
                        contractorService.reGradeRank(activity, affFormInfo.getReSubmitComments());
                    });
                } else {
                    //接收用户上传的5项安全许可材料,开始进行审批
                    contractorService.submitXKSP(activity, aqgzfaUrl, sfzmUrl, hdfaUrl, hdcszmUrl, cbzzmUrl, "","");
                    //如果有补充材料，就打个报批材料
                    if (org.apache.commons.lang.StringUtils.isNotBlank(otherAddFiles)) {
                        if (org.apache.commons.lang3.StringUtils.isNotBlank(addFiles)) {
                            otherAddFiles = addFiles + "&&" + otherAddFiles;
                        }
                        materialService.submitXKMaterialToSP(activity, user, otherAddFiles);//补充材料，要包括第一阶段的材料。
                    }
                }
            }
        }
        return true;
    }

    /**
     * 受理
     */
    public boolean accept(AtgBizAffairAcceptRequest atgBizAffairAcceptRequest) throws Exception {
        log.info(atgBizAffairAcceptRequest.getProjId() + "受理开始");
        try {
            //1. 初始化网关地址、秘钥信息
            String gatewayUrl = ConfigUtil.getValue("zjzw_gateway_url");
            String appId = APP_ID;
            List<AtgBusSecretKey> secretKeys = new ArrayList<AtgBusSecretKey>();
            AtgBusSecretKey atgBusSecretKey = new AtgBusSecretKey(ConfigUtil.getValue("zjzw_key_id"), ConfigUtil.getValue("zjzw_secret_key"));
            secretKeys.add(atgBusSecretKey);
            //2. 初始化客户端
            AtgBusClient atgBusClient = new DefaultAtgBusClient(gatewayUrl, appId, secretKeys);
            //3. 找到对应服务的request，拼装业务信息
//        AtgBizAffairAcceptRequest atgBizAffairAcceptRequest = new AtgBizAffairAcceptRequest();
            // 政务总线统一分配应用ID
            atgBizAffairAcceptRequest.setAppId(APP_ID);
            // 扩展字段信息 (可选)
            Map<String, String> extInfo = new HashMap<String, String>();
            atgBizAffairAcceptRequest.setExtInfo(extInfo);
            // 办件受理时间
            atgBizAffairAcceptRequest.setGmtAccept(new Date());
            // 备注
            atgBizAffairAcceptRequest.setMemo("公安已受理");
            // 办理人员姓名
            atgBizAffairAcceptRequest.setOperatorName(atgBizAffairAcceptRequest.getDeptName());//办理人名称先写为办理单位名称.todo
            // 办理人员编号
            atgBizAffairAcceptRequest.setOperatorUid(APP_ID);//办理人员编号，这个令人头疼 todo
            // 承诺办结时间
            atgBizAffairAcceptRequest.setPromiseTime(DateUtil.offsetDay(new Date(), 14));//受理后14天之内
            // 回执
            ReceptionVO receptionVO = new ReceptionVO();
            receptionVO.setName("回执名称测试");
            atgBizAffairAcceptRequest.setReceptionVO(receptionVO);
            //4. 请求开放服务，获取response
            AtgBizAffairAcceptResponse response = atgBusClient.execute(atgBizAffairAcceptRequest);
            if (!"S".equalsIgnoreCase(response.getResultStatus())) {
                return false;
            }
        } catch (Exception e) {
            log.error(atgBizAffairAcceptRequest.getProjId() + "调受理接口出错", e);
            throw e;
        }
        log.info(atgBizAffairAcceptRequest.getProjId() + "受理完成");
        return true;
    }

    /**
     * 办结
     */
    public boolean finish(AtgBizAffairFinishRequest atgBizAffairFinishRequest) throws Exception {
        log.info(" 办结-start");
        try {
            //1. 初始化网关地址、秘钥信息
            String gatewayUrl = ConfigUtil.getValue("zjzw_gateway_url");
            String appId = APP_ID;
            List<AtgBusSecretKey> secretKeys = new ArrayList<AtgBusSecretKey>();
            AtgBusSecretKey atgBusSecretKey = new AtgBusSecretKey(ConfigUtil.getValue("zjzw_key_id"), ConfigUtil.getValue("zjzw_secret_key"));
            secretKeys.add(atgBusSecretKey);
            //2. 初始化客户端
            AtgBusClient atgBusClient = new DefaultAtgBusClient(gatewayUrl, appId, secretKeys);
            // 政务总线统一分配应用ID
            atgBizAffairFinishRequest.setAppId(APP_ID);
//         // 附件
//        List <List<AttachMentVO>> attachMentVOs = new ArrayList <List<AttachMentVO>>();
//        List<AttachMentVO> list<AttachMentVO> = new List<AttachMentVO>();attachMentVOs.add(list<AttachMentVO>);
//        atgBizAffairFinishRequest.setAttachMentVOs(attachMentVOs);
            //拼装结果
//        Map<String,Object> formInfo=new HashMap<>();
//        formInfo.put("审批意见","通过");
            /**
             * 办结接口中如果存在返回结果数据，可放在收件接口的类型为Map<String,Object>拓展字段extInfoz中，其中key resultData，value为表单及材料字段对象，json后格式样例为：
             {
             "resultData":{
             //结果是表单字段
             "formInfo":{
             "IDNumber":"12345678"
             },
             //结果为材料对象
             "suffInfoList":[
             {
             "suffName":"材料名，例如身份证",
             "suffType":"材料类型",
             "suffUniId":"材料编码",
             "suffNum":"材料数量",
             "attachName":"附件文件名",
             "attachPath":"附件地址",
             "memo":"备注",
             "extInfo":"拓展字段"
             }
             ]
             }
             }
             */

//        atgBizAffairFinishRequest.setExtInfo(inParam.getExtInfo());
            // 办结时间
            atgBizAffairFinishRequest.setGmtService(DateUtil.now());
            // 备注
//        atgBizAffairFinishRequest.setMemo("办结测试");
            // 办理人员姓名
            atgBizAffairFinishRequest.setOperatorName(atgBizAffairFinishRequest.getDeptName());
            // 办理人员编号
            atgBizAffairFinishRequest.setOperatorUid(APP_ID);
            // 办件统一赋码ID
//        atgBizAffairFinishRequest.setProjId(inParam.getProjId());
            // 回执
            ReceptionVO receptionVO = new ReceptionVO();
//        List<List<AttachMentVO>> list<attachmentvo>List = new ArrayList<List<AttachMentVO>>();
//        List<AttachMentVO> list<AttachMentVO> = new List<AttachMentVO>();
//        list<attachmentvo>List.add(list<AttachMentVO>);
//        receptionVO.setAttachmentList(list<attachmentvo>List);
            atgBizAffairFinishRequest.setReceptionVO(receptionVO);
            // 办理结果
//        atgBizAffairFinishRequest.setResult("10");
            // 办件结果证照编号
            atgBizAffairFinishRequest.setResultCode(IdUtil.simpleUUID());
            // 办件结果描述信息
//        atgBizAffairFinishRequest.setResultDesc(inParam.getMemo());
            //4. 请求开放服务，获取response
            AtgBizAffairFinishResponse response = atgBusClient.execute(atgBizAffairFinishRequest);
            if (!"S".equalsIgnoreCase(response.getResultStatus())) {
                return false;
            }
        } catch (Exception e) {
            log.error("办结接口出错：" + atgBizAffairFinishRequest.getProjId(), e);
            throw e;
        }
        log.info("办结-end");
        return true;
    }


    public boolean specProcStart(AtgBizAffairSpecProcStartRequest atgBizAffairSpecProcStartRequest) throws Exception {
        log.info(" 特殊流程开始-start");
        try {
            //1. 初始化网关地址、秘钥信息
            String gatewayUrl = ConfigUtil.getValue("zjzw_gateway_url");
            String appId = APP_ID;
            List<AtgBusSecretKey> secretKeys = new ArrayList<AtgBusSecretKey>();
            AtgBusSecretKey atgBusSecretKey = new AtgBusSecretKey(ConfigUtil.getValue("zjzw_key_id"), ConfigUtil.getValue("zjzw_secret_key"));
            secretKeys.add(atgBusSecretKey);
            //2. 初始化客户端
            AtgBusClient atgBusClient = new DefaultAtgBusClient(gatewayUrl, appId, secretKeys);
            //3. 找到对应服务的request，拼装业务信息
//        AtgBizAffairSpecProcStartRequest atgBizAffairSpecProcStartRequest = new AtgBizAffairSpecProcStartRequest();
            // 政务总线统一分配应用ID
            atgBizAffairSpecProcStartRequest.setAppId(APP_ID);
            // 扩展字段信息 (可选)
            Map<String, String> extInfo = new HashMap<String, String>();
            String finishOrderRequest = "{\"attachments\":[{\"attName\":\"XIAOFENG\",\"attUrl\":\"http://cdn.duitang.com/uploads/item/201409/08/20140908130732_kVXz h.jpeg\",\"attType\":\"PDF\"}],\"licenses\":[{\"licenseType\":\"身份证\",\"materialType\":\"PDF\",\"licenseUid\":\"1213\",\"licenseNo\":\"1231\",\"licenseName\":\"证照名称\",\"licenseUrlNum\":1,\"licenseUrl\":\"http://cdn.duitang.com/uploads/item/201409/08/20140908130732_kVXzh.jpeg\"}],\"finishForm\":{\"ABC\":\"一级\"}}";
            finishOrderRequest = finishOrderRequest.replaceFirst("证照名称", atgBizAffairSpecProcStartRequest.getMemo());
            extInfo.put("FINISH_ORDER_REQUEST", finishOrderRequest);

            atgBizAffairSpecProcStartRequest.setExtInfo(extInfo);
            // 特殊流程开始时间
            atgBizAffairSpecProcStartRequest.setGmtBegin(new Date());
            // 备注 todo 只有这里放的文字能展示出来，把 安全管理等级 评定反馈意见 放这里
//        atgBizAffairSpecProcStartRequest.setMemo("特殊流程申请服务memo");
            // 特殊流程申请理由
//        atgBizAffairSpecProcStartRequest.setReason("等级评定结束，进入审批阶段");
            // 回执
            ReceptionVO receptionVO = new ReceptionVO();
//        List<List<AttachMentVO>> list<attachmentvo>List = new ArrayList<List<AttachMentVO>>();
//        List<AttachMentVO> list<AttachMentVO> = new List<AttachMentVO>();
//        list<attachmentvo>List.add(list<AttachMentVO>);
//        receptionVO.setAttachmentList(list<attachmentvo>List);
            atgBizAffairSpecProcStartRequest.setReceptionVO(receptionVO);
            // 特殊流程时限
            atgBizAffairSpecProcStartRequest.setTimeLimit("0");
            // 特殊流程时限单位
            atgBizAffairSpecProcStartRequest.setTimeLimitUnit("1");
            // 特殊流程类型
            atgBizAffairSpecProcStartRequest.setType("D");//标识二阶段提交
            // 特殊流程描述
//        atgBizAffairSpecProcStartRequest.setTypeDesc("开始审批阶段");
            //4. 请求开放服务，获取response
            AtgBizAffairSpecProcStartResponse response = atgBusClient.execute(atgBizAffairSpecProcStartRequest);
            if (!"S".equalsIgnoreCase(response.getResultStatus())) {
                return false;
            }
        } catch (Exception e) {
            log.error("特殊流程开始接口出错：" + atgBizAffairSpecProcStartRequest.getProjId(), e);
            throw e;
        }
        log.info(" 特殊流程开始-end");
        return true;
    }

    public boolean specProcFinish(AtgBizAffairSpecProcFinishRequest atgBizAffairSpecProcFinishRequest) {
        log.info(" 特殊流程结束-start");
        try {
            //1. 初始化网关地址、秘钥信息
            String gatewayUrl = ConfigUtil.getValue("zjzw_gateway_url");
            String appId = APP_ID;
            List<AtgBusSecretKey> secretKeys = new ArrayList<AtgBusSecretKey>();
            AtgBusSecretKey atgBusSecretKey = new AtgBusSecretKey(ConfigUtil.getValue("zjzw_key_id"), ConfigUtil.getValue("zjzw_secret_key"));
            secretKeys.add(atgBusSecretKey);
            //2. 初始化客户端
            AtgBusClient atgBusClient = new DefaultAtgBusClient(gatewayUrl, appId, secretKeys);
            //3. 找到对应服务的request，拼装业务信息
//        AtgBizAffairSpecProcFinishRequest atgBizAffairSpecProcFinishRequest = new AtgBizAffairSpecProcFinishRequest();
            // 政务总线统一分配应用ID
            atgBizAffairSpecProcFinishRequest.setAppId(APP_ID);
            // 扩展字段信息 (可选)
            Map<String, String> extInfo = new HashMap<String, String>();
            atgBizAffairSpecProcFinishRequest.setExtInfo(extInfo);
            // 特殊流程结束时间
            atgBizAffairSpecProcFinishRequest.setGmtEnd(new Date());
            // 备注
//        atgBizAffairSpecProcFinishRequest.setMemo("特殊流程结果");
            // 办理人员姓名
            atgBizAffairSpecProcFinishRequest.setOperatorName(atgBizAffairSpecProcFinishRequest.getDeptName());//办理人名称先写为办理单位名称.todo
            // 办理人员编号
            atgBizAffairSpecProcFinishRequest.setOperatorUid(APP_ID);//办理人员编号，这个令人头疼 todo
            // 特殊流程审批意见
            atgBizAffairSpecProcFinishRequest.setOpinion("五项材料提交完毕，开始审批");
            // 回执
            ReceptionVO receptionVO = new ReceptionVO();
//        List<List<AttachMentVO>> list<attachmentvo>List = new ArrayList<List<AttachMentVO>>();
//        List<AttachMentVO> list<AttachMentVO> = new List<AttachMentVO>();
//        list<attachmentvo>List.add(list<AttachMentVO>);
//        receptionVO.setAttachmentList(list<attachmentvo>List);
            atgBizAffairSpecProcFinishRequest.setReceptionVO(receptionVO);
            // 特殊流程结果
            atgBizAffairSpecProcFinishRequest.setResult("已收到五项材料，开始审批");
            //4. 请求开放服务，获取response
            AtgBizAffairSpecProcFinishResponse response = atgBusClient.execute(atgBizAffairSpecProcFinishRequest);
            if (!"S".equalsIgnoreCase(response.getResultStatus())) {
                return false;
            }
        } catch (Exception e) {
            log.error("特殊流程结束接口出错：" + atgBizAffairSpecProcFinishRequest.getProjId(), e);
            throw e;
        }
        log.info(" 特殊流程结束-end");
        return true;

    }

    /**
     * 补齐补正通知服务
     */
    public boolean supplementNotify(AtgBizAffairSupplementNotifyRequest atgBizAffairSupplementNotifyRequest) {
        log.info(" 补齐补正通知服务-start");
        try {
            //1. 初始化网关地址、秘钥信息
            String gatewayUrl = ConfigUtil.getValue("zjzw_gateway_url");
            String appId = APP_ID;
            List<AtgBusSecretKey> secretKeys = new ArrayList<AtgBusSecretKey>();
            AtgBusSecretKey atgBusSecretKey = new AtgBusSecretKey(ConfigUtil.getValue("zjzw_key_id"), ConfigUtil.getValue("zjzw_secret_key"));
            secretKeys.add(atgBusSecretKey);
            //2. 初始化客户端
            AtgBusClient atgBusClient = new DefaultAtgBusClient(gatewayUrl, appId, secretKeys);
            //3. 找到对应服务的request，拼装业务信息
//        AtgBizAffairSupplementNotifyRequest atgBizAffairSupplementNotifyRequest = new AtgBizAffairSupplementNotifyRequest();
            // 政务总线统一分配应用ID
            atgBizAffairSupplementNotifyRequest.setAppId(APP_ID);
            // 扩展字段信息 (可选)
            Map<String, String> extInfo = new HashMap<String, String>();
            atgBizAffairSupplementNotifyRequest.setExtInfo(extInfo);
            // 需补正的表单元素列表
            List<FormFieldDTO> formFields = new ArrayList<>();
//        List<FormFieldDTO> list<FormFieldDTO> = new List<FormFieldDTO>();
//        Map<String,String> extInfoMap = new HashMap<String,String>();
//        list<FormFieldDTO>.setExtInfo(extInfoMap);
//
//        List<List<FormFieldDTO>> list<formfielddto>List = new ArrayList<List<FormFieldDTO>>();
//        List<FormFieldDTO> list<FormFieldDTO> = new List<FormFieldDTO>();
//        list<formfielddto>List.add(list<FormFieldDTO>);
//
//        list<FormFieldDTO>.setSubFormFields(list<formfielddto>List);
//        formFields.add(list<FormFieldDTO>);
            atgBizAffairSupplementNotifyRequest.setFormFields(formFields);
            // 补齐补正通知时间
            atgBizAffairSupplementNotifyRequest.setGmtPatch(new Date());
            // 备注
//            atgBizAffairSupplementNotifyRequest.setMemo("补充材料备注");
            // 办理人员姓名
            atgBizAffairSupplementNotifyRequest.setOperatorName(atgBizAffairSupplementNotifyRequest.getDeptName());
            // 办理人员编号
            atgBizAffairSupplementNotifyRequest.setOperatorUid(APP_ID);
            /**
             * 补齐补正模式
             form-表单
             material-材料
             all-表单&材料
             */
            atgBizAffairSupplementNotifyRequest.setPatchMode("all");
            // 补齐补正原因
//            atgBizAffairSupplementNotifyRequest.setPatchReason("缺乏某些材料");
            // 补件预估时效
            atgBizAffairSupplementNotifyRequest.setPatchTimeLimit(7L);
            // 可选回执
//        ReceptionVO receptionVO = new ReceptionVO();

//        List<List<AttachMentVO>> list<attachmentvo>List = new ArrayList<List<AttachMentVO>>();
//        List<AttachMentVO> list<AttachMentVO> = new List<AttachMentVO>();
//        list<attachmentvo>List.add(list<AttachMentVO>);
//        receptionVO.setAttachmentList(list<attachmentvo>List);
//        atgBizAffairSupplementNotifyRequest.setReceptionVO(receptionVO);
            // 所需材料信息
//        List<StuffInfoVO> stuffInfos = new ArrayList<>();
//        StuffInfoVO stuffInfoVO = new StuffInfoVO();
////        stuffInfoVO.setAttachName("补充材料");
////        stuffInfoVO.setAttachPath("/path/xxx.jpg");
//        Map<String, String> extInfoMap = new HashMap<String, String>();
//        stuffInfoVO.setExtInfo(extInfoMap);
//
//        stuffInfoVO.setFetchMode("1");//收取方式
//        stuffInfoVO.setMemo("补齐补正所需要的补充材料");
//        stuffInfoVO.setStuffName("补充材料");
//        stuffInfoVO.setStuffNum(1L);//传一份就行
//        stuffInfoVO.setStuffType("2");
//        stuffInfoVO.setStuffUniId("15755276042661001");//todo 这个补充材料不知道如何新建，目前用系统里的
//        stuffInfos.add(stuffInfoVO);
//        atgBizAffairSupplementNotifyRequest.setStuffInfos(stuffInfos);
            // 补件时限单位
            atgBizAffairSupplementNotifyRequest.setTimeUnit("7");//工作日
            //4. 请求开放服务，获取response
            AtgBizAffairSupplementNotifyResponse response = atgBusClient.execute(atgBizAffairSupplementNotifyRequest);
            if (!"S".equalsIgnoreCase(response.getResultStatus())) {
                return false;
            }
        } catch (Exception e) {
            log.error("补齐补正通知服务接口出错：" + atgBizAffairSupplementNotifyRequest.getProjId(), e);
            throw e;
        }
        log.info(" 补齐补正通知服务-end");
        return true;

    }

    //获得用户
    private User getUser(String realName, String mobile, String companyName, String province, String city, String area, String zwUserId) throws RuntimeException {
//        companyName="zp老承办单位";
        //根据承办单位名称查出对应的机构id
        UserDataDto userDataDto = userDao.findUserByOrgName(companyName);
        if (userDataDto == null) {
            //该企业不存在，自动注册
            return register(realName, mobile, companyName, province, city, area, zwUserId);
        }
        User user = new User();
        BeanUtil.copyProperties(userDataDto, user);
        Org org = orgDao.findOrgByOid(Long.valueOf(userDataDto.getOrg_id()));
        user.setOrg(org);
        return user;
    }

    /**
     * 业务逻辑处理，注册用户
     * 承办公司注册
     * 增加synchronized，否则有可能存在数据重复问题(并发问题)
     *
     * @param
     */
    public synchronized User register(String realName, String mobile, String companyName, String province, String city, String area, String zwUserId) {
        log.debug("进入注册流程");
        // 手机号即用户名
        String userName = mobile;
        // 初始密码默认手机号后6位
        String password = mobile.substring(mobile.length() - 6);
        //数据来源：(空值:子站注册1:广西政务单点)
        String dataSource = "";

        //校验用户的合法性
        AjaxResultDTO result = userApplicationService.checkUserName(userName,null);
        if (!result.isSuccessful()) {
            log.error(result.getMsg());
            return null;
        }

        //把request的变量封装到UserDataDto对象
        UserDto userDto = new UserDto();
        userDto.setZwId(zwUserId);
        userDto.setUserName(userName);
        userDto.setPassword(password);
        userDto.setDataSource(dataSource);
        userDto.setPhone(mobile);
        userDto.setCompanyPhone(mobile);
//        userDto.setEmail("wangjianjun202@qq.com");
        userDto.setRealName(realName);//todo 这个值能放空么
        //设置用户为激活状态
        userDto.setActive(DictConst.Y);
        //用户类别：承办单位用户
        userDto.setUserType(DictConst.USERTYPE_CBDWYH);
        userDto.setCompanyName(companyName);
        userDto.setChannel(ConfigUtil.getValue("web_url"));

//        userDto.setIpAddress(WebUtil.getIp(request));
        if (StringUtil.isNotEmpty(province)) {
            userDto.setProvince_id(Long.parseLong(province));
        }
        if (StringUtil.isNotEmpty(city)) {
            userDto.setCity_id(Long.parseLong(city));
        }
        if (StringUtil.isNotEmpty(area)) {
            userDto.setArea_id(Long.parseLong(area));
        }

        /* 将承办方 */
        SBDataDTO sbDataDTO = new SBDataDTO();
        sbDataDTO.setSyncTaskType(DictConst.SYNCTASKTYPE_YHZC);
        sbDataDTO.setUserDTO(JSON.toJSONString(userDto));
        try {
            mainReqService.mainSyncAndRegister(sbDataDTO);
        } catch (Exception e) {
            e.printStackTrace();
            log.error("注册出错", e);
            return null;
        }

        // 调用注册方法，把注册信息保存到数据库
        String errorMsg = userService.register(new OrgDataDto(),userDto, true);
        User resultUser = null;
        if (StringUtil.isEmpty(errorMsg)) {
            try {
                User currentUser = userApplicationService.findUserByName(userDto.getUserName());
                resultUser = currentUser;
                notifyService.register(currentUser);
            } catch (AuthenticationException e) {
                e.printStackTrace();
                log.error("注册出错", e);
                return null;
            }
        } else {  //注册失败返回注册界面，弹出错误信息
            log.error(errorMsg);
            return null;
        }

        log.info("恭喜您注册成功，登录账号和密码已经以短信形式发送至您的手机，请注意查收！");
        return resultUser;
    }

    /**
     * 重新收件
     */
    @Transactional(rollbackFor = Exception.class)
    public boolean reReceive(AtgBizAffairSupplementAcceptRequestDiy request) throws Exception {
        //找出旧的报文
        ReceiveJson receiveJsonOrigin = receiveJsonDao.findByZwid(request.getProjId());
        AtgBizAffairReceiveRequest requestOrigin = JSON.parseObject(receiveJsonOrigin.getReceiveJson(), AtgBizAffairReceiveRequest.class);
        //更新报文
        if (receiveJsonOrigin != null) {
            requestOrigin.setAffFormInfo(request.getFormInfo());
            requestOrigin.setSuffInfoList(request.getStuffInfos());
            receiveJsonOrigin.setReceiveJson(JSON.toJSONString(requestOrigin, SerializerFeature.DisableCircularReferenceDetect));
            receiveJsonDao.saveOrUpdate(receiveJsonOrigin);
            newRedisUtil.set(DictConst.ZJZW_HEADER_FIRST + request.getProjId(), JSON.toJSONString(requestOrigin, SerializerFeature.DisableCircularReferenceDetect));//存redis
        }
        String reportUrl = "";//评估报告名称
        String addFiles = "";//补充材料
        ObjectMapper mapper = new ObjectMapper();
        //基本活动信息
        AffFormInfo affFormInfo = mapper.readValue(request.getFormInfo(), AffFormInfo.class);
        //材料
        List<StuffInfoVO> materialList = request.getStuffInfos();
//        if (materialList.size() == 0) return false;
        for (StuffInfoVO stuffInfoVO : materialList) {
            if (StringUtils.equals(DictConst.ZJZW_PGBG, stuffInfoVO.getStuffUniId())) {
                //riskReport即评估报告的id
                reportUrl = stuffInfoVO.getAttachPath();
            }
            if (StringUtils.equals(DictConst.ZJZW_BCCL, stuffInfoVO.getStuffUniId())) {
                //riskReport即评估报告的id
                addFiles = stuffInfoVO.getAttachPath();
            }
        }
        //查出活动，更新
        String areacode = affFormInfo.getActivityArea();
        String province = areacode.substring(0, 2) + "0000";
        String city = areacode.substring(0, 4) + "00";
        //如果用户不存在，则创建一个。假设用户手机号是mobile
        User user = getUser(requestOrigin.getApplicantVO().getApplyName(), requestOrigin.getApplicantVO().getContactTelNo(), affFormInfo.getCbdwmc(), province, city, areacode, requestOrigin.getApplicantVO().getApplyUid());
        //查出活动并更新
        Activity activity = activityDao.findActivityByZwId(request.getProjId());
        //todo 承办方、省、市、区、审批单位，均不可修改。
//        activity.setSponsor(affFormInfo.getCbdwmc());//承办方
        activity.setName(affFormInfo.getActivityName());//活动名称
        activity.setActivityType(affFormInfo.getActivityType());
//        activity.setProvince(sysRegionUtil.getRegionById(province));
//        activity.setCity(sysRegionUtil.getRegionById(city));
//        activity.setArea(sysRegionUtil.getRegionById(areacode));
        activity.setAddress(affFormInfo.getAddress());
        activity.setNumber(affFormInfo.getNumber());
        activity.setStartDate(DateUtil.format(new Date(Long.valueOf(affFormInfo.getStartDate())), "yyyy-MM-dd HH:mm"));
        activity.setEndDate(DateUtil.format(new Date(Long.valueOf(affFormInfo.getEndDate())), "yyyy-MM-dd HH:mm"));
//        activity.setOrg(user.getOrg());
//        activity.setUnit(sysRegionUtil.getRegionById(areacode + "01"));
//        activity.setActivityNo("OD" + DateUtil.current(false) + RandomUtil.randomNumbers(5));
        activity.setUpdateOn(new Date());
        activityDao.saveOrUpdate(activity);
        //如果有补充材料，就打个报批材料
        if (org.apache.commons.lang.StringUtils.isNotBlank(addFiles)) {
            addFiles = addFiles.replace(";", "&&");
            materialService.submitXKMaterialToSP(activity, user, addFiles);
        }
        contractorService.submitGradeRank(activity, user, reportUrl, "1", null, null);//commitWay(提交方式)默认采取第一种
        return true;
    }

}
