Newer
Older
xc-metering-front / src / components / drawer / conditionDrawer.vue
liyaguang on 19 Jul 2023 11 KB first commit
<!-- 条件设置 -->
<script setup lang="ts" name="ConsitionDrawer">
import { computed, ref, watch } from 'vue'
import $func from '@/plugins/preload'
import useWorkFlowStore from '@/store/modules/workFlow'

const workFlowStore = useWorkFlowStore() // store
const conditionVisible = ref(false) // 控制选择条件对话框显隐
const conditionsConfig = ref({ // 多个条件数据配置
  conditionNodes: [],
}) as any
const conditionConfig = ref({}) as any// 单个条件数据配置
const PriorityLevel = ref() // 优先级
const conditions = ref([]) as any // 条件选项(可以选择的条件)
const conditionList = ref([]) as any// 条件列表
const checkedList = ref([]) as any// 选择的人员
const conditionRoleVisible = ref(false) // 条件选择人员对话框显隐

const { setCondition, setConditionsConfig } = workFlowStore

// 关闭条件抽屉
const closeDrawer = () => {
  setCondition(false)
}
// 监听控制条件抽屉显隐字段
const visible = computed({
  get() {
    return workFlowStore.conditionDrawer
  },
  set() {
    closeDrawer()
  },
})

// 监听条件配置数据
watch(() => workFlowStore.conditionsConfigValue, (val) => {
  conditionsConfig.value = val.value
  PriorityLevel.value = val.priorityLevel
  conditionConfig.value = val.priorityLevel
    ? conditionsConfig.value.conditionNodes[val.priorityLevel - 1]
    : { nodeUserList: [], conditionList: [] }
})

// 点击添加条件,弹出条件选择框
const addCondition = async () => {
  conditionList.value = []
  conditionVisible.value = true // 选择条件对话框显隐
  const data = [ // 其他的条件选项
  //   // {
  //   //   "columnId": "1090",
  //   //   "showType": "1",
  //   //   "showName": "预计采购总费用",
  //   //   "columnName": "planProcurementTotalMoney",
  //   //   "columnType": "Double",
  //   //   "fixedDownBoxValue": ""
  //   // },
  ] as any
  conditions.value = data // 条件选择项
  if (conditionConfig.value.conditionList) {
    for (let i = 0; i < conditionConfig.value.conditionList.length; i++) {
      var { columnId } = conditionConfig.value.conditionList[i]
      // 条件id  columnId == 0 为发起人
      if (columnId === 0) {
        conditionList.value.push({ columnId: 0 })
      }
    }
  }
}

// 点击确定--抽屉添加条件条件
const sureCondition = () => {
  // 1.弹窗有,外面无+
  // 2.弹窗有,外面有不变
  for (let i = 0; i < conditionList.value.length; i++) {
    const { columnId } = conditionList.value[i] // 条件id
    if ($func.toggleClass(conditionConfig.value.conditionList, conditionList.value[i], 'columnId')) {
      continue
    }
    if (columnId === 0) { // 发起人
      conditionConfig.value.nodeUserList = [] // 发起人列表置空
      conditionConfig.value.conditionList.push({ // 条件列表增加发起人条件
        type: 1,
        columnId, // 条件id
        showName: '发起人',
      })
    }
  }
  // 3.弹窗无,外面有-
  for (let i = conditionConfig.value.conditionList.length - 1; i >= 0; i--) {
    if (!$func.toggleClass(conditionList.value, conditionConfig.value.conditionList[i], 'columnId')) {
      conditionConfig.value.conditionList.splice(i, 1)
    }
  }
  // 条件列表排序
  conditionConfig.value.conditionList.sort((a: any, b: any) => { return a.columnId - b.columnId })
  conditionVisible.value = false // 关闭选择条件对话框
}

