| 9 天以前 | huminmin | ![]() |
| 9 天以前 | huminmin | ![]() |
| 9 天以前 | huminmin | ![]() |
| 9 天以前 | gongchunyi | ![]() |
| 9 天以前 | huminmin | ![]() |
| src/api/basicData/enum.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/api/productionManagement/productionOrder.js | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/dispatchLog/Record.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/receiptManagement/Record.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/inventoryManagement/stockReport/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/productionOrder/New.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/productionManagement/productionOrder/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/receiptPayment/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 | |
| src/views/salesManagement/salesLedger/index.vue | ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史 |
src/api/basicData/enum.js
@@ -7,17 +7,35 @@ }) } export function findAllQualifiedStockRecordTypeOptions() { // åæ ¼å ¥åºæ¥æºç±»å export function findAllQualifiedStockInRecordTypeOptions() { return request({ url: '/basic/enum/StockQualifiedRecordTypeEnum', url: '/basic/enum/StockInQualifiedRecordTypeEnum', method: 'get' }) } export function findAllUnqualifiedStockRecordTypeOptions() { // ä¸åæ ¼å ¥åºæ¥æºç±»å export function findAllUnQualifiedStockInRecordTypeOptions() { return request({ url: '/basic/enum/StockUnQualifiedRecordTypeEnum', url: '/basic/enum/StockInUnQualifiedRecordTypeEnum', method: 'get' }) } // åæ ¼åºåºæ¥æºç±»å export function findAllQualifiedStockOutRecordTypeOptions() { return request({ url: '/basic/enum/StockOutQualifiedRecordTypeEnum', method: 'get' }) } // ä¸åæ ¼åºåºæ¥æºç±»å export function findAllUnQualifiedStockOutRecordTypeOptions() { return request({ url: '/basic/enum/StockOutUnQualifiedRecordTypeEnum', method: 'get' }) } src/api/productionManagement/productionOrder.js
@@ -36,6 +36,22 @@ }); } // ç产订å-æ°å¢ export function addProductOrder(data) { return request({ url: "/productOrder/addProductOrder", method: "post", data: data, }); } export function delProductOrder(ids) { return request({ url: `/productOrder/${ids}`, method: "delete", }); } // ç产订å-æ¥è¯¢äº§åç»æå表 export function listProcessBom(query) { return request({ src/views/inventoryManagement/dispatchLog/Record.vue
@@ -112,9 +112,7 @@ delStockOut, } from "@/api/inventoryManagement/stockOut.js"; import { findAllQualifiedStockRecordTypeOptions, findAllStockRecordTypeOptions, findAllUnqualifiedStockRecordTypeOptions findAllQualifiedStockOutRecordTypeOptions, findAllUnQualifiedStockOutRecordTypeOptions, } from "@/api/basicData/enum.js"; const userStore = useUserStore(); @@ -186,13 +184,13 @@ // è·åæ¥æºç±»åé项 const fetchStockRecordTypeOptions = () => { if (props.type === '0') { findAllQualifiedStockRecordTypeOptions() findAllQualifiedStockOutRecordTypeOptions() .then(res => { stockRecordTypeOptions.value = res.data; }) return } findAllUnqualifiedStockRecordTypeOptions() findAllUnQualifiedStockOutRecordTypeOptions() .then(res => { stockRecordTypeOptions.value = res.data; }) src/views/inventoryManagement/receiptManagement/Record.vue
@@ -109,8 +109,7 @@ batchDeleteStockInRecords, } from "@/api/inventoryManagement/stockInRecord.js"; import { findAllQualifiedStockRecordTypeOptions, findAllUnqualifiedStockRecordTypeOptions findAllQualifiedStockInRecordTypeOptions, findAllUnQualifiedStockInRecordTypeOptions, } from "@/api/basicData/enum.js"; const {proxy} = getCurrentInstance(); @@ -176,13 +175,13 @@ // è·åæ¥æºç±»åé项 const fetchStockRecordTypeOptions = () => { if (props.type === '0') { findAllQualifiedStockRecordTypeOptions() findAllQualifiedStockInRecordTypeOptions() .then(res => { stockRecordTypeOptions.value = res.data; }) return } findAllUnqualifiedStockRecordTypeOptions() findAllUnQualifiedStockInRecordTypeOptions() .then(res => { stockRecordTypeOptions.value = res.data; }) src/views/inventoryManagement/stockReport/index.vue
@@ -240,14 +240,12 @@ import { ElMessage } from 'element-plus' import * as echarts from 'echarts' import { getStockMonthlyReport, getStockInOutReport, } from '@/api/inventoryManagement/stockReport' import { getStockInventoryInAndOutReportList, getStockInventoryReportList } from "@/api/inventoryManagement/stockInventory.js"; import {findAllQualifiedStockRecordTypeOptions} from "@/api/basicData/enum.js"; import { findAllQualifiedStockInRecordTypeOptions, } from "@/api/basicData/enum.js"; const { proxy } = getCurrentInstance() @@ -277,7 +275,7 @@ // è·åæ¥æºç±»åé项 const fetchStockRecordTypeOptions = () => { findAllQualifiedStockRecordTypeOptions() findAllQualifiedStockInRecordTypeOptions() .then(res => { stockRecordTypeOptions.value = res.data; }) src/views/productionManagement/productionOrder/New.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,192 @@ <template> <div> <el-dialog v-model="isShow" title="æ°å¢ç产订å" width="800" @close="closeModal" > <el-form label-width="140px" :model="formState" label-position="top" ref="formRef"> <el-form-item label="产ååç§°" prop="productModelId" :rules="[ { required: true, message: 'è¯·éæ©äº§å', trigger: 'change', } ]" > <el-button type="primary" @click="showProductSelectDialog = true"> {{ formState.productName ? formState.productName : 'éæ©äº§å' }} </el-button> </el-form-item> <el-form-item label="è§æ ¼" prop="productModelName" > <el-input v-model="formState.productModelName" disabled /> </el-form-item> <el-form-item label="åä½" prop="unit" > <el-input v-model="formState.unit" disabled /> </el-form-item> <el-form-item label="å·¥èºè·¯çº¿"> <el-select v-model="formState.routeId" placeholder="è¯·éæ©å·¥èºè·¯çº¿" style="width: 100%;" :loading="bindRouteLoading"> <el-option v-for="item in routeOptions" :key="item.id" :label="`${item.processRouteCode || ''}`" :value="item.id" /> </el-select> </el-form-item> <el-form-item label="éæ±æ°é" prop="quantity" > <el-input-number v-model="formState.quantity" :step="1" :min="1" style="width: 100%" /> </el-form-item> </el-form> <!-- 产åéæ©å¼¹çª --> <ProductSelectDialog v-model="showProductSelectDialog" @confirm="handleProductSelect" single /> <template #footer> <div class="dialog-footer"> <el-button type="primary" @click="handleSubmit">确认</el-button> <el-button @click="closeModal">åæ¶</el-button> </div> </template> </el-dialog> </div> </template> <script setup> import {ref, computed, getCurrentInstance} from "vue"; import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; import {addProductOrder, listProcessRoute} from "@/api/productionManagement/productionOrder.js"; const props = defineProps({ visible: { type: Boolean, required: true, }, type: { type: String, required: true, default: 'qualified', }, }); const emit = defineEmits(['update:visible', 'completed']); // ååºå¼æ°æ®ï¼æ¿ä»£é项å¼ç dataï¼ const formState = ref({ productId: undefined, productModelId: undefined, routeId: undefined, productName: "", productModelName: "", unit: "", quantity: 0, }); const isShow = computed({ get() { return props.visible; }, set(val) { emit('update:visible', val); }, }); const showProductSelectDialog = ref(false); let { proxy } = getCurrentInstance() const closeModal = () => { // éç½®è¡¨åæ°æ® formState.value = { productId: undefined, productModelId: undefined, routeId: undefined, productName: "", productModelName: "", quantity: '', }; isShow.value = false; }; // 产åéæ©å¤ç const handleProductSelect = async (products) => { if (products && products.length > 0) { const product = products[0]; formState.value.productId = product.productId; formState.value.productName = product.productName; formState.value.productModelName = product.model; formState.value.productModelId = product.id; formState.value.unit = product.unit; showProductSelectDialog.value = false; fetchRouteOptions( product.id); // 触å表åéªè¯æ´æ° proxy.$refs["formRef"]?.validateField('productModelId'); } }; const routeOptions = ref([]); const bindRouteLoading = ref(false); const fetchRouteOptions = (productModelId) => { formState.value.routeId = undefined; routeOptions.value = [] bindRouteLoading.value = true; listProcessRoute({ productModelId: productModelId }).then(res => { routeOptions.value = res.data || []; }).finally(() => { bindRouteLoading.value = false; }) } const handleSubmit = () => { proxy.$refs["formRef"].validate(valid => { if (valid) { // éªè¯æ¯å¦éæ©äºäº§ååè§æ ¼ if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©äº§å"); return; } if (!formState.value.productModelId) { proxy.$modal.msgError("è¯·éæ©è§æ ¼"); return; } addProductOrder(formState.value).then(res => { // å ³éæ¨¡ææ¡ isShow.value = false; // åç¥ç¶ç»ä»¶å·²å®æ emit('completed'); proxy.$modal.msgSuccess("æäº¤æå"); }) } }) }; defineExpose({ closeModal, handleSubmit, isShow, }); </script> src/views/productionManagement/productionOrder/index.vue
@@ -41,6 +41,8 @@ </el-form-item> </el-form> <div> <el-button type="primary" @click="isShowNewModal = true">æ°å¢</el-button> <el-button type="danger" @click="handleDelete">å é¤</el-button> <el-button @click="handleOut">导åº</el-button> </div> </div> @@ -51,6 +53,8 @@ :page="page" :tableLoading="tableLoading" :row-class-name="tableRowClassName" :isSelection="true" @selection-change="handleSelectionChange" @pagination="pagination"> <template #completionStatus="{ row }"> <el-progress @@ -86,6 +90,10 @@ </span> </template> </el-dialog> <new-product-order v-if="isShowNewModal" v-model:visible="isShowNewModal" @completed="handleQuery" /> </div> </template> @@ -98,12 +106,17 @@ productOrderListPage, listProcessRoute, bindingRoute, listProcessBom, listProcessBom, delProductOrder, } from "@/api/productionManagement/productionOrder.js"; import { listMain as getOrderProcessRouteMain } from "@/api/productionManagement/productProcessRoute.js"; import {fileDel} from "@/api/financialManagement/revenueManagement.js"; import PIMTable from "@/components/PIMTable/PIMTable.vue"; const NewProductOrder = defineAsyncComponent(() => import("@/views/productionManagement/productionOrder/New.vue")); const { proxy } = getCurrentInstance(); const router = useRouter(); const isShowNewModal = ref(false); const tableColumn = ref([ { @@ -208,6 +221,7 @@ size: 100, total: 0, }); const selectedRows = ref([]); const data = reactive({ searchForm: { @@ -239,6 +253,7 @@ // æ·»å 表è¡ç±»åæ¹æ³ const tableRowClassName = ({ row }) => { if (!row.deliveryDate) return ''; if (row.isFh) return ''; const diff = row.deliveryDaysDiff; @@ -386,6 +401,33 @@ }); }; // è¡¨æ ¼éæ©æ°æ® const handleSelectionChange = (selection) => { selectedRows.value = selection; }; 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(() => { delProductOrder(ids).then((res) => { proxy.$modal.msgSuccess("å 餿å"); getList(); }); }).catch(() => { proxy.$modal.msg("已忶"); }); }; // å¯¼åº const handleOut = () => { ElMessageBox.confirm("éä¸çå 容å°è¢«å¯¼åºï¼æ¯å¦ç¡®è®¤å¯¼åºï¼", "导åº", { src/views/salesManagement/receiptPayment/index.vue
@@ -335,7 +335,7 @@ const getStatusTagType = (statusName = '') => { const normalized = statusName.trim(); if (!normalized) return 'info'; return normalized === 'æªå®æå款' ? 'danger' : 'success'; return normalized === 'æªå®æä»æ¬¾' ? 'danger' : 'success'; }; // æ¥è¯¢å表 /** æç´¢æé®æä½ */ src/views/salesManagement/salesLedger/index.vue
@@ -1005,6 +1005,7 @@ // æ·»å 表è¡ç±»åæ¹æ³ const tableRowClassName = ({ row }) => { if (!row.deliveryDate) return ''; if (row.isFh) return ''; const diff = row.deliveryDaysDiff;