<template>
  <div class="apply-block">
    <el-row  v-if="title==='check'">
      <el-col :span="24">
        <baseTitle :title="'附件信息'"></baseTitle>
      </el-col>
      <el-form :model="attachmentParam" inline style="margin-top: 15px">
        <el-form-item label="标签" prop="tag">
          <el-select v-model="attachmentParam.tag" placeholder="请选择标签" clearable filterable style="width: 300px">
            <el-option
                v-for="item in tagsOption"
                :key="item.value"
                :label="item.label"
                :value="item.value"
            />
          </el-select>
        </el-form-item>
        <el-form-item>
          <el-button @click="handleSearch" color="#DED0B2">搜索</el-button>
          <el-button v-if="uploadState" color="#DED0B2" @click="handleUpload">上传附件</el-button>
        </el-form-item>
      </el-form>
        <fvTable style="width: 100%;min-height:162px;max-height: 162px" v-if="showAttachmentTable" height="162"  :tableConfig="tableConfig"
                 :data="otherAttachmentList" :isSettingCol="false" :pagination="false">
          <template #empty>
            <el-empty :image-size="55" description="暂无数据" style="padding: 0"/>
          </template>
        </fvTable>
    </el-row>
    <baseTitle :title="getTitleName(title)+'信息'"></baseTitle>
    <el-form :model="localFormData" ref="formRef" label-width="auto" v-if="step!=='50'">
      <el-row>
        <el-col :span="24" v-if="title==='apply'">
          <el-form-item label="项目负责人" :required="true" prop=""
                        label-width="125">
            <el-button style="margin-right: 10px" color="#DED0B2" @click="handleShowProjectChargePersonTable">
              <!--              {{ localFormData.projectChargePerson ? '更改' : '请选择' }}-->
              {{ projectChargePersonUserList.length !== 0 ? '更改' : '请选择' }}
            </el-button>
            <div v-for="item in projectChargePersonUserList" :key="item.id" style="margin-right: 5px">
              {{ item.name }}
            </div>
            <user-picker :multiple="false" ref="projectChargePersonUserPicker" title="请选择项目负责人"
                         v-model:value="projectChargePersonUserList" @ok="projectChargePersonUserPickerOk"/>
          </el-form-item>
        </el-col>
        <el-col :span="24" v-if="title==='apply'">
          <el-form-item label="项目成员"  :required="true" prop=""
                        label-width="125">
            <el-button color="#DED0B2" style="margin-right: 10px" @click="handleShowProjectPersonTable">
              <!--              {{ localFormData.projectPersonIds ? '更改' : '请选择' }}-->
              {{ projectPersonUserList.length !== 0 ? '更改' :getProjectPerson(projectPersonUserList)?'更改': '请选择' }}
            </el-button>
            <div v-for="item in getProjectPerson(projectPersonUserList)" :key="item.id" style="margin-right: 5px">
              {{ item.name }}
            </div>
            <user-picker :multiple="true" ref="projectPersonUserPicker" title="请选择项目成员"
                         v-model:value="projectPersonUserList" @ok="projectPersonUserPickerOk"/>
          </el-form-item>
        </el-col>
        <el-col :span="24">
          <el-form-item label="前置流程" :required="preProcessRequired"  prop="preProcess" label-width="125">
            <el-button color="#DED0B2" @click="handleShowPreTable" style="margin-right: 10px">
              {{ localFormData.preProcess&&localFormData.preProcess.length>0 ? '更改' :sessionParams.preProcess&&sessionParams.preProcess.length>0 ? '更改' : '请选择' }}
            </el-button>
            <div v-for="item in getRequestName(localFormData.preProcess)" :key="item.requestId">
              <a :href="item.baseUrl" target="_blank"
                 style="color: #2a99ff;margin-right: 10px;cursor: pointer">{{item.requestName}}
                </a>
            </div>
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
<!--    v-if="showAttachment"-->
    <AttachmentUpload  ref="attachment" :label="getTitleName(title)+'附件'" :showTable="showTable"
                      v-model:otherFileList="otherFileList" :tag="getTitleName(props.title)"
                      @getAttachment="getAttachment" v-model:singleList="singleList" :showSingleTable="showSingleTable"
                      @getOtherFile="getOtherFile" :showFileList="true" :formData="localFormData"
                      :preview="mode == 'resubmit'"/>
    <div>
      <div class="approval-record">
        <div class="approval-title">
          <baseTitle title="审批记录" v-if="mode === 'resubmit'"></baseTitle>
          <div v-else></div>
          <div class="diagram">
            <div class="base-title">流程图</div>
            <el-switch
                v-model="changeDiagram"
                style="--el-switch-on-color:#BEA266 ; --el-switch-off-color:#cecdcd"
            />
          </div>
        </div>
        <div class="process">
          <operation-render v-if="mode === 'resubmit'&&!changeDiagram" :operation-list="data.operationList"
                            :state="data.state"/>
          <process-diagram-viewer mode="view" :idName="title" v-if="processDiagramViewer&&changeDiagram"/>
        </div>
      </div>
    </div>
    <div class="oper-page-btn">
      <el-button color="#DED0B2" v-if="mode === 'submit'" @click="handleSubmit">提交</el-button>
      <el-button color="#DED0B2" v-else-if="mode === 'resubmit'" @click="handleSubmit">重新提交</el-button>
      <el-button @click="handleBack">返回</el-button>
    </div>
    <el-dialog v-if="showPreTable" title="前置流程" v-model="showPreTable" width="80%">
      <el-form :model="preProcessForm" inline @submit.prevent="searchPreProcess">
        <el-form-item label="请求名称">
          <el-input v-model="preProcessForm.requestName" placeholder="请输入请求名称" clearable>
          </el-input>
        </el-form-item>
        <el-form-item>
          <el-button color="#DED0B2" @click="searchPreProcess">搜索</el-button>
          <el-button @click="handleReset">重置</el-button>
        </el-form-item>
      </el-form>
      <el-table :data="preProcessList"  v-loading="loading"
                @select="handleSelect" @select-all="handleSelect" row-key="requestId" ref="preProcessTable">
        <el-table-column type="selection" width="55" :reserve-selection="true"/>
        <el-table-column prop="requestId" label="请求id"></el-table-column>
        <el-table-column prop="requestName" label="请求名称"></el-table-column>
        <el-table-column prop="lastOperatorName" label="最后操作人名称"></el-table-column>
        <el-table-column prop="lastOperateTime" label="最后操作时间"></el-table-column>
        <el-table-column prop="currentNodeName" label="当前节点"></el-table-column>
        <el-table-column prop="creatorName" label="创建人"></el-table-column>
        <el-table-column prop="createTime" label="创建时间"></el-table-column>
        <el-table-column label="操作" align="center">
          <template #default="scope">
            <!--              <el-button type="primary" @click="choosePreProcess(scope.row)" link>选择</el-button>-->
            <a :href="scope.row.baseUrl" target="_blank" style="color: #2a99ff;margin-left: 10px">查看流程</a>
          </template>
        </el-table-column>
      </el-table>
      <paging :current-page="pageInfo.pageNum" :page-size="pageInfo.pageSize" :page-sizes="[10, 20, 30, 40,50]"
              :total="total" @changeSize="handleSizeChange" @goPage="handleCurrentChange"/>
      <div class="oper">
        <el-button color="#DED0B2" @click="choosePreProcess">确定</el-button>
        <el-button @click="handleCancel">取消</el-button>
      </div>
    </el-dialog>
  </div>
