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

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.weaver.common.base.entity.result.WeaResult;
import com.weaver.seconddev.interfaces.workflow.action.ZOA_FI_VENDOR_MAINTAIN;
import com.weaver.verupgrade.conn.CONN_TYPE;
import com.weaver.verupgrade.conn.RecordSet;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @Author: calyrex
 * @CreateTime: 2025-01-08
 * @Description: ZOA_FI_VENDOR_MAINTAIN的API调用
 */

@Slf4j
@RestController
@RequestMapping({"/papi/secondev/workflow/controller" })
public class ZOA_FI_VENDOR_MAINTAIN_CONTROLLER {
    @GetMapping("/ZOA_FI_VENDOR_MAINTAIN")
    //@PostMapping("/post")
    public WeaResult<String> run(@RequestParam Map<String,Object> params) {
        log.error("ZOA_FI_VENDOR_MAINTAIN_CONTROLLER execute start");
        log.error("ZOA_FI_VENDOR_MAINTAIN_CONTROLLER execute params : " + params);
        try {
            String edit_flag = null2String(params.get("edit_flag"));
            String bukrs = null2String(params.get("bukrs"));//公司代码
            String lifnr = null2String(params.get("lifnr"));//供应商编号
            String ktokk = null2String(params.get("ktokk"));//账户组
            String anred = null2String(params.get("anred"));//称谓
            String name1 = null2String(params.get("name1"));//名称
            String sortl = null2String(params.get("sortl"));//简称-搜索项
            String telf1 = null2String(params.get("telf1"));//电话
            String smtp_addr = null2String(params.get("smtp_addr"));//邮件
            String telf2 = null2String(params.get("telf2"));//手机
            String telfx = null2String(params.get("telfx"));//传真
            String land1 = null2String(params.get("land1"));//国家
            String regio = null2String(params.get("regio"));//地区
            String spras = null2String(params.get("spras"));//语言
            String ort01 = null2String(params.get("ort01"));//城市
            String stras = null2String(params.get("stras"));//地址
            String pstlz = null2String(params.get("pstlz"));//邮政编号
            String bankl = null2String(params.get("bankl"));//开户行行号
            String banka = null2String(params.get("banka"));//开户行名称
            String banks = null2String(params.get("banks"));//开户行国家
            String koinh = null2String(params.get("koinh"));//开户行账号
            String stcd5 = null2String(params.get("stcd5"));//纳税登记证代码
            String akont = null2String(params.get("akont"));//统驭科目
            String zterm = null2String(params.get("zterm"));//付款条件
            String zuawa = null2String(params.get("zuawa"));//排序码
            String zwels = null2String(params.get("zwels"));//付款方式
            String frgrp = null2String(params.get("frgrp"));//批准组
            String zahls = null2String(params.get("zahls"));//付款冻结
            String reprf = null2String(params.get("reprf"));//检查双重发票
            String bumen = null2String(params.get("bumen"));//部门
            String gangwei = null2String(params.get("gangwei"));//岗位
            String name2 = ""; //部门
            String name3 = ""; //岗位

            log.error("ZOA_FI_VENDOR_MAINTAIN_CONTROLLER execute bumen : " + bumen);
            log.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];
            JSONObject xmlData = new JSONObject();
            xmlData.put("estatus", estatus);
            xmlData.put("emessage", emessage);
            xmlData.put("lifnr", null2String(fhz[1][0]));
            xmlData.put("bukrs", null2String(fhz[1][1]));
            xmlData.put("ktokk", null2String(fhz[1][2]));

            // 处理 CDATA 部分，直接使用字符串值
            xmlData.put("txt30", null2String(fhz[1][3]));
            xmlData.put("anred", null2String(fhz[1][4]));
            xmlData.put("name1", null2String(fhz[1][5]));
            xmlData.put("sortl", null2String(fhz[1][6]));
            xmlData.put("telf1", null2String(fhz[1][7]));
            xmlData.put("smtp_addr", null2String(fhz[1][8]));
            xmlData.put("telf2", null2String(fhz[1][9]));
            xmlData.put("telfx", null2String(fhz[1][10]));
            xmlData.put("land1", null2String(fhz[1][11]));
            xmlData.put("landx50", null2String(fhz[1][12]));
            xmlData.put("bland", null2String(fhz[1][13]));
            xmlData.put("bezei", null2String(fhz[1][14]));
            xmlData.put("spras", null2String(fhz[1][15]));
            xmlData.put("sptxt", null2String(fhz[1][16]));
            xmlData.put("ort01", null2String(fhz[1][17]));
            xmlData.put("stras", null2String(fhz[1][18]));
            xmlData.put("pstlz", null2String(fhz[1][19]));
            xmlData.put("bankl", null2String(fhz[1][20]));
            xmlData.put("banka", null2String(fhz[1][21]));
            xmlData.put("banks", null2String(fhz[1][22]));
            xmlData.put("landx", null2String(fhz[1][23]));
            xmlData.put("koinh", null2String(fhz[1][24]));
            xmlData.put("stcd5", null2String(fhz[1][25]));
            xmlData.put("akont", null2String(fhz[1][26]));
            xmlData.put("txt20", null2String(fhz[1][27]));
            xmlData.put("zterm", null2String(fhz[1][28]));
            xmlData.put("text1", null2String(fhz[1][29]));
            xmlData.put("zuawa", null2String(fhz[1][30]));
            xmlData.put("ttext", null2String(fhz[1][31]));
            xmlData.put("zwels", null2String(fhz[1][32]));
            xmlData.put("text2", null2String(fhz[1][33]));
            xmlData.put("frgrp", null2String(fhz[1][34]));
            xmlData.put("frgrt", null2String(fhz[1][35]));
            xmlData.put("zahls", null2String(fhz[1][36]));
            xmlData.put("reprf", null2String(fhz[1][37]));
            xmlData.put("name2", null2String(fhz[1][38]));
            xmlData.put("name3", null2String(fhz[1][39]));
            return WeaResult.success(JSONObject.toJSONString(xmlData));
        }catch (Exception e){
            log.error("ZOA_FI_VENDOR_MAINTAIN_CONTROLLER error--" , e);
            return WeaResult.fail(500, "执行异常", e.getMessage());
        }
    }

    /**
     * 根据部门ID获取部门名称
     *
     * @param deptid 部门ID，用于查询部门名称
     * @return 部门名称如果找到对应的部门则返回名称，否则返回空字符串
     */
    private String getDepartmentname(String deptid){
        // 构造SQL查询语句，根据部门ID查询部门名称
        String sql = "select id,name from eteams.dbo.department where id = " + deptid;
        // 记录查询语句日志
        log.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);
        // 记录执行结果日志
        log.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 name from eteams.dbo.position where id = " + jobid;

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

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

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

        // 执行数据库查询操作，并记录操作结果的日志信息
        boolean b = rs.execute(sql, poolname_oj);
        log.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;
    }
}
