package shkd.repc.task;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import kd.bos.context.RequestContext;
import kd.bos.dataentity.entity.DynamicObject;
import kd.bos.exception.KDException;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.orm.query.QFilter;
import kd.bos.schedule.executor.AbstractTask;
import kd.bos.servicehelper.BusinessDataServiceHelper;
import kd.bos.servicehelper.operation.SaveServiceHelper;
import kd.sdk.plugin.Plugin;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import shkd.utils.DobeDWUtils;

import java.io.IOException;
import java.util.Map;

/**
 * 行政组织和财务组织对应关系后台任务插件
 */
public class DobeDWorgRelationTask extends AbstractTask implements Plugin {

    private static Log log = LogFactory.getLog(DobeDWorgRelationTask.class);
    private static final String entityName = "qeug_recon_orgrelation";//供应链库 表名 tk_qeug_recon_orgrelation
    private static final String developerName = "qeug_recon_developer";//供应链库 表名 tk_qeug_recon_developer
    private static final String orgEntityName = "bos_org";//系统库 表名 t_ORG_ORG
    private static final String dw_menthod = "mdm_orgcorp";

    @Override
    public void execute(RequestContext requestContext, Map<String, Object> map) throws KDException {
        //从数仓获取当天更新的行政组织-项目-账套公司-印章管理员-财务组织(对照)数据,并与系统中的组织数据比较,是新增还是更新
        //组装请求数仓查询接口入参
        //调用数仓查询接口
        OkHttpClient client = new OkHttpClient();
        Request request = new Request.Builder().url(DobeDWUtils.dwUrl+dw_menthod)
                .post(DobeDWUtils.createRequestBody("",1))
                .header("Content-Type", "application/json")
                .header("Authorization", DobeDWUtils.appCode)
                .build();

        String resultData = null;
        Response response = null;
        try {
            response = client.newCall(request).execute();
            resultData = response.body().string();
            log.info("组织对应关系接口返回结果:\n{}", resultData);
        } catch (IOException e) {
            log.info(String.format("组织对应关系接口异常:%s", e.getMessage()));
            throw new RuntimeException(e);
        }
        JSONObject json_body = JSON.parseObject(resultData);
        //接口返回的数据进行了分页
        int totalNum = json_body.getIntValue("totalNum");//分页-SQL查询总数据量
        handleOrgRelation(json_body);
        int queryCount = DobeDWUtils.getQueryCount(totalNum);
        if(queryCount > 1){
            //查询次数不止一次,需要分页查询
            for (int i = 2; i <= queryCount; i++) {
                request = new Request.Builder().url(DobeDWUtils.dwUrl+dw_menthod)
                        .post(DobeDWUtils.createRequestBody("",i))
                        .header("Content-Type", "application/json")
                        .header("Authorization", DobeDWUtils.appCode)
                        .build();
                try {
                    response = client.newCall(request).execute();
                    resultData = response.body().string();
                } catch (IOException e) {
                    log.info(String.format("组织对应关系接口异常:%s", e.getMessage()));
                    throw new RuntimeException(e);
                }
                json_body = JSON.parseObject(resultData);
                handleOrgRelation(json_body);
            }
        }
    }