</template>

<script setup lang="jsx">
import OperationRender from '@/views/workflow/common/OperationRender.vue'
import ProcessDiagramViewer from '@/views/workflow/common/ProcessDiagramViewer.vue';
import {ElNotification} from "element-plus";
import {getTags} from "@/api/project-manage";
import {
  getApplyProcess,
  getPreProcess,
  getProjectCheckProcess,
  getProjectConclusionProcess,
  projectApply,
  projectCheck,
  projectConclusion,
  resubmitApply,
  resubmitCheck,
  resubmitConclusion
} from "@/api/project-manage";
import {useProcessStore} from '@/stores/processStore.js';
import {useTagsView} from '@/stores/tagsview.js'
import Paging from "@/components/pagination/index.vue";
import UserPicker from "@/views/workflow/process/common/UserPicker.vue";

import {searchImplementationFileList} from "@/api/project-manage/attachment";
const router = useRouter()
const route = useRoute()
const changeDiagram = ref(false)
const formRef = ref()
const showSingleTable = ref(false)
const projectChargePersonUserList = ref([])
const projectChargePersonUserPicker = ref()
const projectPersonUserList = ref([])
const projectPersonUserPicker = ref()
const singleList = ref([])
const tagsOption = ref([])
const uploadState = ref(false)
const showAttachmentTable = ref(true)
const otherAttachmentList = ref([])
const attachmentParam = reactive({
  tag: ''
})
const tableConfig = reactive({
  columns: [
    {
      prop: 'index',
      type: 'index',
      label: '序号',
      align: 'center',
      width: '80',
    },
    {
      prop: 'originalFileName',
      label: '文件名',
      align: 'center',
    },
    {
      prop: 'tag',
      label: '标签',
      align: 'center'
    },
    {
      prop: 'size',
      label: '文件大小',
      align: 'center',
      currentRender: ({row, index}) => (parseInt(row.size / 1024) + 'KB')
    },
    {
      prop: 'oper',
      label: '操作',
      align: 'center',
      showOverflowTooltip: false,
      currentRender: ({row, index}) => {
        return (
            <div>
              <el-button type="primary" link onClick={() => handleDownload(row)}>下载</el-button>
            </div>
        )
      }
    }
  ]
})
const emit = defineEmits(["getAttachment", "getOtherFile"])
const props = defineProps({
  title: {
    type: String,
    default: 'apply'
  },
  showTable: {
    type: Boolean,
    default: false
  },
  mode: {
    type: String,
    default: "view"
  },
  data: {
    type: Object,
    default: {}
  },
  formData: {
    type: Object,
    default: {}
  },
  step: {
    type: String,
    default: "20"
  }
})
const preProcessList = ref([])
//暂存数据
const currentList = ref([])
const preProcessRequired = ref(false)
const total = ref(0)
const preProcessForm = reactive({
  requestName: ''
})
const pageInfo = reactive({
  pageNum: 1,
  pageSize: 10,
})
// const rules = reactive({
//   preProcess: [{required: true, message: '请选择前置流程', trigger: 'blur'}],
//   projectChargePerson: [{required: true, message: '请选择项目负责人', trigger: 'blur'}],
//   projectPerson: [{required: true, message: '请选择项目成员', trigger: 'blur'}],
// })
const tagsViewStore = useTagsView()
const processStore = useProcessStore()
const localProjectPerson = ref([])
const otherFileList = ref([])
const localFormData = ref({
  projectPersonIds: [],
  projectChargePerson: null,
  preProcess: [
    // {
    //   requestId: null,
    //   requestName: '',
    //   baseUrl: ''
    // }
  ]
})
const attachment = ref()
const deploymentData = ref({})
const showPreTable = ref(false)
const showTable = ref(true)
const loading = ref(false)
const processDiagramViewer = ref(false)
const name = ref(router.currentRoute.value.name)
const deploymentId = ref()
const selectRows = ref([])
const projectId = ref(route.query.projectId)
const sessionParams=ref({})

