<template>
  <div class="processApproval">
    <div class="left-card">
      <div class="top">
        <div class="commons-title title">
          {{
            processConfig[route.query.flowKey]
              ? processConfig[route.query.flowKey].name + `(${processStaus[route.query.processType] || "发起"})`
              : "流程标题（发起）"
          }}
        </div>
        <div class="line"></div>
        <!-- <SendSubscribe ref="makeDom" @auxiliaryChange='(e) => getAuxiliaryData(e)' v-if="flowForm.flowKey == 'subscribe_flow'" :queryData="queryData.data"></SendSubscribe> -->
      </div>
      <div class="bottom" v-if="route.query.processType != 20">
        <div class="commons-title title">处理意见</div>
        <el-form :model="flowForm" :rules="flowRules" ref="flowFormDom">
          <el-form-item prop="remark" label-width="0px" label="">
            <el-input type="textarea" placeholder="请输入" v-model="flowForm.remark"> </el-input>
          </el-form-item>
          <!-- <el-form-item prop="remark" label-width="80px" label="附件上传">
            <el-upload
              v-model:fileList="flowForm.fileList"
              action="https://winfaster.obs.cn-south-1.myhuaweicloud.com"
              :data="uploadData"
              multiple
              :before-upload="uploadFile"
              :on-success="handleSuccess"
              :on-preview="onPreviewFile">
              <el-button>选择</el-button>
            </el-upload>
          </el-form-item> -->
          <el-form-item>
            <el-button type="primary" v-if="approvalRecordData.buttonInfoList.length == 0" @click="handleSubmit" :loading="btnLoading">提交</el-button>
            <el-button type="primary" v-else v-for="i in approvalRecordData.buttonInfoList" :key="i.type" :loading="btnLoading" @click="handleSubmit(i.type)">
              {{ i.name }}
            </el-button>
          </el-form-item>
        </el-form>
      </div>
    </div>
    <div class="right-card">
      <el-tabs v-model="activeName" class="demo-tabs">
        <el-tab-pane label="审批记录" name="first">
          <ul class="flow-chart">
            <li
              v-for="item in recordList"
              :key="item.id"
              :class="
                !route.query.id
                  ? ''
                  : item.status == 2
                  ? 'flow-orange'
                  : item.status == 3 && !route.query.id
                  ? 'flow-orange'
                  : item.status == 3 && route.query.id
                  ? 'flow-grey'
                  : ''
              ">
              <div class="left-icon">
                <i class="iconfont icon-iconm_daick"></i>
                <i class="iconfont icon-icomx_quertj1 right-btm-status"></i>
              </div>
              <div class="right-conetnt">
                <div class="name">{{ item.nodeName }}</div>
                <div class="remark">
                  <div class="label">
                    <span v-if="item.status != 3">办理人：</span>{{ item.processedUser }}<span class="time">{{ item.processedDate }}</span>
                  </div>
                  {{ item.remark }}
                  <div v-for="j in fileObj[item.flowExampleDetailId]" v-if="fileObj[item.flowExampleDetailId]">
                    <a :href="j.fileUrl" style="color: #409eff; line-height: 30px">{{ j.fileName }}</a>
                  </div>
                </div>
              </div>
              <div class="line"></div>
            </li>
          </ul>
        </el-tab-pane>
        <el-tab-pane label="决策辅助" name="second" v-if="auxiliaryData.length > 0">
          <div style="overflow: auto; height: calc(100vh - 200px)">
            <auxiliary :data="auxiliaryData"></auxiliary>
          </div>
        </el-tab-pane>
      </el-tabs>
    </div>

    <el-dialog title="下一处理人" width="400" v-model="dialogVisible">
      <el-form :model="flowForm">
        <el-form-item prop="remark" label="处理人">
          <el-select v-model="flowForm.handleUserId" placeholder="请选择" filterable style="width: 100%">
            <el-option v-for="item in nextHandleUser" :label="item.name" :value="item.id"> </el-option>
          </el-select>
        </el-form-item>
        <el-form-item>
          <div style="width: 100%; text-align: center">
            <el-button type="primary" @click="handleSelectUser">提交</el-button>
          </div>
        </el-form-item>
      </el-form>
    </el-dialog>
  </div>
</template>

