src/api/salesOutbound/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/api/warehouseManagement/index.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/main.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/utils/getCurrentDate.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/utils/summarizeTable.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/inspectionManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesOutbound/components/formDia.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/salesOutbound/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
src/views/warehouseManagement/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/salesOutbound/index.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,27 @@ // éå®åºåº import request from '@/utils/request' // æ¥è¯¢å表 export function salesRecordList(query) { return request({ url: '/salesRecord/list', method: 'get', params: query }) } // æäº¤æ°å¢ãä¿®æ¹ export function addOrEditSalesRecord(query) { return request({ url: '/salesRecord/addOrEditSalesRecord', method: 'post', data: query }) } // æ¥è¯¢å®¢æ· export function customerList(query) { return request({ url: '/customer/customerList', method: 'get', params: query }) } src/api/warehouseManagement/index.js
@@ -48,4 +48,20 @@ method: 'get', params: query }) } // æäº¤åå¹¶ export function merge(query) { return request({ url: '/officialInventory/merge', method: 'post', data: query }) } // æ£å¼åºåç¼è¾ export function editOfficial(query) { return request({ url: '/officialInventory/editOfficial', method: 'post', data: query }) } src/main.js
@@ -43,6 +43,8 @@ import ImagePreview from "@/components/ImagePreview" // åå ¸æ ç¾ç»ä»¶ import DictTag from '@/components/DictTag' import {summarizeTable} from "@/utils/summarizeTable.js"; import {getCurrentDate} from "@/utils/getCurrentDate.js"; const app = createApp(App) @@ -55,6 +57,8 @@ app.config.globalProperties.addDateRange = addDateRange app.config.globalProperties.selectDictLabel = selectDictLabel app.config.globalProperties.selectDictLabels = selectDictLabels app.config.globalProperties.summarizeTable = summarizeTable app.config.globalProperties.getCurrentDate = getCurrentDate // å ¨å±ç»ä»¶æè½½ app.component('DictTag', DictTag) src/utils/getCurrentDate.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ // src/utils/utils.js export function getCurrentDate() { const today = new Date(); const year = today.getFullYear(); const month = String(today.getMonth() + 1).padStart(2, '0'); // æä»½ä»0å¼å§ const day = String(today.getDate()).padStart(2, '0'); return `${year}-${month}-${day}`; } src/utils/summarizeTable.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,48 @@ /** * éç¨çè¡¨æ ¼åè®¡æ¹æ³ * @param {Object} param - å å«è¡¨æ ¼åé ç½®åæ°æ®æºç对象 * @param {Array<string>} summaryProps - éè¦æ±æ»çåæ®µåæ°ç» * @param {Object} specialFormat - ç¹æ®æ ¼å¼åè§åï¼å段å -> æ ¼å¼åé项ï¼å¦æ¯å¦å»æå°æ°ï¼ * @returns {Array} åè®¡è¡æ°æ® */ const summarizeTable = (param, summaryProps, specialFormat = {}) => { const { columns, data } = param; const sums = []; columns.forEach((column, index) => { if (index === 0) { sums[index] = 'å计'; return; } const prop = column.property; if (summaryProps.includes(prop)) { const values = data.map(item => Number(item[prop])); // åªå¯¹æææ°åè¿è¡æ±å if (!values.every(isNaN)) { const sum = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); if (specialFormat[prop] && specialFormat[prop].noDecimal) { // 妿æå®äºä¸éè¦ä¿çå°æ°ï¼åç´æ¥è½¬æ¢ä¸ºæ´æ° sums[index] = Math.round(sum).toString(); } else { // é»è®¤ä¿ç两ä½å°æ° sums[index] = parseFloat(sum).toFixed(specialFormat[prop]?.decimalPlaces ?? 2); } } else { sums[index] = ''; } } else { sums[index] = ''; } }); return sums; } // ä¸å«ç¨æ»ä»·è®¡ç® const calculateTaxExclusiveTotalPrice = (taxInclusiveTotalPrice, taxRate) => { const taxRateDecimal = taxRate / 100; return (taxInclusiveTotalPrice / (1 + taxRateDecimal)).toFixed(2); } // å«ç¨æ»ä»·è®¡ç® const calculateTaxIncludeTotalPrice = (taxInclusiveUnitPrice, quantity) => { return (taxInclusiveUnitPrice * quantity).toFixed(2); } // 导åºå½æ°ä¾å ¶ä»æä»¶ä½¿ç¨ export { summarizeTable, calculateTaxExclusiveTotalPrice ,calculateTaxIncludeTotalPrice}; src/views/inspectionManagement/index.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,13 @@ <template> <div class="app-container"> </div> </template> <script setup> </script> <style scoped> </style> src/views/salesOutbound/components/formDia.vue
@@ -2,12 +2,12 @@ <div> <el-dialog :title="operationType === 'add' ? 'æ°å¢åºåº' : 'ç¼è¾åºåº'" v-model="dialogVisitable" width="800px" @close="cancel"> <el-form :model="form" :rules="rules" ref="userRef" label-width="100px"> <el-form :model="form" :rules="rules" ref="formRef" label-width="120px"> <el-row> <el-col :span="12"> <el-form-item label="é宿¥æ" prop="userName"> <el-form-item label="é宿¥æ" prop="saleDate"> <el-date-picker v-model="form.userName" v-model="form.saleDate" type="date" value-format="YYYY-MM-DD" format="YYYY-MM-DD" @@ -18,8 +18,8 @@ </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="客æ·" prop="nickName"> <el-select v-model="form.nickName" placeholder="è¯·éæ©å®¢æ·"> <el-form-item label="客æ·" prop="customerId"> <el-select v-model="form.customerId" placeholder="è¯·éæ©å®¢æ·"> <el-option v-for="item in customerOptions" :key="item.value" @@ -32,8 +32,8 @@ </el-row> <el-row> <el-col :span="12"> <el-form-item label="ç ¤ç§" prop="type"> <el-select v-model="form.nickName" placeholder="è¯·éæ©ç ¤ç§"> <el-form-item label="ç ¤ç§" prop="coalId"> <el-select v-model="form.coalId" placeholder="è¯·éæ©ç ¤ç§"> <el-option v-for="item in typeOptions" :key="item.value" @@ -44,39 +44,56 @@ </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="åä½" prop="nickName"> <el-input v-model="form.nickName" placeholder="请è¾å ¥åä½" maxlength="30" /> <el-form-item label="åä½" prop="unit"> <el-input v-model="form.unit" placeholder="请è¾å ¥åä½" maxlength="30" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="é宿°é" prop="userName"> <el-input v-model="form.userName" placeholder="请è¾å ¥é宿°é" maxlength="30" type="number" /> <el-form-item label="åºåæ°é" prop="inventoryQuantity"> <el-input v-model="form.inventoryQuantity" placeholder="请è¾å ¥é宿°é" maxlength="30" type="number" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="éå®åä»·" prop="userName"> <el-input v-model="form.userName" placeholder="请è¾å ¥éå®åä»·(å«ç¨)" maxlength="30" type="number" /> <el-form-item label="åä»·(å«ç¨)" prop="priceIncludingTax"> <el-input v-model="form.priceIncludingTax" placeholder="请è¾å ¥éå®åä»·(å«ç¨)" maxlength="30" type="number" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="é宿»ä»·" prop="userName"> <el-input v-model="form.userName" placeholder="请è¾å ¥é宿»ä»·(å«ç¨)" maxlength="30" type="number" /> <el-form-item label="é宿°é" prop="saleQuantity"> <el-input v-model="form.saleQuantity" placeholder="请è¾å ¥é宿°é" maxlength="30" type="number" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="çå¼" prop="userName"> <el-input v-model="form.userName" placeholder="请è¾å ¥çå¼" maxlength="30" /> <el-form-item label="éå®åä»·(å«ç¨)" prop="salePrice"> <el-input v-model="form.salePrice" placeholder="请è¾å ¥éå®åä»·(å«ç¨)" maxlength="30" type="number" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="婿¶¦" prop="userName"> <el-input v-model="form.userName" placeholder="婿¶¦" maxlength="30" type="number" /> <el-form-item label="è´éç ¤ç¨ç(%)" prop="taxCoal"> <el-input v-model="form.taxCoal" placeholder="请è¾å ¥é宿»ä»·(å«ç¨)" maxlength="30" type="number" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="è¿è¾ç¨ç(%)" prop="taxTrans"> <el-input v-model="form.taxTrans" placeholder="请è¾å ¥é宿»ä»·(å«ç¨)" maxlength="30" type="number" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="æ¯å©æ¶¦" prop="grossProfit"> <el-input v-model="form.grossProfit" placeholder="æ¯å©æ¶¦" maxlength="30" type="number" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="å婿¶¦" prop="netProfit"> <el-input v-model="form.netProfit" placeholder="å婿¶¦" maxlength="30" type="number" /> </el-form-item> </el-col> </el-row> @@ -93,6 +110,7 @@ <script setup> import {ref, reactive} from "vue"; import {addOrEditSalesRecord, customerList} from "../../../api/salesOutbound/index.js"; const { proxy } = getCurrentInstance() const emit = defineEmits() @@ -101,13 +119,23 @@ const customerOptions = ref([]) // 客æ·ä¸ææ¡ const typeOptions = ref([]) // ç ¤ç§ä¸ææ¡ const data = reactive({ form: {}, form: { saleDate: '', customerId: '', coalId: '', unit: '', saleQuantity: '', salePrice: '', totalAmount: '', taxCoal: '', taxTrans: '', grossProfit: '', netProfit: '', inventoryQuantity: '', priceIncludingTax: '', }, rules: { userName: [{ required: true, message: "ç»å½è´¦å·ä¸è½ä¸ºç©º", trigger: "blur" },], nickName: [{ required: true, message: "ç¨æ·å§åä¸è½ä¸ºç©º", trigger: "blur" }], roleIds: [{ required: true, message: "è§è²ä¸è½ä¸ºç©º", trigger: "change" }], deptId: [{ required: true, message: "é¨é¨ä¸è½ä¸ºç©º", trigger: "change" }], password: [{ required: true, message: "ç¨æ·å¯ç ä¸è½ä¸ºç©º", trigger: "blur" }, { min: 5, max: 20, message: "ç¨æ·å¯ç é¿åº¦å¿ é¡»ä»äº 5 å 20 ä¹é´", trigger: "blur" }, { pattern: /^[^<>"'|\\]+$/, message: "ä¸è½å å«éæ³å符ï¼< > \" ' \\\ |", trigger: "blur" }], saleDate: [{ required: true, message: "è¯·éæ©æ¥æ", trigger: "change" },], } }) @@ -117,18 +145,25 @@ const openDialog = (type, row) => { console.log('openDialog', type, row) dialogVisitable.value = true form.value.saleDate = proxy.getCurrentDate() customerList().then((res) => { console.log(res) }) } // æäº¤å并表å const submitForm = () => { proxy.$refs["userRef"].validate(valid => { proxy.$refs["formRef"].validate(valid => { if (valid) { addOrEditSalesRecord(form.value).then(() => { cancel() proxy.$modal.msgSuccess('æäº¤æå') }) } }) } // å ³éå并表å const cancel = () => { proxy.resetForm("userRef") proxy.resetForm("formRef") dialogVisitable.value = false emit('closeDia') } src/views/salesOutbound/index.vue
@@ -79,12 +79,13 @@ </template> <script setup> import {ref, reactive} from "vue"; import {ref, reactive, onMounted} from "vue"; const { proxy } = getCurrentInstance() import {Delete, Download, Plus} from "@element-plus/icons-vue"; import ETable from "@/components/Table/ETable.vue"; import Pagination from "@/components/Pagination/index.vue"; import FormDia from "@/views/salesOutbound/components/formDia.vue"; import {salesRecordList} from "../../api/salesOutbound/index.js"; const formDia = ref() const activeTab = ref("out"); @@ -96,17 +97,21 @@ const tableLoading = ref(false); const tableData = ref([]); const columns = ref([ { prop: "supplierName", label: "é宿¥æ", minWidth: 160 }, { prop: "identifyNumber", label: "客æ·", minWidth: 120 }, { prop: "address", label: "ç ¤ç§", minWidth: 150 }, { prop: "saleDate", label: "é宿¥æ", minWidth: 160 }, { prop: "customer", label: "客æ·", minWidth: 120 }, { prop: "coal", label: "ç ¤ç§", minWidth: 150 }, { prop: "unit", label: "åä½", minWidth: 150 }, { prop: "bank", label: "åºåæ°é", minWidth: 120 }, { prop: "bankAccount", label: "éå®åä»·(å«ç¨)", minWidth: 150 }, { prop: "contacts", label: "é宿»ä»·(å«ç¨)", minWidth: 120 }, { prop: "contacts", label: "婿¶¦", minWidth: 90 }, { prop: "contactAddress", label: "çå¼", minWidth: 150 }, { prop: "maintainer", label: "ç»´æ¤äºº", minWidth: 100 }, { prop: "maintainDate", label: "ç»´æ¤æ¥æ", minWidth: 100 }, { prop: "priceIncludingTax", label: "åä»·(å«ç¨)", minWidth: 150 }, { prop: "inventoryQuantity", label: "åºåæ°é", minWidth: 120 }, { prop: "saleQuantity", label: "é宿°é", minWidth: 120 }, { prop: "salePrice", label: "éå®åä»·(å«ç¨)", minWidth: 150 }, { prop: "totalAmount", label: "é宿»ä»·(å«ç¨)", minWidth: 120 }, { prop: "taxCoal", label: "è´éç ¤ç¨ç(%)", minWidth: 120 }, { prop: "taxTrans", label: "è¿è¾ç¨ç(%)", minWidth: 120 }, { prop: "grossProfit", label: "æ¯å©æ¶¦", minWidth: 90 }, { prop: "netProfit", label: "å婿¶¦", minWidth: 90 }, { prop: "registrant", label: "ç»è®°äºº", minWidth: 100 }, { prop: "registrationDate", label: "ç»è®°æ¥æ", minWidth: 100 }, ]); const selectedRows = ref([]); const total = ref(0); @@ -119,13 +124,22 @@ identifyNumber: "", address: "", }) onMounted(() => { handleQuery() }); // ç¹å»æ¥è¯¢ const handleQuery = () => { pageNum.value = 1 pageSize.value = 10 getList() } const getList = () => { tableLoading.value = true; setTimeout(() => { salesRecordList({...queryParams, current: pageNum.value, size: pageSize.value}).then(res => { tableLoading.value = false; }, 500); tableData.value = res.data.records; total.value = res.data.total; }) } // éç½®æ¥è¯¢ const resetQuery = () => { src/views/warehouseManagement/index.vue
@@ -38,29 +38,32 @@ </el-tabs> <!-- æä½æé®åº --> <el-space> <el-button type="danger" :icon="Delete">å é¤</el-button> <!-- <el-button type="danger" :icon="Delete">å é¤</el-button>--> <el-button type="info" plain :icon="Download">导åº</el-button> <el-button type="success" plain :icon="Refresh" v-if="activeTab=== 'officialInventory'" @click="mergeRows">åå¹¶</el-button> <el-button type="success" plain :icon="Refresh" v-if="activeTab=== 'officialInventory'" @click="mergeRows('merge')">åå¹¶</el-button> </el-space> <div> <el-table :data="tableData" border @selection-change="selectionChange" style="width: 100%"> <el-table :data="tableData" border @selection-change="selectionChange" style="width: 100%" show-summary :summary-method="summarizeChildrenTable"> <el-table-column type="selection" width="55" align="center" /> <el-table-column label="åºå·" type="index" width="60" align="center" /> <el-table-column prop="supplierName" label="ä¾è´§ååç§°" width="180" sortable/> <el-table-column prop="coal" label="ç ¤ç§" sortable/> <el-table-column prop="unit" label="åä½" width="70"/> <el-table-column prop="inventoryQuantity" label="åºåæ°é" sortable min-width="110"/> <el-table-column prop="priceIncludingTax" label="åä»·ï¼å«ç¨ï¼" sortable width="130"/> <el-table-column prop="totalPriceIncludingTax" label="æ»ä»·ï¼å«ç¨ï¼" width="130" /> <el-table-column prop="costPerUnit" label="ææ¬åä»·" /> <el-table-column prop="priceIncludingTax" label="åä»·(å«ç¨)" sortable width="130"/> <el-table-column prop="totalPriceIncludingTax" label="æ»ä»·(å«ç¨)" width="130" /> <el-table-column prop="priceExcludingTax" label="åä»·(ä¸å«ç¨)" width="130" /> <el-table-column prop="totalPriceExcludingTax" label="æ»ä»·(ä¸å«ç¨)" width="130" /> <el-table-column prop="pendingReplenishment" label="å¾ è¡¥åº" width="130" /> <el-table-column label="ç ¤è´¨" align="center" v-if="activeTab=== 'officialInventory'" width="600"> <el-table-column v-for="col in columnTitle" :key="col.prop" :prop="col.prop" :label="col.label" align="center" sortable min-width="200"/> </el-table-column> <el-table-column prop="registrantId" label="ç»è®°äºº" width="180"/> <el-table-column prop="registrationDate" label="ç»è®°æ¥æ" width="180"/> <el-table-column fixed="right" label="æä½" min-width="60" align="center" v-if="activeTab !== 'officialInventory'"> <el-table-column fixed="right" label="æä½" min-width="60" align="center"> <template #default="scope"> <el-button link type="primary" size="small" @click="reviewDia(scope.row)">å®¡æ ¸</el-button> <el-button link type="primary" size="small" @click="reviewDia(scope.row)" v-if="activeTab !== 'officialInventory'">å®¡æ ¸</el-button> <el-button link type="primary" size="small" @click="mergeRows('edit', scope.row)" v-else>ç¼è¾</el-button> </template> </el-table-column> </el-table> @@ -115,10 +118,17 @@ </el-row> <el-row> <el-col :span="12"> <el-form-item label="ææ¬åä»·" prop="costPerUnit"> <el-input v-model="form.costPerUnit" placeholder="请è¾å ¥ææ¬åä»·" maxlength="30" /> <el-form-item label="åä»·(ä¸å«ç¨)" prop="priceExcludingTax"> <el-input v-model="form.priceExcludingTax" placeholder="请è¾å ¥ææ¬åä»·" maxlength="30" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æ»ä»·(ä¸å«ç¨)" prop="totalPriceExcludingTax"> <el-input v-model="form.totalPriceExcludingTax" placeholder="请è¾å ¥ææ¬åä»·" maxlength="30" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="ç ¤è´¨æ¹æ¡" prop="qualityPlan"> <el-select v-model="form.qualityPlan" placeholder="è¯·éæ©" @change="coalPlanByIdList" clearable> @@ -150,40 +160,60 @@ </el-dialog> <!-- åå¹¶æ°æ®å¼¹æ¡ --> <el-dialog title="åå¹¶åºå" v-model="mergeVisible" width="800px"> <el-form :model="form" :rules="rules" ref="userRef" label-width="100px"> <el-form :model="mergeForm" :rules="mergeRules" ref="mergeRef" label-width="100px"> <el-row> <el-col :span="12"> <el-form-item label="ä¾è´§ååç§°" prop="supplierName"> <el-input v-model="form.supplierName" placeholder="请è¾å ¥ææºå·ç " maxlength="30" /> <el-input v-model="mergeForm.supplierName" placeholder="请è¾å ¥ä¾è´§ååç§°" maxlength="30" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç ¤ç§" prop="coal"> <el-input v-model="form.coal" placeholder="请è¾å ¥å§å" maxlength="30" /> <el-input v-model="mergeForm.coal" placeholder="请è¾å ¥ç ¤ç§" maxlength="30" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="åä½" prop="unit"> <el-input v-model="mergeForm.unit" placeholder="请è¾å ¥åä½" maxlength="30" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="åºåæ°é" prop="inventoryQuantity"> <el-input v-model="mergeForm.inventoryQuantity" placeholder="请è¾å ¥åºåæ°é" :max="inventoryQuantity" type="number"/> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="åä»·(å«ç¨)" prop="priceIncludingTax"> <el-input v-model="form.priceIncludingTax" placeholder="请è¾å ¥ææºå·ç " maxlength="30" /> <el-input v-model="mergeForm.priceIncludingTax" placeholder="请è¾å ¥åä»·(å«ç¨)" maxlength="30" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="æ»ä»·(å«ç¨)" prop="totalPriceIncludingTax"> <el-input v-model="form.totalPriceIncludingTax" placeholder="请è¾å ¥ææºå·ç " maxlength="30" /> <el-input v-model="mergeForm.totalPriceIncludingTax" placeholder="请è¾å ¥æ»ä»·(å«ç¨)" maxlength="30" /> </el-form-item> </el-col> </el-row> <el-row> <el-col :span="12"> <el-form-item label="ææ¬åä»·" prop="costPerUnit"> <el-input v-model="form.costPerUnit" placeholder="请è¾å ¥å§å" maxlength="30" /> <el-form-item label="åä»·(ä¸å«ç¨)" prop="priceExcludingTax"> <el-input v-model="mergeForm.priceExcludingTax" placeholder="请è¾å ¥åä»·(ä¸å«ç¨)" maxlength="30" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="ç ¤è´¨" prop="userName"> <el-input v-model="form.userName" placeholder="请è¾å ¥ææºå·ç " maxlength="30" /> <el-form-item label="æ»ä»·(ä¸å«ç¨)" prop="totalPriceExcludingTax"> <el-input v-model="mergeForm.totalPriceExcludingTax" placeholder="请è¾å ¥æ»ä»·(ä¸å«ç¨)" maxlength="30" /> </el-form-item> </el-col> </el-row> <el-divider></el-divider> <el-row> <el-col :span="12" v-for="item in filteredList" :key="item.id"> <el-form-item :label="item.fieldName"> <el-input v-model="mergeForm[item.fields]" /> </el-form-item> </el-col> </el-row> @@ -208,12 +238,12 @@ coalPlanList, officialInventoryList, pendingInventoryList } from "@/api/warehouseManagement/index.js"; import {editOfficial, merge} from "../../api/warehouseManagement/index.js"; const { proxy } = getCurrentInstance() const tableData = ref([]) const selectedRows = ref([]) const columns = ref([]) const qualityPlanOption = ref([]) const filteredList = ref([]) const tableLoading = ref(false); @@ -221,10 +251,14 @@ const pageNum = ref(1); const pageSize = ref(10); const inventoryQuantity = ref(0); const count = ref(0); const mean = ref(0); const totalPrice = ref(0); // å®¡æ ¸å¼¹æ¡ const reviewVisible = ref(false); // åå¹¶å¼¹æ¡ const mergeVisible = ref(false) const operationType = ref('') const data = reactive({ form: { supplierName: '', @@ -233,7 +267,20 @@ inventoryQuantity: '', priceIncludingTax: '', totalPriceIncludingTax: '', costPerUnit: '', priceExcludingTax: '', totalPriceExcludingTax: '', qualityPlan: '', pId: '', }, mergeForm: { supplierName: '', coal: '', unit: '', inventoryQuantity: '', priceIncludingTax: '', totalPriceIncludingTax: '', priceExcludingTax: '', totalPriceExcludingTax: '', qualityPlan: '', pId: '', }, @@ -242,10 +289,16 @@ coal: [{ required: true, message: "请è¾å ¥ç ¤ç§", trigger: "blur" }], unit: [{ required: true, message: "请è¾å ¥åä½", trigger: "blur" }], qualityPlan: [{ required: true, message: "è¯·éæ©", trigger: "change" }], }, mergeRules: { supplierName: [{ required: true, message: "请è¾å ¥ä¾åºååç§°", trigger: "blur" }], coal: [{ required: true, message: "请è¾å ¥ç ¤ç§", trigger: "blur" }], unit: [{ required: true, message: "请è¾å ¥åä½", trigger: "blur" }], qualityPlan: [{ required: true, message: "è¯·éæ©", trigger: "change" }], } }) const { form, rules } = toRefs(data) const { form, rules, mergeForm, mergeRules } = toRefs(data) // å½åæ ç¾ const activeTab = ref("pendingInbound"); const tabName = ref("pendingInbound"); @@ -269,6 +322,9 @@ tableData.value = []; getList(); }; const summarizeChildrenTable = (param) => { return proxy.summarizeTable(param, ['inventoryQuantity', 'priceIncludingTax', 'totalPriceIncludingTax','priceExcludingTax','totalPriceExcludingTax']); } // ç¹å»æ¥è¯¢ const handleQuery = () => { pageNum.value = 1 @@ -326,6 +382,7 @@ // æå¼å®¡æ ¸å¼¹æ¡ const reviewDia = (row) => { reviewVisible.value = true filteredList.value = [] form.value = {...row} form.value.pId = row.id inventoryQuantity.value = row.inventoryQuantity @@ -359,19 +416,93 @@ }) } // åå¹¶åºåæ°æ®æ¹æ³ const mergeRows = () => { if (selectedRows.value.length < 2) { proxy.$modal.msgWarning('请è³å°éæ©ä¸¤æ¡æ°æ®') return const mergeRows = (type,row) => { coalFieldListOption(); mergeVisible.value = true; operationType.value = type; if (type === 'edit') { mergeForm.value = {...row} } else { if (selectedRows.value.length < 2) { proxy.$modal.msgWarning('请è³å°éæ©ä¸¤æ¡æ°æ®') return } filteredList.value.forEach(item => { mergeForm.value[item.fields] = '' }) const data = selectedRows.value const selectedIds = selectedRows.value.map(row => row.id); // åå§åå计ååå¼åé let totalInventory = 0; let totalPriceIncludingTax = 0; let totalPriceExcludingTax = 0; let priceIncludingTaxSum = 0; let priceExcludingTaxSum = 0; // éåææé䏿°æ®ï¼ç´¯å è®¡ç® data.forEach(row => { totalInventory += parseFloat(row.inventoryQuantity) || 0; priceIncludingTaxSum += parseFloat(row.priceIncludingTax) || 0; totalPriceIncludingTax += parseFloat(row.totalPriceIncludingTax) || 0; priceExcludingTaxSum += parseFloat(row.priceExcludingTax) || 0; totalPriceExcludingTax += parseFloat(row.totalPriceExcludingTax) || 0; }); // 计ç®å¹³åå¼å¹¶ä¿ç两ä½å°æ° const avgPriceIncludingTax = Number((priceIncludingTaxSum / data.length).toFixed(2)); const avgTotalPriceIncludingTax = Number((totalPriceIncludingTax / data.length).toFixed(2)); const avgPriceExcludingTax = Number((priceExcludingTaxSum / data.length).toFixed(2)); const avgTotalPriceExcludingTax = Number((totalPriceExcludingTax / data.length).toFixed(2)); // è®¾ç½®è¡¨åæ¾ç¤º mergeForm.value.inventoryQuantity = totalInventory; mergeForm.value.priceIncludingTax = avgPriceIncludingTax; mergeForm.value.totalPriceIncludingTax = avgTotalPriceIncludingTax; mergeForm.value.priceExcludingTax = avgPriceExcludingTax; mergeForm.value.totalPriceExcludingTax = avgTotalPriceExcludingTax; mergeForm.value.ids = selectedIds; } mergeVisible.value = true } // æäº¤å并表å const submitForm = () => { proxy.$refs.mergeRef.validate(valid => { if (valid) { delete mergeForm.value.createTime delete mergeForm.value.updateTime if (operationType.value === 'edit') { mergeForm.value.fields = filteredList.value.reduce((acc, item) => { const key = item.fields; const value = mergeForm.value[key]; // 夿æ¯å¦æå¼ï¼ä½ å¯ä»¥æ ¹æ®éè¦ä¿®æ¹å¤ææ¡ä»¶ï¼ if (value !== null && value !== undefined && value !== '') { acc.push({ [key]: value }); } return acc; }, []); editOfficial(mergeForm.value).then(() => { cancel() proxy.$modal.msgSuccess('ä¿®æ¹æå') handleQuery() }) } else { mergeForm.value.fields = filteredList.value.reduce((acc, item) => { const key = item.fields; const value = mergeForm.value[key]; // 夿æ¯å¦æå¼ï¼ä½ å¯ä»¥æ ¹æ®éè¦ä¿®æ¹å¤ææ¡ä»¶ï¼ if (value !== null && value !== undefined && value !== '') { acc.push({ [key]: value }); } return acc; }, []); merge(mergeForm.value).then(() => { cancel() proxy.$modal.msgSuccess('åå¹¶æå') handleQuery() }) } } }) } // å ³éå并表å const cancel = () => { proxy.$refs.mergeRef.resetFields(); mergeVisible.value = false } // æäº¤å®¡æ ¸è¡¨å