package com.yifu.cloud.plus.v1.yifu.social.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.yifu.cloud.plus.v1.yifu.common.core.exception.CheckedException;
import com.yifu.cloud.plus.v1.yifu.common.core.util.Common;
import com.yifu.cloud.plus.v1.yifu.common.core.util.DateUtil;
import com.yifu.cloud.plus.v1.yifu.common.core.util.R;
import com.yifu.cloud.plus.v1.yifu.social.vo.FriendResult;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;

import java.security.SignatureException;
import java.util.Date;
import java.util.TreeMap;

/**
 * @Author: hgw
 * @Date: 2024-12-6 17:01:23
 * @Description:
 * @return: 税友配置
 **/
@Configuration
@Data
@Slf4j
public class SocialFriendConfig {

	// appKey
	@Value("${socialFriend.appKey}")
	private String appKey;
	// appSecret
	@Value("${socialFriend.appSecret}")
	private String appSecret;
	// url前缀
	@Value("${socialFriend.urlPre}")
	private String urlPre;
	// url推
	@Value("${socialFriend.urlPush}")
	private String urlPush;
	// url拉结果数据
	@Value("${socialFriend.urlGetInfo}")
	private String urlGetInfo;

	private static final String APP_KEY = "appKey";
	private static final String TIMESTAMP = "timestamp";
	private static final String X_REQ_NONCE = "xReqNonce";
	private static final String VERSION = "version";

	/**
	 * @param : type 1社保增 2社保减 3医保增 4医保减
	 * @Description: 推送任务接口
	 * @Author: hgw
	 * @Date: 2024-12-9 16:54:31
	 * @return: java.lang.String
	 **/
	public String pushFriendByInfo(RestTemplate restTemplate, String id, int type, String thisTime) {
		String addId = "";
		String appAddUrl = urlPre + urlPush;
		String version = "1.0.0";
		String timestamp = String.valueOf(new Date().getTime());
		String xReqNonce = "1";
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON);
		// */*
		headers.add("accept", MediaType.ALL_VALUE);
		headers.add(APP_KEY, appKey);
		headers.add(TIMESTAMP, timestamp);
		try {

			String signature = SocialFriendSign.qianMing(getMapParam(appKey, appSecret, xReqNonce, version, timestamp, null));
			headers.add("signature", signature);
		} catch (SignatureException e) {
			log.error("税友签名失败", e);
			return addId;
		}
		headers.add(X_REQ_NONCE, xReqNonce);
		headers.add(VERSION, version);

		JSONObject json = new JSONObject();
		// 外部业务订单号
		json.put("bizNo", id + thisTime);
		// 企业名称
		json.put("qymc", "安徽测试企业");
		// 税号
		json.put("nsrsbh", "91340100634561365L");
		// 行政区划代码
		json.put("areaid", "340100");
		JSONArray ywblzhlbArr = new JSONArray();
		if (type < 3) {
			JSONObject jsonYwblzhlbYgs = new JSONObject();
			// 密码
			jsonYwblzhlbYgs.put("mm", "Aa123456");
			// 办理项目 例如社保、医保等
			jsonYwblzhlbYgs.put("blxm", "社保");
			// 单位编号
			jsonYwblzhlbYgs.put("dwbh", "123456");
			// 账号
			jsonYwblzhlbYgs.put("zh", "1234567");
			// 密码类型:安徽社保医保都是4：
			jsonYwblzhlbYgs.put("mmlx", "4");
			ywblzhlbArr.add(jsonYwblzhlbYgs);
		} else {
			JSONObject jsonYwblzhlbYsd = new JSONObject();
			jsonYwblzhlbYsd.put("mm", "Aa123456");
			jsonYwblzhlbYsd.put("blxm", "医保");
			jsonYwblzhlbYsd.put("dwbh", "123456");
			jsonYwblzhlbYsd.put("zh", "1234567");
			jsonYwblzhlbYsd.put("mmlx", "4");
			ywblzhlbArr.add(jsonYwblzhlbYsd);
		}
		json.put("ywblzhlb", ywblzhlbArr);
		// type 1社保增 2社保减 3医保增 4医保减
		setEmpInfo(json, type);

