¶Ô±ÈÐÂÎļþ |
| | |
| | | // 产åç»´æ¤é¡µé¢æ¥å£ |
| | | import request from '@/utils/request' |
| | | |
| | | // äº§åæ æ¥è¯¢ |
| | | export function productTreeList(query) { |
| | | return request({ |
| | | url: '/basic/product/list', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | // äº§åæ æ°å¢ä¿®æ¹ |
| | | export function addOrEditProduct(query) { |
| | | return request({ |
| | | url: '/basic/product/addOrEditProduct', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // è§æ ¼åå·æ°å¢ä¿®æ¹ |
| | | export function addOrEditProductModel(query) { |
| | | return request({ |
| | | url: '/basic/product/addOrEditProductModel', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | | } |
| | | // äº§åæ å é¤ |
| | | export function delProduct(query) { |
| | | return request({ |
| | | url: '/basic/product/delProduct', |
| | | method: 'delete', |
| | | data: query |
| | | }) |
| | | } |
| | | // è§æ ¼åå·å é¤ |
| | | export function delProductModel(query) { |
| | | return request({ |
| | | url: '/basic/product/delProductModel', |
| | | method: 'delete', |
| | | data: query |
| | | }) |
| | | } |
| | | // è§æ ¼åå·æ¥è¯¢ |
| | | export function modelList(query) { |
| | | return request({ |
| | | url: '/basic/product/modelList', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | |
| | | }) |
| | | } |
| | | |
| | | // 产åå¼ç¥¨è®°å½å页æ¥è¯¢ |
| | | export function registrationProductPage(query) { |
| | | return request({ |
| | | url: '/invoiceLedger/registrationProductPage', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | // 产åå¼ç¥¨è¯¦æ
æ¥è¯¢ |
| | | export function invoiceLedgerProductInfo(query) { |
| | | return request({ |
| | | url: '/invoiceLedger/invoiceLedgerProductInfo', |
| | | method: 'get', |
| | | params: query |
| | | }) |
| | | } |
| | | |
| | | |
| | |
| | | }) |
| | | } |
| | | // å¼ç¥¨ç»è®°æ°å¢ |
| | | export function invoiceRegistrationSaveOrUpdate(query) { |
| | | export function invoiceRegistrationSave(query) { |
| | | return request({ |
| | | url: '/invoiceRegistration/saveOrUpdate', |
| | | url: '/invoiceRegistration/save', |
| | | method: 'post', |
| | | data: query |
| | | }) |
| | |
| | | import PIMTable from "@/components/PIMTable/PIMTable.vue";
|
| | |
|
| | | import { getToken } from "@/utils/auth";
|
| | | import {calculateTaxExclusiveTotalPrice, summarizeTable} from "@/utils/summarizeTable.js";
|
| | |
|
| | | const app = createApp(App)
|
| | |
|
| | |
| | | app.config.globalProperties.download = download
|
| | | app.config.globalProperties.parseTime = parseTime
|
| | | app.config.globalProperties.resetForm = resetForm
|
| | | app.config.globalProperties.summarizeTable = summarizeTable
|
| | | app.config.globalProperties.calculateTaxExclusiveTotalPrice = calculateTaxExclusiveTotalPrice
|
| | | app.config.globalProperties.handleTree = handleTree
|
| | | app.config.globalProperties.addDateRange = addDateRange
|
| | | app.config.globalProperties.selectDictLabel = selectDictLabel
|
¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * éç¨çè¡¨æ ¼åè®¡æ¹æ³ |
| | | * @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); |
| | | } |
| | | // 导åºå½æ°ä¾å
¶ä»æä»¶ä½¿ç¨ |
| | | export { summarizeTable, calculateTaxExclusiveTotalPrice }; |
¶Ô±ÈÐÂÎļþ |
| | |
| | | <template> |
| | | <div class="app-container product-view"> |
| | | <div class="left"> |
| | | <div> |
| | | <el-input |
| | | v-model="search" |
| | | style="width: 240px" |
| | | placeholder="è¾å
¥å
³é®åè¿è¡æç´¢" |
| | | @change="searchFilter" |
| | | @clear="searchFilter" |
| | | clearable |
| | | prefix-icon="Search" |
| | | /> |
| | | <el-button type="primary" @click="openProDia('add')" style="margin-left: 10px">æ°å¢äº§å</el-button> |
| | | </div> |
| | | <div> |
| | | <el-tree ref="tree" v-loading="treeLoad" :data="list" @node-click="handleNodeClick" |
| | | :expand-on-click-node="false" |
| | | :default-expanded-keys="expandedKeys" :draggable="true" :filter-node-method="filterNode" |
| | | :props="{ children: 'children', label: 'label' }" highlight-current node-key="id" |
| | | style="height: calc(100vh - 190px);overflow-y: scroll;scrollbar-width: none;"> |
| | | <template #default="{ node, data }"> |
| | | <div class="custom-tree-node"> |
| | | <span>{{ node.label }}</span> |
| | | <div> |
| | | <el-button type="primary" link @click="openProDia('edit', data)"> |
| | | ç¼è¾ |
| | | </el-button> |
| | | <!-- ä¿®æ¹æ¤å¤ --> |
| | | <el-button |
| | | v-if="!node.childNodes.length" |
| | | style="margin-left: 4px" |
| | | type="danger" |
| | | link |
| | | @click="remove(node, data)" |
| | | > |
| | | å é¤ |
| | | </el-button> |
| | | </div> |
| | | </div> |
| | | </template> |
| | | </el-tree> |
| | | </div> |
| | | </div> |
| | | <div class="right"> |
| | | <div style="margin-bottom: 10px"> |
| | | <el-button type="primary" @click="openModelDia('add')">æ°å¢è§æ ¼åå·</el-button> |
| | | <el-button type="danger" @click="handleDelete" style="margin-left: 10px" plain>å é¤</el-button> |
| | | </div> |
| | | <PIMTable :column="tableColumn" :tableData="tableData" :page="page" :isSelection="true" :handleSelectionChange="handleSelectionChange" |
| | | :tableLoading="tableLoading" @pagination="pagination" :total="total"></PIMTable> |
| | | </div> |
| | | <el-dialog v-model="productDia" title="产å" width="400px"> |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="产ååç§°ï¼" prop="productName"> |
| | | <el-input v-model="form.productName" placeholder="请è¾å
¥äº§ååç§°" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitForm">确认</el-button> |
| | | <el-button @click="closeProDia">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | <el-dialog v-model="modelDia" title="产å" width="400px"> |
| | | <el-form :model="modelForm" label-width="140px" label-position="top" :rules="modelRules" ref="modelFormRef"> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="è§æ ¼åå·ï¼" prop="model"> |
| | | <el-input v-model="modelForm.model" placeholder="请è¾å
¥è§æ ¼åå·" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row> |
| | | <el-col :span="24"> |
| | | <el-form-item label="åä½ï¼" prop="unit"> |
| | | <el-input v-model="modelForm.unit" placeholder="请è¾å
¥åä½" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </el-form> |
| | | <template #footer> |
| | | <div class="dialog-footer"> |
| | | <el-button type="primary" @click="submitModelForm">确认</el-button> |
| | | <el-button @click="closeProDia">åæ¶</el-button> |
| | | </div> |
| | | </template> |
| | | </el-dialog> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import {ref} from "vue"; |
| | | import {ElMessageBox} from "element-plus"; |
| | | import { |
| | | addOrEditProduct, |
| | | addOrEditProductModel, |
| | | delProduct, delProductModel, |
| | | modelList, |
| | | productTreeList |
| | | } from "@/api/basicData/product.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | |
| | | const productDia = ref(false) |
| | | const modelDia = ref(false) |
| | | const modelOperationType = ref('') |
| | | const search = ref('') |
| | | const currentId = ref('') |
| | | const currentParentId = ref('') |
| | | const operationType = ref('') |
| | | const treeLoad = ref(false) |
| | | const list = ref([]) |
| | | const expandedKeys = ref([]) |
| | | const tableColumn = ref([ |
| | | { |
| | | label: 'è§æ ¼åå·', |
| | | prop: 'model', |
| | | }, |
| | | { |
| | | label: 'åä½', |
| | | prop: 'unit', |
| | | }, |
| | | { |
| | | dataType: "action", |
| | | label: "æä½", |
| | | align: 'center', |
| | | operation: [ |
| | | { |
| | | name: "ç¼è¾", |
| | | type: "text", |
| | | clickFun: (row) => { |
| | | openModelDia('edit', row); |
| | | }, |
| | | }, |
| | | ], |
| | | }, |
| | | ]) |
| | | const tableData = ref([]) |
| | | const tableLoading = ref(false) |
| | | const total = ref(0) |
| | | const selectedRows = ref([]) |
| | | const page = reactive({ |
| | | current: 1, |
| | | size: 10, |
| | | }) |
| | | const data = reactive({ |
| | | form: { |
| | | productName: '', |
| | | }, |
| | | rules: { |
| | | productName: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | }, |
| | | modelForm: { |
| | | model: '', |
| | | unit: '', |
| | | }, |
| | | modelRules: { |
| | | model: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | unit: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | } |
| | | }) |
| | | const { form, rules, modelForm, modelRules } = toRefs(data) |
| | | // æ¥è¯¢äº§åæ |
| | | const getProductTreeList = () => { |
| | | treeLoad.value = true; |
| | | productTreeList().then(res => { |
| | | list.value = res |
| | | list.value.forEach((a) => { |
| | | expandedKeys.value.push(a.label); |
| | | }); |
| | | treeLoad.value = false; |
| | | }).catch(err => { |
| | | treeLoad.value = false; |
| | | }) |
| | | } |
| | | // è¿æ»¤äº§åæ |
| | | const searchFilter = () => { |
| | | proxy.$refs.tree.filter(search.value); |
| | | } |
| | | // æå¼äº§åå¼¹æ¡ |
| | | const openProDia = (type, data) => { |
| | | operationType.value = type; |
| | | productDia.value = true |
| | | form.value.productName = '' |
| | | if (type === 'edit') { |
| | | form.value.productName = data.productName |
| | | } |
| | | } |
| | | // æå¼è§æ ¼åå·å¼¹æ¡ |
| | | const openModelDia = (type, data) => { |
| | | modelOperationType.value = type; |
| | | modelDia.value = true |
| | | modelForm.value.model = '' |
| | | modelForm.value.model = '' |
| | | modelForm.value.id = '' |
| | | if (type === 'edit') { |
| | | modelForm.value = {...data} |
| | | } |
| | | } |
| | | // æäº¤äº§ååç§°ä¿®æ¹ |
| | | const submitForm = () => { |
| | | proxy.$refs.formRef.validate(valid => { |
| | | if (valid) { |
| | | if (operationType.value === 'add') { |
| | | form.value.parentId = currentId.value |
| | | form.value.id = '' |
| | | } else { |
| | | form.value.id = currentId.value |
| | | form.value.parentId = '' |
| | | } |
| | | addOrEditProduct(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("æäº¤æå") |
| | | closeProDia() |
| | | getProductTreeList() |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | // å
³é产åå¼¹æ¡ |
| | | const closeProDia = () => { |
| | | proxy.$refs.formRef.resetFields(); |
| | | productDia.value = false; |
| | | } |
| | | // å é¤äº§å |
| | | const remove = (node, data) => { |
| | | let ids = [] |
| | | ids.push(data.id) |
| | | ElMessageBox.confirm( |
| | | 'éä¸çå
容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', |
| | | 'å é¤æç¤º', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | tableLoading.value = true |
| | | delProduct(ids).then(res => { |
| | | proxy.$modal.msgSuccess("å 餿å") |
| | | getProductTreeList() |
| | | }).finally(() => { |
| | | tableLoading.value = false |
| | | }) |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已忶") |
| | | }) |
| | | } |
| | | // éæ©äº§å |
| | | const handleNodeClick = (val, node, el) => { |
| | | currentId.value = val.id |
| | | currentParentId.value = val.parentId |
| | | getModelList() |
| | | } |
| | | |
| | | |
| | | // æäº¤è§æ ¼åå·ä¿®æ¹ |
| | | const submitModelForm = () => { |
| | | proxy.$refs.modelFormRef.validate(valid => { |
| | | if (valid) { |
| | | modelForm.value.productId = currentId.value |
| | | addOrEditProductModel(modelForm.value).then(res => { |
| | | proxy.$modal.msgSuccess("æäº¤æå") |
| | | closeModelDia() |
| | | getModelList() |
| | | }) |
| | | } |
| | | }) |
| | | } |
| | | // å
³é产åå¼¹æ¡ |
| | | const closeModelDia = () => { |
| | | proxy.$refs.modelFormRef.resetFields(); |
| | | modelDia.value = false; |
| | | } |
| | | // è¡¨æ ¼éæ©æ°æ® |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection |
| | | } |
| | | |
| | | // æ¥è¯¢è§æ ¼åå· |
| | | const pagination = ({ current, limit }) => { |
| | | page.current = current; |
| | | page.size = limit; |
| | | getModelList() |
| | | } |
| | | const getModelList = () => { |
| | | tableLoading.value = true |
| | | modelList({id: currentId.value}).then(res => { |
| | | tableLoading.value = false |
| | | tableData.value = res |
| | | }) |
| | | } |
| | | // å é¤è§æ ¼åå· |
| | | const handleDelete = () => { |
| | | let ids = [] |
| | | if (selectedRows.value.length > 0) { |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning('è¯·éæ©æ°æ®') |
| | | return |
| | | } |
| | | ElMessageBox.confirm( |
| | | 'éä¸çå
容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', |
| | | 'å é¤æç¤º', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | tableLoading.value = true |
| | | delProductModel(ids).then(res => { |
| | | proxy.$modal.msgSuccess("å 餿å") |
| | | getModelList() |
| | | }).finally(() => { |
| | | tableLoading.value = false |
| | | }) |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已忶") |
| | | }) |
| | | } |
| | | // è°ç¨treeè¿æ»¤æ¹æ³ 䏿è±è¿æ»¤ |
| | | const filterNode = (value, data, node) => { |
| | | if (!value) {ãããã//å¦ææ°æ®ä¸ºç©ºï¼åè¿åtrue,æ¾ç¤ºææçæ°æ®é¡¹ |
| | | return true |
| | | } |
| | | // æ¥è¯¢å表æ¯å¦æå¹é
æ°æ®ï¼å°å¼å°åï¼å¹é
è±ææ°æ® |
| | | let val = value.toLowerCase() |
| | | return chooseNode(val, data, node) // è°ç¨è¿æ»¤äºå±æ¹æ³ |
| | | } |
| | | // è¿æ»¤ç¶èç¹ / åèç¹ (妿è¾å
¥çåæ°æ¯ç¶èç¹ä¸è½å¹é
ï¼åè¿å该èç¹ä»¥åå
¶ä¸çææåèç¹ï¼å¦æåæ°æ¯åèç¹ï¼åè¿å该èç¹çç¶èç¹ãnameæ¯ä¸æå符ï¼enNameæ¯è±æå符. |
| | | const chooseNode = (value, data, node) => { |
| | | if (data.label.indexOf(value) !== -1) { |
| | | return true |
| | | } |
| | | const level = node.level |
| | | // å¦æä¼ å
¥çèç¹æ¬èº«å°±æ¯ä¸çº§èç¹å°±ä¸ç¨æ ¡éªäº |
| | | if (level === 1) { |
| | | return false |
| | | } |
| | | // å
åå½åèç¹çç¶èç¹ |
| | | let parentData = node.parent |
| | | // éåå½åèç¹çç¶èç¹ |
| | | let index = 0 |
| | | while (index < level - 1) { |
| | | // 妿å¹é
å°ç´æ¥è¿åï¼æ¤å¤name弿¯ä¸æå符ï¼enNameæ¯è±æå符ã夿å¹é
ä¸è±æè¿æ»¤ |
| | | if (parentData.data.label.indexOf(value) !== -1) { |
| | | return true |
| | | } |
| | | // å¦åçè¯åå¾ä¸ä¸å±åå¹é
|
| | | parentData = parentData.parent |
| | | index++ |
| | | } |
| | | // 没å¹é
å°è¿åfalse |
| | | return false |
| | | } |
| | | getProductTreeList() |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .product-view { |
| | | display: flex; |
| | | } |
| | | .left { |
| | | width: 380px; |
| | | padding: 16px; |
| | | background: #ffffff; |
| | | } |
| | | .right { |
| | | width: calc(100% - 380px); |
| | | padding: 16px; |
| | | margin-left: 20px; |
| | | background: #ffffff; |
| | | } |
| | | .custom-tree-node { |
| | | flex: 1; |
| | | display: flex; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | font-size: 14px; |
| | | padding-right: 8px; |
| | | } |
| | | </style> |
| | |
| | | <el-table-column label="åä½" prop="unit" /> |
| | | <el-table-column label="æ°é" prop="quantity" /> |
| | | <el-table-column label="ç¨ç(%)" prop="taxRate" /> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" /> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" /> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" /> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="æ¬æ¬¡æ¥ç¥¨æ°" prop="ticketsNum" /> |
| | | <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å
)" prop="ticketsAmount" /> |
| | | <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å
)" prop="ticketsAmount" :formatter="formattedNumber"/> |
| | | <el-table-column label="æªæ¥ç¥¨æ°" prop="futureTickets" /> |
| | | <el-table-column label="æªæ¥ç¥¨éé¢(å
)" prop="futureTicketsAmount" /> |
| | | <el-table-column label="æªæ¥ç¥¨éé¢(å
)" prop="futureTicketsAmount" :formatter="formattedNumber"/> |
| | | </el-table> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column label="éè´ååå·" prop="purchaseContractNumber" show-overflow-tooltip/> |
| | | <el-table-column label="éå®ååå·" prop="salesContractNo" show-overflow-tooltip/> |
| | | <el-table-column label="ä¾åºååç§°" prop="supplierName" show-overflow-tooltip/> |
| | | <el-table-column label="ä¸å¡å" prop="businessPerson" show-overflow-tooltip/> |
| | | <el-table-column label="项ç®åç§°" prop="projectName" show-overflow-tooltip/> |
| | | <el-table-column label="ååéé¢(å
)" prop="contractAmount" show-overflow-tooltip/> |
| | | <el-table-column label="ååéé¢(å
)" prop="contractAmount" show-overflow-tooltip :formatter="formattedNumber"/> |
| | | <el-table-column fixed="right" label="æä½" min-width="60" align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> |
| | |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä¸å¡åï¼" prop="businessPersonId"> |
| | | <el-select v-model="form.businessPersonId" placeholder="èªå¨å¡«å
" clearable disabled> |
| | | <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> |
| | | </el-select> |
| | | <el-form-item label="å票å·ï¼" prop="invoiceNumber"> |
| | | <el-input v-model="form.invoiceNumber" placeholder="请è¾å
¥" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å票éé¢(å
)ï¼" prop="invoiceAmount"> |
| | | <el-input type="number" :step="0.01" v-model="form.invoiceAmount" placeholder="请è¾å
¥" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å¼ç¥¨äººï¼" prop="issUer"> |
| | | <el-input v-model="form.issUer" placeholder="请è¾å
¥" clearable disabled/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å¼ç¥¨æ¥æï¼" prop="issueDate"> |
| | | <el-date-picker |
| | | disabled |
| | | style="width: 100%" |
| | | v-model="form.issueDate" |
| | | value-format="YYYY-MM-DD" |
| | | format="YYYY-MM-DD" |
| | | type="date" |
| | | placeholder="è¯·éæ©" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | <el-form-item label="产åä¿¡æ¯ï¼" prop="entryDate"> |
| | | </el-form-item> |
| | | </el-row> |
| | | <el-table :data="productData" border @selection-change="productSelected"> |
| | | <el-table :data="productData" border @selection-change="productSelected" show-summary |
| | | :summary-method="summarizeChildrenTable"> |
| | | <el-table-column align="center" label="åºå·" type="index" width="60" /> |
| | | <el-table-column label="产å大类" prop="productCategory" /> |
| | | <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> |
| | | <el-table-column label="åä½" prop="unit" /> |
| | | <el-table-column label="æ°é" prop="quantity" /> |
| | | <el-table-column label="ç¨ç(%)" prop="taxRate" /> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" /> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" /> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" /> |
| | | <el-table-column label="æ¬æ¬¡æ¥ç¥¨æ°" prop="ticketsNum"> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="æ¬æ¬¡æ¥ç¥¨æ°" prop="ticketsNum" width="170"> |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.ticketsNum"></el-input> |
| | | <el-input-number v-model="scope.row.ticketsNum" :precision="0" :step="1" clearable style="width: 100%" @blur="invoiceNumBlur(scope.row)"/> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å
)" prop="ticketsAmount"> |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.ticketsAmount"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æªæ¥ç¥¨æ°" prop="futureTickets"> |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.futureTickets"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æªæ¥ç¥¨éé¢(å
)" prop="futureTicketsAmount"> |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.futureTicketsAmount"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column fixed="right" label="æä½" min-width="60" align="center"> |
| | | <template #default="scope"> |
| | | <el-button v-if="!scope.row.editFlag" link type="primary" size="small" @click="openProductEdit(scope.row);">ç¼è¾</el-button> |
| | | <el-button v-else link type="primary" size="small" @click="openProductEdit(scope.row);">ä¿å</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¬æ¬¡æ¥ç¥¨éé¢(å
)" prop="ticketsAmount" :formatter="formattedNumber"></el-table-column> |
| | | <el-table-column label="æªæ¥ç¥¨æ°" prop="futureTickets"></el-table-column> |
| | | <el-table-column label="æªæ¥ç¥¨éé¢(å
)" prop="futureTicketsAmount" :formatter="formattedNumber"> </el-table-column> |
| | | </el-table> |
| | | </el-form> |
| | | <template #footer> |
| | |
| | | tableLoading.value = false |
| | | }) |
| | | } |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | }; |
| | | // è¡¨æ ¼éæ©æ°æ® |
| | | const handleSelectionChange = (selection) => { |
| | | selectedRows.value = selection |
| | |
| | | } |
| | | // 主表åè®¡æ¹æ³ |
| | | const summarizeMainTable = (param) => { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = 'å计'; |
| | | return; |
| | | } |
| | | const prop = column.property; |
| | | if (['contractAmount'].includes(prop)) { |
| | | const values = data.map(item => Number(item[prop])); |
| | | if (!values.every(value => isNaN(value))) { |
| | | sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | }) |
| | | return sums; |
| | | return proxy.summarizeTable(param, ['contractAmount'], { |
| | | ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | }); |
| | | }; |
| | | // å表åè®¡æ¹æ³ |
| | | const summarizeChildrenTable = (param) => { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = 'å计'; |
| | | return; |
| | | } |
| | | const prop = column.property; |
| | | if (['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'].includes(prop)) { |
| | | const values = data.map(item => Number(item[prop])); |
| | | if (!values.every(value => isNaN(value))) { |
| | | sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | }); |
| | | return sums; |
| | | return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice', 'ticketsNum', 'ticketsAmount', 'futureTickets', 'futureTicketsAmount'],{ |
| | | ticketsNum: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | futureTickets: { noDecimal: true }, // ä¸ä¿çå°æ° |
| | | }); |
| | | } |
| | | // æå¼å¼¹æ¡ |
| | | const openForm = (type, row) => { |
| | |
| | | form.value.projectName = res.projectName |
| | | productData.value = res.productData |
| | | form.value.supplierName = res.supplierName |
| | | form.value.businessPersonId = res.businessPersonId |
| | | }) |
| | | } |
| | | // æäº¤è¡¨å |
| | |
| | | proxy.$modal.msg("已忶") |
| | | }) |
| | | } |
| | | //æ¬æ¬¡å¼ç¥¨å¤±ç¦æä½ |
| | | const invoiceNumBlur = (row) => { |
| | | if(!row.ticketsNum){ |
| | | row.ticketsNum = 0 |
| | | } |
| | | if(row.ticketsNum > row.futureTickets){ |
| | | proxy.$modal.msgWarning('æ¬æ¬¡å¼ç¥¨æ°ä¸å¾å¤§äºæªå¼ç¥¨æ°') |
| | | row.ticketsNum = 0 |
| | | } |
| | | row.futureTickets = row.futureTickets - row.ticketsNum |
| | | // è®¡ç®æ¬æ¬¡å¼ç¥¨éé¢ |
| | | row.ticketsAmount = row.ticketsNum * row.taxInclusiveUnitPrice |
| | | // è®¡ç®æªå¼ç¥¨æ° |
| | | row.futureTickets = row.futureTickets - row.ticketsNum |
| | | // è®¡ç®æªå¼ç¥¨éé¢ |
| | | row.futureTicketsAmount = row.futureTickets * row.taxInclusiveUnitPrice |
| | | } |
| | | getList() |
| | | </script> |
| | | |
| | |
| | | <el-table-column label="åä½" prop="unit" /> |
| | | <el-table-column label="æ°é" prop="quantity" /> |
| | | <el-table-column label="ç¨ç(%)" prop="taxRate" /> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" /> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" /> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" /> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber" /> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber" /> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber" /> |
| | | </el-table> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column label="éè´ååå·" prop="purchaseContractNumber" show-overflow-tooltip/> |
| | | <el-table-column label="éå®ååå·" prop="salesContractNo" show-overflow-tooltip/> |
| | | <el-table-column label="ä¾åºååç§°" prop="supplierName" show-overflow-tooltip/> |
| | | <el-table-column label="ä¸å¡å" prop="businessPerson" show-overflow-tooltip/> |
| | | <el-table-column label="项ç®åç§°" prop="projectName" show-overflow-tooltip/> |
| | | <el-table-column label="ååéé¢(å
)" prop="contractAmount" show-overflow-tooltip/> |
| | | <el-table-column label="ååéé¢(å
)" prop="contractAmount" show-overflow-tooltip :formatter="formattedNumber"/> |
| | | <el-table-column label="å½å
¥äºº" prop="recorderName" show-overflow-tooltip/> |
| | | <el-table-column label="å½å
¥æ¥æ" prop="entryDate" show-overflow-tooltip/> |
| | | <el-table-column fixed="right" label="æä½" min-width="60" align="center"> |
| | |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä¸å¡åï¼" prop="businessPersonId"> |
| | | <el-select v-model="form.businessPersonId" placeholder="è¯·éæ©" clearable @change="setPhone"> |
| | | <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="çµè¯ï¼" prop="phoneNumber"> |
| | | <el-input v-model="form.phoneNumber" placeholder="请è¾å
¥" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å½å
¥äººï¼" prop="recorderId"> |
| | | <el-select v-model="form.recorderId" placeholder="è¯·éæ©" clearable disabled> |
| | | <el-option v-for="item in userList" :key="item.userId" :label="item.nickName" :value="item.userId"/> |
| | |
| | | <el-button plain type="danger" @click="deleteProduct">å é¤</el-button> |
| | | </el-form-item> |
| | | </el-row> |
| | | <el-table :data="productData" border @selection-change="productSelected"> |
| | | <el-table :data="productData" border @selection-change="productSelected" show-summary :summary-method="summarizeProTable"> |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="åºå·" type="index" width="60" /> |
| | | <el-table-column label="产å大类" prop="productCategory" /> |
| | |
| | | <el-table-column label="åä½" prop="unit" /> |
| | | <el-table-column label="æ°é" prop="quantity" /> |
| | | <el-table-column label="ç¨ç(%)" prop="taxRate" /> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" /> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" /> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" /> |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" :formatter="formattedNumber"/> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" :formatter="formattedNumber"/> |
| | | <el-table-column fixed="right" label="æä½" min-width="60" align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row);">ç¼è¾</el-button> |
| | | <el-button link type="primary" size="small" @click="openProductForm('edit', scope.row, scope.$index);">ç¼è¾</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | <el-form :model="productForm" label-width="140px" label-position="top" :rules="productRules" ref="productFormRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="产å大类ï¼" prop="productCategory"> |
| | | <el-select v-model="productForm.productCategory" placeholder="è¯·éæ©" clearable> |
| | | <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> |
| | | </el-select> |
| | | <el-form-item label="产å大类ï¼" prop="productId"> |
| | | <el-tree-select |
| | | v-model="productForm.productId" |
| | | placeholder="è¯·éæ©" clearable |
| | | check-strictly |
| | | @change="getModels" |
| | | :data="productOptions" |
| | | :render-after-expand="false" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="24"> |
| | | <el-form-item label="è§æ ¼åå·ï¼" prop="specificationModel"> |
| | | <el-select v-model="productForm.specificationModel" placeholder="è¯·éæ©" clearable> |
| | | <el-option v-for="item in userList" :key="item.nickName" :label="item.nickName" :value="item.nickName"/> |
| | | <el-form-item label="è§æ ¼åå·ï¼" prop="productModelId"> |
| | | <el-select v-model="productForm.productModelId" placeholder="è¯·éæ©" clearable @change="getProductModel"> |
| | | <el-option v-for="item in modelOptions" :key="item.id" :label="item.model" :value="item.id"/> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å«ç¨åä»·(å
)ï¼" prop="taxInclusiveUnitPrice"> |
| | | <el-input v-model="productForm.taxInclusiveUnitPrice" placeholder="请è¾å
¥" clearable/> |
| | | <el-input-number v-model="productForm.taxInclusiveUnitPrice" :precision="2" :step="0.1" clearable style="width: 100%"/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å«ç¨æ»ä»·(å
)ï¼" prop="taxInclusiveTotalPrice"> |
| | | <el-input v-model="productForm.taxInclusiveTotalPrice" placeholder="请è¾å
¥" clearable/> |
| | | <el-input-number v-model="productForm.taxInclusiveTotalPrice" :precision="2" :step="0.1" clearable style="width: 100%" @change="mathNum"/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ä¸å«ç¨æ»ä»·(å
)ï¼" prop="taxExclusiveTotalPrice"> |
| | | <el-input v-model="productForm.taxExclusiveTotalPrice" placeholder="请è¾å
¥" clearable/> |
| | | <el-input v-model="productForm.taxExclusiveTotalPrice" disabled/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | const productData = ref([]) |
| | | const selectedRows = ref([]) |
| | | const productSelectedRows = ref([]) |
| | | const modelOptions = ref([]) |
| | | const userList = ref([]) |
| | | const productOptions = ref([]) |
| | | const salesContractList = ref([]) |
| | | const supplierList = ref([]) |
| | | const tableLoading = ref(false) |
| | |
| | | const total = ref(0) |
| | | const fileList = ref([]) |
| | | import useUserStore from "@/store/modules/user" |
| | | import {modelList, productTreeList} from "@/api/basicData/product.js"; |
| | | |
| | | const userStore = useUserStore() |
| | | |
| | |
| | | recorderId: '', |
| | | entryDate: '', |
| | | productData: [], |
| | | businessPersonId: '', |
| | | phoneNumber: '', |
| | | supplierName: '', |
| | | supplierId: '', |
| | | }, |
| | |
| | | purchaseContractNumber: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | salesLedgerId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], |
| | | projectName: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | businessPersonId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], |
| | | phoneNumber: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | supplierId: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | } |
| | | }) |
| | |
| | | // 产å表åå¼¹æ¡æ°æ® |
| | | const productFormVisible = ref(false) |
| | | const productOperationType = ref('') |
| | | const productOperationIndex = ref('') |
| | | const currentId = ref('') |
| | | const productFormData = reactive({ |
| | | productForm: { |
| | | productId: '', |
| | | productCategory: '', |
| | | productModelId: '', |
| | | specificationModel: '', |
| | | unit: '', |
| | | quantity: '', |
| | |
| | | invoiceType: '', |
| | | }, |
| | | productRules: { |
| | | productCategory: [{ required: true, message: "è¯·éæ©", trigger: "change" }], |
| | | specificationModel: [{ required: true, message: "è¯·éæ©", trigger: "change" }], |
| | | productId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], |
| | | productModelId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], |
| | | unit: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | quantity: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | | taxInclusiveUnitPrice: [{ required: true, message: "请è¾å
¥", trigger: "blur" }], |
| | |
| | | headers: { Authorization: "Bearer " + getToken() }, |
| | | }) |
| | | |
| | | |
| | | const formattedNumber = (row, column, cellValue) => { |
| | | return parseFloat(cellValue).toFixed(2); |
| | | }; |
| | | // æ¥è¯¢å表 |
| | | /** æç´¢æé®æä½ */ |
| | | const handleQuery = () => { |
| | |
| | | } |
| | | // 主表åè®¡æ¹æ³ |
| | | const summarizeMainTable = (param) => { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = 'å计'; |
| | | return; |
| | | } |
| | | const prop = column.property; |
| | | if (['contractAmount'].includes(prop)) { |
| | | const values = data.map(item => Number(item[prop])); |
| | | if (!values.every(value => isNaN(value))) { |
| | | sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | }) |
| | | return sums; |
| | | return proxy.summarizeTable(param, ['contractAmount']); |
| | | }; |
| | | // å表åè®¡æ¹æ³ |
| | | const summarizeChildrenTable = (param) => { |
| | | const { columns, data } = param; |
| | | const sums = []; |
| | | columns.forEach((column, index) => { |
| | | if (index === 0) { |
| | | sums[index] = 'å计'; |
| | | return; |
| | | } |
| | | const prop = column.property; |
| | | if (['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice'].includes(prop)) { |
| | | const values = data.map(item => Number(item[prop])); |
| | | if (!values.every(value => isNaN(value))) { |
| | | sums[index] = values.reduce((acc, val) => (!isNaN(val) ? acc + val : acc), 0); |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | } else { |
| | | sums[index] = ''; |
| | | } |
| | | }); |
| | | return sums; |
| | | } |
| | | const summarizeProTable = (param) => { |
| | | return proxy.summarizeTable(param, ['taxInclusiveUnitPrice', 'taxInclusiveTotalPrice', 'taxExclusiveTotalPrice']); |
| | | }; |
| | | // æå¼å¼¹æ¡ |
| | | const openForm = (type, row) => { |
| | | operationType.value = type |
| | |
| | | }) |
| | | } |
| | | dialogFormVisible.value = true |
| | | } |
| | | // èµå¼çµè¯ |
| | | const setPhone = (id) => { |
| | | form.value.phoneNumber = userList.value.find(u => u.userId === id)?.phonenumber || ''; |
| | | } |
| | | // ä¸ä¼ åæ ¡æ£ |
| | | function handleBeforeUpload(file) { |
| | |
| | | dialogFormVisible.value = false |
| | | } |
| | | // æå¼äº§åå¼¹æ¡ |
| | | const openProductForm = (type, row) => { |
| | | const openProductForm = (type, row, index) => { |
| | | productOperationType.value = type |
| | | productOperationIndex.value = index |
| | | productForm.value = {} |
| | | proxy.resetForm("productFormRef") |
| | | if (type === 'edit') { |
| | | productForm.value = {...row} |
| | | } |
| | | productFormVisible.value = true |
| | | getProductOptions() |
| | | } |
| | | const getProductOptions = () => { |
| | | productTreeList().then(res => { |
| | | productOptions.value = convertIdToValue(res) |
| | | }) |
| | | } |
| | | const getModels =(value) => { |
| | | productForm.value.productCategory = findNodeById(productOptions.value, value) |
| | | modelList({id: value}).then(res => { |
| | | modelOptions.value = res |
| | | }) |
| | | } |
| | | const getProductModel =(value) => { |
| | | const index = modelOptions.value.findIndex(item => item.id === value); |
| | | if (index !== -1) { |
| | | productForm.value.specificationModel = modelOptions.value[index].model; |
| | | } else { |
| | | productForm.value.specificationModel = null; |
| | | } |
| | | } |
| | | const findNodeById = (nodes, productId) => { |
| | | for (let i = 0; i < nodes.length; i++) { |
| | | if (nodes[i].value === productId) { |
| | | return nodes[i].label; // æ¾å°èç¹ï¼è¿å该èç¹ |
| | | } |
| | | if (nodes[i].children && nodes[i].children.length > 0) { |
| | | const foundNode = findNodeById(nodes[i].children, productId); |
| | | if (foundNode) { |
| | | return foundNode.label; // å¨åèç¹ä¸æ¾å°ï¼è¿å该èç¹ |
| | | } |
| | | } |
| | | } |
| | | return null; // æ²¡ææ¾å°èç¹ï¼è¿ånull |
| | | }; |
| | | function convertIdToValue(data) { |
| | | return data.map(item => { |
| | | const { id, children, ...rest } = item; |
| | | const newItem = { |
| | | ...rest, |
| | | value: id // å° id æ¹ä¸º value |
| | | }; |
| | | if (children && children.length > 0) { |
| | | newItem.children = convertIdToValue(children); |
| | | } |
| | | |
| | | return newItem; |
| | | }); |
| | | } |
| | | // æäº¤äº§å表å |
| | | const submitProduct = () => { |
| | |
| | | if (operationType.value === "edit") { |
| | | submitProductEdit() |
| | | } else { |
| | | productData.value.push({...productForm.value}) |
| | | if (productOperationType.value === 'add') { |
| | | productData.value.push({...productForm.value}) |
| | | console.log('productData.value---', productData.value) |
| | | } else { |
| | | productData.value[productOperationIndex.value] = {...productForm.value} |
| | | } |
| | | closeProductDia() |
| | | } |
| | | } |
| | |
| | | const day = String(today.getDate()).padStart(2, '0'); |
| | | return `${year}-${month}-${day}`; |
| | | } |
| | | const mathNum = (val) => { |
| | | productForm.value.taxExclusiveTotalPrice = proxy.calculateTaxExclusiveTotalPrice(val, productForm.value.taxRate) |
| | | } |
| | | getList() |
| | | </script> |
| | | |
| | |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button type="primary" @click="openForm('add')">æ°å¢å°è´¦</el-button> |
| | | <el-button @click="handleOut">导åº</el-button> |
| | | <el-button type="danger" plain @click="handleDelete">å é¤</el-button> |
| | | <el-button @click="handleOut" type="primary" style="width: 100px">导åº</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | |
| | | <el-table-column label="éå®ååå·" prop="salesContractNo" show-overflow-tooltip/> |
| | | <el-table-column label="客æ·ååå·" prop="customerContractNo" show-overflow-tooltip/> |
| | | <el-table-column label="客æ·åç§°" prop="customerName" show-overflow-tooltip/> |
| | | <el-table-column label="产å大类" prop="productCategory" /> |
| | | <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> |
| | | <el-table-column label="å票å·" prop="invoiceNo" show-overflow-tooltip/> |
| | | <el-table-column label="å票éé¢(å
)" prop="invoiceAmount" show-overflow-tooltip/> |
| | | <el-table-column label="å票éé¢(å
)" prop="invoiceTotal" show-overflow-tooltip/> |
| | | <el-table-column label="ç¨ç" prop="taxRate" show-overflow-tooltip/> |
| | | <el-table-column label="å¼ç¥¨äºº" prop="invoicePerson" show-overflow-tooltip/> |
| | | <el-table-column label="å¼ç¥¨æ¥æ" prop="invoiceDate" show-overflow-tooltip/> |
| | |
| | | </el-table-column> |
| | | <el-table-column fixed="right" label="æä½" min-width="60" align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> |
| | | <el-button link type="primary" size="small" @click="openForm(scope.row);">ç¼è¾</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" |
| | | :limit="page.size" @pagination="paginationChange" /> |
| | | </div> |
| | | <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢å¼ç¥¨å°è´¦é¡µé¢' : 'ç¼è¾å¼ç¥¨å°è´¦é¡µé¢'" width="70%" @close="closeDia"> |
| | | <el-dialog v-model="dialogFormVisible" title="å¼ç¥¨å°è´¦é¡µé¢" width="70%" @close="closeDia"> |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éå®ååå·ï¼" prop="salesLedgerId"> |
| | | <el-select v-model="form.salesLedgerId" placeholder="è¯·éæ©" clearable @change="ledgerChange" :disabled="operationType === 'edit'"> |
| | | <el-option v-for="item in ledgerList" :key="item.id" :label="item.salesContractNo" :value="item.id"/> |
| | | </el-select> |
| | | <el-form-item label="éå®ååå·ï¼" prop="salesContractNo"> |
| | | <el-input v-model="form.salesContractNo" disabled></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="客æ·åç§°ï¼" prop="customerName"> |
| | | <el-input v-model="form.customerName" placeholder="èªå¨å¡«å
" clearable :disabled="operationType === 'edit'"/> |
| | | <el-input v-model="form.customerName" placeholder="èªå¨å¡«å
" clearable disabled/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å票éé¢(å
)ï¼" prop="invoiceAmount"> |
| | | <el-input type="number" :step="0.01" v-model="form.invoiceAmount" placeholder="请è¾å
¥" clearable/> |
| | | <el-form-item label="å票éé¢(å
)ï¼" prop="invoiceTotal"> |
| | | <el-input type="number" :step="0.01" v-model="form.invoiceTotal" placeholder="请è¾å
¥" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="ç¨çï¼" prop="taxRate"> |
| | | <el-input type="number" :step="0.01" v-model="form.taxRate" placeholder="请è¾å
¥" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å¼ç¥¨äººï¼" prop="invoicePerson"> |
| | | <el-input v-model="form.invoicePerson" placeholder="请è¾å
¥" clearable/> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å¼ç¥¨æ¥æï¼" prop="invoiceDate"> |
| | | <el-date-picker |
| | |
| | | import { ref } from 'vue' |
| | | import {Search} from "@element-plus/icons-vue"; |
| | | import {ElMessageBox } from "element-plus"; |
| | | import { |
| | | getSalesLedgerWithProducts, |
| | | ledgerListNoPage |
| | | } from "@/api/salesManagement/salesLedger.js"; |
| | | import { getToken } from "@/utils/auth" |
| | | import { |
| | | invoiceLedgerList, |
| | | invoiceLedgerDel, |
| | | invoiceLedgerSaveOrUpdate, |
| | | invoiceLedgerDetail, |
| | | invoiceLedgerProductInfo, |
| | | commitFile, |
| | | registrationProductPage |
| | | } from "../../../api/salesManagement/invoiceLedger.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const tableData = ref([]) |
| | |
| | | }) |
| | | const total = ref(0) |
| | | const fileList = ref([]) |
| | | const ledgerList = ref([]) |
| | | // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® |
| | | const operationType = ref('') |
| | | const dialogFormVisible = ref(false) |
| | | const data = reactive({ |
| | | searchForm: { |
| | |
| | | salesLedgerId: '', |
| | | customerId: '', |
| | | invoiceNo: '', |
| | | invoiceAmount: '', |
| | | invoiceTotal: '', |
| | | taxRate: '', |
| | | invoicePerson: '', |
| | | invoiceDate: '', |
| | |
| | | } |
| | | const getList = () => { |
| | | tableLoading.value = true |
| | | invoiceLedgerList({...searchForm.value, ...page}).then(res => { |
| | | registrationProductPage({...searchForm.value, ...page}).then(res => { |
| | | tableLoading.value = false |
| | | tableData.value = res.data.records; |
| | | total.value = res.data.total; |
| | |
| | | return sums; |
| | | }; |
| | | // æå¼å¼¹æ¡ |
| | | const openForm = (type, row) => { |
| | | operationType.value = type |
| | | const openForm = (row) => { |
| | | form.value = {} |
| | | productData.value = [] |
| | | fileList.value = [] |
| | | // æ¥è¯¢éå®åå |
| | | ledgerListNoPage({}).then(res => { |
| | | ledgerList.value = res.data; |
| | | currentId.value = row.id; |
| | | invoiceLedgerProductInfo({id: row.id}).then(res => { |
| | | form.value = {...res.data} |
| | | fileList.value = res.data.fileList; |
| | | }) |
| | | if (type === 'edit') { |
| | | currentId.value = row.id; |
| | | invoiceLedgerDetail({id: row.id}).then(res => { |
| | | form.value = {...res.data} |
| | | fileList.value = res.data.fileList; |
| | | }) |
| | | } |
| | | dialogFormVisible.value = true |
| | | } |
| | | // ä¸ä¼ å¤ä¸ªæä»¶å°±è¦ç忥ç |
| | |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已忶") |
| | | }) |
| | | } |
| | | // å é¤ |
| | | const handleDelete = () => { |
| | | let ids = [] |
| | | if (selectedRows.value.length > 0) { |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning('è¯·éæ©æ°æ®') |
| | | return |
| | | } |
| | | ElMessageBox.confirm( |
| | | 'éä¸çå
容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', |
| | | '导åº', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | invoiceLedgerDel(ids).then(res => { |
| | | proxy.$modal.msgSuccess("å 餿å") |
| | | getList() |
| | | }) |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已忶") |
| | | }) |
| | | } |
| | | |
| | | // éå®å°è´¦çé |
| | | const ledgerChange = (val) => { |
| | | if(val){ |
| | | getSalesLedgerWithProducts({id: val}).then(res => { |
| | | form.value = { |
| | | salesLedgerId: res.id, |
| | | customerName: res.customerName, |
| | | customerId: res.customerId, |
| | | salesContractNo: res.salesContractNo |
| | | } |
| | | }) |
| | | }else { |
| | | form.value.salesLedgerId = '' |
| | | form.value.customerName = '' |
| | | form.value.customerId = '' |
| | | } |
| | | } |
| | | |
| | | // æå¼éä»¶ä¸ä¼ å¼¹çª |
| | |
| | | <el-button type="primary" @click="handleQuery" style="margin-left: 10px">æç´¢</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button type="primary" @click="openForm('add')">æ°å¢ç»è®°</el-button> |
| | | <el-button type="primary" @click="openForm">æ°å¢ç»è®°</el-button> |
| | | <el-button @click="handleOut">导åº</el-button> |
| | | <el-button type="danger" plain @click="handleDelete">å é¤</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" /> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" /> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" /> |
| | | <el-table-column label="æ¬æ¬¡å¼ç¥¨æ°" prop="invoiceNum" /> |
| | | <el-table-column label="æ¬æ¬¡å¼ç¥¨éé¢(å
)" prop="invoiceAmount" /> |
| | | <el-table-column label="æªå¼ç¥¨æ°(å
)" prop="noInvoiceNum" /> |
| | | <el-table-column label="æªå¼ç¥¨éé¢(å
)" prop="noInvoiceAmount" /> |
| | | <el-table-column label="å¼ç¥¨æ°" prop="invoiceNum" /> |
| | | <el-table-column label="å¼ç¥¨éé¢(å
)" prop="invoiceAmount" /> |
| | | <el-table-column label="æªå¼ç¥¨æ°" prop="noInvoiceNum" /> |
| | | <el-table-column label="æªå¼ç¥¨éé¢(å
)" prop="noInvoiceAmount"/> |
| | | </el-table> |
| | | </template> |
| | | </el-table-column> |
| | |
| | | <el-table-column label="ä¸å¡å" prop="salesman" show-overflow-tooltip/> |
| | | <el-table-column label="项ç®åç§°" prop="projectName" show-overflow-tooltip/> |
| | | <el-table-column label="ååéé¢(å
)" prop="contractAmount" show-overflow-tooltip/> |
| | | <el-table-column fixed="right" label="æä½" min-width="60" align="center"> |
| | | <template #default="scope"> |
| | | <el-button link type="primary" size="small" @click="openForm('edit', scope.row);">ç¼è¾</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æªå¼ç¥¨éé¢(å
)" prop="noInvoiceAmountTotal" show-overflow-tooltip/> |
| | | </el-table> |
| | | <pagination v-show="total > 0" :total="total" layout="total, sizes, prev, pager, next, jumper" :page="page.current" |
| | | :limit="page.size" @pagination="paginationChange" /> |
| | | </div> |
| | | <el-dialog v-model="dialogFormVisible" :title="operationType === 'add' ? 'æ°å¢å¼ç¥¨ç»è®°é¡µé¢' : 'ç¼è¾å¼ç¥¨ç»è®°é¡µé¢'" width="70%" @close="closeDia"> |
| | | <el-dialog v-model="dialogFormVisible" title="æ°å¢å¼ç¥¨ç»è®°é¡µé¢" width="85%" @close="closeDia"> |
| | | <el-form :model="form" label-width="140px" label-position="top" :rules="rules" ref="formRef"> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éå®ååå·ï¼" prop="salesLedgerId"> |
| | | <el-select v-model="form.salesLedgerId" placeholder="è¯·éæ©" clearable @change="ledgerChange" :disabled="operationType === 'edit'"> |
| | | <el-option v-for="item in ledgerList" :key="item.id" :label="item.salesContractNo" :value="item.id"/> |
| | | </el-select> |
| | | <el-form-item label="éå®ååå·ï¼" prop="salesContractNo"> |
| | | <el-input v-model="form.salesContractNo" disabled></el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | |
| | | <el-form-item label="产åä¿¡æ¯ï¼" prop="entryDate"> |
| | | </el-form-item> |
| | | </el-row> |
| | | <el-table :data="productData" border> |
| | | <el-table :data="productData" border show-summary :summary-method="summarizeChildrenTable"> |
| | | <el-table-column align="center" label="åºå·" type="index" width="60" /> |
| | | <el-table-column label="产å大类" prop="productCategory" /> |
| | | <el-table-column label="è§æ ¼åå·" prop="specificationModel" /> |
| | |
| | | <el-table-column label="å«ç¨åä»·(å
)" prop="taxInclusiveUnitPrice" /> |
| | | <el-table-column label="å«ç¨æ»ä»·(å
)" prop="taxInclusiveTotalPrice" /> |
| | | <el-table-column label="ä¸å«ç¨æ»ä»·(å
)" prop="taxExclusiveTotalPrice" /> |
| | | <el-table-column label="æ¬æ¬¡å¼ç¥¨æ°" prop="invoiceNum"> |
| | | <el-table-column label="æ¬æ¬¡å¼ç¥¨æ°" prop="currentInvoiceNum"> |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.invoiceNum"></el-input> |
| | | <el-input type="number" :step="1" min="0" v-model="scope.row.currentInvoiceNum" @blur="invoiceNumBlur(scope.row)"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¬æ¬¡å¼ç¥¨éé¢(å
)" prop="invoiceAmount" > |
| | | <el-table-column label="æ¬æ¬¡å¼ç¥¨éé¢(å
)" prop="currentInvoiceAmount" > |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.invoiceAmount"></el-input> |
| | | <el-input type="number" :step="0.01" min="0" v-model="scope.row.currentInvoiceAmount" disabled></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æªå¼ç¥¨æ°(å
)" prop="noInvoiceNum" > |
| | | <el-table-column label="æªå¼ç¥¨æ°" prop="noInvoiceNum" > |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.noInvoiceNum"></el-input> |
| | | <el-input type="number" min="0" disabled v-model="scope.row.noInvoiceNum"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æªå¼ç¥¨éé¢(å
)" prop="noInvoiceAmount" > |
| | | <template #default="scope"> |
| | | <el-input :disabled="!scope.row.editFlag" v-model="scope.row.noInvoiceAmount"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column fixed="right" label="æä½" min-width="60" align="center"> |
| | | <template #default="scope"> |
| | | <el-button v-if="!scope.row.editFlag" link type="primary" size="small" @click="openProductEdit(scope.row);">ç¼è¾</el-button> |
| | | <el-button v-else link type="primary" size="small" @click="openProductEdit(scope.row);">ä¿å</el-button> |
| | | <el-input type="number" min="0" disabled v-model="scope.row.noInvoiceAmount"></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | |
| | | import {ElMessageBox } from "element-plus"; |
| | | // import {userListNoPage} from "@/api/system/user.js"; |
| | | import { |
| | | ledgerListNoPage, |
| | | getSalesLedgerWithProducts, |
| | | ledgerList, |
| | | productList, |
| | | } from "@/api/salesManagement/salesLedger.js"; |
| | | import { |
| | | invoiceRegistrationList, |
| | | invoiceRegistrationSaveOrUpdate, |
| | | invoiceRegistrationDel, |
| | | productList, |
| | | invoiceRegistrationDetail, |
| | | invoiceRegistrationSave, |
| | | } from "@/api/salesManagement/invoiceRegistration.js"; |
| | | const { proxy } = getCurrentInstance() |
| | | const tableData = ref([]) |
| | |
| | | size: 10, |
| | | }) |
| | | const total = ref(0) |
| | | const ledgerList = ref([]) |
| | | // ç¨æ·ä¿¡æ¯è¡¨åå¼¹æ¡æ°æ® |
| | | const operationType = ref('') |
| | | const dialogFormVisible = ref(false) |
| | |
| | | } |
| | | }) |
| | | const { searchForm, form, rules } = toRefs(data) |
| | | // 产å表åå¼¹æ¡æ°æ® |
| | | const productFormData = reactive({ |
| | | productForm: { |
| | | productCategory: '', |
| | | specificationModel: '', |
| | | unit: '', |
| | | quantity: '', |
| | | taxInclusiveUnitPrice: '', |
| | | taxRate: '', |
| | | taxInclusiveTotalPrice: '', |
| | | taxExclusiveTotalPrice: '', |
| | | invoiceType: '', |
| | | }, |
| | | }) |
| | | const { productForm } = toRefs(productFormData) |
| | | |
| | | // æ¥è¯¢å表 |
| | | /** æç´¢æé®æä½ */ |
| | |
| | | } |
| | | const getList = () => { |
| | | tableLoading.value = true |
| | | invoiceRegistrationList({...searchForm.value, ...page}).then(res => { |
| | | ledgerList({...searchForm.value, ...page}).then(res => { |
| | | tableLoading.value = false |
| | | tableData.value = res.data.records; |
| | | tableData.value.map(item => { |
| | | item.children = [] |
| | | }) |
| | | total.value = res.data.total |
| | | tableData.value = res.rows; |
| | | total.value = res.total |
| | | expandedRowKeys.value = [] |
| | | }) |
| | | } |
| | | // è¡¨æ ¼éæ©æ°æ® |
| | | const handleSelectionChange = (selection) => { |
| | | console.log('selection', selection) |
| | | selectedRows.value = selection |
| | | } |
| | | const expandedRowKeys = ref([]) |
| | |
| | | if (expandedRows.length > 0) { |
| | | expandedRowKeys.value = [] |
| | | try { |
| | | productList({invoiceRegistrationId: row.id}).then(res => { |
| | | productList({salesLedgerId: row.id, |
| | | type: 1 }).then(res => { |
| | | const index = tableData.value.findIndex(item => item.id === row.id); |
| | | if (index > -1) { |
| | | tableData.value[index].children = res.data; |
| | | tableData.value[index].children = res; |
| | | } |
| | | expandedRowKeys.value.push(row.id) |
| | | }) |
| | |
| | | return sums; |
| | | } |
| | | // æå¼å¼¹æ¡ |
| | | const openForm = (type, row) => { |
| | | operationType.value = type |
| | | const openForm = () => { |
| | | // 夿æ¯å¦å¤é |
| | | if(selectedRows.value.length != 1) { |
| | | proxy.$modal.msgError("è¯·éæ©ä¸æ¡åå") |
| | | return; |
| | | } |
| | | form.value = {} |
| | | productData.value = [] |
| | | // æ¥è¯¢éå®åå |
| | | ledgerListNoPage({}).then(res => { |
| | | ledgerList.value = res.data; |
| | | }) |
| | | if (type === 'edit') { |
| | | invoiceRegistrationDetail({id: row.id}).then(res => { |
| | | form.value = {...res.data} |
| | | form.value.productDtoList = res.data.productDtoList |
| | | productData.value = form.value.productDtoList |
| | | getSalesLedgerWithProducts({id: selectedRows.value[0].id}).then(res => { |
| | | form.value = {...res} |
| | | productData.value = form.value.productData.map(item => { |
| | | return item |
| | | }) |
| | | } |
| | | dialogFormVisible.value = true |
| | | dialogFormVisible.value = true |
| | | console.log('productData.value ',productData.value ) |
| | | }) |
| | | |
| | | } |
| | | // æäº¤è¡¨å |
| | | const submitForm = () => { |
| | | proxy.$refs["formRef"].validate(valid => { |
| | | if (valid) { |
| | | form.value.productDtoList = proxy.HaveJson(productData.value) |
| | | form.value.productDtoList.forEach(item => { |
| | | item.id = '' |
| | | }) |
| | | delete form.value.productData |
| | | invoiceRegistrationSaveOrUpdate(form.value).then(res => { |
| | | form.value.productData = proxy.HaveJson(productData.value) |
| | | invoiceRegistrationSave(form.value).then(res => { |
| | | proxy.$modal.msgSuccess("æäº¤æå") |
| | | closeDia() |
| | | getList() |
| | |
| | | const closeDia = () => { |
| | | proxy.resetForm("formRef") |
| | | dialogFormVisible.value = false |
| | | } |
| | | // æå¼äº§åå¼¹æ¡ |
| | | const openProductEdit = (row) => { |
| | | const index = productData.value.findIndex(item => item.id === row.id); |
| | | if (index > -1) { |
| | | productData.value[index].editFlag = !productData.value[index].editFlag |
| | | } |
| | | } |
| | | // å¯¼åº |
| | | const handleOut = () => { |
| | |
| | | proxy.$modal.msg("已忶") |
| | | }) |
| | | } |
| | | // å é¤ |
| | | const handleDelete = () => { |
| | | let ids = [] |
| | | if (selectedRows.value.length > 0) { |
| | | ids = selectedRows.value.map(item => item.id); |
| | | } else { |
| | | proxy.$modal.msgWarning('è¯·éæ©æ°æ®') |
| | | return |
| | | |
| | | //æ¬æ¬¡å¼ç¥¨å¤±ç¦æä½ |
| | | const invoiceNumBlur = (row) => { |
| | | if(!row.currentInvoiceNum){ |
| | | row.currentInvoiceNum = 0 |
| | | } |
| | | ElMessageBox.confirm( |
| | | 'éä¸çå
容å°è¢«å é¤ï¼æ¯å¦ç¡®è®¤å é¤ï¼', |
| | | '导åº', { |
| | | confirmButtonText: '确认', |
| | | cancelButtonText: 'åæ¶', |
| | | type: 'warning', |
| | | } |
| | | ).then(() => { |
| | | invoiceRegistrationDel(ids).then(res => { |
| | | proxy.$modal.msgSuccess("å 餿å") |
| | | getList() |
| | | }) |
| | | }).catch(() => { |
| | | proxy.$modal.msg("已忶") |
| | | }) |
| | | } |
| | | // éå®å°è´¦çé |
| | | const ledgerChange = (val) => { |
| | | if(val){ |
| | | getSalesLedgerWithProducts({id: val}).then(res => { |
| | | form.value = { |
| | | salesLedgerId: res.id, |
| | | customerName: res.customerName, |
| | | salesman: res.salesman, |
| | | projectName: res.projectName, |
| | | productData: res.productData, |
| | | salesContractNo: res.salesContractNo, |
| | | customerId: res.customerId, |
| | | } |
| | | productData.value = form.value.productData.map(item => { |
| | | item.editFlag = false |
| | | return item |
| | | }) |
| | | }) |
| | | }else { |
| | | proxy.resetForm("formRef") |
| | | productData.value = [] |
| | | if(row.currentInvoiceNum > row.noInvoiceNum){ |
| | | proxy.$modal.msgWarning('æ¬æ¬¡å¼ç¥¨æ°ä¸å¾å¤§äºæªå¼ç¥¨æ°') |
| | | row.currentInvoiceNum = 0 |
| | | } |
| | | // è®¡ç®æ¬æ¬¡å¼ç¥¨éé¢ |
| | | row.currentInvoiceAmount = row.currentInvoiceNum * row.taxInclusiveUnitPrice |
| | | // è®¡ç®æªå¼ç¥¨æ° |
| | | row.noInvoiceNum = row.noInvoiceNum - row.currentInvoiceNum |
| | | // è®¡ç®æªå¼ç¥¨éé¢ |
| | | row.noInvoiceAmount = row.noInvoiceNum * row.taxInclusiveUnitPrice |
| | | } |
| | | |
| | | getList() |
| | | </script> |
| | | |