<script setup name="ProcessApproval">
import useTagsViewStore from "@/store/modules/tagsView.js";
import { useRouter, useRoute } from "vue-router";
//决策辅助
import auxiliary from "./auxiliary";
// 消息提示
import { ElMessage } from "element-plus";

const processConfig = ref({
  subscribe_flow: { name: "申购" },
});
const processStaus = ref({
  10: "审批",
  20: "查看",
  30: "退回发起",
});

const router = useRouter();
const route = useRoute();
// tab切换逻辑
const activeName = ref("first");
let auxiliaryData = ref([]);
const getAuxiliaryData = (data) => {
  auxiliaryData.value = data;
};
const btnLoading = ref(false);
// 意见表单
const flowForm = reactive({
  flowKey: "",
  tenantType: "",
  handleUserId: "",
  remark: "",
  data: {},
  fileList: [],
});

const uploadData = ref({});
const flowRules = reactive({
  // remark: [{ required: true, message: "请输入处理意见", trigger: "blur" }],
});
//组件实例
const { proxy } = getCurrentInstance();
const makeDom = ref(null);
const flowFormDom = ref(null);
let dialogVisible = ref(false);
const nextHandleUser = ref([]);
const handleSelectUser = () => {
  if (!flowForm.handleUserId) {
    return ElMessage({
      message: "请选择下一节点处理人！",
      type: "info",
    });
  }
  handleSubmit();
};
const handleResult = (res) => {
  if (res !== null && res.success) {
    skipPage();
  } else {
    dialogVisible.value = true;
    nextHandleUser.value = res.userList;
  }
};

const uploadFile = async (file) => {
  const res = await proxy.post("/fileInfo/getSing", { fileName: file.name });
  uploadData.value = res.uploadBody;
  file.id = res.id;
  file.fileName = res.fileName;
  file.fileUrl = res.fileUrl;
  file.uploadState = true;
  return true;
};
const handleSuccess = (any, UploadFile) => {
  UploadFile.raw.uploadState = false;
};
const onPreviewFile = (file) => {
  window.open(file.raw.fileUrl, "_blank");
};