		HttpEntity<String> formEntity = new HttpEntity<>(json.toString(), headers);
		String dataResultList = restTemplate.postForObject(appAddUrl, formEntity, String.class);
		// {"head":{"code":"00000000","description":"成功","msg":"成功","time":"2024-12-06 17:10:26","status":"Y"
		// ,"body":{"requestId":"85440b327d71466abcd9c5c81d5bb172"
		if (Common.isNotNull(dataResultList)) {
			JSONObject dataObject = JSON.parseObject(dataResultList);
			String head = dataObject.getString("head");
			if (Common.isNotNull(head)) {
				JSONObject headObject = JSON.parseObject(head);
				String status = headObject.getString("status");
				if ("Y".equals(status)) {
					String body = dataObject.getString("body");
					JSONObject bodyObject = JSON.parseObject(body);
					addId = bodyObject.getString("requestId");
				}
			}
		}
		return addId;
	}

	/**
	 * @param json 总传参json
	 * @param type 1社保增 2社保减 3医保增 4医保减
	 * @Description: 分流塞值
	 * @Author: hgw
	 * @Date: 2024/12/11 10:24
	 * @return: void
	 **/
	private void setEmpInfo(JSONObject json, int type) {
		switch(type) {
			case 1:setEmpInfoOne(json); break;
			case 2:setEmpInfoTwo(json); break;
			case 3:setEmpInfoThree(json); break;
			case 4:setEmpInfoFour(json); break;
			default:break;
		}
	}

	/**
	 * @param json 主json存数据
	 * @Description: 塞人员名单-1社保增
	 * @Author: hgw
	 * @Date: 2024/12/10 18:05
	 * @return: void
	 **/
	private void setEmpInfoOne(JSONObject json) {
		// 参保人员名单 数组
		JSONArray cbrymdArr = new JSONArray();
		JSONObject cbrymdOne = new JSONObject();
		// 姓名
		cbrymdOne.put("xm", "测试金辰");
		// 证件类型
		cbrymdOne.put("zzlx", "居民身份证");
		// 证件号码
		cbrymdOne.put("zzhm", "828888200908213819");

		// 国籍（地区）
		cbrymdOne.put("gj", "中国");
		// 性别
		cbrymdOne.put("xb", "男");
		// 出生日期
		cbrymdOne.put("csrq", "2009-08-21");
		// 民族
		cbrymdOne.put("mz", "汉族");
		// 手机号码
		cbrymdOne.put("sjhm", "10000340997");
		// 户口地所在行政区
		cbrymdOne.put("hkszdxzq", "浙江省|杭州市|滨江区");
		// 户口所在地地址
		cbrymdOne.put("hkszddz", "滨江区南环路3738号");
		// 户口性质
		cbrymdOne.put("hkxz", "非农业户口（城镇）");
		// 居住地址
		cbrymdOne.put("jzdz", "滨江区南环路3738号");
		// 居住地行政区
		cbrymdOne.put("jzdzxzq", "浙江省|杭州市|滨江区");
		// 参加工作日期
		cbrymdOne.put("cjgzrq", "2024-12-01");
		// 文化程度
		cbrymdOne.put("whcd", "大学本科");

		// 办理项目列表
		JSONArray blxmlbArr = new JSONArray();
		JSONObject blxmlbOne = new JSONObject();
		String[] strArrTwo = {"生育保险","职工基本医疗保险","大病统筹医疗保险"};
		String blxm = "社保";
		// 办理项目
		blxmlbOne.put("blxm", blxm);
		// 本次参保日期 格式：YYYY-MM-DD
		blxmlbOne.put("bccbrq", "2024-12-01");
		// 申报工资 ？基数吗？
		blxmlbOne.put("sbgz", "4000");
		// 险种类型 例如养老、工伤、医疗等
		String[] strArr = {"企业职工养老","工伤保险","失业保险"};
		// 险种类型 例如养老、工伤、医疗等
		blxmlbOne.put("xzlb", strArr);
		blxmlbArr.add(blxmlbOne);
		cbrymdOne.put("blxmlb", blxmlbArr);

		// 特色字段信息
		JSONObject tszdxx = new JSONObject();
		// 增员年月 社保必填；yyyyMM
		tszdxx.put("zyny", "202412");
		// 同步办理用工劳动备案 社保必填；是
		tszdxx.put("tbblygldhtba", "是");
		// 参保模式 新参、续参
		// tszdxx.put("cbms", "是")
		// 就业登记时间 社保必填；yyyy-mm-dd
		tszdxx.put("jydjsj", "2024-12-01");
		// 单位就业起始时间  社保必填；yyyy-mm-dd
		tszdxx.put("dwjyqssj", "2024-12-01");
		// 安徽非必填！社保个人身份材料 取文件上传后获取的文件路径。图片总大小不超过1M, 材料仅支持图片格式,支持上传jpeg/jpg/png格式。
		// tszdxx.put("sbzycl", url)
		// 用工形式 社保必填
		tszdxx.put("ygxs", "订立固定期限劳动合同");
		// 劳动合同签署情况 社保必填
		tszdxx.put("ldhtqsqk", "初签");
		// 人员类型
		tszdxx.put("rylx", "在职职工");
		// 医保个人身份材料 安徽非必填！
		//tszdxx.put("ybzycl", url)
		// 职业工种 社保必填
		tszdxx.put("zygz", "社会服务人员");
		// 人员身份 个人身份 社保必填
		tszdxx.put("grsf", "职员");
		// 工作时间制度 社保必填
		tszdxx.put("gzsjzd", "标准工作时间制度");
		// 医保用工形式 医保新参必填
		// tszdxx.put("ybygxs", "原固定职工")
		// 企业职工社会保险增员花名册 安徽非必填！
		// tszdxx.put("qyzgshbxzyhmc", url)
		// 企业职工基本医疗保险参保登记表 安徽非必填！ 数组
		// tszdxx.put("qyzgshbxzyhmc", url)
		cbrymdOne.put("tszdxx", tszdxx);
		// 就业信息 社保必填；
		JSONObject jyxx = new JSONObject();
		// 劳动合同类型
		jyxx.put("ldhtlx", "固定期限劳动合同");
		// 劳动合同起始日期
		jyxx.put("ldhtqsrq", "2024-12-01");
		// 劳动合同截止日期
		jyxx.put("ldhtjzrq", "2030-11-30");
		cbrymdOne.put("jyxx", jyxx);
		cbrymdArr.add(cbrymdOne);
		// 人员名单
		String buyType = "cbrymd";
		json.put(buyType, cbrymdArr);
	}

	/**
	 * @param json 主json存数据
	 * @Description: 塞人员名单-2社保减
	 * @Author: hgw
	 * @Date: 2024/12/10 18:05
	 * @return: void
	 **/
	private void setEmpInfoTwo(JSONObject json) {
		// 参保人员名单 数组
		JSONArray cbrymdArr = new JSONArray();
		JSONObject cbrymdOne = new JSONObject();
		// 姓名
		cbrymdOne.put("xm", "测试金辰");
		// 证件类型
		cbrymdOne.put("zzlx", "居民身份证");
		// 证件号码
		cbrymdOne.put("zzhm", "828888200908213819");

		// 国籍（地区）
		cbrymdOne.put("gj", "中国");
		// 性别
		cbrymdOne.put("xb", "男");
		// 出生日期
		cbrymdOne.put("csrq", "2009-08-21");
		// 民族
		cbrymdOne.put("mz", "汉族");
		// 手机号码
		cbrymdOne.put("sjhm", "10000340997");
		// 户口地所在行政区
		cbrymdOne.put("hkszdxzq", "浙江省|杭州市|滨江区");
		// 户口所在地地址
		cbrymdOne.put("hkszddz", "滨江区南环路3738号");
		// 户口性质
		cbrymdOne.put("hkxz", "非农业户口（城镇）");
		// 居住地址
		cbrymdOne.put("jzdz", "滨江区南环路3738号");
		// 居住地行政区
		cbrymdOne.put("jzdzxzq", "浙江省|杭州市|滨江区");
		// 参加工作日期
		cbrymdOne.put("cjgzrq", "2024-12-01");
		// 文化程度
		cbrymdOne.put("whcd", "大学本科");

		// 办理项目列表
		JSONArray blxmlbArr = new JSONArray();
		JSONObject blxmlbOne = new JSONObject();
		String blxm = "社保";
		// 办理项目
		blxmlbOne.put("blxm", blxm);
		// 本次参保日期 格式：YYYY-MM-DD
		blxmlbOne.put("bccbrq", "2024-12-01");
		// 申报工资 ？基数吗？
		blxmlbOne.put("sbgz", "4000");
		// 险种类型 例如养老、工伤、医疗等
		String[] strArr = {"企业职工养老","工伤保险","失业保险"};
		// 险种类型 例如养老、工伤、医疗等
		blxmlbOne.put("xzlb", strArr);
		blxmlbArr.add(blxmlbOne);
		cbrymdOne.put("blxmlb", blxmlbArr);

		// 特色字段信息
		JSONObject tszdxx = new JSONObject();
		// 增员年月 社保必填；yyyyMM
		tszdxx.put("zyny", "202412");
		// 同步办理用工劳动备案 社保必填；是
		tszdxx.put("tbblygldhtba", "是");
		// 参保模式 新参、续参
		// tszdxx.put("cbms", "是")
		// 就业登记时间 社保必填；yyyy-mm-dd
		tszdxx.put("jydjsj", "2024-12-01");
		// 单位就业起始时间  社保必填；yyyy-mm-dd
		tszdxx.put("dwjyqssj", "2024-12-01");
		// 安徽非必填！社保个人身份材料 取文件上传后获取的文件路径。图片总大小不超过1M, 材料仅支持图片格式,支持上传jpeg/jpg/png格式。
		// tszdxx.put("sbzycl", url)
		// 用工形式 社保必填
		tszdxx.put("ygxs", "订立固定期限劳动合同");
		// 劳动合同签署情况 社保必填
		tszdxx.put("ldhtqsqk", "初签");
		// 人员类型
		tszdxx.put("rylx", "在职职工");
		// 医保个人身份材料 安徽非必填！
		//tszdxx.put("ybzycl", url)
		// 职业工种 社保必填
		tszdxx.put("zygz", "社会服务人员");
		// 人员身份 个人身份 社保必填
		tszdxx.put("grsf", "职员");
		// 工作时间制度 社保必填
		tszdxx.put("gzsjzd", "标准工作时间制度");
		// 医保用工形式 医保新参必填
		// tszdxx.put("ybygxs", "原固定职工")
		// 企业职工社会保险增员花名册 安徽非必填！
		// tszdxx.put("qyzgshbxzyhmc", url)
		// 企业职工基本医疗保险参保登记表 安徽非必填！ 数组
		// tszdxx.put("qyzgshbxzyhmc", url)
		cbrymdOne.put("tszdxx", tszdxx);
		// 就业信息 社保必填；
		JSONObject jyxx = new JSONObject();
		// 劳动合同类型
		jyxx.put("ldhtlx", "固定期限劳动合同");
		// 劳动合同起始日期
		jyxx.put("ldhtqsrq", "2024-12-01");
		// 劳动合同截止日期
		jyxx.put("ldhtjzrq", "2030-11-30");
		cbrymdOne.put("jyxx", jyxx);
		cbrymdArr.add(cbrymdOne);
		// 人员名单
		String buyType = "tbrymd";
		json.put(buyType, cbrymdArr);
	}

	/**
	 * @param json 主json存数据
	 * @Description: 塞人员名单-3医保增
	 * @Author: hgw
	 * @Date: 2024/12/10 18:05
	 * @return: void
	 **/
	private void setEmpInfoThree(JSONObject json) {
		// 参保人员名单 数组
		JSONArray cbrymdArr = new JSONArray();
		JSONObject cbrymdOne = new JSONObject();
		// 姓名
		cbrymdOne.put("xm", "测试金辰");
		// 证件类型
		cbrymdOne.put("zzlx", "居民身份证");
		// 证件号码
		cbrymdOne.put("zzhm", "828888200908213819");

		// 国籍（地区）
		cbrymdOne.put("gj", "中国");
		// 性别
		cbrymdOne.put("xb", "男");
		// 出生日期
		cbrymdOne.put("csrq", "2009-08-21");
		// 民族
		cbrymdOne.put("mz", "汉族");
		// 手机号码
		cbrymdOne.put("sjhm", "10000340997");
		// 户口地所在行政区
		cbrymdOne.put("hkszdxzq", "浙江省|杭州市|滨江区");
		// 户口所在地地址
		cbrymdOne.put("hkszddz", "滨江区南环路3738号");
		// 户口性质
		cbrymdOne.put("hkxz", "非农业户口（城镇）");
		// 居住地址
		cbrymdOne.put("jzdz", "滨江区南环路3738号");
		// 居住地行政区
		cbrymdOne.put("jzdzxzq", "浙江省|杭州市|滨江区");
		// 参加工作日期
		cbrymdOne.put("cjgzrq", "2024-12-01");
		// 文化程度
		cbrymdOne.put("whcd", "大学本科");

		// 办理项目列表
		JSONArray blxmlbArr = new JSONArray();
		JSONObject blxmlbOne = new JSONObject();
		String blxm = "医保";
		// 办理项目
		blxmlbOne.put("blxm", blxm);
		// 本次参保日期 格式：YYYY-MM-DD
		blxmlbOne.put("bccbrq", "2024-12-01");
		// 申报工资 ？基数吗？
		blxmlbOne.put("sbgz", "4000");
		// 险种类型 例如养老、工伤、医疗等
		String[] strArr = {"生育保险","职工基本医疗保险","大病统筹医疗保险"};
		// 险种类型 例如养老、工伤、医疗等
		blxmlbOne.put("xzlb", strArr);
		blxmlbArr.add(blxmlbOne);
		cbrymdOne.put("blxmlb", blxmlbArr);

		// 特色字段信息
		JSONObject tszdxx = new JSONObject();
		// 增员年月 社保必填；yyyyMM
		tszdxx.put("zyny", "202412");
		// 同步办理用工劳动备案 社保必填；是
		tszdxx.put("tbblygldhtba", "是");
		// 参保模式 新参、续参
		// tszdxx.put("cbms", "是")
		// 就业登记时间 社保必填；yyyy-mm-dd
		tszdxx.put("jydjsj", "2024-12-01");
		// 单位就业起始时间  社保必填；yyyy-mm-dd
		tszdxx.put("dwjyqssj", "2024-12-01");
		// 安徽非必填！社保个人身份材料 取文件上传后获取的文件路径。图片总大小不超过1M, 材料仅支持图片格式,支持上传jpeg/jpg/png格式。
		// tszdxx.put("sbzycl", url)
		// 用工形式 社保必填
		tszdxx.put("ygxs", "订立固定期限劳动合同");
		// 劳动合同签署情况 社保必填
		tszdxx.put("ldhtqsqk", "初签");
		// 人员类型
		tszdxx.put("rylx", "在职职工");
		// 医保个人身份材料 安徽非必填！
		//tszdxx.put("ybzycl", url)
		// 职业工种 社保必填
		tszdxx.put("zygz", "社会服务人员");
		// 人员身份 个人身份 社保必填
		tszdxx.put("grsf", "职员");
		// 工作时间制度 社保必填
		tszdxx.put("gzsjzd", "标准工作时间制度");
		// 医保用工形式 医保新参必填
		// tszdxx.put("ybygxs", "原固定职工")
		// 企业职工社会保险增员花名册 安徽非必填！
		// tszdxx.put("qyzgshbxzyhmc", url)
		// 企业职工基本医疗保险参保登记表 安徽非必填！ 数组
		// tszdxx.put("qyzgshbxzyhmc", url)
		cbrymdOne.put("tszdxx", tszdxx);
		// 就业信息 社保必填；
		JSONObject jyxx = new JSONObject();
		// 劳动合同类型
		jyxx.put("ldhtlx", "固定期限劳动合同");
		// 劳动合同起始日期
		jyxx.put("ldhtqsrq", "2024-12-01");
		// 劳动合同截止日期
		jyxx.put("ldhtjzrq", "2030-11-30");
		cbrymdOne.put("jyxx", jyxx);
		cbrymdArr.add(cbrymdOne);
		// 人员名单
		String buyType = "cbrymd";
		json.put(buyType, cbrymdArr);
	}

	/**
	 * @param json 主json存数据
	 * @Description: 塞人员名单-4医保减
	 * @Author: hgw
	 * @Date: 2024/12/10 18:05
	 * @return: void
	 **/
	private void setEmpInfoFour(JSONObject json) {
		// 参保人员名单 数组
		JSONArray cbrymdArr = new JSONArray();
		JSONObject cbrymdOne = new JSONObject();
		// 姓名
		cbrymdOne.put("xm", "测试金辰");
		// 证件类型
		cbrymdOne.put("zzlx", "居民身份证");
		// 证件号码
		cbrymdOne.put("zzhm", "828888200908213819");

		// 国籍（地区）
		cbrymdOne.put("gj", "中国");
		// 性别
		cbrymdOne.put("xb", "男");
		// 出生日期
		cbrymdOne.put("csrq", "2009-08-21");
		// 民族
		cbrymdOne.put("mz", "汉族");
		// 手机号码
		cbrymdOne.put("sjhm", "10000340997");
		// 户口地所在行政区
		cbrymdOne.put("hkszdxzq", "浙江省|杭州市|滨江区");
		// 户口所在地地址
		cbrymdOne.put("hkszddz", "滨江区南环路3738号");
		// 户口性质
		cbrymdOne.put("hkxz", "非农业户口（城镇）");
		// 居住地址
		cbrymdOne.put("jzdz", "滨江区南环路3738号");
		// 居住地行政区
		cbrymdOne.put("jzdzxzq", "浙江省|杭州市|滨江区");
		// 参加工作日期
		cbrymdOne.put("cjgzrq", "2024-12-01");
		// 文化程度
		cbrymdOne.put("whcd", "大学本科");

		// 办理项目列表
		JSONArray blxmlbArr = new JSONArray();
		JSONObject blxmlbOne = new JSONObject();
		String blxm = "医保";
		// 办理项目
		blxmlbOne.put("blxm", blxm);
		// 本次参保日期 格式：YYYY-MM-DD
		blxmlbOne.put("bccbrq", "2024-12-01");
		// 申报工资 ？基数吗？
		blxmlbOne.put("sbgz", "4000");
		// 险种类型 例如养老、工伤、医疗等
		String[] strArr = {"生育保险","职工基本医疗保险","大病统筹医疗保险"};
		// 险种类型 例如养老、工伤、医疗等
		blxmlbOne.put("xzlb", strArr);
		blxmlbArr.add(blxmlbOne);
		cbrymdOne.put("blxmlb", blxmlbArr);

		// 特色字段信息
		JSONObject tszdxx = new JSONObject();
		// 增员年月 社保必填；yyyyMM
		tszdxx.put("zyny", "202412");
		// 同步办理用工劳动备案 社保必填；是
		tszdxx.put("tbblygldhtba", "是");
		// 参保模式 新参、续参
		// tszdxx.put("cbms", "是")
		// 就业登记时间 社保必填；yyyy-mm-dd
		tszdxx.put("jydjsj", "2024-12-01");
		// 单位就业起始时间  社保必填；yyyy-mm-dd
		tszdxx.put("dwjyqssj", "2024-12-01");
		// 安徽非必填！社保个人身份材料 取文件上传后获取的文件路径。图片总大小不超过1M, 材料仅支持图片格式,支持上传jpeg/jpg/png格式。
		// tszdxx.put("sbzycl", url)
		// 用工形式 社保必填
		tszdxx.put("ygxs", "订立固定期限劳动合同");
		// 劳动合同签署情况 社保必填
		tszdxx.put("ldhtqsqk", "初签");
		// 人员类型
		tszdxx.put("rylx", "在职职工");
		// 医保个人身份材料 安徽非必填！
		//tszdxx.put("ybzycl", url)
		// 职业工种 社保必填
		tszdxx.put("zygz", "社会服务人员");
		// 人员身份 个人身份 社保必填
		tszdxx.put("grsf", "职员");
		// 工作时间制度 社保必填
		tszdxx.put("gzsjzd", "标准工作时间制度");
		// 医保用工形式 医保新参必填
		// tszdxx.put("ybygxs", "原固定职工")
		// 企业职工社会保险增员花名册 安徽非必填！
		// tszdxx.put("qyzgshbxzyhmc", url)
		// 企业职工基本医疗保险参保登记表 安徽非必填！ 数组
		// tszdxx.put("qyzgshbxzyhmc", url)
		cbrymdOne.put("tszdxx", tszdxx);
		// 就业信息 社保必填；
		JSONObject jyxx = new JSONObject();
		// 劳动合同类型
		jyxx.put("ldhtlx", "固定期限劳动合同");
		// 劳动合同起始日期
		jyxx.put("ldhtqsrq", "2024-12-01");
		// 劳动合同截止日期
		jyxx.put("ldhtjzrq", "2030-11-30");
		cbrymdOne.put("jyxx", jyxx);
		cbrymdArr.add(cbrymdOne);
		// 人员名单
		String buyType = "tbrymd";
		json.put(buyType, cbrymdArr);
	}

	/**
	 * @param: requestId ： 请求ID
	 * @Description: 任务查询接口
	 * @Author: hgw
	 * @Date: 2024-12-9 16:54:22
	 * @return: java.lang.String
	 **/
	public R<FriendResult> getFriendByRequestId(RestTemplate restTemplate, String requestId) {
		if (Common.isEmpty(requestId)) {
			return null;
		}
		String appAddUrl = urlPre + urlGetInfo + "?requestId=" + requestId;
		String version = "1.0.0";
		String timestamp = String.valueOf(new Date().getTime());
		String xReqNonce = "1";
		HttpHeaders headers = new HttpHeaders();
		headers.setContentType(MediaType.APPLICATION_JSON);
		headers.add(APP_KEY, appKey);
		headers.add(TIMESTAMP, timestamp);
		try {
			String signature = SocialFriendSign.qianMing(getMapParam(appKey, appSecret, xReqNonce, version, timestamp, requestId));
			headers.add("signature", signature);
		} catch (SignatureException e) {
			log.error("税友签名失败", e);
			return null;
		}
		headers.add(X_REQ_NONCE, xReqNonce);
		headers.add(VERSION, version);
		HttpEntity<String> formEntity = new HttpEntity<>(headers);
		ResponseEntity<String> response = restTemplate.exchange(appAddUrl, HttpMethod.GET, formEntity, String.class);
		if (Common.isEmpty(response) || Common.isEmpty(response.getBody())) {
			throw new CheckedException("获取税友结果失败");
		}
		int statusCode = response.getStatusCodeValue();
		if (statusCode != 200) {
			throw new CheckedException("获取税友结果失败，statusCode=" + statusCode);
		}
		String dataResultList = response.getBody();
		FriendResult result = new FriendResult();
		// 组装返回结果
		getResultToVo(dataResultList, result);
		if (Common.isNotNull(result.getIdCard())) {
			return R.ok(result);
		}
		return R.failed(result);
	}

	// 组装返回结果
	private void getResultToVo(String dataResultList, FriendResult result) {
		if (Common.isNotNull(dataResultList)) {
			JSONObject dataObject = JSON.parseObject(dataResultList);
			String head = dataObject.getString("head");
			if (Common.isNotNull(head)) {
				JSONObject headObject = JSON.parseObject(head);
				String status = headObject.getString("status");
				if ("Y".equals(status)) {
					String body = dataObject.getString("body");
					JSONObject bodyObject = JSON.parseObject(body);
					// 获取核心结果
					getResultToVoCore(result, bodyObject);
				}
			}
		}
	}

	// 提取方法，组装核心结果
	private void getResultToVoCore(FriendResult result, JSONObject bodyObject) {
		if (Common.isNotNull(bodyObject)) {
			// 人员办理项目结果
			JSONArray ryywbljglbArr = (JSONArray) bodyObject.get("ryywbljglb");
			if (Common.isNotNull(ryywbljglbArr)) {
				// 注意：此处可以返回多条身份证，但是我们单条提交
				JSONObject ryywbljglb = (JSONObject) ryywbljglbArr.get(0);
				// 身份证
				String idCard = ryywbljglb.getString("zzhm");
				result.setIdCard(idCard);
				// 办理项目列表
				JSONArray blxmjglbArr = (JSONArray) ryywbljglb.get("blxmjglb");
				if (Common.isNotNull(blxmjglbArr)) {
					// 注意：此处可以返回多条办理，但是我们社保与医保分开提交
					JSONObject blxmjglb = (JSONObject) blxmjglbArr.get(0);
					// 状态1-处理中，2-处理成功，3-处理失败，4-待办(提交成功，待网厅状态流转，上海特有)
					String zt = blxmjglb.getString("zt");
					result.setZt(zt);
					// 明细状态：提交失败、审核失败、审核成功、待确认
					//String mxzt = blxmjglb.getString("mxzt")
					// 提示或者错误信息 SUCCESS
					String cwxx = blxmjglb.getString("cwxx");
					result.setCwxx(cwxx);
				}
			}
		}
	}

	/*
	 * @Description: 塞请求参数
	 * @Author: hgw
	 * @Date: 2024/12/10 10:38
	 * @return: java.util.TreeMap<java.lang.String,java.lang.String>
	 **/
	private TreeMap<String, String> getMapParam(String appKey, String appSecret, String xReqNonce, String version, String timestamp, String requestId) {
		TreeMap<String, String> treeMap = new TreeMap<>();
		if (Common.isNotNull(requestId)) {
			treeMap.put("requestId", requestId);
		}
		treeMap.put(VERSION, version);
		treeMap.put(TIMESTAMP, timestamp);
		treeMap.put(APP_KEY, appKey);
		treeMap.put(X_REQ_NONCE, xReqNonce);
		treeMap.put("appSecret", appSecret);
		return treeMap;
	}

}