// 抽屉点击确定--保存条件
const saveCondition = () => {
  // 关闭条件抽屉
  closeDrawer()
  const getIndex = conditionsConfig.value.conditionNodes.splice(PriorityLevel.value - 1, 1)// 截取旧下标
  conditionsConfig.value.conditionNodes.splice(conditionConfig.value.priorityLevel - 1, 0, getIndex[0])// 填充新下标
  conditionsConfig.value.conditionNodes.map((item: any, index: number) => {
    item.priorityLevel = index + 1
  })

  // 设置条件节点的文字,同时设置error字段(空节点控制提示)
  for (let i = 0; i < conditionsConfig.value.conditionNodes.length; i++) {
    conditionsConfig.value.conditionNodes[i].error = $func.conditionStr(conditionsConfig.value, i) === '请设置条件' && i !== conditionsConfig.value.conditionNodes.length - 1
  }
  // 保存条件设置
  setConditionsConfig({
    value: conditionsConfig.value,
    flag: true,
    id: workFlowStore.conditionsConfigValue.id,
  })
}
// 添加条件--人员
const addConditionRole = () => {
  conditionRoleVisible.value = true
  checkedList.value = conditionConfig.value.nodeUserList
}
// 选好角色了
const sureConditionRole = (data: any) => {
  conditionConfig.value.nodeUserList = data
  conditionRoleVisible.value = false
}

// 点击发起人
const clickfq = (conditionList: any, param: any, columnId: number | string) => {
  $func.toChecked(conditionList, param, columnId)
}
</script>

<template>
  <el-drawer v-model="visible" :append-to-body="true" title="条件设置" direction="rtl" custom-class="condition_copyer" size="550px" :before-close="saveCondition">
    <template #header="{ titleId, titleClass }">
      <h3 :id="titleId" :class="titleClass">
        条件设置
      </h3>
      <select v-model="conditionConfig.priorityLevel" class="priority_level">
        <option v-for="item in conditionsConfig.conditionNodes.length" :key="item" :value="item">
          优先级{{ item }}
        </option>
      </select>
    </template>
    <div class="demo-drawer__content">
      <div class="condition_content drawer_content">
        <p class="tip">
          当审批单同时满足以下条件时进入此流程
        </p>
        <el-button
          type="primary"
          @click="addCondition"
        >
          添加条件
        </el-button>

        <ul>
          <li v-for="(item, index) in conditionConfig.conditionList" :key="index">
            <span class="ellipsis">{{ item.type === 1 ? '发起人' : item.showName }}:</span>
            <div v-if="item.type === 1">
              <el-input v-if="conditionConfig.nodeUserList.length === 0" type="text" placeholder="请选择具体人员/角色/部门" @click="addConditionRole" />
              <p v-if="conditionConfig && conditionConfig.nodeUserList && conditionConfig.nodeUserList.length" class="selected_list">
                <span v-for="(item, index) in conditionConfig.nodeUserList" :key="index" class="people-box">
                  {{ item.name }}
                  <el-icon style="vertical-align: middle;cursor: pointer;" @click="$func.removeEle(conditionConfig.nodeUserList, item, 'targetId')">
                    <close />
                  </el-icon>
                </span>
                <a v-if="conditionConfig.nodeUserList && conditionConfig.nodeUserList.length !== 0" @click="conditionConfig.nodeUserList = []">清除</a>
              </p>
            </div>
            <a v-if="item.type === 1" @click="conditionConfig.nodeUserList = [];$func.removeEle(conditionConfig.conditionList, item, 'columnId')">删除</a>
            <a v-if="item.type === 2" @click="$func.removeEle(conditionConfig.conditionList, item, 'columnId')">删除</a>
          </li>
        </ul>

        <el-dialog v-model="conditionVisible" title="选择条件" width="480px" append-to-body custom-class="condition_list">
          <p>请选择用来区分审批流程的条件字段</p>
          <p class="check_box">
            <a
              :class="$func.toggleClass(conditionList, { columnId: 0 }, 'columnId') && 'active'"
              @click="clickfq(conditionList, { columnId: 0 }, 'columnId')"
            >发起人</a>
            <a
              v-for="(item, index) in conditions" :key="index" :class="$func.toggleClass(conditionList, item, 'columnId') && 'active'"
              @click="$func.toChecked(conditionList, item, 'columnId')"
            >{{ item.showName }}</a>
          </p>
          <template #footer>
            <el-button @click="conditionVisible = false">
              取 消
            </el-button>
            <el-button type="primary" @click="sureCondition">
              确 定
            </el-button>
          </template>
        </el-dialog>
      </div>

      <!-- 成员弹框 -->
      <select-employees-dialog
        v-model:visible="conditionRoleVisible"
        v-model:data="checkedList"
        @change="sureConditionRole"
      />
      <div class="demo-drawer__footer clear" style="margin-top: 50px;">
        <el-button type="primary" @click="saveCondition">
          确 定
        </el-button>
        <el-button @click="closeDrawer">
          取 消
        </el-button>
      </div>
    </div>
  </el-drawer>
