<template>
  <formula
    v-bind="$attrs"
    :fields="_fields"
    :formulas="formulas"
    data-type="boolean"
    v-on="$listeners"
  />
</template>

<script>
import formula from '@/form-designer/sd-formula.vue'
import customFormulas from '@/form-designer/custom-formulas.js'
import extensionUtil from '@/common/services/extension-util'
import components from './_import-components/sd-formula-exps-import'
export const getCustomFormulas = () => {
  const ctx = extensionUtil.parse(
    require.context('../../src_custom/_application-manage/formulas', false, /\.xxx$/, 'lazy'),
    require.context('../../src_product', true, /_application-manage\/formulas\/.*.js$/, 'lazy'),
    require.context('../../src_custom/_application-manage/formulas', true, /\.js$/, 'lazy')
  )
  if (ctx.length === 0) {
    return new Promise((resolve) => {
      resolve([])
    })
  }

  return customFormulas(ctx)
}
export default {
  name: 'SdFormulaExps',
  metaInfo: {
    title: '',
  },
  components: { ...components, formula },
  props: {
    fields: {
      type: Array,
      default: () => [],
    },
  },
  data() {
    return {
      formulas: [
        {
          data: 'AND',
          label: '所有条件为真',
          dataType: 'boolean',
          params: [{ data: 'formalParameter', label: '逻辑值', dataType: 'boolean', spread: true }],
          desc: {
            concept:
              '“AND”函数，判断多个条件同时满足时返回“真”，输入、输出均为逻辑值（“真”，“假”）',
            use: '所有条件为真（相等（），包含（），逻辑值，）',
            exam:
              '所有条件为真（相等（单选框，选项1），包含（复选框，选项1）），当【单选框】选中”选项1“，【复选框】选择”选项1“时，返回“真”。可用于设置展示符合条件的数据',
          },
        },
        {
          data: 'OR',
          label: '任一条件为真',
          dataType: 'boolean',
          params: [{ data: 'formalParameter', label: '逻辑值', dataType: 'boolean', spread: true }],
          desc: {
            concept: '“OR”函数, 判断多个条件中有任一满足时即返回“真“，输入、输出均为逻辑值',
            use: '任一条件为真（相等（），相等（），逻辑值，）',
            exam:
              '任一条件为真（相等（单选框，选项1），相等（单选框，选项4）），当【单选框】选中”选项1“或”选项4“时，均返回“真”。可用于设置展示符合条件的数据',
          },
        },
        {
          data: 'EXACT',
          label: '字符相等',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '字符字段', dataType: 'stringField' },
            { data: 'formalParameter', label: '常量', dataType: 'string' },
          ],
          desc: {
            concept: '比较两个字符是否相等，字符可以是文本/单选/下拉字段',
            use: '字符相等（单选框，常量），双击输入框可添加常量',
            exam:
              '字符相等（是否上会，“是”），当【是否上会】选中”是“时，返回“真”。可用于设置展示符合条件的数据',
          },
        },
        {
          data: 'NOTEXACT',
          label: '字符不相等',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '字符字段', dataType: 'stringField' },
            { data: 'formalParameter', label: '常量', dataType: 'string' },
          ],
          desc: {
            concept: '比较两个字符是否不相等，字符可以是文本/单选/下拉字段',
            use: '字符相等（单选框，常量），双击输入框可添加常量',
            exam:
              '字符相等（是否上会，“是”），当【是否上会】选中”否“时，返回“真”。可用于设置展示符合条件的数据',
          },
        },
        {
          data: 'IN',
          label: '字符包含于多值',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '字符字段', dataType: 'stringField' },
            { data: 'formalParameter', label: '常量', dataType: 'string[]' },
          ],
          desc: {
            concept: '比较字符是否包含在多个常量中',
            use: '字符包含（字符字段，常量1、常量2），双击输入框可添加多个常量',
            exam: '字符包含（计划名称，太极，慧点），展示计划名称包含在太极和慧点内',
          },
        },
        {
          data: 'NUMEXACT',
          label: '数值相等',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '数值字段', dataType: 'numberField' },
            { data: 'formalParameter', label: '常量', dataType: 'number' },
          ],
          desc: {
            concept: '比较两个数值是否相等',
            use: '数值相等（数值框，常量）',
            exam: '数值相等（数值一，常量），展示数值一等于常量的数据',
          },
        },
        {
          data: 'NOTNUMEXACT',
          label: '数值不相等',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '数值字段', dataType: 'numberField' },
            { data: 'formalParameter', label: '常量', dataType: 'number' },
          ],
          desc: {
            concept: '比较两个数值是否不相等',
            use: '数值相等（数值框，常量）',
            exam: '数值相等（数值一，常量），展示数值一不等于常量的数据',
          },
        },
        {
          data: 'LT',
          label: '数值小于',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '数值字段', dataType: 'numberField' },
            { data: 'formalParameter', label: '常量', dataType: 'number' },
          ],
          desc: {
            concept: '比较数值一是否小于常量',
            use: '数值小于（数值框，常量）',
            exam: '数值小于（数值一，50），展示数值一小于常量的数据',
          },
        },
        {
          data: 'LE',
          label: '数值小于等于',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '数值字段', dataType: 'numberField' },
            { data: 'formalParameter', label: '常量', dataType: 'number' },
          ],
          desc: {
            concept: '比较数值一是否小于等于常量',
            use: '数值小于等于（数值框，常量）',
            exam: '数值小于等于（数值一，50），展示数值一小于等于常量的数据',
          },
        },
        {
          data: 'GT',
          label: '数值大于',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '数值字段', dataType: 'numberField' },
            { data: 'formalParameter', label: '常量', dataType: 'number' },
          ],
          desc: {
            concept: '比较数值一是否大于常量',
            use: '数值大于（数值框，常量）',
            exam: '数值大于（数值一，50），展示数值一大于常量的数据',
          },
        },
        {
          data: 'GE',
          label: '数值大于等于',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '数值字段', dataType: 'numberField' },
            { data: 'formalParameter', label: '常量', dataType: 'number' },
          ],
          desc: {
            concept: '比较数值一是否大于等于常量',
            use: '数值大于等于（数值框，常量）',
            exam: '数值大于等于（数值一，50），展示数值一大于等于常量的数据',
          },
        },
        {
          data: 'DATELT',
          label: '日期早于',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '日期字段', dataType: 'dateField' },
            { data: 'formalParameter', label: '常量', dataType: 'date' },
          ],
          desc: {
            concept: '比较日期是否早于常量',
            use: '日期早于（日期字段，常量）',
            exam: '日期早于（创建日期，2023-4-11），展示日期早于2023-4-11数据',
          },
        },
        {
          data: 'DATEGT',
          label: '日期晚于',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '日期字段', dataType: 'dateField' },
            { data: 'formalParameter', label: '常量', dataType: 'date' },
          ],
          desc: {
            concept: '比较日期是否晚于常量',
            use: '日期晚于（日期字段，常量）',
            exam: '日期晚于（创建日期，2023-4-11），展示日期晚于2023-4-11数据',
          },
        },
        {
          data: 'LIKE',
          label: '字符包含',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '字符字段', dataType: 'stringField' },
            { data: 'formalParameter', label: '常量', dataType: 'string' },
          ],
          desc: {
            concept: '比较字符是否包含常量',
            use: '字符包含（字符字段，常量），双击输入框可添加常量',
            exam: '字符包含（计划名称，太极），展示计划名称包含字符太极的数据',
          },
        },
        {
          data: 'UNLIKE',
          label: '字符不包含',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '字符字段', dataType: 'stringField' },
            { data: 'formalParameter', label: '常量', dataType: 'string' },
          ],
          desc: {
            concept: '比较字符是否包含常量',
            use: '字符不包含（字符字段，常量），双击输入框可添加常量',
            exam: '字符不包含（计划名称，太极），展示计划名称不包含字符太极的数据',
          },
        },
        {
          data: 'DEPEXACT',
          label: '部门相等',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '部门字段', dataType: 'groupField' },
            { data: 'formalParameter', label: '常量', dataType: 'group[]' },
          ],
          desc: {
            concept: '比较选择的部门字段是否等于常量',
            use: '部门相等（部门字段，常量）',
            exam: '部门相等（起草部门，科创部），展示起草部门为科创部的数据',
          },
        },
        {
          data: 'USEREXACT',
          label: '人员相等',
          dataType: 'boolean',
          params: [
            { data: 'formalParameter', label: '人员字段', dataType: 'userField' },
            { data: 'formalParameter', label: '常量', dataType: 'user[]' },
          ],
          desc: {
            concept: '比较选择的人员字段是否等于常量',
            use: '人员相等（人员字段，常量）',
            exam: '人员相等（起草人，张三），展示起草人为张三的数据',
          },
        },
      ],
    }
  },
  computed: {
    _fields() {
      const words = [
        'ID',
        'INST_ID',
        'CREATOR_ID',
        'CREATOR_ACCOUNT',
        'CREATOR_NAME',
        'CREATE_DEPT_ID',
        'CREATE_DEPT_CODE',
        'CREATE_DEPT_NAME',
        'MODIFY_EMP_ID',
        'MODIFY_EMP_ACCOUNT',
        'MODIFY_EMP_NAME',
        'CREATION_TIME',
        'LAST_MODIFIED_TIME',
        'DELETED',
        'BELONGED_ORG_ID',
        'FLOW_STATUS',
        'FLOW_STEP_NAME',
        'APPROVEOPINION',
        'BUSINESSTYPEID',
        'BUSINESSTYPENAME',
        'businessTypeName',
        'MAIN_ID',
        'CURRENTNUMBER',
      ]
      return JSON.parse(JSON.stringify(this.fields))
        .map((item) => {
          if (!item.name.startsWith('sdCustomField')) {
            // 如果不是自定义变量的，即表单字段加上field后缀,
            let dataType = item.dataType
            if (item?.attr?.selectionType) {
              dataType = item?.attr?.selectionType?.toLowerCase()
            }
            if (dataType === 'title' || dataType === 'selectlist' || dataType === 'selectTree') {
              dataType = 'string'
            }
            if (words.includes(item.name)) {
              item.caption = item.caption + '(系统字段)'
            }
            item.dataType = dataType + 'Field'
          }
          return item
        })
        .concat([
          {
            name: '%CURRENTUSER%',
            caption: '当前用户(系统)',
            dataType: 'user[]',
          },
          {
            name: '%currentTime%',
            caption: '当前时间(系统)',
            dataType: 'date',
          },
          {
            name: 'CREATOR_ACCOUNT',
            caption: '创建人(系统)',
            dataType: 'userField',
          },
          {
            name: 'id',
            caption: '数据ID(系统)',
            dataType: 'stringField',
          },
        ])
    },
  },
  created() {
    return getCustomFormulas().then((xmformulas) => {
      this.formulas = this.formulas.concat(xmformulas)
    })
  },
  methods: {},
}
</script>

<style module lang="scss">
@use '@/common/design' as *;
</style>