if(localStorage.getItem('preProcess')){
  let param=JSON.parse(localStorage.getItem('preProcess'))
  localFormData.value.preProcess=param
  sessionParams.value.preProcess=param
  localStorage.setItem('preProcess', JSON.stringify(param))
}
if(localStorage.getItem('singleFile')){
  let param=JSON.parse(localStorage.getItem('singleFile'))
  localFormData.value.singleFile=param
  singleList.value=[param]
  localStorage.setItem('singleFile', JSON.stringify(param))
  showSingleTable.value=false
    nextTick(()=>{
      showSingleTable.value=true
    })
}
if(localStorage.getItem('otherFileList')){
  let param=JSON.parse(localStorage.getItem('otherFileList'))
  localFormData.value.otherFileList=param
  otherFileList.value=param
  localStorage.setItem('otherFileList', JSON.stringify(param))
      showTable.value=false
    nextTick(()=>{
      showTable.value=true
    })
}

if(localStorage.getItem('projectChargePersonUserList')){
  let param=JSON.parse(localStorage.getItem('projectChargePersonUserList'))
  projectChargePersonUserList.value=param
  localStorage.setItem('projectChargePersonUserList', JSON.stringify(param))
}
if(localStorage.getItem('projectPersonUserList')){
  let param=JSON.parse(localStorage.getItem('projectPersonUserList'))
  projectPersonUserList.value= param
  localProjectPerson.value=param
  localStorage.setItem('projectPersonUserList', JSON.stringify(param))
}
const getProjectPerson=(list)=>{
  if(!list||list&&list.length===0){
    if(localStorage.getItem('projectPersonUserList')){
      let param=JSON.parse(localStorage.getItem('projectPersonUserList'))
      projectPersonUserList.value=param
      return projectPersonUserList.value
    }
  }else {
    return list
  }
}
const getRequestName=(list)=>{
  if(!list||(list&&list.length===0)){
    if(sessionParams.value.preProcess){
      return sessionParams.value.preProcess
    }
  }else {
    return list
  }
}
const getTagsOption = () => {
  if (!route.query.projectId) return
  getTags(route.query.projectId).then(res => {
    if (res.code === 1000) {
      tagsOption.value = res.data
    }else{
      ElNotification({
        title: '提示',
        message: res.msg,
        type: 'error'
      })
    }
  })
}
const handleSearch = () => {
  let params = {
    targetId: route.query.projectId,
    targetState: "40"
  }
  if (attachmentParam.tag) {
    tagsOption.value.forEach(item => {
      if (item.value === attachmentParam.tag) {
        attachmentParam.tag = item.label
      }
    })
    params.tag = attachmentParam.tag
  }
  searchImplementationFileList(params).then(res => {
    showAttachmentTable.value = false
    if (res.code === 1000) {
      otherAttachmentList.value = res.data.fileList
      uploadState.value = res.data.upload
      nextTick(() => {
        showAttachmentTable.value = true
      })
    }else{
      ElNotification({
        title: '提示',
        message: res.msg,
        type: 'error'
      })
    }
  })
}
if(props.title&&props.title==='check'){
  handleSearch()
  getTagsOption()
}
const handleUpload = () => {
  router.push({
    name: 'Implementation/upload',
    query: {
      id:  route.query.requirementId,
      state: route.query.state,
      projectId:route.query.projectId,
      step: '40'
    }
  })
}
const getProjectChargePersonUser = () => {
  if (projectChargePersonUserList.value.length !== 0) {
    return projectChargePersonUserList.value.map(item => item.name).join()
  }
}
const handleSelect = async (selection) => {
  selectRows.value = selection
}
const handleCancel = () => {
  showPreTable.value = false
}
const searchPreProcess = () => {
  getPreProcessList()

}
const handleReset = () => {
  preProcessForm.requestName = ''
  getPreProcessList()
}
const handleShowPreTable = () => {
  showPreTable.value = true
  getPreProcessList()
}
const handleShowProjectChargePersonTable = () => {
  projectChargePersonUserPicker.value.showUserPicker()
}
const projectChargePersonUserPickerOk = (userList) => {
  projectChargePersonUserList.value = userList
  localStorage.setItem('projectChargePersonUserList', JSON.stringify(projectChargePersonUserList.value))
}
const handleShowProjectPersonTable = () => {
  projectPersonUserPicker.value.showUserPicker()
}

