Просмотр исходного кода

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	src/views/price-approval/approval-review-supply/component/DataTable.vue
#	src/views/price-approval/approval-review-supply/index.vue
#	src/views/price-approval/direct-sales/component/DataTable.vue
xinyan 5 месяцев назад
Родитель
Сommit
0b6dfb21a3

+ 2 - 2
.env.development

@@ -4,8 +4,8 @@ ENV='development'
 # 本地环境接口地址
 # VITE_API_URL = 'http://127.0.0.1:8000'
 VITE_API_URL='http://192.168.1.225:82/'
-# VUE_APP_API="http://operate.zosi.com.cn/"
-# VUE_APP_API="http://192.168.1.225:82/"
+# VITE_API_URL='http://operate.zosi.com.cn/'
+# VITE_API_URL="http://192.168.1.225:82/"
 
 # 是否启用按钮权限
 VITE_PM_ENABLED=true

+ 236 - 0
src/views/price-approval/approval-review-supply/component/AddPage.vue

@@ -0,0 +1,236 @@
+<script lang="ts" setup>
+/**
+ * @Name: AddPage.vue
+ * @Description: 商品添加-供货
+ * @Author: Cheney
+ */
+
+import { FormInstance, FormRules } from 'element-plus';
+import { Finished, RefreshLeft, Select } from '@element-plus/icons-vue';
+
+
+const route = useRoute();
+const routeQuery: any = ref(route.query);
+
+interface RuleForm {
+  country: any;
+  platform: any;
+  sku: any;
+  weight: any;
+  currency_code: any;
+  price_market_ref: any;
+  estimated_cost: any;
+  final_cost: any;
+  price_market: any;
+  price_supply: any;
+  cost: any;
+  price_show: any;
+  price_daily: any;
+  price_min: any;
+}
+
+const ruleFormRef = ref<FormInstance>();
+const ruleForm = reactive<RuleForm>({
+  country: '',
+  platform: '',
+  sku: '',
+  weight: '',
+  currency_code: '',
+  price_market_ref: '',
+  estimated_cost: '',
+  final_cost: '',
+  price_market: '',
+  price_supply: '',
+  cost: '',
+  price_show: '',
+  price_daily: '',
+  price_min: ''
+});
+
+const rules = reactive<FormRules<RuleForm>>({
+  sku: [ { required: true, message: '请输入SKU', trigger: 'blur' } ],
+  platform: [ { required: true, message: '请输入平台', trigger: 'blur' } ],
+  country: [ { required: true, message: '请输入国家', trigger: 'blur' } ],
+  currency_code: [ { required: true, message: '请选择货币代码', trigger: 'change' } ],
+  price_supply: [ { required: true, message: '请输入供货价', trigger: 'blur' } ],
+  estimated_cost: [ { required: true, message: '请输入预估成本', trigger: 'blur' } ]
+});
+
+const loading = ref(false);
+
+const submitForm = async (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  await formEl.validate((valid, fields) => {
+    if (valid) {
+      console.log('submit!');
+    } else {
+      console.log('error submit!', fields);
+    }
+  });
+};
+
+const resetForm = (formEl: FormInstance | undefined) => {
+  if (!formEl) return;
+  formEl.resetFields();
+};
+</script>
+
+<template>
+  <div class="p-5">
+    <el-card class="h-full" style="color: rgba(0, 0, 0, 0.88);">
+      <template #header>
+      <span class="text-lg">
+        商品添加 -- {{ routeQuery.type === 'supply' ? '供货' : '直销' }}
+      </span>
+      </template>
+      <div class="w-full">
+        <!-- 供货 -->
+        <el-form v-if="routeQuery.type === 'supply'" ref="ruleFormRef" :model="ruleForm" :rules="rules" class="mx-2.5"
+                 label-position="top"
+                 label-width="auto" status-icon>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="国 家" prop="country">
+                <el-input v-model="ruleForm.country" placeholder="请输入国家" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="平 台" prop="platform">
+                <el-input v-model="ruleForm.platform" placeholder="请输入平台" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="SKU" prop="sku">
+                <el-input v-model="ruleForm.sku" placeholder="请输入SKU" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="重 量(KG)" prop="weight">
+                <el-input v-model="ruleForm.weight" placeholder="请输入重量" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="货币代码" prop="currency_code">
+                <el-select v-model="ruleForm.currency_code" placeholder="请选择货币代码">
+                  <el-option label="1" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="卖场参考价" prop="price_market_ref">
+                <el-input v-model="ruleForm.price_market_ref" placeholder="请输入卖场参考价" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="预估硬件成本" prop="estimated_cost">
+                <el-input v-model="ruleForm.estimated_cost" placeholder="请输入预估硬件成本" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="尾段成本" prop="final_cost">
+                <el-input v-model="ruleForm.final_cost" placeholder="请输入尾段成本" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20" style="margin-bottom: 5px;">
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="卖场价(不含VAT)" prop="price_market">
+                <el-input v-model="ruleForm.price_market" placeholder="请输入卖场价" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="供货价" prop="price_supply">
+                <el-input v-model="ruleForm.price_supply" placeholder="请输入供货价" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="成 本" prop="cost">
+                <el-button v-model="ruleForm.cost" :icon="Select" class="w-full" plain type="primary">选 择</el-button>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+        <!-- 直销 -->
+        <el-form v-else ref="ruleFormRef" :model="ruleForm" :rules="rules" class="mx-2.5"
+                 label-position="top"
+                 label-width="auto" status-icon>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="国 家" prop="country">
+                <el-input v-model="ruleForm.country" placeholder="请输入国家" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="平 台" prop="platform">
+                <el-input v-model="ruleForm.platform" placeholder="请输入平台" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="SKU" prop="sku">
+                <el-input v-model="ruleForm.sku" placeholder="请输入SKU" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="重 量(KG)" prop="weight">
+                <el-input v-model="ruleForm.weight" placeholder="请输入重量" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20">
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="货币代码" prop="currency_code">
+                <el-select v-model="ruleForm.currency_code" placeholder="请选择货币代码">
+                  <el-option label="1" value="1"></el-option>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="展示价格" prop="price_show">
+                <el-input v-model="ruleForm.price_show" placeholder="请输入展示价格" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="日常活动售价" prop="price_daily">
+                <el-input v-model="ruleForm.price_daily" placeholder="请输入日常活动售价" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="最低活动价" prop="price_min">
+                <el-input v-model="ruleForm.price_min" placeholder="请输入最低活动价" />
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="20" style="margin-bottom: 5px;">
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="预估硬件成本" prop="estimated_cost">
+                <el-input v-model="ruleForm.estimated_cost" placeholder="请输入预估成本" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="尾段成本" prop="final_cost">
+                <el-input v-model="ruleForm.final_cost" placeholder="请输入尾段成本" />
+              </el-form-item>
+            </el-col>
+            <el-col :span="6">
+              <el-form-item class="font-medium" label="成 本" prop="cost">
+                <el-button v-model="ruleForm.cost" :icon="Select" class="w-full" plain type="primary">选 择</el-button>
+              </el-form-item>
+            </el-col>
+          </el-row>
+        </el-form>
+      </div>
+      <template #footer>
+        <div class="flex justify-end">
+          <el-button :icon="RefreshLeft" @click="resetForm(ruleFormRef)">重 置</el-button>
+          <el-button :icon="Finished" :loading="loading" type="primary" @click="submitForm(ruleFormRef)">确 定</el-button>
+        </div>
+      </template>
+    </el-card>
+  </div>
+</template>
+
+<style scoped>
+
+</style>