    private void handleOrgRelation(JSONObject json_body) {
        //解析接口返回值,与系统数据比较
        JSONArray detailsJson = json_body.getJSONArray("data");
        DynamicObject orginfo = null;
        String orgNumber = null;
        String orgName = null;
        String companyNumber = null;
        String companyName = null;
        String deptNumber = null;
        String deptName = null;
        String paybank = null;
        String paynumber = null;
        String taxno = null;
        DynamicObject yworginfo = null;
        DynamicObject devepinfo = null;

        for (int i = 0; i < detailsJson.size(); i++) {
            json_body = detailsJson.getJSONObject(i);
            orgNumber = json_body.getString("oaorg_code");//oa组织code oa组织id是oaorg_id
            orgName = json_body.getString("oaorg_name");//oa组织名称
            companyNumber = json_body.getString("corp_code");//财务公司编号
            companyName = json_body.getString("corp_name");//财务公司名称
            deptNumber = json_body.getString("corpdep_code");//财务公司部门编号
            deptName = json_body.getString("corpdep_name");//财务公司部门名称
            paybank = json_body.getString("corp_bank");//财务公司银行
            paynumber = json_body.getString("corp_bankaccount");//财务公司银行账户
            taxno = json_body.getString("corp_tax");//财务公司税号
            if(DobeDWUtils.isEmpty(orgNumber) || DobeDWUtils.isEmpty(companyNumber) || DobeDWUtils.isEmpty(deptNumber) || DobeDWUtils.isEmpty(paynumber)
                    || DobeDWUtils.isEmpty(companyName) || DobeDWUtils.isEmpty(deptName) || DobeDWUtils.isEmpty(paybank)){
                log.info(String.format("组织对应关系接口入参为空异常:%s", json_body.toJSONString()));
                continue;
            }
            //根据组织编号查找系统现有数据是否存在 "id,number,name,qeug_companynumber,qeug_companyname,qeug_deptnumber,qeug_deptname",
            orginfo = BusinessDataServiceHelper.loadSingle(entityName,new QFilter[]{new QFilter("number","=",orgNumber)});
            if(orginfo != null){
                //QueryServiceHelper.queryOne查出来的对象不是DynamicObject 而是平铺对象plainobject 此对象不能在后续代码中进行修改和更新;
                if(isNeedUpdate(orginfo,companyNumber,deptNumber,paynumber,taxno,companyName,deptName,paybank)){
                    orginfo.set("name", orgName);
                    orginfo.set("qeug_companynumber", companyNumber);
                    orginfo.set("qeug_companyname", companyName);
                    orginfo.set("qeug_deptnumber", deptNumber);
                    orginfo.set("qeug_deptname", deptName);
                    orginfo.set("qeug_paybank", paybank);
                    orginfo.set("qeug_paynumber", paynumber);
                    orginfo.set("qeug_taxno", taxno);
                    SaveServiceHelper.update(orginfo);
                }
            }else{
                //不存在,做新增 根据实体名称创建动态对象
                orginfo = BusinessDataServiceHelper.newDynamicObject(entityName);
                orginfo.set("number", orgNumber);
                orginfo.set("name", orgName);
                orginfo.set("qeug_companynumber", companyNumber);
                orginfo.set("qeug_companyname", companyName);
                orginfo.set("qeug_deptnumber", deptNumber);
                orginfo.set("qeug_deptname", deptName);
                orginfo.set("qeug_paybank", paybank);
                orginfo.set("qeug_paynumber", paynumber);
                orginfo.set("qeug_taxno", taxno);
                orginfo.set("enable", 1);
                orginfo.set("status", "A");//单据状态 A保存 B已提交 C已审核
                orginfo.set("creator", 43007523L);//创建人默认指定为金小蝶
                //保存数据:直接保存入库,不走操作校验
                SaveServiceHelper.save(new DynamicObject[]{orginfo});
            }

            //根据行政组织编号找到星瀚上的业务单元对象
            yworginfo = BusinessDataServiceHelper.loadSingle(orgEntityName,new QFilter[]{new QFilter("number","=",orgNumber)});
            if(yworginfo != null && !companyName.equals(yworginfo.getString("ffirmname"))){
                yworginfo.set("ffirmname", companyName);//业务单元-公司名称
                yworginfo.set("depositbank", paybank);//业务单元-开户行
                yworginfo.set("bankaccount", paynumber);//业务单元-银行账户
                yworginfo.set("uniformsocialcreditcode", taxno);//业务单元-统一社会信用代码
                SaveServiceHelper.update(yworginfo);
            }
            //根据财务组织编号和名称判断甲方是否需要新增和修改
            devepinfo = BusinessDataServiceHelper.loadSingle(developerName,new QFilter[]{new QFilter("number","=",companyNumber)});
            if(devepinfo == null){
                devepinfo = BusinessDataServiceHelper.newDynamicObject(developerName);
                devepinfo.set("number", companyNumber);
                devepinfo.set("name", companyName);
                devepinfo.set("enable", 1);
                devepinfo.set("status", "C");//单据状态 A保存 B已提交 C已审核
                devepinfo.set("creator", 43007523L);//创建人默认指定为金小蝶
                //保存数据:直接保存入库,不走操作校验
                SaveServiceHelper.save(new DynamicObject[]{devepinfo});
            }else if(!companyName.equals(devepinfo.getString("name"))){
                devepinfo.set("name", companyName);
                SaveServiceHelper.update(devepinfo);
            }
        }
    }

    private boolean isNeedUpdate(DynamicObject orginfo,String companyNumber,String deptNumber,String paynumber,String taxno,
                                 String companyName,String deptName,String paybank){
        if(!companyNumber.equals(orginfo.getString("qeug_companynumber"))){
            return true;
        }
        if(!deptNumber.equals(orginfo.getString("qeug_deptnumber"))){
            return true;
        }
        if(!paynumber.equals(orginfo.getString("qeug_paynumber"))){
            return true;
        }
        if(!companyName.equals(orginfo.getString("qeug_companyname"))){
            return true;//财务公司名称
        }
        if(!deptName.equals(orginfo.getString("qeug_deptname"))){
            return true;//财务部门名称
        }
        if(!paybank.equals(orginfo.getString("qeug_paybank"))){
            return true;//财务公司银行
        }
        if(DobeDWUtils.isEmpty(taxno) || !taxno.equals(orginfo.getString("qeug_taxno"))){
            return true;
        }
        return false;
    }
}