Browse Source

feat(order): 添加打样单收货功能并优化验货流程

- 在poOrder页面添加收货按钮,仅对打样单且已下达状态显示
- 新增收货确认弹窗,支持填写收货日期并提交到后端
- 添加receivePoDetail API接口用于处理打样单收货逻辑
- 实现收货后自动生成已排程验货申请的功能
- 在myInspectionList中增加状态校验,防止页面数据滞后导致的操作错误
- 为公共验货单添加开始验货时的提示信息
- 完善相关的工具函数和状态管理逻辑
master
qiankanghui 2 weeks ago
parent
commit
6a907db7df
  1. 3
      src/api/order/poOrder.js
  2. 9
      src/views/modules/inspection/myInspectionList.vue
  3. 123
      src/views/modules/order/poOrder.vue
  4. 5
      src/views/modules/order/poOrderStatusOptions.js

3
src/api/order/poOrder.js

@ -31,6 +31,9 @@ export const shipPoDetailPreview = (data) => createAPI(`/pODetail/shipPoDetailPr
/** 提交发货(回写 qty/c_ship_qty,并按规则判定部分发货或已发货) */ /** 提交发货(回写 qty/c_ship_qty,并按规则判定部分发货或已发货) */
export const shipPoDetail = (data) => createAPI(`/pODetail/shipPoDetail`, 'post', data) export const shipPoDetail = (data) => createAPI(`/pODetail/shipPoDetail`, 'post', data)
/** 打样单收货(回写 c_po_actual_ready_date,同事务自动生成已排程验货申请) */
export const receivePoDetail = (data) => createAPI(`/pODetail/receivePoDetail`, 'post', data)
// 根据PO订单查询验货申请明细 // 根据PO订单查询验货申请明细
export const getInspectionByPODetail = (data) => createAPI(`/pODetail/getInspectionByPODetail`, 'post', data) export const getInspectionByPODetail = (data) => createAPI(`/pODetail/getInspectionByPODetail`, 'post', data)

9
src/views/modules/inspection/myInspectionList.vue

@ -199,7 +199,14 @@ export default {
// 开始验货 // 开始验货
startInspection (row) { startInspection (row) {
this.$confirm(`确认开始验货?\n申请单号:${row.requestNo}\n供应商:${row.supplierName}`, '提示', {
// 校验单子状态是否为已排程(防止页面数据滞后)
if (row.statusDb !== 'Scheduled') {
this.$message.warning('只有已排程状态的验货申请可以开始验货,请刷新列表后重试')
this.getList()
return
}
const publicOrderTip = row.qcOperator === '*' ? '\n该单为公共单(QC人员:*),开始验货后QC人员将改为您本人' : ''
this.$confirm(`确认开始验货?\n申请单号:${row.requestNo}\n供应商:${row.supplierName}${publicOrderTip}`, '提示', {
confirmButtonText: '确定', confirmButtonText: '确定',
cancelButtonText: '取消', cancelButtonText: '取消',
type: 'warning' type: 'warning'

123
src/views/modules/order/poOrder.vue

@ -77,6 +77,10 @@
v-if="canShipPoOrder(scope.row.status)" v-if="canShipPoOrder(scope.row.status)"
type="primary" type="primary"
@click.stop="handleShipPoOrder(scope.row)">shipped</el-link> @click.stop="handleShipPoOrder(scope.row)">shipped</el-link>
<el-link
v-if="canReceivePoOrder(scope.row)"
type="primary"
@click.stop="handleReceivePoOrder(scope.row)">收货</el-link>
<el-link <el-link
v-if="canClosePoOrder(scope.row.status)" v-if="canClosePoOrder(scope.row.status)"
type="primary" type="primary"
@ -365,6 +369,35 @@
</div> </div>
</el-dialog> </el-dialog>
<!-- 打样单收货确认弹窗:填写收货日期,确定后回写 c_po_actual_ready_date 并自动生成已排程验货申请 -->
<el-dialog
title="收货确认"
v-drag
:visible.sync="receiveDialogVisible"
width="360px"
append-to-body
:close-on-click-modal="false"
@closed="resetReceiveDialog">
<el-form label-position="top">
<el-row :gutter="10">
<el-col :span="24">
<el-form-item label="收货日期" required>
<el-date-picker
v-model="receiveDialogForm.receiveDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="选择收货日期"
style="width: 100%" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer ship-dialog-footer">
<el-button type="primary" :loading="receiveDialogSaving" @click="submitReceiveDialog">确定</el-button>
<el-button @click="receiveDialogVisible = false">取消</el-button>
</div>
</el-dialog>
<ChooselistEam ref="eamList" @getBaseData="getEamData" /> <ChooselistEam ref="eamList" @getBaseData="getEamData" />
<po-order-advanced-query <po-order-advanced-query
@ -659,6 +692,7 @@ import {
issuePoDetail, issuePoDetail,
shipPoDetailPreview, shipPoDetailPreview,
shipPoDetail, shipPoDetail,
receivePoDetail,
createPoOrder, createPoOrder,
getPoCustomerOptions, getPoCustomerOptions,
getPoBuyerOptions, getPoBuyerOptions,
@ -682,6 +716,7 @@ import {
PO_ORDER_STATUS_OPTIONS, PO_ORDER_STATUS_OPTIONS,
canIssuePoOrder, canIssuePoOrder,
canShipPoOrder, canShipPoOrder,
canReceivePoOrder,
canClosePoOrder, canClosePoOrder,
canOpenPoOrder, canOpenPoOrder,
canEditPoColumnByStatus, canEditPoColumnByStatus,
@ -923,6 +958,17 @@ export default {
flexid: '' flexid: ''
}, },
// ===== 打样单收货确认弹窗状态 =====
receiveDialogVisible: false,
receiveDialogSaving: false,
receiveDialogForm: {
id: null,
site: '',
orderNo: '',
itemNo: null,
receiveDate: ''
},
// ===== 主表编辑与列渲染状态 ===== // ===== 主表编辑与列渲染状态 =====
currentRow: null, currentRow: null,
// 各列下拉:select 列通过 selectOptionsKey 指向此处;也可在列定义里写 selectOptions 数组 - rqrq // 各列下拉:select 列通过 selectOptionsKey 指向此处;也可在列定义里写 selectOptions 数组 - rqrq
@ -2108,6 +2154,7 @@ export default {
methods: { methods: {
canIssuePoOrder, canIssuePoOrder,
canShipPoOrder, canShipPoOrder,
canReceivePoOrder,
canClosePoOrder, canClosePoOrder,
canOpenPoOrder, canOpenPoOrder,
canEditPoColumnByStatus, canEditPoColumnByStatus,
@ -2735,6 +2782,82 @@ export default {
}) })
}, },
/**
* 当天日期字符串(yyyy-MM-dd),收货日期默认值用。
*/
getTodayDateStr () {
const d = new Date()
const month = String(d.getMonth() + 1).padStart(2, '0')
const day = String(d.getDate()).padStart(2, '0')
return d.getFullYear() + '-' + month + '-' + day
},
/**
* 点击收货(仅打样单+已下达):
* 1) 校验行标识后打开收货确认弹窗,收货日期默认当天;
* 2) 确认后由后端同事务回写 c_po_actual_ready_date、PO 转待验货并自动生成已排程验货申请。
*/
handleReceivePoOrder (row) {
const params = buildPoDetailActionParams(row, this.$store.state.user.site)
if (!params.id && !(params.orderNo && params.site && params.itemNo != null)) {
this.$message.error('无法识别订单行,请刷新后重试')
return
}
this.receiveDialogForm = {
id: params.id != null ? params.id : null,
site: params.site,
orderNo: params.orderNo,
itemNo: params.itemNo,
receiveDate: this.getTodayDateStr()
}
this.receiveDialogVisible = true
},
/**
* 关闭收货弹窗时重置状态,避免上次缓存污染下一次操作。
*/
resetReceiveDialog () {
this.receiveDialogSaving = false
this.receiveDialogForm = {
id: null,
site: '',
orderNo: '',
itemNo: null,
receiveDate: ''
}
},
/**
* 提交收货:仅校验收货日期必填;成功后提示并刷新列表(状态已联动为待验货)。
*/
submitReceiveDialog () {
if (!this.receiveDialogForm.receiveDate) {
this.$message.error('请选择收货日期')
return
}
const payload = {
id: this.receiveDialogForm.id != null ? this.receiveDialogForm.id : undefined,
site: this.receiveDialogForm.site,
orderNo: this.receiveDialogForm.orderNo,
itemNo: this.receiveDialogForm.itemNo,
receiveDate: this.receiveDialogForm.receiveDate
}
this.receiveDialogSaving = true
receivePoDetail(payload).then(({ data }) => {
this.receiveDialogSaving = false
if (data && data.code === 0) {
this.$message.success('收货成功,已生成验货申请')
this.receiveDialogVisible = false
this.getDataList()
} else {
this.$message.error((data && data.msg) || '收货失败')
}
}).catch(err => {
this.receiveDialogSaving = false
this.$message.error((err && err.message) || '收货失败')
})
},
handleOpenPoOrder (row) { handleOpenPoOrder (row) {
const params = buildPoDetailActionParams(row, this.$store.state.user.site) const params = buildPoDetailActionParams(row, this.$store.state.user.site)
if (!params.id && !(params.orderNo && params.site && params.itemNo != null)) { if (!params.id && !(params.orderNo && params.site && params.itemNo != null)) {

5
src/views/modules/order/poOrderStatusOptions.js

@ -57,6 +57,11 @@ export function canIssuePoOrder (status) {
return status === '草稿' return status === '草稿'
} }
/** 是否可「收货」:仅打样单(Sample)且状态为已下达(与后端 receivePoDetail 校验一致) */
export function canReceivePoOrder (row) {
return !!row && row.orderType === 'Sample' && row.status === '已下达'
}
/** /**
* 打开时根据验货数量推算恢复状态(与后端 PoDetailStatusSupport 规则一致) * 打开时根据验货数量推算恢复状态(与后端 PoDetailStatusSupport 规则一致)
* 说明: * 说明:

Loading…
Cancel
Save