This commit is contained in:
AERWEN\26795 2023-10-27 17:39:04 +08:00
parent 4977e805b5
commit a304e80684
96 changed files with 3 additions and 18641 deletions

2
.env
View File

@ -1,3 +1,3 @@
# 页面标题
VITE_APP_TITLE = '阿尔文电商'
VITE_APP_TITLE = '小程序模板'

View File

@ -1,46 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 客户收货地址Api接口
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-06-05)
* @LastEditors: (admin)
* @LastEditTime: (2023-06-05)
*/
// 客户收货地址分页查询列表
export function customerAddressList(query) {
return request({
url: '/business/CustomerAddress/getCustomerAddressList',
method: 'get',
params: query
})
}
// 客户收货地址新增或修改
export function addOrUpdateCustomerAddress(data) {
return request({
url: '/business/CustomerAddress/addOrUpdateCustomerAddress',
method: 'post',
data: data,
})
}
// 客户收货地址删除
export function delCustomerAddress(ids) {
return request({
url: '/business/CustomerAddress/'+ ids,
method: 'delete'
})
}
// 客户收货地址导出
export function exportCustomerAddress(query) {
return request({
url: 'business/CustomerAddress/exportCustomerAddress',
method: 'get',
params: query
})
}

View File

@ -1,49 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 商品类目Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-12)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-12)
*/
/**
* 商品类目树形查询列表
* @param {查询条件} data
*/
export function goodsCategoryTreeList(query) {
return request({
url: '/business/GoodsCategory/getGoodsCategoryTreeList',
method: 'get',
params: query
})
}
// 商品类目新增或修改
export function addOrUpdateGoodsCategory(data) {
return request({
url: '/business/GoodsCategory/addOrUpdateGoodsCategory',
method: 'post',
data: data,
})
}
// 商品类目删除
export function delGoodsCategory(ids) {
return request({
url: '/business/GoodsCategory/'+ ids,
method: 'delete'
})
}
// 商品类目导出
export function exportGoodsCategory(query) {
return request({
url: 'business/GoodsCategory/exportGoodsCategory',
method: 'get',
params: query
})
}

View File

@ -1,46 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 商品评价Api接口
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-07-15)
* @LastEditors: (admin)
* @LastEditTime: (2023-07-15)
*/
// 商品评价分页查询列表
export function goodsCommentList(query) {
return request({
url: '/business/GoodsComment/getGoodsCommentList',
method: 'get',
params: query
})
}
// 商品评价新增或修改
export function addOrUpdateGoodsComment(data) {
return request({
url: '/business/GoodsComment/addOrUpdateGoodsComment',
method: 'post',
data: data,
})
}
// 商品评价删除
export function delGoodsComment(ids) {
return request({
url: '/business/GoodsComment/'+ ids,
method: 'delete'
})
}
// 商品评价回复
export function goodsCommentRecover(data) {
return request({
url: 'business/GoodsComment/recover',
method: 'put',
data: data
})
}

View File

@ -1,46 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 商品服务与承诺Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
*/
// 商品服务与承诺分页查询列表
export function goodsServicesList(query) {
return request({
url: '/business/GoodsServices/getGoodsServicesList',
method: 'get',
params: query
})
}
// 商品服务与承诺新增或修改
export function addOrUpdateGoodsServices(data) {
return request({
url: '/business/GoodsServices/addOrUpdateGoodsServices',
method: 'post',
data: data,
})
}
// 商品服务与承诺删除
export function delGoodsServices(ids) {
return request({
url: '/business/GoodsServices/'+ ids,
method: 'delete'
})
}
// 商品服务与承诺导出
export function exportGoodsServices(query) {
return request({
url: 'business/GoodsServices/exportGoodsServices',
method: 'get',
params: query
})
}

View File

@ -1,82 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 商品Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-19)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-19)
*/
// 商品分页查询列表
export function goodsList(query) {
return request({
url: '/business/Goods/getGoodsList',
method: 'get',
params: query
})
}
// 全部商品查询列表
export function allGoodsList(query) {
return request({
url: '/business/Goods/getAllGoodsList',
method: 'get',
params: query
})
}
// 获取商品Sku
export function getGoodsSkuList(query) {
return request({
url: '/business/Goods/getGoodsSkuList',
method: 'get',
params: query
})
}
// 获取商品服务与承诺
export function getCurrentGoodsServiceList(query) {
return request({
url: '/business/Goods/getCurrentGoodsServiceList',
method: 'get',
params: query
})
}
// 商品新增或修改
export function addOrUpdateGoods(data) {
return request({
url: '/business/Goods/addOrUpdateGoods',
method: 'post',
data: data,
})
}
// 上下架商品
export function shelfGoods(data) {
return request({
url: '/business/Goods/shelfGoods',
method: 'put',
data: data,
})
}
// 商品删除
export function delGoods(ids) {
return request({
url: '/business/Goods/'+ ids,
method: 'delete'
})
}
// 商品导出
export function exportGoods(query) {
return request({
url: 'business/Goods/exportGoods',
method: 'get',
params: query
})
}

View File

@ -1,49 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 店铺商品类目Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
*/
/**
* 店铺商品类目树形查询列表
* @param {查询条件} data
*/
export function shopGoodsCategoryTreeList(query) {
return request({
url: '/business/ShopGoodsCategory/getShopGoodsCategoryTreeList',
method: 'get',
params: query
})
}
// 店铺商品类目新增或修改
export function addOrUpdateShopGoodsCategory(data) {
return request({
url: '/business/ShopGoodsCategory/addOrUpdateShopGoodsCategory',
method: 'post',
data: data,
})
}
// 店铺商品类目删除
export function delShopGoodsCategory(ids) {
return request({
url: '/business/ShopGoodsCategory/'+ ids,
method: 'delete'
})
}
// 店铺商品类目导出
export function exportShopGoodsCategory(query) {
return request({
url: 'business/ShopGoodsCategory/exportShopGoodsCategory',
method: 'get',
params: query
})
}

View File

@ -1,57 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 配送模板Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-16)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-16)
*/
// 配送模板分页查询列表
export function deliveryList(query) {
return request({
url: '/business/Delivery/getDeliveryList',
method: 'get',
params: query
})
}
// 获取配送模板的配送区域和运费列表
export function getDeliveryRuleList(query) {
return request({
url: '/business/Delivery/getDeliveryRuleList',
method: 'get',
params: query
})
}
// 配送模板新增或修改
export function addOrUpdateDelivery(data) {
return request({
url: '/business/Delivery/addOrUpdateDelivery',
method: 'post',
data: data,
})
}
// 配送模板删除
export function delDelivery(ids) {
return request({
url: '/business/Delivery/'+ ids,
method: 'delete'
})
}
// 配送模板导出
export function exportDelivery(query) {
return request({
url: 'business/Delivery/exportDelivery',
method: 'get',
params: query
})
}

View File

@ -1,46 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 物流公司Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
*/
// 物流公司分页查询列表
export function logisticsCompanyList(query) {
return request({
url: '/business/LogisticsCompany/getLogisticsCompanyList',
method: 'get',
params: query
})
}
// 物流公司新增或修改
export function addOrUpdateLogisticsCompany(data) {
return request({
url: '/business/LogisticsCompany/addOrUpdateLogisticsCompany',
method: 'post',
data: data,
})
}
// 物流公司删除
export function delLogisticsCompany(ids) {
return request({
url: '/business/LogisticsCompany/'+ ids,
method: 'delete'
})
}
// 物流公司导出
export function exportLogisticsCompany(query) {
return request({
url: 'business/LogisticsCompany/exportLogisticsCompany',
method: 'get',
params: query
})
}

View File

@ -1,46 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 优惠券Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-24)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-24)
*/
// 优惠券分页查询列表
export function couponList(query) {
return request({
url: '/business/Coupon/getCouponList',
method: 'get',
params: query
})
}
// 优惠券新增或修改
export function addOrUpdateCoupon(data) {
return request({
url: '/business/Coupon/addOrUpdateCoupon',
method: 'post',
data: data,
})
}
// 优惠券删除
export function delCoupon(ids) {
return request({
url: '/business/Coupon/'+ ids,
method: 'delete'
})
}
// 优惠券导出
export function exportCoupon(query) {
return request({
url: 'business/Coupon/exportCoupon',
method: 'get',
params: query
})
}

View File

@ -1,38 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 领券记录Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-31)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-31)
*/
// 领券记录分页查询列表
export function customerCouponList(query) {
return request({
url: '/business/CustomerCoupon/getCustomerCouponList',
method: 'get',
params: query
})
}
// 领券记录新增或修改
export function addOrUpdateCustomerCoupon(data) {
return request({
url: '/business/CustomerCoupon/addOrUpdateCustomerCoupon',
method: 'post',
data: data,
})
}
// 领券记录删除
export function delCustomerCoupon(ids) {
return request({
url: '/business/CustomerCoupon/'+ ids,
method: 'delete'
})
}

View File

@ -1,65 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 售后单记录表Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-08-29)
* @LastEditors: (lwh)
* @LastEditTime: (2023-08-29)
*/
// 售后单记录表分页查询列表
export function orderRefundList(query) {
return request({
url: '/business/OrderRefund/getOrderRefundList',
method: 'get',
params: query
})
}
// 售后单记录详情查询列表
export function getOrderRefundDetails(query) {
return request({
url: '/business/OrderRefund/getOrderRefundDetails',
method: 'get',
params: query
})
}
// 审核售后订单
export function auditOrderRefund(data) {
return request({
url: '/business/OrderRefund/auditOrderRefund',
method: 'post',
data: data,
})
}
// 商家确认收货
export function confirmsReceipt(data) {
return request({
url: '/business/OrderRefund/confirmsReceipt',
method: 'post',
data: data,
})
}
// 售后单记录表删除
export function delOrderRefund(ids) {
return request({
url: '/business/OrderRefund/'+ ids,
method: 'delete'
})
}
// 售后单记录表导出
export function exportOrderRefund(query) {
return request({
url: 'business/OrderRefund/exportOrderRefund',
method: 'get',
params: query
})
}

View File

@ -1,82 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 订单Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-08-29)
* @LastEditors: (lwh)
* @LastEditTime: (2023-08-29)
*/
// 订单分页查询列表
export function orderList(query) {
return request({
url: '/business/Order/getOrderList',
method: 'get',
params: query
})
}
// 订单详情
export function getOrderDetails(query) {
return request({
url: '/business/Order/getOrderDetails',
method: 'get',
params: query
})
}
// 订单发货
export function deliver(data) {
return request({
url: '/business/Order/deliver',
method: 'post',
data: data,
})
}
// 订单改价
export function changePrice(data) {
return request({
url: '/business/Order/changePrice',
method: 'post',
data: data,
})
}
// 审核取消订单
export function cancelOrder(data) {
return request({
url: '/business/Order/cancelOrder',
method: 'post',
data: data,
})
}
// 订单新增或修改
export function addOrUpdateOrder(data) {
return request({
url: '/business/Order/addOrUpdateOrder',
method: 'post',
data: data,
})
}
// 订单删除
export function delOrder(ids) {
return request({
url: '/business/Order/'+ ids,
method: 'delete'
})
}
// 订单导出
export function exportOrder(query) {
return request({
url: 'business/Order/exportOrder',
method: 'get',
params: query
})
}

View File

@ -1,46 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 店铺地址Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
*/
// 店铺地址分页查询列表
export function shopAddressList(query) {
return request({
url: '/business/ShopAddress/getShopAddressList',
method: 'get',
params: query
})
}
// 店铺地址新增或修改
export function addOrUpdateShopAddress(data) {
return request({
url: '/business/ShopAddress/addOrUpdateShopAddress',
method: 'post',
data: data,
})
}
// 店铺地址删除
export function delShopAddress(ids) {
return request({
url: '/business/ShopAddress/'+ ids,
method: 'delete'
})
}
// 店铺地址导出
export function exportShopAddress(query) {
return request({
url: 'business/ShopAddress/exportShopAddress',
method: 'get',
params: query
})
}

View File

@ -1,83 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 店铺Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-09)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-09)
*/
// 店铺分页查询列表
export function shopList(query) {
return request({
url: '/business/Shop/getShopList',
method: 'get',
params: query
})
}
// 获取未绑定的用户列表
export function getUserWithOutBindList(query) {
return request({
url: '/business/Shop/getUserWithOutBindList',
method: 'get',
params: query
})
}
// 获取未绑定的客户列表
export function getCustomerWithOutBindList(query) {
return request({
url: '/business/Shop/getCustomerWithOutBindList',
method: 'get',
params: query
})
}
// 获取经营类目列表(一级类目)
export function getFirstGoodsCategoryList(query) {
return request({
url: '/business/Shop/getFirstGoodsCategoryList',
method: 'get',
params: query
})
}
// 店铺新增或修改
export function addOrUpdateShop(data) {
return request({
url: '/business/Shop/addOrUpdateShop',
method: 'post',
data: data,
})
}
// 店铺删除
export function delShop(ids) {
return request({
url: '/business/Shop/'+ ids,
method: 'delete'
})
}
// 店铺导出
export function exportShop(query) {
return request({
url: 'business/Shop/exportShop',
method: 'get',
params: query
})
}
// 店铺审核
export function audit(data) {
return request({
url: 'business/Shop/audit',
method: 'put',
data: data
})
}

View File

@ -1,28 +0,0 @@
import request from '@/utils/request'
/**
* @Descripttion: 店详情Api接口
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
*/
// 获取商户店铺详情
export function getShopOperatorDetail(query) {
return request({
url: '/business/Shop/getShopOperatorDetail',
method: 'get',
params: query
})
}
// 编辑店铺详情
export function editShopOperatorDetail(data) {
return request({
url: '/business/Shop/editShopOperatorDetail',
method: 'post',
data: data,
})
}

View File

