6、明细记录中有删除操作的,需设置权限;
7、质量管理要设置检验规则;
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # 客æ·å¾æ¥å¤ç»´åº¦æç»åè½å端èè°ææ¡£ |
| | | |
| | | > ä¼å客æ·å¾æ¥åè½ï¼æ°å¢å¤ç»´åº¦æç»æ¥è¯¢æ¥å£ï¼æ¯æäº§åæç»ååè´§æç»ç»´åº¦ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - è¥é管ç / 客æ·å¾æ¥ - 客æ·å¾æ¥å表页 |
| | | - è¥é管ç / 客æ·å¾æ¥ - 客æ·å¾æ¥è¯¦æ
é¡µï¼æ°å¢ï¼ |
| | | - è¥é管ç / 客æ·å¾æ¥ - 产åæç»Tabï¼æ°å¢ï¼ |
| | | - è¥é管ç / 客æ·å¾æ¥ - åè´§æç»Tabï¼æ°å¢ï¼ |
| | | |
| | | ## API |
| | | |
| | | ### 1. 客æ·å¾æ¥å表ï¼åææ¥å£ï¼æªåæ´ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /metricStatistics/customewTransactions | 客æ·å¾æ¥å表 | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | pageNum | Long | å¦ | 页ç ï¼é»è®¤1 | |
| | | | pageSize | Long | å¦ | æ¯é¡µæ¡æ°ï¼é»è®¤10 | |
| | | | customerName | String | å¦ | 客æ·åç§°ï¼æ¨¡ç³æç´¢ï¼ | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | customerId | Long | 客æ·ID | |
| | | | customerName | String | 客æ·åç§° | |
| | | | contractAmounts | BigDecimal | ååæ»éé¢ | |
| | | | receiptPaymentAmount | BigDecimal | æ¶æ¬¾éé¢ | |
| | | | receiptableAmount | BigDecimal | åºæ¶éé¢ | |
| | | |
| | | --- |
| | | |
| | | ### 1.5 客æ·å¾æ¥æç»ï¼åææ¥å£ï¼æ°å¢åæ®µï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /metricStatistics/customewTransactionsDetails | 客æ·å¾æ¥æç»ï¼ååç»´åº¦ï¼ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | customerId | Long | æ¯ | 客æ·ID | |
| | | | pageNum | Long | å¦ | 页ç ï¼é»è®¤1 | |
| | | | pageSize | Long | å¦ | æ¯é¡µæ¡æ°ï¼é»è®¤10 | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | salesLedgerId | Long | éå®å°è´¦ID | |
| | | | salesContractNo | String | éå®ååå· | |
| | | | executionDate | LocalDate | ååç¾è®¢æ¥æ | |
| | | | contractAmount | BigDecimal | ååéé¢ | |
| | | | **productNames** | String | **产ååç§°å表ï¼éå·åéï¼ãæ°å¢ã** | |
| | | | receiptPaymentAmount | BigDecimal | æ¶æ¬¾éé¢ | |
| | | | receiptableAmount | BigDecimal | åºæ¶éé¢ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "salesLedgerId": 1, |
| | | "salesContractNo": "HT-2026-001", |
| | | "executionDate": "2026-06-01", |
| | | "contractAmount": 50000.00, |
| | | "productNames": "产åA,产åB,产åC", |
| | | "receiptPaymentAmount": 30000.00, |
| | | "receiptableAmount": 20000.00 |
| | | } |
| | | ], |
| | | "total": 10 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 2. 客æ·å¾æ¥ç»è®¡æ±æ»ï¼æ°å¢ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /metricStatistics/customerTransactionsSummary | 客æ·å¾æ¥ç»è®¡æ±æ» | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | customerId | Long | æ¯ | 客æ·ID | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | customerId | Long | 客æ·ID | |
| | | | customerName | String | 客æ·åç§° | |
| | | | contractAmounts | BigDecimal | ååæ»éé¢ | |
| | | | contractCount | Integer | ååæ°é | |
| | | | productCount | Integer | 产åç§ç±»æ° | |
| | | | shippedAmounts | BigDecimal | åè´§æ»éé¢ | |
| | | | shippedQuantity | BigDecimal | åè´§æ»æ°é | |
| | | | receivedAmounts | BigDecimal | æ¶æ¬¾éé¢ | |
| | | | receivableAmounts | BigDecimal | åºæ¶éé¢ | |
| | | | returnAmounts | BigDecimal | éè´§éé¢ | |
| | | | unshippedAmounts | BigDecimal | æªåè´§éé¢ | |
| | | | receivedRate | BigDecimal | æ¶æ¬¾ç(%) | |
| | | | shippedRate | BigDecimal | åè´§ç(%) | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "customerId": 1, |
| | | "customerName": "客æ·A", |
| | | "contractAmounts": 100000.00, |
| | | "contractCount": 5, |
| | | "productCount": 12, |
| | | "shippedAmounts": 80000.00, |
| | | "shippedQuantity": 500, |
| | | "receivedAmounts": 60000.00, |
| | | "receivableAmounts": 20000.00, |
| | | "returnAmounts": 5000.00, |
| | | "unshippedAmounts": 20000.00, |
| | | "receivedRate": 75.00, |
| | | "shippedRate": 80.00 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 3. 客æ·å¾æ¥äº§åæç»ï¼æ°å¢ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /metricStatistics/customerTransactionsProducts | 客æ·å¾æ¥äº§åæç» | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | customerId | Long | æ¯ | 客æ·ID | |
| | | | salesLedgerId | Long | å¦ | éå®å°è´¦IDï¼å¯éï¼ç¨äºçéæååï¼ | |
| | | | pageNum | Long | å¦ | 页ç ï¼é»è®¤1 | |
| | | | pageSize | Long | å¦ | æ¯é¡µæ¡æ°ï¼é»è®¤10 | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | salesLedgerId | Long | éå®å°è´¦ID | |
| | | | salesContractNo | String | éå®ååå· | |
| | | | productId | Long | 产åID | |
| | | | productName | String | 产ååç§° | |
| | | | model | String | è§æ ¼åå· | |
| | | | unit | String | åä½ | |
| | | | contractQuantity | BigDecimal | ååæ°é | |
| | | | taxInclusiveUnitPrice | BigDecimal | åååä»·(å«ç¨) | |
| | | | contractAmount | BigDecimal | ååéé¢ | |
| | | | shippedQuantity | BigDecimal | å·²åè´§æ°é | |
| | | | shippedAmount | BigDecimal | å·²åè´§éé¢ | |
| | | | receivedAmount | BigDecimal | å·²æ¶æ¬¾éé¢ | |
| | | | receivableAmount | BigDecimal | åºæ¶éé¢ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "salesLedgerId": 1, |
| | | "salesContractNo": "HT-2026-001", |
| | | "productId": 10, |
| | | "productName": "产åA", |
| | | "model": "è§æ ¼1", |
| | | "unit": "ä»¶", |
| | | "contractQuantity": 100, |
| | | "taxInclusiveUnitPrice": 50.00, |
| | | "contractAmount": 5000.00, |
| | | "shippedQuantity": 80, |
| | | "shippedAmount": 4000.00, |
| | | "receivedAmount": 3000.00, |
| | | "receivableAmount": 1000.00 |
| | | } |
| | | ], |
| | | "total": 25, |
| | | "pageNum": 1, |
| | | "pageSize": 10 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 4. 客æ·å¾æ¥åè´§æç»ï¼æ°å¢ï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /metricStatistics/customerTransactionsShipments | 客æ·å¾æ¥åè´§æç» | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | customerId | Long | æ¯ | 客æ·ID | |
| | | | salesLedgerId | Long | å¦ | éå®å°è´¦IDï¼å¯éï¼ç¨äºçéæååï¼ | |
| | | | pageNum | Long | å¦ | 页ç ï¼é»è®¤1 | |
| | | | pageSize | Long | å¦ | æ¯é¡µæ¡æ°ï¼é»è®¤10 | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | salesLedgerId | Long | éå®å°è´¦ID | |
| | | | salesContractNo | String | éå®ååå· | |
| | | | shippingId | Long | åè´§åID | |
| | | | shippingNo | String | åè´§åå· | |
| | | | productName | String | 产ååç§° | |
| | | | model | String | è§æ ¼åå· | |
| | | | shippingQuantity | BigDecimal | åè´§æ°é | |
| | | | shippingAmount | BigDecimal | åè´§éé¢(å«ç¨) | |
| | | | batchNo | String | åºåºæ¹å· | |
| | | | shippingDate | LocalDate | åè´§æ¥æ | |
| | | | approvalStatus | Integer | 审æ¹ç¶æ(0å¾
审/1已审) | |
| | | | receivedAmount | BigDecimal | å·²æ¶æ¬¾éé¢ | |
| | | | receivableAmount | BigDecimal | åºæ¶éé¢ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "salesLedgerId": 1, |
| | | "salesContractNo": "HT-2026-001", |
| | | "shippingId": 100, |
| | | "shippingNo": "FH-2026-001", |
| | | "productName": "产åA", |
| | | "model": "è§æ ¼1", |
| | | "shippingQuantity": 50, |
| | | "shippingAmount": 2500.00, |
| | | "batchNo": "20260618001", |
| | | "shippingDate": "2026-06-18", |
| | | "approvalStatus": 1, |
| | | "receivedAmount": 2000.00, |
| | | "receivableAmount": 500.00 |
| | | } |
| | | ], |
| | | "total": 30, |
| | | "pageNum": 1, |
| | | "pageSize": 10 |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端页é¢è®¾è®¡ |
| | | |
| | | ### 1. 客æ·å¾æ¥å表页ï¼ä¼åï¼ |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- æç´¢æ --> |
| | | <el-form :model="queryParams" ref="queryForm" :inline="true"> |
| | | <el-form-item label="客æ·åç§°" prop="customerName"> |
| | | <el-input v-model="queryParams.customerName" placeholder="请è¾å
¥å®¢æ·åç§°" clearable /> |
| | | </el-form-item> |
| | | <el-form-item> |
| | | <el-button type="primary" @click="getList">æç´¢</el-button> |
| | | <el-button @click="resetQuery">éç½®</el-button> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- æ°æ®è¡¨æ ¼ --> |
| | | <el-table :data="list" v-loading="loading"> |
| | | <el-table-column label="客æ·åç§°" prop="customerName" /> |
| | | <el-table-column label="ååæ»éé¢" prop="contractAmounts" align="right"> |
| | | <template #default="{ row }"> |
| | | {{ formatMoney(row.contractAmounts) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æ¶æ¬¾éé¢" prop="receiptPaymentAmount" align="right"> |
| | | <template #default="{ row }"> |
| | | {{ formatMoney(row.receiptPaymentAmount) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºæ¶éé¢" prop="receiptableAmount" align="right"> |
| | | <template #default="{ row }"> |
| | | <span :class="{ 'text-danger': row.receiptableAmount > 0 }"> |
| | | {{ formatMoney(row.receiptableAmount) }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="æä½" width="150" align="center"> |
| | | <template #default="{ row }"> |
| | | <el-button type="text" @click="viewDetail(row)">æ¥çæç»</el-button> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <el-pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | @pagination="getList" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'CustomerTransactions', |
| | | data() { |
| | | return { |
| | | loading: false, |
| | | list: [], |
| | | total: 0, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | customerName: '' |
| | | } |
| | | } |
| | | }, |
| | | created() { |
| | | this.getList() |
| | | }, |
| | | methods: { |
| | | getList() { |
| | | this.loading = true |
| | | this.$axios.get('/metricStatistics/customewTransactions', { params: this.queryParams }) |
| | | .then(res => { |
| | | this.list = res.data.records |
| | | this.total = res.data.total |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | resetQuery() { |
| | | this.queryParams.customerName = '' |
| | | this.getList() |
| | | }, |
| | | formatMoney(value) { |
| | | if (!value) return '0.00' |
| | | return Number(value).toFixed(2) |
| | | }, |
| | | viewDetail(row) { |
| | | this.$router.push({ path: '/sales/customerTransactions/detail', query: { customerId: row.customerId } }) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 2. 客æ·å¾æ¥è¯¦æ
é¡µï¼æ°å¢ï¼ |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="app-container"> |
| | | <!-- é¡¶é¨ç»è®¡å¡ç --> |
| | | <el-card class="summary-card"> |
| | | <div slot="header"> |
| | | <span>{{ summary.customerName }} - 徿¥ç»è®¡</span> |
| | | </div> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">ååæ»éé¢</div> |
| | | <div class="stat-value">{{ formatMoney(summary.contractAmounts) }}</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">ååæ°é</div> |
| | | <div class="stat-value">{{ summary.contractCount }}份</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">产åç§ç±»</div> |
| | | <div class="stat-value">{{ summary.productCount }}ç§</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">åè´§éé¢</div> |
| | | <div class="stat-value">{{ formatMoney(summary.shippedAmounts) }}</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">æ¶æ¬¾éé¢</div> |
| | | <div class="stat-value text-success">{{ formatMoney(summary.receivedAmounts) }}</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">åºæ¶éé¢</div> |
| | | <div class="stat-value text-danger">{{ formatMoney(summary.receivableAmounts) }}</div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | <el-row :gutter="20" style="margin-top: 15px;"> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">éè´§éé¢</div> |
| | | <div class="stat-value">{{ formatMoney(summary.returnAmounts) }}</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">æªåè´§éé¢</div> |
| | | <div class="stat-value text-warning">{{ formatMoney(summary.unshippedAmounts) }}</div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">æ¶æ¬¾ç</div> |
| | | <div class="stat-value"> |
| | | <el-progress :percentage="summary.receivedRate || 0" :stroke-width="18" /> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | <el-col :span="4"> |
| | | <div class="stat-item"> |
| | | <div class="stat-label">åè´§ç</div> |
| | | <div class="stat-value"> |
| | | <el-progress :percentage="summary.shippedRate || 0" :stroke-width="18" color="#67c23a" /> |
| | | </div> |
| | | </div> |
| | | </el-col> |
| | | </el-row> |
| | | </el-card> |
| | | |
| | | <!-- Tab 忢 --> |
| | | <el-tabs v-model="activeTab" @tab-click="handleTabChange"> |
| | | <el-tab-pane label="产åæç»" name="products"> |
| | | <product-table :customerId="customerId" /> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="åè´§æç»" name="shipments"> |
| | | <shipment-table :customerId="customerId" /> |
| | | </el-tab-pane> |
| | | <el-tab-pane label="ååæç»" name="contracts"> |
| | | <contract-table :customerId="customerId" /> |
| | | </el-tab-pane> |
| | | </el-tabs> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | import ProductTable from './components/ProductTable.vue' |
| | | import ShipmentTable from './components/ShipmentTable.vue' |
| | | import ContractTable from './components/ContractTable.vue' |
| | | |
| | | export default { |
| | | name: 'CustomerTransactionsDetail', |
| | | components: { ProductTable, ShipmentTable, ContractTable }, |
| | | data() { |
| | | return { |
| | | customerId: null, |
| | | summary: {}, |
| | | activeTab: 'products' |
| | | } |
| | | }, |
| | | created() { |
| | | this.customerId = this.$route.query.customerId |
| | | if (this.customerId) { |
| | | this.getSummary() |
| | | } |
| | | }, |
| | | methods: { |
| | | getSummary() { |
| | | this.$axios.get('/metricStatistics/customerTransactionsSummary', { |
| | | params: { customerId: this.customerId } |
| | | }).then(res => { |
| | | this.summary = res.data |
| | | }) |
| | | }, |
| | | formatMoney(value) { |
| | | if (!value) return '0.00' |
| | | return Number(value).toFixed(2) |
| | | }, |
| | | handleTabChange(tab) { |
| | | // Tab 忢æ¶å·æ°åç»ä»¶æ°æ® |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | |
| | | <style scoped> |
| | | .summary-card { |
| | | margin-bottom: 20px; |
| | | } |
| | | .stat-item { |
| | | text-align: center; |
| | | } |
| | | .stat-label { |
| | | font-size: 14px; |
| | | color: #909399; |
| | | } |
| | | .stat-value { |
| | | font-size: 18px; |
| | | font-weight: bold; |
| | | margin-top: 5px; |
| | | } |
| | | .text-success { |
| | | color: #67c23a; |
| | | } |
| | | .text-danger { |
| | | color: #f56c6c; |
| | | } |
| | | .text-warning { |
| | | color: #e6a23c; |
| | | } |
| | | </style> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 3. 产åæç»ç»ä»¶ (ProductTable.vue) |
| | | |
| | | ```html |
| | | <template> |
| | | <div> |
| | | <!-- çé --> |
| | | <el-form :inline="true" size="small"> |
| | | <el-form-item label="ååå·"> |
| | | <el-select v-model="filterData.salesLedgerId" clearable placeholder="å
¨é¨åå" @change="getList"> |
| | | <el-option v-for="item in contractList" :key="item.id" :label="item.salesContractNo" :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- è¡¨æ ¼ --> |
| | | <el-table :data="list" v-loading="loading" size="small"> |
| | | <el-table-column label="ååå·" prop="salesContractNo" width="150" /> |
| | | <el-table-column label="产ååç§°" prop="productName" /> |
| | | <el-table-column label="è§æ ¼åå·" prop="model" width="120" /> |
| | | <el-table-column label="åä½" prop="unit" width="80" /> |
| | | <el-table-column label="ååæ°é" prop="contractQuantity" align="right" width="100" /> |
| | | <el-table-column label="åååä»·" prop="taxInclusiveUnitPrice" align="right" width="100"> |
| | | <template #default="{ row }"> |
| | | {{ formatMoney(row.taxInclusiveUnitPrice) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="ååéé¢" prop="contractAmount" align="right" width="120"> |
| | | <template #default="{ row }"> |
| | | {{ formatMoney(row.contractAmount) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å·²åè´§æ°é" prop="shippedQuantity" align="right" width="100" /> |
| | | <el-table-column label="å·²åè´§éé¢" prop="shippedAmount" align="right" width="120"> |
| | | <template #default="{ row }"> |
| | | {{ formatMoney(row.shippedAmount) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å·²æ¶æ¬¾éé¢" prop="receivedAmount" align="right" width="120"> |
| | | <template #default="{ row }"> |
| | | <span class="text-success">{{ formatMoney(row.receivedAmount) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºæ¶éé¢" prop="receivableAmount" align="right" width="120"> |
| | | <template #default="{ row }"> |
| | | <span :class="{ 'text-danger': row.receivableAmount > 0 }"> |
| | | {{ formatMoney(row.receivableAmount) }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åè´§è¿åº¦" width="150"> |
| | | <template #default="{ row }"> |
| | | <el-progress |
| | | :percentage="calcPercent(row.shippedQuantity, row.contractQuantity)" |
| | | :stroke-width="10" |
| | | /> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <el-pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | layout="total, prev, pager, next" |
| | | @pagination="getList" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'ProductTable', |
| | | props: { |
| | | customerId: { |
| | | type: Number, |
| | | required: true |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | loading: false, |
| | | list: [], |
| | | total: 0, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | customerId: null, |
| | | salesLedgerId: null |
| | | }, |
| | | filterData: { |
| | | salesLedgerId: null |
| | | }, |
| | | contractList: [] |
| | | } |
| | | }, |
| | | watch: { |
| | | customerId(val) { |
| | | if (val) { |
| | | this.queryParams.customerId = val |
| | | this.getList() |
| | | this.getContractList() |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | getList() { |
| | | this.loading = true |
| | | this.queryParams.salesLedgerId = this.filterData.salesLedgerId |
| | | this.$axios.get('/metricStatistics/customerTransactionsProducts', { params: this.queryParams }) |
| | | .then(res => { |
| | | this.list = res.data.records |
| | | this.total = res.data.total |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | getContractList() { |
| | | // è·å该客æ·çååå表ç¨äºçé |
| | | this.$axios.get('/metricStatistics/customewTransactionsDetails', { |
| | | params: { customerId: this.customerId, pageNum: 1, pageSize: 100 } |
| | | }).then(res => { |
| | | this.contractList = res.data.records |
| | | }) |
| | | }, |
| | | formatMoney(value) { |
| | | if (!value) return '0.00' |
| | | return Number(value).toFixed(2) |
| | | }, |
| | | calcPercent(shipped, total) { |
| | | if (!total || total === 0) return 0 |
| | | return Math.round((shipped / total) * 100) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 4. åè´§æç»ç»ä»¶ (ShipmentTable.vue) |
| | | |
| | | ```html |
| | | <template> |
| | | <div> |
| | | <!-- çé --> |
| | | <el-form :inline="true" size="small"> |
| | | <el-form-item label="ååå·"> |
| | | <el-select v-model="filterData.salesLedgerId" clearable placeholder="å
¨é¨åå" @change="getList"> |
| | | <el-option v-for="item in contractList" :key="item.id" :label="item.salesContractNo" :value="item.id" /> |
| | | </el-select> |
| | | </el-form-item> |
| | | </el-form> |
| | | |
| | | <!-- è¡¨æ ¼ --> |
| | | <el-table :data="list" v-loading="loading" size="small"> |
| | | <el-table-column label="ååå·" prop="salesContractNo" width="150" /> |
| | | <el-table-column label="åè´§åå·" prop="shippingNo" width="150" /> |
| | | <el-table-column label="产ååç§°" prop="productName" /> |
| | | <el-table-column label="è§æ ¼åå·" prop="model" width="120" /> |
| | | <el-table-column label="åè´§æ°é" prop="shippingQuantity" align="right" width="100" /> |
| | | <el-table-column label="åè´§éé¢" prop="shippingAmount" align="right" width="120"> |
| | | <template #default="{ row }"> |
| | | {{ formatMoney(row.shippingAmount) }} |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºåºæ¹å·" prop="batchNo" width="150" /> |
| | | <el-table-column label="åè´§æ¥æ" prop="shippingDate" width="120" /> |
| | | <el-table-column label="审æ¹ç¶æ" prop="approvalStatus" width="100"> |
| | | <template #default="{ row }"> |
| | | <el-tag :type="row.approvalStatus === 1 ? 'success' : 'warning'" size="mini"> |
| | | {{ row.approvalStatus === 1 ? '已审' : 'å¾
审' }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å·²æ¶æ¬¾éé¢" prop="receivedAmount" align="right" width="120"> |
| | | <template #default="{ row }"> |
| | | <span class="text-success">{{ formatMoney(row.receivedAmount) }}</span> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="åºæ¶éé¢" prop="receivableAmount" align="right" width="120"> |
| | | <template #default="{ row }"> |
| | | <span :class="{ 'text-danger': row.receivableAmount > 0 }"> |
| | | {{ formatMoney(row.receivableAmount) }} |
| | | </span> |
| | | </template> |
| | | </el-table-column> |
| | | </el-table> |
| | | |
| | | <!-- å页 --> |
| | | <el-pagination |
| | | v-show="total > 0" |
| | | :total="total" |
| | | :page.sync="queryParams.pageNum" |
| | | :limit.sync="queryParams.pageSize" |
| | | layout="total, prev, pager, next" |
| | | @pagination="getList" |
| | | /> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'ShipmentTable', |
| | | props: { |
| | | customerId: { |
| | | type: Number, |
| | | required: true |
| | | } |
| | | }, |
| | | data() { |
| | | return { |
| | | loading: false, |
| | | list: [], |
| | | total: 0, |
| | | queryParams: { |
| | | pageNum: 1, |
| | | pageSize: 10, |
| | | customerId: null, |
| | | salesLedgerId: null |
| | | }, |
| | | filterData: { |
| | | salesLedgerId: null |
| | | }, |
| | | contractList: [] |
| | | } |
| | | }, |
| | | watch: { |
| | | customerId(val) { |
| | | if (val) { |
| | | this.queryParams.customerId = val |
| | | this.getList() |
| | | this.getContractList() |
| | | } |
| | | } |
| | | }, |
| | | methods: { |
| | | getList() { |
| | | this.loading = true |
| | | this.queryParams.salesLedgerId = this.filterData.salesLedgerId |
| | | this.$axios.get('/metricStatistics/customerTransactionsShipments', { params: this.queryParams }) |
| | | .then(res => { |
| | | this.list = res.data.records |
| | | this.total = res.data.total |
| | | }) |
| | | .finally(() => { |
| | | this.loading = false |
| | | }) |
| | | }, |
| | | getContractList() { |
| | | this.$axios.get('/metricStatistics/customewTransactionsDetails', { |
| | | params: { customerId: this.customerId, pageNum: 1, pageSize: 100 } |
| | | }).then(res => { |
| | | this.contractList = res.data.records |
| | | }) |
| | | }, |
| | | formatMoney(value) { |
| | | if (!value) return '0.00' |
| | | return Number(value).toFixed(2) |
| | | } |
| | | } |
| | | } |
| | | </script> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **è·¯ç±é
ç½®**ï¼éå¨è·¯ç±ä¸æ°å¢å®¢æ·å¾æ¥è¯¦æ
é¡µè·¯ç± `/sales/customerTransactions/detail` |
| | | 2. **ç»ä»¶æå**ï¼äº§åæç»ååè´§æç»å»ºè®®æå为ç¬ç«ç»ä»¶ï¼ä¾¿äºå¤ç¨åç»´æ¤ |
| | | 3. **çéèå¨**ï¼äº§åæç»ååè´§æç»æ¯ææååçéï¼ååå表ä»åææ¥å£è·å |
| | | 4. **æ°æ®æ ¼å¼**ï¼éé¢å段éç»ä¸ä½¿ç¨ `formatMoney` æ¹æ³æ ¼å¼åæ¾ç¤º |
| | | 5. **è¿åº¦æ¡æ¾ç¤º**ï¼äº§åæç»ä¸çåè´§è¿åº¦ä½¿ç¨ `el-progress` ç»ä»¶ç´è§å±ç¤º |
| | | 6. **ç¶ææ è¯**ï¼åºæ¶éé¢å¤§äº0æ¶ä½¿ç¨çº¢è²æ è¯ï¼å·²æ¶æ¬¾ä½¿ç¨ç»¿è²æ è¯ |
| | | 7. **审æ¹ç¶æ**ï¼åè´§æç»ä¸ç审æ¹ç¶æä½¿ç¨ `el-tag` å±ç¤ºï¼å·²å®¡ä¸ºç»¿è²ï¼å¾
审为é»è² |
| | | |
| | | --- |
| | | |
| | | ## æ°æ®å¯¹æ¯ |
| | | |
| | | ### ä¼åå vs ä¼åå |
| | | |
| | | | 维度 | ä¼åå | ä¼åå | |
| | | |------|--------|--------| |
| | | | 客æ·å¾æ¥ | åªæååéé¢ãæ¶æ¬¾ãåºæ¶ | æ°å¢ååæ°ãäº§åæ°ãåè´§çãæ¶æ¬¾çç12é¡¹ææ | |
| | | | æç»ç»´åº¦ | ä»
ååæç» | æ°å¢äº§åæç»ãåè´§æç» | |
| | | | çéè½å | ä»
æå®¢æ·åçé | æ¯ææååçé产å/åè´§æç» | |
| | | | æ°æ®è¿½æº¯ | æ æ³è¿½æº¯å
·ä½åè´§ | å¯è¿½æº¯æ¯æ¡åè´§è®°å½çæ¶æ¬¾æ
åµ | |
| | | | è¿åº¦å±ç¤º | æ | åè´§è¿åº¦æ¡ç´è§å±ç¤º | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´§ç¶æåæ®µæ¥å£åæ´å端èè°ææ¡£ |
| | | |
| | | > éå®éè´§ãåè´§å°è´¦ãéå®å°è´¦æ¥å£æ°å¢éè´§ç¶æåæ®µ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éå®ç®¡ç / éå®éè´§åè¡¨é¡µé¢ |
| | | - éå®ç®¡ç / éå®éè´§ - æ°å¢/ç¼è¾éè´§åé¡µé¢ |
| | | - éå®ç®¡ç / åè´§å°è´¦åè¡¨é¡µé¢ |
| | | - éå®ç®¡ç / éå®å°è´¦åè¡¨é¡µé¢ |
| | | |
| | | --- |
| | | |
| | | ## API åæ´ |
| | | |
| | | ### 1. éå®éè´§å表 |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /returnManagement/listPage | éå®éè´§å页å表 | |
| | | |
| | | **æ°å¢ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | shippingQuantity | BigDecimal | åè´§æ°é | |
| | | | returnedQuantity | BigDecimal | å·²éè´§æ°é | |
| | | | returnStatus | String | éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "id": 1, |
| | | "returnNo": "TH-2026-001", |
| | | "shippingNo": "FH-2026-001", |
| | | "shippingQuantity": 50, |
| | | "returnedQuantity": 10, |
| | | "returnStatus": "é¨åéè´§" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 2. éå®éè´§-åè´§ä¿¡æ¯æ¥è¯¢ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /shippingInfo/getForReturn | éå®éè´§-éè¿å®¢æ·åç§°æ¥è¯¢åè´§ä¿¡æ¯ | |
| | | |
| | | **æ°å¢ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | returnedQuantity | BigDecimal | å·²éè´§æ°é | |
| | | | returnStatus | String | éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": [ |
| | | { |
| | | "shippingId": 100, |
| | | "shippingNo": "FH-2026-001", |
| | | "shippingQuantity": 50, |
| | | "returnedQuantity": 10, |
| | | "returnStatus": "é¨åéè´§", |
| | | "batchNo": "20260618001", |
| | | "displayLabel": "20260618001-京A12345-2026-06-18" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 3. åè´§å°è´¦å表 |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /shippingInfo/listPage | åè´§ä¿¡æ¯å页å表 | |
| | | |
| | | **æ°å¢ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | returnedQuantity | BigDecimal | å·²éè´§æ°é | |
| | | | returnStatus | String | éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "id": 100, |
| | | "shippingNo": "FH-2026-001", |
| | | "totalQuantity": 50, |
| | | "returnedQuantity": 0, |
| | | "returnStatus": "æ éè´§" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ### 4. éå®å°è´¦å表 |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /salesLedger/listPage | éå®å°è´¦å页å表 | |
| | | |
| | | **æ°å¢ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | returnedQuantity | BigDecimal | å·²éè´§æ°éï¼è¯¥éå®åå䏿æåè´§ç累计éè´§æ°ï¼ | |
| | | | returnStatus | String | éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "data": { |
| | | "records": [ |
| | | { |
| | | "id": 1, |
| | | "salesContractNo": "HT-2026-001", |
| | | "contractAmount": 100000, |
| | | "returnedQuantity": 30, |
| | | "returnStatus": "é¨åéè´§" |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éå®éè´§åè¡¨é¡µé¢ |
| | | |
| | | **æ°å¢è¡¨æ ¼åï¼** |
| | | |
| | | ```html |
| | | <el-table-column label="éè´§ç¶æ" prop="returnStatus" width="100"> |
| | | <template #default="{ row }"> |
| | | <el-tag |
| | | :type="row.returnStatus === 'æ éè´§' ? 'success' : (row.returnStatus === 'å
¨é¨éè´§' ? 'danger' : 'warning')" |
| | | > |
| | | {{ row.returnStatus }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 2. åè´§å°è´¦åè¡¨é¡µé¢ |
| | | |
| | | **æ°å¢è¡¨æ ¼åï¼** |
| | | |
| | | ```html |
| | | <el-table-column label="éè´§ç¶æ" prop="returnStatus" width="100"> |
| | | <template #default="{ row }"> |
| | | <el-tag |
| | | :type="row.returnStatus === 'æ éè´§' ? 'success' : (row.returnStatus === 'å
¨é¨éè´§' ? 'danger' : 'warning')" |
| | | > |
| | | {{ row.returnStatus }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | <el-table-column label="å·²éè´§æ°é" prop="returnedQuantity" width="120" /> |
| | | ``` |
| | | |
| | | ### 3. éå®å°è´¦åè¡¨é¡µé¢ |
| | | |
| | | **æ°å¢è¡¨æ ¼åï¼** |
| | | |
| | | ```html |
| | | <el-table-column label="éè´§ç¶æ" prop="returnStatus" width="100"> |
| | | <template #default="{ row }"> |
| | | <el-tag |
| | | :type="row.returnStatus === 'æ éè´§' ? 'success' : (row.returnStatus === 'å
¨é¨éè´§' ? 'danger' : 'warning')" |
| | | > |
| | | {{ row.returnStatus }} |
| | | </el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | ### 4. éå®éè´§é¡µé¢ - åè´§ä¿¡æ¯éæ© |
| | | |
| | | **䏿é项å¢å¼ºæ¾ç¤ºï¼** |
| | | |
| | | ```html |
| | | <el-select v-model="form.shippingId" placeholder="è¯·éæ©åè´§ä¿¡æ¯" filterable> |
| | | <el-option |
| | | v-for="item in shippingList" |
| | | :key="item.shippingId" |
| | | :label="item.displayLabel" |
| | | :value="item.shippingId" |
| | | > |
| | | <div style="display: flex; justify-content: space-between;"> |
| | | <span>{{ item.displayLabel }}</span> |
| | | <el-tag |
| | | size="small" |
| | | :type="item.returnStatus === 'æ éè´§' ? 'success' : 'warning'" |
| | | style="margin-left: 8px;" |
| | | > |
| | | {{ item.returnStatus }} |
| | | </el-tag> |
| | | </div> |
| | | </el-option> |
| | | </el-select> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## éè´§ç¶æè®¡ç®é»è¾ |
| | | |
| | | | æ¡ä»¶ | ç¶æ | |
| | | |------|------| |
| | | | éè´§æ°é = 0 | æ éè´§ | |
| | | | éè´§æ°é >= åè´§æ°é | å
¨é¨éè´§ | |
| | | | éè´§æ°é > 0 ä¸ < åè´§æ°é | é¨åéè´§ | |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **éå®å°è´¦çéè´§æ°é**ï¼æ¯æéå®ååç»´åº¦çæ±æ»ï¼å³è¯¥åå䏿æåè´§åç累计éè´§æ°é |
| | | |
| | | 2. **åè´§å°è´¦çéè´§æ°é**ï¼æ¯æåæ¡åè´§è®°å½ç»´åº¦çéè´§æ°é |
| | | |
| | | 3. **å端å±ç¤ºå»ºè®®**ï¼ |
| | | - æ éè´§ï¼ç»¿è²æ ç¾ (`success`) |
| | | - é¨åéè´§ï¼é»è²æ ç¾ (`warning`) |
| | | - å
¨é¨éè´§ï¼çº¢è²æ ç¾ (`danger`) |
| | | |
| | | 4. **éå®éè´§éæ©åè´§ä¿¡æ¯æ¶**ï¼å端å¯ä»¥æ ¹æ® `returnStatus` è¿æ»¤ææç¤ºç¨æ·ï¼é¿å
鿩已å
¨é¨éè´§çåè´§è®°å½ |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éå®éè´§åè´§ä¿¡æ¯æ¥å£ä¼åå端èè°ææ¡£ |
| | | |
| | | > ä¼åéå®éè´§åºæ¯ä¸çåè´§ä¿¡æ¯æ¥è¯¢æ¥å£ï¼æ°å¢æ¹æ¬¡å·å段ï¼å¹¶æä¾ç»åæ¾ç¤ºæ ç¾ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éå®ç®¡ç / éå®éè´§ - æ°å¢/ç¼è¾éè´§åé¡µé¢ |
| | | - éå®éè´§ - éæ©åè´§åä¸ææ¡ |
| | | |
| | | ## API |
| | | |
| | | ### æ°å¢æ¥å£ï¼éå®éè´§-åè´§ä¿¡æ¯æ¥è¯¢ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /shippingInfo/getForReturn | éå®éè´§-éè¿å®¢æ·åç§°æ¥è¯¢åè´§ä¿¡æ¯ï¼å«æ¹æ¬¡å·ï¼ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | customerName | String | æ¯ | 客æ·åç§° | |
| | | |
| | | **ååºå段ï¼** |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | shippingId | Long | åè´§åID | |
| | | | shippingNo | String | åè´§åå· | |
| | | | salesContractNo | String | éå®ååå· | |
| | | | customerName | String | 客æ·åç§° | |
| | | | productName | String | 产ååç§° | |
| | | | model | String | è§æ ¼åå· | |
| | | | shippingQuantity | BigDecimal | åè´§æ°é | |
| | | | batchNo | String | æ¹æ¬¡å· | |
| | | | shippingCarNumber | String | 车çå· | |
| | | | createTime | LocalDateTime | å建æ¶é´ | |
| | | | displayLabel | String | æ¾ç¤ºæ ç¾ï¼æ¹æ¬¡å·-车çå·-å建æ¶é´ï¼ | |
| | | |
| | | **ååºç¤ºä¾ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": [ |
| | | { |
| | | "shippingId": 100, |
| | | "shippingNo": "FH-2026-001", |
| | | "salesContractNo": "HT-2026-001", |
| | | "customerName": "客æ·A", |
| | | "productName": "产åA", |
| | | "model": "è§æ ¼1", |
| | | "shippingQuantity": 50, |
| | | "batchNo": "20260618001", |
| | | "shippingCarNumber": "京A12345", |
| | | "createTime": "2026-06-18 10:30:00", |
| | | "displayLabel": "20260618001-京A12345-2026-06-18" |
| | | }, |
| | | { |
| | | "shippingId": 101, |
| | | "shippingNo": "FH-2026-002", |
| | | "salesContractNo": "HT-2026-002", |
| | | "customerName": "客æ·A", |
| | | "productName": "产åB", |
| | | "model": "è§æ ¼2", |
| | | "shippingQuantity": 30, |
| | | "batchNo": "20260618002", |
| | | "shippingCarNumber": "京B67890", |
| | | "createTime": "2026-06-17 14:20:00", |
| | | "displayLabel": "20260618002-京B67890-2026-06-17" |
| | | } |
| | | ] |
| | | } |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## åææ¥å£ï¼ä¿çä¸åï¼ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /shippingInfo/getByCustomerName | éè¿å®¢æ·åç§°æ¥è¯¢å
³èçåè´§åå·ï¼åææ¥å£ï¼ | |
| | | |
| | | --- |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éå®éè´§é¡µé¢ - åè´§åéæ©ä¸ææ¡ |
| | | |
| | | **ä¿®æ¹åï¼** |
| | | ```html |
| | | <el-form-item label="åè´§åå·"> |
| | | <el-select v-model="form.shippingId" placeholder="è¯·éæ©åè´§åå·"> |
| | | <el-option |
| | | v-for="item in shippingList" |
| | | :key="item.id" |
| | | :label="item.shippingNo" |
| | | :value="item.id" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | **ä¿®æ¹åï¼** |
| | | ```html |
| | | <el-form-item label="åè´§åå·"> |
| | | <el-select |
| | | v-model="form.shippingId" |
| | | placeholder="è¯·éæ©åè´§åå·" |
| | | filterable |
| | | @change="onShippingChange" |
| | | > |
| | | <el-option |
| | | v-for="item in shippingList" |
| | | :key="item.shippingId" |
| | | :label="item.displayLabel" |
| | | :value="item.shippingId" |
| | | > |
| | | <span style="float: left">{{ item.displayLabel }}</span> |
| | | <span style="float: right; color: #8492a6; font-size: 12px"> |
| | | {{ item.productName }} - {{ item.shippingQuantity }}{{ item.model ? '(' + item.model + ')' : '' }} |
| | | </span> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | ### 2. data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | form: { |
| | | shippingId: null, |
| | | batchNo: '', |
| | | shippingCarNumber: '', |
| | | productName: '', |
| | | model: '', |
| | | shippingQuantity: null, |
| | | }, |
| | | shippingList: [], |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. methods æ¹æ³ |
| | | |
| | | ```js |
| | | methods: { |
| | | // æ¥è¯¢åè´§ä¿¡æ¯å表 |
| | | getShippingList(customerName) { |
| | | if (!customerName) { |
| | | this.shippingList = []; |
| | | return; |
| | | } |
| | | this.$axios.get('/shippingInfo/getForReturn', { |
| | | params: { customerName } |
| | | }).then(res => { |
| | | this.shippingList = res.data || []; |
| | | }); |
| | | }, |
| | | |
| | | // åè´§åéæ©åå |
| | | onShippingChange(shippingId) { |
| | | const selected = this.shippingList.find(item => item.shippingId === shippingId); |
| | | if (selected) { |
| | | // åæ¾æ°æ® |
| | | this.form.batchNo = selected.batchNo || ''; |
| | | this.form.shippingCarNumber = selected.shippingCarNumber || ''; |
| | | this.form.productName = selected.productName || ''; |
| | | this.form.model = selected.model || ''; |
| | | this.form.shippingQuantity = selected.shippingQuantity || 0; |
| | | this.form.salesContractNo = selected.salesContractNo || ''; |
| | | this.form.shippingNo = selected.shippingNo || ''; |
| | | } |
| | | }, |
| | | } |
| | | ``` |
| | | |
| | | ### 4. 宿´ç¤ºä¾ï¼éå®é货表åï¼ |
| | | |
| | | ```html |
| | | <template> |
| | | <div class="app-container"> |
| | | <el-form :model="form" :rules="rules" ref="formRef" label-width="120px"> |
| | | <!-- 客æ·éæ© --> |
| | | <el-form-item label="客æ·åç§°" prop="customerName"> |
| | | <el-select |
| | | v-model="form.customerName" |
| | | placeholder="è¯·éæ©å®¢æ·" |
| | | filterable |
| | | @change="onCustomerChange" |
| | | > |
| | | <el-option |
| | | v-for="item in customerList" |
| | | :key="item.id" |
| | | :label="item.customerName" |
| | | :value="item.customerName" |
| | | /> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <!-- åè´§åéæ© --> |
| | | <el-form-item label="åè´§ä¿¡æ¯" prop="shippingId"> |
| | | <el-select |
| | | v-model="form.shippingId" |
| | | placeholder="è¯·éæ©åè´§åå·" |
| | | filterable |
| | | :disabled="!form.customerName" |
| | | @change="onShippingChange" |
| | | > |
| | | <el-option |
| | | v-for="item in shippingList" |
| | | :key="item.shippingId" |
| | | :label="item.displayLabel" |
| | | :value="item.shippingId" |
| | | > |
| | | <div style="display: flex; justify-content: space-between;"> |
| | | <span>{{ item.displayLabel }}</span> |
| | | <span style="color: #909399; font-size: 12px"> |
| | | {{ item.productName }} |
| | | </span> |
| | | </div> |
| | | </el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <!-- åæ¾ä¿¡æ¯ï¼åªè¯»ï¼ --> |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="æ¹æ¬¡å·"> |
| | | <el-input v-model="form.batchNo" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="车çå·"> |
| | | <el-input v-model="form.shippingCarNumber" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="产ååç§°"> |
| | | <el-input v-model="form.productName" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <el-row :gutter="20"> |
| | | <el-col :span="8"> |
| | | <el-form-item label="è§æ ¼åå·"> |
| | | <el-input v-model="form.model" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="åè´§æ°é"> |
| | | <el-input v-model="form.shippingQuantity" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | <el-col :span="8"> |
| | | <el-form-item label="éå®ååå·"> |
| | | <el-input v-model="form.salesContractNo" disabled /> |
| | | </el-form-item> |
| | | </el-col> |
| | | </el-row> |
| | | |
| | | <!-- å
¶ä»é货表ååæ®µ... --> |
| | | </el-form> |
| | | </div> |
| | | </template> |
| | | |
| | | <script> |
| | | export default { |
| | | name: 'SalesReturnForm', |
| | | data() { |
| | | return { |
| | | form: { |
| | | customerName: '', |
| | | shippingId: null, |
| | | batchNo: '', |
| | | shippingCarNumber: '', |
| | | productName: '', |
| | | model: '', |
| | | shippingQuantity: null, |
| | | salesContractNo: '', |
| | | shippingNo: '', |
| | | }, |
| | | rules: { |
| | | customerName: [{ required: true, message: 'è¯·éæ©å®¢æ·', trigger: 'change' }], |
| | | shippingId: [{ required: true, message: 'è¯·éæ©åè´§ä¿¡æ¯', trigger: 'change' }], |
| | | }, |
| | | customerList: [], |
| | | shippingList: [], |
| | | }; |
| | | }, |
| | | methods: { |
| | | // 客æ·éæ©åå |
| | | onCustomerChange(customerName) { |
| | | // æ¸
空åè´§åéæ© |
| | | this.form.shippingId = null; |
| | | this.clearShippingInfo(); |
| | | // æ¥è¯¢åè´§ä¿¡æ¯ |
| | | this.getShippingList(customerName); |
| | | }, |
| | | |
| | | // æ¥è¯¢åè´§ä¿¡æ¯å表 |
| | | getShippingList(customerName) { |
| | | if (!customerName) { |
| | | this.shippingList = []; |
| | | return; |
| | | } |
| | | this.$axios.get('/shippingInfo/getForReturn', { |
| | | params: { customerName } |
| | | }).then(res => { |
| | | this.shippingList = res.data || []; |
| | | }); |
| | | }, |
| | | |
| | | // åè´§åéæ©åå |
| | | onShippingChange(shippingId) { |
| | | const selected = this.shippingList.find(item => item.shippingId === shippingId); |
| | | if (selected) { |
| | | this.form.batchNo = selected.batchNo || ''; |
| | | this.form.shippingCarNumber = selected.shippingCarNumber || ''; |
| | | this.form.productName = selected.productName || ''; |
| | | this.form.model = selected.model || ''; |
| | | this.form.shippingQuantity = selected.shippingQuantity; |
| | | this.form.salesContractNo = selected.salesContractNo || ''; |
| | | this.form.shippingNo = selected.shippingNo || ''; |
| | | } else { |
| | | this.clearShippingInfo(); |
| | | } |
| | | }, |
| | | |
| | | // æ¸
空åè´§ä¿¡æ¯ |
| | | clearShippingInfo() { |
| | | this.form.batchNo = ''; |
| | | this.form.shippingCarNumber = ''; |
| | | this.form.productName = ''; |
| | | this.form.model = ''; |
| | | this.form.shippingQuantity = null; |
| | | this.form.salesContractNo = ''; |
| | | this.form.shippingNo = ''; |
| | | }, |
| | | }, |
| | | }; |
| | | </script> |
| | | ``` |
| | | |
| | | --- |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | 1. **æ°æ¥å£ vs 忥å£**ï¼ |
| | | - `getForReturn`ï¼æ°å¢ï¼ï¼ä¸é¨ç¨äºéå®éè´§åºæ¯ï¼è¿åæ¹æ¬¡å·åç»åæ¾ç¤ºæ ç¾ |
| | | - `getByCustomerName`ï¼åæï¼ï¼ä¿æä¸åï¼å
¶ä»åºæ¯å¯ç»§ç»ä½¿ç¨ |
| | | |
| | | 2. **displayLabel æ ¼å¼**ï¼`æ¹æ¬¡å·-车çå·-å建æ¶é´(yyyy-MM-dd)` |
| | | - 示ä¾ï¼`20260618001-京A12345-2026-06-18` |
| | | - 妿æå段为空ï¼ä¼æ¾ç¤ºç©ºå符串ï¼å¦ `--2026-06-18` |
| | | |
| | | 3. **æ°æ®åæ¾**ï¼éæ©åè´§ååï¼æ¹æ¬¡å·ã车çå·ã产ååç§°çåæ®µèªå¨å¡«å
å°è¡¨åä¸ï¼å端åªéå±ç¤ºå³å¯ |
| | | |
| | | 4. **客æ·åæ¢**ï¼åæ¢å®¢æ·æ¶ï¼éæ¸
空已éçåè´§ååç¸å
³åæ¾æ°æ® |
| | | |
| | | 5. **䏿çé**ï¼å»ºè®®å¼å¯ `filterable` 屿§ï¼æ¹ä¾¿ç¨æ·éè¿æ¹æ¬¡å·æè½¦çå·å¿«éçé |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # éè´ãéå®å°è´¦å¢å æ»ååå·å段 |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - éè´å°è´¦ç®¡çé¡µé¢ |
| | | - éå®å°è´¦ç®¡çé¡µé¢ |
| | | |
| | | ## æ°æ®åºåæ´ |
| | | |
| | | æ§è¡ `docs/master_contract_no.sql` èæ¬ï¼æ°å¢ä»¥ä¸åæ®µï¼ |
| | | |
| | | ### purchase_ledgerï¼éè´å°è´¦è¡¨ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | master_contract_no | VARCHAR(100) | æ»ååå· | |
| | | |
| | | ### sales_ledgerï¼éå®å°è´¦è¡¨ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | master_contract_no | VARCHAR(100) | æ»ååå· | |
| | | |
| | | ## API |
| | | |
| | | ### éè´å°è´¦å页æ¥è¯¢ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /purchase/purchaseLedger/listPage | éè´å°è´¦å页æ¥è¯¢ | |
| | | |
| | | **æ°å¢è¯·æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | masterContractNo | String | å¦ | æ»ååå·ï¼æ¨¡ç³æ¥è¯¢ï¼ | |
| | | |
| | | **ååºåæ´ï¼** |
| | | |
| | | ååºæ°æ®ä¸æ°å¢ `masterContractNo` åæ®µã |
| | | |
| | | ### éå®å°è´¦å页æ¥è¯¢ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /sales/salesLedger/listPage | éå®å°è´¦å页æ¥è¯¢ | |
| | | |
| | | **æ°å¢è¯·æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | masterContractNo | String | å¦ | æ»ååå·ï¼æ¨¡ç³æ¥è¯¢ï¼ | |
| | | |
| | | **ååºåæ´ï¼** |
| | | |
| | | ååºæ°æ®ä¸æ°å¢ `masterContractNo` å `purchaseMasterContractNo` åæ®µã |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. éè´å°è´¦ç®¡çé¡µé¢ |
| | | |
| | | #### æ¥è¯¢è¡¨åå¢å åæ®µ |
| | | |
| | | ```html |
| | | <el-form-item label="æ»ååå·"> |
| | | <el-input |
| | | v-model="queryParams.masterContractNo" |
| | | placeholder="请è¾å
¥æ»ååå·" |
| | | clearable |
| | | @keyup.enter="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | #### è¡¨æ ¼å¢å å |
| | | |
| | | ```html |
| | | <el-table-column prop="masterContractNo" label="æ»ååå·" min-width="150" show-overflow-tooltip /> |
| | | ``` |
| | | |
| | | #### æ°å¢/ç¼è¾è¡¨åå¢å åæ®µ |
| | | |
| | | ```html |
| | | <el-form-item label="æ»ååå·" prop="masterContractNo"> |
| | | <el-input v-model="form.masterContractNo" placeholder="请è¾å
¥æ»ååå·" /> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | #### data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | queryParams: { |
| | | // ... åæå段 |
| | | masterContractNo: '' |
| | | }, |
| | | form: { |
| | | // ... åæå段 |
| | | masterContractNo: '' |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2. éå®å°è´¦ç®¡çé¡µé¢ |
| | | |
| | | #### æ¥è¯¢è¡¨åå¢å åæ®µ |
| | | |
| | | ```html |
| | | <el-form-item label="æ»ååå·"> |
| | | <el-input |
| | | v-model="queryParams.masterContractNo" |
| | | placeholder="请è¾å
¥æ»ååå·" |
| | | clearable |
| | | @keyup.enter="handleQuery" |
| | | /> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | #### è¡¨æ ¼å¢å å |
| | | |
| | | ```html |
| | | <el-table-column prop="masterContractNo" label="é宿»ååå·" min-width="150" show-overflow-tooltip /> |
| | | <el-table-column prop="purchaseMasterContractNo" label="éè´æ»ååå·" min-width="150" show-overflow-tooltip /> |
| | | ``` |
| | | |
| | | #### æ°å¢/ç¼è¾è¡¨åå¢å åæ®µ |
| | | |
| | | ```html |
| | | <el-form-item label="æ»ååå·" prop="masterContractNo"> |
| | | <el-input v-model="form.masterContractNo" placeholder="请è¾å
¥æ»ååå·" /> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | #### data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | queryParams: { |
| | | // ... åæå段 |
| | | masterContractNo: '' |
| | | }, |
| | | form: { |
| | | // ... åæå段 |
| | | masterContractNo: '' |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## 导åºåè½ |
| | | |
| | | å¯¼åº Excel æ¶ä¼èªå¨å
嫿»ååå·åæ®µï¼æ éé¢å¤ä¿®æ¹ã |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - æ»ååå·æ¯ææ¨¡ç³æ¥è¯¢ï¼è¾å
¥é¨åå
容å³å¯æ¥è¯¢ |
| | | - éå®å°è´¦å表页é¢ä¼åæ¶å±ç¤ºé宿»ååå·åå
³èéè´å°è´¦çæ»ååå· |
| | | - æ°å¢åç¼è¾æ¶æ»ååå·ä¸ºéå¿
填项ï¼ç¨æ·å¯æ ¹æ®å®é
æ
åµå¡«å |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- éè´å°è´¦ãéå®å°è´¦å¢å æ»ååå·å段 |
| | | -- æ§è¡æ¶é´ï¼2026-06-22 |
| | | -- åè½è¯´æï¼ |
| | | -- 1. éè´å°è´¦å¢å æ»ååå·å段 |
| | | -- 2. éå®å°è´¦å¢å æ»ååå·å段 |
| | | -- ===================================================== |
| | | |
| | | -- 1. éè´å°è´¦å¢å æ»ååå·å段 |
| | | ALTER TABLE purchase_ledger |
| | | ADD COLUMN master_contract_no VARCHAR(100) DEFAULT NULL COMMENT 'æ»ååå·' AFTER purchase_contract_number; |
| | | |
| | | -- 2. éå®å°è´¦å¢å æ»ååå·å段 |
| | | ALTER TABLE sales_ledger |
| | | ADD COLUMN master_contract_no VARCHAR(100) DEFAULT NULL COMMENT 'æ»ååå·' AFTER sales_contract_no; |
| | | |
| | | -- ===================================================== |
| | | -- åæ»èæ¬ï¼å¦éåæ»ï¼è¯·æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ===================================================== |
| | | -- ALTER TABLE purchase_ledger DROP COLUMN master_contract_no; |
| | | -- ALTER TABLE sales_ledger DROP COLUMN master_contract_no; |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | # è´¨æ£åæ°é¡¹èªå¨å¤æåè½ |
| | | |
| | | ## æ¶åé¡µé¢ |
| | | |
| | | - è´¨æ£ææ ç»´æ¤é¡µé¢ï¼æ£æµæ ååæ°ç®¡çï¼ |
| | | - è´¨æ£åå¡«å页é¢ï¼åæææ£éªãè¿ç¨æ£éªãåºåæ£éªï¼ |
| | | - è´¨æ£å详æ
é¡µé¢ |
| | | |
| | | ## æ°æ®åºåæ´ |
| | | |
| | | æ§è¡ `docs/quality_auto_judge.sql` èæ¬ï¼æ°å¢ä»¥ä¸åæ®µï¼ |
| | | |
| | | ### quality_test_standard_paramï¼æ£æµæ ååæ°è¡¨ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | judge_type | VARCHAR(20) | å¤æç±»åï¼å¤§äºçäº/å°äºçäº/èå´/æåæè¿° | |
| | | | is_required | TINYINT(1) | æ¯å¦å¿
è¦å¤æï¼0-å¦ï¼1-æ¯ | |
| | | | min_value | DECIMAL(20,4) | èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼ | |
| | | | max_value | DECIMAL(20,4) | èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼ | |
| | | |
| | | ### quality_inspect_paramï¼æ£éªè®°å½åæ°è¡¨ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | judge_type | VARCHAR(20) | å¤æç±»å | |
| | | | is_required | TINYINT(1) | æ¯å¦å¿
è¦å¤æ | |
| | | | is_qualified | TINYINT(1) | å项æ¯å¦åæ ¼ï¼0-ä¸åæ ¼ï¼1-åæ ¼ï¼null-æªå¤æ | |
| | | | min_value | DECIMAL(20,4) | èå´ä¸éå¼ | |
| | | | max_value | DECIMAL(20,4) | èå´ä¸éå¼ | |
| | | |
| | | ### quality_inspectï¼è´¨æ£ä¸»è¡¨ï¼ |
| | | |
| | | | åæ®µ | ç±»å | 说æ | |
| | | |------|------|------| |
| | | | auto_judge_result | VARCHAR(20) | èªå¨å¤æç»æï¼åæ ¼/ä¸åæ ¼/null(éæå¨å¤æ) | |
| | | |
| | | ## API |
| | | |
| | | ### 1. å忰项èªå¨å¤æ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | POST | /quality/qualityInspect/autoJudge | å忰项èªå¨å¤æï¼å®æ¶è°ç¨ï¼ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | ```json |
| | | { |
| | | "testValue": "100", |
| | | "standardValue": "80", |
| | | "minValue": null, |
| | | "maxValue": null, |
| | | "judgeType": "大äºçäº" |
| | | } |
| | | ``` |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | testValue | String | æ¯ | æ£éªå¼ | |
| | | | standardValue | String | å¦ | æ åå¼ï¼å¤§äºçäºãå°äºçäºç±»å使ç¨ï¼ | |
| | | | minValue | BigDecimal | å¦ | èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼ | |
| | | | maxValue | BigDecimal | å¦ | èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼ | |
| | | | judgeType | String | æ¯ | å¤æç±»åï¼å¤§äºçäº/å°äºçäº/èå´/æåæè¿° | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "isQualified": true, |
| | | "message": "æ£éªå¼100 >= æ åå¼80ï¼åæ ¼" |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2. æ´ä½è´¨æ£å忰项èªå¨å¤æ |
| | | |
| | | | æ¹æ³ | è·¯å¾ | 说æ | |
| | | |------|------|------| |
| | | | GET | /quality/qualityInspect/autoJudgeAll/{inspectId} | æ´ä½è´¨æ£å忰项èªå¨å¤æ | |
| | | |
| | | **请æ±åæ°ï¼** |
| | | |
| | | | åæ° | ç±»å | å¿
å¡« | 说æ | |
| | | |------|------|------|------| |
| | | | inspectId | Long | æ¯ | è´¨æ£åIDï¼è·¯å¾åæ°ï¼ | |
| | | |
| | | **ååºï¼** |
| | | |
| | | ```json |
| | | { |
| | | "code": 200, |
| | | "msg": "æä½æå", |
| | | "data": { |
| | | "autoJudgeResult": "ä¸åæ ¼", |
| | | "hasRequiredUnqualified": true, |
| | | "allTextDescription": false, |
| | | "paramResults": [ |
| | | { |
| | | "paramId": 1, |
| | | "parameterItem": "æ°´åå«é", |
| | | "isQualified": true, |
| | | "message": "æ£éªå¼12 <= æ åå¼15ï¼åæ ¼", |
| | | "isRequired": true |
| | | }, |
| | | { |
| | | "paramId": 2, |
| | | "parameterItem": "èç½è´¨å«é", |
| | | "isQualified": false, |
| | | "message": "æ£éªå¼18 >= æ åå¼20ï¼ä¸åæ ¼", |
| | | "isRequired": true |
| | | }, |
| | | { |
| | | "paramId": 3, |
| | | "parameterItem": "å¤è§", |
| | | "isQualified": null, |
| | | "message": "æåæè¿°ç±»åéæå¨å¤æ", |
| | | "isRequired": false |
| | | } |
| | | ] |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ## å端修æ¹ç¹ |
| | | |
| | | ### 1. è´¨æ£ææ ç»´æ¤é¡µé¢ |
| | | |
| | | #### 表åå¢å åæ®µ |
| | | |
| | | ```html |
| | | <el-form-item label="å¤æç±»å"> |
| | | <el-select v-model="form.judgeType" placeholder="è¯·éæ©å¤æç±»å" @change="handleJudgeTypeChange"> |
| | | <el-option label="大äºçäº" value="大äºçäº"></el-option> |
| | | <el-option label="å°äºçäº" value="å°äºçäº"></el-option> |
| | | <el-option label="èå´" value="èå´"></el-option> |
| | | <el-option label="æåæè¿°" value="æåæè¿°"></el-option> |
| | | </el-select> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æ¯å¦å¿
è¦å¤æ"> |
| | | <el-switch v-model="form.isRequired" :active-value="1" :inactive-value="0"></el-switch> |
| | | </el-form-item> |
| | | |
| | | <!-- èå´ç±»åæ¶æ¾ç¤º --> |
| | | <el-form-item label="èå´ä¸éå¼" v-if="form.judgeType === 'èå´'"> |
| | | <el-input-number v-model="form.minValue" :precision="4" :min="0"></el-input-number> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="èå´ä¸éå¼" v-if="form.judgeType === 'èå´'"> |
| | | <el-input-number v-model="form.maxValue" :precision="4" :min="0"></el-input-number> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | #### data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | form: { |
| | | // ... åæå段 |
| | | judgeType: null, |
| | | isRequired: 0, |
| | | minValue: null, |
| | | maxValue: null |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### æ¹æ³ |
| | | |
| | | ```js |
| | | methods: { |
| | | // å¤æç±»ååæ´æ¶ï¼æ¸
空èå´å¼ |
| | | handleJudgeTypeChange(val) { |
| | | if (val !== 'èå´') { |
| | | this.form.minValue = null; |
| | | this.form.maxValue = null; |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 2. è´¨æ£åå¡«åé¡µé¢ |
| | | |
| | | #### åæ°é¡¹è¡¨æ ¼å¢å å |
| | | |
| | | ```html |
| | | <el-table-column prop="judgeType" label="å¤æç±»å" width="100"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.judgeType === '大äºçäº'" type="success">â¥</el-tag> |
| | | <el-tag v-else-if="row.judgeType === 'å°äºçäº'" type="warning">â¤</el-tag> |
| | | <el-tag v-else-if="row.judgeType === 'èå´'" type="info">èå´</el-tag> |
| | | <el-tag v-else type="">æå</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column prop="isRequired" label="å¿
è¦å¤æ" width="80"> |
| | | <template #default="{ row }"> |
| | | <el-tag v-if="row.isRequired === 1" type="danger">æ¯</el-tag> |
| | | <el-tag v-else type="info">å¦</el-tag> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column prop="testValue" label="æ£éªå¼" width="150"> |
| | | <template #default="{ row }"> |
| | | <el-input |
| | | v-model="row.testValue" |
| | | placeholder="请è¾å
¥æ£éªå¼" |
| | | @change="handleTestValueChange(row)" |
| | | ></el-input> |
| | | </template> |
| | | </el-table-column> |
| | | |
| | | <el-table-column prop="isQualified" label="æ¯å¦åæ ¼" width="100"> |
| | | <template #default="{ row }"> |
| | | <!-- éæåæè¿°ç±»åæ¾ç¤ºèªå¨å¤æç»æ --> |
| | | <template v-if="row.judgeType !== 'æåæè¿°'"> |
| | | <el-tag v-if="row.isQualified === 1" type="success">åæ ¼</el-tag> |
| | | <el-tag v-else-if="row.isQualified === 0" type="danger">ä¸åæ ¼</el-tag> |
| | | <span v-else>-</span> |
| | | </template> |
| | | <!-- æåæè¿°ç±»åå
è®¸ç¨æ·éæ© --> |
| | | <template v-else> |
| | | <el-select v-model="row.isQualified" placeholder="è¯·éæ©" size="small"> |
| | | <el-option :value="1" label="åæ ¼"></el-option> |
| | | <el-option :value="0" label="ä¸åæ ¼"></el-option> |
| | | </el-select> |
| | | </template> |
| | | </template> |
| | | </el-table-column> |
| | | ``` |
| | | |
| | | #### æ´ä½å¤æç»ææ¾ç¤º |
| | | |
| | | ```html |
| | | <el-form-item label="èªå¨å¤æç»æ"> |
| | | <template v-if="autoJudgeResult"> |
| | | <el-tag v-if="autoJudgeResult === 'åæ ¼'" type="success" size="large">åæ ¼</el-tag> |
| | | <el-tag v-else type="danger" size="large">ä¸åæ ¼</el-tag> |
| | | <span style="margin-left: 10px; color: #909399;"> |
| | | ï¼å¿
è¦å¤æåæ°æä¸åæ ¼é¡¹ï¼ä¸å¯æå¨ä¿®æ¹ï¼ |
| | | </span> |
| | | </template> |
| | | <template v-else> |
| | | <el-tag type="info" size="large">éæå¨å¤æ</el-tag> |
| | | <span style="margin-left: 10px; color: #909399;"> |
| | | ï¼ææåæ°å为æåæè¿°ç±»åï¼è¯·æå¨éæ©ï¼ |
| | | </span> |
| | | </template> |
| | | </el-form-item> |
| | | |
| | | <el-form-item label="æç»å¤å®" v-if="!autoJudgeResult || autoJudgeResult === 'åæ ¼'"> |
| | | <el-radio-group v-model="form.checkResult" :disabled="autoJudgeResult === 'ä¸åæ ¼'"> |
| | | <el-radio label="åæ ¼">åæ ¼</el-radio> |
| | | <el-radio label="ä¸åæ ¼">ä¸åæ ¼</el-radio> |
| | | <el-radio label="é¨ååæ ¼">é¨ååæ ¼</el-radio> |
| | | </el-radio-group> |
| | | </el-form-item> |
| | | ``` |
| | | |
| | | #### data æ°æ® |
| | | |
| | | ```js |
| | | data() { |
| | | return { |
| | | form: { |
| | | // ... åæå段 |
| | | autoJudgeResult: null |
| | | }, |
| | | autoJudgeResult: null |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | #### æ¹æ³ |
| | | |
| | | ```js |
| | | methods: { |
| | | // æ£éªå¼åæ´æ¶å®æ¶èªå¨å¤æ |
| | | async handleTestValueChange(row) { |
| | | if (!row.testValue || !row.judgeType || row.judgeType === 'æåæè¿°') { |
| | | return; |
| | | } |
| | | |
| | | try { |
| | | const res = await autoJudge({ |
| | | testValue: row.testValue, |
| | | standardValue: row.standardValue, |
| | | minValue: row.minValue, |
| | | maxValue: row.maxValue, |
| | | judgeType: row.judgeType |
| | | }); |
| | | |
| | | if (res.code === 200) { |
| | | row.isQualified = res.data.isQualified ? 1 : 0; |
| | | this.$message.success(res.data.message); |
| | | // è§¦åæ´ä½å¤æ |
| | | this.autoJudgeAll(); |
| | | } |
| | | } catch (error) { |
| | | console.error('èªå¨å¤æå¤±è´¥', error); |
| | | } |
| | | }, |
| | | |
| | | // æ´ä½èªå¨å¤æ |
| | | async autoJudgeAll() { |
| | | try { |
| | | const res = await autoJudgeAll(this.form.id); |
| | | if (res.code === 200) { |
| | | this.autoJudgeResult = res.data.autoJudgeResult; |
| | | this.form.autoJudgeResult = res.data.autoJudgeResult; |
| | | |
| | | // æ´æ°åæ°é¡¹çå¤æç»æ |
| | | res.data.paramResults.forEach(item => { |
| | | const param = this.form.qualityInspectParams.find(p => p.id === item.paramId); |
| | | if (param) { |
| | | param.isQualified = item.isQualified ? 1 : (item.isQualified === false ? 0 : null); |
| | | } |
| | | }); |
| | | |
| | | // 妿å¿
è¦å¤æåæ°ä¸åæ ¼ï¼èªå¨è®¾ç½®æ£æµç»æ |
| | | if (res.data.hasRequiredUnqualified) { |
| | | this.form.checkResult = 'ä¸åæ ¼'; |
| | | } |
| | | } |
| | | } catch (error) { |
| | | console.error('æ´ä½å¤æå¤±è´¥', error); |
| | | } |
| | | } |
| | | } |
| | | ``` |
| | | |
| | | ### 3. API è¯·æ±æ¹æ³ |
| | | |
| | | ```js |
| | | // api/quality.js |
| | | |
| | | // å忰项èªå¨å¤æ |
| | | export function autoJudge(data) { |
| | | return request({ |
| | | url: '/quality/qualityInspect/autoJudge', |
| | | method: 'post', |
| | | data |
| | | }) |
| | | } |
| | | |
| | | // æ´ä½èªå¨å¤æ |
| | | export function autoJudgeAll(inspectId) { |
| | | return request({ |
| | | url: `/quality/qualityInspect/autoJudgeAll/${inspectId}`, |
| | | method: 'get' |
| | | }) |
| | | } |
| | | ``` |
| | | |
| | | ## å¤æç±»å说æ |
| | | |
| | | | å¤æç±»å | ç¬¦å· | 夿é»è¾ | 使ç¨å段 | |
| | | |----------|------|----------|----------| |
| | | | 大äºçäº | ⥠| testValue >= standardValue | standardValue | |
| | | | å°äºçäº | ⤠| testValue <= standardValue | standardValue | |
| | | | èå´ | - | minValue <= testValue <= maxValue | minValue, maxValue | |
| | | | æåæè¿° | - | ä¸èªå¨å¤æï¼ç¨æ·æå¨éæ© | æ | |
| | | |
| | | ## ä¸å¡é»è¾è¯´æ |
| | | |
| | | 1. **èªå¨å¤æè§¦åæ¶æº**ï¼ç¨æ·å¡«åæ£éªå¼å宿¶èªå¨å¤æ |
| | | 2. **å¿
è¦å¤æåæ°**ï¼`isRequired = 1` çåæ°é¡¹ä¸ºå¿
è¦å¤æåæ° |
| | | 3. **æ´ä½å¤æé»è¾**ï¼ |
| | | - 妿æä»»ä¸å¿
è¦å¤æåæ°ä¸åæ ¼ â æ´ä½å¤å®ä¸º"ä¸åæ ¼"ï¼ç¦ç¨ç¨æ·ä¿®æ¹ |
| | | - 妿ææå¿
è¦å¤æåæ°é½åæ ¼ â æ´ä½å¤å®ä¸º"åæ ¼" |
| | | - 妿å
¨æ¯æåæè¿°ç±»å â `autoJudgeResult = null`ï¼å
è®¸ç¨æ·æå¨éæ© |
| | | 4. **æåæè¿°ç±»å**ï¼ä¸è¿è¡èªå¨å¤æï¼ç±ç¨æ·æå¨éæ©"åæ ¼"æ"ä¸åæ ¼" |
| | | |
| | | ## 注æäºé¡¹ |
| | | |
| | | - èå´ç±»åå¿
须填åä¸éå¼åä¸éå¼ï¼å¦åæ æ³å¤æ |
| | | - æ åå¼åæ£éªå¼éä¸ºæææ°å¼ï¼å¦åæ æ³å¤æ |
| | | - å¿
è¦å¤æåæ°ä¸åæ ¼æ¶ï¼æç»å¤å®å¼ºå¶ä¸º"ä¸åæ ¼"ï¼ä¸å¯æå¨ä¿®æ¹ |
| | | - è´¨æ£åæäº¤æ¶ï¼ç³»ç»ä¼æ ¹æ®èªå¨å¤æç»æè¿è¡æ ¡éª |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | -- ===================================================== |
| | | -- è´¨æ£åæ°é¡¹èªå¨å¤æåè½ SQL åæ´èæ¬ |
| | | -- æ§è¡æ¶é´ï¼2026-06-22 |
| | | -- åè½è¯´æï¼ |
| | | -- 1. æ£æµæ ååæ°è¡¨å¢å å¤æç±»åãæ¯å¦å¿
è¦å¤æãèå´ä¸ä¸éåæ®µ |
| | | -- 2. æ£éªè®°å½åæ°è¡¨å¢å ç¸åºå段 |
| | | -- 3. è´¨æ£ä¸»è¡¨å¢å èªå¨å¤æç»æå段 |
| | | -- ===================================================== |
| | | |
| | | -- 1. æ£æµæ ååæ°è¡¨å¢å å¤æç±»åãæ¯å¦å¿
è¦å¤æãèå´ä¸ä¸é |
| | | ALTER TABLE quality_test_standard_param |
| | | ADD COLUMN judge_type VARCHAR(20) DEFAULT NULL COMMENT 'å¤æç±»åï¼å¤§äºçäº/å°äºçäº/èå´/æåæè¿°' AFTER default_value; |
| | | |
| | | ALTER TABLE quality_test_standard_param |
| | | ADD COLUMN is_required TINYINT(1) DEFAULT 0 COMMENT 'æ¯å¦å¿
è¦å¤æï¼0-å¦ï¼1-æ¯' AFTER judge_type; |
| | | |
| | | ALTER TABLE quality_test_standard_param |
| | | ADD COLUMN min_value DECIMAL(20,4) DEFAULT NULL COMMENT 'èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼' AFTER is_required; |
| | | |
| | | ALTER TABLE quality_test_standard_param |
| | | ADD COLUMN max_value DECIMAL(20,4) DEFAULT NULL COMMENT 'èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼' AFTER min_value; |
| | | |
| | | -- 2. æ£éªè®°å½åæ°è¡¨å¢å ç¸åºå段 |
| | | ALTER TABLE quality_inspect_param |
| | | ADD COLUMN judge_type VARCHAR(20) DEFAULT NULL COMMENT 'å¤æç±»å' AFTER test_value; |
| | | |
| | | ALTER TABLE quality_inspect_param |
| | | ADD COLUMN is_required TINYINT(1) DEFAULT 0 COMMENT 'æ¯å¦å¿
è¦å¤æ' AFTER judge_type; |
| | | |
| | | ALTER TABLE quality_inspect_param |
| | | ADD COLUMN is_qualified TINYINT(1) DEFAULT NULL COMMENT 'å项æ¯å¦åæ ¼ï¼0-ä¸åæ ¼ï¼1-åæ ¼ï¼null-æªå¤æ' AFTER is_required; |
| | | |
| | | ALTER TABLE quality_inspect_param |
| | | ADD COLUMN min_value DECIMAL(20,4) DEFAULT NULL COMMENT 'èå´ä¸éå¼' AFTER is_qualified; |
| | | |
| | | ALTER TABLE quality_inspect_param |
| | | ADD COLUMN max_value DECIMAL(20,4) DEFAULT NULL COMMENT 'èå´ä¸éå¼' AFTER min_value; |
| | | |
| | | -- 3. è´¨æ£ä¸»è¡¨å¢å èªå¨å¤æç»æ |
| | | ALTER TABLE quality_inspect |
| | | ADD COLUMN auto_judge_result VARCHAR(20) DEFAULT NULL COMMENT 'èªå¨å¤æç»æï¼åæ ¼/ä¸åæ ¼/null(éæå¨å¤æ)' AFTER sample_quantity; |
| | | |
| | | -- ===================================================== |
| | | -- åæ»èæ¬ï¼å¦éåæ»ï¼è¯·æ§è¡ä»¥ä¸è¯å¥ï¼ |
| | | -- ===================================================== |
| | | -- ALTER TABLE quality_test_standard_param DROP COLUMN judge_type; |
| | | -- ALTER TABLE quality_test_standard_param DROP COLUMN is_required; |
| | | -- ALTER TABLE quality_test_standard_param DROP COLUMN min_value; |
| | | -- ALTER TABLE quality_test_standard_param DROP COLUMN max_value; |
| | | -- ALTER TABLE quality_inspect_param DROP COLUMN judge_type; |
| | | -- ALTER TABLE quality_inspect_param DROP COLUMN is_required; |
| | | -- ALTER TABLE quality_inspect_param DROP COLUMN is_qualified; |
| | | -- ALTER TABLE quality_inspect_param DROP COLUMN min_value; |
| | | -- ALTER TABLE quality_inspect_param DROP COLUMN max_value; |
| | | -- ALTER TABLE quality_inspect DROP COLUMN auto_judge_result; |
| | |
| | | import com.ruoyi.basic.vo.CustomerVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsProductVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsShipmentVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsSummaryVo; |
| | | import org.apache.ibatis.annotations.Mapper; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | |
| | | IPage<CustomerTransactionsVo> customewTransactions(Page page, @Param("customerName") String customerName); |
| | | |
| | | IPage<CustomerTransactionsDetailsVo> customewTransactionsDetails(Page page, @Param("customerId") Long customerId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·å¾æ¥ç»è®¡æ±æ» |
| | | */ |
| | | CustomerTransactionsSummaryVo getCustomerTransactionsSummary(@Param("customerId") Long customerId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·å¾æ¥äº§åæç» |
| | | */ |
| | | IPage<CustomerTransactionsProductVo> getCustomerTransactionsProducts(Page page, |
| | | @Param("customerId") Long customerId, @Param("salesLedgerId") Long salesLedgerId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·å¾æ¥åè´§æç» |
| | | */ |
| | | IPage<CustomerTransactionsShipmentVo> getCustomerTransactionsShipments(Page page, |
| | | @Param("customerId") Long customerId, @Param("salesLedgerId") Long salesLedgerId); |
| | | } |
| | |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsProductVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsShipmentVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsSummaryVo; |
| | | import org.springframework.web.multipart.MultipartFile; |
| | | |
| | | import java.util.List; |
| | |
| | | * @return |
| | | */ |
| | | IPage<CustomerTransactionsDetailsVo> customewTransactionsDetails(Page page, Long customerId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·å¾æ¥ç»è®¡æ±æ»ï¼ä¼åçï¼ |
| | | * @param customerId 客æ·ID |
| | | * @return ç»è®¡æ±æ»æ°æ® |
| | | */ |
| | | CustomerTransactionsSummaryVo getCustomerTransactionsSummary(Long customerId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·å¾æ¥äº§åæç» |
| | | * @param page å页忰 |
| | | * @param customerId 客æ·ID |
| | | * @param salesLedgerId éå®å°è´¦IDï¼å¯éï¼ |
| | | * @return 产åæç»åé¡µæ°æ® |
| | | */ |
| | | IPage<CustomerTransactionsProductVo> getCustomerTransactionsProducts(Page page, Long customerId, Long salesLedgerId); |
| | | |
| | | /** |
| | | * æ¥è¯¢å®¢æ·å¾æ¥åè´§æç» |
| | | * @param page å页忰 |
| | | * @param customerId 客æ·ID |
| | | * @param salesLedgerId éå®å°è´¦IDï¼å¯éï¼ |
| | | * @return åè´§æç»åé¡µæ°æ® |
| | | */ |
| | | IPage<CustomerTransactionsShipmentVo> getCustomerTransactionsShipments(Page page, Long customerId, Long salesLedgerId); |
| | | } |
| | |
| | | import com.ruoyi.sales.pojo.SalesQuotation; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsDetailsVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsProductVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsShipmentVo; |
| | | import com.ruoyi.sales.vo.CustomerTransactionsSummaryVo; |
| | | import lombok.AllArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.springframework.beans.BeanUtils; |
| | |
| | | return customerMapper.customewTransactionsDetails(page, customerId); |
| | | } |
| | | |
| | | @Override |
| | | public CustomerTransactionsSummaryVo getCustomerTransactionsSummary(Long customerId) { |
| | | return customerMapper.getCustomerTransactionsSummary(customerId); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<CustomerTransactionsProductVo> getCustomerTransactionsProducts(Page page, Long customerId, Long salesLedgerId) { |
| | | return customerMapper.getCustomerTransactionsProducts(page, customerId, salesLedgerId); |
| | | } |
| | | |
| | | @Override |
| | | public IPage<CustomerTransactionsShipmentVo> getCustomerTransactionsShipments(Page page, Long customerId, Long salesLedgerId) { |
| | | return customerMapper.getCustomerTransactionsShipments(page, customerId, salesLedgerId); |
| | | } |
| | | |
| | | /** |
| | | * ä¸å线å½å转驼峰å½å |
| | | */ |
| | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | /** |
| | |
| | | @Schema(description = "éå®äº§å对象æ°ç»") |
| | | private List<ReturnSaleProductDto> returnSaleProducts; |
| | | |
| | | @Schema(description = "åè´§æ°é") |
| | | private BigDecimal shippingQuantity; |
| | | |
| | | @Schema(description = "å·²éè´§æ°é") |
| | | private BigDecimal returnedQuantity; |
| | | |
| | | @Schema(description = "éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§") |
| | | private String returnStatus; |
| | | |
| | | } |
| | |
| | | @Excel(name = "éè´ååå·") |
| | | private String purchaseContractNumber; |
| | | |
| | | /** |
| | | * æ»ååå· |
| | | */ |
| | | @Excel(name = "æ»ååå·") |
| | | private String masterContractNo; |
| | | |
| | | |
| | | |
| | | /** |
| | |
| | | private String purchaseContractNumber; |
| | | |
| | | /** |
| | | * æ»ååå· |
| | | */ |
| | | @Excel(name = "æ»ååå·") |
| | | private String masterContractNo; |
| | | |
| | | /** |
| | | * ä¾åºååç§°id |
| | | */ |
| | | private Long supplierId; |
| | |
| | | import com.ruoyi.framework.aspectj.lang.annotation.Log; |
| | | import com.ruoyi.framework.aspectj.lang.enums.BusinessType; |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import com.ruoyi.quality.dto.AutoJudgeAllResponse; |
| | | import com.ruoyi.quality.dto.AutoJudgeRequest; |
| | | import com.ruoyi.quality.dto.AutoJudgeResponse; |
| | | import com.ruoyi.quality.dto.BatchQuickInspectRequest; |
| | | import com.ruoyi.quality.dto.QualityInspectDto; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | |
| | | String templatePath = "/static/" + template + ".doc"; |
| | | return R.ok(qualityInspectService.analyzeTemplate(templatePath)); |
| | | } |
| | | |
| | | /** |
| | | * å忰项èªå¨å¤æ |
| | | */ |
| | | @PostMapping("/autoJudge") |
| | | @Operation(summary = "å忰项èªå¨å¤æ") |
| | | @Log(title = "å忰项èªå¨å¤æ", businessType = BusinessType.OTHER) |
| | | public R<AutoJudgeResponse> autoJudge(@RequestBody AutoJudgeRequest request) { |
| | | return R.ok(qualityInspectService.autoJudge(request)); |
| | | } |
| | | |
| | | /** |
| | | * æ´ä½è´¨æ£å忰项èªå¨å¤æ |
| | | */ |
| | | @GetMapping("/autoJudgeAll/{inspectId}") |
| | | @Operation(summary = "æ´ä½è´¨æ£å忰项èªå¨å¤æ") |
| | | @Log(title = "æ´ä½è´¨æ£å忰项èªå¨å¤æ", businessType = BusinessType.OTHER) |
| | | public R<AutoJudgeAllResponse> autoJudgeAll(@PathVariable("inspectId") Long inspectId) { |
| | | return R.ok(qualityInspectService.autoJudgeAll(inspectId)); |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.quality.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.util.List; |
| | | |
| | | /** |
| | | * æ´ä½èªå¨å¤æååºDTO |
| | | */ |
| | | @Data |
| | | @Schema(name = "AutoJudgeAllResponse", description = "æ´ä½èªå¨å¤æååº") |
| | | public class AutoJudgeAllResponse { |
| | | |
| | | @Schema(description = "èªå¨å¤æç»æï¼åæ ¼/ä¸åæ ¼/null(éæå¨å¤æ)") |
| | | private String autoJudgeResult; |
| | | |
| | | @Schema(description = "æ¯å¦æå¿
è¦å¤æåæ°ä¸åæ ¼") |
| | | private Boolean hasRequiredUnqualified; |
| | | |
| | | @Schema(description = "æ¯å¦å
¨æ¯æåæè¿°ç±»å") |
| | | private Boolean allTextDescription; |
| | | |
| | | @Schema(description = "åæ°é¡¹å¤æç»æå表") |
| | | private List<ParamJudgeResult> paramResults; |
| | | |
| | | @Data |
| | | @Schema(name = "ParamJudgeResult", description = "åæ°é¡¹å¤æç»æ") |
| | | public static class ParamJudgeResult { |
| | | @Schema(description = "忰项ID") |
| | | private Long paramId; |
| | | |
| | | @Schema(description = "忰项åç§°") |
| | | private String parameterItem; |
| | | |
| | | @Schema(description = "æ¯å¦åæ ¼ï¼true-åæ ¼ï¼false-ä¸åæ ¼ï¼null-æªå¤æ") |
| | | private Boolean isQualified; |
| | | |
| | | @Schema(description = "å¤æè¯´æ") |
| | | private String message; |
| | | |
| | | @Schema(description = "æ¯å¦å¿
è¦å¤æ") |
| | | private Boolean isRequired; |
| | | } |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.quality.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * èªå¨å¤æè¯·æ±DTO |
| | | */ |
| | | @Data |
| | | @Schema(name = "AutoJudgeRequest", description = "èªå¨å¤æè¯·æ±") |
| | | public class AutoJudgeRequest { |
| | | |
| | | @Schema(description = "æ£éªå¼") |
| | | private String testValue; |
| | | |
| | | @Schema(description = "æ åå¼ï¼å¤§äºçäºãå°äºçäºç±»å使ç¨ï¼") |
| | | private String standardValue; |
| | | |
| | | @Schema(description = "èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼") |
| | | private BigDecimal minValue; |
| | | |
| | | @Schema(description = "èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼") |
| | | private BigDecimal maxValue; |
| | | |
| | | @Schema(description = "å¤æç±»åï¼å¤§äºçäº/å°äºçäº/èå´/æåæè¿°") |
| | | private String judgeType; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.quality.dto; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | /** |
| | | * èªå¨å¤æååºDTO |
| | | */ |
| | | @Data |
| | | @Schema(name = "AutoJudgeResponse", description = "èªå¨å¤æååº") |
| | | public class AutoJudgeResponse { |
| | | |
| | | @Schema(description = "æ¯å¦åæ ¼ï¼true-åæ ¼ï¼false-ä¸åæ ¼ï¼null-æ æ³å¤æ") |
| | | private Boolean isQualified; |
| | | |
| | | @Schema(description = "å¤æè¯´æ") |
| | | private String message; |
| | | |
| | | public AutoJudgeResponse() { |
| | | } |
| | | |
| | | public AutoJudgeResponse(Boolean isQualified, String message) { |
| | | this.isQualified = isQualified; |
| | | this.message = message; |
| | | } |
| | | } |
| | |
| | | @Schema(description = "æ½æ£æ°é, ä»
inspectRule=1æ¶ææ") |
| | | private BigDecimal sampleQuantity; |
| | | |
| | | @Schema(description = "èªå¨å¤æç»æï¼åæ ¼/ä¸åæ ¼/null(éæå¨å¤æ)") |
| | | @Excel(name = "èªå¨å¤æç»æ") |
| | | private String autoJudgeResult; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| | |
| | | private String testValue; |
| | | |
| | | /** |
| | | * å¤æç±»åï¼å¤§äºçäº/å°äºçäº/èå´/æåæè¿° |
| | | */ |
| | | @Excel(name = "å¤æç±»å") |
| | | private String judgeType; |
| | | |
| | | /** |
| | | * æ¯å¦å¿
è¦å¤æï¼0-å¦ï¼1-æ¯ |
| | | */ |
| | | @Excel(name = "æ¯å¦å¿
è¦å¤æ") |
| | | private Integer isRequired; |
| | | |
| | | /** |
| | | * å项æ¯å¦åæ ¼ï¼0-ä¸åæ ¼ï¼1-åæ ¼ï¼null-æªå¤æ |
| | | */ |
| | | @Excel(name = "å项æ¯å¦åæ ¼") |
| | | private Integer isQualified; |
| | | |
| | | /** |
| | | * èå´ä¸éå¼ |
| | | */ |
| | | @Excel(name = "èå´ä¸éå¼") |
| | | private java.math.BigDecimal minValue; |
| | | |
| | | /** |
| | | * èå´ä¸éå¼ |
| | | */ |
| | | @Excel(name = "èå´ä¸éå¼") |
| | | private java.math.BigDecimal maxValue; |
| | | |
| | | /** |
| | | * æ£éªID |
| | | */ |
| | | @Excel(name = "æ£éªID") |
| | |
| | | @Schema(description = "é»è®¤å¼") |
| | | private String defaultValue; |
| | | |
| | | @Schema(description = "å¤æç±»åï¼å¤§äºçäº/å°äºçäº/èå´/æåæè¿°") |
| | | private String judgeType; |
| | | |
| | | @Schema(description = "æ¯å¦å¿
è¦å¤æï¼0-å¦ï¼1-æ¯") |
| | | private Integer isRequired; |
| | | |
| | | @Schema(description = "èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼") |
| | | private java.math.BigDecimal minValue; |
| | | |
| | | @Schema(description = "èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼") |
| | | private java.math.BigDecimal maxValue; |
| | | |
| | | @TableField(fill = FieldFill.INSERT) |
| | | private Long deptId; |
| | | } |
| | |
| | | import com.baomidou.mybatisplus.extension.plugins.pagination.Page; |
| | | import com.baomidou.mybatisplus.extension.service.IService; |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import com.ruoyi.quality.dto.AutoJudgeAllResponse; |
| | | import com.ruoyi.quality.dto.AutoJudgeRequest; |
| | | import com.ruoyi.quality.dto.AutoJudgeResponse; |
| | | import com.ruoyi.quality.dto.BatchQuickInspectRequest; |
| | | import com.ruoyi.quality.dto.QualityInspectDto; |
| | | import com.ruoyi.quality.pojo.QualityInspect; |
| | |
| | | * åææ¨¡æ¿ç»æ |
| | | */ |
| | | String analyzeTemplate(String templatePath); |
| | | |
| | | /** |
| | | * å忰项èªå¨å¤æ |
| | | */ |
| | | AutoJudgeResponse autoJudge(AutoJudgeRequest request); |
| | | |
| | | /** |
| | | * æ´ä½è´¨æ£å忰项èªå¨å¤æ |
| | | */ |
| | | AutoJudgeAllResponse autoJudgeAll(Long inspectId); |
| | | } |
| | |
| | | import com.ruoyi.framework.web.domain.R; |
| | | import com.ruoyi.procurementrecord.service.ProcurementRecordService; |
| | | import com.ruoyi.procurementrecord.utils.StockUtils; |
| | | import com.ruoyi.quality.dto.AutoJudgeAllResponse; |
| | | import com.ruoyi.quality.dto.AutoJudgeRequest; |
| | | import com.ruoyi.quality.dto.AutoJudgeResponse; |
| | | import com.ruoyi.quality.dto.BatchQuickInspectRequest; |
| | | import com.ruoyi.quality.dto.QualityInspectDto; |
| | | import com.ruoyi.quality.mapper.QualityInspectMapper; |
| | |
| | | import com.ruoyi.quality.pojo.QualityInspectParam; |
| | | import com.ruoyi.quality.pojo.QualityUnqualified; |
| | | import com.ruoyi.quality.utils.QualityInspectTemplateExportHelper; |
| | | import com.ruoyi.quality.utils.QualityJudgeUtil; |
| | | import com.ruoyi.stock.pojo.StockInRecord; |
| | | import com.ruoyi.stock.service.StockInRecordService; |
| | | import com.ruoyi.quality.service.IQualityInspectParamService; |
| | |
| | | return qualityInspectTemplateExportHelper.analyzeTemplate(templatePath); |
| | | } |
| | | |
| | | @Override |
| | | public AutoJudgeResponse autoJudge(AutoJudgeRequest request) { |
| | | QualityJudgeUtil.JudgeResult result = QualityJudgeUtil.judge( |
| | | request.getTestValue(), |
| | | request.getStandardValue(), |
| | | request.getMinValue(), |
| | | request.getMaxValue(), |
| | | request.getJudgeType() |
| | | ); |
| | | return new AutoJudgeResponse(result.getQualified(), result.getMessage()); |
| | | } |
| | | |
| | | @Override |
| | | public AutoJudgeAllResponse autoJudgeAll(Long inspectId) { |
| | | List<QualityInspectParam> params = qualityInspectParamService.list( |
| | | Wrappers.<QualityInspectParam>lambdaQuery().eq(QualityInspectParam::getInspectId, inspectId)); |
| | | |
| | | AutoJudgeAllResponse response = new AutoJudgeAllResponse(); |
| | | List<AutoJudgeAllResponse.ParamJudgeResult> paramResults = new ArrayList<>(); |
| | | boolean hasRequiredUnqualified = false; |
| | | boolean allTextDescription = true; |
| | | boolean hasRequiredParam = false; |
| | | |
| | | for (QualityInspectParam param : params) { |
| | | AutoJudgeAllResponse.ParamJudgeResult paramResult = new AutoJudgeAllResponse.ParamJudgeResult(); |
| | | paramResult.setParamId(param.getId()); |
| | | paramResult.setParameterItem(param.getParameterItem()); |
| | | paramResult.setIsRequired(param.getIsRequired() != null && param.getIsRequired() == 1); |
| | | |
| | | if (paramResult.getIsRequired()) { |
| | | hasRequiredParam = true; |
| | | } |
| | | |
| | | String judgeType = param.getJudgeType(); |
| | | if (QualityJudgeUtil.JUDGE_TYPE_TEXT_DESCRIPTION.equals(judgeType)) { |
| | | paramResult.setIsQualified(null); |
| | | paramResult.setMessage("æåæè¿°ç±»åéæå¨å¤æ"); |
| | | } else { |
| | | allTextDescription = false; |
| | | QualityJudgeUtil.JudgeResult result = QualityJudgeUtil.judge( |
| | | param.getTestValue(), |
| | | param.getStandardValue(), |
| | | param.getMinValue(), |
| | | param.getMaxValue(), |
| | | judgeType |
| | | ); |
| | | paramResult.setIsQualified(result.getQualified()); |
| | | paramResult.setMessage(result.getMessage()); |
| | | |
| | | // æ´æ°åæ°é¡¹çå¤æç»æ |
| | | if (result.getQualified() != null) { |
| | | param.setIsQualified(result.getQualified() ? 1 : 0); |
| | | qualityInspectParamService.updateById(param); |
| | | } |
| | | |
| | | // æ£æ¥å¿
è¦å¤æåæ°æ¯å¦ä¸åæ ¼ |
| | | if (paramResult.getIsRequired() && Boolean.FALSE.equals(result.getQualified())) { |
| | | hasRequiredUnqualified = true; |
| | | } |
| | | } |
| | | paramResults.add(paramResult); |
| | | } |
| | | |
| | | response.setParamResults(paramResults); |
| | | response.setHasRequiredUnqualified(hasRequiredUnqualified); |
| | | response.setAllTextDescription(allTextDescription); |
| | | |
| | | // ç¡®å®æ´ä½å¤æç»æ |
| | | if (allTextDescription) { |
| | | response.setAutoJudgeResult(null); |
| | | } else if (hasRequiredUnqualified) { |
| | | response.setAutoJudgeResult("ä¸åæ ¼"); |
| | | } else { |
| | | // ææéè¦èªå¨å¤æç忰项é½åæ ¼ï¼æ´ä½ä¸ºåæ ¼ |
| | | response.setAutoJudgeResult("åæ ¼"); |
| | | } |
| | | |
| | | // æ´æ°è´¨æ£ä¸»è¡¨çèªå¨å¤æç»æ |
| | | QualityInspect inspect = qualityInspectMapper.selectById(inspectId); |
| | | if (inspect != null) { |
| | | inspect.setAutoJudgeResult(response.getAutoJudgeResult()); |
| | | qualityInspectMapper.updateById(inspect); |
| | | } |
| | | |
| | | return response; |
| | | } |
| | | |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.quality.utils; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * è´¨æ£åæ°å¤æå·¥å
·ç±» |
| | | */ |
| | | public class QualityJudgeUtil { |
| | | |
| | | public static final String JUDGE_TYPE_GREATER_EQUAL = "大äºçäº"; |
| | | public static final String JUDGE_TYPE_LESS_EQUAL = "å°äºçäº"; |
| | | public static final String JUDGE_TYPE_RANGE = "èå´"; |
| | | public static final String JUDGE_TYPE_TEXT_DESCRIPTION = "æåæè¿°"; |
| | | |
| | | /** |
| | | * 夿忰项æ¯å¦åæ ¼ |
| | | * |
| | | * @param testValue æ£éªå¼ |
| | | * @param standardValue æ åå¼ï¼å¤§äºçäºãå°äºçäºç±»å使ç¨ï¼ |
| | | * @param minValue èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼ |
| | | * @param maxValue èå´ä¸éå¼ï¼èå´ç±»å使ç¨ï¼ |
| | | * @param judgeType å¤æç±»å |
| | | * @return å¤æç»æå¯¹è±¡ |
| | | */ |
| | | public static JudgeResult judge(String testValue, String standardValue, |
| | | BigDecimal minValue, BigDecimal maxValue, String judgeType) { |
| | | JudgeResult result = new JudgeResult(); |
| | | |
| | | // æåæè¿°ç±»åä¸èªå¨å¤æ |
| | | if (JUDGE_TYPE_TEXT_DESCRIPTION.equals(judgeType)) { |
| | | result.setQualified(null); |
| | | result.setMessage("æåæè¿°ç±»åéæå¨å¤æ"); |
| | | return result; |
| | | } |
| | | |
| | | // æ£éªå¼ä¸ºç©ºæ¶æ æ³å¤æ |
| | | if (testValue == null || testValue.trim().isEmpty()) { |
| | | result.setQualified(null); |
| | | result.setMessage("æ£éªå¼ä¸ºç©ºï¼æ æ³å¤æ"); |
| | | return result; |
| | | } |
| | | |
| | | try { |
| | | BigDecimal testVal = new BigDecimal(testValue.trim()); |
| | | |
| | | switch (judgeType) { |
| | | case JUDGE_TYPE_GREATER_EQUAL: |
| | | return judgeGreaterEqual(testVal, standardValue); |
| | | case JUDGE_TYPE_LESS_EQUAL: |
| | | return judgeLessEqual(testVal, standardValue); |
| | | case JUDGE_TYPE_RANGE: |
| | | return judgeRange(testVal, minValue, maxValue); |
| | | default: |
| | | result.setQualified(null); |
| | | result.setMessage("æªç¥çå¤æç±»åï¼" + judgeType); |
| | | return result; |
| | | } |
| | | } catch (NumberFormatException e) { |
| | | result.setQualified(null); |
| | | result.setMessage("æ£éªå¼æ ¼å¼ä¸æ£ç¡®ï¼æ æ³è½¬æ¢ä¸ºæ°å¼"); |
| | | return result; |
| | | } |
| | | } |
| | | |
| | | /** |
| | | * 大äºçäºå¤æ |
| | | */ |
| | | private static JudgeResult judgeGreaterEqual(BigDecimal testValue, String standardValue) { |
| | | JudgeResult result = new JudgeResult(); |
| | | try { |
| | | BigDecimal standardVal = new BigDecimal(standardValue.trim()); |
| | | boolean qualified = testValue.compareTo(standardVal) >= 0; |
| | | result.setQualified(qualified); |
| | | result.setMessage(String.format("æ£éªå¼%s >= æ åå¼%sï¼%s", |
| | | testValue, standardVal, qualified ? "åæ ¼" : "ä¸åæ ¼")); |
| | | } catch (Exception e) { |
| | | result.setQualified(null); |
| | | result.setMessage("æ å弿 ¼å¼ä¸æ£ç¡®ï¼" + standardValue); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * å°äºçäºå¤æ |
| | | */ |
| | | private static JudgeResult judgeLessEqual(BigDecimal testValue, String standardValue) { |
| | | JudgeResult result = new JudgeResult(); |
| | | try { |
| | | BigDecimal standardVal = new BigDecimal(standardValue.trim()); |
| | | boolean qualified = testValue.compareTo(standardVal) <= 0; |
| | | result.setQualified(qualified); |
| | | result.setMessage(String.format("æ£éªå¼%s <= æ åå¼%sï¼%s", |
| | | testValue, standardVal, qualified ? "åæ ¼" : "ä¸åæ ¼")); |
| | | } catch (Exception e) { |
| | | result.setQualified(null); |
| | | result.setMessage("æ å弿 ¼å¼ä¸æ£ç¡®ï¼" + standardValue); |
| | | } |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * èå´å¤æ |
| | | */ |
| | | private static JudgeResult judgeRange(BigDecimal testValue, BigDecimal minValue, BigDecimal maxValue) { |
| | | JudgeResult result = new JudgeResult(); |
| | | if (minValue == null || maxValue == null) { |
| | | result.setQualified(null); |
| | | result.setMessage("èå´ç±»åçä¸ä¸éå¼ä¸è½ä¸ºç©º"); |
| | | return result; |
| | | } |
| | | boolean qualified = testValue.compareTo(minValue) >= 0 && testValue.compareTo(maxValue) <= 0; |
| | | result.setQualified(qualified); |
| | | result.setMessage(String.format("æ£éªå¼%så¨èå´[%s, %s]%sï¼%s", |
| | | testValue, minValue, maxValue, |
| | | qualified ? "å
" : "å¤", qualified ? "åæ ¼" : "ä¸åæ ¼")); |
| | | return result; |
| | | } |
| | | |
| | | /** |
| | | * å¤æç»æå¯¹è±¡ |
| | | */ |
| | | public static class JudgeResult { |
| | | private Boolean qualified; |
| | | private String message; |
| | | |
| | | public Boolean getQualified() { |
| | | return qualified; |
| | | } |
| | | |
| | | public void setQualified(Boolean qualified) { |
| | | this.qualified = qualified; |
| | | } |
| | | |
| | | public String getMessage() { |
| | | return message; |
| | | } |
| | | |
| | | public void setMessage(String message) { |
| | | this.message = message; |
| | | } |
| | | } |
| | | } |
| | |
| | | return R.ok(customerService.customewTransactionsDetails(page,customerId)); |
| | | } |
| | | |
| | | @GetMapping("/customerTransactionsSummary") |
| | | @Log(title = "客æ·å¾æ¥ç»è®¡æ±æ»", businessType = BusinessType.OTHER) |
| | | @Operation(summary = "客æ·å¾æ¥ç»è®¡æ±æ»") |
| | | public R customerTransactionsSummary(Long customerId) { |
| | | return R.ok(customerService.getCustomerTransactionsSummary(customerId)); |
| | | } |
| | | |
| | | @GetMapping("/customerTransactionsProducts") |
| | | @Log(title = "客æ·å¾æ¥äº§åæç»", businessType = BusinessType.OTHER) |
| | | @Operation(summary = "客æ·å¾æ¥äº§åæç»") |
| | | public R customerTransactionsProducts(Page page, Long customerId, Long salesLedgerId) { |
| | | return R.ok(customerService.getCustomerTransactionsProducts(page, customerId, salesLedgerId)); |
| | | } |
| | | |
| | | @GetMapping("/customerTransactionsShipments") |
| | | @Log(title = "客æ·å¾æ¥åè´§æç»", businessType = BusinessType.OTHER) |
| | | @Operation(summary = "客æ·å¾æ¥åè´§æç»") |
| | | public R customerTransactionsShipments(Page page, Long customerId, Long salesLedgerId) { |
| | | return R.ok(customerService.getCustomerTransactionsShipments(page, customerId, salesLedgerId)); |
| | | } |
| | | |
| | | } |
| | |
| | | return AjaxResult.success(shippingInfoService.getShippingInfoByCustomerName(customerName)); |
| | | } |
| | | |
| | | @GetMapping("/getForReturn") |
| | | @Operation(summary = "éå®éè´§-éè¿å®¢æ·åç§°æ¥è¯¢åè´§ä¿¡æ¯ï¼å«æ¹æ¬¡å·ï¼") |
| | | public AjaxResult getForReturn(String customerName) { |
| | | return AjaxResult.success(shippingInfoService.getShippingInfoForReturn(customerName)); |
| | | } |
| | | |
| | | @GetMapping("/getDateil/{id}") |
| | | @Operation(summary = "éè¿idæ¥è¯¢è¯¦æ
") |
| | | public R getDateil(@PathVariable("id") Long id) { |
| | |
| | | private Long id; |
| | | private String salesContractNo; |
| | | private String customerContractNo; |
| | | |
| | | /** |
| | | * æ»ååå· |
| | | */ |
| | | private String masterContractNo; |
| | | |
| | | private String projectName; |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private Date entryDate; |
| | |
| | | import com.ruoyi.sales.pojo.CommonFile; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.pojo.ShippingProductDetail; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | |
| | | |
| | | private String templateName; |
| | | |
| | | @Schema(description = "å·²éè´§æ°é") |
| | | private BigDecimal returnedQuantity; |
| | | |
| | | @Schema(description = "éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§") |
| | | private String returnStatus; |
| | | |
| | | } |
| | |
| | | import com.ruoyi.procurementrecord.bean.vo.ShippingProductVo; |
| | | import com.ruoyi.sales.dto.ShippingInfoDto; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.vo.ShippingInfoForReturnVo; |
| | | import org.apache.ibatis.annotations.Param; |
| | | |
| | | import java.util.List; |
| | |
| | | List<ShippingProductVo> getReturnManagementDtoById(@Param("shippingId")Long shippingId); |
| | | |
| | | List<ShippingInfo> getShippingInfoByCustomerName(String customerName); |
| | | |
| | | /** |
| | | * æ¥è¯¢åè´§ä¿¡æ¯ï¼éå®éè´§ç¨ï¼å«æ¹æ¬¡å·ï¼ |
| | | */ |
| | | List<ShippingInfoForReturnVo> getShippingInfoForReturn(String customerName); |
| | | } |
| | |
| | | private String salesContractNo; |
| | | |
| | | /** |
| | | * æ»ååå· |
| | | */ |
| | | @Excel(name = "æ»ååå·") |
| | | private String masterContractNo; |
| | | |
| | | /** |
| | | * 客æ·ååå· |
| | | */ |
| | | @Excel(name = "客æ·ååå·", type = Excel.Type.IMPORT) |
| | |
| | | import com.ruoyi.sales.dto.ShippingInfoDto; |
| | | import com.ruoyi.sales.dto.ShippingProductDetailDto; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.vo.ShippingInfoForReturnVo; |
| | | |
| | | import java.util.List; |
| | | |
| | |
| | | |
| | | List<ShippingInfo> getShippingInfoByCustomerName(String customerName); |
| | | |
| | | /** |
| | | * æ¥è¯¢åè´§ä¿¡æ¯ï¼éå®éè´§ç¨ï¼å«æ¹æ¬¡å·ï¼ |
| | | */ |
| | | List<ShippingInfoForReturnVo> getShippingInfoForReturn(String customerName); |
| | | |
| | | boolean add(ShippingInfoDto req); |
| | | |
| | | List<ShippingProductDetailDto> getDetail(Long id); |
| | |
| | | import com.ruoyi.sales.mapper.ShippingProductDetailMapper; |
| | | import com.ruoyi.sales.pojo.ShippingInfo; |
| | | import com.ruoyi.sales.pojo.ShippingProductDetail; |
| | | import com.ruoyi.sales.vo.ShippingInfoForReturnVo; |
| | | import com.ruoyi.sales.service.ShippingInfoService; |
| | | import lombok.RequiredArgsConstructor; |
| | | import lombok.extern.slf4j.Slf4j; |
| | |
| | | } |
| | | |
| | | @Override |
| | | public List<ShippingInfoForReturnVo> getShippingInfoForReturn(String customerName) { |
| | | return shippingInfoMapper.getShippingInfoForReturn(customerName); |
| | | } |
| | | |
| | | @Override |
| | | public boolean add(ShippingInfoDto req) { |
| | | // æ ¡éªoutboundBatcheså¯ä¸æ§ |
| | | if (req.getOutboundBatches() != null && !req.getOutboundBatches().isEmpty()) { |
| | |
| | | @Schema(description = "ååéé¢") |
| | | private BigDecimal contractAmount; |
| | | |
| | | @Schema(description = "产ååç§°å表ï¼éå·åéï¼") |
| | | private String productNames; |
| | | |
| | | @Schema(description = "æ¶æ¬¾éé¢") |
| | | private BigDecimal receiptPaymentAmount; |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * 客æ·å¾æ¥äº§åæç»VO |
| | | */ |
| | | @Data |
| | | @Schema(name = "CustomerTransactionsProductVo", description = "客æ·å¾æ¥äº§åæç»") |
| | | public class CustomerTransactionsProductVo { |
| | | |
| | | @Schema(description = "éå®å°è´¦ID") |
| | | private Long salesLedgerId; |
| | | |
| | | @Schema(description = "éå®ååå·") |
| | | private String salesContractNo; |
| | | |
| | | @Schema(description = "产åID") |
| | | private Long productId; |
| | | |
| | | @Schema(description = "产ååç§°") |
| | | private String productName; |
| | | |
| | | @Schema(description = "è§æ ¼åå·") |
| | | private String model; |
| | | |
| | | @Schema(description = "åä½") |
| | | private String unit; |
| | | |
| | | @Schema(description = "ååæ°é") |
| | | private BigDecimal contractQuantity; |
| | | |
| | | @Schema(description = "åååä»·(å«ç¨)") |
| | | private BigDecimal taxInclusiveUnitPrice; |
| | | |
| | | @Schema(description = "ååéé¢") |
| | | private BigDecimal contractAmount; |
| | | |
| | | @Schema(description = "å·²åè´§æ°é") |
| | | private BigDecimal shippedQuantity; |
| | | |
| | | @Schema(description = "å·²åè´§éé¢") |
| | | private BigDecimal shippedAmount; |
| | | |
| | | @Schema(description = "å·²æ¶æ¬¾éé¢") |
| | | private BigDecimal receivedAmount; |
| | | |
| | | @Schema(description = "åºæ¶éé¢") |
| | | private BigDecimal receivableAmount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.vo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDate; |
| | | |
| | | /** |
| | | * 客æ·å¾æ¥åè´§æç»VO |
| | | */ |
| | | @Data |
| | | @Schema(name = "CustomerTransactionsShipmentVo", description = "客æ·å¾æ¥åè´§æç»") |
| | | public class CustomerTransactionsShipmentVo { |
| | | |
| | | @Schema(description = "éå®å°è´¦ID") |
| | | private Long salesLedgerId; |
| | | |
| | | @Schema(description = "éå®ååå·") |
| | | private String salesContractNo; |
| | | |
| | | @Schema(description = "åè´§åID") |
| | | private Long shippingId; |
| | | |
| | | @Schema(description = "åè´§åå·") |
| | | private String shippingNo; |
| | | |
| | | @Schema(description = "产ååç§°") |
| | | private String productName; |
| | | |
| | | @Schema(description = "è§æ ¼åå·") |
| | | private String model; |
| | | |
| | | @Schema(description = "åè´§æ°é") |
| | | private BigDecimal shippingQuantity; |
| | | |
| | | @Schema(description = "åè´§éé¢(å«ç¨)") |
| | | private BigDecimal shippingAmount; |
| | | |
| | | @Schema(description = "åºåºæ¹å·") |
| | | private String batchNo; |
| | | |
| | | @Schema(description = "åè´§æ¥æ") |
| | | @JsonFormat(pattern = "yyyy-MM-dd") |
| | | private LocalDate shippingDate; |
| | | |
| | | @Schema(description = "审æ¹ç¶æ(0å¾
审/1已审)") |
| | | private Integer approvalStatus; |
| | | |
| | | @Schema(description = "å·²æ¶æ¬¾éé¢") |
| | | private BigDecimal receivedAmount; |
| | | |
| | | @Schema(description = "åºæ¶éé¢") |
| | | private BigDecimal receivableAmount; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.vo; |
| | | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | |
| | | /** |
| | | * 客æ·å¾æ¥ç»è®¡æ±æ»VOï¼ä¼åçï¼ |
| | | */ |
| | | @Data |
| | | @Schema(name = "CustomerTransactionsSummaryVo", description = "客æ·å¾æ¥ç»è®¡æ±æ»") |
| | | public class CustomerTransactionsSummaryVo { |
| | | |
| | | @Schema(description = "客æ·ID") |
| | | private Long customerId; |
| | | |
| | | @Schema(description = "客æ·åç§°") |
| | | private String customerName; |
| | | |
| | | @Schema(description = "ååæ»éé¢") |
| | | private BigDecimal contractAmounts; |
| | | |
| | | @Schema(description = "ååæ°é") |
| | | private Integer contractCount; |
| | | |
| | | @Schema(description = "产åç§ç±»æ°") |
| | | private Integer productCount; |
| | | |
| | | @Schema(description = "åè´§æ»éé¢") |
| | | private BigDecimal shippedAmounts; |
| | | |
| | | @Schema(description = "åè´§æ»æ°é") |
| | | private BigDecimal shippedQuantity; |
| | | |
| | | @Schema(description = "æ¶æ¬¾éé¢") |
| | | private BigDecimal receivedAmounts; |
| | | |
| | | @Schema(description = "åºæ¶éé¢") |
| | | private BigDecimal receivableAmounts; |
| | | |
| | | @Schema(description = "éè´§éé¢") |
| | | private BigDecimal returnAmounts; |
| | | |
| | | @Schema(description = "æªåè´§éé¢") |
| | | private BigDecimal unshippedAmounts; |
| | | |
| | | @Schema(description = "æ¶æ¬¾ç(%)") |
| | | private BigDecimal receivedRate; |
| | | |
| | | @Schema(description = "åè´§ç(%)") |
| | | private BigDecimal shippedRate; |
| | | } |
| | |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.util.List; |
| | | |
| | | @Data |
| | |
| | | |
| | | @Schema(description = "éè´ååå·") |
| | | private String purchaseContractNumber; |
| | | |
| | | @Schema(description = "éè´å°è´¦æ»ååå·") |
| | | private String purchaseMasterContractNo; |
| | | |
| | | @Schema(description = "å·²éè´§æ°é") |
| | | private BigDecimal returnedQuantity; |
| | | |
| | | @Schema(description = "éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§") |
| | | private String returnStatus; |
| | | } |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | package com.ruoyi.sales.vo; |
| | | |
| | | import com.fasterxml.jackson.annotation.JsonFormat; |
| | | import io.swagger.v3.oas.annotations.media.Schema; |
| | | import lombok.Data; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.time.LocalDateTime; |
| | | |
| | | /** |
| | | * åè´§ä¿¡æ¯-éå®éè´§ç¨VO |
| | | */ |
| | | @Data |
| | | @Schema(name = "ShippingInfoForReturnVo", description = "åè´§ä¿¡æ¯ï¼éå®éè´§ç¨ï¼") |
| | | public class ShippingInfoForReturnVo { |
| | | |
| | | @Schema(description = "åè´§åID") |
| | | private Long shippingId; |
| | | |
| | | @Schema(description = "åè´§åå·") |
| | | private String shippingNo; |
| | | |
| | | @Schema(description = "éå®ååå·") |
| | | private String salesContractNo; |
| | | |
| | | @Schema(description = "客æ·åç§°") |
| | | private String customerName; |
| | | |
| | | @Schema(description = "产ååç§°") |
| | | private String productName; |
| | | |
| | | @Schema(description = "è§æ ¼åå·") |
| | | private String model; |
| | | |
| | | @Schema(description = "åè´§æ°é") |
| | | private BigDecimal shippingQuantity; |
| | | |
| | | @Schema(description = "å·²éè´§æ°é") |
| | | private BigDecimal returnedQuantity; |
| | | |
| | | @Schema(description = "éè´§ç¶æï¼æ éè´§/é¨åéè´§/å
¨é¨éè´§") |
| | | private String returnStatus; |
| | | |
| | | @Schema(description = "æ¹æ¬¡å·") |
| | | private String batchNo; |
| | | |
| | | @Schema(description = "车çå·") |
| | | private String shippingCarNumber; |
| | | |
| | | @Schema(description = "å建æ¶é´") |
| | | @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") |
| | | private LocalDateTime createTime; |
| | | |
| | | @Schema(description = "æ¾ç¤ºæ ç¾ï¼æ¹æ¬¡å·-车çå·-å建æ¶é´ï¼") |
| | | private String displayLabel; |
| | | } |
| | |
| | | sl.sales_contract_no, |
| | | sl.execution_date, |
| | | sl.contract_amount, |
| | | T4.productNames, |
| | | IFNULL(T1.receiptPaymentAmount, 0) AS receiptPaymentAmount, |
| | | IFNULL(T2.outboundAmount, 0) - IFNULL(T3.returnAmount, 0) AS receiptableAmount |
| | | from sales_ledger sl |
| | |
| | | where rm.status=1 |
| | | group by sl.id |
| | | )T3 on T3.id = sl.id |
| | | left join ( |
| | | select slp.sales_ledger_id, GROUP_CONCAT(p.product_name) as productNames |
| | | from sales_ledger_product slp |
| | | left join product p on slp.product_id = p.id |
| | | where slp.type = 1 |
| | | group by slp.sales_ledger_id |
| | | ) T4 on T4.sales_ledger_id = sl.id |
| | | where sl.customer_id = #{customerId} |
| | | order by sl.id desc |
| | | </select> |
| | | |
| | | <!-- 客æ·å¾æ¥ç»è®¡æ±æ» --> |
| | | <select id="getCustomerTransactionsSummary" resultType="com.ruoyi.sales.vo.CustomerTransactionsSummaryVo"> |
| | | SELECT |
| | | c.id AS customerId, |
| | | c.customer_name AS customerName, |
| | | IFNULL(T1.contractAmounts, 0) AS contractAmounts, |
| | | IFNULL(T1.contractCount, 0) AS contractCount, |
| | | IFNULL(T5.productCount, 0) AS productCount, |
| | | IFNULL(T2.shippedAmounts, 0) AS shippedAmounts, |
| | | IFNULL(T2.shippedQuantity, 0) AS shippedQuantity, |
| | | IFNULL(T3.receivedAmounts, 0) AS receivedAmounts, |
| | | IFNULL(T2.shippedAmounts, 0) - IFNULL(T3.receivedAmounts, 0) AS receivableAmounts, |
| | | IFNULL(T4.returnAmounts, 0) AS returnAmounts, |
| | | IFNULL(T1.contractAmounts, 0) - IFNULL(T2.shippedAmounts, 0) AS unshippedAmounts, |
| | | CASE WHEN IFNULL(T2.shippedAmounts, 0) > 0 |
| | | THEN ROUND(IFNULL(T3.receivedAmounts, 0) / T2.shippedAmounts * 100, 2) |
| | | ELSE 0 END AS receivedRate, |
| | | CASE WHEN IFNULL(T1.contractAmounts, 0) > 0 |
| | | THEN ROUND(IFNULL(T2.shippedAmounts, 0) / T1.contractAmounts * 100, 2) |
| | | ELSE 0 END AS shippedRate |
| | | FROM customer c |
| | | LEFT JOIN ( |
| | | SELECT customer_id, SUM(contract_amount) AS contractAmounts, COUNT(*) AS contractCount |
| | | FROM sales_ledger WHERE customer_id = #{customerId} |
| | | GROUP BY customer_id |
| | | ) T1 ON T1.customer_id = c.id |
| | | LEFT JOIN ( |
| | | SELECT |
| | | sl.customer_id, |
| | | SUM(sor.stock_out_num) AS shippedQuantity, |
| | | SUM(sor.stock_out_num * slp.tax_inclusive_unit_price) AS shippedAmounts |
| | | FROM stock_out_record sor |
| | | LEFT JOIN shipping_info s ON sor.record_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | | LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id |
| | | WHERE sor.record_type = '13' AND sor.approval_status = 1 AND slp.type = 1 |
| | | AND sl.customer_id = #{customerId} |
| | | GROUP BY sl.customer_id |
| | | ) T2 ON T2.customer_id = c.id |
| | | LEFT JOIN ( |
| | | SELECT customer_id, SUM(collection_amount) AS receivedAmounts |
| | | FROM account_sales_collection WHERE customer_id = #{customerId} |
| | | GROUP BY customer_id |
| | | ) T3 ON T3.customer_id = c.id |
| | | LEFT JOIN ( |
| | | SELECT |
| | | sl.customer_id, |
| | | SUM(rm.refund_amount) AS returnAmounts |
| | | FROM return_management rm |
| | | LEFT JOIN shipping_info si ON rm.shipping_id = si.id |
| | | LEFT JOIN sales_ledger sl ON si.sales_ledger_id = sl.id |
| | | WHERE rm.status = 1 AND sl.customer_id = #{customerId} |
| | | GROUP BY sl.customer_id |
| | | ) T4 ON T4.customer_id = c.id |
| | | LEFT JOIN ( |
| | | SELECT sl.customer_id, COUNT(DISTINCT pm.product_id) AS productCount |
| | | FROM sales_ledger sl |
| | | LEFT JOIN sales_ledger_product slp ON sl.id = slp.sales_ledger_id |
| | | LEFT JOIN product_model pm ON slp.product_id = pm.id |
| | | WHERE sl.customer_id = #{customerId} AND slp.type = 1 |
| | | GROUP BY sl.customer_id |
| | | ) T5 ON T5.customer_id = c.id |
| | | WHERE c.id = #{customerId} |
| | | </select> |
| | | |
| | | <!-- 客æ·å¾æ¥äº§åæç» --> |
| | | <select id="getCustomerTransactionsProducts" resultType="com.ruoyi.sales.vo.CustomerTransactionsProductVo"> |
| | | SELECT |
| | | sl.id AS salesLedgerId, |
| | | sl.sales_contract_no AS salesContractNo, |
| | | slp.product_id AS productId, |
| | | IFNULL(p.product_name, slp.product_category) AS productName, |
| | | IFNULL(pm.model, slp.specification_model) AS model, |
| | | IFNULL(pm.unit, slp.unit) AS unit, |
| | | slp.quantity AS contractQuantity, |
| | | slp.tax_inclusive_unit_price AS taxInclusiveUnitPrice, |
| | | slp.quantity * slp.tax_inclusive_unit_price AS contractAmount, |
| | | IFNULL(T1.shippedQuantity, 0) AS shippedQuantity, |
| | | IFNULL(T1.shippedAmount, 0) AS shippedAmount, |
| | | IFNULL(T2.receivedAmount, 0) AS receivedAmount, |
| | | IFNULL(T1.shippedAmount, 0) - IFNULL(T2.receivedAmount, 0) AS receivableAmount |
| | | FROM sales_ledger sl |
| | | LEFT JOIN sales_ledger_product slp ON sl.id = slp.sales_ledger_id |
| | | LEFT JOIN product_model pm ON slp.product_id = pm.id |
| | | LEFT JOIN product p ON pm.product_id = p.id |
| | | LEFT JOIN ( |
| | | SELECT |
| | | s.sales_ledger_id, |
| | | s.sales_ledger_product_id, |
| | | SUM(sor.stock_out_num) AS shippedQuantity, |
| | | SUM(sor.stock_out_num * slp2.tax_inclusive_unit_price) AS shippedAmount |
| | | FROM stock_out_record sor |
| | | LEFT JOIN shipping_info s ON sor.record_id = s.id |
| | | LEFT JOIN sales_ledger_product slp2 ON s.sales_ledger_product_id = slp2.id |
| | | WHERE sor.record_type = '13' AND sor.approval_status = 1 |
| | | GROUP BY s.sales_ledger_id, s.sales_ledger_product_id |
| | | ) T1 ON T1.sales_ledger_id = sl.id AND T1.sales_ledger_product_id = slp.id |
| | | LEFT JOIN ( |
| | | SELECT |
| | | s.sales_ledger_id, |
| | | s.sales_ledger_product_id, |
| | | SUM(ascc.collection_amount) AS receivedAmount |
| | | FROM account_sales_collection ascc |
| | | LEFT JOIN stock_out_record sor ON FIND_IN_SET(sor.id, ascc.stock_out_record_ids) > 0 |
| | | LEFT JOIN shipping_info s ON sor.record_id = s.id |
| | | WHERE sor.record_type = '13' AND sor.approval_status = 1 |
| | | GROUP BY s.sales_ledger_id, s.sales_ledger_product_id |
| | | ) T2 ON T2.sales_ledger_id = sl.id AND T2.sales_ledger_product_id = slp.id |
| | | WHERE sl.customer_id = #{customerId} AND slp.type = 1 |
| | | <if test="salesLedgerId != null"> |
| | | AND sl.id = #{salesLedgerId} |
| | | </if> |
| | | ORDER BY sl.id DESC, slp.id DESC |
| | | </select> |
| | | |
| | | <!-- 客æ·å¾æ¥åè´§æç» --> |
| | | <select id="getCustomerTransactionsShipments" resultType="com.ruoyi.sales.vo.CustomerTransactionsShipmentVo"> |
| | | SELECT |
| | | sl.id AS salesLedgerId, |
| | | sl.sales_contract_no AS salesContractNo, |
| | | s.id AS shippingId, |
| | | s.shipping_no AS shippingNo, |
| | | IFNULL(p.product_name, slp.product_category) AS productName, |
| | | IFNULL(pm.model, slp.specification_model) AS model, |
| | | sor.stock_out_num AS shippingQuantity, |
| | | sor.stock_out_num * slp.tax_inclusive_unit_price AS shippingAmount, |
| | | sor.batch_no AS batchNo, |
| | | s.shipping_date AS shippingDate, |
| | | sor.approval_status AS approvalStatus, |
| | | IFNULL(T1.receivedAmount, 0) AS receivedAmount, |
| | | sor.stock_out_num * slp.tax_inclusive_unit_price - IFNULL(T1.receivedAmount, 0) AS receivableAmount |
| | | FROM stock_out_record sor |
| | | LEFT JOIN shipping_info s ON sor.record_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | | LEFT JOIN sales_ledger_product slp ON s.sales_ledger_product_id = slp.id |
| | | LEFT JOIN product_model pm ON slp.product_id = pm.id |
| | | LEFT JOIN product p ON pm.product_id = p.id |
| | | LEFT JOIN ( |
| | | SELECT |
| | | sor2.id AS stock_out_record_id, |
| | | SUM(ascc.collection_amount) AS receivedAmount |
| | | FROM account_sales_collection ascc |
| | | LEFT JOIN stock_out_record sor2 ON FIND_IN_SET(sor2.id, ascc.stock_out_record_ids) > 0 |
| | | WHERE ascc.customer_id = #{customerId} |
| | | GROUP BY sor2.id |
| | | ) T1 ON T1.stock_out_record_id = sor.id |
| | | WHERE sor.record_type = '13' AND sl.customer_id = #{customerId} |
| | | <if test="salesLedgerId != null"> |
| | | AND sl.id = #{salesLedgerId} |
| | | </if> |
| | | ORDER BY sor.id DESC |
| | | </select> |
| | | </mapper> |
| | |
| | | si.shipping_no, |
| | | sl.project_name, |
| | | sl.sales_contract_no, |
| | | sl.salesman |
| | | sl.salesman, |
| | | IFNULL(sq.shipping_qty, 0) AS shippingQuantity, |
| | | IFNULL(rs.total_return_num, 0) AS returnedQuantity, |
| | | CASE |
| | | WHEN IFNULL(rs.total_return_num, 0) = 0 THEN 'æ éè´§' |
| | | WHEN IFNULL(rs.total_return_num, 0) >= IFNULL(sq.shipping_qty, 0) THEN 'å
¨é¨éè´§' |
| | | ELSE 'é¨åéè´§' |
| | | END AS returnStatus |
| | | from return_management rm |
| | | left join shipping_info si on rm.shipping_id = si.id |
| | | left join customer c on rm.customer_id = c.id |
| | | left join sales_ledger sl on si.sales_ledger_id = sl.id |
| | | left join ( |
| | | SELECT sor.record_id, SUM(sor.stock_out_num) AS shipping_qty |
| | | FROM stock_out_record sor |
| | | WHERE sor.record_type = '13' AND sor.approval_status = 1 |
| | | GROUP BY sor.record_id |
| | | ) sq ON sq.record_id = si.id |
| | | left join ( |
| | | SELECT rm2.shipping_id, SUM(rsp.num) AS total_return_num |
| | | FROM return_sale_product rsp |
| | | LEFT JOIN return_management rm2 ON rm2.id = rsp.return_management_id |
| | | WHERE rm2.status = 1 |
| | | GROUP BY rm2.shipping_id |
| | | ) rs ON rs.shipping_id = si.id |
| | | <where> |
| | | <if test="req.returnNo != null and req.returnNo != ''"> |
| | | and rm.return_no like concat('%',#{req.returnNo},'%') |
| | |
| | | SELECT |
| | | pl.id, |
| | | pl.purchase_contract_number, |
| | | pl.master_contract_no, |
| | | pl.sales_contract_no, |
| | | pl.supplier_id, |
| | | pl.supplier_name, |
| | |
| | | <if test="c.purchaseContractNumber != null and c.purchaseContractNumber != ''"> |
| | | AND pl.purchase_contract_number LIKE CONCAT('%', #{c.purchaseContractNumber}, '%') |
| | | </if> |
| | | <if test="c.masterContractNo != null and c.masterContractNo != ''"> |
| | | AND pl.master_contract_no LIKE CONCAT('%', #{c.masterContractNo}, '%') |
| | | </if> |
| | | <if test="c.approvalStatus != null and c.approvalStatus != ''"> |
| | | AND pl.approval_status = #{c.approvalStatus} |
| | | </if> |
| | |
| | | <select id="selectSalesLedgerListPage" resultType="com.ruoyi.sales.vo.SalesLedgerVo"> |
| | | SELECT T1.id, |
| | | T1.sales_contract_no, |
| | | T1.master_contract_no, |
| | | T1.customer_contract_no, |
| | | T1.project_name, |
| | | T1.entry_date, |
| | |
| | | T1.delivery_date, |
| | | DATEDIFF(T1.delivery_date, CURDATE()) AS delivery_days_diff, |
| | | IFNULL(shipping_status_counts.is_all_shipped, FALSE) AS is_fh, |
| | | T3.purchase_contract_number |
| | | T3.purchase_contract_number, |
| | | T3.master_contract_no AS purchaseMasterContractNo, |
| | | IFNULL(rs.total_return_num, 0) AS returnedQuantity, |
| | | CASE |
| | | WHEN IFNULL(rs.total_return_num, 0) = 0 THEN 'æ éè´§' |
| | | WHEN IFNULL(rs.total_return_num, 0) >= IFNULL(shipping_qty.total_qty, 0) THEN 'å
¨é¨éè´§' |
| | | ELSE 'é¨åéè´§' |
| | | END AS returnStatus |
| | | FROM sales_ledger T1 |
| | | LEFT JOIN sys_user T2 ON T1.entry_person = T2.user_id |
| | | LEFT JOIN ( |
| | |
| | | GROUP BY sales_ledger_id |
| | | ) shipping_status_counts ON T1.id = shipping_status_counts.sales_ledger_id |
| | | LEFT JOIN purchase_ledger T3 ON T1.purchase_ledger_id = T3.id |
| | | LEFT JOIN ( |
| | | SELECT si.sales_ledger_id, SUM(sor.stock_out_num) AS total_qty |
| | | FROM shipping_info si |
| | | LEFT JOIN stock_out_record sor ON sor.record_id = si.id AND sor.record_type = '13' AND sor.approval_status = 1 |
| | | GROUP BY si.sales_ledger_id |
| | | ) shipping_qty ON shipping_qty.sales_ledger_id = T1.id |
| | | LEFT JOIN ( |
| | | SELECT si.sales_ledger_id, SUM(rsp.num) AS total_return_num |
| | | FROM return_sale_product rsp |
| | | LEFT JOIN return_management rm ON rm.id = rsp.return_management_id |
| | | LEFT JOIN shipping_info si ON si.id = rm.shipping_id |
| | | WHERE rm.status = 1 |
| | | GROUP BY si.sales_ledger_id |
| | | ) rs ON rs.sales_ledger_id = T1.id |
| | | |
| | | <where> |
| | | <if test="salesLedgerDto.customerName != null and salesLedgerDto.customerName != '' "> |
| | |
| | | <if test="salesLedgerDto.salesContractNo != null and salesLedgerDto.salesContractNo != '' "> |
| | | AND T1.sales_contract_no LIKE CONCAT('%',#{salesLedgerDto.salesContractNo},'%') |
| | | </if> |
| | | <if test="salesLedgerDto.masterContractNo != null and salesLedgerDto.masterContractNo != '' "> |
| | | AND T1.master_contract_no LIKE CONCAT('%',#{salesLedgerDto.masterContractNo},'%') |
| | | </if> |
| | | <if test="salesLedgerDto.projectName != null and salesLedgerDto.projectName != '' "> |
| | | AND T1.project_name LIKE CONCAT('%',#{salesLedgerDto.projectName},'%') |
| | | </if> |
| | |
| | | sl.customer_name, |
| | | spd.totalQuantity, |
| | | sor.outboundBatches, |
| | | pl.purchase_contract_number |
| | | pl.purchase_contract_number, |
| | | IFNULL(rs.total_return_num, 0) AS returnedQuantity, |
| | | CASE |
| | | WHEN IFNULL(rs.total_return_num, 0) = 0 THEN 'æ éè´§' |
| | | WHEN IFNULL(rs.total_return_num, 0) >= spd.totalQuantity THEN 'å
¨é¨éè´§' |
| | | ELSE 'é¨åéè´§' |
| | | END AS returnStatus |
| | | FROM shipping_info s |
| | | LEFT JOIN (select shipping_info_id,sum(quantity) totalQuantity from shipping_product_detail GROUP BY shipping_info_id) spd ON spd.shipping_info_id = s.id |
| | | LEFT JOIN sales_ledger sl ON s.sales_ledger_id = sl.id |
| | |
| | | from stock_out_record |
| | | where record_type='13'and approval_status=1 |
| | | group by record_id)sor on sor.record_id= s.id |
| | | LEFT JOIN ( |
| | | SELECT |
| | | si.id AS shipping_info_id, |
| | | SUM(rsp.num) AS total_return_num |
| | | FROM return_sale_product rsp |
| | | LEFT JOIN return_management rm ON rm.id = rsp.return_management_id |
| | | LEFT JOIN shipping_info si ON si.id = rm.shipping_id |
| | | WHERE rm.status = 1 |
| | | GROUP BY si.id |
| | | ) rs ON rs.shipping_info_id = s.id |
| | | WHERE 1=1 |
| | | <if test="req.salesContractNo != null and req.salesContractNo != ''"> |
| | | AND sl.sales_contract_no LIKE CONCAT('%',#{req.salesContractNo},'%') |
| | |
| | | left join sales_ledger sl on si.sales_ledger_id = sl.id |
| | | where sl.customer_name = #{customerName} |
| | | </select> |
| | | |
| | | <!-- éå®éè´§ç¨ï¼æ¥è¯¢åè´§ä¿¡æ¯å«æ¹æ¬¡å· --> |
| | | <select id="getShippingInfoForReturn" resultType="com.ruoyi.sales.vo.ShippingInfoForReturnVo"> |
| | | SELECT |
| | | si.id AS shippingId, |
| | | si.shipping_no AS shippingNo, |
| | | sl.sales_contract_no AS salesContractNo, |
| | | sl.customer_name AS customerName, |
| | | IFNULL(p.product_name, slp.product_category) AS productName, |
| | | IFNULL(pm.model, slp.specification_model) AS model, |
| | | sor.stock_out_num AS shippingQuantity, |
| | | IFNULL(rs.total_return_num, 0) AS returnedQuantity, |
| | | CASE |
| | | WHEN IFNULL(rs.total_return_num, 0) = 0 THEN 'æ éè´§' |
| | | WHEN IFNULL(rs.total_return_num, 0) >= sor.stock_out_num THEN 'å
¨é¨éè´§' |
| | | ELSE 'é¨åéè´§' |
| | | END AS returnStatus, |
| | | sor.batch_no AS batchNo, |
| | | si.shipping_car_number AS shippingCarNumber, |
| | | si.create_time AS createTime, |
| | | CONCAT( |
| | | IFNULL(sor.batch_no, ''), |
| | | '-', |
| | | IFNULL(si.shipping_car_number, ''), |
| | | '-', |
| | | DATE_FORMAT(si.create_time, '%Y-%m-%d') |
| | | ) AS displayLabel |
| | | FROM shipping_info si |
| | | LEFT JOIN sales_ledger sl ON si.sales_ledger_id = sl.id |
| | | LEFT JOIN sales_ledger_product slp ON si.sales_ledger_product_id = slp.id AND slp.type = 1 |
| | | LEFT JOIN product_model pm ON slp.product_id = pm.id |
| | | LEFT JOIN product p ON pm.product_id = p.id |
| | | LEFT JOIN stock_out_record sor ON sor.record_id = si.id AND sor.record_type = '13' AND sor.approval_status = 1 |
| | | LEFT JOIN ( |
| | | SELECT |
| | | stock_out_record_id, |
| | | SUM(num) AS total_return_num |
| | | FROM return_sale_product rsp |
| | | LEFT JOIN return_management rm ON rm.id = rsp.return_management_id |
| | | WHERE rm.status = 1 |
| | | GROUP BY stock_out_record_id |
| | | ) rs ON rs.stock_out_record_id = sor.id |
| | | WHERE sl.customer_name = #{customerName} |
| | | ORDER BY si.create_time DESC |
| | | </select> |
| | | </mapper> |