// 提交逻辑
const handleSubmit = async (_type) => {
  try {
    // 调用发起组件的提交事件
    const flag = await makeDom.value.handleSubmit();
    if (flag) {
      flowFormDom.value.validate((valid) => {
        btnLoading.value = true;
        if (valid) {
          const data = { ...makeDom.value.getFormData() };
          // flowForm.fileList = flowForm.fileList.map((item) => {
          //   return {
          //     ...item,
          //     ...item.raw,
          //   };
          // });
          if (route.query.processType == 10 || route.query.processType == 30) {
            if (_type && _type == 1) {
              proxy
                .post("/flowExample/setStartData", {
                  exampleId: route.query.id,
                  startData: data,
                })
                .then();
            }
            proxy
              .post("/flowProcess/jump", {
                ...flowForm,
                data,
                handleType: _type,
                version: route.query.version,
                flowId: route.query.id,
              })
              .then(
                (res) => {
                  handleResult(res);
                },
                () => {
                  btnLoading.value = false;
                }
              );
            return;
          } else {
            proxy
              .post("/flowProcess/initiate", {
                ...flowForm,
                data,
              })
              .then(
                (res) => {
                  handleResult(res);
                },
                () => {
                  btnLoading.value = false;
                }
              );
          }
        }
      });
    }
  } catch (err) {
    console.log("数据未填完整！", err);
  }
};
// 页面跳转
const skipPage = () => {
  const useTagsStore = useTagsViewStore();
  useTagsStore.delVisitedView(router.currentRoute.value);
  if (route.query.processType) {
    router.replace({
      path: "/oa/1/dealWith",
    });
  } else {
    ElMessage({
      message: "操作成功！",
      type: "success",
    });
    if (flowForm.flowKey == "subscribe_flow") {
      // router.replace({
      //   path: "/ERP/purchaseManage/subscribe",
      // });
    }
  }
};
let queryData = reactive({
  data: {},
});
// 记录
const recordList = ref([]);
const fileIds = ref([]);
const fileObj = ref({});
const approvalRecordData = ref({
  buttonInfoList: [],
});
const getRecords = (_id) => {
  if (_id) {
    proxy
      .post("/flowExample/getApprovalRecord", {
        id: _id,
      })
      .then((res) => {
        recordList.value = res.recordList;
        queryData.data.recordList = res.recordList;
        approvalRecordData.value = res;
        fileIds.value = res.recordList.map((item) => {
          return item.flowExampleDetailId;
        });
        proxy.post("fileInfo/getList", { businessIdList: fileIds.value }).then((res2) => {
          fileObj.value = res2;
        });
      });
  } else {
    proxy
      .post("/flowExample/getFlowNode", {
        flowKey: flowForm.flowKey,
      })
      .then((res) => {
        recordList.value = res;
      });
  }
};
onMounted(async () => {
  //processType 10 为修改 20为查看 30回退发起
  if (route.query.processType == 10 || route.query.processType == 20 || route.query.processType == 30) {
    await proxy.post("/flowProcess/getStartData", { flowId: route.query.id }).then((res) => {
      queryData.data = { ...res };
    });
  } else {
    queryData.data = { ...route.query };
  }
  flowForm.flowKey = route.query.flowKey;
  flowForm.tenantType = route.query.tenantType;
  getRecords(route.query.id);
});
</script>
<style>
.el-upload-list {
  float: left;
  margin: 0 !important;
}
.el-upload-list li {
  width: 100px;
  margin-left: 10px;
}
.el-upload--text {
  float: left;
}
</style>
<style lang="scss" scoped>
.processApproval {
  display: flex;
  justify-content: space-between;
  margin-top: 20px;
  padding: 0 20px;
  height: calc(100vh - 130px);
  .left-card {
    border-radius: 4px;
    width: calc(100% - 400px - 20px);
    margin-right: 20px;
    display: flex;
    flex-direction: column;
    .top {
      flex: 1;
      overflow-y: auto;
      background: #fff;
      padding: 20px 20px 0px 20px;
      .line {
        border-bottom: 1px solid #ddd;
        margin-bottom: 20px;
      }
    }
    .bottom {
      margin-top: 10px;
      height: 220px;
      background: #fff;
      padding: 20px 20px 0px 20px;
    }
  }
  .right-card {
    background: #fff;
    border-radius: 4px;
    padding: 0 20px 20px;
    width: 400px;
    box-sizing: border-box;
    .flow-chart {
      overflow: auto;
      height: calc(100vh - 200px);
      padding: 0;
      margin: 0;
      li {
        margin: 0;
        padding: 0 0 20px;
        list-style: none;
        display: flex;
        justify-content: space-between;
        position: relative;
        .right-conetnt {
          flex: 1;
          .name {
            font-size: 12px;
            color: #39c55a;
            margin-bottom: 10px;
            span {
              color: #999;
            }
          }
          .time {
            float: right;
          }
          .remark {
            padding: 10px;
            color: #666666;
            font-size: 12px;
            background: #f1f1f1;
            border-radius: 2px;
            .label {
              color: #999;
              margin-bottom: 10px;
            }
          }
        }
        .left-icon {
          width: 40px;
          height: 40px;
          text-align: center;
          line-height: 40px;
          background: #0084ff;
          border-radius: 10px;
          color: #fff;
          font-size: 20px;
          position: relative;
          margin-right: 27px;
          z-index: 2;
          .right-btm-status {
            position: absolute;
            bottom: 0px;
            right: -10px;
            height: 20px;
            width: 20px;
            line-height: 16px;
            border-radius: 10px;
            background: #39c55a;
            border: 2px solid #fff;
            font-size: 12px;
            box-sizing: border-box;
          }
        }
      }
      li::before {
        content: "";
        position: absolute;
        top: 0;
        left: 20px;
        width: 2px;
        height: 100%;
        background: #ddd;
        z-index: 1;
      }
      li:last-child::before {
        display: none;
      }
      .flow-orange {
        .right-btm-status {
          background: #ff9a00 !important;
        }
        .name {
          color: #ff9a00 !important;
        }
        .left-icon {
          background: #ff9a00 !important;
        }
      }
      .flow-grey {
        .right-btm-status {
          background: #999 !important;
        }
        .name {
          color: #999 !important;
        }
        .left-icon {
          background: #999 !important;
        }
      }
      .flow-red {
        .right-btm-status {
          background: #ff4d4f !important;
        }
        .name {
          color: #ff4d4f !important;
        }
        .left-icon {
          background: #ff4d4f !important;
        }
      }
    }
  }
}
</style>