</template>

<style lang="scss">
.condition_copyer {
  .people-box {
    font-size: 12px;
    margin-right: 10px;
    padding: 3px 6px 3px 9px;
    white-space: nowrap;
    border-radius: 6px;
    border: 1px solid rgb(220 220 220 / 100%);
  }

  .priority_level {
    position: absolute;
    top: 16px;
    right: 70px;
    width: 100px;
    height: 32px;
    background: rgb(255 255 255 / 100%);
    border-radius: 4px;
    border: 1px solid rgb(217 217 217 / 100%);
    font-size: 12px;
  }

  .condition_content {
    // padding: 20px 20px 0;

    p.tip {
      margin: 20px 0;
      width: 445px;
      text-indent: 17px;
      line-height: 45px;
      background: rgb(241 249 255 / 100%);
      border: 1px solid rgb(64 163 247 / 100%);
      color: #46a6fe;
      font-size: 14px;
    }

    ul {
      max-height: 500px;
      overflow-y: scroll;
      margin-bottom: 20px;

      li {
        & > span {
          float: left;
          margin-right: 8px;
          width: 70px;
          line-height: 32px;
          text-align: right;
        }

        & > div {
          display: inline-block;
          width: 370px;

          & > p:not(:last-child) {
            margin-bottom: 10px;
          }
        }

        &:not(:last-child) > div > p {
          margin-bottom: 20px;
        }

        & > a {
          float: right;
          margin-right: 10px;
          margin-top: 7px;
        }

        select + input {
          width: 260px;
        }

        select {
          margin-right: 10px;
          width: 100px;
        }

        p.selected_list {
          padding-left: 10px;
          border-radius: 4px;
          min-height: 32px;
          border: 1px solid rgb(217 217 217 / 100%);
          word-break: break-word;
        }

        p.check_box {
          line-height: 32px;
        }
      }
    }

    .el-button {
      margin-bottom: 20px;
    }
  }
}

.condition_list {
  .el-dialog__body {
    padding: 16px 26px;
  }

  p {
    color: #666;
    margin-bottom: 10px;

    & > .check_box {
      margin-bottom: 0;
      line-height: 36px;
    }
  }
}

.radio_box a,
.check_box a {
  font-size: 12px;
  position: relative;
  padding-left: 20px;
  margin-right: 30px;
  cursor: pointer;
  color: #333;
  white-space: pre;
}

.check_box.not a:hover {
  color: #333;
}

.check_box.not a::before,
.check_box.not a:hover::before {
  border: none;
}

.check_box.not.active {
  background: #f3f3f3;
}

.radio_box a:hover::before,
.check_box a:hover::before {
  border: 1px solid #46a6fe;
}

.radio_box a::before,
.check_box a::before {
  position: absolute;
  width: 14px;
  height: 14px;
  border: 1px solid #dcdfe6;
  border-radius: 2px;
  left: 0;
  top: 1px;
  content: "";
}

.radio_box a::before {
  border-radius: 50%;
}

.check-dot.active::after,
.radio_box a.active::after,
.check_box a.active::after {
  position: absolute;
  width: 10px;
  height: 10px;
  border-radius: 50%;
  top: 3px;
  left: 3px;
  content: "";
}

.radio_box a.active::after {
  background: #46a6fe;
}

.check_box a.active::after {
  background: url("@/assets/images/check_box.png") no-repeat center;
}
</style>