package com.weaver.seconddev.interfaces.workflow.action;

import com.weaver.common.base.entity.result.WeaResult;
import com.weaver.esb.api.rpc.EsbServerlessRpcRemoteInterface;
import com.weaver.seconddev.interfaces.scfoa.GetApproveResult;
import com.weaver.verupgrade.conn.CONN_TYPE;
import com.weaver.verupgrade.conn.RecordSet;
import com.weaver.verupgrade.general.BaseBean;
import com.weaver.verupgrade.interfaces.workflow.action.Action;
import com.weaver.verupgrade.soa.workflow.request.RequestInfo;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashMap;
import java.util.Map;

/**
 * @Author: calyrex
 * @CreateTime: 2025-01-10
 * @Description:ZOA_FI_VENDOR_MAINTAIN的动作流调用
 */

@org.springframework.stereotype.Service("workflow_action_ZOA_FI_VENDOR_MAINTAIN_ACTION")
public class ZOA_FI_VENDOR_MAINTAIN_ACTION implements EsbServerlessRpcRemoteInterface {
    // 对应E9的请求信息对象

    @Autowired
    private RequestInfo requestInfoTemp;

    private static final Logger logger_d39bef7 = LoggerFactory.getLogger(ZOA_FI_VENDOR_MAINTAIN_ACTION.class);

