diff --git a/src/api/clue/sign.js b/src/api/clue/sign.js index 48e2c36..2cc2d5f 100644 --- a/src/api/clue/sign.js +++ b/src/api/clue/sign.js @@ -51,3 +51,13 @@ export const updateProduceSort = (data) => { export const getSignProfit = (params) => { return request.get({ url: '/admin-api/crm/sign/profit', params }) } + +// 新增产品 +export const addOrderProduct = (data) => { + return request.post({ url: '/admin-api/crm/sign-prodcut/create', data }) +} + +// 新增产品 +export const removeOrderProduct = (id) => { + return request.delete({ url: '/admin-api/crm/sign-prodcut/delete?id=' + id }) +} diff --git a/src/api/school/setting/supplier.js b/src/api/school/setting/supplier.js new file mode 100644 index 0000000..483ad6f --- /dev/null +++ b/src/api/school/setting/supplier.js @@ -0,0 +1,33 @@ +import request from '@/config/axios' +// 查询列表 +export const getSupplierPage = async (params) => { + return await request.get({ url: '/admin-api/crm/erp-supplier/page', params }) +} + +export const getSupplierSimpleList = async (params) => { + return await request.get({ url: '/admin-api/crm/erp-supplier/simple-list', params }) +} + +// 查询详情 +export const getSupplier = async (id) => { + return await request.get({ url: '/admin-api/crm/erp-supplier/get?id=' + id }) +} + +// 新增 +export const createSupplier = async (data) => { + return await request.post({ + url: '/admin-api/crm/erp-supplier/create', + data: data, + isSubmitForm: true + }) +} + +// 修改 +export const updateSupplier = async (params) => { + return await request.put({ url: '/admin-api/crm/erp-supplier/update', data: params }) +} + +// 删除 +export const deleteSupplier = async (id) => { + return await request.delete({ url: '/admin-api/crm/erp-supplier/delete?id=' + id }) +} diff --git a/src/views/Clue/Order/Comp/DialogAddProduct.vue b/src/views/Clue/Order/Comp/DialogAddProduct.vue new file mode 100644 index 0000000..204c71d --- /dev/null +++ b/src/views/Clue/Order/Comp/DialogAddProduct.vue @@ -0,0 +1,130 @@ +<template> + <Dialog title="添加产品" v-model="show" width="800px"> + <el-form :model="form" ref="formRef" :rules="rules" label-width="80px"> + <el-row :gutter="20"> + <el-col :span="12" :offset="0"> + <el-form-item label="成交产品" prop="productId"> + <el-select + v-model="form.productId" + placeholder="选择成交产品" + filterable + @change="form.specsId = undefined" + > + <el-option + v-for="item in prodOptions" + :key="item.productId" + :label="item.productName" + :value="item.productId" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12" :offset="0"> + <el-form-item label="产品规格" prop="specsId"> + <el-select + v-model="form.specsId" + placeholder="选择规格" + filterable + :disabled="!form.productId" + > + <el-option + v-for="item in specsOptions(form.productId)" + :key="item.specsId" + :label="item.specsName" + :value="item.specsId" + /> + </el-select> + </el-form-item> + </el-col> + <el-col :span="12" :offset="0"> + <el-form-item label="成交数量" prop="signNum"> + <el-input-number v-model="form.signNum" :min="1" :controls="false" /> + </el-form-item> + </el-col> + <el-col :span="12" :offset="0"> + <el-form-item label="生产状态" prop="isProduced"> + <el-radio-group v-model="form.isProduced"> + <el-radio :label="0">待生产</el-radio> + <el-radio :label="1">已生产</el-radio> + </el-radio-group> + </el-form-item> + </el-col> + <el-col :span="24" :offset="0"> + <el-form-item label="备注" prop="remark"> + <el-input + type="textarea" + :autoSize="{ minRows: 3 }" + v-model="form.remark" + placeholder="请输入备注" + /> + </el-form-item> + </el-col> + </el-row> + </el-form> + <template #footer> + <span> + <el-button @click="show = false">取 消</el-button> + <el-button :disabled="formLoading" type="primary" @click="handleSave">保 存</el-button> + </span> + </template> + </Dialog> +</template> + +<script setup name="DialogProduct"> +import { addOrderProduct } from '@/api/clue/sign' + +const message = useMessage() // 消息弹窗 + +const specsOptions = computed({ + get() { + return (prodId) => { + if (prodId) { + return prodOptions.value.find((it) => it.productId == prodId).productSpecList + } + return [] + } + } +}) + +const show = ref(false) +const form = ref({}) +const rules = { + productId: { required: true, message: '成交产品不可为空', trigger: 'change' }, + specsId: { required: true, message: '产品规格不可为空', trigger: 'change' }, + signNum: { required: true, message: '成交数量不可为空', trigger: 'blur' } +} + +const prodOptions = ref([]) + +function open(signId, arr) { + prodOptions.value = arr + form.value.signId = signId + form.value.isProduced = 0 + show.value = true +} +defineExpose({ open }) + +const emit = defineEmits(['success']) +const formRef = ref() +const formLoading = ref(false) +async function handleSave() { + // 校验表单 + if (!formRef.value) return + const valid = await formRef.value.validate() + if (!valid) return + + // 提交请求 + formLoading.value = true + try { + await addOrderProduct(form.value) + message.success('新增成功!') + show.value = false + // 发送操作成功的事件 + emit('success') + } finally { + formLoading.value = false + } +} +</script> + +<style lang="scss" scoped></style> diff --git a/src/views/Clue/Order/Comp/DialogDelivery.vue b/src/views/Clue/Order/Comp/DialogDelivery.vue index 544eb9a..d4c4a6e 100644 --- a/src/views/Clue/Order/Comp/DialogDelivery.vue +++ b/src/views/Clue/Order/Comp/DialogDelivery.vue @@ -28,9 +28,9 @@ <el-select v-model="form.supplier" placeholder="选择供应商" filterable> <el-option v-for="item in supplierOptions" - :key="item.value" - :label="item.label" - :value="item.value" + :key="item.id" + :label="item.supplierName" + :value="item.id" /> </el-select> </el-form-item> @@ -141,15 +141,18 @@ import { getSimpleWarehouseList, getRemainInventoryList } from '@/api/mall/warehouse' import { createDelivery } from '@/api/clue/delivery' import { getConfigList } from '@/api/system/set' -import { getDictOptions } from '@/utils/dict' +import { getSupplierSimpleList } from '@/api/school/setting/supplier' import { getExtraFeeSimpleList } from '@/api/clue/extraFee' const message = useMessage() // 消息弹窗 const warehouseOptions = ref([]) const extraPayOptions = ref([]) -const supplierOptions = getDictOptions('erp_supplier') +const supplierOptions = ref([]) function getOptions() { + getSupplierSimpleList().then((data) => { + supplierOptions.value = data + }) getSimpleWarehouseList().then((data) => { warehouseOptions.value = data }) diff --git a/src/views/Clue/Order/Comp/MallOrderList.vue b/src/views/Clue/Order/Comp/MallOrderList.vue index 31907e2..e20a70c 100644 --- a/src/views/Clue/Order/Comp/MallOrderList.vue +++ b/src/views/Clue/Order/Comp/MallOrderList.vue @@ -147,6 +147,15 @@ > 发货 </el-button> + <el-button + type="danger" + link + style="padding: 0; margin-left: 0" + v-hasPermi="['clue:order:remove-product']" + @click="handleRemoveProduct(scope.row)" + > + 删除 + </el-button> </template> </el-table-column> </el-table> @@ -228,6 +237,16 @@ > 取消登记 </el-button> + <el-button + type="primary" + class="mr-10px" + link + style="padding: 0; margin-left: 0" + v-hasPermi="['clue:order:add-product']" + @click="handleAddProduct(scope.row)" + > + 添加产品 + </el-button> </template> </el-table-column> </SSTable> @@ -238,6 +257,7 @@ <DialogAfterSale ref="afterSaleDialog" /> <DialogExtraFee ref="extraFeeDialog" /> <DialogDelivery ref="deliveryDialog" @success="getTableList" /> + <DialogAddProduct ref="addProductDialog" @success="getTableList" /> </div> </template> @@ -252,6 +272,7 @@ import DialogFeeback from './DialogFeeback.vue' import DialogAfterSale from './DialogAfterSale.vue' import DialogExtraFee from './DialogExtraPay.vue' import DialogDelivery from './DialogDelivery.vue' +import DialogAddProduct from './DialogAddProduct.vue' import { removeNullField } from '@/utils' import { formatDate } from '@/utils/formatTime' @@ -404,6 +425,11 @@ function handleDelivery(row) { deliveryDialog.value.open(row) } +const addProductDialog = ref() +function handleAddProduct(row) { + addProductDialog.value.open(row.signId, prodOptions.value) +} + const batchIds = ref([]) function handleSelectionChange(val) { batchIds.value = val.map((it) => it.signId) @@ -460,6 +486,18 @@ function handleBatchUpdateInstall() { } } +async function handleRemoveProduct(row) { + try { + // 修改状态的二次确认 + await message.confirm(`确认要删除${row.productName}吗?`) + // 发起修改状态 + await SignApi.removeOrderProduct(row.id) + message.success('删除成功') + // 刷新列表 + getTableList() + } catch {} +} + async function handleChangeProdoce(row) { try { // 修改状态的二次确认 diff --git a/src/views/Clue/Order/Comp/MallSettle.vue b/src/views/Clue/Order/Comp/MallSettle.vue index 3117194..e6d00af 100644 --- a/src/views/Clue/Order/Comp/MallSettle.vue +++ b/src/views/Clue/Order/Comp/MallSettle.vue @@ -116,9 +116,9 @@ > <el-option v-for="item in supplierOptions" - :key="item.value" - :label="item.label" - :value="item.value" + :key="item.id" + :label="item.supplierName" + :value="item.id" /> </el-select> </el-form-item> @@ -267,7 +267,7 @@ import { getSimpleUserList as getUserOption } from '@/api/system/user' import { getSimpleProductList } from '@/api/mall/product' import * as SettleApi from '@/api/clue/settle' -import { getDictOptions } from '@/utils/dict' +import { getSupplierSimpleList } from '@/api/school/setting/supplier' import { removeNullField } from '@/utils/index' import { dateFormatter } from '@/utils/formatTime' @@ -419,9 +419,12 @@ async function handleSaveSettle() { const userOptions = ref([]) const prodOptions = ref([]) -const supplierOptions = getDictOptions('erp_supplier') +const supplierOptions = ref([]) function getOptions() { + getSupplierSimpleList().then((data) => { + supplierOptions.value = data + }) // 产品 getSimpleProductList().then((data) => { prodOptions.value = data diff --git a/src/views/Clue/Set/Comp/DialogSource.vue b/src/views/Clue/Set/Comp/DialogSource.vue index 282b3e6..9ee9ee2 100644 --- a/src/views/Clue/Set/Comp/DialogSource.vue +++ b/src/views/Clue/Set/Comp/DialogSource.vue @@ -42,9 +42,9 @@ </el-form-item> </el-col> <el-col :span="12" :offset="0"> - <el-form-item label="开户日期" prop="starendDate"> + <el-form-item label="开户日期" prop="accountStartTime"> <el-date-picker - v-model="formData.startDate" + v-model="formData.accountStartTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" @@ -53,9 +53,9 @@ </el-form-item> </el-col> <el-col :span="12" :offset="0"> - <el-form-item label="到期日期" prop="endDate"> + <el-form-item label="到期日期" prop="accountEndTime"> <el-date-picker - v-model="formData.endDate" + v-model="formData.accountEndTime" type="date" format="YYYY-MM-DD" value-format="YYYY-MM-DD" @@ -98,8 +98,9 @@ <el-table-column label="充值"> <template #default="{ row }"> <el-input-number - v-model="row.monthData[col - 1].rechargeMoney" + v-model="row.monthData[col - 1].rechargeFee" size="small" + :min="0" :controls="false" style="width: 100%" /> @@ -108,9 +109,10 @@ <el-table-column label="消耗"> <template #default="{ row }"> <el-input-number - v-model="row.monthData[col - 1].costMoney" + v-model="row.monthData[col - 1].consumeFee" size="small" :controls="false" + :min="0" style="width: 100%" /> </template> @@ -147,6 +149,7 @@ const formLoading = ref(false) // 表单的加载中:1)修改时的数据加 const formType = ref('') // 表单的类型:create - 新增;update - 修改 const formData = ref({ sourceName: '', + accountFee: undefined, sort: 1, remark: '' }) @@ -224,8 +227,8 @@ function handleAddPrice() { for (let i = 1; i <= 12; i++) { obj.monthData.push({ month: i, - costMoney: undefined, - rechargeMoney: undefined, + consumeFee: 0, + rechargeFee: 0, clueNum: 0 }) } diff --git a/src/views/MiniMall/MallSet/Comp/DialogSupplier.vue b/src/views/MiniMall/MallSet/Comp/DialogSupplier.vue index 0581691..bc31b19 100644 --- a/src/views/MiniMall/MallSet/Comp/DialogSupplier.vue +++ b/src/views/MiniMall/MallSet/Comp/DialogSupplier.vue @@ -1,5 +1,5 @@ <template> - <Dialog :title="dialogTitle" v-model="dialogVisible" width="800px"> + <Dialog :title="dialogTitle" v-model="dialogVisible" width="500px"> <el-form ref="formRef" v-loading="formLoading" @@ -7,11 +7,17 @@ :rules="formRules" label-width="80px" > - <el-form-item label="名称" prop="label"> - <el-input v-model="formData.label" placeholder="请输入供应商名称" /> + <el-form-item label="名称" prop="supplierName"> + <el-input v-model="formData.supplierName" placeholder="请输入供应商名称" /> </el-form-item> - <el-form-item label="排序" prop="sort"> - <el-input v-model="formData.sort" placeholder="请输入排序" type="number" :min="0" /> + <el-form-item label="微信群" prop="wechatGroup"> + <el-input v-model="formData.wechatGroup" placeholder="请输入微信群" /> + </el-form-item> + <el-form-item label="状态" prop="status"> + <el-radio-group v-model="formData.status"> + <el-radio :label="0"> 启用 </el-radio> + <el-radio :label="1"> 禁用 </el-radio> + </el-radio-group> </el-form-item> <el-form-item label="备注" prop="remark"> <el-input @@ -29,7 +35,7 @@ </Dialog> </template> <script name="DialogSupplier" setup> -import * as dictApi from '@/api/system/dict/dict.data' +import * as SupplierApi from '@/api/school/setting/supplier' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 @@ -38,12 +44,12 @@ const dialogTitle = ref('') // 弹窗的标题 const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用 const formType = ref('') // 表单的类型:create - 新增;update - 修改 const formData = ref({ - label: '', - sort: 1, + supplierName: '', + wechatGroup: 1, remark: '' }) const formRules = reactive({ - label: [{ required: true, message: '名称不能为空', trigger: 'blur' }] + supplierName: [{ required: true, message: '名称不能为空', trigger: 'blur' }] }) const formRef = ref() // 表单 Ref @@ -57,7 +63,7 @@ const open = async (type, id) => { if (id) { formLoading.value = true try { - formData.value = await dictApi.getDictData(id) + formData.value = await SupplierApi.getSupplier(id) } finally { formLoading.value = false } @@ -75,14 +81,11 @@ const submitForm = async () => { // 提交请求 formLoading.value = true try { - if (!formData.value.value) { - formData.value.value = formData.value.label - } if (formType.value === 'create') { - await dictApi.createDictData(formData.value) + await SupplierApi.createSupplier(formData.value) message.success(t('common.createSuccess')) } else { - await dictApi.updateDictData(formData.value) + await SupplierApi.updateSupplier(formData.value) message.success(t('common.updateSuccess')) } dialogVisible.value = false @@ -96,10 +99,9 @@ const submitForm = async () => { /** 重置表单 */ const resetForm = () => { formData.value = { - label: '', - sort: 1, + supplierName: '', + wechatGroup: '', status: 0, - dictType: 'erp_supplier', remark: '' } formRef.value?.resetFields() diff --git a/src/views/MiniMall/MallSet/Comp/SupplierSet.vue b/src/views/MiniMall/MallSet/Comp/SupplierSet.vue index 64d408a..ed11f70 100644 --- a/src/views/MiniMall/MallSet/Comp/SupplierSet.vue +++ b/src/views/MiniMall/MallSet/Comp/SupplierSet.vue @@ -3,7 +3,7 @@ <el-form ref="queryForm" :model="searchForm" label-width="0" inline> <el-form-item> <el-input - v-model="searchForm.name" + v-model="searchForm.supplierName" placeholder="请输入名称" clearable @keyup.enter="handleQuery" @@ -16,9 +16,13 @@ </el-form-item> </el-form> <el-table v-loading="loading" :data="tableList"> - <el-table-column prop="label" label="供应商名称" /> + <el-table-column prop="supplierName" label="供应商名称" /> <el-table-column prop="wechatGroup" label="微信群名称" /> - <el-table-column prop="sort" label="排序" width="100px" /> + <el-table-column label="状态" min-width="150" prop="status"> + <template #default="scope"> + <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status" /> + </template> + </el-table-column> <el-table-column prop="remark" label="备注" /> <el-table-column label="创建时间" @@ -47,16 +51,16 @@ <script setup name="SupplierSet"> import { dateFormatter } from '@/utils/formatTime' import DialogSupplier from './DialogSupplier.vue' -import * as dictApi from '@/api/system/dict/dict.data' +import * as SupplierApi from '@/api/school/setting/supplier' +import { DICT_TYPE } from '@/utils/dict' const { t } = useI18n() // 国际化 const message = useMessage() // 消息弹窗 const searchForm = ref({ - label: '', + supplierName: '', pageSize: 20, - pageNo: 1, - dictType: 'erp_supplier' + pageNo: 1 }) const total = ref(0) @@ -70,10 +74,9 @@ function handleQuery() { } function resetQuery() { searchForm.value = { - label: '', + supplierName: '', pageSize: 20, - pageNo: 1, - dictType: 'erp_supplier' + pageNo: 1 } getList() } @@ -81,7 +84,7 @@ function resetQuery() { async function getList() { loading.value = true try { - const data = await dictApi.getDictDataPage(searchForm.value) + const data = await SupplierApi.getSupplierPage(searchForm.value) tableList.value = data.list total.value = data.total } finally { @@ -98,7 +101,7 @@ async function handleDelete(id) { // 删除的二次确认 await message.delConfirm() // 发起删除 - await dictApi.deleteDictData(id) + await SupplierApi.deleteSupplier(id) message.success(t('common.delSuccess')) // 刷新列表 await getList() diff --git a/src/views/MiniMall/Purchase/index.vue b/src/views/MiniMall/Purchase/index.vue index 54916ae..4382cfc 100644 --- a/src/views/MiniMall/Purchase/index.vue +++ b/src/views/MiniMall/Purchase/index.vue @@ -37,9 +37,9 @@ <el-select v-model="queryParams.supplier" placeholder="供应商" clearable filterable> <el-option v-for="item in opts.supplier" - :key="item.value" - :label="item.label" - :value="item.value" + :key="item.id" + :label="item.supplierName" + :value="item.id" /> </el-select> </el-form-item> @@ -135,7 +135,7 @@ import { allSchemas } from './index.data.js' import DialogAdd from './Comp/DialogAdd.vue' import DialogAudit from './Comp/DialogAudit.vue' import * as PurchaseApi from '@/api/mall/purchase' -import { getDictOptions } from '@/utils/dict' +import { getSupplierSimpleList } from '@/api/school/setting/supplier' const creatPurchase = ref() const auditPurchase = ref() @@ -164,7 +164,9 @@ function getOptions() { ProductApi.getSimpleProductList().then((data) => { opts.value.product = data }) - opts.value.supplier = getDictOptions('erp_supplier') + getSupplierSimpleList().then((data) => { + opts.value.supplier = data + }) } function changeProd(val) {