Merge branch 'master' of https://codeup.aliyun.com/bsdtec/biz-pc-cloud
This commit is contained in:
commit
b714616205
10 files changed
+432
-537
No files matched your search
@@ -8,6 +8,14 @@ export function fetchList(query?: Object) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function fetchGetSelectTemplatePage(query?: Object) {
|
||||||
|
return request({
|
||||||
|
url: '/canteen/canteenProductionTemplate/getSelectTemplatePage',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
export function addObj(obj?: Object) {
|
export function addObj(obj?: Object) {
|
||||||
return request({
|
return request({
|
||||||
url: '/canteen/canteenProductionTemplate',
|
url: '/canteen/canteenProductionTemplate',
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import request from "/@/utils/request"
|
|||||||
// 获取食堂业务流水编号
|
// 获取食堂业务流水编号
|
||||||
export function getCanteenSequence(params?: { type: string | number }) {
|
export function getCanteenSequence(params?: { type: string | number }) {
|
||||||
return request({
|
return request({
|
||||||
url: "/canteen/common/getSequence",
|
url: "/canteen/canteen/common/getSequence",
|
||||||
method: "get",
|
method: "get",
|
||||||
params,
|
params,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -12,9 +12,6 @@
|
|||||||
<el-form-item label="经办人" prop="handlerUserId">
|
<el-form-item label="经办人" prop="handlerUserId">
|
||||||
<SelectHandlerUser v-model.trim="baseForm.handlerUserId" placeholder="请选择经办人" style="width: 200px" />
|
<SelectHandlerUser v-model.trim="baseForm.handlerUserId" placeholder="请选择经办人" style="width: 200px" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="商户" prop="merchantId">
|
|
||||||
<select-mch v-model="baseForm.merchantId" :apiParams="{ types: '1' }" style="width: 200px" />
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="货商" prop="supplierId">
|
<el-form-item label="货商" prop="supplierId">
|
||||||
<SelectCanteenSupplier v-model="baseForm.supplierId" style="width: 200px" />
|
<SelectCanteenSupplier v-model="baseForm.supplierId" style="width: 200px" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@@ -25,14 +22,8 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<el-row class="my-3">
|
<el-row class="my-3">
|
||||||
<el-button type="primary" plain @click="clickSelectDialog" v-auth="'canteen_canteenInventoryRecordsItem_add'">商品选择</el-button>
|
<el-button type="primary" plain @click="clickSelectDialog">食材选择</el-button>
|
||||||
<el-button
|
<el-button @click="removeSelectedRows" :disabled="state.selectedRowIds.length <= 0">删除选中</el-button>
|
||||||
@click="removeSelectedRows"
|
|
||||||
:disabled="state.selectedRowIds.length <= 0"
|
|
||||||
v-auth="'canteen_canteenInventoryRecordsItem_del'"
|
|
||||||
>
|
|
||||||
删除选中
|
|
||||||
</el-button>
|
|
||||||
<el-button type="danger" plain @click="clearData">清空数据</el-button>
|
<el-button type="danger" plain @click="clearData">清空数据</el-button>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
@@ -73,7 +64,7 @@
|
|||||||
>
|
>
|
||||||
<vxe-column type="checkbox" width="40" fixed="left" />
|
<vxe-column type="checkbox" width="40" fixed="left" />
|
||||||
<vxe-column type="seq" width="50" fixed="left" />
|
<vxe-column type="seq" width="50" fixed="left" />
|
||||||
<vxe-column field="name" title="库存商品" />
|
<vxe-column field="name" title="库存食材" />
|
||||||
<vxe-column field="stock" title="库存" />
|
<vxe-column field="stock" title="库存" />
|
||||||
<vxe-column field="unit" title="单位" />
|
<vxe-column field="unit" title="单位" />
|
||||||
<vxe-column field="quantity" title="数量" :edit-render="{ autoFocus: 'input', placeholder: '请输入' }">
|
<vxe-column field="quantity" title="数量" :edit-render="{ autoFocus: 'input', placeholder: '请输入' }">
|
||||||
@@ -94,6 +85,11 @@
|
|||||||
<el-input v-model="row.realPrice" />
|
<el-input v-model="row.realPrice" />
|
||||||
</template>
|
</template>
|
||||||
</vxe-column>
|
</vxe-column>
|
||||||
|
<vxe-column field="totalNumber" title="总数" :edit-render="{ autoFocus: 'input', placeholder: '请输入' }">
|
||||||
|
<template #edit="{ row }">
|
||||||
|
<el-input v-model="row.totalNumber" />
|
||||||
|
</template>
|
||||||
|
</vxe-column>
|
||||||
<vxe-column field="totalAmount" title="累计总金额">
|
<vxe-column field="totalAmount" title="累计总金额">
|
||||||
<template #default="{ row }">
|
<template #default="{ row }">
|
||||||
{{ (Number(row.quantity || 0) * Number(row.realPrice || 0)).toFixed(2) }}
|
{{ (Number(row.quantity || 0) * Number(row.realPrice || 0)).toFixed(2) }}
|
||||||
@@ -116,16 +112,16 @@
|
|||||||
<el-tooltip effect="dark" content="保存并返回列表页面" placement="top">
|
<el-tooltip effect="dark" content="保存并返回列表页面" placement="top">
|
||||||
<el-button type="primary" plain @click="onSave">保存</el-button>
|
<el-button type="primary" plain @click="onSave">保存</el-button>
|
||||||
</el-tooltip>
|
</el-tooltip>
|
||||||
<el-tooltip effect="dark" content="打印清单" placement="top">
|
<!-- <el-tooltip effect="dark" content="打印清单" placement="top">
|
||||||
<el-button type="success" plain @click="">打印</el-button>
|
<el-button type="success" plain @click="">打印</el-button>
|
||||||
</el-tooltip>
|
</el-tooltip> -->
|
||||||
</el-row>
|
</el-row>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts">
|
<script setup lang="ts">
|
||||||
import { ref, reactive, computed, onMounted } from "vue"
|
import { ref, reactive, onMounted } from "vue"
|
||||||
import { getObj, addObj, putObj } from "/@/api/canteen/canteenInventoryRecords"
|
import { getObj, addObj, putObj } from "/@/api/canteen/canteenInventoryRecords"
|
||||||
import { getCanteenSequence } from "/@/api/canteen/common"
|
import { getCanteenSequence } from "/@/api/canteen/common"
|
||||||
import { VxeTableEvents, VxeTablePropTypes, type VxeTableInstance } from "vxe-table"
|
import { VxeTableEvents, VxeTablePropTypes, type VxeTableInstance } from "vxe-table"
|
||||||
@@ -155,11 +151,11 @@ const baseForm = reactive<any>({
|
|||||||
inventoryCode: "",
|
inventoryCode: "",
|
||||||
inventoryDate: formatDate(new Date(), "YYYY-mm-dd"),
|
inventoryDate: formatDate(new Date(), "YYYY-mm-dd"),
|
||||||
handlerUserId: "",
|
handlerUserId: "",
|
||||||
merchantId: "",
|
|
||||||
supplierId: "",
|
supplierId: "",
|
||||||
remark: "",
|
remark: "",
|
||||||
inventoryType: "1",
|
inventoryType: "1",
|
||||||
orderType: "1",
|
orderType: "1",
|
||||||
|
totalAmount: 0,
|
||||||
})
|
})
|
||||||
const state = reactive<any>({
|
const state = reactive<any>({
|
||||||
selectDialogVisible: false, // 对话框选择开关
|
selectDialogVisible: false, // 对话框选择开关
|
||||||
@@ -173,13 +169,13 @@ const dataRules = ref({
|
|||||||
inventoryDate: [{ required: true, message: "出入库记录表单据日期不能为空", trigger: "blur" }],
|
inventoryDate: [{ required: true, message: "出入库记录表单据日期不能为空", trigger: "blur" }],
|
||||||
handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
handlerUserId: [{ required: true, message: "经办人不能为空", trigger: "blur" }],
|
||||||
supplierId: [{ required: true, message: "货商不能为空", trigger: "blur" }],
|
supplierId: [{ required: true, message: "货商不能为空", trigger: "blur" }],
|
||||||
merchantId: [{ required: true, message: "商户不能为空", trigger: "blur" }],
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// 可编辑表格校验规则
|
// 可编辑表格校验规则
|
||||||
const validRules = ref<VxeTablePropTypes.EditRules<any>>({
|
const validRules = ref<VxeTablePropTypes.EditRules<any>>({
|
||||||
quantity: [{ required: true, type: "number", min: 1, message: "必需大于等于0" }],
|
quantity: [{ required: true, type: "number", min: 1, message: "必需大于等于0" }],
|
||||||
realPrice: [{ required: true, type: "number", min: 1, message: "必填" }],
|
realPrice: [{ required: true, type: "number", min: 1, message: "必填" }],
|
||||||
|
totalNumber: [{ required: true, type: "number", min: 1, message: "必填" }],
|
||||||
})
|
})
|
||||||
|
|
||||||
// 初始化数据
|
// 初始化数据
|
||||||
@@ -187,14 +183,20 @@ const getInitData = async () => {
|
|||||||
baseForm.id = undefined
|
baseForm.id = undefined
|
||||||
const id = props.formId
|
const id = props.formId
|
||||||
if (id) {
|
if (id) {
|
||||||
// loading.value = true
|
loading.value = true
|
||||||
// // 获取清单数据
|
// 获取清单数据
|
||||||
// const [cgPlanData] = await Promise.allSettled([getObj(id)])
|
const [res] = await Promise.allSettled([getObj(id)])
|
||||||
// .then((results) => results.map((result) => (result.status === "fulfilled" ? result.value : null)))
|
.then((results) => results.map((result) => (result.status === "fulfilled" ? result.value : null)))
|
||||||
// .finally(() => (loading.value = false))
|
.finally(() => (loading.value = false))
|
||||||
// if (cgPlanData && cgPlanData.code === 0) {
|
if (res && res.code == 0) {
|
||||||
// Object.assign(baseForm, cgPlanData.data)
|
Object.assign(baseForm, res.data, { items: "" })
|
||||||
// }
|
state.itemTableForm = res.data.items.map((item: any) => ({
|
||||||
|
...item,
|
||||||
|
realPrice: displayPrice(item.realPrice, ""),
|
||||||
|
totalAmount: displayPrice(item.totalNumber, ""),
|
||||||
|
price: displayPrice(item.unitPrice, ""),
|
||||||
|
}))
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
// 获取采购入库编号
|
// 获取采购入库编号
|
||||||
@@ -205,19 +207,19 @@ const getInitData = async () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// loading.value = true
|
// loading.value = true
|
||||||
// 获取简要商品列表
|
// 获取简要食材列表
|
||||||
// const [erpSpuSimpleAll] = await Promise.allSettled([getErpSpuSimpleAll()])
|
// const [erpSpuSimpleAll] = await Promise.allSettled([getErpSpuSimpleAll()])
|
||||||
// .then((results) => results.map((result) => (result.status === "fulfilled" ? result.value : null)))
|
// .then((results) => results.map((result) => (result.status === "fulfilled" ? result.value : null)))
|
||||||
// .finally(() => (loading.value = false))
|
// .finally(() => (loading.value = false))
|
||||||
// erpSpuSimpleAll && erpSpuSimpleAll.code === 0 && (state.erpSpuSimpleAll = erpSpuSimpleAll.data)
|
// erpSpuSimpleAll && erpSpuSimpleAll.code === 0 && (state.erpSpuSimpleAll = erpSpuSimpleAll.data)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 点击商品选择
|
// 点击食材选择
|
||||||
const clickSelectDialog = () => selectDialogRef.value.openDialog()
|
const clickSelectDialog = () => selectDialogRef.value.openDialog()
|
||||||
|
|
||||||
// 获取被选择的商品行
|
// 获取被选择的食材行
|
||||||
const getSelectedRows = (selectionRows: any) => {
|
const getSelectedRows = (selectionRows: any) => {
|
||||||
console.log("被选择的商品行", selectionRows)
|
console.log("被选择的食材行", selectionRows)
|
||||||
|
|
||||||
// 筛选新勾选的项并处理
|
// 筛选新勾选的项并处理
|
||||||
const addedItems = selectionRows
|
const addedItems = selectionRows
|
||||||
@@ -253,18 +255,21 @@ const removeSelectedRows = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 整理数据
|
// 整理数据
|
||||||
const tableFormItems = state.itemTableForm.map((item: any) => {
|
const tableFormItems = () => {
|
||||||
return {
|
return state.itemTableForm.map((item: any) => {
|
||||||
// id: item.isNew ? undefined : item.id,
|
return {
|
||||||
erpMaterialId: item.erpMaterialId,
|
// id: item.isNew ? undefined : item.id,
|
||||||
quantity: item.quantity,
|
erpMaterialId: item.erpMaterialId,
|
||||||
unitPrice: item.price,
|
quantity: item.quantity,
|
||||||
realPrice: item.realPrice ? storePrice(item.realPrice) : 0,
|
unitPrice: storePrice(item.price),
|
||||||
totalAmount: (Number(item.quantity || 0) * Number(item.realPrice || 0)).toFixed(2),
|
realPrice: item.realPrice ? storePrice(item.realPrice) : 0,
|
||||||
stock: item.stock,
|
totalAmount: storePrice((Number(item.quantity || 0) * Number(item.realPrice || 0)).toFixed(2)),
|
||||||
remark: item.remark,
|
stock: item.stock,
|
||||||
}
|
remark: item.remark,
|
||||||
})
|
totalNumber: item.totalNumber,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// 点击继续添加
|
// 点击继续添加
|
||||||
const onContinueAdd = async () => {
|
const onContinueAdd = async () => {
|
||||||
@@ -285,7 +290,7 @@ const baseFormValidate = async () => {
|
|||||||
// 校验可编辑表格 成功返回 true 失败返回 false
|
// 校验可编辑表格 成功返回 true 失败返回 false
|
||||||
const itemTableFormValidate = async () => {
|
const itemTableFormValidate = async () => {
|
||||||
if (state.itemTableForm.length <= 0) {
|
if (state.itemTableForm.length <= 0) {
|
||||||
useMessage().warning("请选择商品")
|
useMessage().warning("请选择食材")
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -305,16 +310,16 @@ const itemTableFormValidate = async () => {
|
|||||||
|
|
||||||
// 提交数据 成功返回 true 失败返回 false
|
// 提交数据 成功返回 true 失败返回 false
|
||||||
const submitData = async () => {
|
const submitData = async () => {
|
||||||
|
const canteenInventoryRecordsItemDTOS = tableFormItems()
|
||||||
|
const _pa = {
|
||||||
|
...baseForm,
|
||||||
|
totalAmount: canteenInventoryRecordsItemDTOS.reduce((acc: number, cur: any) => acc + Number(cur.totalAmount), 0),
|
||||||
|
canteenInventoryRecordsItemDTOS,
|
||||||
|
}
|
||||||
|
console.log("提交的数据:", _pa)
|
||||||
|
|
||||||
try {
|
try {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
|
|
||||||
const _pa = {
|
|
||||||
...baseForm,
|
|
||||||
items: tableFormItems(),
|
|
||||||
}
|
|
||||||
|
|
||||||
console.log("提交的数据:", _pa)
|
|
||||||
|
|
||||||
const res = baseForm.id ? await putObj(_pa) : await addObj(_pa)
|
const res = baseForm.id ? await putObj(_pa) : await addObj(_pa)
|
||||||
if (res.code == 0) {
|
if (res.code == 0) {
|
||||||
useMessage().success(baseForm.id ? "修改成功" : "添加成功")
|
useMessage().success(baseForm.id ? "修改成功" : "添加成功")
|
||||||
|
|||||||
@@ -1,112 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible" :close-on-click-modal="false" draggable>
|
|
||||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="部门id" prop="deptId">
|
|
||||||
<el-input v-model="form.deptId" placeholder="请输入部门id" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="收款金额" prop="receiveAmount">
|
|
||||||
<el-input v-model="form.receiveAmount" placeholder="请输入收款金额" />
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
</el-form>
|
|
||||||
</el-dialog>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts" name="CanteenInventoryRecordsDialog">
|
|
||||||
import { useDict } from "/@/hooks/dict"
|
|
||||||
import { useMessage } from "/@/hooks/message"
|
|
||||||
const emit = defineEmits(["refresh"])
|
|
||||||
|
|
||||||
// 定义变量内容
|
|
||||||
const dataFormRef = ref()
|
|
||||||
const visible = ref(false)
|
|
||||||
const loading = ref(false)
|
|
||||||
// 定义字典
|
|
||||||
const { canteen_inventory_type } = useDict("canteen_inventory_type")
|
|
||||||
|
|
||||||
// 提交表单数据
|
|
||||||
const form = reactive({
|
|
||||||
id: "",
|
|
||||||
inventoryCode: "",
|
|
||||||
inventoryDate: "",
|
|
||||||
inventoryType: "",
|
|
||||||
linkCode: "",
|
|
||||||
handlerUserId: "",
|
|
||||||
checkStatus: "",
|
|
||||||
checkUserId: "",
|
|
||||||
checkTime: "",
|
|
||||||
merchantId: "",
|
|
||||||
deptId: "",
|
|
||||||
supplierId: "",
|
|
||||||
remark: "",
|
|
||||||
orderType: "",
|
|
||||||
totalAmount: "",
|
|
||||||
receiveAmount: "",
|
|
||||||
processInstanceId: "",
|
|
||||||
checkReason: "",
|
|
||||||
})
|
|
||||||
|
|
||||||
// 定义校验规则
|
|
||||||
const dataRules = ref({
|
|
||||||
inventoryCode: [{ required: true, message: "单据编号(规则生成,出入库编号)不能为空", trigger: "blur" }],
|
|
||||||
inventoryDate: [{ required: true, message: "单据日期不能为空", trigger: "blur" }],
|
|
||||||
inventoryType: [{ required: true, message: "单据类型(字典inventory_type)采购入库不能为空", trigger: "blur" }],
|
|
||||||
})
|
|
||||||
|
|
||||||
// 打开弹窗
|
|
||||||
const openDialog = (id: string) => {
|
|
||||||
visible.value = true
|
|
||||||
form.id = ""
|
|
||||||
|
|
||||||
// 重置表单数据
|
|
||||||
nextTick(() => {
|
|
||||||
dataFormRef.value?.resetFields()
|
|
||||||
})
|
|
||||||
|
|
||||||
// 获取canteenInventoryRecords信息
|
|
||||||
if (id) {
|
|
||||||
form.id = id
|
|
||||||
getcanteenInventoryRecordsData(id)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 提交
|
|
||||||
const onSubmit = async () => {
|
|
||||||
const valid = await dataFormRef.value.validate().catch(() => {})
|
|
||||||
if (!valid) return false
|
|
||||||
|
|
||||||
try {
|
|
||||||
loading.value = true
|
|
||||||
form.id ? await putObj(form) : await addObj(form)
|
|
||||||
useMessage().success(form.id ? "修改成功" : "添加成功")
|
|
||||||
visible.value = false
|
|
||||||
emit("refresh")
|
|
||||||
} catch (err: any) {
|
|
||||||
useMessage().error(err.msg)
|
|
||||||
} finally {
|
|
||||||
loading.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 初始化表单数据
|
|
||||||
const getcanteenInventoryRecordsData = (id: string) => {
|
|
||||||
// 获取数据
|
|
||||||
loading.value = true
|
|
||||||
getObj(id)
|
|
||||||
.then((res: any) => {
|
|
||||||
Object.assign(form, res.data)
|
|
||||||
})
|
|
||||||
.finally(() => {
|
|
||||||
loading.value = false
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// 暴露变量
|
|
||||||
defineExpose({
|
|
||||||
openDialog,
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
@@ -60,23 +60,16 @@
|
|||||||
<el-table-column type="index" label="#" width="50" />
|
<el-table-column type="index" label="#" width="50" />
|
||||||
<el-table-column prop="inventoryCode" label="单据编号" show-overflow-tooltip />
|
<el-table-column prop="inventoryCode" label="单据编号" show-overflow-tooltip />
|
||||||
<el-table-column prop="inventoryDate" label="单据日期" show-overflow-tooltip />
|
<el-table-column prop="inventoryDate" label="单据日期" show-overflow-tooltip />
|
||||||
<el-table-column prop="inventoryType" label="单据类型(字典inventory_type)采购入库" show-overflow-tooltip>
|
<el-table-column prop="productName" label="商品" show-overflow-tooltip />
|
||||||
<template #default="scope">
|
<el-table-column prop="handlerUserName" label="经办人" show-overflow-tooltip />
|
||||||
<dict-tag :options="canteen_inventory_type" :value="scope.row.inventoryType"></dict-tag>
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column prop="linkCode" label="来源ID(根据类型指向对应的表,如采购单ID、退货单ID等)" show-overflow-tooltip />
|
|
||||||
<el-table-column prop="handlerUserId" label="经办人id" show-overflow-tooltip />
|
|
||||||
<!-- <el-table-column prop="checkStatus" label="审批状态" show-overflow-tooltip /> -->
|
<!-- <el-table-column prop="checkStatus" label="审批状态" show-overflow-tooltip /> -->
|
||||||
<!-- <el-table-column prop="checkUserId" label="审批人id" show-overflow-tooltip /> -->
|
<!-- <el-table-column prop="checkUserId" label="审批人id" show-overflow-tooltip /> -->
|
||||||
<!-- <el-table-column prop="checkTime" label="审核日期" show-overflow-tooltip /> -->
|
<!-- <el-table-column prop="checkTime" label="审核日期" show-overflow-tooltip /> -->
|
||||||
<el-table-column prop="merchantId" label="商户编号" show-overflow-tooltip />
|
|
||||||
<el-table-column prop="deptId" label="部门id" show-overflow-tooltip />
|
|
||||||
<el-table-column prop="supplierId" label="货商" show-overflow-tooltip />
|
<el-table-column prop="supplierId" label="货商" show-overflow-tooltip />
|
||||||
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
|
<el-table-column prop="remark" label="备注" show-overflow-tooltip />
|
||||||
<el-table-column prop="orderType" label="订单类型(1入库 2出库)" show-overflow-tooltip />
|
<el-table-column prop="totalAmount" label="入库总金额" show-overflow-tooltip>
|
||||||
<el-table-column prop="totalAmount" label="入库总金额" show-overflow-tooltip />
|
<template #default="{ row }">{{ displayPrice(row.totalAmount) }}</template>
|
||||||
<el-table-column prop="receiveAmount" label="收款金额" show-overflow-tooltip />
|
</el-table-column>
|
||||||
<!-- <el-table-column prop="checkReason" label="审核原因" show-overflow-tooltip /> -->
|
<!-- <el-table-column prop="checkReason" label="审核原因" show-overflow-tooltip /> -->
|
||||||
<el-table-column label="操作" width="150">
|
<el-table-column label="操作" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
@@ -106,10 +99,9 @@
|
|||||||
import { BasicTableProps, useTable } from "/@/hooks/table"
|
import { BasicTableProps, useTable } from "/@/hooks/table"
|
||||||
import { fetchList, delObjs } from "/@/api/canteen/canteenInventoryRecords"
|
import { fetchList, delObjs } from "/@/api/canteen/canteenInventoryRecords"
|
||||||
import { useMessage, useMessageBox } from "/@/hooks/message"
|
import { useMessage, useMessageBox } from "/@/hooks/message"
|
||||||
import { useDict } from "/@/hooks/dict"
|
import { displayPrice } from "/@/utils/formatMoney"
|
||||||
|
|
||||||
const CtForm = defineAsyncComponent(() => import("./form.vue"))
|
const CtForm = defineAsyncComponent(() => import("./form.vue"))
|
||||||
const { canteen_inventory_type } = useDict("canteen_inventory_type")
|
|
||||||
|
|
||||||
const queryRef = ref()
|
const queryRef = ref()
|
||||||
const showSearch = ref(true)
|
const showSearch = ref(true)
|
||||||
@@ -122,7 +114,7 @@ const formState = reactive<{ formId: string | undefined; showForm: boolean }>({
|
|||||||
|
|
||||||
const state: BasicTableProps = reactive<BasicTableProps>({
|
const state: BasicTableProps = reactive<BasicTableProps>({
|
||||||
queryForm: {
|
queryForm: {
|
||||||
inventoryType: "3",
|
inventoryType: "1",
|
||||||
},
|
},
|
||||||
pageList: fetchList,
|
pageList: fetchList,
|
||||||
})
|
})
|
||||||
@@ -157,7 +149,8 @@ const create = () => {
|
|||||||
|
|
||||||
// 点击编辑
|
// 点击编辑
|
||||||
const edit = (row: any) => {
|
const edit = (row: any) => {
|
||||||
row.id ? (formState.formId = row.id) : useMessage().warning("清单id不存在")
|
if (!row.id) return useMessage().warning("清单id不存在")
|
||||||
|
formState.formId = row.id
|
||||||
formState.showForm = true
|
formState.showForm = true
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -182,6 +175,6 @@ const handleDelete = async (ids: string[]) => {
|
|||||||
const formClose = () => {
|
const formClose = () => {
|
||||||
formState.showForm = false
|
formState.showForm = false
|
||||||
formState.formId = undefined
|
formState.formId = undefined
|
||||||
fetchList()
|
getDataList()
|
||||||
}
|
}
|
||||||
</script>
|
</script>
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog v-model="dialogVisible" title="选择商品" width="80%" :close-on-click-modal="false" draggable @close="dialogVisible = false">
|
<el-dialog v-model="dialogVisible" title="选择食材" width="80%" :close-on-click-modal="false" draggable @close="dialogVisible = false">
|
||||||
<el-row>
|
<el-row>
|
||||||
<el-form :model="queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataListAndSelect">
|
<el-form :model="queryForm" ref="queryRef" :inline="true" @keyup.enter="getDataListAndSelect">
|
||||||
<el-form-item label="商品名称" prop="name">
|
<el-form-item label="食材名称" prop="name">
|
||||||
<el-input placeholder="请输入商品名称" v-model="queryForm.name" />
|
<el-input placeholder="请输入食材名称" v-model="queryForm.name" />
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button icon="search" type="primary" @click="getDataListAndSelect">查询</el-button>
|
<el-button icon="search" type="primary" @click="getDataListAndSelect">查询</el-button>
|
||||||
@@ -12,8 +12,8 @@
|
|||||||
</el-form>
|
</el-form>
|
||||||
</el-row>
|
</el-row>
|
||||||
<el-table
|
<el-table
|
||||||
ref="spuMultipleTableRef"
|
ref="tableRef"
|
||||||
:data="spuDataList"
|
:data="dataList"
|
||||||
v-loading="loading"
|
v-loading="loading"
|
||||||
:row-key="(row:any) => row.id"
|
:row-key="(row:any) => row.id"
|
||||||
:reserve-selection="true"
|
:reserve-selection="true"
|
||||||
@@ -22,7 +22,7 @@
|
|||||||
>
|
>
|
||||||
<el-table-column type="selection" width="40" fixed="left" align="center" />
|
<el-table-column type="selection" width="40" fixed="left" align="center" />
|
||||||
<el-table-column type="index" label="#" width="50" fixed="left" align="center" />
|
<el-table-column type="index" label="#" width="50" fixed="left" align="center" />
|
||||||
<el-table-column prop="name" label="商品名称" min-width="150px" align="center" show-overflow-tooltip />
|
<el-table-column prop="name" label="食材名称" min-width="150px" align="center" show-overflow-tooltip />
|
||||||
<el-table-column prop="unit" label="单位" min-width="100px" align="center" show-overflow-tooltip />
|
<el-table-column prop="unit" label="单位" min-width="100px" align="center" show-overflow-tooltip />
|
||||||
<el-table-column prop="stock" label="库存" min-width="80px" align="center" show-overflow-tooltip />
|
<el-table-column prop="stock" label="库存" min-width="80px" align="center" show-overflow-tooltip />
|
||||||
</el-table>
|
</el-table>
|
||||||
@@ -57,13 +57,13 @@ const props = withDefaults(
|
|||||||
)
|
)
|
||||||
|
|
||||||
const queryRef = ref()
|
const queryRef = ref()
|
||||||
const spuMultipleTableRef = ref() // 对话框多选表格ref
|
const tableRef = ref() // 对话框多选表格ref
|
||||||
const loading = ref(false) // 对话框多选表格loading
|
const loading = ref(false) // 对话框多选表格loading
|
||||||
const queryForm = reactive<any>({
|
const queryForm = reactive<any>({
|
||||||
name: "",
|
name: "",
|
||||||
})
|
})
|
||||||
const total = ref<number>(0)
|
const total = ref<number>(0)
|
||||||
const spuDataList = ref<any[]>([]) // 对话框多选表格数据
|
const dataList = ref<any[]>([]) // 对话框多选表格数据
|
||||||
|
|
||||||
// 打开弹窗
|
// 打开弹窗
|
||||||
const openDialog = () => {
|
const openDialog = () => {
|
||||||
@@ -71,36 +71,30 @@ const openDialog = () => {
|
|||||||
getDataListAndSelect()
|
getDataListAndSelect()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 获取商品数据并且勾选
|
// 获取食材数据并且勾选
|
||||||
const getDataListAndSelect = async () => {
|
const getDataListAndSelect = async () => {
|
||||||
loading.value = true
|
loading.value = true
|
||||||
try {
|
try {
|
||||||
const { code, data } = await fetchErpMaterialPageList(queryForm).finally(() => (loading.value = false))
|
const { code, data } = await fetchErpMaterialPageList(queryForm)
|
||||||
if (code === 0) {
|
if (code == 0) {
|
||||||
spuDataList.value = data.records.map((item: any) => ({ ...item, erpMaterialId: item.id }))
|
dataList.value = data.records.map((item: any) => ({ ...item, erpMaterialId: item.id }))
|
||||||
total.value = data.total
|
total.value = data.total
|
||||||
|
|
||||||
// 保存当前已选中的行
|
|
||||||
// const currentSelectedRows = spuMultipleTableRef.value?.getSelectionRows() || []
|
|
||||||
// 清空表格数据后重新设置
|
|
||||||
nextTick(() => {
|
nextTick(() => {
|
||||||
// 合并当前页面数据中的已选行和之前保存的已选行
|
|
||||||
const rowsToSelect = [
|
const rowsToSelect = [
|
||||||
// ...currentSelectedRows,
|
...props.selectedRows.filter((row) => dataList.value.some((item) => item.erpMaterialId === row.erpMaterialId)),
|
||||||
...props.selectedRows.filter((row) => spuDataList.value.some((item) => item.erpMaterialId === row.erpMaterialId)),
|
|
||||||
]
|
]
|
||||||
// 去重
|
// 去重
|
||||||
const uniqueRowsToSelect = Array.from(new Map(rowsToSelect.map((row) => [row.erpMaterialId, row])).values())
|
const uniqueRowsToSelect = Array.from(new Map(rowsToSelect.map((row) => [row.erpMaterialId, row])).values())
|
||||||
// 为匹配的行设置选中状态
|
// 为匹配的行设置选中状态
|
||||||
uniqueRowsToSelect.forEach((row) => {
|
uniqueRowsToSelect.forEach((row) => {
|
||||||
const targetRow = spuDataList.value.find((item) => item.erpMaterialId === row.erpMaterialId)
|
const targetRow = dataList.value.find((item) => item.erpMaterialId === row.erpMaterialId)
|
||||||
targetRow && spuMultipleTableRef.value?.toggleRowSelection(targetRow, true)
|
targetRow && tableRef.value?.toggleRowSelection(targetRow, true)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
spuDataList.value = []
|
dataList.value = []
|
||||||
loading.value = false
|
|
||||||
} finally {
|
} finally {
|
||||||
loading.value = false
|
loading.value = false
|
||||||
}
|
}
|
||||||
@@ -121,21 +115,21 @@ const resetQuery = () => {
|
|||||||
getDataListAndSelect()
|
getDataListAndSelect()
|
||||||
}
|
}
|
||||||
|
|
||||||
// 点击商品列表表格行
|
// 点击食材列表表格行
|
||||||
const rowClick = (row: any) => {
|
const rowClick = (row: any) => {
|
||||||
spuMultipleTableRef.value.toggleRowSelection(row)
|
tableRef.value.toggleRowSelection(row)
|
||||||
}
|
}
|
||||||
|
|
||||||
// 商品选择对话框确认
|
// 食材选择对话框确认
|
||||||
const dialogConfirm = () => {
|
const dialogConfirm = () => {
|
||||||
const $table = spuMultipleTableRef.value
|
const $table = tableRef.value
|
||||||
if ($table) {
|
if ($table) {
|
||||||
// 获取所有选中的行,包括其他页面的选择
|
// 获取所有选中的行,包括其他页面的选择
|
||||||
const currentSelectedRows = $table.getSelectionRows()
|
const currentSelectedRows = $table.getSelectionRows()
|
||||||
// 合并当前选中的行和之前已选的行(排除当前页面的行)
|
// 合并当前选中的行和之前已选的行(排除当前页面的行)
|
||||||
const allSelectedRows = [
|
const allSelectedRows = [
|
||||||
...currentSelectedRows,
|
...currentSelectedRows,
|
||||||
...props.selectedRows.filter((row) => !spuDataList.value.some((item) => item.erpMaterialId === row.erpMaterialId)),
|
...props.selectedRows.filter((row) => !dataList.value.some((item) => item.erpMaterialId === row.erpMaterialId)),
|
||||||
]
|
]
|
||||||
// 去重
|
// 去重
|
||||||
const uniqueSelectedRows = Array.from(new Map(allSelectedRows.map((row) => [row.erpMaterialId, row])).values())
|
const uniqueSelectedRows = Array.from(new Map(allSelectedRows.map((row) => [row.erpMaterialId, row])).values())
|
||||||
|
|||||||
@@ -1,209 +0,0 @@
|
|||||||
<template>
|
|
||||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible"
|
|
||||||
:close-on-click-modal="false" draggable>
|
|
||||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
|
||||||
<el-row :gutter="24">
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="单据类型(字典inventory_type)" prop="inventoryType">
|
|
||||||
<el-input v-model="form.inventoryType" placeholder="请输入单据类型(字典inventory_type)"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="原料id" prop="erpMaterialId">
|
|
||||||
<el-input v-model="form.erpMaterialId" placeholder="请输入原料id"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="商户编号" prop="merchantId">
|
|
||||||
<el-input v-model="form.merchantId" placeholder="请输入商户编号"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="部门id" prop="deptId">
|
|
||||||
<el-input v-model="form.deptId" placeholder="请输入部门id"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="出入库数量" prop="quantity">
|
|
||||||
<el-input v-model="form.quantity" placeholder="请输入出入库数量"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="单价" prop="unitPrice">
|
|
||||||
<el-input v-model="form.unitPrice" placeholder="请输入单价"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="总金额" prop="totalAmount">
|
|
||||||
<el-input v-model="form.totalAmount" placeholder="请输入总金额"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="税率%" prop="taxRate">
|
|
||||||
<el-input v-model="form.taxRate" placeholder="请输入税率%"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="税前金额" prop="taxAmount">
|
|
||||||
<el-input v-model="form.taxAmount" placeholder="请输入税前金额"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="货商" prop="supplierId">
|
|
||||||
<el-input v-model="form.supplierId" placeholder="请输入货商"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="备注" prop="remark">
|
|
||||||
<el-input v-model="form.remark" placeholder="请输入备注"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="订单类型(1入库 2出库)" prop="orderType">
|
|
||||||
<el-input v-model="form.orderType" placeholder="请输入订单类型(1入库 2出库)"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="出入库关联id" prop="inventoryId">
|
|
||||||
<el-input v-model="form.inventoryId" placeholder="请输入出入库关联id"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="总数" prop="totalNumber">
|
|
||||||
<el-input v-model="form.totalNumber" placeholder="请输入总数"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="账面数量" prop="accountNumber">
|
|
||||||
<el-input v-model="form.accountNumber" placeholder="请输入账面数量"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="实际数量" prop="realNumber">
|
|
||||||
<el-input v-model="form.realNumber" placeholder="请输入实际数量"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
|
||||||
<el-form-item label="实际单价" prop="realPrice">
|
|
||||||
<el-input v-model="form.realPrice" placeholder="请输入实际单价"/>
|
|
||||||
</el-form-item>
|
|
||||||
</el-col>
|
|
||||||
|
|
||||||
</el-row>
|
|
||||||
</el-form>
|
|
||||||
<template #footer>
|
|
||||||
<span class="dialog-footer">
|
|
||||||
<el-button @click="visible = false">取消</el-button>
|
|
||||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-dialog>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<script setup lang="ts" name="CanteenInventoryRecordsItemDialog">
|
|
||||||
import { useDict } from '/@/hooks/dict';
|
|
||||||
import { useMessage } from "/@/hooks/message";
|
|
||||||
import { getObj, addObj, putObj } from '/@/api/canteen/canteenInventoryRecordsItem'
|
|
||||||
import { rule } from '/@/utils/validate';
|
|
||||||
const emit = defineEmits(['refresh']);
|
|
||||||
|
|
||||||
// 定义变量内容
|
|
||||||
const dataFormRef = ref();
|
|
||||||
const visible = ref(false)
|
|
||||||
const loading = ref(false)
|
|
||||||
// 定义字典
|
|
||||||
|
|
||||||
// 提交表单数据
|
|
||||||
const form = reactive({
|
|
||||||
id:'',
|
|
||||||
inventoryType: '',
|
|
||||||
erpMaterialId: '',
|
|
||||||
merchantId: '',
|
|
||||||
deptId: '',
|
|
||||||
quantity: '',
|
|
||||||
unitPrice: '',
|
|
||||||
totalAmount: '',
|
|
||||||
taxRate: '',
|
|
||||||
taxAmount: '',
|
|
||||||
supplierId: '',
|
|
||||||
remark: '',
|
|
||||||
orderType: '',
|
|
||||||
inventoryId: '',
|
|
||||||
totalNumber: '',
|
|
||||||
accountNumber: '',
|
|
||||||
realNumber: '',
|
|
||||||
realPrice: '',
|
|
||||||
});
|
|
||||||
|
|
||||||
// 定义校验规则
|
|
||||||
const dataRules = ref({
|
|
||||||
})
|
|
||||||
|
|
||||||
// 打开弹窗
|
|
||||||
const openDialog = (id: string) => {
|
|
||||||
visible.value = true
|
|
||||||
form.id = ''
|
|
||||||
|
|
||||||
// 重置表单数据
|
|
||||||
nextTick(() => {
|
|
||||||
dataFormRef.value?.resetFields();
|
|
||||||
});
|
|
||||||
|
|
||||||
// 获取canteenInventoryRecordsItem信息
|
|
||||||
if (id) {
|
|
||||||
form.id = id
|
|
||||||
getcanteenInventoryRecordsItemData(id)
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// 提交
|
|
||||||
const onSubmit = async () => {
|
|
||||||
const valid = await dataFormRef.value.validate().catch(() => {});
|
|
||||||
if (!valid) return false;
|
|
||||||
|
|
||||||
try {
|
|
||||||
loading.value = true;
|
|
||||||
form.id ? await putObj(form) : await addObj(form);
|
|
||||||
useMessage().success(form.id ? '修改成功' : '添加成功');
|
|
||||||
visible.value = false;
|
|
||||||
emit('refresh');
|
|
||||||
} catch (err: any) {
|
|
||||||
useMessage().error(err.msg);
|
|
||||||
} finally {
|
|
||||||
loading.value = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 初始化表单数据
|
|
||||||
const getcanteenInventoryRecordsItemData = (id: string) => {
|
|
||||||
// 获取数据
|
|
||||||
loading.value = true
|
|
||||||
getObj(id).then((res: any) => {
|
|
||||||
Object.assign(form, res.data)
|
|
||||||
}).finally(() => {
|
|
||||||
loading.value = false
|
|
||||||
})
|
|
||||||
};
|
|
||||||
|
|
||||||
// 暴露变量
|
|
||||||
defineExpose({
|
|
||||||
openDialog
|
|
||||||
});
|
|
||||||
</script>
|
|
||||||
@@ -1,134 +1,359 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-dialog :title="form.id ? '编辑' : '新增'" v-model="visible"
|
<el-dialog
|
||||||
:close-on-click-modal="false" draggable>
|
:title="form.id ? '编辑生产记录' : '新增生产记录'"
|
||||||
<el-form ref="dataFormRef" :model="form" :rules="dataRules" formDialogRef label-width="90px" v-loading="loading">
|
v-model="visible"
|
||||||
<el-row :gutter="24">
|
width="1300px"
|
||||||
<el-col :span="12" class="mb20">
|
:close-on-click-modal="false"
|
||||||
<el-form-item label="加工日期" prop="productionTime">
|
draggable
|
||||||
<el-input v-model="form.productionTime" placeholder="请输入加工日期"/>
|
>
|
||||||
</el-form-item>
|
<el-form
|
||||||
</el-col>
|
ref="formRef"
|
||||||
|
:model="form"
|
||||||
|
:rules="rules"
|
||||||
|
label-width="120px"
|
||||||
|
v-loading="loading"
|
||||||
|
>
|
||||||
|
<!-- 主表信息 -->
|
||||||
|
<el-row :gutter="24">
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item label="加工日期" prop="productionTime">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="form.productionTime"
|
||||||
|
type="date"
|
||||||
|
placeholder="选择日期"
|
||||||
|
format="YYYY-MM-DD"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
:disabled-date="disabledDate"
|
||||||
|
class="w-full"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item label="加工人" prop="handlerUser">
|
||||||
|
<el-input v-model="form.handlerUser" placeholder="请输入加工人"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item label="加工批次" prop="recordCode">
|
||||||
|
<el-input v-model="form.recordCode" placeholder="请输入加工批次"/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12" class="mb20">
|
||||||
|
<el-form-item label="生产模板">
|
||||||
|
<div style="display: flex; align-items: center;">
|
||||||
|
<el-button @click="openTemplateDialog">选择生产模板</el-button>
|
||||||
|
<span v-if="selectedTemplates.length" style="margin-left: 12px;">
|
||||||
|
已选{{ selectedTemplates.length }}个模板
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
<!-- 子表信息 -->
|
||||||
<el-form-item label="加工人" prop="handlerUser">
|
<el-form-item label="生产详情" style="margin-top: 16px;">
|
||||||
<el-input v-model="form.handlerUser" placeholder="请输入加工人"/>
|
<el-table
|
||||||
|
:data="form.productionDetailList"
|
||||||
|
border
|
||||||
|
:span-method="spanMethod"
|
||||||
|
style="width: 100%"
|
||||||
|
>
|
||||||
|
<el-table-column prop="dishName" label="菜品名称" width="180" />
|
||||||
|
<el-table-column label="生成数量" width="120">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-input-number
|
||||||
|
v-model="row.produceQuantity"
|
||||||
|
:min="1"
|
||||||
|
:precision="0"
|
||||||
|
@change="updateProduceQuantity(row)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column prop="materialName" label="食材名称" width="180" />
|
||||||
|
<el-table-column prop="materialUnit" label="单位" width="80" />
|
||||||
|
<el-table-column prop="baseUsage" label="基准用量" width="120" />
|
||||||
|
<el-table-column prop="lossRate" label="损耗率" width="120">
|
||||||
|
<template #default="{ row }">{{ row.lossRate }}%</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="实际用量" width="180">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-input-number
|
||||||
|
v-model="row.actualUsage"
|
||||||
|
:min="0"
|
||||||
|
:precision="2"
|
||||||
|
@change="calculateActualOutput(row)"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="实际产出" width="180">
|
||||||
|
<template #default="{ row }">
|
||||||
|
<el-input-number
|
||||||
|
v-model="row.actualOutput"
|
||||||
|
:min="0"
|
||||||
|
:precision="2"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
</el-table>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-col>
|
</el-form>
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
<template #footer>
|
||||||
<el-form-item label="主id" prop="recordId">
|
<el-button @click="visible = false">取 消</el-button>
|
||||||
<el-input v-model="form.recordId" placeholder="请输入主id"/>
|
<el-button type="primary" @click="submitForm" :loading="loading">确 定</el-button>
|
||||||
</el-form-item>
|
</template>
|
||||||
</el-col>
|
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
<!-- 生产模板选择弹窗 -->
|
||||||
<el-form-item label="加工批次号" prop="recordCode">
|
<el-dialog
|
||||||
<el-input v-model="form.recordCode" placeholder="请输入加工批次号"/>
|
v-model="templateDialogVisible"
|
||||||
</el-form-item>
|
title="选择生产模板"
|
||||||
</el-col>
|
width="800px"
|
||||||
|
append-to-body
|
||||||
|
:close-on-click-modal="false"
|
||||||
|
>
|
||||||
|
<div class="h-[500px] flex flex-col">
|
||||||
|
<el-form :inline="true" class="mb-4">
|
||||||
|
<el-form-item>
|
||||||
|
<el-input
|
||||||
|
v-model="templateQuery.templateName"
|
||||||
|
placeholder="模板名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="searchTemplate"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item>
|
||||||
|
<el-button type="primary" @click="searchTemplate">搜索</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
<div class="flex-1 overflow-auto">
|
||||||
<el-form-item label="备注" prop="remark">
|
<el-table
|
||||||
<el-input v-model="form.remark" placeholder="请输入备注"/>
|
ref="templateTable"
|
||||||
</el-form-item>
|
:data="templateList"
|
||||||
</el-col>
|
border
|
||||||
|
@selection-change="handleSelectionChange"
|
||||||
|
height="100%"
|
||||||
|
>
|
||||||
|
<el-table-column type="selection" width="55" />
|
||||||
|
<el-table-column prop="templateName" label="模板名称" />
|
||||||
|
<el-table-column prop="dishName" label="菜品名称" />
|
||||||
|
<el-table-column prop="baseOutput" label="基准产出量" />
|
||||||
|
</el-table>
|
||||||
|
</div>
|
||||||
|
|
||||||
<el-col :span="12" class="mb20">
|
<div class="mt-4">
|
||||||
<el-form-item label="部门id" prop="deptId">
|
<pagination
|
||||||
<el-input v-model="form.deptId" placeholder="请输入部门id"/>
|
v-model:current-page="templateQuery.current"
|
||||||
</el-form-item>
|
v-model:page-size="templateQuery.size"
|
||||||
</el-col>
|
:total="templateTotal"
|
||||||
|
@size-change="val => { templateQuery.size = val; templateQuery.current = 1; searchTemplate() }"
|
||||||
|
@current-change="val => { templateQuery.current = val; searchTemplate() }"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
</el-row>
|
<div class="dialog-footer" style="margin-top: 20px;">
|
||||||
</el-form>
|
<el-button @click="templateDialogVisible = false">取消</el-button>
|
||||||
<template #footer>
|
<el-button type="primary" @click="confirmTemplateSelection">确定</el-button>
|
||||||
<span class="dialog-footer">
|
</div>
|
||||||
<el-button @click="visible = false">取消</el-button>
|
</div>
|
||||||
<el-button type="primary" @click="onSubmit" :disabled="loading">确认</el-button>
|
|
||||||
</span>
|
|
||||||
</template>
|
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
</el-dialog>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup lang="ts" name="CanteenProductionRecordDialog">
|
<script setup lang="ts">
|
||||||
import { useDict } from '/@/hooks/dict';
|
import { ref, reactive } from 'vue'
|
||||||
import { useMessage } from "/@/hooks/message";
|
import type { FormInstance } from 'element-plus'
|
||||||
import { getObj, addObj, putObj } from '/@/api/canteen/canteenProductionRecord'
|
import { useMessage } from "/@/hooks/message"
|
||||||
import { rule } from '/@/utils/validate';
|
import { fetchGetSelectTemplatePage } from "/@/api/canteen/canteenProductionTemplate"
|
||||||
const emit = defineEmits(['refresh']);
|
import { addObj, putObj } from "/@/api/canteen/canteenProductionRecord"
|
||||||
|
import Pagination from '/@/components/Pagination/index.vue'
|
||||||
|
|
||||||
// 定义变量内容
|
|
||||||
const dataFormRef = ref();
|
|
||||||
const visible = ref(false)
|
const visible = ref(false)
|
||||||
const loading = ref(false)
|
const loading = ref(false)
|
||||||
// 定义字典
|
const formRef = ref<FormInstance>()
|
||||||
|
const selectedTemplates = ref<any[]>([])
|
||||||
|
|
||||||
// 提交表单数据
|
// 生产模板选择相关
|
||||||
const form = reactive({
|
const templateDialogVisible = ref(false)
|
||||||
id:'',
|
const templateList = ref<any[]>([])
|
||||||
productionTime: '',
|
const templateTotal = ref(0)
|
||||||
handlerUser: '',
|
const templateQuery = reactive({
|
||||||
recordId: '',
|
current: 1,
|
||||||
recordCode: '',
|
size: 10,
|
||||||
remark: '',
|
templateName: ''
|
||||||
deptId: '',
|
|
||||||
});
|
|
||||||
|
|
||||||
// 定义校验规则
|
|
||||||
const dataRules = ref({
|
|
||||||
productionTime: [{required: true, message: '加工日期不能为空', trigger: 'blur'}],
|
|
||||||
recordCode: [{required: true, message: '加工批次号不能为空', trigger: 'blur'}],
|
|
||||||
})
|
})
|
||||||
|
|
||||||
// 打开弹窗
|
const form = reactive({
|
||||||
const openDialog = (id: string) => {
|
id: undefined,
|
||||||
visible.value = true
|
productionTime: new Date().toISOString().split('T')[0],
|
||||||
form.id = ''
|
handlerUser: '',
|
||||||
|
recordCode: '',
|
||||||
|
productionDetailList: [] as any[]
|
||||||
|
})
|
||||||
|
|
||||||
// 重置表单数据
|
const rules = {
|
||||||
nextTick(() => {
|
productionTime: [{ required: true, message: '请选择加工日期', trigger: 'change' }],
|
||||||
dataFormRef.value?.resetFields();
|
handlerUser: [{ required: true, message: '请输入加工人', trigger: 'blur' }],
|
||||||
});
|
recordCode: [{ required: true, message: '请输入加工批次', trigger: 'blur' }]
|
||||||
|
}
|
||||||
|
|
||||||
// 获取canteenProductionRecord信息
|
// 行合并逻辑
|
||||||
if (id) {
|
const rowspanMap = ref<number[]>([])
|
||||||
form.id = id
|
const generateRowspanMap = () => {
|
||||||
getcanteenProductionRecordData(id)
|
const map: number[] = []
|
||||||
}
|
let currentDish = ''
|
||||||
};
|
let count = 0
|
||||||
|
let startIndex = 0
|
||||||
|
|
||||||
// 提交
|
form.productionDetailList.forEach((item, index) => {
|
||||||
const onSubmit = async () => {
|
if (item.dishName !== currentDish) {
|
||||||
const valid = await dataFormRef.value.validate().catch(() => {});
|
if (currentDish !== '') {
|
||||||
if (!valid) return false;
|
for (let i = startIndex; i < index; i++) {
|
||||||
|
map[i] = i === startIndex ? count : 0
|
||||||
try {
|
}
|
||||||
loading.value = true;
|
}
|
||||||
form.id ? await putObj(form) : await addObj(form);
|
currentDish = item.dishName
|
||||||
useMessage().success(form.id ? '修改成功' : '添加成功');
|
startIndex = index
|
||||||
visible.value = false;
|
count = 1
|
||||||
emit('refresh');
|
} else {
|
||||||
} catch (err: any) {
|
count++
|
||||||
useMessage().error(err.msg);
|
}
|
||||||
} finally {
|
|
||||||
loading.value = false;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// 初始化表单数据
|
|
||||||
const getcanteenProductionRecordData = (id: string) => {
|
|
||||||
// 获取数据
|
|
||||||
loading.value = true
|
|
||||||
getObj(id).then((res: any) => {
|
|
||||||
Object.assign(form, res.data)
|
|
||||||
}).finally(() => {
|
|
||||||
loading.value = false
|
|
||||||
})
|
})
|
||||||
};
|
|
||||||
|
|
||||||
// 暴露变量
|
// 处理最后一组
|
||||||
|
if (currentDish !== '') {
|
||||||
|
for (let i = startIndex; i < form.productionDetailList.length; i++) {
|
||||||
|
map[i] = i === startIndex ? count : 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
rowspanMap.value = map
|
||||||
|
}
|
||||||
|
|
||||||
|
// 单元格合并方法
|
||||||
|
const spanMethod = ({ row, column, rowIndex, columnIndex }: any) => {
|
||||||
|
if (columnIndex === 0 || columnIndex === 1) { // 合并菜品名称和生成数量列
|
||||||
|
const span = rowspanMap.value[rowIndex]
|
||||||
|
return {
|
||||||
|
rowspan: span,
|
||||||
|
colspan: span > 0 ? 1 : 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return { rowspan: 1, colspan: 1 }
|
||||||
|
}
|
||||||
|
|
||||||
|
const emit = defineEmits(['refresh'])
|
||||||
|
|
||||||
|
const disabledDate = (time: Date) => {
|
||||||
|
return time.getTime() > Date.now()
|
||||||
|
}
|
||||||
|
|
||||||
|
const searchTemplate = async () => {
|
||||||
|
try {
|
||||||
|
const res = await fetchGetSelectTemplatePage(templateQuery)
|
||||||
|
templateList.value = res.data.records
|
||||||
|
templateTotal.value = res.data.total
|
||||||
|
} catch (error) {
|
||||||
|
console.error('获取生产模板列表失败:', error)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const handleSelectionChange = (selection: any[]) => {
|
||||||
|
selectedTemplates.value = selection
|
||||||
|
}
|
||||||
|
|
||||||
|
const confirmTemplateSelection = () => {
|
||||||
|
if (selectedTemplates.value.length === 0) {
|
||||||
|
useMessage().warning('请至少选择一个模板')
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
form.productionDetailList = []
|
||||||
|
selectedTemplates.value.forEach(template => {
|
||||||
|
const details = template.canteenProductionTemplateDetailList.map((item: any) => ({
|
||||||
|
...item,
|
||||||
|
dishName: template.dishName,
|
||||||
|
materialUnit: item.unit, // 正确传递食材单位字段
|
||||||
|
produceQuantity: 1,
|
||||||
|
actualUsage: item.baseUsage * 1,
|
||||||
|
actualOutput: 0,
|
||||||
|
manualModified: false
|
||||||
|
}))
|
||||||
|
form.productionDetailList.push(...details)
|
||||||
|
})
|
||||||
|
|
||||||
|
generateRowspanMap()
|
||||||
|
templateDialogVisible.value = false
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新生成数量
|
||||||
|
const updateProduceQuantity = (changedRow: any) => {
|
||||||
|
const dishName = changedRow.dishName
|
||||||
|
form.productionDetailList.forEach(row => {
|
||||||
|
if (row.dishName === dishName) {
|
||||||
|
row.produceQuantity = changedRow.produceQuantity
|
||||||
|
if (!row.manualModified) {
|
||||||
|
row.actualUsage = Number((row.baseUsage * changedRow.produceQuantity).toFixed(2))
|
||||||
|
calculateActualOutput(row)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 计算实际产出
|
||||||
|
const calculateActualOutput = (row: any) => {
|
||||||
|
row.manualModified = true
|
||||||
|
const lossAmount = row.actualUsage * (row.lossRate / 100)
|
||||||
|
row.actualOutput = Number((row.actualUsage - lossAmount).toFixed(2))
|
||||||
|
}
|
||||||
|
|
||||||
|
const openTemplateDialog = () => {
|
||||||
|
templateDialogVisible.value = true
|
||||||
|
selectedTemplates.value = []
|
||||||
|
searchTemplate()
|
||||||
|
}
|
||||||
|
|
||||||
|
const openDialog = (row?: any) => {
|
||||||
|
visible.value = true
|
||||||
|
if (row) {
|
||||||
|
Object.assign(form, row)
|
||||||
|
generateRowspanMap()
|
||||||
|
} else {
|
||||||
|
form.id = undefined
|
||||||
|
form.productionTime = new Date().toISOString().split('T')[0]
|
||||||
|
form.handlerUser = ''
|
||||||
|
form.recordCode = ''
|
||||||
|
form.productionDetailList = []
|
||||||
|
selectedTemplates.value = []
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const submitForm = async () => {
|
||||||
|
if (!formRef.value) return
|
||||||
|
|
||||||
|
await formRef.value.validate(async (valid) => {
|
||||||
|
if (valid) {
|
||||||
|
loading.value = true
|
||||||
|
try {
|
||||||
|
const api = form.id ? putObj : addObj
|
||||||
|
const res = await api(form)
|
||||||
|
if (res.code === 0) {
|
||||||
|
useMessage().success(form.id ? '修改成功' : '新增成功')
|
||||||
|
emit('refresh')
|
||||||
|
visible.value = false
|
||||||
|
} else {
|
||||||
|
useMessage().error(res.msg || (form.id ? '修改失败' : '新增失败'))
|
||||||
|
}
|
||||||
|
} catch (error: any) {
|
||||||
|
useMessage().error(error.msg || (form.id ? '修改失败' : '新增失败'))
|
||||||
|
} finally {
|
||||||
|
loading.value = false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
defineExpose({
|
defineExpose({
|
||||||
openDialog
|
openDialog
|
||||||
});
|
})
|
||||||
</script>
|
</script>`
|
||||||
@@ -36,8 +36,8 @@
|
|||||||
<el-table-column type="selection" width="40" align="center" />
|
<el-table-column type="selection" width="40" align="center" />
|
||||||
<el-table-column type="index" label="#" width="40" />
|
<el-table-column type="index" label="#" width="40" />
|
||||||
<el-table-column prop="templateName" label="模版名称" show-overflow-tooltip/>
|
<el-table-column prop="templateName" label="模版名称" show-overflow-tooltip/>
|
||||||
<el-table-column prop="dishId" label="菜品id" show-overflow-tooltip/>
|
<!-- <el-table-column prop="dishId" label="菜品id" show-overflow-tooltip/>-->
|
||||||
<el-table-column prop="baseOutput" label="基准产出量(碗)" show-overflow-tooltip/>
|
<el-table-column prop="baseOutput" label="基准产出量" show-overflow-tooltip/>
|
||||||
<el-table-column label="操作" width="150">
|
<el-table-column label="操作" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button icon="edit-pen" text type="primary" v-auth="'canteen_canteenProductionTemplate_edit'"
|
<el-button icon="edit-pen" text type="primary" v-auth="'canteen_canteenProductionTemplate_edit'"
|
||||||
|
|||||||
@@ -39,20 +39,11 @@
|
|||||||
<el-table-column type="selection" width="40" align="center" />
|
<el-table-column type="selection" width="40" align="center" />
|
||||||
<el-table-column type="index" label="#" width="40" />
|
<el-table-column type="index" label="#" width="40" />
|
||||||
<el-table-column prop="supplierName" label="货商名称" show-overflow-tooltip/>
|
<el-table-column prop="supplierName" label="货商名称" show-overflow-tooltip/>
|
||||||
<el-table-column prop="address" label="货商地址" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="phone" label="电话号码" show-overflow-tooltip/>
|
<el-table-column prop="phone" label="电话号码" show-overflow-tooltip/>
|
||||||
<el-table-column prop="tax" label="税号" show-overflow-tooltip/>
|
<el-table-column prop="tax" label="税号" show-overflow-tooltip/>
|
||||||
<el-table-column prop="linkName" label="联系人" show-overflow-tooltip/>
|
<el-table-column prop="linkName" label="联系人" show-overflow-tooltip/>
|
||||||
<el-table-column prop="openAccount" label="开户行账号" show-overflow-tooltip/>
|
<el-table-column prop="openAccount" label="开户行账号" show-overflow-tooltip/>
|
||||||
<el-table-column prop="email" label="邮箱地址" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="deptId" label="所属部门ID" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="supplierType" label="货商类别" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="supplierArea" label="货商地区" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="passwordModifyTime" label="修改时间" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="openName" label="开户行" show-overflow-tooltip/>
|
<el-table-column prop="openName" label="开户行" show-overflow-tooltip/>
|
||||||
<el-table-column prop="contractNumber" label="合同号" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="status" label="状态 0使用 1禁用" show-overflow-tooltip/>
|
|
||||||
<el-table-column prop="pinyinCod" label="拼音简码" show-overflow-tooltip/>
|
|
||||||
<el-table-column label="操作" width="150">
|
<el-table-column label="操作" width="150">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button icon="edit-pen" text type="primary" v-auth="'canteen_canteenSupplier_edit'"
|
<el-button icon="edit-pen" text type="primary" v-auth="'canteen_canteenSupplier_edit'"
|
||||||
|
|||||||
Reference in new issue
Block a user