const projectPersonUserPickerOk = (userList) => {
  projectPersonUserList.value = userList
  localStorage.setItem('projectPersonUserList', JSON.stringify(userList))
  // let userIds = []
  // for (const user of userList) {
  //   userIds.push(user.id)
  // }
}
const getPreProcessList = () => {
  loading.value = true
  getPreProcess().then(res => {
    loading.value = false
    let searchArray = []
    let regexPattern = ("%" + preProcessForm.requestName + "%").replace(/%/g, '.*').replace(/_/g, '.');
    let regex = new RegExp('^' + regexPattern + '$');
    res.data.filter((item) => {
      if (regex.test(item.requestName)) {
        searchArray.push(item)
      }
    })
    // res.data.forEach((item) => {
    //   localFormData.value.preProcess.forEach((item1) => {
    //     if (item.requestId == item1.requestId) {
    //       preProcessTable.value.toggleRowSelection(item)
    //     }
    //   })
    // })
    total.value = searchArray.length
    currentList.value = searchArray
    preProcessList.value = currentList.value.slice(0, 10)
  })
}
const choosePreProcess = () => {
  let preProcessObj = {}
  let preProcessArray = []
  selectRows.value.forEach((item) => {
    preProcessObj = {
      requestId: item.requestId,
      requestName: item.requestName,
      baseUrl: item.baseUrl
    }
    preProcessArray.push(preProcessObj)
  })
  localFormData.value.preProcess = preProcessArray
  showPreTable.value = false
  localStorage.setItem('preProcess', JSON.stringify(preProcessArray))
}

