Newer
Older
smart-metering-front / src / views / measure / price / priceAdd.vue
dutingting on 17 Mar 2023 13 KB bug修复
<!-- 价格列表详情 -->
<script lang="ts" setup name="ListSourceAdd">
import { ref } from 'vue'
import type { Ref } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import type { FormInstance, FormRules } from 'element-plus'
import { useRoute } from 'vue-router'
import type { optionsType, priceForm } from './list_interface'
import VerificationDialog from '@/views/device/standardEquipment/components/standardList/verificationDialog.vue'
import { getPriceAddList, getQueryPriceInfo, getTypeSelect, getUpdatePriceInfo } from '@/api/system/price'

const loading = ref(false) // 表单加载状态
const infoId = ref('') // id
const pageType = ref('add') // 页面类型: add,edit, detail
const buttonLoading = ref(false) // 按钮加载状态
const textMap: { [key: string]: string } = {
  edit: '编辑',
  add: '新建',
  detail: '详情',
}// 字典
// 从路由中获取页面类型参数
const $route = useRoute()
if ($route.params && $route.params.type) {
  pageType.value = $route.params.type as string
  if ($route.params.id) {
    infoId.value = $route.params.id as string
  }
}
const priceStandardName = ref('')
// 默认数据
const defaultForm: priceForm = {
  priceStandardName: '', // 依据标准
  checkType: '', // 检校类型
  createTime: null, // 创建时间
  directorDiscountPermission: '', // 负责人折扣权限-字典value
  id: null, // 主键id
  isDel: '', // 删除标记
  model: '', // 型号
  operatorDiscountPermission: '', // 业务员折扣权限-字典value
  price: '', // 标准价格(元)
  priceDescription: '', // 说明
  priceItem: '', //	项目-字典value
  priceLimit: '', //	限制范围
  priceName: '', // 价格名称
  priceNo: '', // 价格编号
  priceStandard: '', // 依据标准-计量规程文件名
  priceType: '', // 价格类别-字典value
  remark: '', // 备注
  updateTime: null, // 更新时间
  categoryName: '', // 类别名称
  itemName: '', // 项目名称
}
// 获取到的详情数据
const formInline: Ref<priceForm> = ref({ ...defaultForm })
// 校验ref
const ruleFormRef = ref<FormInstance>()
// 表单验证规则
const rules = reactive<FormRules>({
  priceName: [{ required: true, message: '价格名称不能为空', trigger: ['blur', 'change'] }],
  checkType: [{ required: true, message: '校验类型不能为空', trigger: ['blur', 'change'] }],
  categoryName: [{ required: true, message: '类别不能为空', trigger: ['blur', 'change'] }],
  itemName: [{ required: true, message: '项目不能为空', trigger: ['blur', 'change'] }],
  priceStandardName: [{ required: true, message: '依据标准不能为空', trigger: ['blur', 'change'] }],
  price: [{ required: true, message: '标准价格不能为空', trigger: ['blur', 'change'] }],
  operatorDiscountPermission: [{ required: true, message: '业务员折扣权限不能为空', trigger: ['blur', 'change'] }],
  directorDiscountPermission: [{ required: true, message: '负责人折扣权限不能为空', trigger: ['blur', 'change'] }],
})
const checkTypeOptions = ref<optionsType[]>([]) // 校验类型
const operatorDiscountPermissionOptions = ref<optionsType[]>([]) // 业务员折扣权限
const directorDiscountPermissionOptions = ref<optionsType[]>([]) // 负责人折扣权限
const $router = useRouter()
const close = () => {
  $router.back()
}
// 获取detail信息
const getInfo = () => {
  loading.value = true
  getQueryPriceInfo({ id: infoId.value }).then((res) => {
    formInline.value = res.data
    loading.value = false
  })
}
// 获取下拉框数据
const getOptions = (code: string) => {
  getTypeSelect(code).then((res) => {
    if (code === 'checkType') {
      checkTypeOptions.value = res.data
    }
    else if (code === 'operatorDiscountPermission') {
      operatorDiscountPermissionOptions.value = res.data
    }
    else if (code === 'directorDiscountPermission') {
      directorDiscountPermissionOptions.value = res.data
    }
  })
}
getOptions('checkType') // 校验类型
getOptions('operatorDiscountPermission')// 业务员折扣权限
getOptions('directorDiscountPermission') // 负责人折扣权限

const printObj = ref({
  id: 'form', // 需要打印元素的id
  popTitle: '价格列表详情', // 打印配置页上方的标题
  extraHead: '<div style="display: flex;flex-direction: column;text-align: center"><h3>价格列表详情</h3></div>', // 最上方的头部文字,附加在head标签上的额外标签,使用逗号分割
  preview: false, // 是否启动预览模式,默认是false
  standard: '',
  extarCss: '',
})