@ -1,171 +0,0 @@
<!--
* @Descripttion: (客户收货地址/tb_customer_address 添加弹窗)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-06-05)
* @LastEditors: (admin)
* @LastEditTime: (2023-06-05)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加客户收货地址信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerNickname">
<el-input v-model='formData.customerNickname' disabled type="text" placeholder='点击选择客户'>
<template #append>
<div @click="handleChooseCustomer">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="所在地区" prop="customerAddressAreaId">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'regionId', label: 'regionName', emitPath: true }"
placeholder="请选择所在地区" clearable v-model="formData.customerAddressAreaId" @change="handleCascaderChange">
<template #default="{ node, data }">
<span>{{ data.regionName }}</span>
<!-- <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> -->
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货人名称" prop="customerAddressName">
<el-input v-model="formData.customerAddressName" placeholder="请输入收货人名称" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货电话" prop="customerAddressPhone">
<el-input v-model="formData.customerAddressPhone" placeholder="请输入收货电话" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详细地址" prop="customerAddressDetailed">
<el-input v-model="formData.customerAddressDetailed" type="textarea" :rows="8" placeholder="请输入详细地址" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择客户 -->
<ChooseCustomerDialog v-model="ChooseCustomerDialogVisible" :data="ChooseCustomerDialogRow"></ChooseCustomerDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateCustomerAddress } from '@/api/business/Custom/CustomerAddresses/customerAddress.js';
import { regionTreeList } from '@/api/business/Custom/Regions/region.js';
import ChooseCustomerDialog from '@/views/business/components/ChooseCustomerDialog.vue';
//
const openDialog = async () => {
await getTreeList()
}
// -
const dataList = ref([])
const ChooseCustomerDialogVisible = ref(false);
const ChooseCustomerDialogRow = ref({});
// -
//
async function getTreeList() {
regionTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
const handleChooseCustomer = () => {
ChooseCustomerDialogVisible.value = true
ChooseCustomerDialogRow.value = formData
}
//
function handleCascaderChange(selectedValues) {
formData.customerAddressProvinceId = selectedValues[0]
formData.customerAddressCityId = selectedValues[1]
formData.customerAddressAreaId = selectedValues[2]
}
// -
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "CustomerAddress"
})
//
const rules = reactive({
customerNickname: [{ required: true, message: "客户不能为空", trigger: "blur" }],
customerAddressAreaId: [{ required: true, message: "所在地区不能为空", trigger: "blur" }],
customerAddressName: [{ required: true, message: "收货人名称不能为空", trigger: "blur" }],
customerAddressPhone: [{ required: true, message: "收货电话不能为空", trigger: "blur" }],
customerAddressDetailed: [{ required: true, message: "详细地址不能为空", trigger: "blur" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateCustomerAddress(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
formData.customerNickname = ""
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,117 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="选择客户" width="900px" @closed="closeDialog" @open="openDialog">
<el-form inline :model="queryParams">
<el-form-item label="客户名称">
<el-input v-model='queryParams.customerNickname' placeholder='请输入客户名称'></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="tableRef.reload()" icon="ElIconSearch">
搜索
</el-button>
</el-form-item>
</el-form>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="customersList" ref="tableRef" border highlight-current-row
@row-click="handleRowClick">
<el-table-column prop="customerNickname" label="客户名称" align="left" :show-overflow-tooltip="true" />
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getCustomerListFun" />
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleEditClick()">添加</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch, nextTick } from 'vue';
import { ElMessage } from 'element-plus'
import { customerList } from '@/api/business/Custom/Customers/customer.js'
//
const total = ref(0)
const loading = ref(false)
//
const tableRef = ref(null);
//
const queryParams = reactive({
customerNickname: "",
pageNum: 1,
pageSize: 10
});
const emits = defineEmits(['update:modelValue']);
const props = defineProps({
modelValue: Boolean,
data: Object,
});
const formData = ref({
...props.data
});
let customersList = ref([]);
//
const openDialog = async () => {
await getCustomerListFun()
}
const getCustomerListFun = async () => {
loading.value = true
await customerList(queryParams).then((res) => {
if (res.code == 200) {
customersList.value = res.data.result
total.value = res.data.totalNum
loading.value = false
}
})
}
watch(props, (v) => {
formData.value = v.data;
});
// -
let customerNickname = ref("");
let customerGuid = ref("");
// -
//
const handleRowClick = (row) => {
customerNickname.value = row.customerNickname
customerGuid.value = row.customerGuid
}
const closeDialog = () => {
customerNickname.value = ""
emits('update:modelValue', false);
};
//
const handleEditClick = async () => {
if (customerNickname.value !== "") {
formData.value.customerNickname = customerNickname.value
formData.value.customerAddressCustomerGuid = customerGuid.value
if (formData.value.customerNickname != null) {
closeDialog();
}
} else {
ElMessage.error("请选择客户")
return;
}
};
const handleResetClick = async formEl => {
};
</script>

View File

@ -1,124 +0,0 @@
<!--
* @Descripttion: (客户收货地址/tb_customer_address 详情弹窗)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-06-05)
* @LastEditors: (admin)
* @LastEditTime: (2023-06-05)
-->
<template>
<el-dialog v-model="props.modelValue" title="客户收货地址信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerNickname">
<div>{{ formData.customerName }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="所在地区" prop="region">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'regionId', label: 'regionName', emitPath: true }"
clearable v-model="region[2]" @change="handleCascaderChange">
<template #default="{ node, data }">
<span>{{ data.regionName }}</span>
<!-- <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> -->
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货人名称" prop="customerAddressName">
<el-input v-model="formData.customerAddressName" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货电话" prop="customerAddressPhone">
<el-input v-model="formData.customerAddressPhone" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详细地址" prop="customerAddressDetailed">
<el-input v-model="formData.customerAddressDetailed" type="textarea" :rows="5" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import { regionTreeList } from '@/api/business/Custom/Regions/region.js';
//
const openDialog = async () => {
await getTreeList()
region.value.push(formData.value.customerAddressProvinceId)
region.value.push(formData.value.customerAddressCityId)
region.value.push(formData.value.customerAddressAreaId)
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
const region = ref([])
const dataList = ref([])
// -
//
async function getTreeList() {
regionTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
function handleCascaderChange(selectedValues) {
formData.value.customerAddressProvinceId = selectedValues[0]
formData.value.customerAddressCityId = selectedValues[1]
formData.value.customerAddressAreaId = selectedValues[2]
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,170 +0,0 @@
<!--
* @Descripttion: (客户收货地址/tb_customer_address 编辑弹窗)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-06-05)
* @LastEditors: (admin)
* @LastEditTime: (2023-06-05)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改客户收货地址信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户">
<div>{{ formData.customerName }}</div>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="所在地区" prop="customerAddressAreaId">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'regionId', label: 'regionName', emitPath: true }"
placeholder="请选择所在地区" clearable v-model="region[2]" @change="handleCascaderChange">
<template #default="{ node, data }">
<span>{{ data.regionName }}</span>
<!-- <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span> -->
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货人名称" prop="customerAddressName">
<el-input v-model="formData.customerAddressName" placeholder="请输入收货人名称" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货电话" prop="customerAddressPhone">
<el-input v-model="formData.customerAddressPhone" placeholder="请输入收货电话" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详细地址" prop="customerAddressDetailed">
<el-input v-model="formData.customerAddressDetailed" type="textarea" :rows="5" placeholder="请输入详细地址" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateCustomerAddress } from "@/api/business/Custom/CustomerAddresses/customerAddress.js";
import { regionTreeList } from '@/api/business/Custom/Regions/region.js';
//
const openDialog = async () => {
await getTreeList()
region.value.push(formData.value.customerAddressProvinceId)
region.value.push(formData.value.customerAddressCityId)
region.value.push(formData.value.customerAddressAreaId)
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
const region = ref([])
const dataList = ref([])
// -
//
async function getTreeList() {
regionTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
function handleCascaderChange(selectedValues) {
formData.value.customerAddressProvinceId = selectedValues[0]
formData.value.customerAddressCityId = selectedValues[1]
formData.value.customerAddressAreaId = selectedValues[2]
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "CustomerAddress"
})
//
const rules = reactive({
customerAddressAreaId: [{ required: true, message: "所在地区不能为空", trigger: "blur" }],
customerAddressName: [{ required: true, message: "收货人名称不能为空", trigger: "blur" }],
customerAddressPhone: [{ required: true, message: "收货电话不能为空", trigger: "blur" }],
customerAddressDetailed: [{ required: true, message: "详细地址不能为空", trigger: "blur" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateCustomerAddress(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,249 +0,0 @@
<!--
* @Descripttion: (客户收货地址/tb_customer_address)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-06-05)
* @LastEditors: (admin)
* @LastEditTime: (2023-06-05)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<!-- <el-form-item label="所在地区">
<el-cascader class="w100" :options="dataTreeList"
:props="{ checkStrictly: true, value: 'regionId', label: 'regionName', emitPath: true }"
placeholder="请选择所在地区" clearable v-model="queryParams.customerAddress" @change="handleCascaderChange">
<template #default="{ data }">
<span>{{ data.regionName }}</span>
</template>
</el-cascader>
</el-form-item> -->
<el-form-item label="收货人名称" prop="customerAddressName">
<el-input v-model="queryParams.customerAddressName" placeholder="请输入收货人名称" clearable
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货电话" prop="customerAddressPhone">
<el-input v-model="queryParams.customerAddressPhone" placeholder="请输入收货电话" clearable
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:customeraddress:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:customeraddress:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport"
v-hasPermi="['business:customeraddress:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" border highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="customerName" label="客户" align="center" />
<el-table-column prop="customerAddress" label="所在地区" align="center" />
<el-table-column prop="customerAddressName" label="收货人名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="customerAddressPhone" label="收货电话" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="customerAddressDetailed" label="详细地址" align="center" :show-overflow-tooltip="true" />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:customeraddress:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:customeraddress:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="customeraddress">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportCustomerAddress, customerAddressList, delCustomerAddress } from '@/api/business/Custom/CustomerAddresses/customerAddress.js'
import { regionTreeList } from '@/api/business/Custom/Regions/region.js';
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
const dataTreeList = ref([])
//
//
async function getTreeList() {
regionTreeList().then((res) => {
if (res.code == 200) {
dataTreeList.value = res.data
}
})
}
//
function handleCascaderChange(selectedValues) {
console.log(selectedValues, '传参');
}
//
//
function getList() {
loading.value = true
customerAddressList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.customerAddressId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
// getTreeList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.customerAddressId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delCustomerAddress(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.customerAddressId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportCustomerAddress(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,179 +0,0 @@
<!--
* @Descripttion: (商品类目/tb_goods_category 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-12)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-12)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加商品类目信息" width="700px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上级菜单" prop="GoodsCategoryParentGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'goodsCategoryGuid', label: 'goodsCategoryName', emitPath: false }"
placeholder="请选择上级菜单" clearable v-model="formData.goodsCategoryParentGuid">
<template #default="{ node, data }">
<span>{{ data.goodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="goodsCategoryName">
<el-input v-model="formData.goodsCategoryName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="goodsCategoryImg">
<UploadImage ref="uploadRef" v-model="formData.goodsCategoryImg" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsCategoryDisplayStatus">
<el-radio-group v-model="formData.goodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue"
:label="parseInt(item.dictValue)">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否为热门" prop="goodsCategoryIsPopular">
<el-radio-group v-model="formData.goodsCategoryIsPopular">
<el-radio v-for="item in is_popular " :key="item.dictValue"
:label="parseInt(item.dictValue)">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="productCategorySort">
<el-input-number v-model.number="formData.productCategorySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { goodsCategoryTreeList, addOrUpdateGoodsCategory } from '@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js';
//
const openDialog = async () => {
await getdisplay_status()
await getis_popular()
await getTreeList()
}
// -
const dataList = ref([])
//
const display_status = ref([]);
//
const is_popular = ref([]);
// -
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
// -
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
goodsCategoryDisplayStatus: 1,
goodsCategoryIsPopular: 0,
productCategorySort: 100
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "GoodsCategory"
})
//
const rules = reactive({
goodsCategoryParentGuid: [{ required: true, message: "上级菜单不能为空", trigger: "blur", type: "number" }],
goodsCategoryName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
goodsCategoryDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
productCategorySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
async function getTreeList() {
goodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
watch(props, async (v) => {
});
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateGoodsCategory(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,136 +0,0 @@
<!--
* @Descripttion: (商品类目/tb_goods_category 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-12)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-12)
-->
<template>
<el-dialog v-model="props.modelValue" title="商品类目信息详情" width="700px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上级菜单" prop="GoodsCategoryParentGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'goodsCategoryGuid', label: 'goodsCategoryName', emitPath: false }"
clearable v-model="formData.goodsCategoryParentGuid">
<template #default="{ node, data }">
<span>{{ data.goodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="goodsCategoryName">
<el-input v-model="formData.goodsCategoryName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="goodsCategoryImg">
<UploadImage ref="uploadRef" v-model="formData.goodsCategoryImg" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsCategoryDisplayStatus">
<el-radio-group v-model="formData.goodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否为热门" prop="goodsCategoryIsPopular">
<el-radio-group v-model="formData.goodsCategoryIsPopular">
<el-radio v-for="item in is_popular " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="productCategorySort">
<el-input-number v-model.number="formData.productCategorySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import { goodsCategoryTreeList } from "@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js";
//
const openDialog = async () => {
await getdisplay_status()
await getis_popular()
await getTreeList()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
const dataList = ref([])
//
const display_status = ref([]);
//
const is_popular = ref([]);
// -
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
async function getTreeList() {
goodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,176 +0,0 @@
<!--
* @Descripttion: (商品类目/tb_goods_category 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-12)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-12)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改商品类目信息" width="700px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上级菜单" prop="GoodsCategoryParentGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'goodsCategoryGuid', label: 'goodsCategoryName', emitPath: false }"
placeholder="请选择上级菜单" clearable v-model="formData.goodsCategoryParentGuid">
<template #default="{ node, data }">
<span>{{ data.goodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="goodsCategoryName">
<el-input v-model="formData.goodsCategoryName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="goodsCategoryImg">
<UploadImage ref="uploadRef" v-model="formData.goodsCategoryImg" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsCategoryDisplayStatus">
<el-radio-group v-model="formData.goodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否为热门" prop="goodsCategoryIsPopular">
<el-radio-group v-model="formData.goodsCategoryIsPopular">
<el-radio v-for="item in is_popular " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="productCategorySort">
<el-input-number v-model.number="formData.productCategorySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { goodsCategoryTreeList, addOrUpdateGoodsCategory } from "@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js";
//
const openDialog = async () => {
await getdisplay_status()
await getis_popular()
await getTreeList()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
const dataList = ref([])
//
const display_status = ref([]);
//
const is_popular = ref([]);
// -
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "GoodsCategory"
})
//
const rules = reactive({
goodsCategoryParentGuid: [{ required: true, message: "上级菜单不能为空", trigger: "blur", type: "number" }],
goodsCategoryName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
goodsCategoryDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
productCategorySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
async function getTreeList() {
goodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateGoodsCategory(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,297 +0,0 @@
<!--
* @Descripttion: (商品类目/tb_goods_category)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-12)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-12)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="名称" prop="goodsCategoryName">
<el-input v-model="queryParams.goodsCategoryName" placeholder="请输入名称" clearable @keyup.enter="handleQuery"/>
</el-form-item>
<el-form-item label="显示状态" prop="goodsCategoryDisplayStatus">
<el-radio-group v-model="queryParams.goodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="是否为热门" prop="goodsCategoryIsPopular">
<el-radio-group v-model="queryParams.goodsCategoryIsPopular">
<el-radio v-for="item in is_popular " :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="info" plain icon="sort" @click="toggleExpandAll">展开/折叠</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:goodscategory:addOrUpdate']" plain icon="plus" @click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:goodscategory:delete']" plain icon="delete" @click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:goodscategory:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row @selection-change="handleSelectionChange" v-if="refreshTable" :default-expand-all="isExpandAll" row-key="goodsCategoryGuid" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="goodsCategoryName" label="名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="goodsCategoryImg" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain" :src="scope.row.goodsCategoryImg?.split(',')[0]" :preview-src-list="scope.row.goodsCategoryImg?.split(',')">
<div><el-icon :size="15"><document /></el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsCategoryDisplayStatus" label="显示状态" align="center">
<template #default="scope">
<dict-tag :options=" display_status " :value="scope.row.goodsCategoryDisplayStatus" />
</template>
</el-table-column>
<el-table-column prop="goodsCategoryIsPopular" label="是否为热门" align="center">
<template #default="scope">
<dict-tag :options=" is_popular " :value="scope.row.goodsCategoryIsPopular" />
</template>
</el-table-column>
<el-table-column prop="productCategorySort" label="排序" align="center" sortable />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:goodscategory:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:goodscategory:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="goodscategory">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportGoodsCategory, goodsCategoryTreeList , delGoodsCategory } from '@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
//
const isExpandAll = ref(true)
const refreshTable = ref(true)
const data = reactive({
form: {},
queryParams: {
},
})
const { queryParams } = toRefs(data)
//
//
//
const display_status = ref([]);
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
getdisplay_status()
//
const is_popular = ref([]);
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
getis_popular()
//
//
function selectChild(str, tag, res, parent) {
isExpandAll.value = true
for (let item of tag) {
if (item.goodsCategoryName.indexOf(str) !== -1) {
if (parent) {
res.push(parent)
} else {
res.push(item)
}
} else if (item.children && item.children.length) {
selectChild(str, item.children, res, parent || item)
}
}
}
//
function getList() {
loading.value = true
goodsCategoryTreeList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false
if (queryParams.value.goodsCategoryName == undefined) {
isExpandAll.value = false
dataList.value = res.data
} else {
dataList.value = []
selectChild(queryParams.value.goodsCategoryName, res.data, dataList.value)
}
total.value = res.data.totalNum
}
})
}
// /
function toggleExpandAll() {
refreshTable.value = false
isExpandAll.value = !isExpandAll.value
nextTick(() => {
refreshTable.value = true
})
}
// goodsCategoryList(queryParams.value).then((res) => {
// if (res.code == 200) {
// loading.value = false;
// dataList.value = res.data.result;
// total.value = res.data.totalNum;
// }
// });
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.goodsCategoryId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.goodsCategoryId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delGoodsCategory(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.goodsCategoryId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportGoodsCategory(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,248 +0,0 @@
<!--
* @Descripttion: (商品评价/tb_goods_comment 添加弹窗)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-07-15)
* @LastEditors: (admin)
* @LastEditTime: (2023-07-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加商品评价信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" placeholder='点击选择店铺'>
<template #append>
<div @click="handleChooseShop">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerGuid">
<el-input v-model='formData.customerNickname' disabled type="text" placeholder='点击选择客户'>
<template #append>
<div @click="handleChooseCustomer">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品" prop="goodsGuid">
<el-input v-model='formData.goodsName' disabled type="text" placeholder='点击选择商品'>
<template #append>
<div @click="handleChooseGoods">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="评分分数" prop="goodsCommentRating">
<el-rate v-model="formData.goodsCommentRating" allow-half />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="评价内容" prop="goodsCommentContent">
<el-input v-model="formData.goodsCommentContent" type="textarea" :rows="5" placeholder="请输入评价内容" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="评价图片" prop="goodsCommentImages">
<UploadImage ref="uploadRef" v-model="formData.goodsCommentImages" :data=imgData :limit="20" :fileSize="5"
:drag="true" :fileType="['mp4', 'avi', 'png', 'jpg', 'jpeg']" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsCommentStatus">
<el-radio-group v-model="formData.goodsCommentStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsCommentSort">
<el-input-number v-model.number="formData.goodsCommentSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)" :loading="loadingStatus">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择店铺 -->
<ChooseShopDialog v-model="ChooseShopDialogVisible" :data="ChooseShopDialogRow" :done="handelAddShop">
</ChooseShopDialog>
<!-- 选择客户 -->
<ChooseCustomerDialog v-model="ChooseCustomerDialogVisible" :data="ChooseCustomerDialogRow">
</ChooseCustomerDialog>
<!-- 选择商品 -->
<ChooseGoodsDialog v-model="ChooseGoodsDialogVisible" :data="ChooseGoodsDialogRow">
</ChooseGoodsDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import useUserStore from '@/store/modules/user'
import { addOrUpdateGoodsComment } from '@/api/business/GoodsManager/GoodsComments/goodsComment.js';
import ChooseShopDialog from '@/views/business/components/ChooseShopDialog.vue';
import ChooseCustomerDialog from '@/views/business/components/ChooseCustomerDialog.vue';
import ChooseGoodsDialog from '@/views/business/components/ChooseGoodsDialog.vue';
//
const openDialog = async () => {
await getrating_type()
await getrecover_status()
await getdisplay_status()
}
// -
// id
const userid = useUserStore().userId
//
const rating_type = ref([]);
//
const recover_status = ref([]);
//
const display_status = ref([]);
//
const ChooseShopDialogVisible = ref(false);
const ChooseShopDialogRow = ref({});
//
const ChooseCustomerDialogVisible = ref(false);
const ChooseCustomerDialogRow = ref({});
//
const ChooseGoodsDialogVisible = ref(false);
const ChooseGoodsDialogRow = ref({});
// -
//
async function getrating_type() {
await proxy.getDicts('rating_type').then((res) => {
rating_type.value = res.data
})
}
//
async function getrecover_status() {
await proxy.getDicts('recover_status').then((res) => {
recover_status.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
const handleChooseShop = () => {
ChooseShopDialogVisible.value = true
ChooseShopDialogRow.value = formData
}
//
async function handelAddShop() {
}
//
const handleChooseCustomer = () => {
ChooseCustomerDialogVisible.value = true
ChooseCustomerDialogRow.value = formData
}
//
const handleChooseGoods = () => {
if(!formData.shopGuid && userid == 1){
modal.msgError("请先选择店铺")
return
}
ChooseGoodsDialogVisible.value = true
ChooseGoodsDialogRow.value = formData
}
// -
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
goodsCommentStatus: 1,
goodsCommentSort: 100
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "GoodsComment"
})
//
const rules = reactive({
shopGuid: [{ required: true, message: "店铺不能为空", trigger: "blur" }],
customerGuid: [{ required: true, message: "客户不能为空", trigger: "blur" }],
goodsGuid: [{ required: true, message: "商品不能为空", trigger: "blur" }],
goodsCommentRating: [{ required: true, message: "评分分数不能为空", trigger: "blur",type: "number" }],
goodsCommentRatingType: [{ required: true, message: "评分类型不能为空", trigger: "change", type: "number" }],
goodsCommentContent: [{ required: true, message: "评价内容不能为空", trigger: "blur" }],
goodsCommentRecoverStatus: [{ required: true, message: "回复状态不能为空", trigger: "blur", type: "number" }],
goodsCommentStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
goodsCommentSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await addOrUpdateGoodsComment(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
loadingStatus.value = false
}
});
};
const closeDialog = () => {
formData.shopName = ""
formData.shopGuid = 0
formData.customerNickname = ""
formData.customerGuid = 0
formData.goodsName = ""
formData.goodsGuid = 0
formData.goodsCommentRating = 0
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,137 +0,0 @@
<!--
* @Descripttion: (商品评价/tb_goods_comment 详情弹窗)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-07-15)
* @LastEditors: (admin)
* @LastEditTime: (2023-07-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="商品评价信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerGuid">
<el-input v-model='formData.customerNickname' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品" prop="goodsGuid">
<el-input v-model='formData.goodsName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="评分分数" prop="goodsCommentRating">
<el-rate v-model="formData.goodsCommentRating" allow-half />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="评价内容" prop="goodsCommentContent">
<el-input v-model="formData.goodsCommentContent" type="textarea" :rows="5" placeholder="请输入评价内容" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="评价图片" prop="goodsCommentImages">
<UploadImage ref="uploadRef" v-model="formData.goodsCommentImages" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsCommentStatus">
<el-radio-group v-model="formData.goodsCommentStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsCommentSort">
<el-input-number v-model.number="formData.goodsCommentSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import useUserStore from '@/store/modules/user'
//
const openDialog = async () => {
await getrating_type()
await getrecover_status()
await getdisplay_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
// id
const userid = useUserStore().userId
//
const rating_type = ref([]);
//
const recover_status = ref([]);
//
const display_status = ref([]);
// -
//
async function getrating_type() {
await proxy.getDicts('rating_type').then((res) => {
rating_type.value = res.data
})
}
//
async function getrecover_status() {
await proxy.getDicts('recover_status').then((res) => {
recover_status.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,188 +0,0 @@
<!--
* @Descripttion: (商品评价/tb_goods_comment 编辑弹窗)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-07-15)
* @LastEditors: (admin)
* @LastEditTime: (2023-07-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改商品评价信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerGuid">
<el-input v-model='formData.customerNickname' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品" prop="goodsGuid">
<el-input v-model='formData.goodsName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="评分分数" prop="goodsCommentRating">
<el-rate v-model="formData.goodsCommentRating" allow-half />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="评价内容" prop="goodsCommentContent">
<el-input v-model="formData.goodsCommentContent" type="textarea" :rows="5" placeholder="请输入评价内容" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="评价图片" prop="goodsCommentImages">
<UploadImage ref="uploadRef" v-model="formData.goodsCommentImages" :data=imgData :limit="20" :fileSize="5"
:drag="true" :fileType="['mp4', 'avi', 'png', 'jpg', 'jpeg']" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsCommentStatus">
<el-radio-group v-model="formData.goodsCommentStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsCommentSort">
<el-input-number v-model.number="formData.goodsCommentSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import useUserStore from '@/store/modules/user'
import { addOrUpdateGoodsComment } from "@/api/business/GoodsManager/GoodsComments/goodsComment.js";
//
const openDialog = async () => {
await getrating_type()
await getrecover_status()
await getdisplay_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
// id
const userid = useUserStore().userId
//
const rating_type = ref([]);
//
const recover_status = ref([]);
//
const display_status = ref([]);
// -
//
async function getrating_type() {
await proxy.getDicts('rating_type').then((res) => {
rating_type.value = res.data
})
}
//
async function getrecover_status() {
await proxy.getDicts('recover_status').then((res) => {
recover_status.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "GoodsComment"
})
//
const rules = reactive({
shopGuid: [{ required: true, message: "店铺不能为空", trigger: "blur" }],
customerGuid: [{ required: true, message: "客户不能为空", trigger: "blur" }],
goodsGuid: [{ required: true, message: "商品不能为空", trigger: "blur" }],
goodsCommentRating: [{ required: true, message: "评分分数不能为空", trigger: "blur", type: "number" }],
goodsCommentRatingType: [{ required: true, message: "评分类型不能为空", trigger: "change", type: "number" }],
goodsCommentContent: [{ required: true, message: "评价内容不能为空", trigger: "blur" }],
goodsCommentRecoverStatus: [{ required: true, message: "回复状态不能为空", trigger: "blur", type: "number" }],
goodsCommentStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
goodsCommentSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await addOrUpdateGoodsComment(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
loadingStatus.value = false
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,100 +0,0 @@
<!--
* @Descripttion: (商品评价/tb_goods_comment 回复弹窗)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-07-17)
* @LastEditors: (admin)
* @LastEditTime: (2023-07-17)
-->
<template>
<el-dialog v-model="props.modelValue" title="回复商品评价" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="回复内容" prop="goodsCommentRecoverContent">
<el-input v-model.number="formData.goodsCommentRecoverContent" type="textarea" :rows="10" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleRecoverClick(formRef)" :loading="loadingStatus">确认</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import modal from '@/plugins/modal.js'
import { goodsCommentRecover } from '@/api/business/GoodsManager/GoodsComments/goodsComment.js';
//
const openDialog = async () => {
}
// -
// -
// -
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = ref({
...props.data,
});
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
const rules = reactive({
goodsCommentRecoverContent: [{ required: true, message: "回复内容不能为空", trigger: "blur" }],
});
// -
//
const handleRecoverClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
formData.value.goodsCommentId = props.data.goodsCommentId
const { code, data } = await goodsCommentRecover(formData.value);
if (code == 200) {
modal.msgSuccess(data)
closeDialog();
loadingStatus.value = false
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,308 +0,0 @@
<!--
* @Descripttion: (商品评价/tb_goods_comment)
* @version: (1.0)
* @Author: (admin)
* @Date: (2023-07-15)
* @LastEditors: (admin)
* @LastEditTime: (2023-07-15)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="店铺" prop="shopName">
<el-input v-model.number="queryParams.shopName" placeholder="请输入店铺" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="商品" prop="goodsName">
<el-input v-model.number="queryParams.goodsName" placeholder="请输入商品" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="评分类型" prop="goodsCommentRatingType">
<el-select v-model="queryParams.goodsCommentRatingType" placeholder="请选择评分类型" clearable @change="handleQuery">
<el-option v-for="item in rating_type " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="回复状态" prop="GoodsCommentRecoverStatus">
<el-select v-model="queryParams.GoodsCommentRecoverStatus" placeholder="请选择回复状态" clearable
@change="handleQuery">
<el-option v-for="item in recover_status " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="显示状态" prop="goodsCommentStatus">
<el-radio-group v-model="queryParams.goodsCommentStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="item.dictValue">{{ item.dictLabel
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:goodscomment:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:goodscomment:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<!-- <el-table-column prop="shopName" label="店铺名称" align="center" :show-overflow-tooltip="true" /> -->
<el-table-column prop="goodsInfo" width="350" label="商品信息" align="center">
<template #default="scope">
<div class="goods-info-box">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]" :preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
<div class="goods-info-text">
{{ scope.row.goodsName }}
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="goodsCommentRating" label="评分分数" align="center" sortable>
<template #default="scope">
<el-rate v-model="scope.row.goodsCommentRating" allow-half disabled />
</template>
</el-table-column>
<el-table-column prop="goodsCommentContent" width="350" label="评价内容" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="goodsCommentImages" label="评价图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsCommentImages?.split(',')[0]"
:preview-src-list="scope.row.goodsCommentImages?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsCommentRatingType" label="评分类型" align="center">
<template #default="scope">
<dict-tag :options="rating_type" :value="scope.row.goodsCommentRatingType" />
</template>
</el-table-column>
<el-table-column prop="goodsCommentRecoverStatus" label="回复状态" align="center">
<template #default="scope">
<dict-tag :options="recover_status" :value="scope.row.goodsCommentRecoverStatus" />
</template>
</el-table-column>
<el-table-column prop="goodsCommentStatus" label="显示状态" align="center">
<template #default="scope">
<dict-tag :options="display_status" :value="scope.row.goodsCommentStatus" />
</template>
</el-table-column>
<el-table-column prop="goodsCommentSort" label="排序" align="center" sortable />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="warning" v-if="scope.row.goodsCommentRecoverStatus == 1" size="small" icon="check"
@click="handleRecover(scope.row)" v-hasPermi="['business:goodscomment:recover']">回复</el-button>
<el-button type="warning" v-if="scope.row.goodsCommentRecoverStatus == 2" size="small" icon="check"
@click="handleRecover(scope.row)" v-hasPermi="['business:goodscomment:recover']">编辑回复</el-button>
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:goodscomment:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:goodscomment:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
<!-- 回复 -->
<RecoverDialog v-model="RecoverDialogVisible" :data="RecoverDialogRow" :done="() => resetQuery()"></RecoverDialog>
</template>
<script setup name="goodscomment">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { goodsCommentList, delGoodsComment } from '@/api/business/GoodsManager/GoodsComments/goodsComment.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
import RecoverDialog from "./components/RecoverDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const RecoverDialogVisible = ref(false);
const RecoverDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
//
//
const rating_type = ref([]);
async function getrating_type() {
await proxy.getDicts('rating_type').then((res) => {
rating_type.value = res.data
})
}
getrating_type()
//
const recover_status = ref([]);
async function getrecover_status() {
await proxy.getDicts('recover_status').then((res) => {
recover_status.value = res.data
})
}
getrecover_status()
//
const display_status = ref([]);
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
getdisplay_status()
//
//
function getList() {
loading.value = true
goodsCommentList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.goodsCommentId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.goodsCommentId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delGoodsComment(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
//
function handleRecover(row) {
RecoverDialogVisible.value = true
RecoverDialogRow.value = row
}
handleQuery()
</script>
<style>
.goods-info-box {
display: flex;
justify-content: space-between;
}
.goods-info-text {
width: 250px;
}
</style>

View File

@ -1,176 +0,0 @@
<!--
* @Descripttion: (商品服务与承诺/tb_goods_services 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加服务与承诺信息" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20" v-if="userid == 1">
<el-col :lg="18">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" placeholder='点击选择店铺'>
<template #append>
<div @click="handleChooseShop">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="服务名称" prop="goodsServicesName">
<el-input v-model="formData.goodsServicesName" placeholder="请输入服务名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="概述" prop="goodsServicesSummary">
<el-input v-model="formData.goodsServicesSummary" type="textarea" :rows="5" placeholder="请输入概述" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否默认" prop="goodsServicesIsDefault">
<el-radio-group v-model="formData.goodsServicesIsDefault">
<el-radio v-for="item in is_default " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsServicesDisplayStatus">
<el-radio-group v-model="formData.goodsServicesDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsServicesSort">
<el-input-number v-model.number="formData.goodsServicesSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择店铺 -->
<ChooseShopDialog v-model="ChooseShopDialogVisible" :data="ChooseShopDialogRow"></ChooseShopDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateGoodsServices } from '@/api/business/GoodsManager/GoodsServicess/goodsServices.js';
import useUserStore from '@/store/modules/user'
import ChooseShopDialog from '@/views/business/components/ChooseShopDialog.vue';
//
const openDialog = async () => {
await getis_default()
await getdisplay_status()
}
// -
//
const is_default = ref([]);
//
const display_status = ref([]);
//
const ChooseShopDialogVisible = ref(false);
const ChooseShopDialogRow = ref({});
const userid = useUserStore().userId
// -
//
async function getis_default() {
await proxy.getDicts('is_default').then((res) => {
is_default.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
const handleChooseShop = () => {
ChooseShopDialogVisible.value = true
ChooseShopDialogRow.value = formData
}
// -
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
goodsServicesIsDefault: 0,
goodsServicesDisplayStatus: 1,
goodsServicesSort: 100,
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "GoodsServices"
})
//
const rules = reactive({
shopGuid: [{ required: true, message: "店铺不能为空", trigger: "blur"}],
goodsServicesName: [{ required: true, message: "服务名称不能为空", trigger: "blur" }],
goodsServicesIsDefault: [{ required: true, message: "是否默认不能为空", trigger: "blur", type: "number" }],
goodsServicesDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
goodsServicesSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateGoodsServices(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,123 +0,0 @@
<!--
* @Descripttion: (商品服务与承诺/tb_goods_services 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<el-dialog v-model="props.modelValue" title="商品服务与承诺信息详情" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20" v-if="userid == 1">
<el-col :lg="18">
<el-form-item :label-width="labelWidth" label="店铺">
<el-input v-model='formData.shopName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="服务名称" >
<el-input v-model="formData.goodsServicesName" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="概述" >
<el-input v-model="formData.goodsServicesSummary" type="textarea" :rows="5" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否默认" >
<el-radio-group v-model="formData.goodsServicesIsDefault">
<el-radio v-for="item in is_default " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="显示状态" >
<el-radio-group v-model="formData.goodsServicesDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsServicesSort">
<el-input-number v-model.number="formData.goodsServicesSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import useUserStore from '@/store/modules/user'
//
const openDialog = async () => {
await getis_default()
await getdisplay_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
//
const is_default = ref([]);
//
const display_status = ref([]);
const userid = useUserStore().userId
// -
//
async function getis_default() {
await proxy.getDicts('is_default').then((res) => {
is_default.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,164 +0,0 @@
<!--
* @Descripttion: (商品服务与承诺/tb_goods_services 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改商品服务与承诺信息" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20" v-if="userid == 1">
<el-col :lg="18">
<el-form-item :label-width="labelWidth" label="店铺">
<el-input v-model='formData.shopName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="服务名称" prop="goodsServicesName">
<el-input v-model="formData.goodsServicesName" placeholder="请输入服务名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="概述" prop="goodsServicesSummary">
<el-input v-model="formData.goodsServicesSummary" type="textarea" :rows="5" placeholder="请输入概述" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否默认" prop="goodsServicesIsDefault">
<el-radio-group v-model="formData.goodsServicesIsDefault">
<el-radio v-for="item in is_default " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="显示状态" prop="goodsServicesDisplayStatus">
<el-radio-group v-model="formData.goodsServicesDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsServicesSort">
<el-input-number v-model.number="formData.goodsServicesSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateGoodsServices } from "@/api/business/GoodsManager/GoodsServicess/goodsServices.js";
import useUserStore from '@/store/modules/user'
//
const openDialog = async () => {
await getis_default()
await getdisplay_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
//
const is_default = ref([]);
//
const display_status = ref([]);
const userid = useUserStore().userId
// -
//
async function getis_default() {
await proxy.getDicts('is_default').then((res) => {
is_default.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "GoodsServices"
})
//
const rules = reactive({
goodsServicesName: [{ required: true, message: "服务名称不能为空", trigger: "blur" }],
goodsServicesIsDefault: [{ required: true, message: "是否默认不能为空", trigger: "blur", type: "number" }],
goodsServicesDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
goodsServicesSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateGoodsServices(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,263 +0,0 @@
<!--
* @Descripttion: (商品服务与承诺/tb_goods_services)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="店铺名称" prop="shopName" v-if="userid == 1">
<el-input v-model="queryParams.shopName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="服务名称" prop="goodsServicesName">
<el-input v-model="queryParams.goodsServicesName" placeholder="请输入服务名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="是否默认" prop="goodsServicesIsDefault">
<el-radio-group v-model="queryParams.goodsServicesIsDefault">
<el-radio v-for="item in is_default " :key="item.dictValue"
:label="item.dictValue">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="显示状态" prop="goodsServicesDisplayStatus">
<el-radio-group v-model="queryParams.goodsServicesDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue"
:label="item.dictValue">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:goodsservices:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:goodsservices:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport"
v-hasPermi="['business:goodsservices:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<!-- <el-table-column prop="shopName" label="店铺名称" align="center" :show-overflow-tooltip="true" /> -->
<el-table-column prop="goodsServicesName" label="服务名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="goodsServicesSummary" label="概述" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="goodsServicesIsDefault" label="是否默认" align="center">
<template #default="scope">
<dict-tag :options="is_default" :value="scope.row.goodsServicesIsDefault" />
</template>
</el-table-column>
<el-table-column prop="goodsServicesDisplayStatus" label="显示状态" align="center">
<template #default="scope">
<dict-tag :options="display_status" :value="scope.row.goodsServicesDisplayStatus" />
</template>
</el-table-column>
<el-table-column prop="goodsServicesSort" label="排序" align="center" sortable />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:goodsservices:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:goodsservices:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="goodsservices">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportGoodsServices, goodsServicesList, delGoodsServices } from '@/api/business/GoodsManager/GoodsServicess/goodsServices.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
import useUserStore from '@/store/modules/user'
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
const userid = useUserStore().userId
//
//
const is_default = ref([]);
async function getis_default() {
await proxy.getDicts('is_default').then((res) => {
is_default.value = res.data
})
}
getis_default()
//
const display_status = ref([]);
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
getdisplay_status()
//
//
function getList() {
loading.value = true
goodsServicesList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.goodsServicesId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.goodsServicesId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delGoodsServices(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.goodsServicesId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportGoodsServices(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,666 +0,0 @@
<!--
* @Descripttion: (商品/tb_goods 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-19)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-19)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加商品信息" width="1200px" @closed="closeDialog" @open="openDialog">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="基本信息" name="base">
<el-form ref="baseFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" placeholder='点击选择店铺'>
<template #append>
<div @click="handleChooseShop">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品类目" prop="shopGoodsCategoryGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'shopGoodsCategoryGuid', label: 'shopGoodsCategoryName', emitPath: false }"
placeholder="请选择商品类目" clearable v-model="formData.shopGoodsCategoryGuid">
<template #default="{ node, data }">
<span>{{ data.shopGoodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="goodsName">
<el-input v-model="formData.goodsName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="编码" prop="goodsCoding">
<el-input v-model="formData.goodsCoding" placeholder="请输入编码" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="goodsPicture">
<UploadImage ref="uploadRef" v-model="formData.goodsPicture" :data=imgData :limit="10" :fileSize="5"
:drag="true" :isShowTip="false" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="配送模板" prop="deliveryGuid">
<el-select v-model="formData.deliveryGuid" placeholder="请选择配送模板">
<el-option v-for="item in deliveryDataList" :key="item.deliveryId" :label="item.deliveryName"
:value="item.deliveryGuid" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上下架状态" prop="goodsShelfStatus">
<el-radio-group v-model="formData.goodsShelfStatus">
<el-radio v-for="item in shelf_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsSort">
<el-input-number v-model.number="formData.goodsSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="规格/库存" name="sku">
<el-form ref="skuFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="规格类型" prop="goodsSpecType">
<el-radio-group v-model="formData.goodsSpecType">
<el-radio v-for="item in spec_type " :key="item.dictValue" :label="parseInt(item.dictValue)"
@change="handleChangeSpecType">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.goodsSpecType == 1">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品价格" prop="goodsPriceLowest">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsPriceLowest" controls-position="right" :min="0.01"
:precision="2" />
<span style="margin-left: 10px;"></span>
<div class="input-intro">商品的实际购买金额最低0.01</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="划线价格" prop="goodsDashedPriceLowest">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsDashedPriceLowest" controls-position="right" :min="0"
:precision="2" />
<span style="margin-left: 10px;"></span>
<div class="input-intro">划线价仅用于商品页展示</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="库存总量" prop="goodsTotalInventory">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsTotalInventory" controls-position="right" :min="0" />
<span style="margin-left: 10px;"></span>
<div class="input-intro">商品的实际库存数量为0时用户无法下单</div>
</div>
</el-form-item>
</el-col>
<!-- TODO: Sku单个 -->
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品重量" prop="">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsWeight" controls-position="right" :min="0"
:precision="2" />
<span style="margin-left: 10px;">Kg</span>
<div class="input-intro">商品的实际重量用于计算运费</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth + 20" label="库存计算方式" prop="goodsDeductStockType">
<el-radio-group v-model="formData.goodsDeductStockType">
<el-radio v-for="item in deduct_stock_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.goodsSpecType == 2">
<el-col :lg="24">
<MultiSpec v-model="formData" :isAdd="true"></MultiSpec>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="商品详情" name="detail">
<el-form ref="detailFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详情" prop="goodsDetails">
<div class="copy-btn-box">
<el-button @click="handleCopyRichText" class="copy-btn">获取富文本内容</el-button>
</div>
<editor v-model="formData.goodsDetails" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="更多设置" name="more">
<el-form ref="moreFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品卖点" prop="goodsSellingPoint">
<el-input v-model="formData.goodsSellingPoint" placeholder="请输入商品卖点" />
<div class="input-intro">一句话简述例如此款商品美观大方 性价比较高 不容错过</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="服务与承诺" prop="goodsServicesIds">
<el-select v-model="formData.goodsServicesIds" multiple placeholder="请选择服务与承诺">
<el-option v-for="item in goodsServicesDataList" :key="item.goodsServicesId"
:label="item.goodsServicesName" :value="item.goodsServicesId" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="主图视频" prop="goodsMainImageVideo">
<div style="display: block;">
<UploadFile v-model="formData.goodsMainImageVideo" :limit="1" :fileSize="100" :data=imgData
:isShowTip="false" />
<div class="input-intro">建议视频宽高比19:9建议时长8-45</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="视频封面" prop="goodsVideoCover">
<div style="display: block;">
<UploadImage ref="uploadRef" v-model="formData.goodsVideoCover" :data=imgData :limit="1" :fileSize="5"
:drag="true" :isShowTip="false" />
<div class="input-intro">建议尺寸750像素*750像素</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="初始销量" prop="goodsSalesInitial">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsSalesInitial" controls-position="right" :min="0" />
<div class="input-intro">用户端展示的销量 = 初始销量 + 实际销量</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-divider content-position="left">
<div class="divider-title">积分设置</div>
</el-divider>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="积分赠送" prop="goodsIsPointsGift">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsPointsGift">
<el-radio v-for="item in is_points_gift " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">开启后用户购买此商品将获得积分</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="积分抵扣" prop="goodsIsPointsDiscount">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsPointsDiscount">
<el-radio v-for="item in is_points_discount " :key="item.dictValue"
:label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">开启后用户购买此商品可以使用积分进行抵扣</div>
</div>
</el-form-item>
</el-col>
<!-- <el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣设置(0默认抵扣 1单独设置抵扣)" prop="goodsIsAlonePointsDiscount">
<el-radio-group v-model="formData.goodsIsAlonePointsDiscount">
<el-radio v-for="item in is_alone_points_discount " :key="item.dictValue"
:label="parseInt(item.dictValue)">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col> -->
<!-- <el-col :lg="12">
<el-form-item :label-width="labelWidth" label="单独设置积分抵扣的配置" prop="goodsPointsDiscountConfig">
<el-input v-model="formData.goodsPointsDiscountConfig" placeholder="请输入单独设置积分抵扣的配置" />
</el-form-item>
</el-col> -->
</el-row>
<el-divider content-position="left">
<div class="divider-title">会员折扣设置</div>
</el-divider>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="会员折扣" prop="goodsIsEnableGrade">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsEnableGrade">
<el-radio v-for="item in is_enable_grade " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">开启后会员折扣会员购买此商品可以享受会员等级折扣价</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="会员折扣设置" prop="goodsIsAloneGrade">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsAloneGrade">
<el-radio v-for="item in is_alone_grade " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">默认折扣默认为用户所属会员等级的折扣率</div>
</div>
</el-form-item>
</el-col>
<!-- <el-col :lg="12">
<el-form-item :label-width="labelWidth" label="单独设置折扣的配置" prop="goodsAloneGradeEquity">
<el-input v-model="formData.goodsAloneGradeEquity" placeholder="请输入单独设置折扣的配置" />
</el-form-item>
</el-col> -->
</el-row>
</el-form>
</el-tab-pane>
</el-tabs>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick()" :loading="loadingStatus">添加</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择店铺 -->
<ChooseShopDialog v-model="ChooseShopDialogVisible" :data="ChooseShopDialogRow" :done="handelAddShop">
</ChooseShopDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateGoods } from '@/api/business/GoodsManager/Goodss/goods.js';
import { shopGoodsCategoryTreeList } from '@/api/business/GoodsManager/ShopGoodsCategorys/shopGoodsCategory.js';
import { deliveryList } from '@/api/business/LogisticsManage/Deliverys/delivery.js'
import { goodsServicesList } from '@/api/business/GoodsManager/GoodsServicess/goodsServices.js'
import useUserStore from '@/store/modules/user'
import ChooseShopDialog from '@/views/business/components/ChooseShopDialog.vue';
import MultiSpec from './MultiSpec/MultiSpec.vue';
//
const openDialog = async () => {
if (userid != 1) {
await getTreeList()
await getDeliveryList()
await getGoodsServicesList()
}
await getdeduct_stock_type()
await getspec_type()
await getis_points_gift()
await getis_points_discount()
await getis_alone_points_discount()
await getis_enable_grade()
await getis_alone_grade()
await getshelf_status()
}
// -
// (1 2)
const spec_type = ref([]);
// (1 2)
const deduct_stock_type = ref([]);
// (1 0)
const is_points_gift = ref([]);
// 使(1 0)
const is_points_discount = ref([]);
// (0 1)
const is_alone_points_discount = ref([]);
// (1 0)
const is_enable_grade = ref([]);
// (0 1)
const is_alone_grade = ref([]);
// (1 2)
const shelf_status = ref([]);
//
const activeName = ref('base')
//
const ChooseShopDialogVisible = ref(false);
const ChooseShopDialogRow = ref({});
// id
const userid = useUserStore().userId
//
const dataList = ref([])
//
const deliveryDataList = ref([])
//
const goodsServicesDataList = ref([])
// -
//
async function getspec_type() {
await proxy.getDicts('spec_type').then((res) => {
spec_type.value = res.data
})
}
//
async function getdeduct_stock_type() {
await proxy.getDicts('deduct_stock_type').then((res) => {
deduct_stock_type.value = res.data
})
}
//
async function getis_points_gift() {
await proxy.getDicts('is_points_gift').then((res) => {
is_points_gift.value = res.data
})
}
//
async function getis_points_discount() {
await proxy.getDicts('is_points_discount').then((res) => {
is_points_discount.value = res.data
})
}
//
async function getis_alone_points_discount() {
await proxy.getDicts('is_alone_points_discount').then((res) => {
is_alone_points_discount.value = res.data
})
}
//
async function getis_enable_grade() {
await proxy.getDicts('is_enable_grade').then((res) => {
is_enable_grade.value = res.data
})
}
//
async function getis_alone_grade() {
await proxy.getDicts('is_alone_grade').then((res) => {
is_alone_grade.value = res.data
})
}
//
async function getshelf_status() {
await proxy.getDicts('shelf_status').then((res) => {
shelf_status.value = res.data
})
}
//
const handleClick = (tab, event) => {
}
/** 基础信息 */
//
const handleChooseShop = () => {
ChooseShopDialogVisible.value = true
ChooseShopDialogRow.value = formData
}
//
async function handelAddShop() {
await getTreeList()
await getDeliveryList()
await getGoodsServicesList()
}
//
async function getTreeList() {
shopGoodsCategoryTreeList({ shopGuid: formData?.shopGuid }).then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
async function getDeliveryList() {
deliveryList({
pageNum: 1,
pageSize: 10000,
shopGuid: formData?.shopGuid
}).then((res) => {
if (res.code == 200) {
deliveryDataList.value = res.data.result
}
})
}
//
async function getGoodsServicesList() {
goodsServicesList({
pageNum: 1,
pageSize: 10000,
shopGuid: formData?.shopGuid
}).then((res) => {
if (res.code == 200) {
goodsServicesDataList.value = res.data.result
goodsServicesDataList.value.map((item) => {
if (item.goodsServicesIsDefault === 1) {
formData.goodsServicesIds.push(item.goodsServicesId)
}
})
}
})
}
async function handleCopyRichText() {
let text = await navigator.clipboard.writeText(formData.goodsDetails);
modal.msgSuccess("富文本内容复制成功")
}
//
const baseFormRef = ref();
//
const skuFormRef = ref();
//
const detailFormRef = ref();
//
const moreFormRef = ref();
// -
const loadingStatus = ref(false)
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
goodsServicesIds: [],
goodsSpecList: [],
skuList: [],
goodsSpecType: 1,
goodsDeductStockType: 2,
goodsPriceLowest: 1.00,
goodsTotalInventory: 100,
goodsSalesInitial: 0,
goodsShelfStatus: 1,
goodsSort: 100,
goodsIsPointsGift: 0,
goodsIsPointsDiscount: 0,
goodsIsEnableGrade: 0,
goodsIsAloneGrade: 0,
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "Goods"
})
//
const rules = reactive({
shopGuid: [{ required: true, message: "店铺不能为空", trigger: "blur" }],
shopGoodsCategoryGuid: [{ required: true, message: "商品类目不能为空", trigger: "blur" }],
goodsSpecType: [{ required: true, message: "规格类型不能为空", trigger: "blur" }],
deliveryGuid: [{ required: true, message: "配送模板不能为空", trigger: "blur" }],
goodsName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
goodsPicture: [{ required: true, message: "图片不能为空", trigger: "blur" }],
goodsPriceLowest: [{ required: true, message: "价格不能为空", trigger: "blur" }],
goodsTotalInventory: [{ required: true, message: "库存总量不能为空", trigger: "blur", type: "number" }],
goodsSalesInitial: [{ required: true, message: "初始销量不能为空", trigger: "blur", type: "number" }],
goodsDetails: [{ required: true, message: "详情不能为空", trigger: "blur" }],
goodsDeductStockType: [{ required: true, message: "库存计算方式不能为空", trigger: "blur", type: "number" }],
goodsIsPointsGift: [{ required: true, message: "是否赠送积分不能为空", trigger: "blur", type: "number" }],
goodsIsPointsDiscount: [{ required: true, message: "是否允许使用积分抵扣不能为空", trigger: "blur", type: "number" }],
goodsIsAlonePointsDiscount: [{ required: true, message: "积分抵扣设置不能为空", trigger: "blur", type: "number" }],
goodsIsEnableGrade: [{ required: true, message: "是否开启会员折扣不能为空", trigger: "blur", type: "number" }],
goodsIsAloneGrade: [{ required: true, message: "会员折扣设置不能为空", trigger: "blur", type: "number" }],
goodsShelfStatus: [{ required: true, message: "上下架状态不能为空", trigger: "blur", type: "number" }],
goodsSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
function getFormPromise(form) {
return new Promise((resolve) => {
form.validate((res) => {
resolve(res)
})
})
}
//
const handleAddClick = async () => {
console.log(formData, '表单提交');
Promise.all([baseFormRef.value, skuFormRef.value, detailFormRef.value, moreFormRef.value,].map(getFormPromise)).then(async (res) => {
const validateResult = res.every((item) => !!item)
if (validateResult) {
loadingStatus.value = true
if (formData.goodsServicesIds.length !== 0) {
formData.goodsServicesIds = formData.goodsServicesIds.join(',')
}
if (formData.goodsSpecType == 2) {
if (formData.goodsSpecList.length == 0) {
modal.msgError('商品规格不能为空!')
return
}
}
const { code } = await addOrUpdateGoods(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
loadingStatus.value = false
}
} else {
modal.msgError('表单未通过验证!')
}
});
};
const closeDialog = () => {
//
formData.shopName = ""
formData.shopGuid = null
dataList.value = []
deliveryDataList.value = []
activeName.value = 'base'
//
formData.goodsSpecList = []
formData.skuList = []
handleResetClick([baseFormRef.value, skuFormRef.value, detailFormRef.value, moreFormRef.value,]);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formElList) => {
if (!formElList) return;
formElList.forEach(item => {
item.resetFields();
});
};
</script>
<style>
.divider-title {
font-size: 18px;
}
.input-intro {
color: #8c8c8c;
font-size: 12px;
}
.el-divider {
margin: 50px 0;
}
.copy-btn-box{
width: 100%;
display: flex;
justify-content: right;
margin-bottom: 15px;
}
</style>

View File

@ -1,304 +0,0 @@
<!--
* @Descripttion: (商品/tb_goods 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-19)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-19)
-->
<template>
<el-dialog v-model="props.modelValue" title="商品信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="店铺guid" >
<el-input v-model="formData.shopGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品类目guid" >
<el-input v-model="formData.goodsCategoryGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品规格guid" >
<el-input v-model="formData.goodsSkuGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="配送模板guid" >
<el-input v-model="formData.deliveryGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" >
<el-input v-model="formData.goodsName" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="编码" >
<el-input v-model="formData.goodsCoding" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="主图视频" >
<UploadFile v-model="formData.goodsMainImageVideo" :data=imgData :isShowTip="false"/>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="视频封面" >
<UploadImage ref="uploadRef" v-model="formData.goodsVideoCover" :limit="1" :fileSize="5"
:drag="true" :isShowTip="false" :isDisabled="true"/>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="图片" >
<UploadImage ref="uploadRef" v-model="formData.goodsPicture" :limit="1" :fileSize="5"
:drag="true" :isShowTip="false" :isDisabled="true"/>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="价格(最低)" >
<el-input-number v-model.number="formData.goodsPriceLowest" controls-position="right" :precision="2" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="价格(最高)" >
<el-input-number v-model.number="formData.goodsPriceHighest" controls-position="right" :precision="2" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="划线价格(最低)" >
<el-input-number v-model.number="formData.goodsDashedPriceLowest" controls-position="right" :precision="2" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="库存总量" >
<el-input-number v-model.number="formData.goodsTotalInventory" controls-position="right" :precision="2" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="初始销量" >
<el-input-number v-model.number="formData.goodsSalesInitial" controls-position="right" :precision="2" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="实际销量" >
<el-input-number v-model.number="formData.goodsSalesActual" controls-position="right" :precision="2" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详情" >
<editor v-model="formData.goodsDetails" :editorConfig="{ readOnly: true }" :min-height="200" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="库存计算方式(1下单立减库存 2付款立减库存)" >
<el-radio-group v-model="formData.goodsDeductStockType">
<el-radio v-for="item in deduct_stock_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否赠送积分(1开启 0关闭)" >
<el-radio-group v-model="formData.goodsIsPointsGift">
<el-radio v-for="item in is_points_gift " :key="item.dictValue" :label="parseInt(item.dictValue)">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否允许使用积分抵扣(1允许 0不允许)" >
<el-radio-group v-model="formData.goodsIsPointsDiscount">
<el-radio v-for="item in is_points_discount " :key="item.dictValue" :label="parseInt(item.dictValue)">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣设置(0默认抵扣 1单独设置抵扣)" >
<el-radio-group v-model="formData.goodsIsAlonePointsDiscount">
<el-radio v-for="item in is_alone_points_discount " :key="item.dictValue" :label="parseInt(item.dictValue)">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="单独设置积分抵扣的配置" >
<el-input v-model="formData.goodsPointsDiscountConfig" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否开启会员折扣(1开启 0关闭)" >
<el-radio-group v-model="formData.goodsIsEnableGrade">
<el-radio v-for="item in is_enable_grade " :key="item.dictValue" :label="parseInt(item.dictValue)">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="会员折扣设置(0默认等级折扣 1单独设置折扣)" >
<el-radio-group v-model="formData.goodsIsAloneGrade">
<el-radio v-for="item in is_alone_grade " :key="item.dictValue" :label="parseInt(item.dictValue)">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="单独设置折扣的配置" >
<el-input v-model="formData.goodsAloneGradeEquity" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="上下架状态(1上架 2下架)" >
<el-radio-group v-model="formData.goodsShelfStatus">
<el-radio v-for="item in shelf_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" >
<el-input-number v-model.number="formData.goodsSort" controls-position="right" :precision="2" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
//
const openDialog = async () => {
await getdeduct_stock_type()
await getis_points_gift()
await getis_points_discount()
await getis_alone_points_discount()
await getis_enable_grade()
await getis_alone_grade()
await getshelf_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
// (1 2)
const deduct_stock_type = ref([]);
// (1 0)
const is_points_gift = ref([]);
// 使(1 0)
const is_points_discount = ref([]);
// (0 1)
const is_alone_points_discount = ref([]);
// (1 0)
const is_enable_grade = ref([]);
// (0 1)
const is_alone_grade = ref([]);
// (1 2)
const shelf_status = ref([]);
// -
//
async function getdeduct_stock_type() {
await proxy.getDicts('deduct_stock_type').then((res) => {
deduct_stock_type.value = res.data
})
}
//
async function getis_points_gift() {
await proxy.getDicts('is_points_gift').then((res) => {
is_points_gift.value = res.data
})
}
//
async function getis_points_discount() {
await proxy.getDicts('is_points_discount').then((res) => {
is_points_discount.value = res.data
})
}
//
async function getis_alone_points_discount() {
await proxy.getDicts('is_alone_points_discount').then((res) => {
is_alone_points_discount.value = res.data
})
}
//
async function getis_enable_grade() {
await proxy.getDicts('is_enable_grade').then((res) => {
is_enable_grade.value = res.data
})
}
//
async function getis_alone_grade() {
await proxy.getDicts('is_alone_grade').then((res) => {
is_alone_grade.value = res.data
})
}
//
async function getshelf_status() {
await proxy.getDicts('shelf_status').then((res) => {
shelf_status.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,648 +0,0 @@
<!--
* @Descripttion: (商品/tb_goods 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-19)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-19)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改商品信息" width="1200px" @closed="closeDialog" @open="openDialog">
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
<el-tab-pane label="基本信息" name="base">
<el-form ref="baseFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品类目" prop="shopGoodsCategoryGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'shopGoodsCategoryGuid', label: 'shopGoodsCategoryName', emitPath: false }"
placeholder="请选择商品类目" clearable v-model="formData.shopGoodsCategoryGuid">
<template #default="{ node, data }">
<span>{{ data.shopGoodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="goodsName">
<el-input v-model="formData.goodsName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="编码" prop="goodsCoding">
<el-input v-model="formData.goodsCoding" placeholder="请输入编码" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="goodsPicture">
<UploadImage ref="uploadRef" v-model="formData.goodsPicture" :data=imgData :limit="10" :fileSize="5"
:drag="true" :isShowTip="false" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="配送模板" prop="deliveryGuid">
<el-select v-model="formData.deliveryGuid" placeholder="请选择配送模板">
<el-option v-for="item in deliveryDataList" :key="item.deliveryId" :label="item.deliveryName"
:value="item.deliveryGuid" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上下架状态" prop="goodsShelfStatus">
<el-radio-group v-model="formData.goodsShelfStatus">
<el-radio v-for="item in shelf_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="goodsSort">
<el-input-number v-model.number="formData.goodsSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="规格/库存" name="sku">
<el-form ref="skuFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth + 20" label="库存计算方式" prop="goodsDeductStockType">
<el-radio-group v-model="formData.goodsDeductStockType">
<el-radio v-for="item in deduct_stock_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="规格类型" prop="goodsSpecType">
<el-radio-group v-model="formData.goodsSpecType" :disabled="formData.goodsShelfStatus == 1">
<el-radio v-for="item in spec_type " :key="item.dictValue" :label="parseInt(item.dictValue)"
@change="handleChangeSpecType">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.goodsSpecType == 1">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品价格" prop="goodsPriceLowest">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsPriceLowest" controls-position="right" :min="0.01"
:precision="2" :disabled="formData.goodsShelfStatus == 1" />
<span style="margin-left: 10px;"></span>
<div class="input-intro">商品的实际购买金额最低0.01</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="划线价格" prop="goodsDashedPriceLowest">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsDashedPriceLowest" controls-position="right" :min="0"
:precision="2" :disabled="formData.goodsShelfStatus == 1" />
<span style="margin-left: 10px;"></span>
<div class="input-intro">划线价仅用于商品页展示</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="库存总量" prop="goodsTotalInventory">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsTotalInventory" controls-position="right" :min="0"
:disabled="formData.goodsShelfStatus == 1" />
<span style="margin-left: 10px;"></span>
<div class="input-intro">商品的实际库存数量为0时用户无法下单</div>
</div>
</el-form-item>
</el-col>
<!-- TODO: Sku单个 -->
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品重量" prop="">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsWeight" controls-position="right" :min="0"
:precision="2" :disabled="formData.goodsShelfStatus == 1"/>
<span style="margin-left: 10px;">Kg</span>
<div class="input-intro">商品的实际重量用于计算运费</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-row v-if="formData.goodsSpecType == 2">
<el-col :lg="24">
<MultiSpec v-model="formData" :isAdd="formData.goodsShelfStatus == 2"></MultiSpec>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="商品详情" name="detail">
<el-form ref="detailFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详情" prop="goodsDetails">
<div class="copy-btn-box">
<el-button @click="handleCopyRichText" class="copy-btn">获取富文本内容</el-button>
</div>
<editor v-model="formData.goodsDetails" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-tab-pane>
<el-tab-pane label="更多设置" name="more">
<el-form ref="moreFormRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="商品卖点" prop="goodsSellingPoint">
<el-input v-model="formData.goodsSellingPoint" placeholder="请输入商品卖点" />
<div class="input-intro">一句话简述例如此款商品美观大方 性价比较高 不容错过</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="服务与承诺" prop="goodsServicesIds">
<el-select v-model="formData.goodsServicesIds" multiple placeholder="请选择服务与承诺">
<el-option v-for="item in goodsServicesDataList" :key="item.goodsServicesId"
:label="item.goodsServicesName" :value="item.goodsServicesId" />
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="主图视频" prop="goodsMainImageVideo">
<div style="display: block;">
<UploadFile v-model="formData.goodsMainImageVideo" :drag="true" :limit="10" :fileSize="100"
:data=imgData :isShowTip="false" />
<div class="input-intro">建议视频宽高比19:9建议时长8-45</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="视频封面" prop="goodsVideoCover">
<div style="display: block;">
<UploadImage ref="uploadRef" v-model="formData.goodsVideoCover" :data=imgData :limit="1" :fileSize="5"
:drag="true" :isShowTip="false" />
<div class="input-intro">建议尺寸750像素*750像素</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="初始销量" prop="goodsSalesInitial">
<div style="display: block;">
<el-input-number v-model.number="formData.goodsSalesInitial" controls-position="right" :min="0" />
<div class="input-intro">用户端展示的销量 = 初始销量 + 实际销量</div>
</div>
</el-form-item>
</el-col>
</el-row>
<el-divider content-position="left">
<div class="divider-title">积分设置</div>
</el-divider>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="积分赠送" prop="goodsIsPointsGift">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsPointsGift">
<el-radio v-for="item in is_points_gift " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">开启后用户购买此商品将获得积分</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="积分抵扣" prop="goodsIsPointsDiscount">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsPointsDiscount">
<el-radio v-for="item in is_points_discount " :key="item.dictValue"
:label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">开启后用户购买此商品可以使用积分进行抵扣</div>
</div>
</el-form-item>
</el-col>
<!-- <el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣设置(0默认抵扣 1单独设置抵扣)" prop="goodsIsAlonePointsDiscount">
<el-radio-group v-model="formData.goodsIsAlonePointsDiscount">
<el-radio v-for="item in is_alone_points_discount " :key="item.dictValue"
:label="parseInt(item.dictValue)">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col> -->
<!-- <el-col :lg="12">
<el-form-item :label-width="labelWidth" label="单独设置积分抵扣的配置" prop="goodsPointsDiscountConfig">
<el-input v-model="formData.goodsPointsDiscountConfig" placeholder="请输入单独设置积分抵扣的配置" />
</el-form-item>
</el-col> -->
</el-row>
<el-divider content-position="left">
<div class="divider-title">会员折扣设置</div>
</el-divider>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="会员折扣" prop="goodsIsEnableGrade">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsEnableGrade">
<el-radio v-for="item in is_enable_grade " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">开启后会员折扣会员购买此商品可以享受会员等级折扣价</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item label="会员折扣设置" prop="goodsIsAloneGrade">
<div style="display: block;">
<el-radio-group v-model="formData.goodsIsAloneGrade">
<el-radio v-for="item in is_alone_grade " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
<div class="input-intro">默认折扣默认为用户所属会员等级的折扣率</div>
</div>
</el-form-item>
</el-col>
<!-- <el-col :lg="12">
<el-form-item :label-width="labelWidth" label="单独设置折扣的配置" prop="goodsAloneGradeEquity">
<el-input v-model="formData.goodsAloneGradeEquity" placeholder="请输入单独设置折扣的配置" />
</el-form-item>
</el-col> -->
</el-row>
</el-form>
</el-tab-pane>
</el-tabs>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick()" :loading="loadingStatus">编辑</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateGoods, getCurrentGoodsServiceList, getGoodsSkuList } from "@/api/business/GoodsManager/Goodss/goods.js";
import { shopGoodsCategoryTreeList } from '@/api/business/GoodsManager/ShopGoodsCategorys/shopGoodsCategory.js';
import { deliveryList } from '@/api/business/LogisticsManage/Deliverys/delivery.js'
import { goodsServicesList } from '@/api/business/GoodsManager/GoodsServicess/goodsServices.js'
import useUserStore from '@/store/modules/user'
import MultiSpec from './MultiSpec/MultiSpec.vue';
//
const openDialog = async () => {
await getTreeList()
await getDeliveryList()
await getspec_type()
await getGoodsSkuListFun()
await getGoodsServicesList()
await getCurrentGoodsServiceListFun()
await getdeduct_stock_type()
await getis_points_gift()
await getis_points_discount()
await getis_alone_points_discount()
await getis_enable_grade()
await getis_alone_grade()
await getshelf_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
// (1 2)
const spec_type = ref([]);
// (1 2)
const deduct_stock_type = ref([]);
// (1 0)
const is_points_gift = ref([]);
// 使(1 0)
const is_points_discount = ref([]);
// (0 1)
const is_alone_points_discount = ref([]);
// (1 0)
const is_enable_grade = ref([]);
// (0 1)
const is_alone_grade = ref([]);
// (1 2)
const shelf_status = ref([]);
// id
const userid = useUserStore().userId
//
const activeName = ref('base')
//
const dataList = ref([])
//
const deliveryDataList = ref([])
//
const goodsServicesDataList = ref([])
//
const baseFormRef = ref();
//
const skuFormRef = ref();
//
const detailFormRef = ref();
//
const moreFormRef = ref();
// -
//
async function getspec_type() {
await proxy.getDicts('spec_type').then((res) => {
spec_type.value = res.data
})
}
//
async function getdeduct_stock_type() {
await proxy.getDicts('deduct_stock_type').then((res) => {
deduct_stock_type.value = res.data
})
}
//
async function getis_points_gift() {
await proxy.getDicts('is_points_gift').then((res) => {
is_points_gift.value = res.data
})
}
//
async function getis_points_discount() {
await proxy.getDicts('is_points_discount').then((res) => {
is_points_discount.value = res.data
})
}
//
async function getis_alone_points_discount() {
await proxy.getDicts('is_alone_points_discount').then((res) => {
is_alone_points_discount.value = res.data
})
}
//
async function getis_enable_grade() {
await proxy.getDicts('is_enable_grade').then((res) => {
is_enable_grade.value = res.data
})
}
//
async function getis_alone_grade() {
await proxy.getDicts('is_alone_grade').then((res) => {
is_alone_grade.value = res.data
})
}
//
async function getshelf_status() {
await proxy.getDicts('shelf_status').then((res) => {
shelf_status.value = res.data
})
}
//
async function getTreeList() {
shopGoodsCategoryTreeList({ shopGuid: formData.value?.shopGuid }).then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
async function getDeliveryList() {
deliveryList({
pageNum: 1,
pageSize: 10000,
shopGuid: formData.value?.shopGuid
}).then((res) => {
if (res.code == 200) {
deliveryDataList.value = res.data.result
}
})
}
//
async function getGoodsServicesList() {
goodsServicesList({
pageNum: 1,
pageSize: 10000,
shopGuid: formData.value?.shopGuid
}).then((res) => {
if (res.code == 200) {
goodsServicesDataList.value = res.data.result
}
})
}
//
async function getCurrentGoodsServiceListFun() {
getCurrentGoodsServiceList({
goodsGuid: formData.value?.goodsGuid
}).then((res) => {
if (res.code == 200) {
formData.value.goodsServicesIds = res.data
}
})
}
// sku
async function getGoodsSkuListFun() {
getGoodsSkuList({
goodsGuid: formData.value?.goodsGuid
}).then((res) => {
if (res.code == 200) {
formData.value.goodsSpecList = res.data.goodsSpecList
formData.value.skuList = res.data.skuList
console.log(formData.value.skuList, 'skuList');
}
})
}
async function handleCopyRichText() {
let text = await navigator.clipboard.writeText(formData.goodsDetails);
modal.msgSuccess("富文本内容复制成功")
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Goods"
})
//
const rules = reactive({
shopGuid: [{ required: true, message: "店铺不能为空", trigger: "blur" }],
shopGoodsCategoryGuid: [{ required: true, message: "商品类目不能为空", trigger: "blur" }],
goodsSpecType: [{ required: true, message: "规格类型不能为空", trigger: "blur" }],
deliveryGuid: [{ required: true, message: "配送模板不能为空", trigger: "blur" }],
goodsName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
goodsPicture: [{ required: true, message: "图片不能为空", trigger: "blur" }],
goodsPriceLowest: [{ required: true, message: "价格不能为空", trigger: "blur" }],
goodsTotalInventory: [{ required: true, message: "库存总量不能为空", trigger: "blur", type: "number" }],
goodsSalesInitial: [{ required: true, message: "初始销量不能为空", trigger: "blur", type: "number" }],
goodsDetails: [{ required: true, message: "详情不能为空", trigger: "blur" }],
goodsDeductStockType: [{ required: true, message: "库存计算方式不能为空", trigger: "blur", type: "number" }],
goodsIsPointsGift: [{ required: true, message: "是否赠送积分不能为空", trigger: "blur", type: "number" }],
goodsIsPointsDiscount: [{ required: true, message: "是否允许使用积分抵扣不能为空", trigger: "blur", type: "number" }],
goodsIsAlonePointsDiscount: [{ required: true, message: "积分抵扣设置不能为空", trigger: "blur", type: "number" }],
goodsIsEnableGrade: [{ required: true, message: "是否开启会员折扣不能为空", trigger: "blur", type: "number" }],
goodsIsAloneGrade: [{ required: true, message: "会员折扣设置不能为空", trigger: "blur", type: "number" }],
goodsShelfStatus: [{ required: true, message: "上下架状态不能为空", trigger: "blur", type: "number" }],
goodsSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
function getFormPromise(form) {
return new Promise((resolve) => {
form.validate((res) => {
resolve(res)
})
})
}
//
const handleEditClick = async () => {
Promise.all([baseFormRef.value, skuFormRef.value, detailFormRef.value, moreFormRef.value,].map(getFormPromise)).then(async (res) => {
const validateResult = res.every((item) => !!item)
if (validateResult) {
loadingStatus.value = true
if (formData.value.goodsServicesIds.length !== 0) {
formData.value.goodsServicesIds = formData.value.goodsServicesIds.join(',')
}
else {
formData.value.goodsServicesIds = ""
}
if (formData.value.goodsSpecType == 2) {
if (formData.value.goodsSpecList.length == 0) {
modal.msgError('商品规格不能为空!')
return
}
}
const { code } = await addOrUpdateGoods(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
loadingStatus.value = false
}
} else {
modal.msgError('表单未通过验证!')
}
});
}
const handleResetClick = async () => {
let formElList = [baseFormRef.value, skuFormRef.value, detailFormRef.value, moreFormRef.value]
if (!formElList) return;
formElList.forEach(item => {
item.resetFields();
});
};
const closeDialog = () => {
//
formData.value.shopName = ""
formData.value.shopGuid = null
dataList.value = []
deliveryDataList.value = []
activeName.value = 'base'
//
formData.value.goodsSpecList = []
formData.value.skuList = []
handleResetClick();
props.done();
emits("update:modelValue", false);
};
</script>
<style>
.divider-title {
font-size: 18px;
}
.input-intro {
color: #8c8c8c;
font-size: 12px;
}
.el-divider {
margin: 50px 0;
}
.copy-btn-box {
width: 100%;
display: flex;
justify-content: right;
margin-bottom: 15px;
}
</style>

View File

@ -1,562 +0,0 @@
<template>
<el-form-item :label-width="labelWidth" label="商品规格">
<div style="display: block;width: 100%;">
<!-- <el-input-number v-model.number="formData.goodsSpec" controls-position="right" :min="0.01"
:precision="2" /> -->
<el-alert v-if="isAdd" title="注意:上架商品后无法修改规格!请谨慎填写" type="warning " show-icon :closable="false" />
<div class="input-intro">最多添加3个商品规格组生成的SKU数量不能超出50个</div>
<!-- 规格样式 -->
<div class="sepc-big-box" v-for="(item, index) in goodsSpecList">
<div class="sepc-title-box">
<el-input v-model="item.specName" @change="handleChangeSepc(item, index)" class="spec-input" placeholder="规格组名称"
:clearable="isAdd" :disabled="!isAdd" />
<el-link type="primary" @click="handleDelSpec(item)" v-if="isAdd">删除规格组</el-link>
</div>
<div class="spec-value-box">
<div class="spec-value-input-big-box">
<div class="spec-value-input-box" v-for="specValue in item.props">
<div v-if="isAdd" class="spec-value-input-del" @click="handleDelSpecValue(item, specValue)"><el-icon>
<Close />
</el-icon></div>
<el-input v-model="specValue.specValueName" @change="handleChangeSepcValue()" class="spec-value-input"
placeholder="规格值名称" :disabled="!isAdd" :clearable="isAdd" />
</div>
</div>
<el-link type="primary" v-if="isAddSpecValueMax && isAdd" @click="handleAddSpecValue(item)">添加规格值</el-link>
</div>
</div>
<el-button v-if="isAddSpecMax && isAdd" class="mt-5" @click="handleAddSpec">
<el-icon class="avatar-uploader-icon">
<plus />
</el-icon>
添加规格组
</el-button>
</div>
</el-form-item>
<!-- Sku列表 -->
<el-form-item :label-width="labelWidth" label="Sku列表">
<!-- sku列表 -->
<el-table :data="skuList" border style="width: 100%" :span-method="objectSpanMethod">
<!-- 动态列 -->
<el-table-column v-for="column in skuColumns" :prop="column.prop" :label="column.label" :key="column.key"
:width="column.width">
</el-table-column>
<el-table-column prop="goodsSkuImg" label="预览图" width="125" align="center">
<template #default="scope">
<UploadImage ref="uploadRef" :disabled="!isAdd" v-model="scope.row.goodsSkuImg" :data=imgData :limit="1" :fileSize="5" :drag="true"
:isShowTip="false" />
</template>
</el-table-column>
<el-table-column prop="goodsSkuPrice" label="商品价格" width="145">
<template #default="scope">
<el-input-number v-model.number="scope.row.goodsSkuPrice" controls-position="right" :min="0" :precision="2" :disabled="!isAdd" />
</template>
</el-table-column>
<el-table-column prop="goodsSkuLinePrice" label="划线价格" width="145">
<template #default="scope">
<el-input-number v-model.number="scope.row.goodsSkuLinePrice" controls-position="right" :min="0"
:precision="2" :disabled="!isAdd" />
</template>
</el-table-column>
<el-table-column prop="goodsSkuStockNum" label="库存数量" width="145">
<template #default="scope">
<el-input-number v-model.number="scope.row.goodsSkuStockNum" controls-position="right" :min="0" :disabled="!isAdd"/>
</template>
</el-table-column>
<el-table-column prop="goodsSkuWeight" label="商品重量 (KG)" width="145">
<template #default="scope">
<el-input-number v-model.number="scope.row.goodsSkuWeight" controls-position="right" :min="0" :precision="2" :disabled="!isAdd"/>
</template>
</el-table-column>
<el-table-column prop="goodsSkuSkuCode" label="SKU编码" width="145">
<template #default="scope">
<el-input v-model="scope.row.goodsSkuSkuCode" placeholder="" :disabled="!isAdd"/>
</template>
</el-table-column>
</el-table>
</el-form-item>
</template>
<script setup>
import descartes from "./dikaerji";
const props = defineProps({
modelValue: Object,
isAdd: Boolean,
});
watch(props, async (v) => {
goodsSpecList.value = v.modelValue.goodsSpecList;
if (v.modelValue.goodsSpecList && v.modelValue.goodsSpecList.length !== 0) {
skuColumns.value = []; //
//
v.modelValue.goodsSpecList.forEach((specGroup, index) => {
let prop;
if (index === 0) {
prop = 'specValue';
} else if (index === 1) {
prop = 'specSecondValue';
} else if (index === 2) {
prop = 'specThirdValue';
}
const column = {
prop: prop, // 使
label: specGroup.specName, // 使
width: '100'
};
skuColumns.value.push(column); // skuColumns
});
}
console.log(v.modelValue.skuList, '原数据');
skuList.value = v.modelValue.skuList;
if (v.modelValue.skuList && v.modelValue.skuList.length !== 0) {
getSpanArr(skuList.value);
}
});
/** 商品规格 业务参数 */
//
const isAddSpecMax = ref(true)
const isAddSpecValueMax = ref(true)
//
const skuColumns = ref([
// {
// prop: 'specValue',
// label: '',
// width: '100'
// },
// {
// prop: 'specSecondValue',
// label: '',
// width: '100'
// },
// {
// prop: 'specThirdValue',
// label: '',
// width: '100'
// },
])
//
const goodsSpecList = ref([
// Json
// {
// specId: 0,
// specName: "",
// props: [
// {
// specValueId: 0,
// specValueName: "",
// specValue: "",
// },
// ],
// },
// {
// specId: 0,
// specName: "",
// props: [
// {
// specValueId: 0,
// specValueName: "",
// specValue: "",
// },
// ],
// },
])
// sku
const skuList = ref([
])
/** sku列表参数 */
const newList = ref([])
const newData = ref([])
const spanArr = ref([])
const spanArr1 = ref([])
const pos = ref("")
const pos1 = ref("")
const imgData = ref({
fileDir: "Goods"
})
/** sku列表方法 */
//
const processing = () => {
newData.value = [];
goodsSpecList.value.forEach((item) => {
const prop = item.props.map((prop) => prop.specValueName);
newData.value.push(prop);
});
console.log(newData.value, '各规格组中的规格值');
getList();
}
//
const getList = () => {
skuList.value = [];
newList.value = descartes(newData.value);
console.log(newList.value, '笛卡尔积处理过后的数据');
newList.value.forEach((item) => {
skuList.value.push({
specValue: Array.isArray(item) ? item[0] : item,
specSecondValue: Array.isArray(item) ? item[1] : null,
specThirdValue: Array.isArray(item) ? item[2] : null,
goodsGuid: 0,
goodsSkuId: 0,
goodsSkuImg: "",
goodsSkuPrice: 0.01,
goodsSkuLinePrice: 0,
goodsSkuStockNum: 0,
goodsSkuWeight: 0,
goodsSkuSkuCode: "",
});
});
props.modelValue.goodsSpecList = goodsSpecList.value
props.modelValue.skuList = skuList.value
getSpanArr(skuList.value);
console.log(skuList.value, '表格中的数据');
}
// sku
// function oldSkuList(newSkuList) {
// // const oldSkuList = _.cloneDeep(this.multiSpecData.skuList)
// const oldSkuList = skuList.value.concat()
// if (!oldSkuList.length || !newSkuList.length) {
// return newSkuList
// }
// for (const index in newSkuList) {
// //
// let oldSkuItem = {}
// if (oldSkuList.length === newSkuList.length) {
// oldSkuItem = _.cloneDeep(oldSkuList[index])
// } else {
// oldSkuItem = oldSkuList.find(item => {
// return item.key === newSkuList[index].key
// })
// }
// //
// if (oldSkuItem) {
// newSkuList[index] = {
// ...newSkuList[index],
// ..._.pick(oldSkuItem, Object.keys({
// goodsGuid: 0,
// goodsSkuImg: "",
// goodsSkuPrice: 0.01,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuSkuCode: "",
// }))
// }
// // console.log(newSkuList[index].image)
// }
// }
// return newSkuList
// }
//
const getSpanArr = (data) => {
spanArr.value = [];
pos.value = "";
spanArr1.value = [];
pos1.value = "";
data.forEach((item, i) => {
if (i === 0) {
spanArr.value.push(1);
pos.value = 0;
} else {
if (item.specValue === data[i - 1].specValue) {
spanArr.value[pos.value] += 1;
spanArr.value.push(0);
} else {
spanArr.value.push(1);
pos.value = i;
}
}
});
data.forEach((item, i) => {
if (item.specThirdValue != null) {
if (i === 0) {
spanArr1.value.push(1);
pos1.value = 0;
} else {
if (item.specSecondValue === data[i - 1].specSecondValue) {
spanArr1.value[pos1.value] += 1;
spanArr1.value.push(0);
} else {
spanArr1.value.push(1);
pos1.value = i;
}
}
}
});
console.log(spanArr.value, '排序Arr');
console.log(spanArr1.value, '排序Arr1');
}
//
const objectSpanMethod = ({ row, column, rowIndex, columnIndex }) => {
// columnIndex === 0
if (goodsSpecList.value && goodsSpecList.value.length !== 0) {
if (columnIndex === 0) {
const _row = spanArr.value[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
};
// columnIndex === 1
} else if (columnIndex === 1) {
if (spanArr1.value.length != 0) {
const _row = spanArr1.value[rowIndex];
const _col = _row > 0 ? 1 : 0;
return {
rowspan: _row,
colspan: _col
};
}
}
}
}
/** 商品规格 业务方法 */
//
function handleAddSpec() {
let data = {
specId: 0,
specName: "",
key: 0,
props: [
]
}
goodsSpecList.value.push(data)
if (goodsSpecList.value.length == 3) {
isAddSpecMax.value = false
}
}
//
function handleChangeSepc(item, idx) {
item.key = idx
let foundMatch = false;
skuColumns.value.map((i, index) => {
if (i.key == idx) {
i.label = item.specName
foundMatch = true
return true
}
})
if (foundMatch) {
return; //
}
let propValue = ""
if (idx === 0) {
propValue = "specValue"
}
if (idx === 1) {
propValue = "specSecondValue"
}
if (idx === 2) {
propValue = "specThirdValue"
}
//
let column = {
prop: propValue,
label: item.specName,
width: '100',
key: idx
}
skuColumns.value.push(column)
}
//
function handleDelSpec(item) {
const index = goodsSpecList.value.indexOf(item);
if (index > -1) {
goodsSpecList.value.splice(index, 1);
processing()
}
if (goodsSpecList.value.length < 3) {
isAddSpecMax.value = true
}
//
skuColumns.value = skuColumns.value.filter(column => column.label !== item.specName);
// sku
// skuColumns.value = skuColumns.value.filter(column => column.specName !== item.specName);
}
//
function handleAddSpecValue(item) {
let data = {
specId: 0,
specValueId: 0,
specValueName: "",
}
item.props.push(data)
if (item.props.length == 50) {
isAddSpecValueMax.value = false
}
}
//
function handleChangeSepcValue(e) {
// sku
processing()
}
//
function handleDelSpecValue(item, specValue) {
const index = item.props.indexOf(specValue);
if (index > -1) {
item.props.splice(index, 1);
processing()
}
if (item.props.length < 50) {
isAddSpecValueMax.value = true
}
}
</script>
<style lang="scss" scoped>
.divider-title {
font-size: 18px;
}
.input-intro {
color: #8c8c8c;
font-size: 12px;
}
.el-divider {
margin: 50px 0;
}
.sepc-big-box {
width: 100%;
margin-bottom: 20px;
}
.sepc-title-box {
width: 100%;
padding: 10px;
background-color: #f4f4f5;
display: flex;
justify-content: space-between;
}
.spec-value-box {
width: 100%;
padding: 20px 20px 20px 40px;
background-color: #fbfbfb;
display: flex;
flex-wrap: wrap;
}
.spec-value-input-big-box {
display: flex;
flex-wrap: wrap;
}
.spec-value-input-box {
width: 250px;
position: relative;
margin-right: 30px;
margin-bottom: 15px;
}
.spec-value-input-del {
position: absolute;
top: -5px;
right: -5px;
z-index: 99;
width: 18px;
height: 18px;
background-color: grey;
color: white;
border-radius: 50%;
display: flex;
justify-content: center;
align-items: center;
font-size: 10px;
cursor: pointer;
}
.spec-input {
width: 250px;
margin-right: 30px;
}
.mt-5 {
margin-top: 10px;
}
.el-input-number {
width: 120px;
}
:deep(.el-upload--picture-card) {
width: 90px;
height: 90px;
}
:deep(.el-upload-list--picture-card) {
--el-upload-list-picture-card-size: 100px;
}
</style>

View File

@ -1,226 +0,0 @@
// const skuList = ref([
// {
// specValue: "蓝色",
// specSecondValue: "4+128G",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "蓝色",
// specSecondValue: "4+128G",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "蓝色",
// specSecondValue: "8+256G",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "蓝色",
// specSecondValue: "8+256G",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "蓝色",
// specSecondValue: "12+1T",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "蓝色",
// specSecondValue: "12+1T",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "蓝色",
// specSecondValue: "1000G",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "蓝色",
// specSecondValue: "1000G",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "4+128G",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "4+128G",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "8+256G",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "8+256G",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "12+1T",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "12+1T",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "1000G",
// specThirdValue: "5G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// {
// specValue: "黑色",
// specSecondValue: "1000G",
// specThirdValue: "4G",
// goodsGuid: 0,
// specValueName: "",
// goodsSkuImg: "",
// goodsSkuSkuCode: 0,
// goodsSkuPrice: 10,
// goodsSkuLinePrice: 0,
// goodsSkuStockNum: 0,
// goodsSkuWeight: 0,
// goodsSkuProps: ""
// },
// ])

View File

@ -1,19 +0,0 @@
//笛卡尔积算法
function descartes(array){
if( array.length < 2 ) return array[0] || [];
return [].reduce.call(array, function(col, set) {
var res = [];
col.forEach(function(c) {
set.forEach(function(s) {
var t = [].concat( Array.isArray(c) ? c : [c] );
t.push(s);
res.push(t);
})});
return res;
});
}
export default descartes

View File

@ -1,124 +0,0 @@
<!--
* @Descripttion: (商品/tb_goods导入弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-19)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-19)
-->
<template>
<el-dialog title="导入" v-model="props.modelValue" width="400px" @closed="closeDialog">
<el-upload
name="file"
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag>
<el-icon class="el-icon--upload">
<upload-filled />
</el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的商品
</div>
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitFileForm">提交</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
let loadingInstance;
let uploadRef = ref()
/*** 导入参数 */
const upload = reactive({
//
isUploading: false,
//
updateSupport: false,
//
headers: { Authorization: 'Bearer ' + getToken() },
//
url: import.meta.env.VITE_APP_BASE_API + '/business/goods/importData',
})
//
function loading(content) {
loadingInstance = ElLoading.service({
lock: true,
text: content,
background: "rgba(0, 0, 0, 0.7)",
})
}
//
function closeLoading() {
loadingInstance.close();
}
// -
/** 下载模板操作 */
function importTemplate() {
proxy.download('/business/goods/importTemplate', '商品数据导入模板')
}
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true
loading('正在导入数据,请稍候...')
}
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
closeLoading();
closeDialog()
upload.isUploading = false
uploadRef.value.clearFiles()
ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.data + '</div>', '导入结果', {
dangerouslyUseHTMLString: true,
})
props.done()
}
/** 提交上传文件 */
function submitFileForm() {
uploadRef.value.submit()
}
// -
const emits = defineEmits(["update:modelValue"]);
const dialogVisible = ref(props.modelValue);
const formData = reactive({});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
// -
const closeDialog = () => {
dialogVisible.value = false;
emits("update:modelValue", false);
};
</script>

View File

@ -1,411 +0,0 @@
<!--
* @Descripttion: (商品/tb_goods)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-19)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-19)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<!-- <el-form-item label="类目名称">
<el-input v-model.number="queryParams.shopName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item> -->
<el-form-item label="经营类目" prop="goodsCategoryGuid" v-if="userid == 1">
<el-cascader class="w100" :options="goodsCategoryTreeListData"
:props="{ checkStrictly: true, value: 'goodsCategoryGuid', label: 'goodsCategoryName', emitPath: false }"
placeholder="请选择经营类目" clearable v-model="queryParams.goodsCategoryGuid" @change="handleQuery">
<template #default="{ node, data }">
<span>{{ data.goodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
<el-form-item label="商品类目" prop="goodsCategoryGuid" v-else>
<el-cascader class="w100" :options="shopGoodsCategoryTreeListData"
:props="{ checkStrictly: true, value: 'shopGoodsCategoryGuid', label: 'shopGoodsCategoryName', emitPath: false }"
placeholder="请选择商品类目" clearable v-model="queryParams.shopGoodsCategoryGuid" @change="handleQuery">
<template #default="{ node, data }">
<span>{{ data.shopGoodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
<el-form-item label="商品名称" prop="goodsName">
<el-input v-model="queryParams.goodsName" placeholder="请输入商品名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="商品编码" prop="goodsCoding">
<el-input v-model="queryParams.goodsCoding" placeholder="请输入商品编码" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:goods:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="success" :disabled="multiple" plain icon="Top" @click="handleShelf(1)">
上架
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" :disabled="multiple" plain icon="Bottom" @click="handleShelf(2)">
下架
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:goods:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Upload" @click="UploadDialogVisible = true"
v-hasPermi="['business:goods:import']">导入</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:goods:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="goodsId" width="100" label="商品ID" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="shopName" width="150" label="店铺名称" align="center" :show-overflow-tooltip="true"
v-if="userid == 1" />
<el-table-column prop="goodsCategoryName" width="250" label="类目" align="center" :show-overflow-tooltip="true"/>
<el-table-column prop="goodsPicture" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]" :preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsName" label="商品名称" width="450" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="goodsPriceLowest" label="价格" align="center">
<template #default="scope">
<b>{{ scope.row.goodsPriceLowest }}</b>
</template>
</el-table-column>
<el-table-column prop="goodsSalesActual" label="销量" align="center">
<template #default="scope">
{{ scope.row.goodsSalesInitial + scope.row.goodsSalesActual }}
</template>
</el-table-column>
<el-table-column prop="goodsTotalInventory" label="库存总量" align="center" />
<el-table-column prop="goodsShelfStatus" label="状态" align="center">
<template #default="scope">
<dict-tag :options="shelf_status" :value="scope.row.goodsShelfStatus" />
</template>
</el-table-column>
<el-table-column prop="goodsSort" label="排序" align="center" />
<el-table-column prop="createTime" label="添加时间" width="150" align="center" />
<el-table-column label="操作" width="250" fixed="right" align="center">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:goods:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:goods:delete']">删除</el-button>
<el-button v-if="scope.row.goodsShelfStatus == 2" type="success" size="small" icon="Top"
@click="handleShelf(1, scope.row)">上架</el-button>
<el-button v-if="scope.row.goodsShelfStatus == 1" type="warning" size="small" icon="Bottom"
@click="handleShelf(2, scope.row)">下架</el-button>
<!-- <el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button> -->
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
<!-- 导入 -->
<UploadDialog v-model="UploadDialogVisible" :done="() => resetQuery()"></UploadDialog>
</template>
<script setup name="goods">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportGoods, goodsList, delGoods, shelfGoods } from '@/api/business/GoodsManager/Goodss/goods.js'
import { goodsCategoryTreeList } from '@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js'
import { shopGoodsCategoryTreeList } from '@/api/business/GoodsManager/ShopGoodsCategorys/shopGoodsCategory.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
import UploadDialog from "./components/UploadDialog.vue";
import useUserStore from '@/store/modules/user'
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const UploadDialogVisible = ref(false);
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
const userid = useUserStore().userId
//
//
const deduct_stock_type = ref([]);
async function getdeduct_stock_type() {
await proxy.getDicts('deduct_stock_type').then((res) => {
deduct_stock_type.value = res.data
})
}
getdeduct_stock_type()
//
const is_points_gift = ref([]);
async function getis_points_gift() {
await proxy.getDicts('is_points_gift').then((res) => {
is_points_gift.value = res.data
})
}
getis_points_gift()
//
const is_points_discount = ref([]);
async function getis_points_discount() {
await proxy.getDicts('is_points_discount').then((res) => {
is_points_discount.value = res.data
})
}
getis_points_discount()
//
const is_alone_points_discount = ref([]);
async function getis_alone_points_discount() {
await proxy.getDicts('is_alone_points_discount').then((res) => {
is_alone_points_discount.value = res.data
})
}
getis_alone_points_discount()
//
const is_enable_grade = ref([]);
async function getis_enable_grade() {
await proxy.getDicts('is_enable_grade').then((res) => {
is_enable_grade.value = res.data
})
}
getis_enable_grade()
//
const is_alone_grade = ref([]);
async function getis_alone_grade() {
await proxy.getDicts('is_alone_grade').then((res) => {
is_alone_grade.value = res.data
})
}
getis_alone_grade()
//
const shelf_status = ref([]);
async function getshelf_status() {
await proxy.getDicts('shelf_status').then((res) => {
shelf_status.value = res.data
})
}
getshelf_status()
//
const shopGoodsCategoryTreeListData = ref([])
async function getShopGoodsCategoryTreeList() {
shopGoodsCategoryTreeList().then((res) => {
if (res.code == 200) {
shopGoodsCategoryTreeListData.value = res.data
}
})
}
getShopGoodsCategoryTreeList()
//
const goodsCategoryTreeListData = ref([])
async function getGoodsCategoryTreeList() {
goodsCategoryTreeList().then((res) => {
if (res.code == 200) {
goodsCategoryTreeListData.value = res.data
}
})
}
getGoodsCategoryTreeList()
//
//
function getList() {
loading.value = true
goodsList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.goodsId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.goodsId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delGoods(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.goodsId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportGoods(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
/** 上下架按钮操作 */
const ShelfData = reactive({
ids: null,
goodsShelfStatus: null,
})
function handleShelf(status, row) {
const Ids = row?.goodsId || ids.value.toString()
let str = status == 1 ? "上" : "下"
ElMessageBox.confirm("是否将商品" + str + "架?", "系统提示", {
distinguishCancelAndClose: true,
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(async () => {
ShelfData.goodsShelfStatus = status
ShelfData.ids = Ids
Shelf()
})
}
async function Shelf() {
shelfGoods(ShelfData).then((res) => {
if (res.code == 200) {
handleQuery()
let str = ShelfData.goodsShelfStatus == 1 ? "上" : "下"
ElMessageBox.alert(res.data, str + "架信息", {
dangerouslyUseHTMLString: true,
confirmButtonText: "确定",
});
} else {
ElMessage.error(res.data);
}
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,217 +0,0 @@
<!--
* @Descripttion: (店铺商品类目/tb_shop_goods_category 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加商品类目信息" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row v-if="userid == 1">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" placeholder='点击选择店铺'>
<template #append>
<div @click="handleChooseShop">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上级类目" prop="ShopGoodsCategoryParentGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'shopGoodsCategoryGuid', label: 'shopGoodsCategoryName', emitPath: false }"
placeholder="请选择上级类目" clearable v-model="formData.shopGoodsCategoryParentGuid">
<template #default="{ node, data }">
<span>{{ data.shopGoodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="名称" prop="shopGoodsCategoryName">
<el-input v-model="formData.shopGoodsCategoryName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="shopGoodsCategoryImg">
<UploadImage ref="uploadRef" v-model="formData.shopGoodsCategoryImg" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="是否为热门" prop="shopGoodsCategoryIsPopular">
<el-radio-group v-model="formData.shopGoodsCategoryIsPopular">
<el-radio v-for="item in is_popular " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="显示状态" prop="shopGoodsCategoryDisplayStatus">
<el-radio-group v-model="formData.shopGoodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="排序" prop="shopGoodsCategorySort">
<el-input-number v-model.number="formData.shopGoodsCategorySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择店铺 -->
<ChooseShopDialog v-model="ChooseShopDialogVisible" :data="ChooseShopDialogRow"></ChooseShopDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { shopGoodsCategoryTreeList, addOrUpdateShopGoodsCategory } from '@/api/business/GoodsManager/ShopGoodsCategorys/shopGoodsCategory.js';
import useUserStore from '@/store/modules/user'
import ChooseShopDialog from '@/views/business/components/ChooseShopDialog.vue';
//
const openDialog = async () => {
formData.shopName = props.data?.shopName
formData.shopGuid = props.data?.shopGuid
formData.shopGoodsCategoryParentGuid = props.data?.shopGoodsCategoryGuid
await getdisplay_status()
await getis_popular()
await getTreeList()
}
// -
const userid = useUserStore().userId
const dataList = ref([])
//
const display_status = ref([]);
//
const is_popular = ref([]);
//
const ChooseShopDialogVisible = ref(false);
const ChooseShopDialogRow = ref({});
// -
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
//
const handleChooseShop = () => {
ChooseShopDialogVisible.value = true
ChooseShopDialogRow.value = formData
}
// -
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const props = defineProps({
modelValue: Boolean,
done: Function,
data: Object
});
const formData = reactive({
shopName: "",
shopGuid: "",
shopGoodsCategoryParentGuid: "",
shopGoodsCategoryDisplayStatus: 1,
shopGoodsCategorySort: 100
});
const imgData = ref({
fileDir: "ShopGoodsCategory"
})
//
const rules = reactive({
shopGoodsCategoryParentGuid: [{ required: true, message: "上级菜单不能为空", trigger: "blur", type: "number" }],
shopGoodsCategoryName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
shopGoodsCategoryDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
shopGoodsCategorySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
async function getTreeList() {
shopGoodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
watch(props, async (v) => {
});
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateShopGoodsCategory(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
formData.shopName = ""
formData.shopGoodsCategoryImg = ""
formData.shopGuid = ""
formData.shopGoodsCategoryParentGuid = ""
console.log(formData);
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
emits("update:data", {});
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,145 +0,0 @@
<!--
* @Descripttion: (店铺商品类目/tb_shop_goods_category 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="店铺商品类目信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row v-if="userid == 1">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上级类目" prop="ShopGoodsCategoryParentGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'shopGoodsCategoryGuid', label: 'shopGoodsCategoryName', emitPath: false }"
placeholder="请选择上级类目" clearable v-model="formData.shopGoodsCategoryParentGuid">
<template #default="{ node, data }">
<span>{{ data.shopGoodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="名称" prop="shopGoodsCategoryName">
<el-input v-model="formData.shopGoodsCategoryName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="shopGoodsCategoryImg">
<UploadImage ref="uploadRef" v-model="formData.shopGoodsCategoryImg" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="是否为热门" prop="shopGoodsCategoryIsPopular">
<el-radio-group v-model="formData.shopGoodsCategoryIsPopular">
<el-radio v-for="item in is_popular " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="显示状态" prop="shopGoodsCategoryDisplayStatus">
<el-radio-group v-model="formData.shopGoodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="排序" prop="shopGoodsCategorySort">
<el-input-number v-model.number="formData.shopGoodsCategorySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import useUserStore from '@/store/modules/user'
import { shopGoodsCategoryTreeList } from "@/api/business/GoodsManager/ShopGoodsCategorys/shopGoodsCategory.js";
//
const openDialog = async () => {
await getdisplay_status()
await getis_popular()
await getTreeList()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
const userid = useUserStore().userId
const dataList = ref([])
//
const display_status = ref([]);
//
const is_popular = ref([]);
// -
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
async function getTreeList() {
shopGoodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,187 +0,0 @@
<!--
* @Descripttion: (店铺商品类目/tb_shop_goods_category 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改商品类目信息" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row v-if="userid == 1">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="上级类目" prop="ShopGoodsCategoryParentGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: true, value: 'shopGoodsCategoryGuid', label: 'shopGoodsCategoryName', emitPath: false }"
placeholder="请选择上级类目" clearable v-model="formData.shopGoodsCategoryParentGuid">
<template #default="{ node, data }">
<span>{{ data.shopGoodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="名称" prop="shopGoodsCategoryName">
<el-input v-model="formData.shopGoodsCategoryName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="图片" prop="shopGoodsCategoryImg">
<UploadImage ref="uploadRef" v-model="formData.shopGoodsCategoryImg" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="是否为热门" prop="shopGoodsCategoryIsPopular">
<el-radio-group v-model="formData.shopGoodsCategoryIsPopular">
<el-radio v-for="item in is_popular " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="显示状态" prop="shopGoodsCategoryDisplayStatus">
<el-radio-group v-model="formData.shopGoodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="排序" prop="shopGoodsCategorySort">
<el-input-number v-model.number="formData.shopGoodsCategorySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import useUserStore from '@/store/modules/user'
import { shopGoodsCategoryTreeList, addOrUpdateShopGoodsCategory } from "@/api/business/GoodsManager/ShopGoodsCategorys/shopGoodsCategory.js";
//
const openDialog = async () => {
await getdisplay_status()
await getis_popular()
await getTreeList()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
const userid = useUserStore().userId
const dataList = ref([])
//
const display_status = ref([]);
//
const is_popular = ref([]);
// -
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "ShopGoodsCategory"
})
//
const rules = reactive({
shopGoodsCategoryParentGuid: [{ required: true, message: "上级菜单不能为空", trigger: "blur", type: "number" }],
shopGoodsCategoryName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
shopGoodsCategoryDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
shopGoodsCategorySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
async function getTreeList() {
shopGoodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateShopGoodsCategory(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,124 +0,0 @@
<!--
* @Descripttion: (店铺商品类目/tb_shop_goods_category导入弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<el-dialog title="导入" v-model="props.modelValue" width="400px" @closed="closeDialog">
<el-upload
name="file"
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag>
<el-icon class="el-icon--upload">
<upload-filled />
</el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的店铺商品类目
</div>
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitFileForm">提交</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
let loadingInstance;
let uploadRef = ref()
/*** 导入参数 */
const upload = reactive({
//
isUploading: false,
//
updateSupport: false,
//
headers: { Authorization: 'Bearer ' + getToken() },
//
url: import.meta.env.VITE_APP_BASE_API + '/business/shopGoodsCategory/importData',
})
//
function loading(content) {
loadingInstance = ElLoading.service({
lock: true,
text: content,
background: "rgba(0, 0, 0, 0.7)",
})
}
//
function closeLoading() {
loadingInstance.close();
}
// -
/** 下载模板操作 */
function importTemplate() {
proxy.download('/business/shopGoodsCategory/importTemplate', '店铺商品类目数据导入模板')
}
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true
loading('正在导入数据,请稍候...')
}
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
closeLoading();
closeDialog()
upload.isUploading = false
uploadRef.value.clearFiles()
ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.data + '</div>', '导入结果', {
dangerouslyUseHTMLString: true,
})
props.done()
}
/** 提交上传文件 */
function submitFileForm() {
uploadRef.value.submit()
}
// -
const emits = defineEmits(["update:modelValue"]);
const dialogVisible = ref(props.modelValue);
const formData = reactive({});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
// -
const closeDialog = () => {
dialogVisible.value = false;
emits("update:modelValue", false);
};
</script>

View File

@ -1,306 +0,0 @@
<!--
* @Descripttion: (店铺商品类目/tb_shop_goods_category)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item v-if="userid == 1" label="店铺名称" prop="shopName">
<el-input v-model="queryParams.shopName" placeholder="店铺名称" clearable @keyup.enter="handleQuery"/>
</el-form-item>
<el-form-item label="商品类目名称" prop="shopGoodsCategoryName">
<el-input v-model="queryParams.shopGoodsCategoryName" placeholder="商品类目名称" clearable @keyup.enter="handleQuery"/>
</el-form-item>
<el-form-item label="显示状态" prop="shopGoodsCategoryDisplayStatus">
<el-radio-group v-model="queryParams.shopGoodsCategoryDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="item.dictValue">{{item.dictLabel}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="info" plain icon="sort" @click="toggleExpandAll">展开/折叠</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:shopgoodscategory:addOrUpdate']" plain icon="plus" @click="handleAdd()">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:shopgoodscategory:delete']" plain icon="delete" @click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Upload" @click="UploadDialogVisible = true"
v-hasPermi="['business:shopgoodscategory:import']">导入</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:shopgoodscategory:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row @selection-change="handleSelectionChange" v-if="refreshTable" :default-expand-all="isExpandAll" row-key="shopGoodsCategoryGuid" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
<el-table-column type="selection" width="50" align="center" />
<el-table-column v-if="userid == 1" prop="shopName" label="店铺名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="shopGoodsCategoryName" label="名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="shopGoodsCategoryImg" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain" :src="scope.row.shopGoodsCategoryImg?.split(',')[0]" :preview-src-list="scope.row.goodsCategoryImg?.split(',')">
<div><el-icon :size="15"><document /></el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="shopGoodsCategoryIsPopular" label="是否为热门" align="center">
<template #default="scope">
<dict-tag :options=" is_popular " :value="scope.row.shopGoodsCategoryIsPopular" />
</template>
</el-table-column>
<el-table-column prop="shopGoodsCategoryDisplayStatus" label="显示状态" align="center">
<template #default="scope">
<dict-tag :options=" display_status " :value="scope.row.shopGoodsCategoryDisplayStatus" />
</template>
</el-table-column>
<el-table-column prop="shopGoodsCategorySort" label="排序" align="center" sortable />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:shopgoodscategory:addOrUpdate']">编辑</el-button>
<el-button type="primary" size="small" icon="plus" @click="handleAdd(scope.row)"
v-hasPermi="['business:shopgoodscategory:addOrUpdate']">添加</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:shopgoodscategory:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()" :data="AddDialogRow"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
<!-- 导入 -->
<UploadDialog v-model="UploadDialogVisible" :done="() => resetQuery()"></UploadDialog>
</template>
<script setup name="shopgoodscategory">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import useUserStore from '@/store/modules/user'
import { exportShopGoodsCategory, shopGoodsCategoryTreeList , delShopGoodsCategory } from '@/api/business/GoodsManager/ShopGoodsCategorys/shopGoodsCategory.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
import UploadDialog from "./components/UploadDialog.vue";
const AddDialogVisible = ref(false);
const AddDialogRow = ref({});
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const UploadDialogVisible = ref(false);
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
//
const isExpandAll = ref(true)
const refreshTable = ref(true)
const data = reactive({
form: {},
queryParams: {
},
})
const { queryParams } = toRefs(data)
//
const userid = useUserStore().userId
//
//
const display_status = ref([]);
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
getdisplay_status()
//
const is_popular = ref([]);
async function getis_popular() {
await proxy.getDicts('is_popular').then((res) => {
is_popular.value = res.data
})
}
getis_popular()
//
//
function selectChild(str, tag, res, parent) {
isExpandAll.value = true
for (let item of tag) {
if (item.shopGoodsCategoryName.indexOf(str) !== -1) {
if (parent) {
res.push(parent)
} else {
res.push(item)
}
} else if (item.children && item.children.length) {
selectChild(str, item.children, res, parent || item)
}
}
}
//
function getList() {
loading.value = true
shopGoodsCategoryTreeList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false
if (queryParams.value.shopGoodsCategoryName == undefined) {
// isExpandAll.value = false
dataList.value = res.data
} else {
dataList.value = []
selectChild(queryParams.value.shopGoodsCategoryName, res.data, dataList.value)
}
total.value = res.data.totalNum
}
})
}
// /
function toggleExpandAll() {
refreshTable.value = false
isExpandAll.value = !isExpandAll.value
nextTick(() => {
refreshTable.value = true
})
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.shopGoodsCategoryId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.shopGoodsCategoryId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delShopGoodsCategory(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.shopGoodsCategoryId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportShopGoodsCategory(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleAdd(row) {
AddDialogRow.value = null
AddDialogVisible.value = true
AddDialogRow.value = row
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,314 +0,0 @@
<!--
* @Descripttion: (配送模板/tb_delivery 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-16)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-16)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加配送模板信息" width="1250px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row >
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" placeholder='点击选择店铺'>
<template #append>
<div @click="handleChooseShop">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="模板名称" prop="deliveryName">
<el-input v-model="formData.deliveryName" placeholder="请输入模板名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="计费方式" prop="deliveryBillingMethod">
<el-radio-group v-model="formData.deliveryBillingMethod">
<el-radio v-for="item in charging_methods " :key="item.dictValue" :label="parseInt(item.dictValue)"
@change="onChangeType">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth + 20" label="配送区域及运费" prop="">
<el-table :data="deliveryRuleDataList" border style="width: 100%">
<el-table-column prop="deliveryRuleRegionText" label="可配送区域" width="350">
<template #default="scope">
<el-row style="width: 100%">
<el-col :span="24">
<div class="mr-5">{{ scope.row.deliveryRuleRegionText }}</div>
</el-col>
</el-row>
<el-row class="deliveryRuleEdit">
<el-link type="primary" style="margin-right: 10px;"
@click="handleDeliveryRuleEdit(scope.row)">编辑</el-link>
<el-link type="primary" @click="handleDeliveryRuleDelete(scope.row)">删除</el-link>
</el-row>
</template>
</el-table-column>
<el-table-column prop="deliveryRuleFirst" :label=deliveryRuleFirstTitle>
<template #default="scope">
<el-input-number v-if="formData.deliveryBillingMethod == 1" v-model.number="scope.row.deliveryRuleFirst" controls-position="right" :min="0" />
<el-input-number v-else v-model.number="scope.row.deliveryRuleFirst" controls-position="right" :min="0" :precision="2"/>
</template>
</el-table-column>
<el-table-column prop="deliveryRuleFirstFee" label=" 运费(元)">
<template #default="scope">
<el-input-number v-model.number="scope.row.deliveryRuleFirstFee" controls-position="right" :min="0" :precision="2" />
</template>
</el-table-column>
<el-table-column prop="deliveryRuleAdditional" :label=deliveryRuleAdditionalTitle>
<template #default="scope">
<el-input-number v-if="formData.deliveryBillingMethod == 1" v-model.number="scope.row.deliveryRuleAdditional" controls-position="right" :min="0" />
<el-input-number v-else v-model.number="scope.row.deliveryRuleAdditional" controls-position="right" :min="0" :precision="2"/>
</template>
</el-table-column>
<el-table-column prop="deliveryRuleAdditionalFee" label="续费(元)">
<template #default="scope">
<el-input-number v-model.number="scope.row.deliveryRuleAdditionalFee" controls-position="right"
:min="0" :precision="2"/>
</template>
</el-table-column>
</el-table>
<el-button style="margin-top: 10px;" plain icon="Location"
@click="hanldeDeliveryRule()">点击添加配送区域及运费</el-button>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="deliverySort">
<el-input-number v-model.number="formData.deliverySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择店铺 -->
<ChooseShopDialog v-model="ChooseShopDialogVisible" :data="ChooseShopDialogRow"></ChooseShopDialog>
<!-- 选择配送区域及运费 -->
<RegionTranser v-model="DeliveryRuleDialogVisible" :data="DeliveryRuleDialogRow" :done="handleAddRegionRule">
</RegionTranser>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import useUserStore from '@/store/modules/user'
import { addOrUpdateDelivery } from '@/api/business/LogisticsManage/Deliverys/delivery.js';
import ChooseShopDialog from '@/views/business/components/ChooseShopDialog.vue';
import RegionTranser from './RegionTranser.vue';
//
const openDialog = async () => {
await getcharging_methods()
}
// -
const userid = useUserStore().userId
//
const charging_methods = ref([]);
//
const ChooseShopDialogVisible = ref(false);
const ChooseShopDialogRow = ref({});
//
const DeliveryRuleDialogVisible = ref(false);
const DeliveryRuleDialogRow = ref({});
//
const deliveryRuleFirstTitle = ref("首件 (个)")
const deliveryRuleAdditionalTitle = ref("续件 (个)")
const deliveryRuleDataList = ref([
// {
// deliveryRuleRegionText: ' 西 西 广 广西 西 ',
// deliveryRuleFirst: 1,
// deliveryRuleFirstFee: 0,
// deliveryRuleAdditional: 0,
// deliveryRuleAdditionalFee: 0
// },
])
// -
//
async function getcharging_methods() {
await proxy.getDicts('charging_methods').then((res) => {
charging_methods.value = res.data
})
}
//
const onChangeType = (e) => {
if (e === 1) {
deliveryRuleFirstTitle.value = "首件 (个)"
deliveryRuleAdditionalTitle.value = "续件 (个)"
}
if (e === 2) {
deliveryRuleFirstTitle.value = "首重 (Kg)"
deliveryRuleAdditionalTitle.value = "续重 (Kg)"
}
}
//
const handleChooseShop = () => {
ChooseShopDialogVisible.value = true
ChooseShopDialogRow.value = formData
}
//
const hanldeDeliveryRule = () => {
formData.deliveryRuleRegion = []
DeliveryRuleDialogVisible.value = true
DeliveryRuleDialogRow.value = formData
}
// ()
const handleAddRegionRule = () => {
let deliveryRuleRegionText = formData.deliveryRuleRegionText
let deliveryRuleRegion = formData.deliveryRuleRegion
// console.log(formData,'');
let deliveryRuleData = {
deliveryRuleRegionText: deliveryRuleRegionText,
deliveryRuleRegion: deliveryRuleRegion,
deliveryRuleFirst: 1,
deliveryRuleFirstFee: 0,
deliveryRuleAdditional: 0,
deliveryRuleAdditionalFee: 0
}
deliveryRuleDataList.value.push(deliveryRuleData)
}
//
const handleDeliveryRuleEdit = (row) => {
DeliveryRuleDialogVisible.value = true
DeliveryRuleDialogRow.value = row
}
//
const handleDeliveryRuleDelete = (row) => {
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(() => {
const index = deliveryRuleDataList.value.indexOf(row);
if (index !== -1) {
deliveryRuleDataList.value.splice(index, 1);
}
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
// -
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
deliveryBillingMethod: 1,
deliverySort: 100,
deliveryRuleRegion: []
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "Delivery"
})
//
const rules = reactive({
shopGuid: [{ required: true, message: "店铺不能为空", trigger: "blur"}],
deliveryName: [{ required: true, message: "模板名称不能为空", trigger: "blur" }],
deliveryBillingMethod: [{ required: true, message: "计费方式不能为空", trigger: "blur", type: "number" }],
deliverySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
if(deliveryRuleDataList.value.length <= 0){
modal.msgError("请添加配送区域及运费")
return
}
deliveryRuleDataList.value.map((item) => {
const transformedRegion = item.deliveryRuleRegion.map((regionItem) => regionItem.id);
item.deliveryRuleRegion = transformedRegion.join(',');
});
formData.deliveryRuleDataList = deliveryRuleDataList.value
// console.log(formData, '');
const { code } = await addOrUpdateDelivery(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
formData.shopName = ""
formData.deliveryRuleRegionText = ""
formData.deliveryRuleRegion = []
formData.deliveryRuleDataList = []
deliveryRuleDataList.value = []
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>
<style>
.deliveryRuleEdit {
display: flex;
justify-content: right;
}
</style>

View File

@ -1,168 +0,0 @@
<!--
* @Descripttion: (配送模板/tb_delivery 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-16)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-16)
-->
<template>
<el-dialog v-model="props.modelValue" title="配送模板信息详情" width="1250px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row >
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="模板名称" prop="deliveryName">
<el-input v-model="formData.deliveryName" placeholder="请输入模板名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="计费方式" prop="deliveryBillingMethod">
<el-radio-group v-model="formData.deliveryBillingMethod">
<el-radio v-for="item in charging_methods " :key="item.dictValue" :label="parseInt(item.dictValue)"
>{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth + 20" label="配送区域及运费" prop="">
<el-table :data="deliveryRuleDataList" border style="width: 100%">
<el-table-column prop="deliveryRuleRegionText" label="可配送区域" width="350">
<template #default="scope">
<el-row style="width: 100%">
<el-col :span="24">
<div class="mr-5">{{ scope.row.deliveryRuleRegionText }}</div>
</el-col>
</el-row>
</template>
</el-table-column>
<el-table-column prop="deliveryRuleFirst" :label=deliveryRuleFirstTitle>
<template #default="scope">
<el-input-number v-if="formData.deliveryBillingMethod == 1" v-model.number="scope.row.deliveryRuleFirst"
controls-position="right" :min="0" />
<el-input-number v-else v-model.number="scope.row.deliveryRuleFirst" controls-position="right" :min="0"
:precision="2" />
</template>
</el-table-column>
<el-table-column prop="deliveryRuleFirstFee" label=" 运费(元)">
<template #default="scope">
<el-input-number v-model.number="scope.row.deliveryRuleFirstFee" controls-position="right" :min="0"
:precision="2" />
</template>
</el-table-column>
<el-table-column prop="deliveryRuleAdditional" :label=deliveryRuleAdditionalTitle>
<template #default="scope">
<el-input-number v-if="formData.deliveryBillingMethod == 1"
v-model.number="scope.row.deliveryRuleAdditional" controls-position="right" :min="0" />
<el-input-number v-else v-model.number="scope.row.deliveryRuleAdditional" controls-position="right"
:min="0" :precision="2" />
</template>
</el-table-column>
<el-table-column prop="deliveryRuleAdditionalFee" label="续费(元)">
<template #default="scope">
<el-input-number v-model.number="scope.row.deliveryRuleAdditionalFee" controls-position="right" :min="0"
:precision="2" />
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="deliverySort">
<el-input-number v-model.number="formData.deliverySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import { getDeliveryRuleList } from "@/api/business/LogisticsManage/Deliverys/delivery.js";
import useUserStore from '@/store/modules/user'
//
const openDialog = async () => {
await getcharging_methods()
await getdeliveryRuleDataListFun()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
//
const charging_methods = ref([]);
const userid = useUserStore().userId
//
const DeliveryRuleDialogVisible = ref(false);
const DeliveryRuleDialogRow = ref({});
//
const deliveryRuleFirstTitle = ref("首件 (个)")
const deliveryRuleAdditionalTitle = ref("续件 (个)")
const deliveryRuleDataList = ref([])
// -
//
async function getcharging_methods() {
await proxy.getDicts('charging_methods').then((res) => {
charging_methods.value = res.data
})
}
//
async function getdeliveryRuleDataListFun() {
getDeliveryRuleList({ deliveryGuid: formData.value.deliveryGuid }).then((res) => {
if (res.code == 200) {
deliveryRuleDataList.value = res.data
deliveryRuleDataList.value.map((item) => {
item.deliveryRuleRegion = item.deliveryRuleRegion == null ? [] : item.deliveryRuleRegion
})
}
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,296 +0,0 @@
<!--
* @Descripttion: (配送模板/tb_delivery 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-16)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-16)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改配送模板信息" width="1250px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row>
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="模板名称" prop="deliveryName">
<el-input v-model="formData.deliveryName" placeholder="请输入模板名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="计费方式" prop="deliveryBillingMethod">
<el-radio-group v-model="formData.deliveryBillingMethod">
<el-radio v-for="item in charging_methods " :key="item.dictValue" :label="parseInt(item.dictValue)"
@change="onChangeType">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth + 20" label="配送区域及运费" prop="">
<el-table :data="deliveryRuleDataList" border style="width: 100%">
<el-table-column prop="deliveryRuleRegionText" label="可配送区域" width="350">
<template #default="scope">
<el-row style="width: 100%">
<el-col :span="24">
<div class="mr-5">{{ scope.row.deliveryRuleRegionText }}</div>
</el-col>
</el-row>
<el-row class="deliveryRuleEdit">
<el-link type="primary" style="margin-right: 10px;"
@click="handleDeliveryRuleEdit(scope.row)">编辑</el-link>
<el-link type="primary" @click="handleDeliveryRuleDelete(scope.row)">删除</el-link>
</el-row>
</template>
</el-table-column>
<el-table-column prop="deliveryRuleFirst" :label=deliveryRuleFirstTitle>
<template #default="scope">
<el-input-number v-if="formData.deliveryBillingMethod == 1" v-model.number="scope.row.deliveryRuleFirst"
controls-position="right" :min="0" />
<el-input-number v-else v-model.number="scope.row.deliveryRuleFirst" controls-position="right" :min="0"
:precision="2" />
</template>
</el-table-column>
<el-table-column prop="deliveryRuleFirstFee" label=" 运费(元)">
<template #default="scope">
<el-input-number v-model.number="scope.row.deliveryRuleFirstFee" controls-position="right" :min="0"
:precision="2" />
</template>
</el-table-column>
<el-table-column prop="deliveryRuleAdditional" :label=deliveryRuleAdditionalTitle>
<template #default="scope">
<el-input-number v-if="formData.deliveryBillingMethod == 1"
v-model.number="scope.row.deliveryRuleAdditional" controls-position="right" :min="0" />
<el-input-number v-else v-model.number="scope.row.deliveryRuleAdditional" controls-position="right"
:min="0" :precision="2" />
</template>
</el-table-column>
<el-table-column prop="deliveryRuleAdditionalFee" label="续费(元)">
<template #default="scope">
<el-input-number v-model.number="scope.row.deliveryRuleAdditionalFee" controls-position="right" :min="0"
:precision="2" />
</template>
</el-table-column>
</el-table>
<el-button style="margin-top: 10px;" plain icon="Location"
@click="hanldeDeliveryRule()">点击添加配送区域及运费</el-button>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="deliverySort">
<el-input-number v-model.number="formData.deliverySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择配送区域及运费 -->
<RegionTranser v-model="DeliveryRuleDialogVisible" :data="DeliveryRuleDialogRow" :done="handleAddRegionRule">
</RegionTranser>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import useUserStore from '@/store/modules/user'
import { getDeliveryRuleList, addOrUpdateDelivery } from "@/api/business/LogisticsManage/Deliverys/delivery.js";
import RegionTranser from './RegionTranser.vue';
//
const openDialog = async () => {
await getcharging_methods()
await getdeliveryRuleDataListFun()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
const userid = useUserStore().userId
//
const charging_methods = ref([]);
//
const DeliveryRuleDialogVisible = ref(false);
const DeliveryRuleDialogRow = ref({});
//
const deliveryRuleFirstTitle = ref("首件 (个)")
const deliveryRuleAdditionalTitle = ref("续件 (个)")
const deliveryRuleDataList = ref([])
// -
//
async function getcharging_methods() {
await proxy.getDicts('charging_methods').then((res) => {
charging_methods.value = res.data
})
}
//
async function getdeliveryRuleDataListFun() {
getDeliveryRuleList({ deliveryGuid: formData.value.deliveryGuid }).then((res) => {
if (res.code == 200) {
deliveryRuleDataList.value = res.data
deliveryRuleDataList.value.map((item) => {
item.deliveryRuleRegion = item.deliveryRuleRegion == null ? [] : item.deliveryRuleRegion
})
}
})
}
//
const onChangeType = (e) => {
if (e === 1) {
deliveryRuleFirstTitle.value = "首件 (个)"
deliveryRuleAdditionalTitle.value = "续件 (个)"
}
if (e === 2) {
deliveryRuleFirstTitle.value = "首重 (Kg)"
deliveryRuleAdditionalTitle.value = "续重 (Kg)"
}
}
//
const hanldeDeliveryRule = () => {
formData.value.deliveryRuleRegion = []
DeliveryRuleDialogVisible.value = true
DeliveryRuleDialogRow.value = formData.value
}
// ()
const handleAddRegionRule = () => {
let deliveryRuleRegionText = formData.value.deliveryRuleRegionText
let deliveryRuleRegion = formData.value.deliveryRuleRegion
let deliveryRuleData = {
deliveryRuleRegionText: deliveryRuleRegionText,
deliveryRuleRegion: deliveryRuleRegion,
deliveryRuleFirst: 1,
deliveryRuleFirstFee: 0,
deliveryRuleAdditional: 0,
deliveryRuleAdditionalFee: 0,
deliveryGuid: ""
}
deliveryRuleDataList.value.push(deliveryRuleData)
}
//
const handleDeliveryRuleEdit = (row) => {
DeliveryRuleDialogVisible.value = true
DeliveryRuleDialogRow.value = row
}
//
const handleDeliveryRuleDelete = (row) => {
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(() => {
const index = deliveryRuleDataList.value.indexOf(row);
if (index !== -1) {
deliveryRuleDataList.value.splice(index, 1);
}
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Delivery"
})
//
const rules = reactive({
deliveryName: [{ required: true, message: "模板名称不能为空", trigger: "blur" }],
deliveryBillingMethod: [{ required: true, message: "计费方式不能为空", trigger: "blur", type: "number" }],
deliverySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
if (deliveryRuleDataList.value.length <= 0) {
modal.msgError("请添加配送区域及运费")
return
}
deliveryRuleDataList.value.map((item) => {
console.log(item.deliveryRuleRegion,'asda');
if (item.deliveryRuleRegion == null) {
return
}
const transformedRegion = item.deliveryRuleRegion.map((regionItem) => regionItem.id);
item.deliveryRuleRegion = transformedRegion.join(',');
item.deliveryGuid = formData.value.deliveryGuid
});
formData.value.deliveryRuleDataList = deliveryRuleDataList.value
const { code } = await addOrUpdateDelivery(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,111 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="选择配送区域" width="900px" @closed="closeDialog" @open="openDialog">
<div id="app">
<TreeTransfer ref="treeTransferRef" nodeKey="id" :fromData="transferData" :propToData="props.data.deliveryRuleRegion"
:defaultProps="transferProps" :leftTit="'地区选择:'" :rightTit="'已选择:'" :searchPlaceholder="'地区名称'"
@checkVal="checkVal">
</TreeTransfer>
</div>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleSave()">添加</el-button>
<el-button @click="closeDialog()">取消</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { getSecondRegionTreeList } from '@/api/business/Custom/Regions/region.js'
import TreeTransfer from '@/components/TreeTransfer/index'
import { ElMessage } from 'element-plus'
const emits = defineEmits(["update:modelValue"]);
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const formData = ref({
...props.data
});
const transferData = ref([])
const transferValue = ref([])
const transferProps = ref([])
watch(props, (v) => {
// console.log(v.data,'');
transferValue.vale = v.data.deliveryRuleRegion.length;
formData.value = v.data
// console.log(transferValue.vale,'');
});
//
function openDialog() {
getSecondRegionTreeList().then((res) => {
if (res.code == 200) {
transferData.value = res.data
}
})
}
// -
// ()
let deliveryRuleRegionText = ref("");
// (id)
let deliveryRuleRegion = ref("");
// -
function checkVal(e) {
// console.log(e, '');
// id parentName
deliveryRuleRegionText.value = e.reduce((text, item) => {
if (text && text.includes(item.parentName)) {
return text;
}
if (text) {
text += ",";
}
return text + item.parentName;
}, "");
deliveryRuleRegion.value = e.map(item => item);
// console.log(deliveryRuleRegionText.value, "()");
// console.log(deliveryRuleRegion.value, "(id)");
}
//
function handleSave() {
if (deliveryRuleRegionText.value !== "") {
formData.value.deliveryRuleRegionText = deliveryRuleRegionText.value
formData.value.deliveryRuleRegion = deliveryRuleRegion.value
if (formData.value.deliveryRuleRegionText != null) {
closeDialog();
props.done()
}
} else {
ElMessage.error("请选择配送区域")
return;
}
}
const closeDialog = () => {
deliveryRuleRegionText.value = ""
deliveryRuleRegion.value = []
emits("update:modelValue", false);
};
</script>

View File

@ -1,241 +0,0 @@
<!--
* @Descripttion: (配送模板/tb_delivery)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-16)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-16)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="店铺名称" prop="shopName">
<el-input v-model.number="queryParams.shopName" placeholder="请输入店铺名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="模板名称" prop="deliveryName">
<el-input v-model="queryParams.deliveryName" placeholder="请输入模板名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="计费方式" prop="deliveryBillingMethod">
<el-radio-group v-model="queryParams.deliveryBillingMethod">
<el-radio v-for="item in charging_methods " :key="item.dictValue"
:label="item.dictValue">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:delivery:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:delivery:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:delivery:export']">
{{ $t('btn.export') }}
</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="deliveryId" label="模板ID" width="100" align="left" />
<el-table-column prop="shopName" label="店铺名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="deliveryName" label="模板名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="deliveryBillingMethod" label="计费方式" align="center">
<template #default="scope">
<dict-tag :options="charging_methods" :value="scope.row.deliveryBillingMethod" />
</template>
</el-table-column>
<el-table-column prop="deliverySort" label="排序" align="center" sortable />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:delivery:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:delivery:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="delivery">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportDelivery, deliveryList, delDelivery } from '@/api/business/LogisticsManage/Deliverys/delivery.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
//
//
const charging_methods = ref([]);
async function getcharging_methods() {
await proxy.getDicts('charging_methods').then((res) => {
charging_methods.value = res.data
})
}
getcharging_methods()
//
//
function getList() {
loading.value = true
deliveryList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.deliveryId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.deliveryId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delDelivery(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.deliveryId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportDelivery(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,119 +0,0 @@
<!--
* @Descripttion: (物流公司/tb_logistics_company 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加物流公司信息" width="700px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流公司名称" prop="logisticsCompanyName">
<el-input v-model="formData.logisticsCompanyName" placeholder="请输入物流公司名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流公司编码" prop="logisticsCompanyCode">
<el-input v-model="formData.logisticsCompanyCode" placeholder="请输入物流公司编码" />
<div style="color:#8c8c8c;font-size: 11px;">用于快递100API查询物流信息请参照 <el-link style="font-size: 11px;" type="primary"
@click="goTokuaidi100()">物流公司编码表</el-link> </div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="logisticsCompanySort">
<el-input-number v-model.number="formData.logisticsCompanySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateLogisticsCompany } from '@/api/business/LogisticsManage/LogisticsCompanys/logisticsCompany.js';
//
const openDialog = async () => {
}
// -
// -
const goTokuaidi100 = () => {
window.open("https://api.kuaidi100.com/manager/v2/express-company")
}
// -
const labelWidth = 120;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
logisticsCompanySort: 100
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "LogisticsCompany"
})
//
const rules = reactive({
logisticsCompanyGuid: [{ required: true, message: "不能为空", trigger: "blur", type: "number" }],
logisticsCompanyName: [{ required: true, message: "物流公司名称不能为空", trigger: "blur" }],
logisticsCompanyCode: [{ required: true, message: "物流公司编码不能为空", trigger: "blur" }],
logisticsCompanySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateLogisticsCompany(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,86 +0,0 @@
<!--
* @Descripttion: (物流公司/tb_logistics_company 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<el-dialog v-model="props.modelValue" title="物流公司信息详情" width="700px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流公司名称">
<el-input v-model="formData.logisticsCompanyName" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流公司编码">
<el-input v-model="formData.logisticsCompanyCode" />
<div style="color:#8c8c8c;font-size: 11px;">用于快递100API查询物流信息请参照 <el-link style="font-size: 11px;" type="primary"
@click="goTokuaidi100()">物流公司编码表</el-link> </div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序">
<el-input-number v-model.number="formData.logisticsCompanySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
//
const openDialog = async () => {
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
// -
const goTokuaidi100 = () => {
window.open("https://api.kuaidi100.com/manager/v2/express-company")
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,132 +0,0 @@
<!--
* @Descripttion: (物流公司/tb_logistics_company 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改物流公司信息" width="700px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流公司名称">
<el-input v-model="formData.logisticsCompanyName" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流公司编码">
<el-input v-model="formData.logisticsCompanyCode" />
<div style="color:#8c8c8c;font-size: 11px;">用于快递100API查询物流信息请参照 <el-link style="font-size: 11px;"
type="primary" @click="goTokuaidi100()">物流公司编码表</el-link> </div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序">
<el-input-number v-model.number="formData.logisticsCompanySort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateLogisticsCompany } from "@/api/business/LogisticsManage/LogisticsCompanys/logisticsCompany.js";
//
const openDialog = async () => {
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
// -
const goTokuaidi100 = () => {
window.open("https://api.kuaidi100.com/manager/v2/express-company")
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "LogisticsCompany"
})
//
const rules = reactive({
logisticsCompanyGuid: [{ required: true, message: "不能为空", trigger: "blur", type: "number" }],
logisticsCompanyName: [{ required: true, message: "物流公司名称不能为空", trigger: "blur" }],
logisticsCompanyCode: [{ required: true, message: "物流公司编码不能为空", trigger: "blur" }],
logisticsCompanySort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateLogisticsCompany(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,124 +0,0 @@
<!--
* @Descripttion: (物流公司/tb_logistics_company导入弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<el-dialog title="导入" v-model="props.modelValue" width="400px" @closed="closeDialog">
<el-upload
name="file"
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag>
<el-icon class="el-icon--upload">
<upload-filled />
</el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的物流公司
</div>
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitFileForm">提交</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
let loadingInstance;
let uploadRef = ref()
/*** 导入参数 */
const upload = reactive({
//
isUploading: false,
//
updateSupport: false,
//
headers: { Authorization: 'Bearer ' + getToken() },
//
url: import.meta.env.VITE_APP_BASE_API + '/business/logisticsCompany/importData',
})
//
function loading(content) {
loadingInstance = ElLoading.service({
lock: true,
text: content,
background: "rgba(0, 0, 0, 0.7)",
})
}
//
function closeLoading() {
loadingInstance.close();
}
// -
/** 下载模板操作 */
function importTemplate() {
proxy.download('/business/logisticsCompany/importTemplate', '物流公司数据导入模板')
}
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true
loading('正在导入数据,请稍候...')
}
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
closeLoading();
closeDialog()
upload.isUploading = false
uploadRef.value.clearFiles()
ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.data + '</div>', '导入结果', {
dangerouslyUseHTMLString: true,
})
props.done()
}
/** 提交上传文件 */
function submitFileForm() {
uploadRef.value.submit()
}
// -
const emits = defineEmits(["update:modelValue"]);
const dialogVisible = ref(props.modelValue);
const formData = reactive({});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
// -
const closeDialog = () => {
dialogVisible.value = false;
emits("update:modelValue", false);
};
</script>

View File

@ -1,228 +0,0 @@
<!--
* @Descripttion: (物流公司/tb_logistics_company)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-18)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-18)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="物流公司名称" prop="logisticsCompanyName">
<el-input v-model="queryParams.logisticsCompanyName" placeholder="请输入物流公司名称" clearable @keyup.enter="handleQuery"/>
</el-form-item>
<el-form-item label="物流公司编码" prop="logisticsCompanyCode">
<el-input v-model="queryParams.logisticsCompanyCode" placeholder="请输入物流公司编码" clearable @keyup.enter="handleQuery"/>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:logisticscompany:addOrUpdate']" plain icon="plus" @click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:logisticscompany:delete']" plain icon="delete" @click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="primary" plain icon="Upload" @click="UploadDialogVisible = true"
v-hasPermi="['business:logisticscompany:import']">导入</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:logisticscompany:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="logisticsCompanyId" label="物流公司Id" align="center" />
<el-table-column prop="logisticsCompanyName" label="物流公司名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="logisticsCompanyCode" label="物流公司编码" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="logisticsCompanySort" label="排序" align="center" sortable />
<el-table-column prop="createTime" label="添加时间" align="center" />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:logisticscompany:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:logisticscompany:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
<!-- 导入 -->
<UploadDialog v-model="UploadDialogVisible" :done="() => resetQuery()"></UploadDialog>
</template>
<script setup name="logisticscompany">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportLogisticsCompany, logisticsCompanyList , delLogisticsCompany } from '@/api/business/LogisticsManage/LogisticsCompanys/logisticsCompany.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
import UploadDialog from "./components/UploadDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const UploadDialogVisible = ref(false);
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
//
//
//
function getList() {
loading.value = true
logisticsCompanyList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.logisticsCompanyId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.logisticsCompanyId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delLogisticsCompany(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.logisticsCompanyId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportLogisticsCompany(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,340 +0,0 @@
<!--
* @Descripttion: (优惠券/tb_coupon 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-24)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-24)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加优惠券信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" placeholder='点击选择店铺'>
<template #append>
<div @click="handleChooseShop">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠劵名称" prop="couponName">
<el-input v-model="formData.couponName" placeholder="请输入优惠劵名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="优惠劵介绍" prop="couponDesc">
<el-input v-model="formData.couponDesc" placeholder="请输入优惠劵介绍" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="使用须知" prop="couponUseIntro">
<el-input :rows="5" type="textarea" v-model="formData.couponUseIntro" placeholder="请输入使用须知" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="优惠劵类型" prop="couponType">
<el-radio-group v-model="formData.couponType">
<el-radio v-for="item in coupon_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponType == 1">
<el-form-item :label-width="labelWidth" label="减免金额" prop="couponDeductionMoney">
<el-input-number v-model.number="formData.couponDeductionMoney" controls-position="right" :min="0"
precision="2" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponType == 2">
<el-form-item :label-width="labelWidth" label="折扣率" prop="couponDiscountRate">
<el-input-number v-model.number="formData.couponDiscountRate" controls-position="right" :min="0" :max="9.9"
precision="2" />
<span class="number-unit">%</span>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="最低消费金额" prop="couponMinConsumeMoney">
<el-input-number v-model.number="formData.couponMinConsumeMoney" controls-position="right" :min="0"
precision="2" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="到期类型" prop="couponExpireType">
<el-radio-group v-model="formData.couponExpireType">
<el-radio v-for="item in coupon_expire_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponExpireType == 1">
<el-form-item :label-width="labelWidth" label="有效天数" prop="couponEffectiveDays">
<el-input-number v-model.number="formData.couponEffectiveDays" controls-position="right" :min="0" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponExpireType == 2">
<el-form-item :label-width="labelWidth" label="" prop="couponFixedStartTime">
<!-- <el-date-picker v-model="formData.couponFixedStartTime" type="datetime" :teleported="false"
placeholder="选择日期时间"></el-date-picker> -->
<el-date-picker v-model="formData.couponFixedTime" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="适用范围" prop="couponApplicableScope">
<el-radio-group v-model="formData.couponApplicableScope">
<el-radio v-for="item in applicable_scope " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24" v-if="formData.couponApplicableScope == 2">
<el-form-item :label-width="labelWidth" label="" prop="">
<el-button type="primary" plain @click="handleChooseGoods">+ 指定商品</el-button>
</el-form-item>
</el-col>
<el-col :lg="24" v-if="formData.couponApplicableScopeConfig.length != 0">
<el-form-item :label-width="labelWidth" label="" prop="">
<el-table v-loading="loading" :data="formData.couponApplicableScopeConfig" ref="tableRef" border highlight-current-row>
<el-table-column prop="goodsPicture" width="150" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]" :preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsName" width="400" label="商品名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="goodsPriceLowest" label="价格" align="center" />
<el-table-column prop="goodsTotalInventory" label="库存总量" align="center" />
</el-table>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="发送数量" prop="couponSendNumber">
<div style="display: block;">
<el-input-number v-model.number="formData.couponSendNumber" controls-position="right" :min="-1" />
<div class="input-intro">(-1不限制)</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="couponDisplayStatus">
<el-radio-group v-model="formData.couponDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="couponSort">
<el-input-number v-model.number="formData.couponSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)" :loading="loadingStatus">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择商品 -->
<ChooseMultipleGoodsDialog v-model="ChooseGoodsDialogVisible" :data="ChooseGoodsDialogRow">
</ChooseMultipleGoodsDialog>
<!-- 选择店铺 -->
<ChooseShopDialog v-model="ChooseShopDialogVisible" :data="ChooseShopDialogRow" >
</ChooseShopDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import useUserStore from '@/store/modules/user'
import { addOrUpdateCoupon } from '@/api/business/Marketing/CouponManage/Coupons/coupon.js';
import ChooseMultipleGoodsDialog from '@/views/business/components/ChooseMultipleGoodsDialog.vue';
import ChooseShopDialog from '@/views/business/components/ChooseShopDialog.vue';
//
const openDialog = async () => {
await getcoupon_type()
await getcoupon_expire_type()
await getapplicable_scope()
await getdisplay_status()
}
// -
const userid = useUserStore().userId
//
const coupon_type = ref([]);
//
const coupon_expire_type = ref([]);
//
const applicable_scope = ref([]);
//
const display_status = ref([]);
//
const ChooseShopDialogVisible = ref(false);
const ChooseShopDialogRow = ref({});
//
const ChooseGoodsDialogVisible = ref(false);
const ChooseGoodsDialogRow = ref({});
// -
//
async function getcoupon_type() {
await proxy.getDicts('coupon_type').then((res) => {
coupon_type.value = res.data
})
}
//
async function getcoupon_expire_type() {
await proxy.getDicts('coupon_expire_type').then((res) => {
coupon_expire_type.value = res.data
})
}
//
async function getapplicable_scope() {
await proxy.getDicts('applicable_scope').then((res) => {
applicable_scope.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
const handleChooseShop = () => {
ChooseShopDialogVisible.value = true
ChooseShopDialogRow.value = formData
}
//
const handleChooseGoods = () => {
ChooseGoodsDialogVisible.value = true
ChooseGoodsDialogRow.value = formData
}
// -
const loadingStatus = ref(false)
const labelWidth = 120;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
couponType: 1,
couponExpireType: 1,
couponApplicableScope: 1,
couponDisplayStatus: 1,
couponSort: 100,
couponSendNumber: -1,
couponApplicableScopeConfig: [],
couponGoodsIdsArr: [],
couponGoodsIds: "",
couponFixedTime: []
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "Coupon"
})
//
const rules = reactive({
couponGuid: [{ required: true, message: "不能为空", trigger: "blur", type: "number" }],
couponName: [{ required: true, message: "优惠劵名称不能为空", trigger: "blur" }],
couponDesc: [{ required: true, message: "优惠劵介绍不能为空", trigger: "blur" }],
couponType: [{ required: true, message: "优惠劵类型不能为空", trigger: "blur", type: "number" }],
couponMinConsumeMoney: [{ required: true, message: "最低消费金额不能为空", trigger: "blur" }],
couponExpireType: [{ required: true, message: "到期类型不能为空", trigger: "blur", type: "number" }],
couponSendNumber: [{ required: true, message: "发送数量(-1不限制)不能为空", trigger: "blur", type: "number" }],
couponDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
couponSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
if (formData.couponGoodsIdsArr.length != 0) {
formData.couponGoodsIds = formData.couponGoodsIdsArr.join(',')
}
if (formData.couponApplicableScopeConfig) {
formData.couponApplicableScopeConfig = JSON.stringify(formData.couponApplicableScopeConfig)
}
if(formData.couponFixedTime.length != 0){
formData.couponFixedStartTime = formData.couponFixedTime[0]
formData.couponFixedEndTime = formData.couponFixedTime[1]
}
const { code } = await addOrUpdateCoupon(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
loadingStatus.value = false
}
});
};
const closeDialog = () => {
formData.couponApplicableScopeConfig = []
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>
<style>
.number-unit {
margin-left: 10px;
}
.input-intro {
color: #8c8c8c;
font-size: 12px;
}
</style>

View File

@ -1,213 +0,0 @@
<!--
* @Descripttion: (优惠券/tb_coupon 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-24)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-24)
-->
<template>
<el-dialog v-model="props.modelValue" title="优惠券信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules" disabled>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠劵名称" prop="couponName">
<el-input v-model="formData.couponName" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="优惠劵介绍" prop="couponDesc">
<el-input v-model="formData.couponDesc" placeholder="请输入优惠劵介绍" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="优惠劵类型" prop="couponType">
<el-radio-group v-model="formData.couponType">
<el-radio v-for="item in coupon_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponType == 1">
<el-form-item :label-width="labelWidth" label="减免金额" prop="couponDeductionMoney">
<el-input-number v-model.number="formData.couponDeductionMoney" controls-position="right" :min="0"
precision="2" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponType == 2">
<el-form-item :label-width="labelWidth" label="折扣率" prop="couponDiscountRate">
<el-input-number v-model.number="formData.couponDiscountRate" controls-position="right" :min="0"
precision="2" />
<span class="number-unit">%</span>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="最低消费金额" prop="couponMinConsumeMoney">
<el-input-number v-model.number="formData.couponMinConsumeMoney" controls-position="right" :min="0"
precision="2" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="到期类型" prop="couponExpireType">
<el-radio-group v-model="formData.couponExpireType">
<el-radio v-for="item in coupon_expire_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponExpireType == 1">
<el-form-item :label-width="labelWidth" label="有效天数" prop="couponEffectiveDays">
<el-input-number v-model.number="formData.couponEffectiveDays" controls-position="right" :min="0" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponExpireType == 2">
<el-form-item :label-width="labelWidth" label="" prop="couponFixedStartTime">
<!-- <el-date-picker v-model="formData.couponFixedStartTime" type="datetime" :teleported="false"
></el-date-picker> -->
<el-date-picker v-model="formData.couponFixedTime" type="daterange" range-separator="-" start end />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="适用范围" prop="couponApplicableScope">
<el-radio-group v-model="formData.couponApplicableScope">
<el-radio v-for="item in applicable_scope " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24" v-if="formData.couponApplicableScope == 2">
<el-form-item :label-width="labelWidth" label="" prop="">
<el-button type="primary" plain @click="handleChooseGoods">+ 指定商品</el-button>
<el-table v-if="formData.couponApplicableScopeConfig.length != 0" v-loading="loading"
:data="formData.couponApplicableScopeConfig" ref="tableRef" border highlight-current-row>
<el-table-column prop="goodsPicture" width="150" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]" :preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsName" width="400" label="商品名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="goodsPriceLowest" label="价格" align="center" />
<el-table-column prop="goodsTotalInventory" label="库存总量" align="center" />
</el-table>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="发送数量" prop="couponSendNumber">
<div style="display: block;">
<el-input-number v-model.number="formData.couponSendNumber" controls-position="right" :min="-1" />
<div class="input-intro">(-1不限制)</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="couponDisplayStatus">
<el-radio-group v-model="formData.couponDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="couponSort">
<el-input-number v-model.number="formData.couponSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
//
const openDialog = async () => {
await getcoupon_type()
await getcoupon_expire_type()
await getapplicable_scope()
await getdisplay_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
//
const coupon_type = ref([]);
//
const coupon_expire_type = ref([]);
//
const applicable_scope = ref([]);
//
const display_status = ref([]);
// -
//
async function getcoupon_type() {
await proxy.getDicts('coupon_type').then((res) => {
coupon_type.value = res.data
})
}
//
async function getcoupon_expire_type() {
await proxy.getDicts('coupon_expire_type').then((res) => {
coupon_expire_type.value = res.data
})
}
//
async function getapplicable_scope() {
await proxy.getDicts('applicable_scope').then((res) => {
applicable_scope.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,296 +0,0 @@
<!--
* @Descripttion: (优惠券/tb_coupon 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-24)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-25)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改优惠券信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠劵名称" prop="couponName">
<el-input v-model="formData.couponName" placeholder="请输入优惠劵名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="优惠劵介绍" prop="couponDesc">
<el-input v-model="formData.couponDesc" placeholder="请输入优惠劵介绍" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="使用须知" prop="couponUseIntro">
<el-input :rows="5" type="textarea" v-model="formData.couponUseIntro" placeholder="请输入使用须知" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="优惠劵类型" prop="couponType">
<el-radio-group v-model="formData.couponType">
<el-radio v-for="item in coupon_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponType == 1">
<el-form-item :label-width="labelWidth" label="减免金额" prop="couponDeductionMoney">
<el-input-number v-model.number="formData.couponDeductionMoney" controls-position="right" :min="0"
precision="2" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponType == 2">
<el-form-item :label-width="labelWidth" label="折扣率" prop="couponDiscountRate">
<el-input-number v-model.number="formData.couponDiscountRate" controls-position="right" :min="0" :max="9.9"
precision="1" />
<span class="number-unit">%</span>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="最低消费金额" prop="couponMinConsumeMoney">
<el-input-number v-model.number="formData.couponMinConsumeMoney" controls-position="right" :min="0"
precision="2" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="到期类型" prop="couponExpireType">
<el-radio-group v-model="formData.couponExpireType">
<el-radio v-for="item in coupon_expire_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponExpireType == 1">
<el-form-item :label-width="labelWidth" label="有效天数" prop="couponEffectiveDays">
<el-input-number v-model.number="formData.couponEffectiveDays" controls-position="right" :min="0" />
<span class="number-unit"></span>
</el-form-item>
</el-col>
<el-col :lg="12" v-if="formData.couponExpireType == 2">
<el-form-item :label-width="labelWidth" label="" prop="couponFixedStartTime">
<!-- <el-date-picker v-model="formData.couponFixedStartTime" type="datetime" :teleported="false"
placeholder="选择日期时间"></el-date-picker> -->
<el-date-picker v-model="formData.couponFixedTime" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="适用范围" prop="couponApplicableScope">
<el-radio-group v-model="formData.couponApplicableScope">
<el-radio v-for="item in applicable_scope " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="24" v-if="formData.couponApplicableScope == 2">
<el-form-item :label-width="labelWidth" label="" prop="">
<el-button type="primary" plain @click="handleChooseGoods">+ 指定商品</el-button>
<el-table v-if="formData.couponApplicableScopeConfig.length != 0" v-loading="loading"
:data="formData.couponApplicableScopeConfig" ref="tableRef" border highlight-current-row>
<el-table-column prop="goodsPicture" width="150" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]" :preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsName" width="400" label="商品名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="goodsPriceLowest" label="价格" align="center" />
<el-table-column prop="goodsTotalInventory" label="库存总量" align="center" />
</el-table>
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="发送数量" prop="couponSendNumber">
<div style="display: block;">
<el-input-number v-model.number="formData.couponSendNumber" controls-position="right" :min="-1" />
<div class="input-intro">(-1不限制)</div>
</div>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="显示状态" prop="couponDisplayStatus">
<el-radio-group v-model="formData.couponDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="couponSort">
<el-input-number v-model.number="formData.couponSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择商品 -->
<ChooseMultipleGoodsDialog v-model="ChooseGoodsDialogVisible" :data="ChooseGoodsDialogRow">
</ChooseMultipleGoodsDialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateCoupon } from "@/api/business/Marketing/CouponManage/Coupons/coupon.js";
import ChooseMultipleGoodsDialog from '@/views/business/components/ChooseMultipleGoodsDialog.vue';
//
const openDialog = async () => {
await getcoupon_type()
await getcoupon_expire_type()
await getapplicable_scope()
await getdisplay_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
//
const coupon_type = ref([]);
//
const coupon_expire_type = ref([]);
//
const applicable_scope = ref([]);
//
const display_status = ref([]);
//
const ChooseGoodsDialogVisible = ref(false);
const ChooseGoodsDialogRow = ref({});
// -
//
async function getcoupon_type() {
await proxy.getDicts('coupon_type').then((res) => {
coupon_type.value = res.data
})
}
//
async function getcoupon_expire_type() {
await proxy.getDicts('coupon_expire_type').then((res) => {
coupon_expire_type.value = res.data
})
}
//
async function getapplicable_scope() {
await proxy.getDicts('applicable_scope').then((res) => {
applicable_scope.value = res.data
})
}
//
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
//
const handleChooseGoods = () => {
ChooseGoodsDialogVisible.value = true
ChooseGoodsDialogRow.value = formData.value
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Coupon"
})
//
const rules = reactive({
couponGuid: [{ required: true, message: "不能为空", trigger: "blur", type: "number" }],
couponName: [{ required: true, message: "优惠劵名称不能为空", trigger: "blur" }],
couponDesc: [{ required: true, message: "优惠劵介绍不能为空", trigger: "blur" }],
couponType: [{ required: true, message: "优惠劵类型不能为空", trigger: "blur", type: "number" }],
couponMinConsumeMoney: [{ required: true, message: "最低消费金额不能为空", trigger: "blur" }],
couponExpireType: [{ required: true, message: "到期类型不能为空", trigger: "blur", type: "number" }],
couponSendNumber: [{ required: true, message: "发送数量(-1不限制)不能为空", trigger: "blur", type: "number" }],
couponDisplayStatus: [{ required: true, message: "显示状态不能为空", trigger: "blur", type: "number" }],
couponSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
if (formData.value.couponGoodsIds) {
if (formData.value.couponGoodsIds.length != 0) {
formData.value.couponGoodsIds = formData.value.couponGoodsIds.join(',')
}
}
if (formData.value.couponApplicableScopeConfig) {
formData.value.couponApplicableScopeConfig = JSON.stringify(formData.value.couponApplicableScopeConfig)
}
if (formData.value.couponFixedTime.length != 0) {
formData.value.couponFixedStartTime = formData.value.couponFixedTime[0]
formData.value.couponFixedEndTime = formData.value.couponFixedTime[1]
}
const { code } = await addOrUpdateCoupon(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
loadingStatus.value = false
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,124 +0,0 @@
<!--
* @Descripttion: (优惠券/tb_coupon导入弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-24)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-24)
-->
<template>
<el-dialog title="导入" v-model="props.modelValue" width="400px" @closed="closeDialog">
<el-upload
name="file"
ref="uploadRef"
:limit="1"
accept=".xlsx, .xls"
:headers="upload.headers"
:action="upload.url + '?updateSupport=' + upload.updateSupport"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:on-success="handleFileSuccess"
:auto-upload="false"
drag>
<el-icon class="el-icon--upload">
<upload-filled />
</el-icon>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
<template #tip>
<div class="el-upload__tip text-center">
<div class="el-upload__tip">
<el-checkbox v-model="upload.updateSupport" /> 是否更新已经存在的优惠券
</div>
<span>仅允许导入xlsxlsx格式文件</span>
<el-link type="primary" :underline="false" style="font-size: 12px; vertical-align: baseline" @click="importTemplate">下载模板</el-link>
</div>
</template>
</el-upload>
<template #footer>
<el-button @click="closeDialog">取消</el-button>
<el-button type="primary" @click="submitFileForm">提交</el-button>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage, ElMessageBox, ElNotification, ElLoading } from 'element-plus'
import { getToken } from '@/utils/auth'
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
let loadingInstance;
let uploadRef = ref()
/*** 导入参数 */
const upload = reactive({
//
isUploading: false,
//
updateSupport: false,
//
headers: { Authorization: 'Bearer ' + getToken() },
//
url: import.meta.env.VITE_APP_BASE_API + '/business/coupon/importData',
})
//
function loading(content) {
loadingInstance = ElLoading.service({
lock: true,
text: content,
background: "rgba(0, 0, 0, 0.7)",
})
}
//
function closeLoading() {
loadingInstance.close();
}
// -
/** 下载模板操作 */
function importTemplate() {
proxy.download('/business/coupon/importTemplate', '优惠券数据导入模板')
}
/**文件上传中处理 */
const handleFileUploadProgress = (event, file, fileList) => {
upload.isUploading = true
loading('正在导入数据,请稍候...')
}
/** 文件上传成功处理 */
const handleFileSuccess = (response, file, fileList) => {
closeLoading();
closeDialog()
upload.isUploading = false
uploadRef.value.clearFiles()
ElMessageBox.alert("<div style='overflow: auto;overflow-x: hidden;max-height: 70vh;padding: 10px 20px 0;'>" + response.data + '</div>', '导入结果', {
dangerouslyUseHTMLString: true,
})
props.done()
}
/** 提交上传文件 */
function submitFileForm() {
uploadRef.value.submit()
}
// -
const emits = defineEmits(["update:modelValue"]);
const dialogVisible = ref(props.modelValue);
const formData = reactive({});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
// -
const closeDialog = () => {
dialogVisible.value = false;
emits("update:modelValue", false);
};
</script>

View File

@ -1,318 +0,0 @@
<!--
* @Descripttion: (优惠券/tb_coupon)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-24)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-24)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="优惠劵名称" prop="couponName">
<el-input v-model="queryParams.couponName" placeholder="请输入优惠劵名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="优惠劵类型" prop="couponType">
<el-select v-model="queryParams.couponType" placeholder="请选择优惠劵类型" clearable @change="handleQuery">
<el-option v-for="item in coupon_type " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="显示状态" prop="couponDisplayStatus">
<el-radio-group v-model="queryParams.couponDisplayStatus">
<el-radio v-for="item in display_status " :key="item.dictValue" :label="item.dictValue">{{ item.dictLabel
}}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:coupon:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:coupon:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="primary" plain icon="Upload" @click="UploadDialogVisible = true"
v-hasPermi="['business:coupon:import']">导入</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:coupon:export']">
{{ $t('btn.export') }}
</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" border highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<!-- <el-table-column prop="shopName" width="250" label="店铺名称" align="center" :show-overflow-tooltip="true" /> -->
<el-table-column prop="couponName" width="350" label="优惠劵名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="couponType" label="优惠劵类型" align="center">
<template #default="scope">
<dict-tag :options="coupon_type" :value="scope.row.couponType" />
</template>
</el-table-column>
<el-table-column prop="couponEffectiveDays" label="有效天数" align="center" />
<el-table-column prop="couponSendNumber" label="发送数量" align="center">
<template #default="scope">
<div v-if="scope.row.couponSendNumber == -1">不限量</div>
<div v-else>{{ scope.row.couponSendNumber }}</div>
</template>
</el-table-column>
<el-table-column prop="couponGetNumber" label="领取数量" align="center" />
<el-table-column prop="couponDisplayStatus" label="显示状态" align="center">
<template #default="scope">
<dict-tag :options="display_status" :value="scope.row.couponDisplayStatus" />
</template>
</el-table-column>
<el-table-column prop="couponStatus" label="状态" align="center">
<template #default="scope">
<dict-tag :options="coupon_status" :value="scope.row.couponStatus" />
</template>
</el-table-column>
<el-table-column prop="couponSort" label="排序" align="center" sortable />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:coupon:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:coupon:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
<!-- 导入 -->
<UploadDialog v-model="UploadDialogVisible" :done="() => resetQuery()"></UploadDialog>
</template>
<script setup name="coupon">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportCoupon, couponList, delCoupon } from '@/api/business/Marketing/CouponManage/Coupons/coupon.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
import UploadDialog from "./components/UploadDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const UploadDialogVisible = ref(false);
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
//
//
const coupon_type = ref([]);
async function getcoupon_type() {
await proxy.getDicts('coupon_type').then((res) => {
coupon_type.value = res.data
})
}
getcoupon_type()
//
const coupon_expire_type = ref([]);
async function getcoupon_expire_type() {
await proxy.getDicts('coupon_expire_type').then((res) => {
coupon_expire_type.value = res.data
})
}
// getcoupon_expire_type()
//
const applicable_scope = ref([]);
async function getapplicable_scope() {
await proxy.getDicts('applicable_scope').then((res) => {
applicable_scope.value = res.data
})
}
// getapplicable_scope()
//
const display_status = ref([]);
async function getdisplay_status() {
await proxy.getDicts('display_status').then((res) => {
display_status.value = res.data
})
}
getdisplay_status()
//
const coupon_status = ref([]);
async function getcoupon_status() {
await proxy.getDicts('coupon_status').then((res) => {
coupon_status.value = res.data
})
}
getcoupon_status()
//
//
function getList() {
loading.value = true
couponList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
dataList.value.forEach(item => {
if (item.couponGoodsIdsArr.length != 0) {
item.couponGoodsIds = item.couponGoodsIdsArr.split(',')
}
if (item.couponApplicableScopeConfig) {
item.couponApplicableScopeConfig = JSON.parse(item.couponApplicableScopeConfig)
}
if (item.couponFixedStartTime && item.couponFixedEndTime) {
item.couponFixedTime = []
item.couponFixedTime.push(item.couponFixedStartTime)
item.couponFixedTime.push(item.couponFixedEndTime)
// console.log(item.couponFixedTime,'');
}
});
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.couponId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.couponId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delCoupon(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.couponId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
let str = ''
for (const key in Ids) {
str += Ids[key] + ','
}
str = str.slice(0, str.length - 1)
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportCoupon(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,182 +0,0 @@
<!--
* @Descripttion: (领券记录/tb_customer_coupon 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-31)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-31)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加领券记录信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券" prop="couponGuid">
<el-input v-model='formData.couponName' disabled type="text" placeholder='点击选择优惠券'>
<template #append>
<div @click="handleChooseCoupon">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerGuid">
<el-input v-model='formData.customerNickname' disabled type="text" placeholder='点击选择客户'>
<template #append>
<div @click="handleChooseCustomer">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<!-- <el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否过期" prop="customerCouponIsExpired">
<el-select v-model="formData.customerCouponIsExpired" placeholder="请选择是否过期">
<el-option v-for="item in is_expired " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否已使用" prop="customerCouponIsUsed">
<el-select v-model="formData.customerCouponIsUsed" placeholder="请选择是否已使用">
<el-option v-for="item in is_used " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col> -->
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)" :loading="loadingStatus">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择客户 -->
<ChooseCustomerDialog v-model="ChooseCustomerDialogVisible" :data="ChooseCustomerDialogRow">
</ChooseCustomerDialog>
<!-- 选择商品 -->
<ChooseCouponDialog v-model="ChooseCouponDialogVisible" :data="ChooseCouponDialogRow">
</ChooseCouponDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateCustomerCoupon } from '@/api/business/Marketing/CouponManage/CustomerCoupons/customerCoupon.js';
import ChooseCustomerDialog from '@/views/business/components/ChooseCustomerDialog.vue';
import ChooseCouponDialog from '@/views/business/components/ChooseCouponDialog.vue';
//
const openDialog = async () => {
await getis_expired()
await getis_used()
}
// -
//
const is_expired = ref([]);
// 使
const is_used = ref([]);
//
const ChooseCustomerDialogVisible = ref(false);
const ChooseCustomerDialogRow = ref({});
//
const ChooseCouponDialogVisible = ref(false);
const ChooseCouponDialogRow = ref({});
// -
//
async function getis_expired() {
await proxy.getDicts('is_expired').then((res) => {
is_expired.value = res.data
})
}
//
async function getis_used() {
await proxy.getDicts('is_used').then((res) => {
is_used.value = res.data
})
}
//
const handleChooseCustomer = () => {
ChooseCustomerDialogVisible.value = true
ChooseCustomerDialogRow.value = formData
}
//
const handleChooseCoupon = () => {
ChooseCouponDialogVisible.value = true
ChooseCouponDialogRow.value = formData
}
// -
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
customerCouponIsExpired: 1,
customerCouponIsUsed: 1,
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "CustomerCoupon"
})
//
const rules = reactive({
couponGuid: [{ required: true, message: "优惠劵guid不能为空", trigger: "blur"}],
customerGuid: [{ required: true, message: "客户guid不能为空", trigger: "blur"}],
customerCouponIsExpired: [{ required: true, message: "是否过期不能为空", trigger: "change", type: "number" }],
customerCouponIsUsed: [{ required: true, message: "是否已使用不能为空", trigger: "change", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await addOrUpdateCustomerCoupon(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
loadingStatus.value = false
}
});
};
const closeDialog = () => {
formData.couponName = ""
formData.customerNickname = ""
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,115 +0,0 @@
<!--
* @Descripttion: (领券记录/tb_customer_coupon 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-31)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-31)
-->
<template>
<el-dialog v-model="props.modelValue" title="领券记录信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券" prop="couponGuid">
<el-input v-model='formData.couponName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerGuid">
<el-input v-model='formData.customerName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否过期">
<el-select v-model="formData.customerCouponIsExpired">
<el-option v-for="item in is_expired " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否已使用">
<el-select v-model="formData.customerCouponIsUsed">
<el-option v-for="item in is_used " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
//
const openDialog = async () => {
await getis_expired()
await getis_used()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
//
const is_expired = ref([]);
// 使
const is_used = ref([]);
// -
//
async function getis_expired() {
await proxy.getDicts('is_expired').then((res) => {
is_expired.value = res.data
})
}
//
async function getis_used() {
await proxy.getDicts('is_used').then((res) => {
is_used.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,162 +0,0 @@
<!--
* @Descripttion: (领券记录/tb_customer_coupon 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-31)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-31)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改领券记录信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券" prop="couponGuid">
<el-input v-model='formData.couponName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerGuid">
<el-input v-model='formData.customerName' disabled type="text">
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否过期" prop="customerCouponIsExpired">
<el-select v-model="formData.customerCouponIsExpired" placeholder="请选择是否过期">
<el-option v-for="item in is_expired " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否已使用" prop="customerCouponIsUsed">
<el-select v-model="formData.customerCouponIsUsed" placeholder="请选择是否已使用">
<el-option v-for="item in is_used " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateCustomerCoupon } from "@/api/business/Marketing/CouponManage/CustomerCoupons/customerCoupon.js";
//
const openDialog = async () => {
await getis_expired()
await getis_used()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
//
const is_expired = ref([]);
// 使
const is_used = ref([]);
// -
//
async function getis_expired() {
await proxy.getDicts('is_expired').then((res) => {
is_expired.value = res.data
})
}
//
async function getis_used() {
await proxy.getDicts('is_used').then((res) => {
is_used.value = res.data
})
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "CustomerCoupon"
})
//
const rules = reactive({
customerCouponGuid: [{ required: true, message: "不能为空", trigger: "blur", type: "number" }],
customerCouponIsExpired: [{ required: true, message: "是否过期不能为空", trigger: "change", type: "number" }],
customerCouponIsUsed: [{ required: true, message: "是否已使用不能为空", trigger: "change", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await addOrUpdateCustomerCoupon(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
loadingStatus.value = false
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,218 +0,0 @@
<!--
* @Descripttion: (领券记录/tb_customer_coupon)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-07-31)
* @LastEditors: (lwh)
* @LastEditTime: (2023-07-31)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="是否过期" prop="customerCouponIsExpired">
<el-select v-model="queryParams.customerCouponIsExpired" placeholder="请选择是否过期" clearable @change="handleQuery">
<el-option v-for="item in is_expired " :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="是否已使用" prop="customerCouponIsUsed">
<el-select v-model="queryParams.customerCouponIsUsed" placeholder="请选择是否已使用" clearable @change="handleQuery">
<el-option v-for="item in is_used " :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:customercoupon:addOrUpdate']" plain icon="plus" @click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:customercoupon:delete']" plain icon="delete" @click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" border highlight-current-row @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="couponName" label="优惠劵名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="customerName" label="客户名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="customerCouponIsExpired" label="是否过期" align="center">
<template #default="scope">
<dict-tag :options=" is_expired " :value="scope.row.customerCouponIsExpired" />
</template>
</el-table-column>
<el-table-column prop="customerCouponIsUsed" label="是否已使用" align="center">
<template #default="scope">
<dict-tag :options=" is_used " :value="scope.row.customerCouponIsUsed" />
</template>
</el-table-column>
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:customercoupon:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:customercoupon:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="customercoupon">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { customerCouponList , delCustomerCoupon } from '@/api/business/Marketing/CouponManage/CustomerCoupons/customerCoupon.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
//
//
const is_expired = ref([]);
async function getis_expired() {
await proxy.getDicts('is_expired').then((res) => {
is_expired.value = res.data
})
}
getis_expired()
//
const is_used = ref([]);
async function getis_used() {
await proxy.getDicts('is_used').then((res) => {
is_used.value = res.data
})
}
getis_used()
//
//
function getList() {
loading.value = true
customerCouponList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.customerCouponId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.customerCouponId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delCustomerCoupon(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,174 +0,0 @@
<!--
* @Descripttion: (审核售后订单)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-10-17)
* @LastEditors: (lwh)
* @LastEditTime: (2023-10-17)
-->
<template>
<el-dialog v-model="props.modelValue" title="审核售后订单" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="退款金额" prop="">
{{ formData.refundMoney }}
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="审核状态" prop="isAgree">
<div class="radio-box">
<el-radio-group style="display: flex;" v-model="formData.isAgree" @change="handleSelect()">
<el-radio :label=true>同意</el-radio>
<el-radio :label=false>拒绝</el-radio>
</el-radio-group>
<!-- <div class="input-intro">同意后将退回付款金额并关闭订单</div> -->
</div>
</el-form-item>
</el-col>
<!-- 同意审核商家选择退款地址 -->
<el-col :lg="24" v-if="formData.isAgree">
<el-form-item :label-width="labelWidth" label="退货地址" prop="">
<el-select v-model="formData.shopAddressGuid" placeholder="请选择商家退货地址" clearable>
<el-option v-for="item in dataList " :key="item.shopAddressGuid" :label="item.addressName + '--' + item.shopAddressDetailedAddress"
:value="item.shopAddressGuid"></el-option>
</el-select>
</el-form-item>
</el-col>
<!-- 同意拒绝商家说明原因 -->
<el-col :lg="24" v-if="formData.isAgree == false">
<el-form-item :label-width="labelWidth" label="拒绝说明" prop="">
<el-input :rows="5" type="textarea" v-model="formData.merchantRefuseDesc" placeholder="请输入拒绝说明" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">确认</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { auditOrderRefund } from '@/api/business/OrderManage/OrderRefunds/orderRefund.js'
import { shopAddressList } from '@/api/business/ShopManager/ShopAddresss/shopAddress.js'
//
const openDialog = async () => {
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
const dataList = ref([])
const params = ref({
pageSize: 10000,
shopGuid: formData.value.shopGuid,
shopAddressType: 2
})
console.log(params.value,'参数');
// -
function getList() {
shopAddressList(params.value).then((res) => {
if (res.code == 200) {
dataList.value = res.data.result;
console.log(dataList.value, '地址列表');
}
});
}
function handleSelect() {
if(formData.value.isAgree){
params.value.shopGuid = formData.value.shopGuid
getList()
console.log(formData.value.shopAddressGuid);
}
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Order"
})
//
const rules = reactive({
isAgree: [{ required: true, message: "审核状态不能为空", trigger: "blur" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code, data } = await auditOrderRefund(formData.value);
if (code == 200) {
modal.msgSuccess(data)
props.done();
closeDialog();
loadingStatus.value = false
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>
<style>
.input-intro {
color: #8c8c8c;
font-size: 12px;
}
.radio-box {
display: flex;
flex-direction: column;
}
</style>

View File

@ -1,482 +0,0 @@
<!--
* @Descripttion: (订单/tb_order)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-08-29)
* @LastEditors: (lwh)
* @LastEditTime: (2023-08-29)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="订单号" prop="orderNumber">
<el-input v-model="queryParams.orderNumber" placeholder="请输入订单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="售后类型" prop="refundType">
<el-select v-model="queryParams.refundType" placeholder="请选择售后类型" clearable @change="handleQuery">
<el-option v-for="item in refund_type " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="商家审核状态" prop="merchantAuditStatus">
<el-select v-model="queryParams.merchantAuditStatus" placeholder="请选择商家审核状态" clearable @change="handleQuery">
<el-option v-for="item in merchant_audit_status " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="售后单状态" prop="orderRefundStatus">
<el-select v-model="queryParams.orderRefundStatus" placeholder="请选择售后单状态" clearable @change="handleQuery">
<el-option v-for="item in order_refund_status " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="申请时间">
<el-date-picker v-model="dateRange" style="width: 240px" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="defaultTime2"
@change="handleQuery"></el-date-picker>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:order:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:order:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:order:export']">
{{ $t('btn.export') }}
</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" border highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="goodsInfo" label="商品信息 / 单价与数量" width="500">
<template #default="scope">
<div class="order-num-box">
<div>订单号<b>{{ scope.row.orderNumber }}</b></div>
<el-link class="copy" type="primary" @click="copyText(scope.row.orderNumber)">复制订单号</el-link>
</div>
<div class="goods-info-box" v-for="(item, idx) in scope.row.goodsInfoList" :key="idx">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="item.goodsPicture?.split(',')[0]" :preview-src-list="item.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
<div>
<div class="goods-info-text m2">
{{ item.goodsName }}
</div>
<div>
<el-tag type="info" v-if="item.goodsSpecName">{{ item.goodsSpecName }}</el-tag>
</div>
</div>
<div class="price-box">
<div> {{ item.goodsPrice }}</div>
<div>× {{ item.goodsTotalNum }}</div>
</div>
</div>
</template>
</el-table-column>
<!-- <el-table-column prop="goodsInfo" label="单价/数量" width="150">
<template #default="scope">
<div> {{ scope.row.goodsInfo.goodsPrice }}</div>
<div>× {{ scope.row.goodsTotalNum }}</div>
</template>
</el-table-column> -->
<el-table-column prop="payPrice" label="实付款" width="150">
<template #default="scope">
<div> {{ scope.row.payPrice }}</div>
<div>(含运费 {{ scope.row.expressPrice }})</div>
</template>
</el-table-column>
<el-table-column prop="goodsInfo" label="买家信息" width="200">
<template #default="scope">
<div class="goods-info-box">
<div class="avatar">
<el-avatar shape="circle" :size="50" :src="scope.row.customerAvatar" />
</div>
<div>
<div class="goods-info-text m2">
{{ scope.row.customerNickName }}
</div>
<div>
{{ scope.row.customerMobilePhoneNumber }}
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="refundType" label="售后类型" width="150">
<template #default="scope">
<dict-tag :options="refund_type" :value="scope.row.refundType" />
</template>
</el-table-column>
<el-table-column prop="orderRefundStatus" label="售后单状态" width="150">
<template #default="scope">
<dict-tag :options="order_refund_status" :value="scope.row.orderRefundStatus" />
</template>
</el-table-column>
<el-table-column prop="deliveryStatus" label="处理进度" width="200">
<template #default="scope">
<div v-if="scope.row.orderRefundStatus == 1 || scope.row.orderRefundStatus == 3">
<div class="status-box">商家审核: &nbsp;<dict-tag :options="merchant_audit_status"
:value="scope.row.merchantAuditStatus" /></div>
<div class="status-box">用户发货: &nbsp;<dict-tag :options="is_customer_send" :value="scope.row.isCustomerSend" />
</div>
<div class="status-box">商家收货: &nbsp;<dict-tag :options="is_merchant_receive"
:value="scope.row.isMerchantReceive" />
</div>
</div>
<div v-if="scope.row.orderRefundStatus == 2">-- 商家已拒绝 --</div>
<div v-if="scope.row.orderRefundStatus == 4">-- 售后单已取消 --</div>
</template>
</el-table-column>
<el-table-column prop="createTime" label="申请时间" :show-overflow-tooltip="true" width="200" />
<el-table-column label="操作" width="300" fixed="right">
<template #default="scope">
<!-- <el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:order:addOrUpdate']">编辑</el-button> -->
<el-button type="primary" size="small" icon="view" @click="handleDetail(scope.row)">详情</el-button>
<!-- 审核售后订单 -->
<el-button type="warning" size="small"
v-if="scope.row.merchantAuditStatus == 1 && scope.row.orderRefundStatus == 1"
@click="handleAuditOrderRefund(scope.row)" icon="check">审核</el-button>
<!-- 确认收货 -->
<el-button type="warning" size="small"
v-if="scope.row.isCustomerSend == 2 && scope.row.orderRefundStatus == 1"
@click="handleConfirmsReceipt(scope.row)" icon="check">确认收货</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:order:delete']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 审核售后订单 -->
<AuditOrderRefundDialog v-model="AuditOrderRefundDialogVisible" :data="AuditOrderRefundDialogRow"
:done="() => resetQuery()">
</AuditOrderRefundDialog>
</template>
<script setup name="order">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportOrderRefund, orderRefundList, confirmsReceipt, delOrderRefund } from '@/api/business/OrderManage/OrderRefunds/orderRefund.js'
import AuditOrderRefundDialog from "./components/AuditOrderRefundDialog.vue";
import useClipboard from 'vue-clipboard3'
const AuditOrderRefundDialogVisible = ref(false);
const AuditOrderRefundDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
//
const router = useRouter();
const { toClipboard } = useClipboard()
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
const dateRange = ref([])
const defaultTime2 = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
] // '12:00:00', '08:00:00'
//
const copyText = async (val) => {
try {
await toClipboard(val)
proxy.$modal.msgSuccess('复制成功!')
} catch (e) {
console.log(e)
proxy.$modal.msgError('当前浏览器不支持')
}
}
//
function handleAuditOrderRefund(row) {
AuditOrderRefundDialogVisible.value = true
AuditOrderRefundDialogRow.value = row
}
function resetStatusQuery() {
queryParams.value.deliveryStatus = null;
queryParams.value.receiptStatus = null;
queryParams.value.payStatus = null;
queryParams.value.orderStatus = null;
}
/** 确认收货按钮操作 */
function handleConfirmsReceipt(row) {
const Ids = row.orderRefundGuid
ElMessageBox.confirm("是否确认确认收货?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return confirmsReceipt({ orderRefundGuid: Ids })
})
.then(() => {
handleQuery()
modal.msgSuccess("确认收货成功")
})
.catch(() => { })
}
//
const refund_type = ref([]);
async function getrefund_type() {
await proxy.getDicts('refund_type').then((res) => {
refund_type.value = res.data
})
}
getrefund_type()
//
const refund_reason = ref([]);
async function getrefund_reason() {
await proxy.getDicts('refund_reason').then((res) => {
refund_reason.value = res.data
})
}
getrefund_reason()
//
const goods_receive_status = ref([]);
async function getgoods_receive_status() {
await proxy.getDicts('goods_receive_status').then((res) => {
goods_receive_status.value = res.data
})
}
getgoods_receive_status()
//
const merchant_audit_status = ref([]);
async function getmerchant_audit_status() {
await proxy.getDicts('merchant_audit_status').then((res) => {
merchant_audit_status.value = res.data
})
}
getmerchant_audit_status()
//
const is_customer_send = ref([]);
async function getis_customer_send() {
await proxy.getDicts('is_customer_send').then((res) => {
is_customer_send.value = res.data
})
}
getis_customer_send()
//
const order_refund_status = ref([]);
async function getorder_refund_status() {
await proxy.getDicts('order_refund_status').then((res) => {
order_refund_status.value = res.data
})
}
getorder_refund_status()
//
const is_merchant_receive = ref([]);
async function getis_merchant_receive() {
await proxy.getDicts('is_merchant_receive').then((res) => {
is_merchant_receive.value = res.data
})
}
getis_merchant_receive()
//
//
function getList() {
loading.value = true
console.log(dateRange?.value[1])
orderRefundList(proxy.addDateRange(queryParams.value, dateRange.value)).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.orderRefundId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
resetStatusQuery()
dateRange.value = []
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.orderRefundId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delOrderRefund(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.orderRefundId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
let str = ''
for (const key in Ids) {
str += Ids[key] + ','
}
str = str.slice(0, str.length - 1)
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportOrderRefund(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleDetail(row) {
router.push("/orders/orderRefundsDetail?orderRefundId=" + row.orderRefundId)
// DetailDialogVisible.value = true
// DetailDialogRow.value = row
}
handleQuery()
</script>
<style lang="scss" scoped>
.goods-info-box {
display: flex;
justify-content: space-between;
margin: 10px 0;
}
.goods-info-text {
width: 250px;
margin-bottom: 10px;
}
.m2 {
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
.avatar {
margin-right: 15px;
}
.status-box {
display: flex;
align-items: center;
margin-bottom: 2px;
}
.price-box {
width: 60px;
}
.order-num-box {
display: flex;
position: relative;
.copy {
position: absolute;
right: 0%;
}
}</style>

View File

@ -1,509 +0,0 @@
<template>
<!-- 订单信息 -->
<el-card class="box-card">
<template v-if="detail.orderRefundStatus == 1">
<!-- 售后单操作 -->
<div class="order-operation">
<div class="card-title">售后单操作</div>
<div class="btn-box" v-if="detail.merchantAuditStatus == 1">
<!-- 审核售后订单 -->
<div style="width: 100%;">
<el-alert title="当前买家已发起售后申请,请及时审核处理。" type="warning" show-icon :closable=false />
<div>
<el-button type="primary" @click="handleAuditOrderRefund(detail)">商家审核</el-button>
</div>
</div>
</div>
<div class="btn-box" v-if="detail.isCustomerSend == 2">
<!-- 确认收货 -->
<div style="width: 100%;">
<el-alert title="当前买家已发货,请确认包裹后点击收货,确认收货后将退款给买家。" type="warning" show-icon :closable=false />
<div>
<el-button type="primary" @click="handleConfirmsReceipt(detail)">确认收货</el-button>
</div>
</div>
</div>
</div>
<el-divider />
</template>
<div class="order-info">
<div class="card-title">售后单信息</div>
<el-row class="order-info-box">
<el-col :span="8">订单号 {{ detail.orderNumber }}</el-col>
<el-col :span="8">买家信息 {{ detail.customerPhone }}</el-col>
<el-col :span="8">退款金额{{ detail.refundMoney }}</el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8">售后类型 <dict-tag :options="refund_type" :value="detail.refundType" /></el-col>
<el-col :span="8">售后单状态 <dict-tag :options="order_refund_status"
:value="detail.orderRefundStatus" /></el-col>
<el-col :span="8">申请时间 {{ detail.createTime }}</el-col>
</el-row>
</div>
<el-divider />
<div class="order-info">
<div class="card-title">处理进度</div>
<el-row class="order-info-box">
<el-col :span="8">审核状态(商家) <dict-tag :options="merchant_audit_status"
:value="detail.merchantAuditStatus" /></el-col>
<el-col :span="8">发货状态(买家) <dict-tag :options="is_customer_send" :value="detail.isCustomerSend" /></el-col>
<el-col :span="8">收货状态(商家) <dict-tag :options="is_merchant_receive"
:value="detail.isMerchantReceive" /></el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8" v-if="detail.merchantRefuseDesc">商家拒绝说明{{ detail.merchantRefuseDesc }}</el-col>
</el-row>
</div>
</el-card>
<el-card class="box-card">
<div class="order-info">
<div class="card-title">买家申请原因</div>
<el-row class="order-info-box">
<el-col :span="12" style="margin-bottom: 25px;">退货原因<dict-tag :options="refund_reason"
:value="detail.refundReason" /></el-col>
<el-col :span="12" style="margin-bottom: 25px;">退款说明{{ detail.customerRefundDesc }}</el-col>
<el-col :span="24">退款凭证
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="detail.customerRefundImg?.split(',')[0]"
:preview-src-list="detail.customerRefundImg?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</el-col>
</el-row>
</div>
</el-card>
<!-- 商品信息 -->
<el-card class="box-card">
<div class="card-title">订单商品</div>
<el-table v-loading="loading" :data="detail.goodsInfoList" ref="tableRef" highlight-current-row>
<el-table-column prop="goodsInfo" label="商品信息" width="700">
<template #default="scope">
<div class="goods-info-box">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]"
:preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
<div style="margin-left: 20px;">
<div class="goods-info-text ">
{{ scope.row.goodsName }}
</div>
<div>
<el-tag type="info" v-if="scope.row.goodsSpecName">{{ scope.row.goodsSpecName }}</el-tag>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="goodsCoding" label="编码" align="center">
<template #default="scope">
<div v-if="scope.row.goodsCoding">{{ scope.row.goodsCoding }}</div>
<div v-else> - - </div>
</template>
</el-table-column>
<el-table-column prop="goodsWeight" label="重量(Kg)" align="center" />
<el-table-column prop="goodsPrice" label="单价" align="center">
<template #default="scope">
<div> {{ scope.row.goodsPrice }}</div>
</template>
</el-table-column>
<el-table-column prop="goodsTotalNum" label="购买数量" align="center">
<template #default="scope">
<div>× {{ scope.row.goodsTotalNum }}</div>
</template>
</el-table-column>
<el-table-column prop="goodsTotalPrice" label="商品总价" align="center">
<template #default="scope">
<div> {{ scope.row.goodsTotalPrice }}</div>
</template>
</el-table-column>
</el-table>
</el-card>
<!-- 收货信息 / 发货信息 -->
<el-card class="box-card" v-if="detail.shopRefundAddressGuid">
<div class="card-title">商家收货信息</div>
<el-row class="order-info-box">
<el-col :span="8">收货人姓名 {{ detail.orderReceive?.consigneeName }}</el-col>
<el-col :span="8">联系电话 {{ detail.orderReceive?.phone }}</el-col>
<el-col :span="8">收货地区 {{ detail.orderReceive?.region }}</el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8">详细地址 {{ detail.orderReceive?.detail }}</el-col>
<el-col :span="8">收货状态 <dict-tag :options="is_merchant_receive" :value="detail.isMerchantReceive" /></el-col>
<el-col :span="8">收货时间 {{ detail.merchantReceiveTime }}</el-col>
</el-row>
<div v-if="detail.isCustomerSend == 2">
<el-divider />
<div class="card-title">买家发货信息</div>
<el-row class="order-info-box">
<el-col :span="8">物流公司 {{ detail.logisticsCompany }}</el-col>
<el-col :span="8">物流单号 {{ detail.expressNo }}</el-col>
<el-col :span="8">发货状态 <dict-tag :options="is_customer_send" :value="detail.isCustomerSend" /></el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8">发货时间 {{ detail.customerSendTime }}</el-col>
<el-col :span="8">备注 {{ detail.customerWaybillRemark }}</el-col>
</el-row>
</div>
</el-card>
<!-- 审核售后订单 -->
<AuditOrderRefundDialog v-model="AuditOrderRefundDialogVisible" :data="AuditOrderRefundDialogRow"
:done="() => getDetail()">
</AuditOrderRefundDialog>
</template>
<script setup>
import modal from '@/plugins/modal.js'
import { ElMessageBox } from 'element-plus'
import { getOrderRefundDetails, confirmsReceipt } from '@/api/business/OrderManage/OrderRefunds/orderRefund.js'
import AuditOrderRefundDialog from "./components/AuditOrderRefundDialog.vue";
const route = useRoute()
const { proxy } = getCurrentInstance()
const parm = reactive({
orderRefundId: route.query.orderRefundId
})
const AuditOrderRefundDialogVisible = ref(false);
const AuditOrderRefundDialogRow = ref({});
const loading = ref(true)
const detail = ref({})
//
function getDetail() {
loading.value = true
getOrderRefundDetails(parm).then((res) => {
if (res.code == 200) {
loading.value = false;
detail.value = res.data;
}
console.log(detail.value, '详情');
});
}
getDetail()
//
function handleAuditOrderRefund(row) {
AuditOrderRefundDialogVisible.value = true
AuditOrderRefundDialogRow.value = row
}
/** 确认收货按钮操作 */
function handleConfirmsReceipt(row) {
const Ids = row.orderRefundGuid
ElMessageBox.confirm("是否确认确认收货?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return confirmsReceipt({ orderRefundGuid: Ids })
})
.then(() => {
getDetail()
modal.msgSuccess("确认收货成功")
})
.catch(() => { })
}
//
const refund_type = ref([]);
async function getrefund_type() {
await proxy.getDicts('refund_type').then((res) => {
refund_type.value = res.data
})
}
getrefund_type()
//
const refund_reason = ref([]);
async function getrefund_reason() {
await proxy.getDicts('refund_reason').then((res) => {
refund_reason.value = res.data
})
}
getrefund_reason()
//
const goods_receive_status = ref([]);
async function getgoods_receive_status() {
await proxy.getDicts('goods_receive_status').then((res) => {
goods_receive_status.value = res.data
})
}
getgoods_receive_status()
//
const merchant_audit_status = ref([]);
async function getmerchant_audit_status() {
await proxy.getDicts('merchant_audit_status').then((res) => {
merchant_audit_status.value = res.data
})
}
getmerchant_audit_status()
//
const is_customer_send = ref([]);
async function getis_customer_send() {
await proxy.getDicts('is_customer_send').then((res) => {
is_customer_send.value = res.data
})
}
getis_customer_send()
//
const order_refund_status = ref([]);
async function getorder_refund_status() {
await proxy.getDicts('order_refund_status').then((res) => {
order_refund_status.value = res.data
})
}
getorder_refund_status()
//
const is_merchant_receive = ref([]);
async function getis_merchant_receive() {
await proxy.getDicts('is_merchant_receive').then((res) => {
is_merchant_receive.value = res.data
})
}
getis_merchant_receive()
</script>
<style lang="scss" scoped>
.box-card {
position: relative;
margin-bottom: 30px;
}
.card-title {
// font-size: 18px;
margin-bottom: 30px;
font-weight: bold;
}
.btn-box {
display: flex;
}
// 线
.o-divider {
margin-bottom: 32px;
}
//
.order-progress {
height: 26px;
line-height: 26px;
background: #f8f8f8;
border-radius: 13px;
font-size: 14px;
text-align: center;
position: relative;
li {
list-style: none;
}
&:before,
&:after {
content: '';
position: absolute;
z-index: 2;
left: 0;
top: 0;
bottom: 0;
border-radius: 13px;
background: #1890ff;
}
&:after {
background: #91d5ff;
z-index: 1;
}
&.progress-1 {
&:before {
width: 0;
}
&:after {
width: 20%;
}
}
&.progress-2 {
&:before {
width: 20%;
}
&:after {
width: 40%;
}
}
&.progress-3 {
&:before {
width: 40%;
}
&:after {
width: 60%;
}
}
&.progress-4 {
&:before {
width: 60%;
}
&:after {
width: 80%;
}
}
&.progress-5 {
&:before {
width: 100%;
}
&:after {
width: 100%;
}
li {
&:nth-child(5) {
color: #fff;
}
}
}
li {
width: 20%;
float: left;
border-radius: 13px;
position: relative;
z-index: 3;
}
.tip {
font-size: 12px;
padding-top: 10px;
color: #8c8c8c;
}
&.progress-1 li:nth-child(1),
&.progress-2 li:nth-child(1),
&.progress-3 li:nth-child(1),
&.progress-4 li:nth-child(1),
&.progress-5 li:nth-child(1) {
color: #fff;
}
&.progress-2 li:nth-child(2),
&.progress-3 li:nth-child(2),
&.progress-4 li:nth-child(2),
&.progress-5 li:nth-child(2) {
color: #fff;
}
&.progress-3 li:nth-child(3),
&.progress-4 li:nth-child(3),
&.progress-5 li:nth-child(3) {
color: #fff;
}
&.progress-4 li:nth-child(4),
&.progress-5 li:nth-child(4) {
color: #fff;
}
}
//
.order-info {
margin-bottom: 10px;
}
.order-info-box {
font-size: 15px;
margin-top: 25px;
}
.order-info-box div {}
//
.order-summary-box {
display: flex;
align-items: flex-end;
flex-direction: column;
margin: 20px 0;
div {
font-size: 15px;
margin-bottom: 5px;
}
}
.goods-info-box {
display: flex;
margin: 10px 0;
}
.goods-info-text {
width: 350px;
margin-bottom: 10px;
}
.m2 {
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
.el-alert {
display: flex;
// margin: 20px 0 0;
margin-bottom: 15px;
}
</style>

View File

@ -1,365 +0,0 @@
<!--
* @Descripttion: (订单/tb_order 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-08-29)
* @LastEditors: (lwh)
* @LastEditTime: (2023-08-29)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加订单信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品guid" prop="goodsGuid">
<el-input v-model="formData.goodsGuid" placeholder="请输入商品guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单流水guid" prop="paymentGuid">
<el-input v-model="formData.paymentGuid" placeholder="请输入订单流水guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户guid" prop="customerGuid">
<el-input v-model="formData.customerGuid" placeholder="请输入客户guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="店铺guid" prop="shopGuid">
<el-input v-model="formData.shopGuid" placeholder="请输入店铺guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单号" prop="orderNumber">
<el-input v-model="formData.orderNumber" placeholder="请输入订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品总金额" prop="goodsTotalAmoun">
<el-input v-model="formData.goodsTotalAmoun" placeholder="请输入商品总金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单金额" prop="orderAmount">
<el-input v-model="formData.orderAmount" placeholder="请输入订单金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券guid" prop="couponGuid">
<el-input v-model="formData.couponGuid" placeholder="请输入优惠券guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券抵扣金额" prop="couponMoney">
<el-input v-model="formData.couponMoney" placeholder="请输入优惠券抵扣金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣金额" prop="pointsMoney">
<el-input v-model="formData.pointsMoney" placeholder="请输入积分抵扣金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣数量" prop="pointsNum">
<el-input v-model="formData.pointsNum" placeholder="请输入积分抵扣数量" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="实际付款金额(包含运费)" prop="payPrice">
<el-input v-model="formData.payPrice" placeholder="请输入实际付款金额(包含运费)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="后台修改的订单金额(差价)" prop="updatePrice">
<el-input v-model="formData.updatePrice" placeholder="请输入后台修改的订单金额(差价)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="买家留言" prop="orderRemark">
<el-input v-model="formData.orderRemark" placeholder="请输入买家留言" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="支付方式(1微信支付 2余额支付)" prop="payType">
<el-select v-model="formData.payType" placeholder="请选择支付方式(1微信支付 2余额支付)">
<el-option v-for="item in pay_type " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="付款状态(1未付款 2已付款)" prop="payStatus">
<el-select v-model="formData.payStatus" placeholder="请选择付款状态(1未付款 2已付款)">
<el-option v-for="item in pay_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="付款时间" prop="payTime">
<el-date-picker v-model="formData.payTime" type="datetime" :teleported="false" placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="配送方式(1快递配送)" prop="deliveryType">
<el-select v-model="formData.deliveryType" placeholder="请选择配送方式(1快递配送)">
<el-option v-for="item in delivery_type " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="运费金额" prop="expressPrice">
<el-input v-model="formData.expressPrice" placeholder="请输入运费金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流公司guid" prop="logisticsCompanyGuid">
<el-input v-model="formData.logisticsCompanyGuid" placeholder="请输入物流公司guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流公司" prop="logisticsCompany">
<el-input v-model="formData.logisticsCompany" placeholder="请输入物流公司" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流单号" prop="logisticsTrackingNumber">
<el-input v-model="formData.logisticsTrackingNumber" placeholder="请输入物流单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="发货状态(1未发货 2已发货)" prop="deliveryStatus">
<el-select v-model="formData.deliveryStatus" placeholder="请选择发货状态(1未发货 2已发货)">
<el-option v-for="item in delivery_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="发货时间" prop="deliveryTime">
<el-date-picker v-model="formData.deliveryTime" type="datetime" :teleported="false" placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货状态(1未收货 2已收货)" prop="receiptStatus">
<el-select v-model="formData.receiptStatus" placeholder="请选择收货状态(1未收货 2已收货)">
<el-option v-for="item in receipt_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货时间" prop="receiptTime">
<el-date-picker v-model="formData.receiptTime" type="datetime" :teleported="false" placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单状态(1进行中 2取消 3待取消 4已完成)" prop="orderStatus">
<el-select v-model="formData.orderStatus" placeholder="请选择订单状态(1进行中 2取消 3待取消 4已完成)">
<el-option v-for="item in order_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="赠送的积分数量" prop="pointsBonus">
<el-input v-model="formData.pointsBonus" placeholder="请输入赠送的积分数量" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单是否已结算(1未结算 2已结算)" prop="isSettled">
<el-select v-model="formData.isSettled" placeholder="请选择订单是否已结算(1未结算 2已结算)">
<el-option v-for="item in is_settled " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="微信支付交易号" prop="transactionId">
<el-input v-model="formData.transactionId" placeholder="请输入微信支付交易号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否已评价(1否 2是)" prop="isComment">
<el-select v-model="formData.isComment" placeholder="请选择是否已评价(1否 2是)">
<el-option v-for="item in is_comment " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单来源(1普通订单)" prop="orderSource">
<el-input v-model="formData.orderSource" placeholder="请输入订单来源(1普通订单)" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)" :loading="loadingStatus">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateOrder } from '@/api/business/OrderManage/Orders/order.js';
//
const openDialog = async () => {
await getpay_type()
await getpay_status()
await getdelivery_type()
await getdelivery_status()
await getreceipt_status()
await getorder_status()
await getis_settled()
await getis_comment()
}
// -
// (1 2)
const pay_type = ref([]);
// (1 2)
const pay_status = ref([]);
// (1)
const delivery_type = ref([]);
// (1 2)
const delivery_status = ref([]);
// (1 2)
const receipt_status = ref([]);
// (1 2 3 4)
const order_status = ref([]);
// (1 2)
const is_settled = ref([]);
// (1 2)
const is_comment = ref([]);
// -
//
async function getpay_type() {
await proxy.getDicts('pay_type').then((res) => {
pay_type.value = res.data
})
}
//
async function getpay_status() {
await proxy.getDicts('pay_status').then((res) => {
pay_status.value = res.data
})
}
//
async function getdelivery_type() {
await proxy.getDicts('delivery_type').then((res) => {
delivery_type.value = res.data
})
}
//
async function getdelivery_status() {
await proxy.getDicts('delivery_status').then((res) => {
delivery_status.value = res.data
})
}
//
async function getreceipt_status() {
await proxy.getDicts('receipt_status').then((res) => {
receipt_status.value = res.data
})
}
//
async function getorder_status() {
await proxy.getDicts('order_status').then((res) => {
order_status.value = res.data
})
}
//
async function getis_settled() {
await proxy.getDicts('is_settled').then((res) => {
is_settled.value = res.data
})
}
//
async function getis_comment() {
await proxy.getDicts('is_comment').then((res) => {
is_comment.value = res.data
})
}
// -
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "Order"
})
//
const rules = reactive({
orderGuid: [{ required: true, message: "不能为空", trigger: "blur", type: "number" }],
goodsGuid: [{ required: true, message: "商品guid不能为空", trigger: "blur", type: "number" }],
paymentGuid: [{ required: true, message: "订单流水guid不能为空", trigger: "blur", type: "number" }],
customerGuid: [{ required: true, message: "客户guid不能为空", trigger: "blur", type: "number" }],
orderNumber: [{ required: true, message: "订单号不能为空", trigger: "blur" }],
goodsTotalAmoun: [{ required: true, message: "商品总金额不能为空", trigger: "blur" }],
orderAmount: [{ required: true, message: "订单金额不能为空", trigger: "blur" }],
payPrice: [{ required: true, message: "实际付款金额(包含运费)不能为空", trigger: "blur" }],
payType: [{ required: true, message: "支付方式(1微信支付 2余额支付)不能为空", trigger: "change", type: "number" }],
payStatus: [{ required: true, message: "付款状态(1未付款 2已付款)不能为空", trigger: "change", type: "number" }],
payTime: [{ required: true, message: "付款时间不能为空", trigger: "blur" }],
deliveryType: [{ required: true, message: "配送方式(1快递配送)不能为空", trigger: "change", type: "number" }],
expressPrice: [{ required: true, message: "运费金额不能为空", trigger: "blur" }],
deliveryStatus: [{ required: true, message: "发货状态(1未发货 2已发货)不能为空", trigger: "change", type: "number" }],
receiptStatus: [{ required: true, message: "收货状态(1未收货 2已收货)不能为空", trigger: "change", type: "number" }],
orderStatus: [{ required: true, message: "订单状态(1进行中 2取消 3待取消 4已完成)不能为空", trigger: "change", type: "number" }],
isSettled: [{ required: true, message: "订单是否已结算(1未结算 2已结算)不能为空", trigger: "change", type: "number" }],
isComment: [{ required: true, message: "是否已评价(1否 2是)不能为空", trigger: "change", type: "number" }],
orderSource: [{ required: true, message: "订单来源(1普通订单)不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await addOrUpdateOrder(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
loadingStatus.value = false
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,135 +0,0 @@
<!--
* @Descripttion: (订单/tb_order 审核取消订单弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-09-04)
* @LastEditors: (lwh)
* @LastEditTime: (2023-09-04)
-->
<template>
<el-dialog v-model="props.modelValue" title="审核取消订单" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="订单金额" prop="">
{{ formData.orderAmount }}
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="审核状态" prop="isAgree">
<div class="radio-box">
<el-radio-group style="display: flex;" v-model="formData.isAgree">
<el-radio :label=true>同意</el-radio>
<el-radio :label=false>拒绝</el-radio>
</el-radio-group>
<div class="input-intro">同意后将退回付款金额并关闭订单</div>
</div>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">确认</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { cancelOrder } from "@/api/business/OrderManage/Orders/order.js";
//
const openDialog = async () => {
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
// -
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Order"
})
//
const rules = reactive({
isAgree: [{ required: true, message: "审核状态不能为空", trigger: "blur" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code,data } = await cancelOrder(formData.value);
if (code == 200) {
modal.msgSuccess(data)
props.done();
closeDialog();
loadingStatus.value = false
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>
<style>
.input-intro {
color: #8c8c8c;
font-size: 12px;
}
.radio-box {
display: flex;
flex-direction: column;
}
</style>

View File

@ -1,119 +0,0 @@
<!--
* @Descripttion: (订单/tb_order 订单改价弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-09-04)
* @LastEditors: (lwh)
* @LastEditTime: (2023-09-04)
-->
<template>
<el-dialog v-model="props.modelValue" title="订单改价" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="订单金额" prop="orderAmount">
<el-input-number v-model.number="formData.orderAmount" controls-position="right" :min="0" :precision="2"/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="运费金额" prop="expressPrice">
<el-input-number v-model.number="formData.expressPrice" controls-position="right" :min="0" :precision="2"/>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">确认</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { changePrice } from "@/api/business/OrderManage/Orders/order.js";
//
const openDialog = async () => {
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
// -
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Order"
})
//
const rules = reactive({
orderAmount: [{ required: true, message: "订单金额不能为空", trigger: "blur" }],
expressPrice: [{ required: true, message: "运费金额不能为空", trigger: "blur" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await changePrice(formData.value);
if (code == 200) {
modal.msgSuccess('金额修改成功')
props.done();
closeDialog();
loadingStatus.value = false
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,144 +0,0 @@
<!--
* @Descripttion: (订单/tb_order 订单发货弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-09-03)
* @LastEditors: (lwh)
* @LastEditTime: (2023-09-03)
-->
<template>
<el-dialog v-model="props.modelValue" title="订单发货" width="600px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流公司" prop="logisticsCompany" >
<el-select v-model="formData.logisticsCompany" placeholder="请选择物流公司" >
<el-option v-for="item in logisticsCompanyDataList" :key="item.logisticsCompanyId"
:label="item.logisticsCompanyName" :value="item.logisticsCompanyName" @click="handleCompanyChange(item)" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="物流单号" prop="logisticsTrackingNumber">
<el-input v-model="formData.logisticsTrackingNumber" placeholder="请输入物流单号" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">确认发货</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { deliver } from "@/api/business/OrderManage/Orders/order.js";
import { logisticsCompanyList } from '@/api/business/LogisticsManage/LogisticsCompanys/logisticsCompany.js'
//
const openDialog = async () => {
await getCompanyList()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
//
const logisticsCompanyDataList = ref([]);
// -
/** 获取物流公司列表 */
async function getCompanyList() {
logisticsCompanyList({
pageNum: 1,
pageSize: 10000
}).then((res) => {
if (res.code == 200) {
logisticsCompanyDataList.value = res.data.result;
}
});
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Order"
})
//
const rules = reactive({
logisticsCompany: [{ required: true, message: "请选择物流公司", trigger: "blur" }],
logisticsTrackingNumber: [{ required: true, message: "请填写物流单号", trigger: "blur" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await deliver(formData.value);
if (code == 200) {
modal.msgSuccess('发货成功')
props.done();
closeDialog();
loadingStatus.value = false
}
});
}
const handleCompanyChange = async (item) => {
formData.value.logisticsCompanyGuid = item.logisticsCompanyGuid
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
logisticsCompanyDataList.value.length = 0
formData.value = null
emits("update:modelValue", false);
};
</script>

View File

@ -1,349 +0,0 @@
<!--
* @Descripttion: (订单/tb_order 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-08-29)
* @LastEditors: (lwh)
* @LastEditTime: (2023-08-29)
-->
<template>
<el-dialog v-model="props.modelValue" title="订单信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品guid" >
<el-input v-model="formData.goodsGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单流水guid" >
<el-input v-model="formData.paymentGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户guid" >
<el-input v-model="formData.customerGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="店铺guid" >
<el-input v-model="formData.shopGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单号" >
<el-input v-model="formData.orderNumber" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品总金额" >
<el-input v-model="formData.goodsTotalAmoun" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单金额" >
<el-input v-model="formData.orderAmount" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券guid" >
<el-input v-model="formData.couponGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券抵扣金额" >
<el-input v-model="formData.couponMoney" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣金额" >
<el-input v-model="formData.pointsMoney" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣数量" >
<el-input v-model="formData.pointsNum" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="实际付款金额(包含运费)" >
<el-input v-model="formData.payPrice" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="后台修改的订单金额(差价)" >
<el-input v-model="formData.updatePrice" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="买家留言" >
<el-input v-model="formData.orderRemark" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="支付方式(1微信支付 2余额支付)" >
<el-select v-model="formData.payType" >
<el-option v-for="item in pay_type " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="付款状态(1未付款 2已付款)" >
<el-select v-model="formData.payStatus" >
<el-option v-for="item in pay_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="付款时间" >
<el-date-picker v-model="formData.payTime" type="datetime" :teleported="false" isabledStr}></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="配送方式(1快递配送)" >
<el-select v-model="formData.deliveryType" >
<el-option v-for="item in delivery_type " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="运费金额" >
<el-input v-model="formData.expressPrice" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流公司guid" >
<el-input v-model="formData.logisticsCompanyGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流公司" >
<el-input v-model="formData.logisticsCompany" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流单号" >
<el-input v-model="formData.logisticsTrackingNumber" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="发货状态(1未发货 2已发货)" >
<el-select v-model="formData.deliveryStatus" >
<el-option v-for="item in delivery_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="发货时间" >
<el-date-picker v-model="formData.deliveryTime" type="datetime" :teleported="false" isabledStr}></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货状态(1未收货 2已收货)" >
<el-select v-model="formData.receiptStatus" >
<el-option v-for="item in receipt_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货时间" >
<el-date-picker v-model="formData.receiptTime" type="datetime" :teleported="false" isabledStr}></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单状态(1进行中 2取消 3待取消 4已完成)" >
<el-select v-model="formData.orderStatus" >
<el-option v-for="item in order_status " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="赠送的积分数量" >
<el-input v-model="formData.pointsBonus" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单是否已结算(1未结算 2已结算)" >
<el-select v-model="formData.isSettled" >
<el-option v-for="item in is_settled " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="微信支付交易号" >
<el-input v-model="formData.transactionId" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否已评价(1否 2是)" >
<el-select v-model="formData.isComment" >
<el-option v-for="item in is_comment " :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单来源(1普通订单)" >
<el-input v-model="formData.orderSource" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
//
const openDialog = async () => {
await getpay_type()
await getpay_status()
await getdelivery_type()
await getdelivery_status()
await getreceipt_status()
await getorder_status()
await getis_settled()
await getis_comment()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
// (1 2)
const pay_type = ref([]);
// (1 2)
const pay_status = ref([]);
// (1)
const delivery_type = ref([]);
// (1 2)
const delivery_status = ref([]);
// (1 2)
const receipt_status = ref([]);
// (1 2 3 4)
const order_status = ref([]);
// (1 2)
const is_settled = ref([]);
// (1 2)
const is_comment = ref([]);
// -
//
async function getpay_type() {
await proxy.getDicts('pay_type').then((res) => {
pay_type.value = res.data
})
}
//
async function getpay_status() {
await proxy.getDicts('pay_status').then((res) => {
pay_status.value = res.data
})
}
//
async function getdelivery_type() {
await proxy.getDicts('delivery_type').then((res) => {
delivery_type.value = res.data
})
}
//
async function getdelivery_status() {
await proxy.getDicts('delivery_status').then((res) => {
delivery_status.value = res.data
})
}
//
async function getreceipt_status() {
await proxy.getDicts('receipt_status').then((res) => {
receipt_status.value = res.data
})
}
//
async function getorder_status() {
await proxy.getDicts('order_status').then((res) => {
order_status.value = res.data
})
}
//
async function getis_settled() {
await proxy.getDicts('is_settled').then((res) => {
is_settled.value = res.data
})
}
//
async function getis_comment() {
await proxy.getDicts('is_comment').then((res) => {
is_comment.value = res.data
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,420 +0,0 @@
<!--
* @Descripttion: (订单/tb_order 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-08-29)
* @LastEditors: (lwh)
* @LastEditTime: (2023-08-29)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改订单信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品guid" prop="goodsGuid">
<el-input v-model="formData.goodsGuid" placeholder="请输入商品guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单流水guid" prop="paymentGuid">
<el-input v-model="formData.paymentGuid" placeholder="请输入订单流水guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户guid" prop="customerGuid">
<el-input v-model="formData.customerGuid" placeholder="请输入客户guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="店铺guid" prop="shopGuid">
<el-input v-model="formData.shopGuid" placeholder="请输入店铺guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单号" prop="orderNumber">
<el-input v-model="formData.orderNumber" placeholder="请输入订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="商品总金额" prop="goodsTotalAmoun">
<el-input v-model="formData.goodsTotalAmoun" placeholder="请输入商品总金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单金额" prop="orderAmount">
<el-input v-model="formData.orderAmount" placeholder="请输入订单金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券guid" prop="couponGuid">
<el-input v-model="formData.couponGuid" placeholder="请输入优惠券guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="优惠券抵扣金额" prop="couponMoney">
<el-input v-model="formData.couponMoney" placeholder="请输入优惠券抵扣金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣金额" prop="pointsMoney">
<el-input v-model="formData.pointsMoney" placeholder="请输入积分抵扣金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="积分抵扣数量" prop="pointsNum">
<el-input v-model="formData.pointsNum" placeholder="请输入积分抵扣数量" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="实际付款金额(包含运费)" prop="payPrice">
<el-input v-model="formData.payPrice" placeholder="请输入实际付款金额(包含运费)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="后台修改的订单金额(差价)" prop="updatePrice">
<el-input v-model="formData.updatePrice" placeholder="请输入后台修改的订单金额(差价)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="买家留言" prop="orderRemark">
<el-input v-model="formData.orderRemark" placeholder="请输入买家留言" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="支付方式(1微信支付 2余额支付)" prop="payType">
<el-select v-model="formData.payType" placeholder="请选择支付方式(1微信支付 2余额支付)">
<el-option v-for="item in pay_type " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="付款状态(1未付款 2已付款)" prop="payStatus">
<el-select v-model="formData.payStatus" placeholder="请选择付款状态(1未付款 2已付款)">
<el-option v-for="item in pay_status " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="付款时间" prop="payTime">
<el-date-picker v-model="formData.payTime" type="datetime" :teleported="false"
placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="配送方式(1快递配送)" prop="deliveryType">
<el-select v-model="formData.deliveryType" placeholder="请选择配送方式(1快递配送)">
<el-option v-for="item in delivery_type " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="运费金额" prop="expressPrice">
<el-input v-model="formData.expressPrice" placeholder="请输入运费金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流公司guid" prop="logisticsCompanyGuid">
<el-input v-model="formData.logisticsCompanyGuid" placeholder="请输入物流公司guid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流公司" prop="logisticsCompany">
<el-input v-model="formData.logisticsCompany" placeholder="请输入物流公司" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="物流单号" prop="logisticsTrackingNumber">
<el-input v-model="formData.logisticsTrackingNumber" placeholder="请输入物流单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="发货状态(1未发货 2已发货)" prop="deliveryStatus">
<el-select v-model="formData.deliveryStatus" placeholder="请选择发货状态(1未发货 2已发货)">
<el-option v-for="item in delivery_status " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="发货时间" prop="deliveryTime">
<el-date-picker v-model="formData.deliveryTime" type="datetime" :teleported="false"
placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货状态(1未收货 2已收货)" prop="receiptStatus">
<el-select v-model="formData.receiptStatus" placeholder="请选择收货状态(1未收货 2已收货)">
<el-option v-for="item in receipt_status " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="收货时间" prop="receiptTime">
<el-date-picker v-model="formData.receiptTime" type="datetime" :teleported="false"
placeholder="选择日期时间"></el-date-picker>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单状态(1进行中 2取消 3待取消 4已完成)" prop="orderStatus">
<el-select v-model="formData.orderStatus" placeholder="请选择订单状态(1进行中 2取消 3待取消 4已完成)">
<el-option v-for="item in order_status " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="赠送的积分数量" prop="pointsBonus">
<el-input v-model="formData.pointsBonus" placeholder="请输入赠送的积分数量" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单是否已结算(1未结算 2已结算)" prop="isSettled">
<el-select v-model="formData.isSettled" placeholder="请选择订单是否已结算(1未结算 2已结算)">
<el-option v-for="item in is_settled " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="微信支付交易号" prop="transactionId">
<el-input v-model="formData.transactionId" placeholder="请输入微信支付交易号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="是否已评价(1否 2是)" prop="isComment">
<el-select v-model="formData.isComment" placeholder="请选择是否已评价(1否 2是)">
<el-option v-for="item in is_comment " :key="item.dictValue" :label="item.dictLabel"
:value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="订单来源(1普通订单)" prop="orderSource">
<el-input v-model="formData.orderSource" placeholder="请输入订单来源(1普通订单)" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)" :loading="loadingStatus">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateOrder } from "@/api/business/OrderManage/Orders/order.js";
//
const openDialog = async () => {
await getpay_type()
await getpay_status()
await getdelivery_type()
await getdelivery_status()
await getreceipt_status()
await getorder_status()
await getis_settled()
await getis_comment()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
// (1 2)
const pay_type = ref([]);
// (1 2)
const pay_status = ref([]);
// (1)
const delivery_type = ref([]);
// (1 2)
const delivery_status = ref([]);
// (1 2)
const receipt_status = ref([]);
// (1 2 3 4)
const order_status = ref([]);
// (1 2)
const is_settled = ref([]);
// (1 2)
const is_comment = ref([]);
// -
//
async function getpay_type() {
await proxy.getDicts('pay_type').then((res) => {
pay_type.value = res.data
})
}
//
async function getpay_status() {
await proxy.getDicts('pay_status').then((res) => {
pay_status.value = res.data
})
}
//
async function getdelivery_type() {
await proxy.getDicts('delivery_type').then((res) => {
delivery_type.value = res.data
})
}
//
async function getdelivery_status() {
await proxy.getDicts('delivery_status').then((res) => {
delivery_status.value = res.data
})
}
//
async function getreceipt_status() {
await proxy.getDicts('receipt_status').then((res) => {
receipt_status.value = res.data
})
}
//
async function getorder_status() {
await proxy.getDicts('order_status').then((res) => {
order_status.value = res.data
})
}
//
async function getis_settled() {
await proxy.getDicts('is_settled').then((res) => {
is_settled.value = res.data
})
}
//
async function getis_comment() {
await proxy.getDicts('is_comment').then((res) => {
is_comment.value = res.data
})
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const loadingStatus = ref(false)
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Order"
})
//
const rules = reactive({
orderGuid: [{ required: true, message: "不能为空", trigger: "blur", type: "number" }],
goodsGuid: [{ required: true, message: "商品guid不能为空", trigger: "blur", type: "number" }],
paymentGuid: [{ required: true, message: "订单流水guid不能为空", trigger: "blur", type: "number" }],
customerGuid: [{ required: true, message: "客户guid不能为空", trigger: "blur", type: "number" }],
orderNumber: [{ required: true, message: "订单号不能为空", trigger: "blur" }],
goodsTotalAmoun: [{ required: true, message: "商品总金额不能为空", trigger: "blur" }],
orderAmount: [{ required: true, message: "订单金额不能为空", trigger: "blur" }],
payPrice: [{ required: true, message: "实际付款金额(包含运费)不能为空", trigger: "blur" }],
payType: [{ required: true, message: "支付方式(1微信支付 2余额支付)不能为空", trigger: "change", type: "number" }],
payStatus: [{ required: true, message: "付款状态(1未付款 2已付款)不能为空", trigger: "change", type: "number" }],
payTime: [{ required: true, message: "付款时间不能为空", trigger: "blur" }],
deliveryType: [{ required: true, message: "配送方式(1快递配送)不能为空", trigger: "change", type: "number" }],
expressPrice: [{ required: true, message: "运费金额不能为空", trigger: "blur" }],
deliveryStatus: [{ required: true, message: "发货状态(1未发货 2已发货)不能为空", trigger: "change", type: "number" }],
receiptStatus: [{ required: true, message: "收货状态(1未收货 2已收货)不能为空", trigger: "change", type: "number" }],
orderStatus: [{ required: true, message: "订单状态(1进行中 2取消 3待取消 4已完成)不能为空", trigger: "change", type: "number" }],
isSettled: [{ required: true, message: "订单是否已结算(1未结算 2已结算)不能为空", trigger: "change", type: "number" }],
isComment: [{ required: true, message: "是否已评价(1否 2是)不能为空", trigger: "change", type: "number" }],
orderSource: [{ required: true, message: "订单来源(1普通订单)不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
loadingStatus.value = true
const { code } = await addOrUpdateOrder(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
loadingStatus.value = false
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,548 +0,0 @@
<!--
* @Descripttion: (订单/tb_order)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-08-29)
* @LastEditors: (lwh)
* @LastEditTime: (2023-08-29)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="订单号" prop="orderNumber">
<el-input v-model="queryParams.orderNumber" placeholder="请输入订单号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货人姓名" prop="name">
<el-input v-model="queryParams.customerNickNme" placeholder="请输入收货人姓名" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="收货人手机号" prop="phone">
<el-input v-model="queryParams.customerPhome" placeholder="请输入收货人手机号" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="物流单号" prop="logisticsTrackingNumber">
<el-input v-model="queryParams.logisticsTrackingNumber" placeholder="请输入物流单号" clearable
@keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="支付方式" prop="payType">
<el-select v-model="queryParams.payType" placeholder="请选择支付方式" clearable @change="handleQuery">
<el-option v-for="item in pay_type " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item label="订单状态" prop="orderStatusName">
<el-radio-group v-model="queryParams.orderStatusName" @change="handleChangeOrderStatus()">
<el-radio-button label="待发货" />
<el-radio-button label="待收货" />
<el-radio-button label="待付款" />
<el-radio-button label="已完成" />
<el-radio-button label="已取消" />
</el-radio-group>
</el-form-item>
<!-- <el-form-item label="配送方式" prop="deliveryType">
<el-select v-model="queryParams.deliveryType" placeholder="请选择配送方式" clearable @change="handleQuery">
<el-option v-for="item in delivery_type " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item> -->
<el-form-item label="下单时间">
<el-date-picker v-model="dateRange" style="width: 240px" type="daterange" range-separator="-"
start-placeholder="开始日期" end-placeholder="结束日期" :default-time="defaultTime2" @change="handleQuery"></el-date-picker>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:order:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col> -->
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:order:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<!-- <el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:order:export']">
{{ $t('btn.export') }}
</el-button>
</el-col> -->
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" border highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="goodsInfo" label="商品信息 / 单价与数量" width="500">
<template #default="scope">
<div class="order-num-box">
<div>订单号<b>{{ scope.row.orderNumber }}</b></div>
<el-link class="copy" type="primary" @click="copyText(scope.row.orderNumber)">复制订单号</el-link>
</div>
<div class="goods-info-box" v-for="(item, idx) in scope.row.goodsInfoList" :key="idx">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="item.goodsPicture?.split(',')[0]" :preview-src-list="item.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
<div>
<div class="goods-info-text m2">
{{ item.goodsName }}
</div>
<div>
<el-tag type="info" v-if="item.goodsSpecName" >{{ item.goodsSpecName }}</el-tag>
</div>
</div>
<div class="price-box">
<div> {{ item.goodsPrice }}</div>
<div>× {{ item.goodsTotalNum }}</div>
</div>
</div>
</template>
</el-table-column>
<!-- <el-table-column prop="goodsInfo" label="单价/数量" width="150">
<template #default="scope">
<div> {{ scope.row.goodsInfo.goodsPrice }}</div>
<div>× {{ scope.row.goodsTotalNum }}</div>
</template>
</el-table-column> -->
<el-table-column prop="payPrice" label="实付款" width="150">
<template #default="scope">
<div> {{ scope.row.payPrice }}</div>
<div>(含运费 {{ scope.row.expressPrice }})</div>
</template>
</el-table-column>
<el-table-column prop="goodsInfo" label="买家信息" width="200">
<template #default="scope">
<div class="goods-info-box">
<div class="avatar">
<el-avatar shape="circle" :size="50" :src="scope.row.customerAvatar" />
</div>
<div>
<div class="goods-info-text m2">
{{ scope.row.customerNickName }}
</div>
<div>
{{ scope.row.customerMobilePhoneNumber }}
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="payType" label="支付方式" width="150">
<template #default="scope">
<dict-tag :options="pay_type" :value="scope.row.payType" />
</template>
</el-table-column>
<el-table-column prop="deliveryType" label="配送方式" width="150">
<template #default="scope">
<dict-tag :options="delivery_type" :value="scope.row.deliveryType" />
</template>
</el-table-column>
<el-table-column prop="deliveryStatus" label="交易状态" width="200">
<template #default="scope">
<div class="status-box">付款状态: &nbsp;<dict-tag :options="pay_status" :value="scope.row.payStatus" /></div>
<div class="status-box">发货状态: &nbsp;<dict-tag :options="delivery_status" :value="scope.row.deliveryStatus" />
</div>
<div class="status-box">收货状态: &nbsp;<dict-tag :options="receipt_status" :value="scope.row.receiptStatus" />
</div>
<div class="status-box">订单状态: &nbsp;<dict-tag :options="order_status" :value="scope.row.orderStatus" /></div>
</template>
</el-table-column>
<el-table-column prop="createTime" label="下单时间" :show-overflow-tooltip="true" width="200" />
<el-table-column label="操作" width="250" fixed="right">
<template #default="scope">
<!-- <el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:order:addOrUpdate']">编辑</el-button> -->
<el-button type="primary" size="small" icon="view" @click="handleDetail(scope.row)">详情</el-button>
<!-- <el-button v-if="scope.row.payStatus == 1" @click="handleChangePrice(scope.row)" size="small">订单改价</el-button> -->
<!-- 发货 -->
<el-button v-if="(
scope.row.payStatus == 2
&& scope.row.deliveryType == 1
&& scope.row.deliveryStatus == 1
&& scope.row.orderStatus != 2
&& scope.row.orderStatus != 3
)" type="warning" size="small" @click="handleDeliver(scope.row)" icon="check"> </el-button>
<!-- 审核取消订单 -->
<el-button type="warning" size="small" v-if="scope.row.orderStatus == 3"
@click="handleCancelOrder(scope.row)" icon="check">审核取消订单</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:order:delete']">删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
<!-- 发货 -->
<DeliverDialog v-model="DeliverDialogVisible" :data="DeliverDialogRow" :done="() => resetQuery()"></DeliverDialog>
<!-- 订单改价 -->
<ChangePriceDialog v-model="ChangePriceDialogVisible" :data="ChangePriceDialogRow" :done="() => resetQuery()">
</ChangePriceDialog>
<!-- 审核取消订单 -->
<CancelOrderDialog v-model="CancelOrderDialogVisible" :data="CancelOrderDialogRow" :done="() => resetQuery()">
</CancelOrderDialog>
</template>
<script setup name="order">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportOrder, orderList, delOrder } from '@/api/business/OrderManage/Orders/order.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
import DeliverDialog from "./components/DeliverDialog.vue";
import ChangePriceDialog from "./components/ChangePriceDialog.vue";
import CancelOrderDialog from "./components/CancelOrderDialog.vue";
import useClipboard from 'vue-clipboard3'
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const DeliverDialogVisible = ref(false);
const DeliverDialogRow = ref({});
const ChangePriceDialogVisible = ref(false);
const ChangePriceDialogRow = ref({});
const CancelOrderDialogVisible = ref(false);
const CancelOrderDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
//
const router = useRouter();
const { toClipboard } = useClipboard()
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
const dateRange = ref([])
const defaultTime2 = [
new Date(2000, 1, 1, 0, 0, 0),
new Date(2000, 2, 1, 23, 59, 59),
] // '12:00:00', '08:00:00'
//
const copyText = async (val) => {
try {
await toClipboard(val)
proxy.$modal.msgSuccess('复制成功!')
} catch (e) {
console.log(e)
proxy.$modal.msgError('当前浏览器不支持')
}
}
//
function handleChangePrice(row) {
ChangePriceDialogVisible.value = true
ChangePriceDialogRow.value = row
}
//
function handleDeliver(row) {
DeliverDialogVisible.value = true
DeliverDialogRow.value = row
}
//
function handleCancelOrder(row) {
CancelOrderDialogVisible.value = true
CancelOrderDialogRow.value = row
}
//
function handleChangeOrderStatus() {
resetStatusQuery()
let statusName = queryParams.value.orderStatusName;
switch (statusName) {
case "待发货":
queryParams.value.deliveryStatus = 1;
queryParams.value.payStatus = 2;
queryParams.value.orderStatus = 1;
break;
case "待收货":
queryParams.value.deliveryStatus = 2;
queryParams.value.receiptStatus = 1;
queryParams.value.payStatus = 2;
queryParams.value.orderStatus = 1;
break;
case "待付款":
queryParams.value.payStatus = 1;
queryParams.value.orderStatus = 1;
break;
case "已完成":
queryParams.value.payStatus = 2;
queryParams.value.orderStatus = 4;
break;
case "已取消":
queryParams.value.orderStatus = 2;
break;
default:
break;
}
if(statusName){
handleQuery()
}
}
function resetStatusQuery(){
queryParams.value.deliveryStatus = null;
queryParams.value.receiptStatus = null;
queryParams.value.payStatus = null;
queryParams.value.orderStatus = null;
}
//
const pay_type = ref([]);
async function getpay_type() {
await proxy.getDicts('pay_type').then((res) => {
pay_type.value = res.data
})
}
getpay_type()
//
const pay_status = ref([]);
async function getpay_status() {
await proxy.getDicts('pay_status').then((res) => {
pay_status.value = res.data
})
}
getpay_status()
//
const delivery_type = ref([]);
async function getdelivery_type() {
await proxy.getDicts('delivery_type').then((res) => {
delivery_type.value = res.data
})
}
getdelivery_type()
//
const delivery_status = ref([]);
async function getdelivery_status() {
await proxy.getDicts('delivery_status').then((res) => {
delivery_status.value = res.data
})
}
getdelivery_status()
//
const receipt_status = ref([]);
async function getreceipt_status() {
await proxy.getDicts('receipt_status').then((res) => {
receipt_status.value = res.data
})
}
getreceipt_status()
//
const order_status = ref([]);
async function getorder_status() {
await proxy.getDicts('order_status').then((res) => {
order_status.value = res.data
})
}
getorder_status()
//
//
function getList() {
loading.value = true
console.log(dateRange?.value[1])
orderList(proxy.addDateRange(queryParams.value, dateRange.value)).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.orderId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
resetStatusQuery()
dateRange.value = []
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.orderId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delOrder(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.orderId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
let str = ''
for (const key in Ids) {
str += Ids[key] + ','
}
str = str.slice(0, str.length - 1)
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportOrder(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
router.push("/orders/orderDetail?orderId=" + row.orderId)
// DetailDialogVisible.value = true
// DetailDialogRow.value = row
}
handleQuery()
</script>
<style lang="scss" scoped>
.goods-info-box {
display: flex;
justify-content: space-between;
margin: 10px 0;
}
.goods-info-text {
width: 250px;
margin-bottom: 10px;
}
.m2 {
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
.avatar {
margin-right: 15px;
}
.status-box {
display: flex;
align-items: center;
margin-bottom: 2px;
}
.price-box {
width: 60px;
}
.order-num-box {
display: flex;
position: relative;
.copy {
position: absolute;
right: 0%;
}
}
</style>

View File

@ -1,515 +0,0 @@
<template>
<!-- 订单进度步骤条 -->
<el-card class="box-card">
<div class="order-progress" :class="`progress-${progress}`">
<ul>
<li>
<span>下单时间</span>
<div class="tip">{{ detail.createTime }}</div>
</li>
<li>
<span>付款</span>
<div v-if="detail.payStatus == 2" class="tip">付款于 {{ detail.payTime }}</div>
</li>
<li>
<span>发货</span>
<div v-if="detail.deliveryStatus == 2" class="tip">发货于 {{ detail.deliveryTime }}</div>
</li>
<li>
<span>收货</span>
<div v-if="detail.receiptStatus == 2" class="tip">收货于 {{ detail.receiptTime }}</div>
</li>
<li>
<span>完成</span>
<div v-if="detail.orderStatus == 4" class="tip">完成于 {{ detail.receiptTime }}</div>
</li>
</ul>
</div>
</el-card>
<!-- 订单信息 -->
<el-card class="box-card">
<template v-if="detail.orderStatus != 2">
<!-- 订单操作 -->
<div class="order-operation">
<div class="card-title">订单操作</div>
<!-- 订单改价 -->
<div class="btn-box">
<!-- <el-button v-if="detail.payStatus == 1" @click="handleChangePrice(detail)">订单改价</el-button> -->
<!-- 发货 -->
<el-button v-if="(
detail.payStatus == 2
&& detail.deliveryType == 1
&& detail.deliveryStatus == 1
&& detail.orderStatus != 2
&& detail.orderStatus != 3
)" type="primary" @click="handleDeliver(detail)"> </el-button>
<!-- 审核取消订单 -->
<div v-if="detail.orderStatus == 3" style="width: 100%;">
<el-alert title="当前买家已付款并申请取消订单,请审核是否同意,如同意则自动退回付款金额(原路退款)并关闭订单。"
type="warning" show-icon :closable=false />
<div>
<el-button type="primary"
@click="handleCancelOrder(detail)">审核取消订单</el-button>
</div>
</div>
</div>
</div>
<el-divider />
</template>
<div class="order-info">
<div class="card-title">订单信息</div>
<el-row class="order-info-box">
<el-col :span="8">订单号 {{ detail.orderNumber }}</el-col>
<el-col :span="8">实付款金额{{ detail.payPrice }}</el-col>
<el-col :span="8">支付方式 <dict-tag :options="pay_type" :value="detail.payType" /></el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8">配送方式 <dict-tag :options="delivery_type" :value="detail.deliveryType" /></el-col>
<el-col :span="8">运费金额 {{ detail.expressPrice }}</el-col>
<el-col :span="8">订单状态 <dict-tag :options="order_status" :value="detail.orderStatus" /></el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8">买家信息 {{ detail.customerPhone }}</el-col>
<el-col :span="8">买家留言 {{ detail.orderRemark }}</el-col>
</el-row>
</div>
</el-card>
<!-- 商品信息 -->
<el-card class="box-card">
<div class="card-title">订单商品</div>
<el-table v-loading="loading" :data="detail.goodsInfoList" ref="tableRef" highlight-current-row>
<el-table-column prop="goodsInfo" label="商品信息" width="700">
<template #default="scope">
<div class="goods-info-box">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]"
:preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
<div style="margin-left: 20px;">
<div class="goods-info-text ">
{{ scope.row.goodsName }}
</div>
<div>
<el-tag type="info" v-if="scope.row.goodsSpecName">{{ scope.row.goodsSpecName }}</el-tag>
</div>
</div>
</div>
</template>
</el-table-column>
<el-table-column prop="goodsCoding" label="编码" align="center">
<template #default="scope">
<div v-if="scope.row.goodsCoding">{{ scope.row.goodsCoding }}</div>
<div v-else> - - </div>
</template>
</el-table-column>
<el-table-column prop="goodsWeight" label="重量(Kg)" align="center" />
<el-table-column prop="goodsPrice" label="单价" align="center">
<template #default="scope">
<div> {{ scope.row.goodsPrice }}</div>
</template>
</el-table-column>
<el-table-column prop="goodsTotalNum" label="购买数量" align="center">
<template #default="scope">
<div>× {{ scope.row.goodsTotalNum }}</div>
</template>
</el-table-column>
<el-table-column prop="goodsTotalPrice" label="商品总价" align="center">
<template #default="scope">
<div> {{ scope.row.goodsTotalPrice }}</div>
</template>
</el-table-column>
</el-table>
<div class="order-summary-box">
<div>订单总额 &nbsp;{{ detail.goodsTotalAmoun }}</div>
<div>运费金额 &nbsp;{{ detail.expressPrice }}</div>
<div>实付款金额 &nbsp;<b>{{ detail.payPrice }}</b></div>
</div>
</el-card>
<!-- 收货信息 / 发货信息 -->
<!-- 订单信息 -->
<el-card class="box-card">
<div class="card-title">收货信息</div>
<el-row class="order-info-box">
<el-col :span="8">收货人姓名 {{ detail.orderReceive?.consigneeName }}</el-col>
<el-col :span="8">联系电话 {{ detail.orderReceive?.phone }}</el-col>
<el-col :span="8">收货地区 {{ detail.orderReceive?.region }}</el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8">详细地址 {{ detail.orderReceive?.detail }}</el-col>
</el-row>
<div v-if="detail.deliveryStatus != 1">
<el-divider />
<div class="card-title">发货信息</div>
<el-row class="order-info-box">
<el-col :span="8">物流公司 {{ detail.logisticsCompany }}</el-col>
<el-col :span="8">物流单号 {{ detail.logisticsTrackingNumber }}</el-col>
<el-col :span="8">发货状态 <dict-tag :options="delivery_status" :value="detail.deliveryStatus" /></el-col>
</el-row>
<el-row class="order-info-box">
<el-col :span="8">发货时间 {{ detail.deliveryTime }}</el-col>
</el-row>
</div>
</el-card>
<!-- 发货 -->
<DeliverDialog v-model="DeliverDialogVisible" :data="DeliverDialogRow" :done="() => getDetail()"></DeliverDialog>
<!-- 订单改价 -->
<ChangePriceDialog v-model="ChangePriceDialogVisible" :data="ChangePriceDialogRow" :done="() => getDetail()">
</ChangePriceDialog>
<!-- 审核取消订单 -->
<CancelOrderDialog v-model="CancelOrderDialogVisible" :data="CancelOrderDialogRow" :done="() => getDetail()">
</CancelOrderDialog>
</template>
<script setup>
import modal from '@/plugins/modal.js'
import { getOrderDetails } from '@/api/business/OrderManage/Orders/order.js'
import DeliverDialog from "./components/DeliverDialog.vue";
import ChangePriceDialog from "./components/ChangePriceDialog.vue";
import CancelOrderDialog from "./components/CancelOrderDialog.vue";
const route = useRoute()
const { proxy } = getCurrentInstance()
const parm = reactive({
orderId: route.query.orderId
})
const DeliverDialogVisible = ref(false);
const DeliverDialogRow = ref({});
const ChangePriceDialogVisible = ref(false);
const ChangePriceDialogRow = ref({});
const CancelOrderDialogVisible = ref(false);
const CancelOrderDialogRow = ref({});
const progress = ref()
const loading = ref(true)
const detail = ref({})
//
function getDetail() {
loading.value = true
getOrderDetails(parm).then((res) => {
if (res.code == 200) {
loading.value = false;
detail.value = res.data;
initProgress()
}
});
}
getDetail()
//
function initProgress() {
progress.value = 2
if (detail.value.payStatus == 2)
progress.value += 1
if (detail.value.deliveryStatus == 2)
progress.value += 1
if (detail.value.receiptStatus == 2)
progress.value += 1
}
//
function handleChangePrice(row) {
ChangePriceDialogVisible.value = true
ChangePriceDialogRow.value = row
}
//
function handleDeliver(row) {
DeliverDialogVisible.value = true
DeliverDialogRow.value = row
}
//
function handleCancelOrder(row) {
CancelOrderDialogVisible.value = true
CancelOrderDialogRow.value = row
}
//
const pay_type = ref([]);
async function getpay_type() {
await proxy.getDicts('pay_type').then((res) => {
pay_type.value = res.data
})
}
getpay_type()
//
const pay_status = ref([]);
async function getpay_status() {
await proxy.getDicts('pay_status').then((res) => {
pay_status.value = res.data
})
}
getpay_status()
//
const delivery_type = ref([]);
async function getdelivery_type() {
await proxy.getDicts('delivery_type').then((res) => {
delivery_type.value = res.data
})
}
getdelivery_type()
//
const delivery_status = ref([]);
async function getdelivery_status() {
await proxy.getDicts('delivery_status').then((res) => {
delivery_status.value = res.data
})
}
getdelivery_status()
//
const receipt_status = ref([]);
async function getreceipt_status() {
await proxy.getDicts('receipt_status').then((res) => {
receipt_status.value = res.data
})
}
getreceipt_status()
//
const order_status = ref([]);
async function getorder_status() {
await proxy.getDicts('order_status').then((res) => {
order_status.value = res.data
})
}
getorder_status()
</script>
<style lang="scss" scoped>
.box-card {
position: relative;
margin-bottom: 30px;
}
.card-title {
// font-size: 18px;
margin-bottom: 30px;
font-weight: bold;
}
.btn-box {
display: flex;
}
// 线
.o-divider {
margin-bottom: 32px;
}
//
.order-progress {
height: 26px;
line-height: 26px;
background: #f8f8f8;
border-radius: 13px;
font-size: 14px;
text-align: center;
position: relative;
li {
list-style: none;
}
&:before,
&:after {
content: '';
position: absolute;
z-index: 2;
left: 0;
top: 0;
bottom: 0;
border-radius: 13px;
background: #1890ff;
}
&:after {
background: #91d5ff;
z-index: 1;
}
&.progress-1 {
&:before {
width: 0;
}
&:after {
width: 20%;
}
}
&.progress-2 {
&:before {
width: 20%;
}
&:after {
width: 40%;
}
}
&.progress-3 {
&:before {
width: 40%;
}
&:after {
width: 60%;
}
}
&.progress-4 {
&:before {
width: 60%;
}
&:after {
width: 80%;
}
}
&.progress-5 {
&:before {
width: 100%;
}
&:after {
width: 100%;
}
li {
&:nth-child(5) {
color: #fff;
}
}
}
li {
width: 20%;
float: left;
border-radius: 13px;
position: relative;
z-index: 3;
}
.tip {
font-size: 12px;
padding-top: 10px;
color: #8c8c8c;
}
&.progress-1 li:nth-child(1),
&.progress-2 li:nth-child(1),
&.progress-3 li:nth-child(1),
&.progress-4 li:nth-child(1),
&.progress-5 li:nth-child(1) {
color: #fff;
}
&.progress-2 li:nth-child(2),
&.progress-3 li:nth-child(2),
&.progress-4 li:nth-child(2),
&.progress-5 li:nth-child(2) {
color: #fff;
}
&.progress-3 li:nth-child(3),
&.progress-4 li:nth-child(3),
&.progress-5 li:nth-child(3) {
color: #fff;
}
&.progress-4 li:nth-child(4),
&.progress-5 li:nth-child(4) {
color: #fff;
}
}
//
.order-info {
margin-bottom: 10px;
}
.order-info-box {
font-size: 15px;
margin-top: 25px;
}
//
.order-summary-box {
display: flex;
align-items: flex-end;
flex-direction: column;
margin: 20px 0;
div {
font-size: 15px;
margin-bottom: 5px;
}
}
.goods-info-box {
display: flex;
margin: 10px 0;
}
.goods-info-text {
width: 350px;
margin-bottom: 10px;
}
.m2 {
text-overflow: -o-ellipsis-lastline;
overflow: hidden;
text-overflow: ellipsis;
display: -webkit-box;
-webkit-line-clamp: 2;
line-clamp: 2;
-webkit-box-orient: vertical;
}
.el-alert {
display: flex;
// margin: 20px 0 0;
margin-bottom: 15px;
}
</style>

View File

@ -1,207 +0,0 @@
<!--
* @Descripttion: (店铺地址/tb_shop_address 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加店铺地址信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col v-if="userid == 1" :lg="12">
<el-form-item :label-width="labelWidth" label="店铺" prop="shopGuid">
<el-input v-model='formData.shopName' disabled type="text" placeholder='点击选择店铺'>
<template #append>
<div @click="handleChooseShop">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="地址类型" prop="shopAddressType">
<el-radio-group v-model="formData.shopAddressType">
<el-radio v-for="item in shop_address_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="所在地区" prop="districtId">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'regionId', label: 'regionName', emitPath: true }"
placeholder="请选择所在地区" clearable v-model="formData.districtId" @change="handleCascaderChange">
<template #default="{ node, data }">
<span>{{ data.regionName }}</span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="联系人姓名" prop="shopAddressContactName">
<el-input v-model="formData.shopAddressContactName" placeholder="请输入联系人姓名" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="联系电话" prop="shopAddressContactNumber">
<el-input v-model="formData.shopAddressContactNumber" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详细地址" prop="shopAddressDetailedAddress">
<el-input v-model="formData.shopAddressDetailedAddress" type="textarea" :rows="5" placeholder="请输入详细地址" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="shopAddressSort">
<el-input-number v-model.number="formData.shopAddressSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择店铺 -->
<ChooseShopDialog v-model="ChooseShopDialogVisible" :data="ChooseShopDialogRow" >
</ChooseShopDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateShopAddress } from '@/api/business/ShopManager/ShopAddresss/shopAddress.js';
import { regionTreeList } from '@/api/business/Custom/Regions/region.js';
import useUserStore from '@/store/modules/user'
import ChooseShopDialog from '@/views/business/components/ChooseShopDialog.vue';
//
const openDialog = async () => {
await getTreeList()
await getshop_address_type()
}
// -
const dataList = ref([])
const userid = useUserStore().userId
//
const shop_address_type = ref([]);
//
const ChooseShopDialogVisible = ref(false);
const ChooseShopDialogRow = ref({});
// -
//
async function getshop_address_type() {
await proxy.getDicts('shop_address_type').then((res) => {
shop_address_type.value = res.data
})
}
//
async function getTreeList() {
regionTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
function handleCascaderChange(selectedValues) {
formData.provinceId = selectedValues[0]
formData.cityId = selectedValues[1]
formData.districtId = selectedValues[2]
}
//
const handleChooseShop = () => {
ChooseShopDialogVisible.value = true
ChooseShopDialogRow.value = formData
}
// -
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
shopAddressSort: 100
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "ShopAddress"
})
//
const rules = reactive({
shopAddressType: [{ required: true, message: "地址类型不能为空", trigger: "blur", type: "number" }],
districtId: [{ required: true, message: "所在地区不能为空", trigger: "blur", type: "number" }],
shopAddressContactName: [{ required: true, message: "联系人姓名不能为空", trigger: "blur" }],
shopAddressContactNumber: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
shopAddressDetailedAddress: [{ required: true, message: "详细地址不能为空", trigger: "blur" }],
shopAddressSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateShopAddress(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,130 +0,0 @@
<!--
* @Descripttion: (店铺地址/tb_shop_address 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="店铺地址信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="地址类型" prop="shopAddressType">
<el-radio-group v-model="formData.shopAddressType">
<el-radio v-for="item in shop_address_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="所在地区" prop="districtId">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'regionId', label: 'regionName', emitPath: true }"
placeholder="请选择所在地区" clearable v-model="formData.districtId" @change="handleCascaderChange">
<template #default="{ node, data }">
<span>{{ data.regionName }}</span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="联系人姓名" prop="shopAddressContactName">
<el-input v-model="formData.shopAddressContactName" placeholder="请输入联系人姓名" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="联系电话" prop="shopAddressContactNumber">
<el-input v-model="formData.shopAddressContactNumber" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详细地址" prop="shopAddressDetailedAddress">
<el-input v-model="formData.shopAddressDetailedAddress" type="textarea" :rows="5" placeholder="请输入详细地址" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="shopAddressSort">
<el-input-number v-model.number="formData.shopAddressSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import { regionTreeList } from '@/api/business/Custom/Regions/region.js';
//
const openDialog = async () => {
await getTreeList()
await getshop_address_type()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
const dataList = ref([])
//
const shop_address_type = ref([]);
// -
//
async function getshop_address_type() {
await proxy.getDicts('shop_address_type').then((res) => {
shop_address_type.value = res.data
})
}
//
async function getTreeList() {
regionTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,178 +0,0 @@
<!--
* @Descripttion: (店铺地址/tb_shop_address 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改店铺地址信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="地址类型" prop="shopAddressType">
<el-radio-group v-model="formData.shopAddressType">
<el-radio v-for="item in shop_address_type " :key="item.dictValue" :label="parseInt(item.dictValue)">{{
item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="所在地区" prop="districtId">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'regionId', label: 'regionName', emitPath: true }"
placeholder="请选择所在地区" clearable v-model="formData.districtId" @change="handleCascaderChange">
<template #default="{ node, data }">
<span>{{ data.regionName }}</span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="联系人姓名" prop="shopAddressContactName">
<el-input v-model="formData.shopAddressContactName" placeholder="请输入联系人姓名" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="联系电话" prop="shopAddressContactNumber">
<el-input v-model="formData.shopAddressContactNumber" placeholder="请输入联系电话" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="详细地址" prop="shopAddressDetailedAddress">
<el-input v-model="formData.shopAddressDetailedAddress" type="textarea" :rows="5" placeholder="请输入详细地址" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="shopAddressSort">
<el-input-number v-model.number="formData.shopAddressSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateShopAddress } from "@/api/business/ShopManager/ShopAddresss/shopAddress.js";
import { regionTreeList } from '@/api/business/Custom/Regions/region.js';
//
const openDialog = async () => {
await getTreeList()
await getshop_address_type()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
const dataList = ref([])
//
const shop_address_type = ref([]);
// -
//
async function getshop_address_type() {
await proxy.getDicts('shop_address_type').then((res) => {
shop_address_type.value = res.data
})
}
//
async function getTreeList() {
regionTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
function handleCascaderChange(selectedValues) {
formData.data.provinceId = selectedValues[0]
formData.data.cityId = selectedValues[1]
formData.data.districtId = selectedValues[2]
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "ShopAddress"
})
//
const rules = reactive({
shopAddressType: [{ required: true, message: "地址类型不能为空", trigger: "blur", type: "number" }],
districtId: [{ required: true, message: "所在地区不能为空", trigger: "blur", type: "number" }],
shopAddressContactName: [{ required: true, message: "联系人姓名不能为空", trigger: "blur" }],
shopAddressContactNumber: [{ required: true, message: "联系电话不能为空", trigger: "blur" }],
shopAddressDetailedAddress: [{ required: true, message: "详细地址不能为空", trigger: "blur" }],
shopAddressSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateShopAddress(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,239 +0,0 @@
<!--
* @Descripttion: (店铺地址/tb_shop_address)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-15)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-15)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="地址类型" prop="shopAddressType">
<el-radio-group v-model="queryParams.shopAddressType">
<el-radio v-for="item in shop_address_type " :key="item.dictValue"
:label="item.dictValue">{{ item.dictLabel }}</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:shopaddress:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:shopaddress:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport"
v-hasPermi="['business:shopaddress:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" border highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="shopName" label="店铺名称" align="center" />
<el-table-column prop="shopAddressType" label="地址类型" align="center">
<template #default="scope">
<dict-tag :options="shop_address_type" :value="scope.row.shopAddressType" />
</template>
</el-table-column>
<el-table-column prop="addressName" label="所在地区" align="center" />
<el-table-column prop="shopAddressContactName" label="联系人姓名" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="shopAddressContactNumber" label="联系电话" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="shopAddressDetailedAddress" label="详细地址" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="createTime" label="创建时间" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="shopAddressSort" label="排序" align="center" sortable />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="primary" size="small" icon="edit" @click="handleUpdate(scope.row)"
v-hasPermi="['business:shopaddress:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:shopaddress:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="shopaddress">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportShopAddress, shopAddressList, delShopAddress } from '@/api/business/ShopManager/ShopAddresss/shopAddress.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
//
//
const shop_address_type = ref([]);
async function getshop_address_type() {
await proxy.getDicts('shop_address_type').then((res) => {
shop_address_type.value = res.data
})
}
getshop_address_type()
//
//
function getList() {
loading.value = true
shopAddressList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.shopAddressId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.shopAddressId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delShopAddress(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.shopAddressId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportShopAddress(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,103 +0,0 @@
<template>
<!-- 面包屑 -->
<el-breadcrumb>
<el-breadcrumb-item>联系方式</el-breadcrumb-item>
<el-breadcrumb-item to="/ContactInfo'">联系信息</el-breadcrumb-item>
</el-breadcrumb>
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row>
<el-col :span='24'>
<el-form-item :label-width="labelWidth" label="名称" prop="shopName">
<el-input v-model="formData.shopName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item :label-width="labelWidth" label="简介" prop="shopIntro">
<el-input v-model="formData.shopIntro" type="textarea" :rows="5" placeholder="请输入简介" />
</el-form-item>
</el-col>
<el-col :span='6'>
<el-form-item :label-width="labelWidth" label="图标" prop="shopLogo">
<UploadImage ref="uploadRef" v-model="formData.shopLogo" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-button type="primary" class="sus_button" @click="save(formRef)">
保存
</el-button>
</el-row>
</el-form>
</template>
<script setup>
import { ref, reactive } from "vue";
import { getShopOperatorDetail, editShopOperatorDetail } from "@/api/business/ShopManager/Shops/shopOperator.js";
import modal from '@/plugins/modal.js'
let formData = ref({});
const imgData = ref({
dirName: "ContactInfo"
})
//
const rules = reactive({
});
const labelWidth = 200;
const formRef = ref();
//
const getContent = async () => {
const { code, data } = await getShopOperatorDetail();
if (code == 200) {
formData.value = data;
}
};
getContent()
//
const save = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await editShopOperatorDetail(formData.value);
if (code == 200) {
modal.msgSuccess('编辑成功')
}
});
};
</script>
<style lang="scss" scoped>
.sus_button {
width: 300px;
height: 50px;
margin: 20px auto;
}
// .upLoadEl {
// :deep(.el-upload-list__item) {
// height: 200px;
// width: 300px;
// }
// :deep(.el-upload-list__item-thumbnail) {
// object-fit: contain;
// }
// }
</style>

View File

@ -1,222 +0,0 @@
<!--
* @Descripttion: (店铺/tb_shop 添加弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-09)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-09)
-->
<template>
<el-dialog v-model="props.modelValue" title="添加店铺信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="用户" prop="userName">
<el-input v-model='formData.userName' disabled type="text" placeholder='点击选择用户'>
<template #append>
<div @click="handleChooseUser">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerNickname">
<el-input v-model='formData.customerNickname' disabled type="text" placeholder='点击选择客户'>
<template #append>
<div @click="handleChooseCustomer">选择</div>
</template>
</el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="经营类目" prop="shopBusinessCategoryGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'goodsCategoryGuid', label: 'goodsCategoryName', emitPath: false }"
placeholder="请选择经营类目" clearable v-model="formData.shopBusinessCategoryGuid">
<template #default="{ node, data }">
<span>{{ data.goodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="图标" prop="shopLogo">
<UploadImage ref="uploadRef" v-model="formData.shopLogo" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="营业执照" prop="shopBusinessLicense">
<UploadImage ref="uploadRef" v-model="formData.shopBusinessLicense" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="shopName">
<el-input v-model="formData.shopName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="简介" prop="shopIntro">
<el-input v-model="formData.shopIntro" type="textarea" :rows="5" placeholder="请输入简介" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="shopSort">
<el-input-number v-model.number="formData.shopSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="销售单量" prop="shopSalesOrderCount">
<el-input-number v-model.number="formData.shopSalesOrderCount" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
<!-- 选择用户 -->
<ChooseUserDialog v-model="ChooseUserDialogVisible" :data="ChooseUserDialogRow"></ChooseUserDialog>
<!-- 选择客户 -->
<ChooseCustomerDialog v-model="ChooseCustomerDialogVisible" :data="ChooseCustomerDialogRow"></ChooseCustomerDialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdateShop, getFirstGoodsCategoryList } from '@/api/business/ShopManager/Shops/shop.js';
import { goodsCategoryTreeList } from '@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js';
import ChooseCustomerDialog from '@/views/business/components/ChooseCustomerDialog.vue';
import ChooseUserDialog from '@/views/business/components/ChooseUserDialog.vue';
//
const openDialog = async () => {
await getTreeList()
await getaudit_status()
}
// -
//
const audit_status = ref([]);
//
const dataList = ref([])
//
const ChooseUserDialogVisible = ref(false);
const ChooseUserDialogRow = ref({});
//
const ChooseCustomerDialogVisible = ref(false);
const ChooseCustomerDialogRow = ref({});
// -
//
async function getaudit_status() {
await proxy.getDicts('audit_status').then((res) => {
audit_status.value = res.data
})
}
//
async function getTreeList() {
goodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
const handleChooseUser = () => {
ChooseUserDialogVisible.value = true
ChooseUserDialogRow.value = formData
}
//
const handleChooseCustomer = () => {
ChooseCustomerDialogVisible.value = true
ChooseCustomerDialogRow.value = formData
}
// -
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
shopSort: 100,
shopSalesOrderCount: 0
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "Shop"
})
//
const rules = reactive({
userName: [{ required: true, message: "用户不能为空", trigger: "blur" }],
customerNickname: [{ required: true, message: "客户不能为空", trigger: "blur" }],
shopBusinessCategoryGuid: [{ required: true, message: "经营类目guid不能为空", trigger: "blur" }],
shopLogo: [{ required: true, message: "图标不能为空", trigger: "blur" }],
shopBusinessLicense: [{ required: true, message: "营业执照不能为空", trigger: "blur" }],
shopName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
shopIntro: [{ required: true, message: "简介不能为空", trigger: "blur" }],
shopSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
shopSalesOrderCount: [{ required: true, message: "销售单量不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateShop(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,148 +0,0 @@
<!--
* @Descripttion: (店铺/tb_shop 详情弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-09)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-09)
-->
<template>
<el-dialog v-model="props.modelValue" title="店铺信息详情" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="用户" prop="userName">
<el-input v-model='formData.userName' disabled type="text"></el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerNickname">
<el-input v-model='formData.customerNickname' disabled type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="经营类目" prop="shopBusinessCategoryGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'goodsCategoryGuid', label: 'goodsCategoryName', emitPath: false }"
clearable v-model="formData.shopBusinessCategoryGuid">
<template #default="{ node, data }">
<span>{{ data.goodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="图标" prop="shopLogo">
<UploadImage ref="uploadRef" v-model="formData.shopLogo" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="营业执照" prop="shopBusinessLicense">
<UploadImage ref="uploadRef" v-model="formData.shopBusinessLicense" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="shopName">
<el-input v-model="formData.shopName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="简介" prop="shopIntro">
<el-input v-model="formData.shopIntro" type="textarea" :rows="5" placeholder="请输入简介" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="shopSort">
<el-input-number v-model.number="formData.shopSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="销售单量" prop="shopSalesOrderCount">
<el-input-number v-model.number="formData.shopSalesOrderCount" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
import { getFirstGoodsCategoryList } from '@/api/business/ShopManager/Shops/shop.js';
import { goodsCategoryTreeList } from '@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js';
//
const openDialog = async () => {
await getTreeList()
await getaudit_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
//
const audit_status = ref([]);
//
const dataList = ref([])
// -
//
async function getaudit_status() {
await proxy.getDicts('audit_status').then((res) => {
audit_status.value = res.data
})
}
//
async function getTreeList() {
goodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
// -
const closeDialog = () => {
emits("update:modelValue", false);
};
</script>

View File

@ -1,192 +0,0 @@
<!--
* @Descripttion: (店铺/tb_shop 编辑弹窗)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-09)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-09)
-->
<template>
<el-dialog v-model="props.modelValue" title="修改店铺信息" width="900px" @closed="closeDialog" @open="openDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="用户" prop="userName">
<el-input v-model='formData.userName' disabled type="text"></el-input>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="客户" prop="customerNickname">
<el-input v-model='formData.customerNickname' disabled type="text"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="经营类目" prop="shopBusinessCategoryGuid">
<el-cascader class="w100" :options="dataList"
:props="{ checkStrictly: false, value: 'goodsCategoryGuid', label: 'goodsCategoryName', emitPath: false }"
placeholder="请选择经营类目" clearable v-model="formData.shopBusinessCategoryGuid">
<template #default="{ node, data }">
<span>{{ data.goodsCategoryName }}</span>
<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
</template>
</el-cascader>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="图标" prop="shopLogo">
<UploadImage ref="uploadRef" v-model="formData.shopLogo" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="营业执照" prop="shopBusinessLicense">
<UploadImage ref="uploadRef" v-model="formData.shopBusinessLicense" :data=imgData :limit="1" :fileSize="5"
:drag="true" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="名称" prop="shopName">
<el-input v-model="formData.shopName" placeholder="请输入名称" />
</el-form-item>
</el-col>
<el-col :lg="24">
<el-form-item :label-width="labelWidth" label="简介" prop="shopIntro">
<el-input v-model="formData.shopIntro" type="textarea" :rows="5" placeholder="请输入简介" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="排序" prop="shopSort">
<el-input-number v-model.number="formData.shopSort" controls-position="right" :min="0" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="销售单量" prop="shopSalesOrderCount">
<el-input-number v-model.number="formData.shopSalesOrderCount" controls-position="right" :min="0" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdateShop, getFirstGoodsCategoryList } from '@/api/business/ShopManager/Shops/shop.js';
import { goodsCategoryTreeList } from '@/api/business/GoodsManager/GoodsCategorys/goodsCategory.js';
//
const openDialog = async () => {
await getTreeList()
await getaudit_status()
}
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
//
//
const audit_status = ref([]);
//
const dataList = ref([])
// -
//
async function getaudit_status() {
await proxy.getDicts('audit_status').then((res) => {
audit_status.value = res.data
})
}
//
async function getTreeList() {
goodsCategoryTreeList().then((res) => {
if (res.code == 200) {
dataList.value = res.data
}
})
}
// -
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const imgData = ref({
fileDir: "Shop"
})
//
const rules = reactive({
userName: [{ required: true, message: "用户不能为空", trigger: "blur" }],
customerNickname: [{ required: true, message: "客户不能为空", trigger: "blur" }],
shopBusinessCategoryGuid: [{ required: true, message: "经营类目guid不能为空", trigger: "blur" }],
shopLogo: [{ required: true, message: "图标不能为空", trigger: "blur" }],
shopBusinessLicense: [{ required: true, message: "营业执照不能为空", trigger: "blur" }],
shopName: [{ required: true, message: "名称不能为空", trigger: "blur" }],
shopIntro: [{ required: true, message: "简介不能为空", trigger: "blur" }],
shopSort: [{ required: true, message: "排序不能为空", trigger: "blur", type: "number" }],
shopSalesOrderCount: [{ required: true, message: "销售单量不能为空", trigger: "blur", type: "number" }],
});
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdateShop(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,310 +0,0 @@
<!--
* @Descripttion: (店铺/tb_shop)
* @version: (1.0)
* @Author: (lwh)
* @Date: (2023-06-09)
* @LastEditors: (lwh)
* @LastEditTime: (2023-06-09)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" v-show="showSearch"
@submit.prevent>
<el-form-item label="名称" prop="shopName">
<el-input v-model="queryParams.shopName" placeholder="请输入名称" clearable @keyup.enter="handleQuery" />
</el-form-item>
<el-form-item label="审核状态" prop="shopAuditStatus">
<el-select v-model="queryParams.shopAuditStatus" placeholder="请选择审核状态" clearable @change="handleQuery">
<el-option v-for="item in audit_status " :key="item.dictValue" :label="item.dictLabel"
:value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="primary" v-hasPermi="['business:shop:addOrUpdate']" plain icon="plus"
@click="AddDialogVisible = true">
{{ $t('btn.add') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="danger" :disabled="multiple" v-hasPermi="['business:shop:delete']" plain icon="delete"
@click="handleDelete">
{{ $t('btn.delete') }}
</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" :disabled="multiple" v-hasPermi="['business:shop:audit']" plain icon="check"
@click="handleAudit">审核</el-button>
</el-col>
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:shop:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="userName" label="用户" align="center">
<template #default="scope">
<div v-if="!scope.row.userName">暂未绑定</div>
<div v-else>{{ scope.row.userName }}</div>
</template>
</el-table-column>
<el-table-column prop="customerNickname" label="客户" align="center" />
<el-table-column prop="shopBusinessCategoryName" label="经营类目" align="center">
<template #default="scope">
<el-tag>{{ scope.row.shopBusinessCategoryName }}</el-tag>
</template>
</el-table-column>
<el-table-column prop="shopName" label="名称" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="shopLogo" label="图标" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.shopLogo.split(',')[0]" :preview-src-list="scope.row.shopLogo.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="shopSalesOrderCount" label="销售单量" align="center" sortable />
<el-table-column prop="shopSort" label="排序" align="center" sortable />
<el-table-column prop="shopAuditStatus" label="审核状态" align="center">
<template #default="scope">
<dict-tag :options="audit_status" :value="scope.row.shopAuditStatus" />
</template>
</el-table-column>
<el-table-column prop="createTime" label="创建时间" align="center" />
<el-table-column label="操作" width="350" fixed="right">
<template #default="scope">
<el-button type="warning" v-if="scope.row.shopAuditStatus == 1" size="small" icon="check"
@click="handleAudit(scope.row)" v-hasPermi="['business:shop:audit']">审核</el-button>
<el-button type="primary" v-if="scope.row.shopAuditStatus == 2" size="small" icon="edit"
@click="handleUpdate(scope.row)" v-hasPermi="['business:shop:addOrUpdate']">编辑</el-button>
<el-button type="danger" size="small" icon="delete" @click="handleDelete(scope.row)"
v-hasPermi="['business:shop:delete']">删除</el-button>
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 添加 -->
<AddDialog v-model="AddDialogVisible" :done="() => resetQuery()"></AddDialog>
<!-- 编辑 -->
<EditDialog v-model="EditDialogVisible" :data="EditDialogRow" :done="() => resetQuery()"></EditDialog>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="shop">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportShop, audit, shopList, delShop } from '@/api/business/ShopManager/Shops/shop.js'
import AddDialog from "./components/AddDialog.vue";
import EditDialog from "./components/EditDialog.vue";
import DetailDialog from "./components/DetailDialog.vue";
const AddDialogVisible = ref(false);
const EditDialogVisible = ref(false);
const EditDialogRow = ref({});
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
const { queryParams } = toRefs(data)
//
//
//
const audit_status = ref([]);
async function getaudit_status() {
await proxy.getDicts('audit_status').then((res) => {
audit_status.value = res.data
})
}
getaudit_status()
//
//
function getList() {
loading.value = true
shopList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false;
dataList.value = res.data.result;
total.value = res.data.totalNum;
}
});
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.shopId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
/** 删除按钮操作 */
function handleDelete(row) {
const Ids = row.shopId || ids.value
ElMessageBox.confirm("是否确认删除?", "系统提示", {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: "warning",
})
.then(function () {
return delShop(Ids)
})
.then(() => {
handleQuery()
modal.msgSuccess("删除成功")
})
.catch(() => { })
}
/** 导出按钮操作 */
function handleExport(row) {
const Ids = row.shopId || ids.value
const name = ref("所有")
if (Ids.length != 0) {
const ids = Object.values(Ids).map(value => String(value));
const str = ids.join(',');
queryParams.value.ids = str
name.value = "选中"
}
ElMessageBox.confirm('是否确认导出' + name.value + '数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportShop(queryParams.value)
})
.then((response) => {
proxy.download(response.data.path)
})
}
/** 审核按钮操作 */
const AuditData = reactive({
ids: null,
shopAuditStatus: null,
})
function handleAudit(row) {
const Ids = row.shopId || ids.value.toString()
ElMessageBox.confirm("是否通过审核?", "系统提示", {
distinguishCancelAndClose: true,
confirmButtonText: '通过',
cancelButtonText: '驳回',
type: "warning",
})
.then(async () => {
AuditData.shopAuditStatus = 2
AuditData.ids = Ids
Audit()
})
.catch((action) => {
if (action == 'cancel') {
AuditData.shopAuditStatus = 3
AuditData.ids = Ids
Audit()
// console.log("");
}
else {
// console.log("");
}
})
}
async function Audit() {
audit(AuditData).then((res) => {
if (res.code == 200) {
handleQuery()
ElMessageBox.alert(res.data, "审核信息", {
dangerouslyUseHTMLString: true,
confirmButtonText: "确定",
});
} else {
ElMessage.error(res.data);
}
})
}
//
function handleUpdate(row) {
EditDialogVisible.value = true
EditDialogRow.value = row
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -1,124 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="选择优惠券" width="900px" @closed="closeDialog" @open="openDialog">
<el-form inline :model="queryParams">
<el-form-item label="优惠券名称">
<el-input v-model='queryParams.couponName' placeholder='请输入优惠券名称'></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">
搜索
</el-button>
</el-form-item>
</el-form>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="couponsList" ref="tableRef" border highlight-current-row
@row-click="handleRowClick">
<el-table-column prop="couponName" label="优惠券名称" align="left" :show-overflow-tooltip="true" />
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getCouponListFun" />
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleEditClick()">添加</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch, nextTick } from 'vue';
import { ElMessage } from 'element-plus'
import { couponList } from '@/api/business/Marketing/CouponManage/Coupons/coupon.js'
//
const total = ref(0)
const loading = ref(false)
//
const tableRef = ref(null);
//
const queryParams = reactive({
couponName: "",
pageNum: 1,
pageSize: 10
});
const emits = defineEmits(['update:modelValue']);
const props = defineProps({
modelValue: Boolean,
data: Object,
});
const formData = ref({
...props.data
});
let couponsList = ref([]);
//
const openDialog = async () => {
await getCouponListFun()
}
/** 搜索按钮操作 */
function handleQuery() {
getCouponListFun()
}
const getCouponListFun = async () => {
loading.value = true
await couponList(queryParams).then((res) => {
if (res.code == 200) {
couponsList.value = res.data.result
total.value = res.data.totalNum
loading.value = false
}
})
}
watch(props, (v) => {
formData.value = v.data;
});
// -
let couponName = ref("");
let couponGuid = ref("");
// -
//
const handleRowClick = (row) => {
couponName.value = row.couponName
couponGuid.value = row.couponGuid
}
const closeDialog = () => {
queryParams.couponName = ""
couponName.value = ""
emits('update:modelValue', false);
};
//
const handleEditClick = async () => {
if (couponName.value !== "") {
formData.value.couponName = couponName.value
formData.value.couponGuid = couponGuid.value
if (formData.value.couponName != null) {
closeDialog();
}
} else {
ElMessage.error("请选择优惠券")
return;
}
};
const handleResetClick = async formEl => {
};
</script>

View File

@ -1,124 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="选择客户" width="900px" @closed="closeDialog" @open="openDialog">
<el-form inline :model="queryParams">
<el-form-item label="客户名称">
<el-input v-model='queryParams.customerNickname' placeholder='请输入客户名称'></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">
搜索
</el-button>
</el-form-item>
</el-form>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="customersList" ref="tableRef" border highlight-current-row
@row-click="handleRowClick">
<el-table-column prop="customerNickname" label="客户名称" align="left" :show-overflow-tooltip="true" />
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getCustomerListFun" />
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleEditClick()">添加</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch, nextTick } from 'vue';
import { ElMessage } from 'element-plus'
import { customerList } from '@/api/business/Custom/Customers/customer.js'
//
const total = ref(0)
const loading = ref(false)
//
const tableRef = ref(null);
//
const queryParams = reactive({
customerNickname: "",
pageNum: 1,
pageSize: 10
});
const emits = defineEmits(['update:modelValue']);
const props = defineProps({
modelValue: Boolean,
data: Object,
});
const formData = ref({
...props.data
});
let customersList = ref([]);
//
const openDialog = async () => {
await getCustomerListFun()
}
/** 搜索按钮操作 */
function handleQuery() {
getCustomerListFun()
}
const getCustomerListFun = async () => {
loading.value = true
await customerList(queryParams).then((res) => {
if (res.code == 200) {
customersList.value = res.data.result
total.value = res.data.totalNum
loading.value = false
}
})
}
watch(props, (v) => {
formData.value = v.data;
});
// -
let customerNickname = ref("");
let customerGuid = ref("");
// -
//
const handleRowClick = (row) => {
customerNickname.value = row.customerNickname
customerGuid.value = row.customerGuid
}
const closeDialog = () => {
queryParams.customerNickname = ""
customerNickname.value = ""
emits('update:modelValue', false);
};
//
const handleEditClick = async () => {
if (customerNickname.value !== "") {
formData.value.customerNickname = customerNickname.value
formData.value.customerAddressCustomerGuid = customerGuid.value
formData.value.customerGuid = customerGuid.value
if (formData.value.customerNickname != null) {
closeDialog();
}
} else {
ElMessage.error("请选择客户")
return;
}
};
const handleResetClick = async formEl => {
};
</script>

View File

@ -1,145 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="选择商品" width="900px" @closed="closeDialog" @open="openDialog">
<el-form inline :model="queryParams">
<el-form-item label="商品名称">
<el-input v-model='queryParams.goodsName' placeholder='请输入商品名称'></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">
搜索
</el-button>
</el-form-item>
</el-form>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="goodssList" ref="tableRef" border highlight-current-row
@row-click="handleRowClick">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="goodsPicture" width="150" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]" :preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsName" width="450" label="商品名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="goodsPriceLowest" label="价格" align="center" />
<el-table-column prop="goodsTotalInventory" label="库存总量" align="center" />
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getgoodsListFun" />
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleEditClick()">添加</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch, nextTick } from 'vue';
import { ElMessage } from 'element-plus'
import { goodsList } from '@/api/business/GoodsManager/Goodss/goods.js'
//
const total = ref(0)
const loading = ref(false)
//
const tableRef = ref(null);
//
const queryParams = reactive({
goodsName: "",
shopGuid: 0,
pageNum: 1,
pageSize: 10
});
const emits = defineEmits(['update:modelValue']);
const props = defineProps({
modelValue: Boolean,
data: Object,
// done: Function,
});
const formData = ref({
...props.data
});
const goodssList = ref([]);
//
const openDialog = async () => {
await getgoodsListFun()
}
/** 搜索按钮操作 */
function handleQuery() {
getgoodsListFun()
}
const getgoodsListFun = async () => {
loading.value = true
await goodsList(queryParams).then((res) => {
if (res.code == 200) {
goodssList.value = res.data.result
total.value = res.data.totalNum
loading.value = false
}
})
}
watch(props, (v) => {
if (v.data.shopGuid) {
queryParams.shopGuid = v.data.shopGuid
}
formData.value = v.data;
});
// -
let goodsName = ref("");
let goodsGuid = ref("");
// -
//
const handleRowClick = (row) => {
goodsName.value = row.goodsName
goodsGuid.value = row.goodsGuid
}
const closeDialog = () => {
queryParams.goodsName = ""
goodsName.value = ""
emits('update:modelValue', false);
};
//
const handleEditClick = async () => {
if (goodsName.value !== "") {
formData.value.goodsName = goodsName.value
formData.value.goodsGuid = goodsGuid.value
if (formData.value.goodsName != null) {
// props.done();
closeDialog();
}
} else {
ElMessage.error("请选择商品")
return;
}
};
const handleResetClick = async formEl => {
};
</script>

View File

@ -1,154 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="选择商品" width="900px" @closed="closeDialog" @open="openDialog">
<el-form inline :model="queryParams">
<el-form-item label="商品名称">
<el-input v-model='queryParams.goodsName' placeholder='请输入商品名称'></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">
搜索
</el-button>
</el-form-item>
</el-form>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="goodssList" ref="tableRef" border highlight-current-row
@selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="goodsPicture" width="150" label="图片" align="center">
<template #default="scope">
<el-image preview-teleported :hide-on-click-modal="true" lazy class="table-td-thumb" fit="contain"
:src="scope.row.goodsPicture?.split(',')[0]" :preview-src-list="scope.row.goodsPicture?.split(',')">
<div><el-icon :size="15">
<document />
</el-icon></div>
</el-image>
</template>
</el-table-column>
<el-table-column prop="goodsName" width="450" label="商品名称" align="left" :show-overflow-tooltip="true" />
<el-table-column prop="goodsPriceLowest" label="价格" align="center" />
<el-table-column prop="goodsTotalInventory" label="库存总量" align="center" />
</el-table>
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleEditClick()">添加</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch, nextTick } from 'vue';
import { ElMessage } from 'element-plus'
import { allGoodsList } from '@/api/business/GoodsManager/Goodss/goods.js'
//
const loading = ref(false)
//
const goodsTableData = ref([])
// Id
const ids = ref([])
//
const tableRef = ref(null);
//
const queryParams = reactive({
goodsName: "",
});
const emits = defineEmits(['update:modelValue']);
const props = defineProps({
modelValue: Boolean,
data: Object,
// done: Function,
});
const formData = ref({
...props.data
});
const goodssList = ref([]);
//
const openDialog = async () => {
await getgoodsListFun()
}
/** 搜索按钮操作 */
function handleQuery() {
getgoodsListFun()
}
const getgoodsListFun = async () => {
loading.value = true
await allGoodsList(queryParams).then((res) => {
if (res.code == 200) {
goodssList.value = res.data
loading.value = false
}
})
//
goodssList.value.forEach(item => {
props.data.couponApplicableScopeConfig.forEach(e => {
if (item.goodsId === e.goodsId) {
tableRef.value.toggleRowSelection(item);
}
});
});
}
watch(props, (v) => {
formData.value = v.data;
});
// -
// -
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.goodsId)
goodsTableData.value = selection.map((item) => item)
// console.log(ids.value,"ids");
// console.log(goodsTableData.value,"");
}
const closeDialog = () => {
queryParams.goodsName = ""
ids.value = ""
goodsTableData.value = []
emits('update:modelValue', false);
};
//
const handleEditClick = async () => {
if (goodsTableData.value.length !== 0) {
formData.value.couponApplicableScopeConfig = goodsTableData.value
formData.value.couponGoodsIds = ids.value
console.log(formData.value, '外面的表单');
if (formData.value.couponApplicableScopeConfig.length != 0) {
// props.done();
closeDialog();
}
} else {
ElMessage.error("请选择商品")
return;
}
};
const handleResetClick = async formEl => {
};
</script>

View File

@ -1,127 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="选择店铺" width="900px" @closed="closeDialog" @open="openDialog">
<el-form inline :model="queryParams">
<el-form-item label="店铺名称">
<el-input v-model='queryParams.shopName' placeholder='请输入店铺名称'></el-input>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="handleQuery">
搜索
</el-button>
</el-form-item>
</el-form>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="shopsList" ref="tableRef" border highlight-current-row
@row-click="handleRowClick">
<el-table-column prop="shopName" label="店铺名称" align="left" :show-overflow-tooltip="true" />
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getShopListFun" />
<template #footer>
<span class="dialog-footer">
<el-button type="primary" @click="handleEditClick()">添加</el-button>
<el-button @click="handleResetClick()">重置</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch, nextTick } from 'vue';
import { ElMessage } from 'element-plus'
import { shopList } from '@/api/business/ShopManager/Shops/shop.js'
//
const total = ref(0)
const loading = ref(false)
//
const tableRef = ref(null);
//
const queryParams = reactive({
shopName: "",
pageNum: 1,
pageSize: 10
});
const emits = defineEmits(['update:modelValue']);
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const formData = ref({
...props.data
});
let shopsList = ref([]);
//
const openDialog = async () => {
await getShopListFun()
}
/** 搜索按钮操作 */
function handleQuery() {
getShopListFun()
}
const getShopListFun = async () => {
loading.value = true
await shopList(queryParams).then((res) => {
if (res.code == 200) {
shopsList.value = res.data.result
total.value = res.data.totalNum
loading.value = false
}
})
}
watch(props, (v) => {
formData.value = v.data;
});
// -
let shopName = ref("");
let shopGuid = ref("");
// -
//
const handleRowClick = (row) => {
shopName.value = row.shopName
shopGuid.value = row.shopGuid
}
const closeDialog = () => {
queryParams.shopName = ""
shopName.value = ""
emits('update:modelValue', false);
};
//
const handleEditClick = async () => {
if (shopName.value !== "") {
formData.value.shopName = shopName.value
formData.value.shopGuid = shopGuid.value
if (formData.value.shopName != null) {
if(props.done){
props.done();
}
closeDialog();
}
} else {
ElMessage.error("请选择店铺")
return;
}
};
const handleResetClick = async formEl => {
};
</script>

View File

@ -1,144 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="添加支付订单信息" width="900px" @closed="closeDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="超时付款订单号" prop="paymentOvertimeNumber">
<el-input v-model="formData.paymentOvertimeNumber" placeholder="请输入超时付款订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="操作状态(1待支付 |2已支付 | 3已取消 | 4已退款)" prop="paymentStatus">
<el-select v-model="formData.paymentStatus" placeholder="请选择操作状态(1待支付 |2已支付 | 3已取消 | 4已退款)">
<el-option v-for="item in paymentStatusOptions" :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="核销后价格/操作金额" prop="paymentMoney">
<el-input v-model="formData.paymentMoney" placeholder="请输入核销后价格/操作金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="核销前价格" prop="paymentBeforeMoney">
<el-input v-model="formData.paymentBeforeMoney" placeholder="请输入核销前价格" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="退款订单号" prop="paymentRefundNumber">
<el-input v-model="formData.paymentRefundNumber" placeholder="请输入退款订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="微信支付订单号" prop="paymentWeixinNumber">
<el-input v-model="formData.paymentWeixinNumber" placeholder="请输入微信支付订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="系统订单号" prop="paymentNumber">
<el-input v-model="formData.paymentNumber" placeholder="请输入系统订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="操作客户guid(外键)" prop="customerGuid">
<el-input v-model="formData.customerGuid" placeholder="请输入操作客户guid(外键)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="业务订单guid(外键)" prop="paymentBusinessGuid">
<el-input v-model="formData.paymentBusinessGuid" placeholder="请输入业务订单guid(外键)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="购买类型(1| )" prop="paymentBuytype">
<el-select v-model="formData.paymentBuytype" placeholder="请选择购买类型(1| )">
<el-option v-for="item in paymentBuytypeOptions" :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div key="dialog-footer">
<el-button type="primary" @click="handleAddClick(formRef)">添加</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { reactive, ref, watch } from "vue";
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { addOrUpdatePayment } from '@/api/business/payments/payment.js';
//
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = reactive({
});
const props = defineProps({
modelValue: Boolean,
done: Function,
});
const imgData = ref({
fileDir: "Payment"
})
//
const rules = reactive({
paymentGuid: [{ required: true, message: "支付订单guid不能为空", trigger: "blur", type: "number" }],
paymentStatus: [{ required: true, message: "操作状态(1待支付 |2已支付 | 3已取消 | 4已退款)不能为空", trigger: "change", type: "number" }],
paymentNumber: [{ required: true, message: "系统订单号不能为空", trigger: "blur" }],
customerGuid: [{ required: true, message: "操作客户guid(外键)不能为空", trigger: "blur" }],
paymentBuytype: [{ required: true, message: "购买类型(1| )不能为空", trigger: "change", type: "number" }],
});
// (1 |2 | 3 | 4退)
const paymentStatusOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
// (1| )
const paymentBuytypeOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
//
// -
// -
const handleAddClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdatePayment(formData);
if (code == 200) {
modal.msgSuccess('添加成功')
closeDialog();
}
});
};
const closeDialog = () => {
handleResetClick(formRef.value);
props.done();
emits("update:modelValue", false);
};
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
};
</script>

View File

@ -1,131 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="支付订单信息详情" width="900px" @closed="closeDialog">
<el-form ref="formRef" :model="formData" :disabled="true">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="超时付款订单号" prop="paymentOvertimeNumber">
<el-input v-model="formData.paymentOvertimeNumber" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="操作状态(1待支付 |2已支付 | 3已取消 | 4已退款)" prop="paymentStatus">
<el-select v-model="formData.paymentStatus" >
<el-option v-for="item in paymentStatusOptions" :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="核销后价格/操作金额" prop="paymentMoney">
<el-input v-model="formData.paymentMoney" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="核销前价格" prop="paymentBeforeMoney">
<el-input v-model="formData.paymentBeforeMoney" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="退款订单号" prop="paymentRefundNumber">
<el-input v-model="formData.paymentRefundNumber" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="微信支付订单号" prop="paymentWeixinNumber">
<el-input v-model="formData.paymentWeixinNumber" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="系统订单号" prop="paymentNumber">
<el-input v-model="formData.paymentNumber" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="操作客户guid(外键)" prop="customerGuid">
<el-input v-model="formData.customerGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="业务订单guid(外键)" prop="paymentBusinessGuid">
<el-input v-model="formData.paymentBusinessGuid" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="购买类型(1| )" prop="paymentBuytype">
<el-select v-model="formData.paymentBuytype" >
<el-option v-for="item in paymentBuytypeOptions" :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-dialog>
</template>
<script setup>
import Editor from '@/components/Editor'
import { ElMessage } from 'element-plus'
import { reactive, ref, watch } from "vue";
//
const formRef = ref();
const labelWidth = 100;
const { proxy } = getCurrentInstance()
// (1 |2 | 3 | 4退)
const paymentStatusOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
// (1| )
const paymentBuytypeOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
// -
//
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const emits = defineEmits(["update:modelValue"]);
const formData = ref({
...props.data,
});
watch(props, async (v) => {
formData.value = v.data;
});
// -
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
const handeldisable = editor => {
editor.disable()
}
</script>

View File

@ -1,168 +0,0 @@
<template>
<el-dialog v-model="props.modelValue" title="修改支付订单信息" width="900px" @closed="closeDialog">
<el-form ref="formRef" :model="formData" :rules="rules">
<el-row :gutter="20">
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="超时付款订单号" prop="paymentOvertimeNumber">
<el-input v-model="formData.paymentOvertimeNumber" placeholder="请输入超时付款订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="操作状态(1待支付 |2已支付 | 3已取消 | 4已退款)" prop="paymentStatus">
<el-select v-model="formData.paymentStatus" placeholder="请选择操作状态(1待支付 |2已支付 | 3已取消 | 4已退款)">
<el-option v-for="item in paymentStatusOptions" :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="核销后价格/操作金额" prop="paymentMoney">
<el-input v-model="formData.paymentMoney" placeholder="请输入核销后价格/操作金额" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="核销前价格" prop="paymentBeforeMoney">
<el-input v-model="formData.paymentBeforeMoney" placeholder="请输入核销前价格" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="退款订单号" prop="paymentRefundNumber">
<el-input v-model="formData.paymentRefundNumber" placeholder="请输入退款订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="微信支付订单号" prop="paymentWeixinNumber">
<el-input v-model="formData.paymentWeixinNumber" placeholder="请输入微信支付订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="系统订单号" prop="paymentNumber">
<el-input v-model="formData.paymentNumber" placeholder="请输入系统订单号" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="操作客户guid(外键)" prop="customerGuid">
<el-input v-model="formData.customerGuid" placeholder="请输入操作客户guid(外键)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="业务订单guid(外键)" prop="paymentBusinessGuid">
<el-input v-model="formData.paymentBusinessGuid" placeholder="请输入业务订单guid(外键)" />
</el-form-item>
</el-col>
<el-col :lg="12">
<el-form-item :label-width="labelWidth" label="购买类型(1| )" prop="paymentBuytype">
<el-select v-model="formData.paymentBuytype" placeholder="请选择购买类型(1| )">
<el-option v-for="item in paymentBuytypeOptions" :key="item.dictValue" :label="item.dictLabel" :value="parseInt(item.dictValue)"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>
<div class="dialog-footer">
<el-button type="primary" @click="handleEditClick(formRef)">编辑</el-button>
<el-button @click="handleResetClick(formRef)">重置</el-button>
</div>
</template>
</el-dialog>
</template>
<script setup>
import { ElMessage } from 'element-plus'
import modal from '@/plugins/modal.js'
import { reactive, ref, watch } from "vue";
import { addOrUpdatePayment } from "@/api/business/payments/payment.js";
//
const props = defineProps({
modelValue: Boolean,
data: Object,
done: Function,
});
const labelWidth = 100;
const formRef = ref();
const { proxy } = getCurrentInstance()
const emits = defineEmits(["update:modelValue"]);
const formData = ref({
...props.data,
});
const imgData = ref({
fileDir: "Payment"
})
watch(props, async (v) => {
formData.value = v.data;
});
//
const rules = reactive({
paymentGuid: [{ required: true, message: "支付订单guid不能为空", trigger: "blur", type: "number" }],
paymentStatus: [{ required: true, message: "操作状态(1待支付 |2已支付 | 3已取消 | 4已退款)不能为空", trigger: "change", type: "number" }],
paymentNumber: [{ required: true, message: "系统订单号不能为空", trigger: "blur" }],
customerGuid: [{ required: true, message: "操作客户guid(外键)不能为空", trigger: "blur" }],
paymentBuytype: [{ required: true, message: "购买类型(1| )不能为空", trigger: "change", type: "number" }],
});
// (1 |2 | 3 | 4退)
const paymentStatusOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
// (1| )
const paymentBuytypeOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
//
// -
// -
//
const handleEditClick = async (formEl) => {
if (!formEl) return;
formEl.validate(async (valid) => {
if (!valid) {
return;
}
const { code } = await addOrUpdatePayment(formData.value);
if (code == 200) {
modal.msgSuccess('修改成功')
closeDialog();
}
});
}
const handleResetClick = async (formEl) => {
if (!formEl) return;
formEl.resetFields();
}
const closeDialog = () => {
props.done();
emits("update:modelValue", false);
};
</script>

View File

@ -1,171 +0,0 @@
<!--
* @Descripttion: (支付订单/tb_payment)
* @version: (1.0)
* @Author: (admin)
* @Date: (2022-12-15)
* @LastEditors: (admin)
* @LastEditTime: (2022-12-15)
-->
<template>
<div class="app-container">
<el-row :gutter="24">
<!-- 搜索框 queryParams.需要搜索的字段 -->
<el-form :model="queryParams" label-position="left" style="margin:15px;" inline ref="queryForm" label-width="100px" v-show="showSearch"
@submit.prevent>
<el-form-item label="操作状态" prop="paymentStatus">
<el-select v-model="queryParams.paymentStatus" placeholder="请选择操作状态">
<el-option v-for="item in paymentStatusOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue"></el-option>
</el-select>
</el-form-item>
<el-form-item>
<el-button icon="search" type="primary" @click="handleQuery">{{ $t('btn.search') }}</el-button>
<el-button icon="refresh" @click="resetQuery">{{ $t('btn.reset') }}</el-button>
</el-form-item>
</el-form>
</el-row>
<!-- 工具按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button type="warning" plain icon="download" @click="handleExport" v-hasPermi="['business:payment:export']">
{{ $t('btn.export') }}
</el-button>
</el-col>
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<!-- 表格渲染 prop="对应的字段"-->
<el-table v-loading="loading" :data="dataList" ref="tableRef" border highlight-current-row @selection-change="handleSelectionChange">
<el-table-column type="selection" width="50" align="center" />
<el-table-column prop="paymentStatus" label="操作状态" align="center">
<template #default="scope">
<dict-tag :options=" paymentStatusOptions" :value="scope.row.paymentStatus" />
</template>
</el-table-column>
<el-table-column prop="paymentMoney" label="核销后价格/操作金额" align="center" />
<el-table-column prop="paymentNumber" label="系统订单号" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="customerGuid" label="操作客户guid(外键)" align="center" :show-overflow-tooltip="true" />
<el-table-column prop="paymentBusinessGuid" label="业务订单guid(外键)" align="center" />
<el-table-column prop="paymentBuytype" label="购买类型(1| )" align="center">
<template #default="scope">
<dict-tag :options=" paymentBuytypeOptions" :value="scope.row.paymentBuytype" />
</template>
</el-table-column>
<el-table-column label="操作" width="350">
<template #default="scope">
<el-button size="small" icon="view" @click="handleDetail(scope.row)">查看</el-button>
</template>
</el-table-column>
</el-table>
<pagination :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</div>
<!-- 详情 -->
<DetailDialog v-model="DetailDialogVisible" :data="DetailDialogRow" :done="() => resetQuery()"></DetailDialog>
</template>
<script setup name="payment">
import { ElMessageBox } from 'element-plus'
import modal from '@/plugins/modal.js'
import { exportPayment, paymentList, delPayment } from '@/api/business/payments/payment.js'
import DetailDialog from "./components/DetailDialog.vue";
const DetailDialogVisible = ref(false);
const DetailDialogRow = ref({});
const { proxy } = getCurrentInstance()
// categoryId
const ids = ref([])
//
const single = ref(true)
//
const multiple = ref(true)
//
const showSearch = ref(true)
//
const dataList = ref([])
//
const total = ref(0)
//
const loading = ref(true)
const data = reactive({
form: {},
queryParams: {
pageNum: 1,
pageSize: 10
},
})
//
const paymentStatusOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
// (1| )
const paymentBuytypeOptions = ref([
{ dictLabel: '', dictValue: '1' },
{ dictLabel: '', dictValue: '2' },
]);
const { queryParams } = toRefs(data)
//
//
function getList() {
loading.value = true
paymentList(queryParams.value).then((res) => {
if (res.code == 200) {
loading.value = false
dataList.value = res.data.result
total.value = res.data.totalNum
}
})
}
//
function handleSelectionChange(selection) {
ids.value = selection.map((item) => item.PaymentId)
single.value = selection.length != 1
multiple.value = !selection.length
}
/** 重置查询操作 */
function resetQuery() {
proxy.resetForm('queryForm')
handleQuery()
}
/** 搜索按钮操作 */
function handleQuery() {
getList()
}
//
function handleExport() {
ElMessageBox.confirm('是否确认导出所有数据?', '警告', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
})
.then(function () {
return exportPayment(queryParams)
})
.then((response) => {
proxy.download(response.data.path)
})
}
//
function handleDetail(row) {
DetailDialogVisible.value = true
DetailDialogRow.value = row
}
handleQuery()
</script>

View File

@ -57,12 +57,12 @@
<span v-else> 中...</span>
</el-button>
</el-form-item>
<div class="other-login">
<!-- <div class="other-login">
<el-divider>{{ $t('login.otherLoginWay') }}</el-divider>
<img src="../assets/icons/gitee-fill-round.png" alt="" class="login-icon" @click="onAuth('GITEE')" />
<img src="../assets/icons/github-fill.png" alt="" class="login-icon" @click="onAuth('GITHUB')" />
<img src="../assets/icons/wechat-fill.png" alt="" class="login-icon" />
</div>
</div> -->
</el-form>
<!-- 底部 -->