    @Override
    public WeaResult<Map<String, Object>> execute(Map<String, Object> requestInfoMap) {
        logger_d39bef7.error("ZOA_FI_VENDOR_MAINTAIN_ACTION start");
        logger_d39bef7.error("requestInfoMap:{}", requestInfoMap);
//        Long requestIdTemp = Long.parseLong(String.valueOf(requestInfoMap.getOrDefault("requestid", -1)));
//        Long userIdTemp = Long.parseLong(String.valueOf(requestInfoMap.getOrDefault("userid", -1)));
//        RequestInfo requestinfo = requestInfoTemp.getRequestInfo(requestIdTemp, userIdTemp);
        try {
            String edit_flag = null2String(requestInfoMap.get("edit_flag"));
            String bukrs = null2String(requestInfoMap.get("bukrs"));//公司代码
            String lifnr = null2String(requestInfoMap.get("lifnr"));//供应商编号
            String ktokk = null2String(requestInfoMap.get("ktokk"));//账户组
            String anred = null2String(requestInfoMap.get("anred"));//称谓
            String name1 = null2String(requestInfoMap.get("name1"));//名称
            String sortl = null2String(requestInfoMap.get("sortl"));//简称-搜索项
            String telf1 = null2String(requestInfoMap.get("telf1"));//电话
            String smtp_addr = null2String(requestInfoMap.get("smtp_addr"));//邮件
            String telf2 = null2String(requestInfoMap.get("telf2"));//手机
            String telfx = null2String(requestInfoMap.get("telfx"));//传真
            String land1 = null2String(requestInfoMap.get("land1"));//国家
            String regio = null2String(requestInfoMap.get("regio"));//地区
            String spras = null2String(requestInfoMap.get("spras"));//语言
            String ort01 = null2String(requestInfoMap.get("ort01"));//城市
            String stras = null2String(requestInfoMap.get("stras"));//地址
            String pstlz = null2String(requestInfoMap.get("pstlz"));//邮政编号
            String bankl = null2String(requestInfoMap.get("bankl"));//开户行行号
            String banka = null2String(requestInfoMap.get("banka"));//开户行名称
            String banks = null2String(requestInfoMap.get("banks"));//开户行国家
            String koinh = null2String(requestInfoMap.get("koinh"));//开户行账号
            String stcd5 = null2String(requestInfoMap.get("stcd5"));//纳税登记证代码
            String akont = null2String(requestInfoMap.get("akont"));//统驭科目
            String zterm = null2String(requestInfoMap.get("zterm"));//付款条件
            String zuawa = null2String(requestInfoMap.get("zuawa"));//排序码
            String zwels = null2String(requestInfoMap.get("zwels"));//付款方式
            String frgrp = null2String(requestInfoMap.get("frgrp"));//批准组
            String zahls = null2String(requestInfoMap.get("zahls"));//付款冻结
            String reprf = null2String(requestInfoMap.get("reprf"));//检查双重发票
            String bumen = null2String(requestInfoMap.get("bumen"));//部门
            String gangwei = null2String(requestInfoMap.get("gangwei"));//岗位
            String name2 = ""; //部门
            String name3 = ""; //岗位

            logger_d39bef7.error("ZOA_FI_VENDOR_MAINTAIN_CONTROLLER execute bumen : " + bumen);
            logger_d39bef7.error("ZOA_FI_VENDOR_MAINTAIN_CONTROLLER execute gangwei : " + gangwei);

            if(StringUtils.isNotEmpty(bumen)){
                name2 = getDepartmentname(bumen);
            }
            if(StringUtils.isNotEmpty(gangwei)){
                name3 = getJobTitlesname(gangwei);
            }

            String estatus = "E";
            String emessage = "";
            String[] prdetail = new String[41];
            prdetail[0] = edit_flag; //动作类型
            prdetail[1] = bukrs; //公司代码
            prdetail[2] = lifnr; //供应商编号
            prdetail[3] = ktokk; //账户组
            prdetail[4] = anred; //称谓
            prdetail[5] = name1; //名称
            prdetail[6] = sortl; //简称-搜索项
            prdetail[7] = telf1; //电话
            prdetail[8] = smtp_addr; //邮件
            prdetail[9] = telf2; //手机
            prdetail[10] = telfx; //传真
            prdetail[11] = land1; //国家
            prdetail[12] = regio; //地区
            prdetail[13] = spras; //语言
            prdetail[14] = ort01; //城市
            prdetail[15] = stras; //地址
            prdetail[16] = pstlz;//邮政编号
            prdetail[17] = bankl; //开户行行号
            prdetail[18] = banka;//开户行名称
            prdetail[19] = banks;//开户行国家
            prdetail[20] = koinh; //开户行账号
            prdetail[21] = stcd5;//纳税登记证代码

            prdetail[22] = akont;//统驭科目
            prdetail[23] = zterm;//付款条件
            prdetail[24] = zuawa; //排序码
            prdetail[25] = zwels;//付款方式
            prdetail[26] = frgrp;//批准组

            prdetail[29] = name2;//部门
            prdetail[30] = name3;//岗位
            prdetail[40] = "";

            //付款冻结
            if(zahls.equals("X")){
                prdetail[27] = zahls;
            }else{
                prdetail[27] = "";
            }

            //检查双重发票
            if(reprf.equals("X")){
                prdetail[28] = reprf;
            }else{
                prdetail[28] = "";
            }

            ZOA_FI_VENDOR_MAINTAIN po=new ZOA_FI_VENDOR_MAINTAIN();
            String[][] fhz = po.Getexecute(prdetail);
            if(fhz[0][0].equals("S")){
                estatus = fhz[0][0];
            }
            emessage = fhz[0][1];
            Map<String,Object> result = new HashMap<>();
            result.put("estatus",estatus);
            result.put("emessage",emessage);
            result.put("lifnr",fhz[1][0]);
            result.put("bukrs",fhz[1][1]);
            result.put("ktokk",fhz[1][2]);
            result.put("txt30",fhz[1][3]);
            result.put("anred",fhz[1][4]);
            result.put("name1",fhz[1][5]);
            result.put("sortl",fhz[1][6]);
            result.put("telf1",fhz[1][7]);
            result.put("smtp_addr",fhz[1][8]);
            result.put("telf2",fhz[1][9]);
            result.put("telfx",fhz[1][10]);
            result.put("land1",fhz[1][11]);
            result.put("landx50",fhz[1][12]);
            result.put("bland",fhz[1][13]);
            result.put("bezei",fhz[1][14]);
            result.put("spras",fhz[1][15]);
            result.put("sptxt",fhz[1][16]);
            result.put("ort01",fhz[1][17]);
            result.put("stras",fhz[1][18]);
            result.put("pstlz",fhz[1][19]);
            result.put("bankl",fhz[1][20]);
            result.put("banka",fhz[1][21]);
            result.put("banks",fhz[1][22]);
            result.put("landx",fhz[1][23]);
            result.put("koinh",fhz[1][24]);
            result.put("stcd5",fhz[1][25]);
            result.put("akont",fhz[1][26]);
            result.put("txt20",fhz[1][27]);
            result.put("zterm",fhz[1][28]);
            result.put("text1",fhz[1][29]);
            result.put("zuawa",fhz[1][30]);
            result.put("ttext",fhz[1][31]);
            result.put("zwels",fhz[1][32]);
            result.put("text2",fhz[1][33]);
            result.put("frgrp",fhz[1][34]);
            result.put("frgrt",fhz[1][35]);
            result.put("zahls",fhz[1][36]);
            result.put("reprf",fhz[1][37]);
            result.put("name2",fhz[1][38]);
            result.put("name3",fhz[1][39]);
            return WeaResult.success(result);
        }catch (Exception e){
            logger_d39bef7.error("ZOA_FI_VENDOR_MAINTAIN_ACTION error:{}", e);
            return WeaResult.fail(500, "ZOA_FI_VENDOR_MAINTAIN_ACTION error:{}", e);
        }
    }

