Ver Fonte

现货期货和新闻代码生成

wukai há 1 mês atrás
pai
commit
df519ed1db

+ 44 - 0
src/api/lean/news.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询原料行情列表
+export function listNews(query) {
+    return request({
+        url: '/lean/news/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询原料行情详细
+export function getNews(newsId) {
+    return request({
+        url: '/lean/news/' + newsId,
+        method: 'get'
+    })
+}
+
+// 新增原料行情
+export function addNews(data) {
+    return request({
+        url: '/lean/news',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改原料行情
+export function updateNews(data) {
+    return request({
+        url: '/lean/news',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除原料行情
+export function delNews(newsId) {
+    return request({
+        url: '/lean/news/' + newsId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/lean/qh.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询期货价格列表
+export function listQh(query) {
+    return request({
+        url: '/lean/qh/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询期货价格详细
+export function getQh(qhId) {
+    return request({
+        url: '/lean/qh/' + qhId,
+        method: 'get'
+    })
+}
+
+// 新增期货价格
+export function addQh(data) {
+    return request({
+        url: '/lean/qh',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改期货价格
+export function updateQh(data) {
+    return request({
+        url: '/lean/qh',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除期货价格
+export function delQh(qhId) {
+    return request({
+        url: '/lean/qh/' + qhId,
+        method: 'delete'
+    })
+}

+ 44 - 0
src/api/lean/xh.js

@@ -0,0 +1,44 @@
+import request from '@/utils/request'
+
+// 查询现货价格列表
+export function listXh(query) {
+    return request({
+        url: '/lean/xh/list',
+        method: 'get',
+        params: query
+    })
+}
+
+// 查询现货价格详细
+export function getXh(xhId) {
+    return request({
+        url: '/lean/xh/' + xhId,
+        method: 'get'
+    })
+}
+
+// 新增现货价格
+export function addXh(data) {
+    return request({
+        url: '/lean/xh',
+        method: 'post',
+        data: data
+    })
+}
+
+// 修改现货价格
+export function updateXh(data) {
+    return request({
+        url: '/lean/xh',
+        method: 'put',
+        data: data
+    })
+}
+
+// 删除现货价格
+export function delXh(xhId) {
+    return request({
+        url: '/lean/xh/' + xhId,
+        method: 'delete'
+    })
+}

+ 263 - 0
src/views/lean/news/index.vue

@@ -0,0 +1,263 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="信息时间" prop="newsTime">
+        <el-date-picker clearable
+          v-model="queryParams.newsTime"
+          type="date"
+          value-format="YYYY-MM-DD"
+          placeholder="请选择信息时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="信息标题" prop="title">
+        <el-input
+          v-model="queryParams.title"
+          placeholder="请输入信息标题"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="链接地址" prop="addr">
+        <el-input
+          v-model="queryParams.addr"
+          placeholder="请输入链接地址"
+          clearable
+          @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          plain
+          icon="Plus"
+          @click="handleAdd"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="Edit"
+          :disabled="single"
+          @click="handleUpdate"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="Delete"
+          :disabled="multiple"
+          @click="handleDelete"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="newsList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="信息时间" align="center" prop="newsTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.newsTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="信息标题" align="center" prop="title">
+        <template #default="scope">
+          <span style="color: #409eff; cursor: pointer;" @click="openLink(scope.row.addr)">{{ scope.row.title }}</span>
+        </template>
+      </el-table-column>
+<!--      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">-->
+<!--        <template #default="scope">-->
+<!--          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>-->
+<!--          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      v-model:page="queryParams.pageNum"
+      v-model:limit="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改原料行情对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="newsRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="信息时间" prop="newsTime">
+          <el-date-picker clearable
+            v-model="form.newsTime"
+            type="date"
+            value-format="YYYY-MM-DD"
+            placeholder="请选择信息时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="信息标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入信息标题" />
+        </el-form-item>
+        <el-form-item label="链接地址" prop="addr">
+          <el-input v-model="form.addr" placeholder="请输入链接地址" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="News">
+import { listNews, getNews, delNews, addNews, updateNews } from "@/api/lean/news";
+
+const { proxy } = getCurrentInstance();
+
+const newsList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    newsTime: null,
+    title: null,
+    addr: null,
+    orderByColumn: "news_time",
+    isAsc: "descending"
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询新闻列表 */
+function getList() {
+  loading.value = true;
+  listNews(queryParams.value).then(response => {
+    newsList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+/** 打开链接 */
+function openLink(url) {
+  if (url) {
+    window.open(url, '_blank');
+  }
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    newsId: null,
+    newsTime: null,
+    title: null,
+    addr: null
+  };
+  proxy.resetForm("newsRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.newsId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加原料行情";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _newsId = row.newsId || ids.value
+  getNews(_newsId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改原料行情";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["newsRef"].validate(valid => {
+    if (valid) {
+      if (form.value.newsId != null) {
+        updateNews(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addNews(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _newsIds = row.newsId || ids.value;
+  proxy.$modal.confirm('是否确认删除原料行情编号为"' + _newsIds + '"的数据项?').then(function() {
+    return delNews(_newsIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('lean/news/export', {
+    ...queryParams.value
+  }, `news_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>

+ 365 - 0
src/views/lean/qh/index.vue

@@ -0,0 +1,365 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="时间" prop="qhTime">
+        <el-date-picker clearable
+                        v-model="queryParams.qhTime"
+                        type="date"
+                        value-format="YYYY-MM-DD"
+                        placeholder="请选择时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="类别" prop="qhType">
+        <el-select v-model="queryParams.qhType" placeholder="请选择类别" clearable style="width: 150px;" @change="handleTypeChange">
+          <el-option label="原油" value="原油"></el-option>
+          <el-option label="炼化" value="炼化"></el-option>
+          <el-option label="聚酯" value="聚酯"></el-option>
+          <el-option label="纺丝" value="纺丝"></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="品名" prop="qhClass">
+        <el-select v-model="queryParams.qhClass" placeholder="请选择品名" clearable style="width: 150px;">
+          <el-option
+            v-for="item in qhClassOptions"
+            :key="item.value"
+            :label="item.label"
+            :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="价格" prop="price">
+        <el-input
+            v-model="queryParams.price"
+            placeholder="请输入价格"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="qhList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="ID" align="center" prop="qhId" />-->
+      <el-table-column label="时间" align="center" prop="qhTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.qhTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="类别" align="center" prop="qhType" />
+      <el-table-column label="品名" align="center" prop="qhClass" />
+      <el-table-column label="价格" align="center" prop="price" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 添加或修改期货价格对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="qhRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="时间" prop="qhTime">
+          <el-date-picker clearable
+                          v-model="form.qhTime"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="类别" prop="qhType">
+          <el-select v-model="form.qhType" placeholder="请选择类别" style="width: 150px;" @change="handleFormTypeChange">
+            <el-option label="原油" value="原油"></el-option>
+            <el-option label="炼化" value="炼化"></el-option>
+            <el-option label="聚酯" value="聚酯"></el-option>
+            <el-option label="纺丝" value="纺丝"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="品名" prop="qhClass">
+          <el-select v-model="form.qhClass" placeholder="请选择品名" style="width: 150px;">
+            <el-option
+              v-for="item in formQhClassOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="价格" prop="price">
+          <el-input v-model="form.price" placeholder="请输入价格" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Qh">
+import { listQh, getQh, delQh, addQh, updateQh } from "@/api/lean/qh";
+
+const { proxy } = getCurrentInstance();
+
+const qhList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+// 品名选项,根据类别变化
+const qhClassOptions = ref([
+  { label: 'WTI(/桶)', value: 'WTI(/桶)' },
+  { label: 'Brent(/桶)', value: 'Brent(/桶)' },
+  { label: 'PX(元/t)', value: 'PX(元/t)' },
+  { label: 'OM(元/t)', value: 'OM(元/t)' },
+  { label: 'PTA(元/t)', value: 'PTA(元/t)' },
+  { label: 'MEG(元/t)', value: 'MEG(元/t)' },
+  { label: 'FDY(元/t)', value: 'FDY(元/t)' },
+  { label: 'DTY(元/t)', value: 'DTY(元/t)' },
+  { label: 'POY(元/t)', value: 'POY(元/t)' }
+]);
+
+// 表单中的品名选项
+const formQhClassOptions = ref([
+  { label: 'WTI(/桶)', value: 'WTI(/桶)' },
+  { label: 'Brent(/桶)', value: 'Brent(/桶)' },
+  { label: 'PX(元/t)', value: 'PX(元/t)' },
+  { label: 'OM(元/t)', value: 'OM(元/t)' },
+  { label: 'PTA(元/t)', value: 'PTA(元/t)' },
+  { label: 'MEG(元/t)', value: 'MEG(元/t)' },
+  { label: 'FDY(元/t)', value: 'FDY(元/t)' },
+  { label: 'DTY(元/t)', value: 'DTY(元/t)' },
+  { label: 'POY(元/t)', value: 'POY(元/t)' }
+]);
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    qhTime: null,
+    qhType: null,
+    qhClass: null,
+    price: null,
+    orderByColumn: "qh_time",
+    isAsc: "descending"
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+// 类别与品名的映射关系
+const typeClassMap = {
+  '原油': ['WTI(/桶)', 'Brent(/桶)'],
+  '炼化': ['PX(元/t)', 'OM(元/t)'],
+  '聚酯': ['PTA(元/t)', 'MEG(元/t)'],
+  '纺丝': ['FDY(元/t)', 'DTY(元/t)', 'POY(元/t)']
+};
+
+/** 查询期货价格列表 */
+function getList() {
+  loading.value = true;
+  listQh(queryParams.value).then(response => {
+    qhList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    qhId: null,
+    qhTime: null,
+    qhType: null,
+    qhClass: null,
+    price: null
+  };
+  proxy.resetForm("qhRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  queryParams.value.qhType = null;
+  queryParams.value.qhClass = null;
+  qhClassOptions.value = getAllClassOptions();
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.qhId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加期货价格";
+  formQhClassOptions.value = getAllClassOptions();
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _qhId = row.qhId || ids.value
+  getQh(_qhId).then(response => {
+    form.value = response.data;
+    open.value = true;
+    title.value = "修改期货价格";
+    // 根据已选择的类别更新品名选项
+    if (form.value.qhType) {
+      handleFormTypeChange(form.value.qhType);
+    }
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["qhRef"].validate(valid => {
+    if (valid) {
+      if (form.value.qhId != null) {
+        updateQh(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addQh(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _qhIds = row.qhId || ids.value;
+  proxy.$modal.confirm('是否确认删除期货价格编号为"' + _qhIds + '"的数据项?').then(function() {
+    return delQh(_qhIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('lean/qh/export', {
+    ...queryParams.value
+  }, `qh_${new Date().getTime()}.xlsx`)
+}
+
+// 获取所有品名选项
+function getAllClassOptions() {
+  return [
+    { label: 'WTI(/桶)', value: 'WTI(/桶)' },
+    { label: 'Brent(/桶)', value: 'Brent(/桶)' },
+    { label: 'PX(元/t)', value: 'PX(元/t)' },
+    { label: 'OM(元/t)', value: 'OM(元/t)' },
+    { label: 'PTA(元/t)', value: 'PTA(元/t)' },
+    { label: 'MEG(元/t)', value: 'MEG(元/t)' },
+    { label: 'FDY(元/t)', value: 'FDY(元/t)' },
+    { label: 'DTY(元/t)', value: 'DTY(元/t)' },
+    { label: 'POY(元/t)', value: 'POY(元/t)' }
+  ];
+}
+
+// 处理查询条件中类别变化
+function handleTypeChange(value) {
+  if (value && typeClassMap[value]) {
+    qhClassOptions.value = typeClassMap[value].map(item => ({
+      label: item,
+      value: item
+    }));
+  } else {
+    qhClassOptions.value = getAllClassOptions();
+  }
+  queryParams.value.qhClass = null;
+}
+
+// 处理表单中类别变化
+function handleFormTypeChange(value) {
+  if (value && typeClassMap[value]) {
+    formQhClassOptions.value = typeClassMap[value].map(item => ({
+      label: item,
+      value: item
+    }));
+  } else {
+    formQhClassOptions.value = getAllClassOptions();
+  }
+  form.value.qhClass = null;
+}
+
+getList();
+</script>

+ 364 - 0
src/views/lean/xh/index.vue

@@ -0,0 +1,364 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="时间" prop="xhTime">
+        <el-date-picker clearable
+                        v-model="queryParams.xhTime"
+                        type="date"
+                        value-format="YYYY-MM-DD"
+                        placeholder="请选择时间">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="规格" prop="xhType">
+        <el-select
+            v-model="queryParams.xhType"
+            placeholder="请选择规格"
+            clearable
+            @change="handleSpecChange" style="width: 150px;">
+          <el-option
+              v-for="item in specOptions"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="供方" prop="xhClass">
+        <el-select
+            v-model="queryParams.xhClass"
+            placeholder="请选择供方"
+            clearable
+            :disabled="!queryParams.xhType" style="width: 150px;">
+          <el-option
+              v-for="item in supplierOptions"
+              :key="item"
+              :label="item"
+              :value="item">
+          </el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="价格" prop="price">
+        <el-input
+            v-model="queryParams.price"
+            placeholder="请输入价格"
+            clearable
+            @keyup.enter="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+        <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+            type="primary"
+            plain
+            icon="Plus"
+            @click="handleAdd"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="success"
+            plain
+            icon="Edit"
+            :disabled="single"
+            @click="handleUpdate"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+            type="danger"
+            plain
+            icon="Delete"
+            :disabled="multiple"
+            @click="handleDelete"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="xhList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+<!--      <el-table-column label="ID" align="center" prop="xhId" />-->
+      <el-table-column label="时间" align="center" prop="xhTime" width="180">
+        <template #default="scope">
+          <span>{{ parseTime(scope.row.xhTime, '{y}-{m}-{d}') }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="规格" align="center" prop="xhType" />
+      <el-table-column label="供方" align="center" prop="xhClass" />
+      <el-table-column label="价格" align="center" prop="price" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template #default="scope">
+          <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)">修改</el-button>
+          <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+        v-show="total>0"
+        :total="total"
+        v-model:page="queryParams.pageNum"
+        v-model:limit="queryParams.pageSize"
+        @pagination="getList"
+    />
+
+    <!-- 添加或修改现货价格对话框 -->
+    <el-dialog :title="title" v-model="open" width="500px" append-to-body>
+      <el-form ref="xhRef" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="时间" prop="xhTime">
+          <el-date-picker clearable
+                          v-model="form.xhTime"
+                          type="date"
+                          value-format="YYYY-MM-DD"
+                          placeholder="请选择时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="规格" prop="xhType">
+          <el-select
+              v-model="form.xhType"
+              placeholder="请选择规格"
+              @change="handleFormSpecChange">
+            <el-option
+                v-for="item in specOptions"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="供方" prop="xhClass">
+          <el-select
+              v-model="form.xhClass"
+              placeholder="请选择供方"
+              :disabled="!form.xhType">
+            <el-option
+                v-for="item in formSupplierOptions"
+                :key="item"
+                :label="item"
+                :value="item">
+            </el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="价格" prop="price">
+          <el-input v-model="form.price" placeholder="请输入价格" />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="Xh">
+import { listXh, getXh, delXh, addXh, updateXh } from "@/api/lean/xh";
+
+const { proxy } = getCurrentInstance();
+
+const xhList = ref([]);
+const open = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+const title = ref("");
+
+// 规格选项
+const specOptions = ref([
+  { value: '120D/120f', label: '120D/120f' },
+  { value: '150D/096f', label: '150D/096f' },
+  { value: '150D/120f', label: '150D/120f' },
+  { value: '150D/144f', label: '150D/144f' },
+  { value: '200D/096f', label: '200D/096f' },
+  { value: '200D/144f', label: '200D/144f' },
+  { value: '250D/120f', label: '250D/120f' },
+  { value: '300D/144f', label: '300D/144f' },
+  { value: '450D/192f', label: '450D/192f' }
+]);
+
+// 供方选项(根据规格动态变化)
+const supplierOptions = ref([]);
+const formSupplierOptions = ref([]);
+
+// 规格与供方的映射关系
+const specSupplierMap = {
+  '120D/120f': ['盛虹202dtex/120f', '盛元220dtex/120f'],
+  '150D/096f': ['恒通298dtex/096f', '盛虹263dtex/096f', '盛元275dtex/096f'],
+  '150D/120f': ['盛虹268dtex/120f', '盛元275dtex/120f'],
+  '150D/144f': ['恒通272dtex/144f', '盛虹265dtex/144f', '盛元272dtex/144f'],
+  '200D/096f': ['恒通378dtex/096f', '恒逸378dtex/096f', '盛虹368dtex/096f', '盛元365dtex/096f'],
+  '200D/144f': ['恒通378dtex/144f', '盛虹363dtex/144f', '盛元365dtex/144f'],
+  '250D/120f': ['恒通478dtex/122f', '恒逸478dtex/120f', '盛虹465dtex/120f'],
+  '300D/144f': ['恒通545dtex/144f', '恒逸560dtex/144f', '盛虹575dtex/144f'],
+  '450D/192f': ['恒通758dtex/192f']
+};
+
+const data = reactive({
+  form: {},
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    xhTime: null,
+    xhType: null,
+    xhClass: null,
+    price: null,
+    orderByColumn: "xh_time",
+    isAsc: "descending"
+  },
+  rules: {
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 处理规格变化 */
+function handleSpecChange(spec) {
+  if (spec && specSupplierMap[spec]) {
+    supplierOptions.value = specSupplierMap[spec];
+    // 如果当前选择的供方不在新选项中,则清空供方选择
+    if (queryParams.value.xhClass && !supplierOptions.value.includes(queryParams.value.xhClass)) {
+      queryParams.value.xhClass = null;
+    }
+  } else {
+    supplierOptions.value = [];
+    queryParams.value.xhClass = null;
+  }
+}
+
+/** 处理表单中规格变化 */
+function handleFormSpecChange(spec) {
+  if (spec && specSupplierMap[spec]) {
+    formSupplierOptions.value = specSupplierMap[spec];
+    // 如果当前选择的供方不在新选项中,则清空供方选择
+    if (form.value.xhClass && !formSupplierOptions.value.includes(form.value.xhClass)) {
+      form.value.xhClass = null;
+    }
+  } else {
+    formSupplierOptions.value = [];
+    form.value.xhClass = null;
+  }
+}
+
+/** 查询现货价格列表 */
+function getList() {
+  loading.value = true;
+  listXh(queryParams.value).then(response => {
+    xhList.value = response.rows;
+    total.value = response.total;
+    loading.value = false;
+  });
+}
+
+// 取消按钮
+function cancel() {
+  open.value = false;
+  reset();
+}
+
+// 表单重置
+function reset() {
+  form.value = {
+    xhId: null,
+    xhTime: null,
+    xhType: null,
+    xhClass: null,
+    price: null
+  };
+  formSupplierOptions.value = [];
+  proxy.resetForm("xhRef");
+}
+
+/** 搜索按钮操作 */
+function handleQuery() {
+  queryParams.value.pageNum = 1;
+  getList();
+}
+
+/** 重置按钮操作 */
+function resetQuery() {
+  proxy.resetForm("queryRef");
+  supplierOptions.value = [];
+  handleQuery();
+}
+
+// 多选框选中数据
+function handleSelectionChange(selection) {
+  ids.value = selection.map(item => item.xhId);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+}
+
+/** 新增按钮操作 */
+function handleAdd() {
+  reset();
+  open.value = true;
+  title.value = "添加现货价格";
+}
+
+/** 修改按钮操作 */
+function handleUpdate(row) {
+  reset();
+  const _xhId = row.xhId || ids.value
+  getXh(_xhId).then(response => {
+    form.value = response.data;
+    // 初始化供方选项
+    if (form.value.xhType && specSupplierMap[form.value.xhType]) {
+      formSupplierOptions.value = specSupplierMap[form.value.xhType];
+    }
+    open.value = true;
+    title.value = "修改现货价格";
+  });
+}
+
+/** 提交按钮 */
+function submitForm() {
+  proxy.$refs["xhRef"].validate(valid => {
+    if (valid) {
+      if (form.value.xhId != null) {
+        updateXh(form.value).then(response => {
+          proxy.$modal.msgSuccess("修改成功");
+          open.value = false;
+          getList();
+        });
+      } else {
+        addXh(form.value).then(response => {
+          proxy.$modal.msgSuccess("新增成功");
+          open.value = false;
+          getList();
+        });
+      }
+    }
+  });
+}
+
+/** 删除按钮操作 */
+function handleDelete(row) {
+  const _xhIds = row.xhId || ids.value;
+  proxy.$modal.confirm('是否确认删除现货价格编号为"' + _xhIds + '"的数据项?').then(function() {
+    return delXh(_xhIds);
+  }).then(() => {
+    getList();
+    proxy.$modal.msgSuccess("删除成功");
+  }).catch(() => {});
+}
+
+/** 导出按钮操作 */
+function handleExport() {
+  proxy.download('lean/xh/export', {
+    ...queryParams.value
+  }, `xh_${new Date().getTime()}.xlsx`)
+}
+
+getList();
+</script>