//切换每页显示条数
const handleSizeChange = (val) => {
  pageInfo.pageSize = val;
  preProcessList.value = currentList.value.slice((pageInfo.pageNum - 1) * val, pageInfo.pageNum * val)
};

//点击页码进行分页功能
const handleCurrentChange = (val) => {
  pageInfo.pageNum = val;
  preProcessList.value = currentList.value.slice((val - 1) * pageInfo.pageSize, val * pageInfo.pageSize)
};
const getTitleName = (type) => {
  switch (type) {
    case 'apply':
      return '项目立项'
    case 'check':
      return '项目验收'
    case 'filing':
      return '项目归档'
  }
}
const handleBack = () => {
  history.back()
}
const compositeParam = (item) => {
  return {
    fileId: item.id,
    size: item.size,
    originalFileName: item.originalFilename,
    fileType: item.fileType,
    url: item.url,
    newFile: true,
    tag: getTitleName(props.title)
  }
}
const getAttachment = (val) => {
  // console.log('上传文件getAttachment', val)
  showSingleTable.value = false
  localFormData.value.singleFile = compositeParam(val)
  singleList.value.push(compositeParam(val))
  nextTick(() => {
    showSingleTable.value = true
    if (attachment.value.singleFile == null) {
      attachment.value.validate()
      ElNotification({
        title: '提示',
        message: '请上传附件',
        type: 'error'
      })
      return;
    } else {
      attachment.value.clearValidate()
    }
  })

  localStorage.setItem('singleFile', JSON.stringify(compositeParam(val)))
}
watch(() => singleList.value, (newVal) => {
  showSingleTable.value = newVal.length !== 0;
}, {deep: true})
const getOtherFile = (val) => {
  // console.log('上传文件getOtherFile', val)
  showTable.value = false
  let fileObj = compositeParam(val)
  otherFileList.value.push(fileObj)
  nextTick(() => {
    showTable.value = true
  })

  // localFormData.value.otherFileList = otherFileList.value
  localStorage.setItem('otherFileList', JSON.stringify(otherFileList.value))
}
const getFileParam = (item) => {
  return {
    fileId: item.fileId,
    tag: item.tag
  }
}
const handleSubmit = async () => {
  if (deploymentData.value.deploymentName === '重大项目立项' || deploymentData.value.deploymentName === '重大项目验收') {
    if (localFormData.value.preProcess == undefined) {
      if(JSON.parse(localStorage.getItem('preProcess'))?.length>0){

      }else {
        ElNotification({
          title: '提示',
          message: '请选择前置流程!',
          type: 'error'
        })
        return;
      }

    }
  }

  let files = []
  if (props.mode === 'resubmit') {
    attachment.value.allFileList.forEach(item => {
      files.push(getFileParam(item))
    })
  } else {
    otherFileList.value.forEach(item => {
      files.push(getFileParam(item))
    })
  }
  if (attachment.value.singleFile == null) {
    attachment.value.validate()
    ElNotification({
      title: '提示',
      message: '请上传附件',
      type: 'error'
    })
    return;
  } else {
    attachment.value.clearValidate()
  }
  let projectPersonIds = []
  for (const item of projectPersonUserList.value) {
    projectPersonIds.push(parseInt(item.id))
  }
  let params = {
    deploymentId: deploymentId.value,
    requirementId: route.query.id,
    fileList: files,
    singleFile: attachment.value.singleFile,
    projectId: projectId.value,
    preProcess: JSON.stringify(localFormData.value.preProcess)
  }
  if(sessionParams.value.preProcess&&!localFormData.value.preProcess){
    params.preProcess=JSON.stringify(sessionParams.value.preProcess)
  }
  // console.log(params.preProcess)
  let res
  if (props.step === '20') {
    if (projectChargePersonUserList.value && projectChargePersonUserList.value.length === 0) {
      ElNotification({
        title: '提示',
        message: '请选择项目负责人!',
        type: 'error'
      })
      return;
    }
    if (projectPersonUserList.value && projectPersonUserList.value.length === 0) {
      ElNotification({
        title: '提示',
        message: '请选择项目成员!',
        type: 'error'
      })
      return;
    }
    params.projectChargePerson = parseInt(projectChargePersonUserList.value[0].id)
    params.projectPersonIds = projectPersonIds
    if (props.mode === 'resubmit') {
      res = await resubmitApply(params)
    } else {
      res = await projectApply(params)
    }
  } else if (props.step === '40') {
    if (props.mode === 'resubmit') {
      res = await resubmitCheck(params)
    } else {
      res = await projectCheck(params)
    }
  } else if (props.step === '50') {
    if (props.mode === 'resubmit') {
      res = await resubmitConclusion(params)
    } else {
      res = await projectConclusion(params)
    }
  }
  ElNotification({
    title: '提示',
    message: res.msg,
    type: res.code === 1000 ? 'success' : 'error'
  })
  if (res.code === 1000) {
    tagsViewStore.delVisitedViews(router.currentRoute.value.path)
    if (props.step === '20') {
      await router.push({
        name: 'Initiation'
      })
    } else if (props.step === '40') {
      await router.push({
        name: 'Implementation'
      })
    } else if (props.step === '50') {
      await router.push({
        name: 'Filing'
      })
    }
  }
}
const init = async () => {
  let id = projectId.value
  if (!id) return;
  processDiagramViewer.value = false
  let res
  if (props.step === '20') {
    res = await getApplyProcess(id)
  } else if (props.step === '40') {
    res = await getProjectCheckProcess(id)
  } else if (props.step === '50') {
    res = await getProjectConclusionProcess(id)
  }
  if (res.code === 1000) {
    let data = res.data
    deploymentId.value = data.deploymentId
    deploymentData.value = data
    preProcessRequired.value = data.deploymentName === '重大项目立项' || data.deploymentName === '重大项目验收';
    processStore.setDesign(data)
    processStore.runningList.value = data.runningList;
    processStore.endList.value = data.endList;
    processStore.noTakeList.value = data.noTakeList;
    processStore.refuseList.value = data.refuseList;
    processStore.passList.value = data.passList;
    nextTick(() => {
      processDiagramViewer.value = true
    })
  } else {
    ElNotification({
      title: '提示',
      message: res.msg,
      type: 'error'
    })
  }
}

watchEffect(() => {
  if (props.formData.projectChargePerson == null) {
    //   projectChargePersonUserList.value = []
  } else {
    projectChargePersonUserList.value = [props.formData.projectChargePerson]
  }
  // console.log('props.formData.projectPersonList',props.formData.projectPersonList)
  projectPersonUserList.value = props.formData.projectPersonList ? props.formData.projectPersonList : []
  let flag = Object.keys(props.formData).length && (localFormData.value = props.formData)
  if (props.formData.projectChargePerson != null) {
    localFormData.value.projectChargePerson = props.formData.projectChargePerson.id
  }
  // if(props.formData.fileList&&props.formData.fileList.length>0){
  //  otherFileList.value=props.formData.fileList
  // }
  // localFormData.value.projectPersonIds = []
  // if (projectPersonUserList.value){
  //   projectPersonUserList.value.forEach(item => {
  //     localFormData.value.projectPersonIds.push(item.id)
  //   })
  // }
  // console.log('projectPersonUserList.value',projectPersonUserList.value)
  return flag
})
onMounted(async () => {
  await init()
})
</script>

<style scoped>
.oper {
  margin-top: 20px;
  display: flex;
  justify-content: flex-end;
}
</style>
