Merge remote-tracking branch 'origin/dev_新疆_大罗素马铃薯new' into dev_新疆_大罗素马铃薯new
| | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | salesLedgerId | Long | éå®å°è´¦ID | |
| | | | salesContractNo | String | éå®ååå· | |
| | | | salesContractNo | String | 订åå· | |
| | | | productId | Long | 产åID | |
| | | | productName | String | 产ååç§° | |
| | | | model | String | è§æ ¼åå· | |
| | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | salesLedgerId | Long | éå®å°è´¦ID | |
| | | | salesContractNo | String | éå®ååå· | |
| | | | salesContractNo | String | 订åå· | |
| | | | shippingId | Long | åè´§åID | |
| | | | shippingNo | String | åè´§åå· | |
| | | | productName | String | 产ååç§° | |
| | |
| | | |------|------|------| |
| | | | shippingId | Long | åè´§åID | |
| | | | shippingNo | String | åè´§åå· | |
| | | | salesContractNo | String | éå®ååå· | |
| | | | salesContractNo | String | 订åå· | |
| | | | customerName | String | 客æ·åç§° | |
| | | | productName | String | 产ååç§° | |
| | | | model | String | è§æ ¼åå· | |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="éå®ååå·"> |
| | | <el-form-item label="订åå·"> |
| | | <el-input v-model="form.salesContractNo" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | }) |
| | | } |
| | | |
| | | // æ ¹æ®å®¢æ·æ¥è¯¢éå®è®¢åå· |
| | | // æ ¹æ®å®¢æ·æ¥è¯¢è®¢åå·å· |
| | | // afterSalesService/listSalesLedger |
| | | export function getSalesLedger(query) { |
| | | return request({ |
| | |
| | | }) |
| | | } |
| | | |
| | | // æ ¹æ®éå®è®¢åå·æ¥è¯¢éå®è®¢å详æ
|
| | | // æ ¹æ®è®¢åå·å·æ¥è¯¢è®¢åå·è¯¦æ
|
| | | // afterSalesService/count |
| | | export function getSalesLedgerDetail(query) { |
| | | return request({ |
| | |
| | | method: "get", |
| | | }); |
| | | }; |
| | | |
| | | export const getIotDeviceList = () => { |
| | | return request({ |
| | | url: "/device/ledger/iotDeviceList", |
| | | method: "get", |
| | | }); |
| | | }; |
| | |
| | | }); |
| | | } |
| | | |
| | | // éå®éè´§-æ ¹æ®åºåºåæ¥è¯¢éå®è®¢å以å产åä¿¡æ¯ |
| | | // éå®éè´§-æ ¹æ®åºåºåæ¥è¯¢è®¢åå·ä»¥å产åä¿¡æ¯ |
| | | // /returnManagement/getByShippingId |
| | | export function returnManagementGetByShippingId(query) { |
| | | return request({ |
| | |
| | | }); |
| | | } |
| | | |
| | | // æ ¹æ®éå®ååå·æ¥äº§åä¿¡æ¯ |
| | | // æ ¹æ®è®¢åå·æ¥äº§åä¿¡æ¯ |
| | | export function getProductInfoByContractNo(query) { |
| | | return request({ |
| | | url: "/purchase/ledger/getProductBySalesNo", |
| | |
| | | collectionStrategy: '忬¾çç¥', |
| | | quotationStrategy: 'æ¥ä»·çç¥', |
| | | nextAction: 'ä¸ä¸æ¥å¨ä½', |
| | | salesContractNo: 'éå®ååå·', |
| | | salesContractNo: '订åå·', |
| | | revenue: 'æ¶å
¥', |
| | | materialCost: 'ææææ¬', |
| | | laborCost: 'äººå·¥ææ¬', |
| | |
| | | purchaseContractNumber: 'éè´ååå·', |
| | | purchaseContractNo: 'éè´ååå·', |
| | | purchaseOrderNumber: 'éè´ååå·', |
| | | salesContractNo: 'éå®ååå·', |
| | | salesContractNumber: 'éå®ååå·', |
| | | salesOrderNumber: 'éå®ååå·', |
| | | salesContractNo: '订åå·', |
| | | salesContractNumber: '订åå·', |
| | | salesOrderNumber: '订åå·', |
| | | salesContractNoId: 'éå®ååID', |
| | | approveUserIds: '审æ¹ç¨æ·IDå表', |
| | | entryDateStart: 'å½å
¥å¼å§æ¥æ', |
| | |
| | | éè´ååå·: 'purchaseContractNumber', |
| | | éè´åå·: 'purchaseContractNumber', |
| | | éè´è®¢åå·: 'purchaseContractNumber', |
| | | éå®ååå·: 'salesContractNo', |
| | | éå®åå·: 'salesContractNo', |
| | | éå®è®¢åå·: 'salesContractNo', |
| | | 订åå·: 'salesContractNo', |
| | | 订åå·: 'salesContractNo', |
| | | 订åå·å·: 'salesContractNo', |
| | | éå®ååID: 'salesContractNoId', |
| | | 审æ¹ç¨æ·IDå表: 'approveUserIds', |
| | | å½å
¥å¼å§æ¥æ: 'entryDateStart', |
| | |
| | | <el-descriptions-item label="éè´ååå·">{{ currentPurchase.purchaseContractNumber }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä¾åºååç§°">{{ currentPurchase.supplierName }}</el-descriptions-item> |
| | | <el-descriptions-item label="项ç®åç§°">{{ currentPurchase.projectName }}</el-descriptions-item> |
| | | <el-descriptions-item label="éå®ååå·">{{ currentPurchase.salesContractNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="订åå·">{{ currentPurchase.salesContractNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç¾è®¢æ¥æ">{{ currentPurchase.executionDate }}</el-descriptions-item> |
| | | <el-descriptions-item label="å½å
¥æ¥æ">{{ currentPurchase.entryDate }}</el-descriptions-item> |
| | | <el-descriptions-item label="仿¬¾æ¹å¼">{{ currentPurchase.paymentMethod }}</el-descriptions-item> |
| | |
| | | <template v-else> |
| | | <el-descriptions :column="2" |
| | | border> |
| | | <el-descriptions-item label="éå®è®¢å">{{ currentDelivery.shippingInfo.salesContractNo || '--' }}</el-descriptions-item> |
| | | <el-descriptions-item label="订åå·">{{ currentDelivery.shippingInfo.salesContractNo || '--' }}</el-descriptions-item> |
| | | <el-descriptions-item label="å货订åå·">{{ currentDelivery.shippingInfo.shippingNo || '--' }}</el-descriptions-item> |
| | | <el-descriptions-item label="客æ·åç§°">{{ currentDelivery.shippingInfo.customerName || '--' }}</el-descriptions-item> |
| | | <el-descriptions-item label="åè´§ç±»å">{{ currentDelivery.shippingInfo.type || '--' }}</el-descriptions-item> |
| | |
| | | clearable |
| | | :prefix-icon="Search" /> |
| | | </el-form-item> |
| | | <el-form-item label="éå®ååå·ï¼"> |
| | | <el-form-item label="订åå·ï¼"> |
| | | <el-input v-model="searchForm.salesContractNo" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | |
| | | prop="purchaseContractNumber" |
| | | width="200" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="éå®ååå·" |
| | | <el-table-column label="订åå·" |
| | | prop="salesContractNo" |
| | | width="200" |
| | | show-overflow-tooltip /> |
| | |
| | | <div class="app-container"> |
| | | <div class="search_form"> |
| | | <div> |
| | | <span class="search_title">éå®ååå·ï¼</span> |
| | | <span class="search_title">订åå·ï¼</span> |
| | | <el-input |
| | | v-model="searchForm.salesContractNo" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥éå®ååå·æç´¢" |
| | | placeholder="请è¾å
¥è®¢åå·æç´¢" |
| | | @change="handleQuery" |
| | | clearable |
| | | :prefix-icon="Search" |
| | |
| | | }, |
| | | }, |
| | | { |
| | | label: "éå®ååå·", |
| | | label: "订åå·", |
| | | prop: "salesContractNo", |
| | | width: 170 |
| | | }, |
| | |
| | | <el-form-item> |
| | | <el-input |
| | | v-model="searchForm.orderNo" |
| | | placeholder="请è¾å
¥éå®åå·" |
| | | placeholder="请è¾å
¥è®¢åå·" |
| | | clearable |
| | | /> |
| | | </el-form-item> |
| | |
| | | align: "center" |
| | | }, |
| | | { |
| | | label: "éå®åå·", |
| | | label: "订åå·", |
| | | prop:"salesContractNo", |
| | | width: 150, |
| | | align: "center" |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <el-form-item label="å
³èéå®åå·ï¼" |
| | | <el-form-item label="å
³è订åå·ï¼" |
| | | prop="salesContractNo"> |
| | | <el-select v-model="form.salesContractNo" |
| | | @change="associatedSalesOrderNumberChange" |
| | |
| | | dataType: "slot", |
| | | slot: "shippingStatus", |
| | | }, |
| | | { label: "å¿«éå
¬å¸", prop: "expressCompany", width: 140 }, |
| | | { label: "å¿«éåå·", prop: "expressNumber", width: 160 }, |
| | | // { label: "å¿«éå
¬å¸", prop: "expressCompany", width: 140 }, |
| | | // { label: "å¿«éåå·", prop: "expressNumber", width: 160 }, |
| | | { |
| | | label: "å货车ç", |
| | | prop: "shippingCarNumber", |
| | |
| | | <el-col :span="4"> |
| | | <el-form-item> |
| | | <el-input v-model="searchForm.orderNo" |
| | | placeholder="请è¾å
¥éå®åå·" |
| | | placeholder="请è¾å
¥è®¢åå·" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | align: "center", |
| | | }, |
| | | { |
| | | label: "éå®åå·", |
| | | label: "订åå·", |
| | | prop: "salesContractNo", |
| | | width: 150, |
| | | align: "center", |
| | |
| | | slot: "status", |
| | | dataType: "slot", |
| | | }, |
| | | { |
| | | label: "ä»·æ ¼", |
| | | prop: "price", |
| | | }, |
| | | // { |
| | | // label: "ä»·æ ¼", |
| | | // prop: "price", |
| | | // }, |
| | | { |
| | | label: "æ°é", |
| | | prop: "quantity", |
| | | }, |
| | | { |
| | | label: "åºåé¢è¦æ°é", |
| | | prop: "warnNum", |
| | | }, |
| | | { |
| | | label: "é¢è¦éç¥äºº", |
| | | prop: "notifyPersonName", |
| | | }, |
| | | { |
| | | label: "æè¿°", |
| | | prop: "description", |
| | | }, |
| | | // { |
| | | // label: "åºåé¢è¦æ°é", |
| | | // prop: "warnNum", |
| | | // }, |
| | | // { |
| | | // label: "é¢è¦éç¥äºº", |
| | | // prop: "notifyPersonName", |
| | | // }, |
| | | // { |
| | | // label: "æè¿°", |
| | | // prop: "description", |
| | | // }, |
| | | { |
| | | label: "æä½", |
| | | prop: "operation", |
| | |
| | | <el-table-column prop="customerName" label="客æ·åç§°" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="productName" label="产ååç§°" min-width="120" show-overflow-tooltip /> |
| | | <el-table-column prop="specificationModel" label="è§æ ¼åå·" min-width="140" show-overflow-tooltip /> |
| | | <el-table-column prop="salesContractNo" label="éå®ååå·" min-width="140" show-overflow-tooltip /> |
| | | <el-table-column prop="salesContractNo" label="订åå·" min-width="140" show-overflow-tooltip /> |
| | | <el-table-column prop="shippingNo" label="åè´§åå·" min-width="130" show-overflow-tooltip /> |
| | | <el-table-column prop="shippingDate" label="åè´§æ¥æ" width="110" align="center" /> |
| | | <el-table-column prop="outboundAmount" label="åºåºéé¢" width="110" align="right"> |
| | |
| | | min-width="140" |
| | | show-overflow-tooltip /> |
| | | <el-table-column prop="salesContractNo" |
| | | label="éå®ååå·" |
| | | label="订åå·" |
| | | min-width="140" |
| | | show-overflow-tooltip /> |
| | | <el-table-column prop="shippingNo" |
| | |
| | | }), |
| | | }, |
| | | { label: "åè´§ç¼å·", prop: "shippingNo", minWidth: "140" }, |
| | | { label: "éå®è®¢åå·", prop: "salesContractNo", minWidth: "150" }, |
| | | { label: "订åå·å·", prop: "salesContractNo", minWidth: "150" }, |
| | | ]; |
| | | |
| | | const dataList = ref([]); |
| | |
| | | : Number(val).toLocaleString("zh-CN", { minimumFractionDigits: 2, maximumFractionDigits: 2 }), |
| | | }, |
| | | { label: "éè´§åå ", prop: "returnReason", minWidth: "150", showOverflowTooltip: true }, |
| | | { label: "éå®è®¢åå·", prop: "salesContractNo", minWidth: "150" }, |
| | | { label: "订åå·å·", prop: "salesContractNo", minWidth: "150" }, |
| | | ]; |
| | | |
| | | const dataList = ref([]); |
| | |
| | | <el-table-column label="åä½" |
| | | prop="unit" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="åºä½" |
| | | prop="warehouse" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="å
¥åºæ°é" |
| | | prop="stockInNum" |
| | | show-overflow-tooltip /> |
| | |
| | | <el-table-column label="è§æ ¼åå·" prop="model" show-overflow-tooltip /> |
| | | <el-table-column label="åä½" prop="unit" show-overflow-tooltip /> |
| | | <el-table-column label="æ¹å·" prop="batchNo" show-overflow-tooltip /> |
| | | <el-table-column label="åºä½" prop="warehouse" show-overflow-tooltip /> |
| | | <el-table-column |
| | | label="åæ ¼åºåæ°é" |
| | | prop="qualifiedQuantity" |
| | |
| | | :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="åºåç±»å" |
| | | prop="type" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©åºåç±»å', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.type" |
| | | placeholder="è¯·éæ©åºåç±»å"> |
| | | <el-option label="åæ ¼åºå" |
| | | value="qualified" /> |
| | | <el-option label="ä¸åæ ¼åºå" |
| | | value="unqualified" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | <el-form-item label="åºåæ°é" |
| | | prop="qualitity"> |
| | | <el-input-number v-model="formState.qualitity" |
| | | :step="1" |
| | | :min="1" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item label="æ¹å·" |
| | | prop="batchNo"> |
| | | <el-input v-model="formState.batchNo" |
| | | placeholder="请è¾å
¥æ¹å·" /> |
| | | </el-form-item> |
| | | <el-form-item v-if="formState.type === 'qualified'" |
| | | label="åºåé¢è¦æ°é" |
| | | prop="warnNum"> |
| | | <el-input-number v-model="formState.warnNum" |
| | | :step="1" |
| | | :min="0" |
| | | :max="formState.qualitity" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-form-item label="å
¥åºæ¶é´" |
| | | prop="createTime"> |
| | | <el-date-picker v-model="formState.createTime" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©å
¥åºæ¶é´" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <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-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è§æ ¼" |
| | | prop="productModelName"> |
| | | <el-input v-model="formState.productModelName" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åä½" |
| | | prop="unit"> |
| | | <el-input v-model="formState.unit" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åºåç±»å" |
| | | prop="type" |
| | | :rules="[ |
| | | { |
| | | required: true, |
| | | message: 'è¯·éæ©åºåç±»å', |
| | | trigger: 'change', |
| | | } |
| | | ]"> |
| | | <el-select v-model="formState.type" |
| | | placeholder="è¯·éæ©åºåç±»å"> |
| | | <el-option label="åæ ¼åºå" |
| | | value="qualified" /> |
| | | <el-option label="ä¸åæ ¼åºå" |
| | | value="unqualified" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åºåæ°é" |
| | | prop="qualitity"> |
| | | <el-input-number v-model="formState.qualitity" |
| | | :step="1" |
| | | :min="1" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¹å·" |
| | | prop="batchNo"> |
| | | <el-input v-model="formState.batchNo" |
| | | placeholder="请è¾å
¥æ¹å·" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="å
¥åºæ¶é´" |
| | | prop="createTime"> |
| | | <el-date-picker v-model="formState.createTime" |
| | | type="datetime" |
| | | placeholder="è¯·éæ©å
¥åºæ¶é´" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | format="YYYY-MM-DD HH:mm:ss" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item v-if="formState.type === 'qualified'" |
| | | label="åºåé¢è¦æ°é" |
| | | prop="warnNum"> |
| | | <el-input-number v-model="formState.warnNum" |
| | | :step="1" |
| | | :min="0" |
| | | :max="formState.qualitity" |
| | | style="width: 100%" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¯å¦è´¨æ£" |
| | | prop="needInspect"> |
| | | <el-switch v-model="formState.needInspect" |
| | | active-text="éè¦è´¨æ£" |
| | | inactive-text="ç´æ¥å
¥åº" /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item v-if="formState.needInspect" |
| | | label="è´¨æ£ç±»å" |
| | | prop="inspectType"> |
| | | <el-radio-group v-model="formState.inspectType"> |
| | | <el-radio :value="0">åæææ£éª</el-radio> |
| | | <el-radio :value="1">è¿ç¨æ£éª</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éæ©è®¾å¤" |
| | | prop="deviceId"> |
| | | <el-select v-model="formState.deviceId" |
| | | placeholder="è¯·éæ©è®¾å¤" |
| | | filterable |
| | | clearable |
| | | style="width: 100%" |
| | | @change="handleDeviceChange"> |
| | | <el-option v-for="device in iotDeviceList" |
| | | :key="device.id" |
| | | :label="device.deviceName" |
| | | :value="device.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åºä½" |
| | | prop="warehouse"> |
| | | <el-input v-model="formState.warehouse" |
| | | placeholder="éæ©è®¾å¤åèªå¨è·å" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-form-item label="夿³¨" |
| | | prop="remark"> |
| | | <el-input v-model="formState.remark" |
| | |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { ref, computed, watch, getCurrentInstance } from "vue"; |
| | | import { ref, computed, watch, getCurrentInstance, onMounted } from "vue"; |
| | | import ProductSelectDialog from "@/views/basicData/product/ProductSelectDialog.vue"; |
| | | import { addStockInRecordOnly } from "@/api/inventoryManagement/stockInventory.js"; |
| | | import { createStockUnInventory } from "@/api/inventoryManagement/stockUninventory.js"; |
| | | import { getIotDeviceList as getIotDeviceListApi } from "@/api/equipmentManagement/ledger.js"; |
| | | |
| | | const props = defineProps({ |
| | | visible: { |
| | |
| | | warnNum: 0, |
| | | createTime: "", |
| | | remark: "", |
| | | needInspect: false, |
| | | inspectType: 0, |
| | | deviceId: "", |
| | | warehouse: "", |
| | | }); |
| | | |
| | | // IoT设å¤å表 |
| | | const iotDeviceList = ref([]); |
| | | |
| | | const isShow = computed({ |
| | | get() { |
| | |
| | | warnNum: 0, |
| | | createTime: "", |
| | | remark: "", |
| | | needInspect: false, |
| | | inspectType: 0, |
| | | deviceId: "", |
| | | warehouse: "", |
| | | }; |
| | | isShow.value = false; |
| | | }; |
| | |
| | | } |
| | | }; |
| | | |
| | | // è·åIoT设å¤å表 |
| | | const getIotDeviceList = async () => { |
| | | try { |
| | | const res = await getIotDeviceListApi(); |
| | | if (res.data) { |
| | | iotDeviceList.value = res.data; |
| | | } |
| | | } catch (error) { |
| | | console.error("è·åIoT设å¤å表失败:", error); |
| | | } |
| | | }; |
| | | |
| | | // 设å¤éæ©åæ´æ¶ï¼èªå¨å¡«å
åºä½ |
| | | const handleDeviceChange = (deviceId) => { |
| | | const device = iotDeviceList.value.find(d => d.id === deviceId); |
| | | if (device) { |
| | | formState.value.warehouse = device.storageLocation || ''; |
| | | } else { |
| | | formState.value.warehouse = ''; |
| | | } |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getIotDeviceList(); |
| | | }); |
| | | |
| | | const handleSubmit = () => { |
| | | proxy.$refs["formRef"].validate(valid => { |
| | | if (valid) { |
| | |
| | | proxy.$modal.msgError("è¯·éæ©è§æ ¼"); |
| | | return; |
| | | } |
| | | // æå»ºè¯·æ±åæ° |
| | | const params = { |
| | | ...formState.value, |
| | | // 妿ä¸éè¦è´¨æ£ï¼ä¸ä¼ inspectType |
| | | inspectType: formState.value.needInspect ? formState.value.inspectType : undefined, |
| | | }; |
| | | if (formState.value.type === "qualified") { |
| | | addStockInRecordOnly(formState.value).then(res => { |
| | | // å
³éæ¨¡ææ¡ |
| | | addStockInRecordOnly(params).then(res => { |
| | | isShow.value = false; |
| | | // åç¥ç¶ç»ä»¶å·²å®æ |
| | | emit("completed"); |
| | | proxy.$modal.msgSuccess("æäº¤æå"); |
| | | }); |
| | | } else { |
| | | formState.value.warnNum = 0; |
| | | createStockUnInventory(formState.value).then(res => { |
| | | params.warnNum = 0; |
| | | createStockUnInventory(params).then(res => { |
| | | // å
³éæ¨¡ææ¡ |
| | | isShow.value = false; |
| | | // åç¥ç¶ç»ä»¶å·²å®æ |
| | |
| | | <el-table-column label="æ¹å·" |
| | | prop="batchNo" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="åºä½" |
| | | prop="warehouse" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="ç©è设å¤" |
| | | prop="warehouse" |
| | | show-overflow-tooltip |
| | |
| | | <div v-if="detailData.shippingInfo" class="shipment-detail"> |
| | | <el-divider content-position="left">å货详æ
</el-divider> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="éå®è®¢å">{{ |
| | | <el-descriptions-item label="订åå·">{{ |
| | | detailData.shippingInfo.salesContractNo || "--" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="åºåºæ¹å·">{{ |
| | |
| | | <el-descriptions-item label="项ç®åç§°">{{ |
| | | detailData.projectName || "--" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="éå®ååå·">{{ |
| | | <el-descriptions-item label="订åå·">{{ |
| | | detailData.salesContractNo || "--" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç¾è®¢æ¥æ">{{ |
| | |
| | | <el-table-column prop="specificationModel" label="è§æ ¼åå·" /> |
| | | <el-table-column prop="unit" label="åä½" /> |
| | | <el-table-column prop="quantity" label="æ°é" /> |
| | | <el-table-column prop="storageLocation" label="åºä½" /> |
| | | <el-table-column prop="taxInclusiveUnitPrice" label="å«ç¨åä»·"> |
| | | <template #default="scope" |
| | | >Â¥{{ |
| | |
| | | RESIGN: "resign", |
| | | WORK_HANDOVER: "work_handover", |
| | | LEAVE: "leave", |
| | | COMPENSATORY: "compensatory", |
| | | OVERTIME: "overtime", |
| | | TRAVEL_REIMBURSE: "travel_reimburse", |
| | | COST_REIMBURSE: "cost_reimburse", |
| | |
| | | [APPROVAL_MODULE_KEYS.TRANSFER]: 11, |
| | | [APPROVAL_MODULE_KEYS.WORK_HANDOVER]: 13, |
| | | [APPROVAL_MODULE_KEYS.LEAVE]: 14, |
| | | [APPROVAL_MODULE_KEYS.COMPENSATORY]: 19, |
| | | [APPROVAL_MODULE_KEYS.OVERTIME]: 15, |
| | | [APPROVAL_MODULE_KEYS.TRAVEL_REIMBURSE]: 16, |
| | | [APPROVAL_MODULE_KEYS.COST_REIMBURSE]: 17, |
| | |
| | | businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.LEAVE], |
| | | typeLabels: ["请å", "请åç³è¯·", "请å审æ¹"], |
| | | }, |
| | | [APPROVAL_MODULE_KEYS.COMPENSATORY]: { |
| | | label: "è°ä¼ç³è¯·", |
| | | approvalType: "compensatory", |
| | | businessType: APPROVAL_BUSINESS_TYPE[APPROVAL_MODULE_KEYS.COMPENSATORY], |
| | | typeLabels: ["è°ä¼", "è°ä¼ç³è¯·", "è°ä¼å®¡æ¹"], |
| | | }, |
| | | [APPROVAL_MODULE_KEYS.OVERTIME]: { |
| | | label: "å çç³è¯·", |
| | | approvalType: "overtime", |
| | |
| | | |
| | | </el-row> |
| | | |
| | | <el-form-item label="模æ¿è¯´æ"> |
| | | |
| | | <el-input |
| | | |
| | | v-model="form.description" |
| | | |
| | | type="textarea" |
| | | |
| | | :rows="2" |
| | | |
| | | placeholder="ç®è¦è¯´æè¯¥æ¨¡æ¿çéç¨åºæ¯" |
| | | |
| | | maxlength="200" |
| | | |
| | | show-word-limit |
| | | |
| | | /> |
| | | |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="å¡«æ¥é
ç½®"> |
| | | |
| | | <FormConfigEditor |
| | |
| | | </el-tag> |
| | | |
| | | </el-descriptions-item> |
| | | |
| | | <el-descriptions-item label="说æ" :span="2">{{ detailRow.description || "â" }}</el-descriptions-item> |
| | | |
| | | <el-descriptions-item label="å¡«æ¥æç¤º" :span="2"> |
| | | |
| | |
| | | align: "center", |
| | | formatData: (v) => templateTypeLabel(v), |
| | | }, |
| | | { label: "说æ", prop: "description", minWidth: 160, showOverflowTooltip: true }, |
| | | { |
| | | label: "èç¹æ°", |
| | | prop: "flowNodes", |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <!--OA模åï¼è°ä¼ç³è¯·--> |
| | | <template> |
| | | <div class="app-container"> |
| | | <div class="search_form mb20"> |
| | | <div> |
| | | <span class="search_title">审æ¹åå·ï¼</span> |
| | | <el-input |
| | | v-model="searchForm.instanceNo" |
| | | style="width: 220px" |
| | | placeholder="请è¾å
¥å®¡æ¹åå·" |
| | | clearable |
| | | @keyup.enter="onSearch" |
| | | /> |
| | | <span class="search_title" style="margin-left: 12px">ç³è¯·äººï¼</span> |
| | | <el-input |
| | | v-model="searchForm.applicantKeyword" |
| | | style="width: 220px" |
| | | placeholder="å§åæç¼å·" |
| | | clearable |
| | | :prefix-icon="Search" |
| | | @keyup.enter="onSearch" |
| | | /> |
| | | <el-button type="primary" style="margin-left: 10px" @click="onSearch">æç´¢</el-button> |
| | | <el-button @click="resetSearch">éç½®</el-button> |
| | | </div> |
| | | <div> |
| | | <el-button type="primary" @click="openAddWithTemplate">æ°å¢è°ä¼ç³è¯·</el-button> |
| | | </div> |
| | | </div> |
| | | <div class="table_list"> |
| | | <PIMTable |
| | | rowKey="id" |
| | | :column="tableColumn" |
| | | :tableData="tableData" |
| | | :page="page" |
| | | :isSelection="false" |
| | | :tableLoading="tableLoading" |
| | | @pagination="onPagination" |
| | | :total="page.total" |
| | | /> |
| | | </div> |
| | | |
| | | <ApprovalInstanceSubmitDialog |
| | | v-model="submitDialog.visible" |
| | | :title="submitDialogTitle" |
| | | :form="submitForm" |
| | | :rules="submitFormRules" |
| | | :fields="submitFormFields" |
| | | :active-template="activeTemplate" |
| | | :user-options="flowUserOptions" |
| | | :is-edit="isSubmitEdit" |
| | | :saving="submitSaving" |
| | | :form-ref="submitFormRef" |
| | | flow-attachments-only |
| | | @submit="onSubmit" |
| | | > |
| | | <template #before="{ form, fields }"> |
| | | <FormPayloadFields :fields="displayTemplateFields(fields)" :form-payload="form.formPayload" /> |
| | | <el-row :gutter="24"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è°ä¼ä½é¢" prop="compensatoryBalanceHours"> |
| | | <el-input-number |
| | | v-model="form.compensatoryBalanceHours" |
| | | :min="0" |
| | | :max="9999" |
| | | :precision="2" |
| | | :step="1" |
| | | controls-position="right" |
| | | placeholder="å°æ¶" |
| | | style="width: 100%" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="è°ä¼æ¶é¿"> |
| | | <el-input :model-value="compensatoryDurationDisplay(form)" readonly placeholder="æ ¹æ®æ¨¡æ¿ä¸è°ä¼æ¶é´èªå¨è®¡ç®"> |
| | | <template #append>å°æ¶</template> |
| | | </el-input> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | </template> |
| | | </ApprovalInstanceSubmitDialog> |
| | | |
| | | <ApprovalTemplateBindDialog |
| | | v-model:visible="templateBindVisible" |
| | | :module-key="APPROVAL_MODULE_KEYS.COMPENSATORY" |
| | | skip-form-confirm |
| | | @confirm="onTemplateBound" |
| | | @closed="onTemplateBindClosed" |
| | | /> |
| | | |
| | | <ApprovalInstanceDetailDialog |
| | | v-model="detailDialog.visible" |
| | | title="è°ä¼ç³è¯·è¯¦æ
" |
| | | :row="detailRow" |
| | | @edit="openEditFromDetail" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script setup> |
| | | import { Search } from "@element-plus/icons-vue"; |
| | | import dayjs from "dayjs"; |
| | | import { userListNoPageByTenantId } from "@/api/system/user.js"; |
| | | import { ElMessage } from "element-plus"; |
| | | import { computed, onMounted, reactive, ref, watch } from "vue"; |
| | | import FormPayloadFields from "../../ApproveManage/approve-list/components/FormPayloadFields.vue"; |
| | | import ApprovalInstanceDetailDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceDetailDialog.vue"; |
| | | import ApprovalInstanceSubmitDialog from "../../ApproveManage/approve-shared/components/ApprovalInstanceSubmitDialog.vue"; |
| | | import ApprovalTemplateBindDialog from "../../ApproveManage/approve-shared/components/ApprovalTemplateBindDialog.vue"; |
| | | import { buildInstanceTableColumns } from "../../ApproveManage/approve-shared/approvalInstanceFormConfigTable.js"; |
| | | import { APPROVAL_MODULE_KEYS } from "../../ApproveManage/approve-shared/approvalModuleRegistry.js"; |
| | | import { useApprovalInstanceModule } from "../../ApproveManage/approve-shared/useApprovalInstanceModule.js"; |
| | | import { useFlowUserOptions } from "../../ApproveManage/approve-shared/useFlowUserOptions.js"; |
| | | import { SELECT_OPTION_SOURCE } from "../../ApproveManage/approve-template/selectOptionSource.js"; |
| | | |
| | | function isCompensatoryBalanceField(field) { |
| | | const label = String(field?.label || ""); |
| | | return label.includes("è°ä¼ä½é¢") || field?.key === "compensatoryBalanceHours"; |
| | | } |
| | | |
| | | function isCompensatoryDurationField(field) { |
| | | const label = String(field?.label || ""); |
| | | return label.includes("è°ä¼æ¶é¿") || field?.key === "compensatoryDurationHours"; |
| | | } |
| | | |
| | | function displayTemplateFields(fields = []) { |
| | | return (fields || []).filter((f) => !isCompensatoryBalanceField(f) && !isCompensatoryDurationField(f)); |
| | | } |
| | | |
| | | function findCompensatoryTimeTemplateField(fields = []) { |
| | | return ( |
| | | fields.find((f) => f?.type === "datetimerange" && String(f?.label || "").includes("è°ä¼æ¶é´")) || |
| | | fields.find((f) => f?.type === "datetimerange" && f?.key === "dateRange") || |
| | | fields.find((f) => f?.type === "datetimerange") || |
| | | null |
| | | ); |
| | | } |
| | | |
| | | function findApplicantTemplateField(fields = []) { |
| | | return ( |
| | | fields.find((f) => String(f?.label || "").includes("ç³è¯·äºº")) || |
| | | fields.find((f) => f?.type === "select" && f?.optionSource === SELECT_OPTION_SOURCE.USER) || |
| | | null |
| | | ); |
| | | } |
| | | |
| | | function resolveCompensatoryTimeRange(payload, compensatoryTimeField) { |
| | | if (!compensatoryTimeField?.key) return { start: "", end: "" }; |
| | | const val = payload?.[compensatoryTimeField.key]; |
| | | if (!Array.isArray(val) || val.length < 2) return { start: "", end: "" }; |
| | | return { start: val[0] || "", end: val[1] || "" }; |
| | | } |
| | | |
| | | function computeCompensatoryHours(startStr, endStr) { |
| | | if (!startStr || !endStr) return null; |
| | | const t0 = dayjs(startStr); |
| | | const t1 = dayjs(endStr); |
| | | if (!t0.isValid() || !t1.isValid() || !t1.isAfter(t0)) return null; |
| | | const hours = t1.diff(t0, "millisecond") / (60 * 60 * 1000); |
| | | return Math.round(hours * 100) / 100; |
| | | } |
| | | |
| | | function compensatoryDurationDisplay(form) { |
| | | const compensatoryTimeField = findCompensatoryTimeTemplateField(form.formFieldDefs); |
| | | const { start, end } = resolveCompensatoryTimeRange(form.formPayload, compensatoryTimeField); |
| | | const h = computeCompensatoryHours(start, end); |
| | | return h == null ? "" : String(h); |
| | | } |
| | | |
| | | const searchForm = reactive({ |
| | | instanceNo: "", |
| | | applicantKeyword: "", |
| | | }); |
| | | |
| | | function validateCompensatoryBeforeSave() { |
| | | const compensatoryTimeField = findCompensatoryTimeTemplateField(submitForm.formFieldDefs); |
| | | const { start, end } = resolveCompensatoryTimeRange(submitForm.formPayload, compensatoryTimeField); |
| | | if (computeCompensatoryHours(start, end) == null) { |
| | | ElMessage.warning("è¯·æ£æ¥æ¨¡æ¿ä¸çè°ä¼æ¶é´ï¼ç»ææ¶é´é¡»æäºå¼å§æ¶é´"); |
| | | throw new Error("invalid compensatory time"); |
| | | } |
| | | } |
| | | |
| | | const mod = useApprovalInstanceModule({ |
| | | moduleKey: APPROVAL_MODULE_KEYS.COMPENSATORY, |
| | | beforeSave: validateCompensatoryBeforeSave, |
| | | extraFormRules: { |
| | | compensatoryBalanceHours: [{ required: true, message: "请填åè°ä¼ä½é¢", trigger: "blur" }], |
| | | }, |
| | | }); |
| | | |
| | | const { |
| | | tableData, |
| | | tableLoading, |
| | | page, |
| | | detailDialog, |
| | | detailRow, |
| | | submitDialog, |
| | | submitEditRow, |
| | | submitForm, |
| | | submitFormRef, |
| | | submitSaving, |
| | | isSubmitEdit, |
| | | activeTemplate, |
| | | submitFormFields, |
| | | submitFormRules, |
| | | submitDialogTitle, |
| | | templateBindVisible, |
| | | handleQuery, |
| | | initModuleList, |
| | | pagination, |
| | | openAddWithTemplate, |
| | | onTemplateBound, |
| | | onTemplateBindClosed, |
| | | openEditFromDetail, |
| | | submitInstanceForm, |
| | | buildTableActions, |
| | | } = mod; |
| | | |
| | | const { flowUserOptions, loadFlowUsers } = useFlowUserOptions(); |
| | | const allUsersCache = ref([]); |
| | | |
| | | const applicantTemplateField = computed(() => |
| | | findApplicantTemplateField(submitForm.formFieldDefs) |
| | | ); |
| | | |
| | | function unwrapArray(payload) { |
| | | if (Array.isArray(payload)) return payload; |
| | | if (payload && Array.isArray(payload.data)) return payload.data; |
| | | return []; |
| | | } |
| | | |
| | | async function loadUserPool() { |
| | | try { |
| | | const res = await userListNoPageByTenantId(); |
| | | allUsersCache.value = unwrapArray(res); |
| | | } catch { |
| | | allUsersCache.value = []; |
| | | } |
| | | } |
| | | |
| | | watch( |
| | | () => submitDialog.visible, |
| | | (v) => { |
| | | if (!v) return; |
| | | if (submitForm.compensatoryBalanceHours == null && isSubmitEdit.value) { |
| | | submitForm.compensatoryBalanceHours = |
| | | submitEditRow.value?.formPayload?.compensatoryBalanceHours ?? |
| | | submitEditRow.value?.compensatoryBalanceHours; |
| | | } |
| | | if (submitForm.compensatoryBalanceHours == null && !isSubmitEdit.value) { |
| | | submitForm.compensatoryBalanceHours = undefined; |
| | | } |
| | | } |
| | | ); |
| | | |
| | | watch( |
| | | () => { |
| | | const key = applicantTemplateField.value?.key; |
| | | return key ? submitForm.formPayload[key] : undefined; |
| | | }, |
| | | async (uid) => { |
| | | if (!applicantTemplateField.value || !uid) return; |
| | | if (!allUsersCache.value.length) await loadUserPool(); |
| | | } |
| | | ); |
| | | |
| | | const tableColumn = buildInstanceTableColumns(tableData, buildTableActions, { |
| | | moduleKey: APPROVAL_MODULE_KEYS.COMPENSATORY, |
| | | }); |
| | | |
| | | function onSearch() { |
| | | handleQuery(searchForm); |
| | | } |
| | | |
| | | function resetSearch() { |
| | | searchForm.instanceNo = ""; |
| | | searchForm.applicantKeyword = ""; |
| | | onSearch(); |
| | | } |
| | | |
| | | function onPagination(obj) { |
| | | pagination(obj, searchForm); |
| | | } |
| | | |
| | | async function onSubmit() { |
| | | const ok = await submitInstanceForm({ skipValidate: true }); |
| | | if (ok) ElMessage.success(isSubmitEdit.value ? "ä¿®æ¹æå" : "æäº¤æå"); |
| | | } |
| | | |
| | | onMounted(async () => { |
| | | loadFlowUsers(); |
| | | await initModuleList(searchForm); |
| | | }); |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .mb20 { |
| | | margin-bottom: 20px; |
| | | } |
| | | .search_form { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | align-items: center; |
| | | justify-content: space-between; |
| | | gap: 12px; |
| | | } |
| | | .search_title { |
| | | font-size: 14px; |
| | | color: var(--el-text-color-regular); |
| | | } |
| | | </style> |
| | |
| | | </div> |
| | | <div class="user-details"> |
| | | <h4 class="user-name">{{ item.name }}</h4> |
| | | <!-- <div class="user-stats"> |
| | | <span class="stat-item">æ©:{{ item.day0 }}</span> |
| | | <span class="stat-item">ä¸:{{ item.day1 }}</span> |
| | | <span class="stat-item">å¤:{{ item.day2 }}</span> |
| | | <span class="stat-item">ä¼:{{ item.day3 }}</span> |
| | | <span class="stat-item">å:{{ item.day4 }}</span> |
| | | <span class="stat-item">å·®:{{ item.day6 }}</span> |
| | | </div> --> |
| | | <div class="user-stats"> |
| | | <span v-if="item.monthlyAttendance?.['伿¯']" class="stat-item stat-rest">ä¼:{{ item.monthlyAttendance['伿¯'] }}</span> |
| | | <el-tooltip v-if="item.holidayDates?.length > 0" placement="top"> |
| | | <template #content> |
| | | <div>è¯·åæ¥æï¼</div> |
| | | <div v-for="date in item.holidayDates" :key="date">{{ date }}</div> |
| | | </template> |
| | | <span class="stat-item stat-holiday">å:{{ item.holidayDates.length }}</span> |
| | | </el-tooltip> |
| | | </div> |
| | | <div class="user-total"> |
| | | <span class="total-label">å计åºå¤:</span> |
| | | <span class="total-value">{{ item.monthlyAttendance.totalAttendance }}天</span> |
| | |
| | | 'shift-box-leave': m.shift === '请å', |
| | | 'shift-box-other': m.shift === 'å¤11', |
| | | 'shift-box-business': m.shift === 'å¤12', |
| | | 'holiday-cell': m.isHoliday, |
| | | }"> |
| | | <span class="shift-text">{{ getShiftNameByValue(m.shift) || 'â' }}</span> |
| | | </div> |
| | |
| | | margin-bottom: 8px; |
| | | margin-top: 12px; |
| | | } |
| | | |
| | | /* 请å伿¯æ¥æç¹æ®æ ·å¼ */ |
| | | .holiday-cell { |
| | | background-color: #fff3cd !important; |
| | | color: #856404 !important; |
| | | border: 1px solid #ffc107 !important; |
| | | } |
| | | |
| | | /* ç¨æ·ç»è®¡åºå */ |
| | | .user-stats { |
| | | display: flex; |
| | | flex-wrap: wrap; |
| | | gap: 4px; |
| | | margin-bottom: 4px; |
| | | } |
| | | |
| | | .stat-item { |
| | | font-size: 12px; |
| | | color: #666; |
| | | padding-right: 4px; |
| | | } |
| | | |
| | | .stat-rest { |
| | | color: #10b981; |
| | | background-color: rgba(16, 185, 129, 0.1); |
| | | padding: 1px 6px; |
| | | border-radius: 10px; |
| | | } |
| | | |
| | | .stat-holiday { |
| | | color: #f59e0b; |
| | | background-color: rgba(245, 158, 11, 0.1); |
| | | padding: 1px 6px; |
| | | border-radius: 10px; |
| | | cursor: pointer; |
| | | } |
| | | </style> |
| | |
| | | <el-table-column label="éè´ååå·" |
| | | prop="purchaseContractNumber" |
| | | show-overflow-tooltip/> |
| | | <el-table-column label="éè´æ»ååå·" |
| | | prop="masterContractNo" |
| | | show-overflow-tooltip/> |
| | | <el-table-column label="项ç®åç§°" |
| | | prop="projectName" |
| | | show-overflow-tooltip/> |
| | |
| | | clearable |
| | | :prefix-icon="Search" /> |
| | | </el-form-item> |
| | | <el-form-item label="éå®ååå·ï¼"> |
| | | <el-input v-model="searchForm.salesContractNo" |
| | | placeholder="请è¾å
¥" |
| | | clearable |
| | | prefix-icon="Search" |
| | | @change="handleQuery" /> |
| | | </el-form-item> |
| | | <!-- <el-form-item label="订åå·ï¼">--> |
| | | <!-- <el-input v-model="searchForm.salesContractNo"--> |
| | | <!-- placeholder="请è¾å
¥"--> |
| | | <!-- clearable--> |
| | | <!-- prefix-icon="Search"--> |
| | | <!-- @change="handleQuery" />--> |
| | | <!-- </el-form-item>--> |
| | | <el-form-item label="项ç®åç§°ï¼"> |
| | | <el-input v-model="searchForm.projectName" |
| | | placeholder="请è¾å
¥" |
| | |
| | | prop="purchaseContractNumber" |
| | | width="160" |
| | | show-overflow-tooltip /> |
| | | <el-table-column label="éå®ååå·" |
| | | prop="salesContractNo" |
| | | width="160" |
| | | show-overflow-tooltip /> |
| | | <!-- <el-table-column label="订åå·"--> |
| | | <!-- prop="salesContractNo"--> |
| | | <!-- width="160"--> |
| | | <!-- show-overflow-tooltip />--> |
| | | <el-table-column label="ä¾åºååç§°" |
| | | prop="supplierName" |
| | | width="160" |
| | |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éå®ååå·ï¼" |
| | | prop="salesLedgerId"> |
| | | <el-select v-model="form.salesLedgerId" |
| | | placeholder="è¯·éæ©" |
| | | filterable |
| | | clearable |
| | | @change="salesLedgerChange"> |
| | | <el-option v-for="item in salesContractList" |
| | | :key="item.id" |
| | | :label="item.salesContractNo" |
| | | :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <!-- <el-col :span="12">--> |
| | | <!-- <el-form-item label="订åå·ï¼"--> |
| | | <!-- prop="salesLedgerId">--> |
| | | <!-- <el-select v-model="form.salesLedgerId"--> |
| | | <!-- placeholder="è¯·éæ©"--> |
| | | <!-- filterable--> |
| | | <!-- clearable--> |
| | | <!-- @change="salesLedgerChange">--> |
| | | <!-- <el-option v-for="item in salesContractList"--> |
| | | <!-- :key="item.id"--> |
| | | <!-- :label="item.salesContractNo"--> |
| | | <!-- :value="item.id" />--> |
| | | <!-- </el-select>--> |
| | | <!-- </el-form-item>--> |
| | | <!-- </el-col>--> |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | |
| | | <el-tag v-else :type="scope.row.isChecked ? 'success' : 'info'"> |
| | | {{ scope.row.isChecked ? 'æ¯' : 'å¦' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="éæ©è®¾å¤" |
| | | prop="deviceId" |
| | | width="150"> |
| | | <template #default="scope"> |
| | | <span v-if="scope.row.productType === 2">--</span> |
| | | <el-select v-else |
| | | v-model="scope.row.deviceId" |
| | | placeholder="è¯·éæ©è®¾å¤" |
| | | filterable |
| | | clearable |
| | | @change="handleDeviceChange(scope.row, scope.$index)"> |
| | | <el-option v-for="device in iotDeviceList" |
| | | :key="device.id" |
| | | :label="device.deviceName" |
| | | :value="device.id" /> |
| | | </el-select> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºä½" |
| | | prop="storageLocation" |
| | | width="120"> |
| | | <template #default="scope"> |
| | | <span v-if="scope.row.productType === 2">--</span> |
| | | <el-input v-else |
| | | v-model="scope.row.storageLocation" |
| | | placeholder="èªå¨è·å" |
| | | disabled /> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å
¥åºå®¡æ ¸ç¶æ" |
| | |
| | | </el-row> |
| | | <el-row :gutter="30" v-if="productForm.productType !== 2"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éæ©è®¾å¤ï¼" |
| | | prop="deviceId"> |
| | | <el-select v-model="productForm.deviceId" |
| | | placeholder="è¯·éæ©è®¾å¤" |
| | | filterable |
| | | clearable |
| | | style="width: 100%" |
| | | @change="handleProductDeviceChange"> |
| | | <el-option v-for="device in iotDeviceList" |
| | | :key="device.id" |
| | | :label="device.deviceName" |
| | | :value="device.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="åºä½ï¼" |
| | | prop="storageLocation"> |
| | | <el-input v-model="productForm.storageLocation" |
| | | placeholder="éæ©è®¾å¤åèªå¨è·å" |
| | | disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="30" v-if="productForm.productType !== 2"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="æ¯å¦è´¨æ£ï¼" |
| | | prop="isChecked"> |
| | | <el-radio-group v-model="productForm.isChecked"> |
| | |
| | | const salesContractList = ref([]); |
| | | const supplierList = ref([]); |
| | | const contractList = ref([]); // ä¾åºåååå表 |
| | | const iotDeviceList = ref([]); // IoT设å¤å表 |
| | | const contractFileDialogVisible = ref(false); |
| | | const contractFileList = ref([]); |
| | | const tableLoading = ref(false); |
| | |
| | | import { modelList, productTreeList } from "@/api/basicData/product.js"; |
| | | import { getSparePartsList } from "@/api/equipmentManagement/spareParts.js"; |
| | | import { getSupplierContractList, getSupplierContractFilesByNo } from "@/api/basicData/supplierContract.js"; |
| | | import { getIotDeviceList as getIotDeviceListApi } from "@/api/equipmentManagement/ledger.js"; |
| | | import dayjs from "dayjs"; |
| | | import FileUpload from "@/components/AttachmentUpload/file/index.vue"; |
| | | |
| | |
| | | invoiceType: "", |
| | | warnNum: "", |
| | | isChecked: false, |
| | | deviceId: "", |
| | | storageLocation: "", |
| | | }, |
| | | productRules: { |
| | | productId: [{ required: true, message: "è¯·éæ©", trigger: "change" }], |
| | |
| | | } |
| | | }; |
| | | |
| | | // è·åIoT设å¤å表 |
| | | // è·åIoT设å¤å表 |
| | | const getIotDeviceList = async () => { |
| | | try { |
| | | const res = await getIotDeviceListApi(); |
| | | if (res.data) { |
| | | iotDeviceList.value = res.data; |
| | | } |
| | | } catch (error) { |
| | | console.error("è·åIoT设å¤å表失败:", error); |
| | | } |
| | | }; |
| | | |
| | | // 设å¤éæ©åæ´æ¶ï¼èªå¨å¡«å
åºä½ |
| | | const handleDeviceChange = (row, index) => { |
| | | const device = iotDeviceList.value.find(d => d.id === row.deviceId); |
| | | if (device) { |
| | | row.storageLocation = device.storageLocation || ''; |
| | | } else { |
| | | row.storageLocation = ''; |
| | | } |
| | | }; |
| | | |
| | | // 产åå¼¹çªä¸è®¾å¤éæ©åæ´æ¶ï¼èªå¨å¡«å
åºä½ |
| | | const handleProductDeviceChange = (deviceId) => { |
| | | const device = iotDeviceList.value.find(d => d.id === deviceId); |
| | | if (device) { |
| | | productForm.value.storageLocation = device.storageLocation || ''; |
| | | } else { |
| | | productForm.value.storageLocation = ''; |
| | | } |
| | | }; |
| | | |
| | | // æ ¼å¼åæä»¶å¤§å° |
| | | const formatFileSize = (bytes) => { |
| | | if (!bytes) return '0 B'; |
| | |
| | | onMounted(() => { |
| | | getList(); |
| | | getTemplateList(); |
| | | getIotDeviceList(); |
| | | }); |
| | | </script> |
| | | |
| | |
| | | width: 160, |
| | | }, |
| | | { |
| | | label: "éè´æ»ååå·", |
| | | prop: "masterContractNo", |
| | | width: 160, |
| | | }, |
| | | { |
| | | label: "å¶ä½æ¥æ", |
| | | prop: "preparedAt", |
| | | width: 130, |
| | |
| | | @change="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="éå®ååå·ï¼"> |
| | | <el-form-item label="订åå·ï¼"> |
| | | <el-input |
| | | v-model="searchForm.salesContractNo" |
| | | placeholder="请è¾å
¥" |
| | |
| | | </el-table-column> |
| | | <el-table-column align="center" label="åºå·" type="index" width="60" /> |
| | | <el-table-column label="éè´ååå·" prop="purchaseContractNumber" width="160" show-overflow-tooltip /> |
| | | <el-table-column label="éå®ååå·" prop="salesContractNo" width="160" show-overflow-tooltip /> |
| | | <el-table-column label="éè´æ»ååå·" prop="masterContractNo" width="160" show-overflow-tooltip /> |
| | | <el-table-column label="订åå·" prop="salesContractNo" width="160" show-overflow-tooltip /> |
| | | <el-table-column label="ä¾åºååç§°" prop="supplierName" width="160" show-overflow-tooltip /> |
| | | <el-table-column label="项ç®åç§°" prop="projectName" width="320" show-overflow-tooltip /> |
| | | <el-table-column label="æ¶è´§ç¶æ" prop="status" width="100" show-overflow-tooltip> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éå®ååå·ï¼"> |
| | | <el-form-item label="订åå·ï¼"> |
| | | <el-input :model-value="detailData.salesContractNo || ''" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | prop: "npsNo", |
| | | width: "150px", |
| | | }, |
| | | { |
| | | label: "é宿»ååå·", |
| | | prop: "masterContractNo", |
| | | width: "150px", |
| | | }, |
| | | // 1.å¾
å¼å§ã2.è¿è¡ä¸ã3.已宿ã4.已忶ã5.å·²ç»æ |
| | | { |
| | | label: "ç¶æ", |
| | |
| | | width: 120, |
| | | }, |
| | | { |
| | | label: "éå®ååå·", |
| | | label: "订åå·", |
| | | prop: "salesContractNo", |
| | | width: 120, |
| | | }, |
| | |
| | | width: "140", |
| | | }, |
| | | { |
| | | label: "é宿»ååå·", |
| | | prop: "masterContractNo", |
| | | width: "140", |
| | | }, |
| | | { |
| | | label: "产ååç§°", |
| | | prop: "productName", |
| | | width: "140", |
| | |
| | | style="width: 160px;" |
| | | @keyup.enter="handleQuery" /> |
| | | </el-form-item> |
| | | <el-form-item label="éå®ååå·:" |
| | | <el-form-item label="订åå·:" |
| | | prop="salesContractNo"> |
| | | <el-input v-model="searchForm.salesContractNo" |
| | | placeholder="请è¾å
¥" |
| | |
| | | }, |
| | | }, |
| | | { |
| | | label: "éå®ååå·", |
| | | label: "订åå·", |
| | | prop: "salesContractNo", |
| | | width: "200px", |
| | | dataType: "slot", |
| | | slot: "salesContractNo", |
| | | }, |
| | | |
| | | { |
| | | label: "é宿»ååå·", |
| | | prop: "masterContractNo", |
| | | width: "150px", |
| | | }, |
| | | { |
| | | label: "产ååç§°", |
| | | prop: "productName", |
| | |
| | | > |
| | | <el-table-column type="selection" width="55" align="center" /> |
| | | <el-table-column label="åºå·" type="index" width="55" align="center" /> |
| | | <el-table-column label="éå®ååå·" prop="contractNo" width="160" /> |
| | | <el-table-column label="订åå·" prop="contractNo" width="160" /> |
| | | <el-table-column label="产åç¼å·" prop="productCode" width="140" /> |
| | | <el-table-column label="产ååå·" prop="productModel" width="140" /> |
| | | <el-table-column label="客æ·åç§°" prop="customerName" width="160" /> |
| | |
| | | > |
| | | <el-row> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éå®ååå·" prop="contractNo"> |
| | | <el-form-item label="订åå·" prop="contractNo"> |
| | | <el-input |
| | | v-model="form.contractNo" |
| | | placeholder="è¯·éæ©å
³èéå®ååå·" |
| | | placeholder="è¯·éæ©å
³è订åå·" |
| | | /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | }, |
| | | rules: { |
| | | contractNo: [ |
| | | { required: true, message: "éå®ååå·ä¸è½ä¸ºç©º", trigger: "blur" }, |
| | | { required: true, message: "订åå·ä¸è½ä¸ºç©º", trigger: "blur" }, |
| | | ], |
| | | productCode: [ |
| | | { required: true, message: "产åç¼å·ä¸è½ä¸ºç©º", trigger: "blur" }, |
| | |
| | | <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-form-item label="订åå·ï¼" prop="salesLedgerId"> |
| | | <el-select |
| | | v-model="form.salesLedgerId" |
| | | placeholder="è¯·éæ©éå®è®¢å" |
| | | placeholder="è¯·éæ©è®¢åå·" |
| | | clearable |
| | | filterable |
| | | :disabled="isViewMode" |
| | |
| | | const currentProductId = ref(0); |
| | | const testStandardOptions = ref([]); // ææ éæ©ä¸ææ¡æ°æ® |
| | | const modelOptions = ref([]); |
| | | const salesLedgerOptions = ref([]); // éå®è®¢åä¸ææ¡æ°æ® |
| | | const salesLedgerOptions = ref([]); // 订åå·ä¸ææ¡æ°æ® |
| | | |
| | | // æå¼å¼¹æ¡ |
| | | const openDialog = async (type, row) => { |
| | |
| | | form.value.unit = modelOptions.value.find(item => item.id == value)?.unit || ''; |
| | | } |
| | | |
| | | // éå®è®¢åéæ©ååå¤ç |
| | | // 订åå·éæ©ååå¤ç |
| | | const handleSalesLedgerChange = async (value) => { |
| | | const selectedItem = salesLedgerOptions.value.find(item => item.id == value); |
| | | if (selectedItem) { |
| | | form.value.salesContractNo = selectedItem.salesContractNo || ''; |
| | | // æ ¹æ®éå®è®¢åIDæ¥è¯¢äº§åä¿¡æ¯ï¼åªèµå¼æ°é |
| | | // æ ¹æ®è®¢åå·IDæ¥è¯¢äº§åä¿¡æ¯ï¼åªèµå¼æ°é |
| | | try { |
| | | const res = await productList({ salesLedgerId: value, type: 1 }); |
| | | const productData = res.data && res.data.length > 0 ? res.data[0] : null; |
| | |
| | | calcSampleQuantity(); |
| | | } |
| | | } catch (e) { |
| | | console.error('æ¥è¯¢éå®è®¢å产åä¿¡æ¯å¤±è´¥', e); |
| | | proxy.$modal.msgError('æ¥è¯¢éå®è®¢å产åä¿¡æ¯å¤±è´¥'); |
| | | console.error('æ¥è¯¢è®¢åå·äº§åä¿¡æ¯å¤±è´¥', e); |
| | | proxy.$modal.msgError('æ¥è¯¢è®¢åå·äº§åä¿¡æ¯å¤±è´¥'); |
| | | } |
| | | } else { |
| | | form.value.salesContractNo = ''; |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="6"> |
| | | <el-form-item label="éå®åå·" |
| | | <el-form-item label="订åå·" |
| | | prop="salesContractNo"> |
| | | <el-input v-model="searchForm.salesContractNo" |
| | | style="width: 240px" |
| | | placeholder="请è¾å
¥éå®åå·æç´¢" |
| | | placeholder="请è¾å
¥è®¢åå·æç´¢" |
| | | clearable /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | width: 120, |
| | | }, |
| | | { |
| | | label: "éå®åå·", |
| | | label: "订åå·", |
| | | prop: "salesContractNo", |
| | | width: 120, |
| | | }, |
| | | { |
| | | label: "é宿»ååå·", |
| | | prop: "masterContractNo", |
| | | width: 120, |
| | | }, |
| | | { |
| | | label: "æ£éªå", |
| | | prop: "checkName", |
| | | }, |
| | |
| | | }, |
| | | [ |
| | | { |
| | | label: "éå®ååå·", |
| | | label: "订åå·", |
| | | align: "center", |
| | | prop: "customerContractNo", |
| | | }, |
| | |
| | | <el-descriptions-item label="éè´ååå·">{{ currentPurchase.purchaseContractNumber }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä¾åºååç§°">{{ currentPurchase.supplierName }}</el-descriptions-item> |
| | | <el-descriptions-item label="项ç®åç§°">{{ currentPurchase.projectName }}</el-descriptions-item> |
| | | <el-descriptions-item label="éå®ååå·">{{ currentPurchase.salesContractNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="订åå·">{{ currentPurchase.salesContractNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="ç¾è®¢æ¥æ">{{ currentPurchase.executionDate }}</el-descriptions-item> |
| | | <el-descriptions-item label="å½å
¥æ¥æ">{{ currentPurchase.entryDate }}</el-descriptions-item> |
| | | <el-descriptions-item label="仿¬¾æ¹å¼">{{ currentPurchase.paymentMethod }}</el-descriptions-item> |
| | |
| | | <div class="app-container"> |
| | | <div class="search_form"> |
| | | <el-form :model="searchForm" :inline="true"> |
| | | <el-form-item label="éå®è®¢åå·ï¼"> |
| | | <el-form-item label="订åå·å·ï¼"> |
| | | <el-input |
| | | v-model="searchForm.salesContractNo" |
| | | placeholder="请è¾å
¥" |
| | |
| | | <el-table-column align="center" type="selection" width="55" /> |
| | | <el-table-column align="center" label="åºå·" type="index" width="60" /> |
| | | <el-table-column |
| | | label="éå®è®¢å" |
| | | label="订åå·" |
| | | prop="salesContractNo" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="é宿»ååå·" |
| | | prop="masterContractNo" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | |
| | | prop="shippingCarNumber" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="å¿«éå
¬å¸" |
| | | prop="expressCompany" |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="å¿«éåå·" |
| | | prop="expressNumber" |
| | | show-overflow-tooltip |
| | | /> |
| | | <!-- <el-table-column--> |
| | | <!-- label="å¿«éå
¬å¸"--> |
| | | <!-- prop="expressCompany"--> |
| | | <!-- show-overflow-tooltip--> |
| | | <!-- />--> |
| | | <!-- <el-table-column--> |
| | | <!-- label="å¿«éåå·"--> |
| | | <!-- prop="expressNumber"--> |
| | | <!-- show-overflow-tooltip--> |
| | | <!-- />--> |
| | | <el-table-column |
| | | label="å®¡æ ¸ç¶æ" |
| | | prop="status" |
| | |
| | | > |
| | | <div v-if="detailRow" class="detail-wrapper"> |
| | | <el-descriptions :column="2" border> |
| | | <el-descriptions-item label="éå®è®¢å">{{ |
| | | <el-descriptions-item label="订åå·">{{ |
| | | detailRow.salesContractNo || "--" |
| | | }}</el-descriptions-item> |
| | | <el-descriptions-item label="å货订åå·">{{ |
| | |
| | | const dialogFormVisible = ref(false); |
| | | const data = reactive({ |
| | | searchForm: { |
| | | salesContractNo: "", // éå®è®¢åå· |
| | | salesContractNo: "", // 订åå·å· |
| | | shippingCarNumber: "", // 车çå· |
| | | expressNumber: "", // å¿«éåå· |
| | | }, |
| | |
| | | }, |
| | | rules: { |
| | | salesContractNo: [ |
| | | { required: true, message: "è¯·éæ©éå®è®¢å", trigger: "change" }, |
| | | { required: true, message: "è¯·éæ©è®¢åå·", trigger: "change" }, |
| | | ], |
| | | customerName: [ |
| | | { required: true, message: "请è¾å
¥å®¢æ·åç§°", trigger: "blur" }, |
| | |
| | | }); |
| | | }; |
| | | |
| | | // éå®è®¢åååæ¶èªå¨å¡«å
客æ·åç§° |
| | | // 订åå·ååæ¶èªå¨å¡«å
客æ·åç§° |
| | | const handleSalesOrderChange = (value) => { |
| | | const selectedOrder = salesOrderOptions.value.find( |
| | | (item) => item.salesContractNo === value |
| | |
| | | label="åºå·" |
| | | type="index" |
| | | width="60" /> |
| | | <el-table-column label="éå®è®¢å" |
| | | <el-table-column label="订åå·" |
| | | prop="salesContractNo" |
| | | show-overflow-tooltip |
| | | width="150" /> |
| | | <el-table-column label="é宿»ååå·" |
| | | prop="masterContractNo" |
| | | show-overflow-tooltip |
| | | width="150" /> |
| | | <!-- <el-table-column label="å货订åå·" |
| | | prop="shippingNo" |
| | | show-overflow-tooltip |
| | |
| | | <el-tag :type="getStatusType(detail.status)">{{ getStatusText(detail.status) }}</el-tag> |
| | | </el-descriptions-item> |
| | | <el-descriptions-item label="客æ·åç§°">{{ detail.customerName }}</el-descriptions-item> |
| | | <el-descriptions-item label="éå®åå·">{{ detail.salesContractNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="订åå·">{{ detail.salesContractNo }}</el-descriptions-item> |
| | | <el-descriptions-item label="ä¸å¡å">{{ detail.salesman }}</el-descriptions-item> |
| | | <el-descriptions-item label="å
³èæ¹å·">{{ detail.shippingNo }}</el-descriptions-item> |
| | | <!-- <el-descriptions-item label="项ç®åç§°">{{ detail.projectName }}</el-descriptions-item> --> |
| | |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <el-form-item label="éå®ååå·ï¼"> |
| | | <el-form-item label="订åå·ï¼"> |
| | | <el-input v-model="form.salesContractNo" disabled placeholder="--" /> |
| | | </el-form-item> |
| | | </el-col> |
| | |
| | | <el-form-item label="客æ·åç§°"> |
| | | <el-input v-model="searchForm.customerName" placeholder="客æ·åç§°" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="éå®åå·"> |
| | | <el-input v-model="searchForm.salesContractNo" placeholder="éå®åå·" clearable /> |
| | | <el-form-item label="订åå·"> |
| | | <el-input v-model="searchForm.salesContractNo" placeholder="订åå·" clearable /> |
| | | </el-form-item> |
| | | <el-form-item label="å
³èæ¹å·"> |
| | | <el-input v-model="searchForm.shippingNo" placeholder="å
³èæ¹å·" clearable /> |
| | |
| | | { label: "éè´§ç¶æ", prop: "returnStatus", minWidth: 100, dataType: "slot", slot: "returnStatus" }, |
| | | { label: "å¶åæ¶é´", prop: "makeTime", minWidth: 170 }, |
| | | { label: "客æ·åç§°", prop: "customerName", minWidth: 220 }, |
| | | { label: "éå®åå·", prop: "salesContractNo", minWidth: 160 }, |
| | | { label: "订åå·", prop: "salesContractNo", minWidth: 160 }, |
| | | { label: "é宿»ååå·", prop: "masterContractNo", minWidth: 160 }, |
| | | { label: "ä¸å¡å", prop: "salesman", minWidth: 120 }, |
| | | { label: "å
³èæ¹å·", prop: "shippingNo", minWidth: 170 }, |
| | | { label: "项ç®åç§°", prop: "projectName", minWidth: 180 }, |
| | |
| | | @change="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | <el-form-item label="éå®ååå·ï¼"> |
| | | <el-form-item label="订åå·ï¼"> |
| | | <el-input |
| | | v-model="searchForm.salesContractNo" |
| | | placeholder="请è¾å
¥" |
| | |
| | | show-overflow-tooltip |
| | | /> |
| | | <el-table-column |
| | | label="éå®ååå·" |
| | | label="订åå·" |
| | | prop="salesContractNo" |
| | | width="180" |
| | | show-overflow-tooltip |
| | |
| | | </el-row> |
| | | <el-row :gutter="30"> |
| | | <el-col :span="12"> |
| | | <el-form-item label="éå®ååå·ï¼" prop="salesContractNo"> |
| | | <el-form-item label="订åå·ï¼" prop="salesContractNo"> |
| | | <div |
| | | style=" |
| | | display: flex; |
| | |
| | | form.value.executionDate = getCurrentDate(); |
| | | // å建æ¶é´é»è®¤ä¸ºå½å¤© |
| | | form.value.createTime = dayjs().format("YYYY-MM-DD HH:mm:ss"); |
| | | // é»è®¤èªå¨çæéå®ååå· |
| | | // é»è®¤èªå¨çæè®¢åå· |
| | | form.value.autoGenerateContractNo = true; |
| | | } else { |
| | | currentId.value = row.id; |
| | |
| | | return status === "å·²åè´§" || status === "å®¡æ ¸éè¿"; |
| | | }; |
| | | |
| | | /** 夿éå®è®¢å䏿¯å¦åå¨å·²åè´§/åè´§å®æç产åï¼ä¸å¯å é¤ï¼ */ |
| | | /** å¤æè®¢åå·ä¸æ¯å¦åå¨å·²åè´§/åè´§å®æç产åï¼ä¸å¯å é¤ï¼ */ |
| | | const hasShippedProducts = (products) => { |
| | | if (!products || !products.length) return false; |
| | | return products.some((p) => { |
| | |
| | | } |
| | | const ids = selectedRows.value.map((item) => item.id); |
| | | |
| | | // æ£æ¥æ¯å¦æå·²è¿è¡åè´§æåè´§å®æçéå®è®¢åï¼è¥æåä¸å
许å é¤ |
| | | // æ£æ¥æ¯å¦æå·²è¿è¡åè´§æåè´§å®æç订åå·ï¼è¥æåä¸å
许å é¤ |
| | | const cannotDeleteNames = []; |
| | | for (const row of selectedRows.value) { |
| | | let products = |
| | |
| | | } |
| | | if (cannotDeleteNames.length > 0) { |
| | | proxy.$modal.msgWarning( |
| | | "å·²è¿è¡åè´§æåè´§å®æçéå®è®¢åä¸è½å é¤ï¼" + cannotDeleteNames.join("ã") |
| | | "å·²è¿è¡åè´§æåè´§å®æç订åå·ä¸è½å é¤ï¼" + cannotDeleteNames.join("ã") |
| | | ); |
| | | return; |
| | | } |