+ 163 - 132
src/views/price-approval/approval-review-supply/component/DataTable.vue

@@ -22,6 +22,8 @@ import { useResponse } from '/@/utils/useResponse';
 import { CostDetailColumns, SupplyCheckColumns_Regular } from '/@/views/price-approval/Columns';
 
 
+const router = useRouter();
+
 interface Parameter {
 	description: string;
 	platform: string;
@@ -33,37 +35,37 @@ const { tableOptions, handlePageChange } = usePagination(fetchList);
 
 const gridRef = ref();
 const gridOptions: any = reactive({
-	size: 'mini',
-	border: false,
-	round: true,
-	stripe: true,
-	currentRowHighLight: true,
-	height: '100%',
-	toolbarConfig: {
-		size: 'large',
-		slots: {
-			buttons: 'toolbar_buttons',
-			tools: 'toolbar_tools',
-		},
-	},
-	rowConfig: {
-		isHover: true,
-	},
-	columnConfig: {
-		resizable: true,
-	},
-	pagerConfig: {
-		total: tableOptions.value.total,
-		page: tableOptions.value.page,
-		limit: tableOptions.value.limit,
-	},
-	loading: false,
-	loadingConfig: {
-		icon: 'vxe-icon-indicator roll',
-		text: '正在拼命加载中...',
-	},
-	columns: '',
-	data: '',
+  size: 'mini',
+  border: false,
+  round: true,
+  stripe: true,
+  currentRowHighLight: true,
+  height: '100%',
+  toolbarConfig: {
+    size: 'large',
+    slots: {
+      buttons: 'toolbar_buttons',
+      tools: 'toolbar_tools'
+    }
+  },
+  rowConfig: {
+    isHover: true
+  },
+  columnConfig: {
+    resizable: true
+  },
+  pagerConfig: {
+    total: tableOptions.value.total,
+    page: tableOptions.value.page,
+    limit: tableOptions.value.limit
+  },
+  loading: false,
+  loadingConfig: {
+    icon: 'vxe-icon-indicator roll',
+    text: '正在拼命加载中...'
+  },
+  columns: '',
+  data: ''
 });
 
 const checkedList = ref<Set<number>>(new Set());
@@ -77,11 +79,11 @@ const dialogVisible = ref(false);
 const templateType = ref('cost');
 
 onBeforeMount(() => {
-	gridOptions.pagerConfig.limit = 10;
+  gridOptions.pagerConfig.limit = 10;
 });
 
 onMounted(() => {
-	fetchList();
+  fetchList();
 });
 
 async function fetchList(isQuery = false) {
@@ -96,34 +98,63 @@ async function fetchList(isQuery = false) {
 
 	};
 
-	await useTableData(api.getTableData, query, gridOptions);
-	await gridRef.value.loadColumn(SupplyCheckColumns_Regular);
-	gridOptions.showHeader = Boolean(gridOptions.data?.length);
+  await useTableData(api.getTableData, query, gridOptions);
+  await gridRef.value.loadColumn(SupplyCheckColumns_Regular);
+  gridOptions.showHeader = Boolean(gridOptions.data?.length);
 }
 
 function handleRefresh() {
-	fetchList();
+  fetchList();
 }
 
-// async function handleDownload() {
-// 	gridOptions.loading = true;
-// 	try {
-// 		await uesDownloadFile({
-// 			apiMethod: api.exportData,
-// 			queryParams: {
-//
-// 			},
-// 			fileName: '审批查看(供货).xlsx', // 自定义文件名
-// 			successMessage: () => ElMessage.success('数据导出成功!'),
-// 			errorMessage: () => ElMessage.error('数据导出失败,请重试!'),
-// 		});
-// 	} finally {
-// 		gridOptions.loading = false; // 结束加载状态
-// 	}
-// }
+async function handleDownload() {
+  gridOptions.loading = true;
+  try {
+    const query = {
+      description: queryParameter?.description,
+      platform: queryParameter?.platform,
+      station: queryParameter?.station
+    };
+    const response = await api.exportData(query);
+    const url = window.URL.createObjectURL(new Blob([ response.data ]));
+    const link = document.createElement('a');
+    link.href = url;
+    link.setAttribute('download', '商品列表数据.xlsx');
+    document.body.appendChild(link);
+    link.click();
+    ElMessage.success('数据导出成功!');
+  } catch (error) {
+    ElMessage.error('数据导出失败,请重试!');
+    console.error(error);
+  } finally {
+    gridOptions.loading = false; // 结束加载状态
+  }
+}
 
-function handleCreate() {
+function selectChangeEvent({ checked, row }: any) {
+  if (checked) {
+    checkedList.value.add(row.id); // 获取单个数据
+  } else {
+    checkedList.value.delete(row.id);
+  }
+}
+
+function selectAllChangeEvent({ checked }: any) {
+  const $grid = gridRef.value;
+  if ($grid) {
+    const records = $grid.getData(); // 获取所有数据
+    if (checked) {
+      records.forEach((item: any) => {
+        checkedList.value.add(item.id);
+      });
+    } else {
+      checkedList.value.clear();
+    }
+  }
+}
 
+function handleCreate() {
+  router.push({ name: 'SupplyAddPage', query: { type: 'supply' } });
 }
 
 function handleEdit(row: any) {
@@ -139,7 +170,6 @@ async function singleDelete(row: any) {
 	}
 }
 
-
 function downloadTemplate() {
 	// const url = '/api/choice/reviews_monitor/import_data/';
 	// const fileName = '审批查看(供货)模板.xlsx';
@@ -173,83 +203,84 @@ defineExpose({ fetchList });
 </script>
 
 <template>
-	<vxe-grid ref="gridRef" v-bind="gridOptions" v-on="gridEvents" @checkbox-change="selectChangeEvent" @checkbox-all="selectAllChangeEvent" :cell-style="cellStyle">
-		<!-- 工具栏左侧 -->
-		<template #toolbar_buttons>
-			<div class="flex gap-2">
-				<!--<div>-->
-				<!--	<el-popconfirm :icon="InfoFilled" icon-color="#626AEF" title="你确定要删除此项吗?" width="220" @confirm="batchDelete">-->
-				<!--		<template #reference>-->
-				<!--			<PermissionButton :disabled="!checkedList.size" :icon="Delete" plain round type="danger"> 批量删除 </PermissionButton>-->
-				<!--		</template>-->
-				<!--		<template #actions="{ confirm, cancel }">-->
-				<!--			<el-button size="small" @click="cancel">No!</el-button>-->
-				<!--			<el-button size="small" type="danger" @click="confirm">Yes?</el-button>-->
-				<!--		</template>-->
-				<!--	</el-popconfirm>-->
-				<!--</div>-->
-				<div>
-					<PermissionButton :icon="Plus" plain round type="primary" @click="handleCreate">新 增</PermissionButton>
-				</div>
-				<div class="custom-el-input">
-					<el-select v-model="templateType" style="width: 200px">
-						<template #prefix>
-							<div class="flex items-center">
-								<el-button
-									size="small"
-									style="margin-left: -7px; font-size: 14px; border-radius: 29px"
-									text
-									type="success"
-									@click.stop="downloadTemplate"
-								>
-									下载
-								</el-button>
-								<VerticalDivider style="margin-left: 7px" />
-							</div>
-						</template>
-						<el-option label="审批查看(供货)" value="cost" />
-					</el-select>
-				</div>
-				<VerticalDivider class="px-1" style="margin-left: 7px" />
-				<ImportButton :icon="Upload" :uploadFunction="api.upload" bg text>导 入</ImportButton>
-			</div>
-		</template>
-		<!-- 工具栏右侧 -->
-		<template #toolbar_tools>
-			<el-button circle class="toolbar-btn" @click="handleRefresh">
-				<el-icon>
-					<Refresh />
-				</el-icon>
-			</el-button>
-			<el-button circle class="toolbar-btn" @click="handleDownload">
-				<el-icon>
-					<Download />
-				</el-icon>
-			</el-button>
-		</template>
-		<template #top>
-			<div class="mb-2"></div>
-		</template>
-		<!-- 分页 -->
-		<template #pager>
-			<vxe-pager
-				v-model:currentPage="gridOptions.pagerConfig.page"
-				v-model:pageSize="gridOptions.pagerConfig.limit"
-				:total="gridOptions.pagerConfig.total"
-				class="mt-1.5"
-				@page-change="handlePageChange"
-			/>
-		</template>
-		<template #empty>
-			<el-empty description="暂无数据" />
-		</template>
-		<!-- 自定义列插槽 -->
-		<template v-for="col in CostDetailColumns" #[`${col.field}`]="{ row }">
-			<DataTableSlot :field="col.field" :row="row" @edit-row="handleEdit" @handle-delete="singleDelete" />
-		</template>
-	</vxe-grid>
-	<EditDrawer v-if="editOpen" v-model="editOpen" :row-data="rowData" @refresh="handleRefresh" />
-	<NoticeDialog v-if="dialogVisible" v-model="dialogVisible" :row-data="rowData" />
+  <vxe-grid ref="gridRef" :cell-style="cellStyle" v-bind="gridOptions" v-on="gridEvents"
+            @checkbox-change="selectChangeEvent" @checkbox-all="selectAllChangeEvent">
+    <!-- 工具栏左侧 -->
+    <template #toolbar_buttons>
+      <div class="flex gap-2">
+        <!--<div>-->
+        <!--	<el-popconfirm :icon="InfoFilled" icon-color="#626AEF" title="你确定要删除此项吗?" width="220" @confirm="batchDelete">-->
+        <!--		<template #reference>-->
+        <!--			<PermissionButton :disabled="!checkedList.size" :icon="Delete" plain round type="danger"> 批量删除 </PermissionButton>-->
+        <!--		</template>-->
+        <!--		<template #actions="{ confirm, cancel }">-->
+        <!--			<el-button size="small" @click="cancel">No!</el-button>-->
+        <!--			<el-button size="small" type="danger" @click="confirm">Yes?</el-button>-->
+        <!--		</template>-->
+        <!--	</el-popconfirm>-->
+        <!--</div>-->
+        <div>
+          <PermissionButton :icon="Plus" plain round type="primary" @click="handleCreate">新 增</PermissionButton>
+        </div>
+        <div class="custom-el-input">
+          <el-select v-model="templateType" style="width: 190px">
+            <template #prefix>
+              <div class="flex items-center">
+                <el-button
+                    size="small"
+                    style="margin-left: -7px; font-size: 14px; border-radius: 29px"
+                    text
+                    type="success"
+                    @click.stop="downloadTemplate"
+                >
+                  下载
+                </el-button>
+                <VerticalDivider style="margin-left: 7px" />
+              </div>
+            </template>
+            <el-option label="成本查看模板" value="cost" />
+          </el-select>
+        </div>
+        <VerticalDivider class="px-1" style="margin-left: 7px" />
+        <ImportButton :icon="Upload" :uploadFunction="api.upload" bg text>导 入</ImportButton>
+      </div>
+    </template>
+    <!-- 工具栏右侧 -->
+    <template #toolbar_tools>
+      <el-button circle class="toolbar-btn" @click="handleRefresh">
+        <el-icon>
+          <Refresh />
+        </el-icon>
+      </el-button>
+      <el-button circle class="toolbar-btn" @click="handleDownload">
+        <el-icon>
+          <Download />
+        </el-icon>
+      </el-button>
+    </template>
+    <template #top>
+      <div class="mb-2"></div>
+    </template>
+    <!-- 分页 -->
+    <template #pager>
+      <vxe-pager
+          v-model:currentPage="gridOptions.pagerConfig.page"
+          v-model:pageSize="gridOptions.pagerConfig.limit"
+          :total="gridOptions.pagerConfig.total"
+          class="mt-1.5"
+          @page-change="handlePageChange"
+      />
+    </template>
+    <template #empty>
+      <el-empty description="暂无数据" />
+    </template>
+    <!-- 自定义列插槽 -->
+    <template v-for="col in CostDetailColumns" #[`${col.field}`]="{ row }">
+      <DataTableSlot :field="col.field" :row="row" @edit-row="handleEdit" @handle-delete="singleDelete" />
+    </template>
+  </vxe-grid>
+  <EditDrawer v-if="editOpen" v-model="editOpen" :row-data="rowData" @refresh="handleRefresh" />
+  <NoticeDialog v-if="dialogVisible" v-model="dialogVisible" :row-data="rowData" />
 </template>
 
 <style scoped>

+ 2 - 5
src/views/price-approval/approval-review-supply/index.vue

@@ -1,21 +1,18 @@
-<script setup lang="ts">
+<script lang="ts" setup>
 /**
  * @Name: index.vue
  * @Description: 审批查看(供货)
  * @Author: Cheney
  */
 
-
 import VerticalDivider from '/src/components/VerticalDivider/index.vue';
 import { RefreshLeft, Search } from '@element-plus/icons-vue';
-import { DictionaryStore } from '/@/stores/dictionary';
 import { useResponse } from '/@/utils/useResponse';
 import { useTemplateRef } from 'vue';
 import * as api from './api';
-import { useCustomHeight } from '/@/utils/useCustomHeight';
 import DataTable from './component/DataTable.vue';
 import { useTableHeight } from '/@/utils/useTableHeight';
-import { getCostOptions } from './api';
+
 
 const titleContainer: Ref<HTMLElement | null> = useTemplateRef('titleContainer');
 const queryContainer: Ref<HTMLElement | null> = useTemplateRef('queryContainer');

+ 2 - 1
src/views/price-approval/direct-sales/component/DataTable.vue

@@ -21,6 +21,7 @@ import {
 	DirectSalesCheckColumns_Regular, DirectSalesCheckColumns_Special,
 } from '/@/views/price-approval/Columns';
 import EditDrawer from '/@/views/price-approval/direct-sales/component/EditDrawer.vue';
+import router from '/@/router';
 
 
 interface Parameter {
@@ -131,7 +132,7 @@ async function handleDownload() {
 }
 
 function handleCreate() {
-
+  router.push({ name: 'SupplyAddPage', query: { type: 'direct' } });
 }
 
 function handleEdit(row: any) {