// 点击提交/导出按钮
const getAddList = async (formEl: FormInstance | undefined) => {
  if (!formEl) { return }
  await formEl.validate((valid, fields) => {
    if (valid) {
      ElMessageBox.confirm(
        '确认保存吗?',
        '提示',
        {
          confirmButtonText: '确认',
          cancelButtonText: '取消',
          type: 'warning',
        },
      ).then(() => {
      // 新增提交
        if (pageType.value === 'add') { // 新建
          buttonLoading.value = true
          getPriceAddList(formInline.value).then((res) => {
            if (res.code === 200) {
              ElMessage.success('保存成功')
              close()
            }
            buttonLoading.value = false
          }).catch(_ => buttonLoading.value = false)
        }
        // 编辑提交
        else if (pageType.value === 'edit') { // 保存
          formInline.value.id = infoId.value
          buttonLoading.value = true
          delete formInline.value.isDel
          delete formInline.value.createTime
          delete formInline.value.historicalPriceList
          delete formInline.value.updateTime
          getUpdatePriceInfo(formInline.value).then((res) => {
            if (res.code === 200) {
              ElMessage.success('保存成功')
              close()
            }
            buttonLoading.value = false
          }).catch(_ => buttonLoading.value = false)
        }
      })
    }
  })
}
// 只要不是新增页面就得获取详情
if (pageType.value !== 'add') {
  getInfo()
}
// 价格依据ref
const verificationDialog = ref()
// 点击价格依据按钮
const priceStandardClick = () => {
  verificationDialog.value.initDialog()
}
interface dataType {
  id: string // 文件主键id
  fileName: string // 文件名
}
// 选择价格依据
const verificationList = (data: dataType) => {
  formInline.value.priceStandard = data.id
  priceStandardName.value = data.fileName
  formInline.value.priceStandardName = priceStandardName.value
}
</script>

<template>
  <app-container>
    <detail-page :title="`价格列表-${textMap[pageType]}`">
      <template #btns>
        <el-button v-if="pageType !== 'detail'" type="primary" @click="getAddList(ruleFormRef)">
          保存
        </el-button>
        <el-button v-if="pageType === 'detail'" v-print="printObj" type="primary">
          打印
        </el-button>
        <el-button type="info" @click="close">
          关闭
        </el-button>
      </template>
      <div id="form">
        <el-form
          ref="ruleFormRef"
          v-loading="loading"
          :model="formInline"
          label-width="auto"
          class="demo-form-inline"
          label-position="right"
          :rules="rules"
        >
          <el-row :gutter="24" class="marg">
            <el-col :span="6">
              <el-form-item label="价格名称:" prop="priceName">
                <el-input
                  v-model.trim="formInline.priceName"
                  :placeholder="pageType === 'detail' ? '' : '价格名称'"
                  :disabled="pageType === 'detail'"
                  class="full-width-input"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="检校类型:" prop="checkType">
                <el-select
                  v-model.trim="formInline.checkType"
                  clearable
                  :placeholder="pageType === 'detail' ? '' : '请选择检校类型'"
                  :disabled="pageType === 'detail'"
                  class="full-width-input"
                >
                  <el-option
                    v-for="item in checkTypeOptions"
                    :key="item.value"
                    :label="item.name"
                    :value="item.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="类别:" prop="categoryName">
                <el-input
                  v-model.trim="formInline.categoryName"
                  clearable
                  :placeholder="pageType === 'detail' ? '' : '请输入类别'"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="项目:" prop="itemName">
                <el-input
                  v-model.trim="formInline.itemName"
                  clearable
                  :placeholder="pageType === 'detail' ? '' : '请输入项目'"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="24" class="marg">
            <el-col :span="6">
              <el-form-item label="依据标准:" prop="priceStandardName">
                <el-input
                  v-model.trim="formInline.priceStandardName"
                  clearable
                  :placeholder="pageType === 'detail' ? '' : '依据标准'"
                  :disabled="pageType === 'detail'"
                >
                  <template v-if="pageType !== 'detail'" #append>
                    <el-button
                      size="small"
                      @click="priceStandardClick"
                    >
                      选择
                    </el-button>
                  </template>
                </el-input>
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="标准价格(元):" prop="price">
                <el-input
                  v-model.trim="formInline.price"
                  clearable
                  :placeholder="pageType === 'detail' ? '' : '标准价格(元)'"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="限制范围:">
                <el-input
                  v-model="formInline.priceLimit"
                  :placeholder="pageType === 'detail' ? '' : '限制范围'"
                  :disabled="pageType === 'detail'"
                />
              </el-form-item>
            </el-col>
            <el-col :span="6">
              <el-form-item label="说明:">
                <el-input v-model="formInline.priceDescription" :placeholder="pageType === 'detail' ? '' : '说明'" :disabled="pageType === 'detail'" />
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="24" class="marg">
            <el-col :span="12">
              <el-form-item label="业务员折扣权限:" prop="operatorDiscountPermission">
                <el-select
                  v-model.trim="formInline.operatorDiscountPermission"
                  clearable
                  :placeholder="pageType === 'detail' ? '' : '请选择业务员折扣权限'"
                  :disabled="pageType === 'detail'"
                  class="full-width-input"
                >
                  <el-option
                    v-for="item in operatorDiscountPermissionOptions"
                    :key="item.value"
                    :label="item.name"
                    :value="item.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="24" class="marg">
            <el-col :span="12">
              <el-form-item label="负责人折扣权限:" prop="directorDiscountPermission">
                <el-select
                  v-model.trim="formInline.directorDiscountPermission"
                  clearable
                  :placeholder="pageType === 'detail' ? '' : '请选择负责人折扣权限'"
                  :disabled="pageType === 'detail'"
                  class="full-width-input"
                >
                  <el-option
                    v-for="item in directorDiscountPermissionOptions"
                    :key="item.value"
                    :label="item.name"
                    :value="item.value"
                  />
                </el-select>
              </el-form-item>
            </el-col>
          </el-row>
          <el-row :gutter="24" class="marg">
            <el-col :span="12">
              <el-form-item label="备注:">
                <el-input v-model="formInline.remark" :placeholder="pageType === 'detail' ? '' : '备注'" :disabled="pageType === 'detail'" />
              </el-form-item>
            </el-col>
          </el-row>
        </el-form>
      </div>
    </detail-page>
  </app-container>
  <!-- 选择检定规程列表组件 -->
  <verification-dialog ref="verificationDialog" @add="verificationList" />
</template>

<style lang="scss" scoped>
// 样式
</style>