<template>
  <view class="">
    <u--form
      style="margin: 0 20px"
      labelPosition="left"
      :model="form"
      :rules="rules"
      ref="uForm"
      labelWidth="140rpx"
    >
      <u-form-item label="审批建议" prop="reason" required>
        <u--textarea
          style="width: 100%"
          height="120"
          border="surround"
          placeholder="请输入审批建议"
          v-model="form.reason"
        ></u--textarea>
      </u-form-item>
    </u--form>
    <view class="btnList">
      <u-button
        style="width: 45%; margin-bottom: 10rpx"
        :loading="loading"
        type="success"
        :text="taskDefinitionKey === 'storeman' ? '申请出库' : '通过'"
        @click="handleAudit(1)"
      >
      </u-button>
      <u-button
        style="width: 45%"
        :loading="loading"
        type="error"
        text="驳回"
        @click="rejectTask(0)"
      ></u-button>
    </view>
    <view class="btnConcel" v-if="taskDefinitionKey !== 'deptLeaderApprove'">
      <u-button @click="showAction = true">更多</u-button>
    </view>
    <u-action-sheet
      :actions="actionList"
      :closeOnClickOverlay="true"
      :closeOnClickAction="true"
      title="更多操作"
      :show="showAction"
      @close="showAction = false"
      @select="selectActionClick"
    ></u-action-sheet>
  </view>
</template>

<script>
import {
  approveTaskWithVariables,
  rejectTask,
  cancelTask,
} from "@/api/wt/index.js";
import { outStorage } from "@/api/warehouseManagement/index.js";

export default {
  name: "taskSubmit",
  props: {
    businessId: {
      default: "",
    },
    taskId: {
      default: "",
    },
    id: {
      default: "",
    },
    taskDefinitionKey: {
      default: "",
    },
  },

  data() {
    return {
      showAction: false,
      loading: false,
      taskFormData: {},
      actionList: [
        {
          name: "作废",
          fontSize: "28",
          color: "#ffaa7f",
        },
      ],
      form: {
        technicianId: "",
        reason: "",
      },
      rules: {
        reason: {
          type: "string",
          required: true,
          message: "请输入审批建议",
          trigger: "blur",
        },
      },
    };
  },
  mounted() {
    this.$refs.uForm.setRules(this.rules);
  },
  methods: {
    async syncTaskFormData() {
      try {
        const data = await this.getTableValue();
        this.taskFormData = data || {};
      } catch (e) {
        console.warn("获取 taskForm 数据失败", e);
        this.taskFormData = {};
      }
      return this.taskFormData;
    },
    selectActionClick(item) {
      if (item.name == "作废") {
        uni.showModal({
          title: "提示",
          content: "是否确认作废？",
          success: async (modalRes) => {
            if (modalRes.confirm) {
              if (!this.form.reason) {
                return uni.showToast({
                  title: "审批建议不能为空",
                  icon: "none",
                });
              }
              this.loading = true;
              await this.syncTaskFormData();
              cancelTask({
                taskId: this.taskId,
                id: this.id,
                reason: this.form.reason,
                businessId: this.businessId,
                variables: {
                  taskFormData: this.taskFormData,
                },
              })
                .then(() => {
                  this.loading = false;
                  this.$emit("handleAudit", {
                    title: "作废",
                  });
                })
                .catch(() => {
                  this.loading = false;
                  uni.showToast({ title: "流程作废失败", icon: "none" });
                });
            }
          },
        });
      }
    },
    async handleAudit(status) {
      if (!!status) {
        try {
          await this.$refs.uForm.validate();
        } catch (e) {
          return;
        }
      }
      await this.syncTaskFormData();

      let storageData = this.taskFormData.returnStorageData;

      if (!!status) {
        if (!storageData?.extInfo?.verifyDeptCode) {
          return uni.showToast({ title: "请选择部门", icon: "none" });
        }
        if (!storageData?.fromUser) {
          return uni.showToast({ title: "请选择领料人", icon: "none" });
        }
      }
      if (!this.form.reason && !!status) {
        return uni.showToast({ title: "请输入审批意见", icon: "none" });
      }

      if (this.taskDefinitionKey === "storeman" && !!status) {
        storageData.isSkip = 1;
        try {
          this.loading = true;
          const res = await outStorage(storageData);
          if (res.code == 0) {
            await this._approveTaskWithVariables(status);
          }
        } catch (error) {
          this.loading = false;
          uni.showToast({ title: "出库失败", icon: "none" });
        }
      } else {
        this.loading = true;
        await this._approveTaskWithVariables(status);
      }
    },
    async _approveTaskWithVariables(status) {
      try {
        let variables = {
          pass: !!status,
          taskFormData: this.taskFormData,
        };
        let API = !!status ? approveTaskWithVariables : rejectTask;
        let res = await API({
          id: this.taskId,
          reason: this.form.reason,
          variables,
        });

        if (res.code != "-1") {
          this.$emit("handleAudit", {
            status,
            title: status === 0 ? "驳回" : "",
          });
        }
      } catch (e) {
        console.error("审批操作失败", e);
        uni.showToast({ title: "操作失败", icon: "none" });
      } finally {
        this.loading = false;
      }
    },
    async rejectTask(status) {
      await this.syncTaskFormData();
      try {
        this.loading = true;
        let variables = {
          pass: !!status,
          taskFormData: this.taskFormData,
        };
        let res = await rejectTask({
          id: this.taskId,
          reason: this.form.reason,
          variables,
        });

        if (res.code != "-1") {
          this.$emit("handleAudit", {
            status,
            title: status === 0 ? "驳回" : "",
          });
        }
      } catch (e) {
        console.error("驳回操作失败", e);
        uni.showToast({ title: "驳回失败", icon: "none" });
      } finally {
        this.loading = false;
      }
    },
    getTableValue() {
      return new Promise((resolve, reject) => {
        this.$emit("getTableValue", async (data) => {
          resolve(await data);
        });
      });
    },
  },
};
</script>

<style scoped>
.btnList {
  display: flex;
}
.btnConcel {
  margin-top: 20rpx;
}
</style>
