|
@@ -0,0 +1,395 @@
|
|
|
+<template>
|
|
|
+ <el-dialog
|
|
|
+ :model-value="visible"
|
|
|
+ width="45%"
|
|
|
+ @update:model-value="$emit('update:visible', $event)"
|
|
|
+ class="dialog_class"
|
|
|
+ draggable
|
|
|
+ >
|
|
|
+ <template #header="{ titleId, titleClass }">
|
|
|
+ <div class="my-header">
|
|
|
+ <h4 :id="titleId" :class="titleClass">
|
|
|
+ {{ $t("treeData.personUnitView") }}
|
|
|
+ </h4>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ <div>
|
|
|
+ <p class="description">{{ $t("treeData.createNewUnitSystem") }}</p>
|
|
|
+
|
|
|
+ <el-form
|
|
|
+ :model="formData"
|
|
|
+ label-position="left"
|
|
|
+ :label-width="labelWidth"
|
|
|
+ :rules="formRules"
|
|
|
+ ref="formRef"
|
|
|
+ >
|
|
|
+ <el-row :gutter="20" class="input-row">
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form-item :label="$t('treeData.chineseName')" prop="chineseName">
|
|
|
+ <el-input v-model="formData.chineseName" placeholder="" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="10">
|
|
|
+ <el-form-item :label="$t('treeData.englishName')" prop="englishName">
|
|
|
+ <el-input v-model="formData.englishName" placeholder="" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="4" class="lastbtn">
|
|
|
+ <el-button type="primary" @click="submitForm">{{
|
|
|
+ $t("dialog.ok")
|
|
|
+ }}</el-button>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </el-form>
|
|
|
+
|
|
|
+ <div class="table-container">
|
|
|
+ <el-table
|
|
|
+ :data="tableData"
|
|
|
+ style="width: 100%"
|
|
|
+ :border="false"
|
|
|
+ max-height="200px"
|
|
|
+ >
|
|
|
+ <el-table-column
|
|
|
+ prop="number"
|
|
|
+ :label="$t('treeData.number')"
|
|
|
+ width="60"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ prop="chineseName"
|
|
|
+ :label="$t('treeData.chineseName')"
|
|
|
+ />
|
|
|
+ <el-table-column
|
|
|
+ prop="englishName"
|
|
|
+ :label="$t('treeData.englishName')"
|
|
|
+ />
|
|
|
+ <el-table-column :label="$t('treeData.unit')">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-select v-model="row.value" placeholder="" style="width: 100%">
|
|
|
+ <el-option
|
|
|
+ v-for="unit in unitOptions"
|
|
|
+ :key="unit"
|
|
|
+ :label="unit"
|
|
|
+ :value="unit"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <el-row :gutter="20" class="footer-row">
|
|
|
+ <el-col :span="12">
|
|
|
+ <el-form
|
|
|
+ :model="{ selectedGroupId }"
|
|
|
+ label-position="left"
|
|
|
+ label-width="100px"
|
|
|
+ >
|
|
|
+ <el-form-item :label="$t('treeData.unitSystem')">
|
|
|
+ <el-select
|
|
|
+ v-model="selectedGroupId"
|
|
|
+ placeholder=""
|
|
|
+ style="width: 100%"
|
|
|
+ :key="unitGroups.length"
|
|
|
+ >
|
|
|
+ <el-option
|
|
|
+ v-for="group in unitGroups"
|
|
|
+ :key="group.sutId"
|
|
|
+ :label="group.nameEn"
|
|
|
+ :value="group.sutId"
|
|
|
+ />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </el-col>
|
|
|
+ <el-col :span="12" class="lastbtn">
|
|
|
+ <el-button @click="$emit('update:visible', false)">{{
|
|
|
+ $t("dialog.cancel")
|
|
|
+ }}</el-button>
|
|
|
+ <el-button type="primary" @click="handleConfirm">{{
|
|
|
+ $t("dialog.ok")
|
|
|
+ }}</el-button>
|
|
|
+ </el-col>
|
|
|
+ </el-row>
|
|
|
+ </template>
|
|
|
+ </el-dialog>
|
|
|
+</template>
|
|
|
+
|
|
|
+<script setup>
|
|
|
+import { ref, onMounted, watch } from "vue"
|
|
|
+import { useI18n } from "vue-i18n"
|
|
|
+import { request } from "@/utils/request"
|
|
|
+const { t, locale } = useI18n()
|
|
|
+import { ElMessage } from 'element-plus'
|
|
|
+
|
|
|
+const labelWidth = computed(() => {
|
|
|
+ return locale.value === "zh-CN" ? "80px" : "100px"
|
|
|
+})
|
|
|
+
|
|
|
+// 表单引用
|
|
|
+const formRef = ref(null)
|
|
|
+// 表单校验规则
|
|
|
+const formRules = {
|
|
|
+ chineseName: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: t("treeData.chineseNameRequired"),
|
|
|
+ trigger: "blur"
|
|
|
+ }
|
|
|
+ ],
|
|
|
+ englishName: [
|
|
|
+ {
|
|
|
+ required: true,
|
|
|
+ message: t("treeData.englishNameRequired"),
|
|
|
+ trigger: "blur"
|
|
|
+ }
|
|
|
+ ]
|
|
|
+}
|
|
|
+
|
|
|
+// 单位系统下拉框数据
|
|
|
+const fetchUnitGroups = async () => {
|
|
|
+ const params = {
|
|
|
+ transCode: 'ES0024',
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ const res = await request(params);
|
|
|
+ return res.rows || [];
|
|
|
+ } catch (err) {
|
|
|
+ console.error('Fetch unit groups error:', err);
|
|
|
+ ElMessage.error(err.returnMsg || t('error.fetchFailed'));
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+// 单位下拉框数据
|
|
|
+const updateUnit = async (row) => {
|
|
|
+ const group = unitGroups.value.find((g) => g.sutId === selectedGroupId.value);
|
|
|
+ const params = {
|
|
|
+ transCode: 'ES0022',
|
|
|
+ value: row.value,
|
|
|
+ gutId: row.number,
|
|
|
+ sutId: group.sutId
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ const res = await request(params);
|
|
|
+ console.log('Update unit responseffffffdxxxxx:', res);
|
|
|
+
|
|
|
+ return res.rows || [];
|
|
|
+ } catch (err) {
|
|
|
+ console.error('Fetch unit options error:', err);
|
|
|
+ ElMessage.error(err.returnMsg || t('error.fetchFailed'));
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// 初始化表格数据时调用接口
|
|
|
+const initializeUnits = async () => {
|
|
|
+ if (tableData.value.length === 0 || !selectedGroupId.value) return;
|
|
|
+ for (const row of tableData.value) {
|
|
|
+ if (row.value && row.number) { // 确保 unit 和 number 存在
|
|
|
+ const success = await updateUnit(row);
|
|
|
+ if (!success) {
|
|
|
+ row.unit = '';
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+
|
|
|
+const props = defineProps({
|
|
|
+ visible: {
|
|
|
+ type: Boolean,
|
|
|
+ default: false
|
|
|
+ },
|
|
|
+ systemUnitData: {
|
|
|
+ type: Array,
|
|
|
+ default: () => [],
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+const emit = defineEmits(["update:visible", "confirm"])
|
|
|
+
|
|
|
+// 下拉框数据
|
|
|
+const unitGroups = ref([])
|
|
|
+const selectedGroupId = ref(null);
|
|
|
+const selectedGroup = ref("")
|
|
|
+const unitOptions = ref([])
|
|
|
+
|
|
|
+// 表格数据
|
|
|
+const tableData = ref([])
|
|
|
+
|
|
|
+// 输入框数据
|
|
|
+const formData = ref({
|
|
|
+ chineseName: "",
|
|
|
+ englishName: ""
|
|
|
+})
|
|
|
+
|
|
|
+// 加载下拉框数据并设置默认值
|
|
|
+onMounted(async () => {
|
|
|
+ const groups = await fetchUnitGroups()
|
|
|
+ unitGroups.value = groups
|
|
|
+ if (groups.length > 0) {
|
|
|
+ selectedGroupId.value = groups[0].sutId;
|
|
|
+ }
|
|
|
+})
|
|
|
+
|
|
|
+// 监听 systemUnitData 更新表格
|
|
|
+watch(
|
|
|
+ () => props.systemUnitData,
|
|
|
+ async (newData) => {
|
|
|
+ if (newData.length > 0) {
|
|
|
+ console.log("System Unit Data updated:", newData);
|
|
|
+
|
|
|
+ tableData.value = newData.map((item) => ({
|
|
|
+ number: item.gutId || 'N/A',
|
|
|
+ chineseName: item.nameZh || '',
|
|
|
+ englishName: item.nameEn || '',
|
|
|
+ value: item.value || '',
|
|
|
+ factor: item.factor || '',
|
|
|
+ utOffset: item.utOffset || '',
|
|
|
+ unit: item.unit || '', // 默认单位
|
|
|
+ }));
|
|
|
+ await initializeUnits();
|
|
|
+ }
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+);
|
|
|
+
|
|
|
+// 根据下拉框值加载表格数据
|
|
|
+watch(
|
|
|
+ selectedGroupId,
|
|
|
+ async (newId) => {
|
|
|
+ const group = unitGroups.value.find((g) => g.sutId === newId);
|
|
|
+ if (group) {
|
|
|
+ console.log("Selected group:", group);
|
|
|
+ const units = await fetchUnits(group);
|
|
|
+ } else {
|
|
|
+ tableData.value = []
|
|
|
+ }
|
|
|
+ },
|
|
|
+ { immediate: true }
|
|
|
+)
|
|
|
+
|
|
|
+// 保存中英文名称接口
|
|
|
+const submitForm = async () => {
|
|
|
+ try {
|
|
|
+ await formRef.value.validate()
|
|
|
+ await handleSaveName()
|
|
|
+ } catch (error) {
|
|
|
+ console.log("表单校验失败", error)
|
|
|
+ return false
|
|
|
+ }
|
|
|
+}
|
|
|
+const handleSaveName = async () => {
|
|
|
+ try {
|
|
|
+ const params = {
|
|
|
+ transCode: "ES0020",
|
|
|
+ nameZh: formData.value.chineseName,
|
|
|
+ nameEn: formData.value.englishName
|
|
|
+ }
|
|
|
+ const res = await request(params)
|
|
|
+ // tableData.value = [...tableData.value, newUser] // 添加新用户到表格
|
|
|
+ formData.value = { userId: "", userName: "" } // 清空输入框
|
|
|
+ ElMessage.success(t("message.saveSuccess"))
|
|
|
+ } catch (err) {
|
|
|
+ ElMessage.error(t("message.saveFailed"))
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+const fetchUnits = async (group) => {
|
|
|
+ const params = {
|
|
|
+ transCode: 'ES0023',
|
|
|
+ gutId: group.sutId,
|
|
|
+ };
|
|
|
+ try {
|
|
|
+ const res = await request(params);
|
|
|
+ return res.rows || [];
|
|
|
+ } catch (err) {
|
|
|
+ console.error('Fetch units error:', err);
|
|
|
+ ElMessage.error(err.returnMsg || t('error.fetchFailed'));
|
|
|
+ return [];
|
|
|
+ }
|
|
|
+};
|
|
|
+
|
|
|
+// footer 确认按钮
|
|
|
+const handleConfirm = () => {
|
|
|
+ emit("confirm", {
|
|
|
+ selectedGroup: selectedGroup.value,
|
|
|
+ formData: formData.value
|
|
|
+ })
|
|
|
+ emit("update:visible", false)
|
|
|
+}
|
|
|
+</script>
|
|
|
+
|
|
|
+<style scoped>
|
|
|
+.my-header {
|
|
|
+ display: flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+
|
|
|
+.dialog_class :deep(.el-dialog__body) {
|
|
|
+ padding: 15px;
|
|
|
+}
|
|
|
+
|
|
|
+.table-container {
|
|
|
+ border: 1px solid var(--el-border-color);
|
|
|
+ padding: 10px;
|
|
|
+ border-radius: 4px;
|
|
|
+}
|
|
|
+
|
|
|
+.el-table {
|
|
|
+ margin-top: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+.lastbtn {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ gap: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.el-form-item {
|
|
|
+ margin-bottom: 5px;
|
|
|
+}
|
|
|
+
|
|
|
+/* 仅保留数据行水平线 */
|
|
|
+:deep(.el-table__row:not(:last-child) td) {
|
|
|
+ border-bottom: 1px solid var(--el-table-border-color);
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-table th, .el-table td) {
|
|
|
+ border-top: none !important;
|
|
|
+ border-right: none !important;
|
|
|
+ border-left: none !important;
|
|
|
+}
|
|
|
+
|
|
|
+:deep(.el-table__inner-wrapper::before) {
|
|
|
+ display: none; /* 移除表格底部边框 */
|
|
|
+}
|
|
|
+
|
|
|
+/* 第二行输入框和按钮样式 */
|
|
|
+.input-row {
|
|
|
+ align-items: center;
|
|
|
+ margin-left: -5px !important;
|
|
|
+}
|
|
|
+
|
|
|
+.lastbtn {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ gap: 10px;
|
|
|
+ align-items: center;
|
|
|
+}
|
|
|
+
|
|
|
+/* footer 样式 */
|
|
|
+.footer-row {
|
|
|
+ align-items: center;
|
|
|
+ margin-left: 0px !important;
|
|
|
+}
|
|
|
+
|
|
|
+.description {
|
|
|
+ margin-bottom: 10px;
|
|
|
+ font-size: 14px;
|
|
|
+ color: var(--el-text-color-primary);
|
|
|
+ text-align: left;
|
|
|
+}
|
|
|
+</style>
|