    /**
     * 根据部门ID获取部门名称
     *
     * @param deptid 部门ID，用于查询部门名称
     * @return 部门名称如果找到对应的部门则返回名称，否则返回空字符串
     */
    private String getDepartmentname(String deptid){
        // 构造SQL查询语句，根据部门ID查询部门名称
        String sql = "select id,name from eteams.dbo.department where id = " + deptid;
        // 记录查询语句日志
        logger_d39bef7.error("getDepartmentname sql--" + sql);
        // 创建RecordSet对象用于执行SQL查询
        RecordSet rs = new RecordSet();
        // 获取连接池名称
        String poolname_oj = CONN_TYPE.hrm.getType();
        // 执行SQL查询
        boolean b = rs.execute(sql, poolname_oj);
        // 记录执行结果日志
        logger_d39bef7.error("getDepartmentname b--" + b);
        // 如果查询到结果，则返回部门名称
        if (rs.next()) {
            return rs.getString("name");
        }
        // 如果没有查询到结果，则返回空字符串
        return "";
    }

    /**
     * 根据职位ID获取职位名称
     *
     * @param jobid 职位ID，用于查询特定职位的名称
     * @return 职位名称如果找到对应的职位名称，则返回该名称；否则返回空字符串
     */
    private String getJobTitlesname(String jobid){
        // 构造SQL查询语句，用于从数据库中获取指定职位ID的名称
        String sql = "select id,name from eteams.dbo.position where id = " + jobid;

        // 记录查询语句的日志信息
        logger_d39bef7.error("getJobTitlesname sql--" + sql);

        // 创建RecordSet对象用于执行数据库查询操作
        RecordSet rs = new RecordSet();

        // 获取数据库连接池名称
        String poolname_oj = CONN_TYPE.hrm.getType();

        // 执行数据库查询操作，并记录操作结果的日志信息
        boolean b = rs.execute(sql, poolname_oj);
        logger_d39bef7.error("getJobTitlesname b--" + b);

        // 如果查询结果存在下一条记录，则返回该记录的名称字段
        if(rs.next()) {
            return rs.getString("name");
        }

        // 如果没有查询到任何记录，则返回空字符串
        return "";
    }

    public static String null2String(String s){
        return s == null ? "" : s;
    }

    public static String null2String(Object o){
        return o == null ? "" : o.toString();
    }

    public static String null2String(String s1,String s2){
        return s1 == null ? (s2 == null ? "" : s2) : s1;
    }
}
