Commit a80a850e by qinjianhui

Merge branch 'release' into dev

parents 06246c16 56c41fef
...@@ -12,6 +12,7 @@ ...@@ -12,6 +12,7 @@
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.6.7", "axios": "^1.6.7",
"bignumber": "^1.1.0",
"bignumber.js": "^9.3.0", "bignumber.js": "^9.3.0",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"echarts": "^6.0.0", "echarts": "^6.0.0",
...@@ -3171,6 +3172,14 @@ ...@@ -3171,6 +3172,14 @@
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
"license": "MIT" "license": "MIT"
}, },
"node_modules/bignumber": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/bignumber/-/bignumber-1.1.0.tgz",
"integrity": "sha512-EGqHCKkEAwVwufcEOCYhZQqdVH+7cNCyPZ9yxisYvSjHFB+d9YcGMvorsFpeN5IJpC+lC6K+FHhu8+S4MgJazw==",
"engines": {
"node": ">=0.4.0"
}
},
"node_modules/bignumber.js": { "node_modules/bignumber.js": {
"version": "9.3.0", "version": "9.3.0",
"resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.0.tgz", "resolved": "https://registry.npmmirror.com/bignumber.js/-/bignumber.js-9.3.0.tgz",
......
...@@ -14,6 +14,7 @@ ...@@ -14,6 +14,7 @@
"@wangeditor/editor": "^5.1.23", "@wangeditor/editor": "^5.1.23",
"@wangeditor/editor-for-vue": "^5.1.12", "@wangeditor/editor-for-vue": "^5.1.12",
"axios": "^1.6.7", "axios": "^1.6.7",
"bignumber": "^1.1.0",
"bignumber.js": "^9.3.0", "bignumber.js": "^9.3.0",
"dayjs": "^1.11.13", "dayjs": "^1.11.13",
"echarts": "^6.0.0", "echarts": "^6.0.0",
......
...@@ -5,6 +5,8 @@ import { LogisticBill } from '@/types/api/podMakeOrder' ...@@ -5,6 +5,8 @@ import { LogisticBill } from '@/types/api/podMakeOrder'
import { userData } from '@/types/api/user' import { userData } from '@/types/api/user'
import { VersionImageList } from '@/types/api/typesetting' import { VersionImageList } from '@/types/api/typesetting'
import { SupplierItem, WarehouseListData } from '@/types'
import { loactionData } from './warehouse'
// 获取物流公司 // 获取物流公司
export function getLogisticsCompanyList() { export function getLogisticsCompanyList() {
...@@ -49,3 +51,38 @@ export function getLogisticCNApi(content: string) { ...@@ -49,3 +51,38 @@ export function getLogisticCNApi(content: string) {
`factory/podJomallOrder/getOrderByThirdSubOrderNumber?thirdSubOrderNumber=${content}`, `factory/podJomallOrder/getOrderByThirdSubOrderNumber?thirdSubOrderNumber=${content}`,
) )
} }
// 获取仓库列表
export function loadWarehouseListApi() {
return axios.get<never, BaseRespData<WarehouseListData[]>>(
'factoryWarehouseInfo/getAll',
)
}
// 获取用户列表
export function getEmployeeListApi() {
return axios.get<never, BaseRespData<userData[]>>(`/factory/factoryUser/list`)
}
// 获取供应商列表
export function getSupplierListApi() {
return axios.get<never, BaseRespData<SupplierItem[]>>(
`/factory/supplier/list`,
)
}
// 获取币种接口
export function getBaseCurrencyInfoApi() {
return axios.get<never, BaseRespData<never>>(
'factory/supplier/getBaseCurrencyInfo',
)
}
// 获取库位List
export function LocationInfoGetAll(wareHouseId?: string | number) {
return axios.get<never, BaseRespData<loactionData[]>>(
'/factoryWarehouseLocation/getByWareHouse',
{
params: { wareHouseId },
},
)
}
import axios from './axios' import axios from './axios'
import { BasePaginationData, BaseRespData } from '@/types/api' import { BasePaginationData, BaseRespData } from '@/types/api'
import { SearchForm, OutOfStockItem } from '@/types/api/outOfStockStatistics' import { SearchForm, OutOfStockItem } from '@/types/api/supply/outOfStockStatistics'
export function getOutOfStockStatisticsListApi( export function getOutOfStockStatisticsListApi(
data: SearchForm, data: SearchForm,
currentPage: number, currentPage: number,
......
...@@ -5,7 +5,6 @@ import { ...@@ -5,7 +5,6 @@ import {
SearchForm, SearchForm,
Tab, Tab,
LogListData, LogListData,
WarehouseListData,
LogisticsData, LogisticsData,
ExportParams, ExportParams,
IconfirmSubmit, IconfirmSubmit,
...@@ -39,10 +38,6 @@ export function syncReceiverAddress(data: number[]) { ...@@ -39,10 +38,6 @@ export function syncReceiverAddress(data: number[]) {
) )
} }
export function getEmployeeListApi() {
return axios.get(`/factory/factoryUser/list`)
}
// 播种墙配货 扫码放入箱子 // 播种墙配货 扫码放入箱子
export function getPackingCnDataApi( export function getPackingCnDataApi(
code: string, code: string,
...@@ -419,11 +414,7 @@ export function getLogisticsCalculation(id: number) { ...@@ -419,11 +414,7 @@ export function getLogisticsCalculation(id: number) {
{ params: { id } }, { params: { id } },
) )
} }
export function loadWarehouseListApi() {
return axios.get<never, BaseRespData<WarehouseListData[]>>(
'factoryWarehouseInfo/getAll',
)
}
export function refreshMaterialApi(data: { export function refreshMaterialApi(data: {
orderIds?: string orderIds?: string
productIds?: string productIds?: string
......
...@@ -6,7 +6,6 @@ import { ...@@ -6,7 +6,6 @@ import {
Tab, Tab,
LogListData, LogListData,
ProductionClient, ProductionClient,
WarehouseListData,
LogisticsData, LogisticsData,
ExportParams, ExportParams,
InterceptStateGroupData, InterceptStateGroupData,
...@@ -286,10 +285,7 @@ export function clearBoxApi( ...@@ -286,10 +285,7 @@ export function clearBoxApi(
}, },
) )
} }
export function clearAllBoxApi( export function clearAllBoxApi(warehouseId: string | number, factoryNo: string | number | undefined) {
warehouseId: string | number,
factoryNo: string | number | undefined,
) {
return axios.get<never, BaseRespData<never>>( return axios.get<never, BaseRespData<never>>(
'factory/podJomallOrderUs/delPodBoxOrderDetails', 'factory/podJomallOrderUs/delPodBoxOrderDetails',
{ {
...@@ -310,11 +306,6 @@ export function getLogisticsCalculation(id: number) { ...@@ -310,11 +306,6 @@ export function getLogisticsCalculation(id: number) {
{ params: { id } }, { params: { id } },
) )
} }
export function loadWarehouseListApi() {
return axios.get<never, BaseRespData<WarehouseListData[]>>(
'factoryWarehouseInfo/getAll',
)
}
export function refreshMaterialApi(data: { export function refreshMaterialApi(data: {
orderIds?: string orderIds?: string
productIds?: string productIds?: string
...@@ -640,11 +631,6 @@ export function getAccountCodeByFactoryIdApi(params: { token: string }) { ...@@ -640,11 +631,6 @@ export function getAccountCodeByFactoryIdApi(params: { token: string }) {
export function getLogisticsWayApi() { export function getLogisticsWayApi() {
return axios.get(`logisticsWay/usableAllList`) return axios.get(`logisticsWay/usableAllList`)
} }
export function getEmployeeListApi() {
return axios.get(`/factory/factoryUser/list`)
}
// 打印拣货单item // 打印拣货单item
export function printPickPdfByBatchNumberApi(params: { export function printPickPdfByBatchNumberApi(params: {
batchArrangeNumber: string batchArrangeNumber: string
......
import axios from '../axios'
import { BasePaginationData, BaseRespData } from '@/types/api'
import {
SearchForm,
TableData,
TreeData,
AddStockingOrderForm,
StockingOrderProduct,
InternalMemoList,
RelatedDocumentList,
LogListData,
} from '@/types/api/supply/stockingOrder'
export function getStockingOrderListApi(
data: SearchForm,
currentPage: number,
pageSize: number,
) {
return axios.post<never, BasePaginationData<TableData>>(
'factory/supply/stockingUpManage/list_page',
{ ...data, currentPage, pageSize },
)
}
export function getStockingOrderStatusTreeApi() {
return axios.get<never, BaseRespData<TreeData[]>>(
'factory/supply/stockingUpManage/getStatusTree',
)
}
// 新增备货单
export function addStockingOrderApi(url: string, data: AddStockingOrderForm) {
return axios.post<never, BaseRespData<never>>(url, data)
}
// 根据父SKU查询商品信息
export function getProductBySkuApi(spu: string, supplierId: number) {
return axios.get<never, BaseRespData<StockingOrderProduct[]>>(
'factory/supply/stockingUpManage/getCustomProductItem',
{
params: { productItemSku: spu, supplierId },
},
)
}
export function getStockingOrderDetailByIdApi(id: number) {
return axios.get<never, BaseRespData<AddStockingOrderForm>>(
`factory/supply/stockingUpManage/get?id=${id}`,
)
}
export function getStockingOrderDetailListByIdApi(id: number) {
return axios.get<never, BaseRespData<StockingOrderProduct[]>>(
`factory/supply/stockingUpManage/getManageDetailsList?id=${id}`,
)
}
export function getStockingOrderRelatedDocumentListByIdApi(id: number) {
return axios.get<never, BaseRespData<RelatedDocumentList[]>>(
`factory/supply/stockingUpManage/getWarehouseApplyList?id=${id}`,
)
}
export function getStockingOrderInternalMemoListByIdApi(id: number) {
return axios.get<never, BaseRespData<InternalMemoList[]>>(
`factory/supply/stockingUpManage/getInternalMemoList?id=${id}`,
)
}
export function getStockingOrderLogListByIdApi(id: number) {
return axios.get<never, BaseRespData<LogListData[]>>(
`factory/supply/stockingUpManageLog/getStockingUpManageLog?manageId=${id}`,
)
}
export function submitStockingOrderAuditApi(ids: string) {
return axios.get<never, BaseRespData<void>>(
'factory/supply/stockingUpManage/submission',
{
params: { ids },
},
)
}
export function rejectedStockingOrderApi(params: {
id: number | string
turnDownReason: string
}) {
return axios.get<never, BaseRespData<void>>(
'factory/supply/stockingUpManage/rejected',
{
params,
},
)
}
export function supplierDispatchApi(data: {
manageId: number | string
manageNo: string
warehouseId: number | string
warehouseName: string
expectDeliveryTime: string
currencyCode: string
detailsList: StockingOrderProduct[]
}) {
return axios.post<never, BaseRespData<void>>(
'factory/supply/stockingUpWarehouseApply/add',
data,
)
}
export function stockingCompleteApi(id: number) {
return axios.get<never, BaseRespData<void>>(
`factory/supply/stockingUpManage/delivery?id=${id}`,
)
}
export function deleteStockingOrderApi(id: string | number) {
return axios.get<never, BaseRespData<void>>(
`factory/supply/stockingUpManage/delete`,
{
params: { id },
},
)
}
export function cancelStockingOrderApi(
id: string | number,
cancelReason: string,
) {
return axios.get<never, BaseRespData<void>>(
`factory/supply/stockingUpManage/cancel`,
{
params: { id, cancelReason },
},
)
}
export function addStockingOrderInternalTagApi(memo: string, idList: number[]) {
return axios.post<never, BaseRespData<void>>(
`factory/supply/stockingUpManage/batchAddInternalMemo`,
{
content: memo,
idList,
},
)
}
...@@ -45,12 +45,7 @@ export function getProductInfoBySpuApi(spu: string | number) { ...@@ -45,12 +45,7 @@ export function getProductInfoBySpuApi(spu: string | number) {
}, },
) )
} }
// 获取币种接口
export function getBaseCurrencyInfoApi() {
return axios.get<never, BaseRespData<never>>(
'factory/supplier/getBaseCurrencyInfo',
)
}
//新增 //新增
export function addSupplierApi(params: IsupplierType) { export function addSupplierApi(params: IsupplierType) {
return axios.post<never, BaseRespData<never>>('/factory/supplier/add', params) return axios.post<never, BaseRespData<never>>('/factory/supplier/add', params)
......
...@@ -284,14 +284,6 @@ export function warehouseInfoGetAll() { ...@@ -284,14 +284,6 @@ export function warehouseInfoGetAll() {
'/factoryWarehouseInfo/getAll', '/factoryWarehouseInfo/getAll',
) )
} }
export function LocationInfoGetAll(wareHouseId?: string | number) {
return axios.get<never, BaseRespData<loactionData[]>>(
'/factoryWarehouseLocation/getByWareHouse',
{
params: { wareHouseId },
},
)
}
export function createWarehouseInventoryApi(data: WarehouseWarningData) { export function createWarehouseInventoryApi(data: WarehouseWarningData) {
return axios.post<never, BaseRespData<never>>( return axios.post<never, BaseRespData<never>>(
...@@ -447,6 +439,21 @@ export function getBySkuApi( ...@@ -447,6 +439,21 @@ export function getBySkuApi(
}, },
) )
} }
export function getBySkuAndUserMarkApi(
warehouseId: number | string | undefined,
sku: string | null,
userMark: string | null | undefined,
) {
return axios.post<never, BaseRespData<InterskuList[]>>(
'factory/warehouseInRecord/getProductBySku',
{
warehouseId,
userMark,
sku,
},
)
}
export function getByWareHouseIdAndCodeApi( export function getByWareHouseIdAndCodeApi(
wareHouseId: number | string | undefined, wareHouseId: number | string | undefined,
code: string | null, code: string | null,
...@@ -710,6 +717,14 @@ export function scanBoxCodeApi(boxCode: string) { ...@@ -710,6 +717,14 @@ export function scanBoxCodeApi(boxCode: string) {
}, },
) )
} }
// 备货计划 盘点
export function getLocalFactoryList() {
return axios.get<never, BaseRespData<never>>(
'dbDiyUser/getLocalFactoryList',
)
}
// 备货计划 打印箱贴 // 备货计划 打印箱贴
export function printBarcodeApi(data: { id: number, dataVersion: number }[]) { export function printBarcodeApi(data: { id: number, dataVersion: number }[]) {
return axios.post<never, BaseRespData<never[]>>( return axios.post<never, BaseRespData<never[]>>(
......
import axios from '@/api/axios'
import { BasePaginationData, BaseRespData } from '@/types/api'
import { LogListData } from '@/types/api/supply/stockingOrder'
import {
SearchForm,
TableData,
TreeData,
StockingApplyOrderDetailList,
RelatedDocumentList,
StockingApplyOrderDetailData,
LocationDataBySkuData,
} from '@/types/api/warehouse/stockingApplyOrder'
export function getStockingApplyOrderListApi(
data: SearchForm,
currentPage: number,
pageSize: number,
) {
return axios.post<never, BasePaginationData<TableData>>(
'factory/supply/stockingUpWarehouseApply/list_page',
{ ...data, currentPage, pageSize },
)
}
export function getStockingApplyOrderTreeApi() {
return axios.get<never, BaseRespData<TreeData[]>>(
'factory/supply/stockingUpWarehouseApply/getStatusTree',
)
}
export function getStockingApplyOrderDetailListByIdApi(id: number) {
return axios.get<never, BaseRespData<StockingApplyOrderDetailList[]>>(
`factory/supply/stockingUpWarehouseApply/getWarehouseApplyList?id=${id}`,
)
}
export function getStockingApplyOrderRelatedDocumentListByIdApi(
warehouseApplyNo: string,
) {
return axios.get<never, BaseRespData<RelatedDocumentList[]>>(
`factory/supply/stockingUpWarehouseApply/getWarehouseInList?warehouseApplyNo=${warehouseApplyNo}`,
)
}
export function getStockingApplyOrderLogListByIdApi(id: number) {
return axios.get<never, BaseRespData<LogListData[]>>(
`factory/supply/stockingUpWarehouseApplyLog/getWarehouseApplyLog?warehouseApplyId=${id}`,
)
}
export function warehouseReceiptApi(id: number) {
return axios.get<never, BaseRespData<void>>(
`factory/supply/stockingUpWarehouseApply/receiving?id=${id}`,
)
}
export function submitWarehousingApi(data: StockingApplyOrderDetailData) {
return axios.post<never, BaseRespData<void>>(
'factory/supply/stockingUpWarehouseApply/submitInventory',
data,
)
}
export function getStockingApplyOrderDetailById(id: number) {
return axios.get<never, BaseRespData<StockingApplyOrderDetailData>>(
`factory/supply/stockingUpWarehouseApply/get?id=${id}`,
)
}
export function getLocationListApi(sku: string, warehouseId: string | number) {
return axios.post<never, BaseRespData<LocationDataBySkuData[]>>(
'factoryWarehouseInventory/getBySkuAndWarehouseId',
{
sku,
warehouseId,
},
)
}
...@@ -3,6 +3,7 @@ ...@@ -3,6 +3,7 @@
<ElTable <ElTable
ref="tableRef" ref="tableRef"
:data="paginatedData" :data="paginatedData"
:show-overflow-tooltip="showOverflowTooltip"
border border
:stripe="stripe" :stripe="stripe"
header-align="center" header-align="center"
...@@ -114,6 +115,10 @@ const props = defineProps({ ...@@ -114,6 +115,10 @@ const props = defineProps({
type: Boolean, type: Boolean,
default: false, default: false,
}, },
showOverflowTooltip: {
type: Boolean,
default: true,
},
}) })
const attrs = useAttrs() const attrs = useAttrs()
......
...@@ -167,7 +167,14 @@ const router = createRouter({ ...@@ -167,7 +167,14 @@ const router = createRouter({
meta: { meta: {
title: '缺货统计', title: '缺货统计',
}, },
component: () => import('@/views/supply/OutOfStockStatistics.vue') component: () => import('@/views/supply/OutOfStockStatistics.vue'),
},
{
path: '/supply/stocking-order',
meta: {
title: '备货订单',
},
component: () => import('@/views/supply/stockingOrder/index.vue'),
}, },
{ {
path: '/system/delivery-note', path: '/system/delivery-note',
...@@ -296,6 +303,14 @@ const router = createRouter({ ...@@ -296,6 +303,14 @@ const router = createRouter({
component: stockingPlan, component: stockingPlan,
}, },
{ {
path: '/warehouse/stocking-application',
meta: {
title: '入库申请单',
},
component: () =>
import('@/views/warehouse/stockingApplicationOrder/index.vue'),
},
{
path: '/warehouse/warning', path: '/warehouse/warning',
meta: { meta: {
title: '仓库预警', title: '仓库预警',
......
...@@ -11,11 +11,6 @@ const menu: MenuItem[] = [ ...@@ -11,11 +11,6 @@ const menu: MenuItem[] = [
id: 1, id: 1,
label: '概览', label: '概览',
}, },
// {
// index: '/product',
// id: 11,
// label: '商品',
// },
{ {
index: '4', index: '4',
id: 7, id: 7,
...@@ -74,6 +69,11 @@ const menu: MenuItem[] = [ ...@@ -74,6 +69,11 @@ const menu: MenuItem[] = [
label: '库存', label: '库存',
children: [ children: [
{ {
index: '/warehouse/stocking-application',
id: 126,
label: '入库申请单',
},
{
index: '/warehouse/warning', index: '/warehouse/warning',
id: 125, id: 125,
label: '仓库预警', label: '仓库预警',
...@@ -159,8 +159,13 @@ const menu: MenuItem[] = [ ...@@ -159,8 +159,13 @@ const menu: MenuItem[] = [
id: 1, id: 1,
}, },
{ {
index: '/supply/supplierManagement', label: '备货订单',
index: '/supply/stocking-order',
id: 2, id: 2,
},
{
index: '/supply/supplierManagement',
id: 3,
label: '供应商管理', label: '供应商管理',
}, },
], ],
...@@ -238,17 +243,5 @@ const menu: MenuItem[] = [ ...@@ -238,17 +243,5 @@ const menu: MenuItem[] = [
}, },
], ],
}, },
// {
// index: '',
// id: 3,
// label: '生产管理',
// children: [
// {
// index: '/production/complete',
// id: 4,
// label: '生产完成',
// }
// ]
// },
] ]
export default menu export default menu
...@@ -116,4 +116,4 @@ img { ...@@ -116,4 +116,4 @@ img {
} }
.mb-10 { .mb-10 {
margin-bottom: 10px; margin-bottom: 10px;
} }
\ No newline at end of file
...@@ -32,6 +32,15 @@ ...@@ -32,6 +32,15 @@
color: #409eff !important; color: #409eff !important;
} }
} }
.el-form-item {
margin-right: 10px !important;
}
:root { :root {
--el-menu-icon-width: 0px; --el-menu-icon-width: 0px;
} }
.el-loading-mask.is-fullscreen {
z-index: 5000 !important;
}
.el-loading-mask {
z-index: 1020 !important;
}
\ No newline at end of file
...@@ -194,16 +194,7 @@ export interface PodOrderRes extends ProductList { ...@@ -194,16 +194,7 @@ export interface PodOrderRes extends ProductList {
note?: Array<{ prop: string | number; value: string | number }> note?: Array<{ prop: string | number; value: string | number }>
imgList: cardImages[] imgList: cardImages[]
} }
export interface WarehouseListData {
code?: string
defaulted?: number
factoryCode?: string
factoryId?: number
id: number
name?: string
remarks?: string
sort?: number
}
export interface LogisticsData { export interface LogisticsData {
logisticsWayName: string // 物流名称 logisticsWayName: string // 物流名称
warehouseName: string // 发货仓库 warehouseName: string // 发货仓库
......
export interface TreeData {
name: string
code: string
children?: TreeData[]
countQuantity?: number
id?: number
}
export interface SearchForm {
currentPage: number
endDate?: string
pageSize: number
shippingStatusList?: string[]
startDate?: string
status?: string
stockingUpManageNo?: string
stockingUpUserId?: string[]
supplierId?: string[]
warehouseId?: string | number[]
warehouseSku?: string | number[]
warehouseSkuName?: string
remark?: string
}
export interface TableData {
id: number
factoryId?: number
factoryCode?: string
stockingUpManageNo?: string
currencyCode?: string
skuTotal?: number
total?: number
totalPrice?: number
buyStored?: number
storedPrice?: number
buyUnstored?: number
unstoragePrice?: number
shipmentQuantity?: number
rejectsAmount?: number
shipmentFreight?: number
expectDeliveryTime?: string
status?: string
supplierId?: number
supplierName?: string
warehouseId?: number
warehouseName?: string
stockingUpUserId?: number
stockingUpUserName?: string
createUserId?: number
createUserName?: string
createTime?: string
updateTime?: string
remark?: string
dataVersion?: number
shippingStatus?: number
delayDays?: number
lastDeliveryTime?: string
completeTime?: string
auditName?: string
auditTime?: string
}
export interface StockProduct {
skuImage?: string
productName?: string
styleNumber?: string
warehouseSku?: string
stockQuantity?: number
stockUnitPrice?: number
stockAmount?: number
unshippedQuantity?: number
shippedQuantity?: number
inWarehouseQuantity?: number
defectiveQuantity?: number
}
export interface AddStockingOrderForm {
id?: number | string
stockingUpManageNo?: string
supplierId?: number
supplierName?: string
stockingUpUserId?: number
stockingUpUserName?: string
warehouseId?: number
warehouseName?: string
expectDeliveryTime?: string
totalPrice?: string
currencyCode?: string
currencyName?: string
remark?: string
status?: number
submission?: boolean
detailsList?: StockingOrderProduct[]
examineStatus?: number // 审核状态:1通过,0驳回
rejectReason?: string // 驳回原因
}
export interface StockingOrderProduct {
productNo?: string
warehouseSkuId?: number
warehouseSku?: string
warehouseSkuName?: string
warehouseSkuImage?: string
buyAmount?: number | string
price?: number | string
currencyCode?: string
currencyName?: string
totalPrice?: number | string
shipmentQuantity?: number | string
buyStored?: number
// 供应商发货相关字段
remainingQuantity?: number // 剩余待发货数量
currentShipQuantity?: number | string // 本次发货数量
}
export interface RelatedDocumentList {
id: number
factoryId?: number
factoryCode?: string
manageId?: number
manageNo?: string
warehouseApplyNo?: string
warehouseId?: number
warehouseName?: string
skuTotal?: number
total?: number
buyStored?: number
rejectsAmount?: number
storeStatus?: string
expectDeliveryTime?: string
createUserId?: number
createUserName?: string
createTime?: string
updateTime?: string
dataVersion?: number
}
export interface InternalMemoList {
id: number
outId?: number
operatorEmployeeName?: string
operatorTime?: string
content?: string
remark?: string
type?: number
}
export interface LogListData {
id: number
manageId?: number
userId?: number
userName?: string
description?: string
updateTime?: string
}
...@@ -61,6 +61,8 @@ export interface InterWarehouseBase { ...@@ -61,6 +61,8 @@ export interface InterWarehouseBase {
export interface InterWarehousePage extends InterWarehouseBase { } export interface InterWarehousePage extends InterWarehouseBase { }
// 子表列表ts // 子表列表ts
export interface InterWarehouseDetail extends InterWarehouseBase { export interface InterWarehouseDetail extends InterWarehouseBase {
currencyName?:string
currencyCode?:string
productList: InterProductList[] productList: InterProductList[]
} }
export interface ExportInWarehouseInfo extends warehouseSearchForm { export interface ExportInWarehouseInfo extends warehouseSearchForm {
...@@ -88,7 +90,7 @@ export interface InterProductList { ...@@ -88,7 +90,7 @@ export interface InterProductList {
remark?: string | null remark?: string | null
skuImage?: string skuImage?: string
skuName?: string skuName?: string
costPrice?: number | null costPrice?: number | null | undefined
totalPrice?: number | null totalPrice?: number | null
updateTime?: string updateTime?: string
warehouseSku?: string warehouseSku?: string
...@@ -102,7 +104,13 @@ export interface InterskuList { ...@@ -102,7 +104,13 @@ export interface InterskuList {
id?: number id?: number
productId?: number productId?: number
sku?: string sku?: string
userMark?: string
customerId?: string
customerName?: string
skuName?: string skuName?: string
productName?: string
skuImage?: string
costPrice?: undefined | null | number
image?: string image?: string
factoryPrice?: number | null factoryPrice?: number | null
productNo?: string | null //货号 productNo?: string | null //货号
......
export interface SearchForm {
warehouseApplyNo?: string
manageNo?: string
warehouseId?: string | number[]
warehouseSku?: string | number[]
warehouseSkuName?: string
currentPage: number
pageSize: number
storeStatus?: string
}
export interface TreeData {
id?: number
code?: string
name?: string
countQuantity?: number
children?: TreeData[]
leaf?: boolean
}
export interface TableData {
id: number
factoryId?: number
factoryCode?: string
manageId?: number
manageNo?: string
warehouseApplyNo: string
warehouseId?: number
warehouseName?: string
skuTotal?: number
total?: number
buyStored?: number
rejectsAmount?: number
storeStatus: string
expectDeliveryTime?: string
createUserId?: number
createUserName?: string
createTime?: string
updateTime?: string
dataVersion?: number
}
export interface StockingApplyOrderDetailList {
id: number
manageId?: number
warehouseApplyId?: number
warehouseApplyNo?: string
warehouseSku?: string
productNo?: string
warehouseSkuName?: string
warehouseSkuImage?: string
shipmentQuantity?: number
buyStored?: number | string
rejectsAmount?: number | string
price?: number
createTime?: string
updateTime?: string
locationId?: number
locationCode?: string | undefined
finallyShipmentQuantity?: number
storedPending?: number
}
export interface RelatedDocumentList {
id: number
dataVersion?: number
createTime?: string
updateTime?: string
factoryId?: number
factoryCode?: string
warehouseId?: number
warehouseName?: string
inNo?: string
skuAmount?: number
total?: number
totalPrice?: number
billStatus?: string
billStatusTxt?: string
makerName?: string
makerUserId?: number
makeTime?: string
checkerUserId?: number
checkerName?: string
source?: string
sourceOn?: string
}
export interface StockingApplyOrderDetailData {
id: number
warehouseApplyNo?: string
warehouseName?: string
warehouseId?: number
checkerUserId?: number
remark?: string
checkerName?: string
detailsList: StockingApplyOrderDetailList[]
}
export interface LocationDataBySkuData {
id: number
factoryId?: number
warehouseId?: number
warehouseName?: string
locationId?: number
locationCode?: string
warehouseSku?: string
customSku?: string
skuName?: string
createTime?: string
updateTime?: string
productItem?: unknown
usableInventory?: number
image?: string
price?: number
currencyCode?: string
currencyName?: string
sumOccupyInventory?: number
}
// 放系统中公共类型
export interface WarehouseListData {
code?: string
defaulted?: number
factoryCode?: string
factoryId?: number
id: number
name?: string
remarks?: string
sort?: number
}
export interface SupplierItem {
id: number
supplierName?: string
contacts?: string
contactsNumber?: string
address?: string
remark?: string
factoryId?: number
updateTime?: string
createTime?: string
supplierProductInfoList?: []
}
export interface CurrencyCodeData {
currencyName?: string
currencyCode?: string
id?: string
}
...@@ -86,10 +86,10 @@ import { ...@@ -86,10 +86,10 @@ import {
getTiktokCarrier, getTiktokCarrier,
} from '@/api/logistics' } from '@/api/logistics'
import type { FormItemRule } from 'element-plus' import type { FormItemRule } from 'element-plus'
import { WarehouseListData } from '@/types/api/podUsOrder' import { WarehouseListData } from '@/types'
import { ISeachFormConfig } from '@/types/searchType' import { ISeachFormConfig } from '@/types/searchType'
import { TableColumn } from '@/components/VxeTable' import { TableColumn } from '@/components/VxeTable'
import { loadWarehouseListApi } from '@/api/podUsOrder' import { loadWarehouseListApi } from '@/api/common'
import type { import type {
LogisticsMethod, LogisticsMethod,
platformObj, platformObj,
......
...@@ -935,6 +935,7 @@ onMounted(() => { ...@@ -935,6 +935,7 @@ onMounted(() => {
<el-radio-button value="single">单面</el-radio-button> <el-radio-button value="single">单面</el-radio-button>
<el-radio-button value="multiple">多面</el-radio-button> <el-radio-button value="multiple">多面</el-radio-button>
<el-radio-button value="normal">普品</el-radio-button> <el-radio-button value="normal">普品</el-radio-button>
<el-radio-button value="custom_normal">胚衣</el-radio-button>
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem label="数量"> <ElFormItem label="数量">
......
...@@ -974,6 +974,7 @@ onMounted(() => { ...@@ -974,6 +974,7 @@ onMounted(() => {
<el-radio-button value="single">单面</el-radio-button> <el-radio-button value="single">单面</el-radio-button>
<el-radio-button value="multiple">多面</el-radio-button> <el-radio-button value="multiple">多面</el-radio-button>
<el-radio-button value="normal">普品</el-radio-button> <el-radio-button value="normal">普品</el-radio-button>
<el-radio-button value="custom_normal">胚衣</el-radio-button>
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem label="数量"> <ElFormItem label="数量">
......
...@@ -282,7 +282,7 @@ import { ...@@ -282,7 +282,7 @@ import {
} from '@/api/podCnOrder' } from '@/api/podCnOrder'
const { getCLodop } = useLodop() const { getCLodop } = useLodop()
import useOrderStore from '@/store/cnOrder' import useOrderStore from '@/store/cnOrder'
import { WarehouseListData } from '@/types/api/podUsOrder' import { WarehouseListData } from '@/types/index'
const orderStore = useOrderStore() const orderStore = useOrderStore()
const boxList = computed(() => orderStore.podBoxList) const boxList = computed(() => orderStore.podBoxList)
const podOrderDetailsColumns = computed(() => [ const podOrderDetailsColumns = computed(() => [
......
...@@ -279,7 +279,7 @@ import { ...@@ -279,7 +279,7 @@ import {
import useUserStore from '@/store/user' import useUserStore from '@/store/user'
import { Check, Refresh } from '@element-plus/icons-vue' import { Check, Refresh } from '@element-plus/icons-vue'
import socket from '@/utils/cnWebsocket' import socket from '@/utils/cnWebsocket'
import { WarehouseListData } from '@/types/api/podUsOrder' import { WarehouseListData } from '@/types/index'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import { filePath } from '@/api/axios.ts' import { filePath } from '@/api/axios.ts'
...@@ -554,7 +554,7 @@ const renderItemBox = (bool: boolean) => { ...@@ -554,7 +554,7 @@ const renderItemBox = (bool: boolean) => {
parts.length > 3 && parts[3].startsWith('CNPSC') parts.length > 3 && parts[3].startsWith('CNPSC')
? parts[3] ? parts[3]
: parts.length > 1 : parts.length > 1
? parts[1] ? currentCode
: parts[0] : parts[0]
} }
......
...@@ -237,6 +237,7 @@ ...@@ -237,6 +237,7 @@
<el-radio-button label="single">单面</el-radio-button> <el-radio-button label="single">单面</el-radio-button>
<el-radio-button label="multiple">多面</el-radio-button> <el-radio-button label="multiple">多面</el-radio-button>
<el-radio-button label="normal">普品</el-radio-button> <el-radio-button label="normal">普品</el-radio-button>
<el-radio-button value="custom_normal">胚衣</el-radio-button>
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="数量"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="数量">
...@@ -1162,6 +1163,7 @@ ...@@ -1162,6 +1163,7 @@
:cell-style="onCellStyle" :cell-style="onCellStyle"
:row-style="getRowStyle" :row-style="getRowStyle"
:row-class-name="getRowClassName" :row-class-name="getRowClassName"
:show-overflow-tooltip="false"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<template #serialNumber="{ row, index }"> <template #serialNumber="{ row, index }">
...@@ -1514,11 +1516,8 @@ ...@@ -1514,11 +1516,8 @@
<span class="goods-item-info-item-label" <span class="goods-item-info-item-label"
>申报重量(g):</span >申报重量(g):</span
> >
<span <span :title="item.customsWeight" class="goods-item-info-item-value">
:title="item.customsWeight" {{ item.customsWeight }}
class="goods-item-info-item-value"
>
{{ item.customsWeight }}
</span> </span>
</div> </div>
<div class="goods-item-info-item"> <div class="goods-item-info-item">
...@@ -2918,7 +2917,6 @@ import { ...@@ -2918,7 +2917,6 @@ import {
printPrintOrderApi, printPrintOrderApi,
stockOutCheckApi, stockOutCheckApi,
toBePickingApi, toBePickingApi,
loadWarehouseListApi,
getLogisticsCalculation, getLogisticsCalculation,
refreshProductInformationApi, refreshProductInformationApi,
composingDesignImages, composingDesignImages,
...@@ -2956,10 +2954,11 @@ import { ...@@ -2956,10 +2954,11 @@ import {
printNormalPdf, printNormalPdf,
printNormalProducePdf, printNormalProducePdf,
changeLogisticsApi, changeLogisticsApi,
getEmployeeListApi,
allErpCodeListApi, allErpCodeListApi,
updateProductOutOfStockApi, updateProductOutOfStockApi,
} from '@/api/podCnOrder' } from '@/api/podCnOrder'
import { loadWarehouseListApi, getEmployeeListApi } from '@/api/common'
// import { logisticsCompanyAllCodelist } from '@/api/logistics.ts' // import { logisticsCompanyAllCodelist } from '@/api/logistics.ts'
import { BaseRespData } from '@/types/api' import { BaseRespData } from '@/types/api'
...@@ -2978,7 +2977,6 @@ import { ...@@ -2978,7 +2977,6 @@ import {
ProductionClient, ProductionClient,
SearchForm, SearchForm,
Tab, Tab,
WarehouseListData,
cardImages, cardImages,
AddressInfo, AddressInfo,
LogisticsData, LogisticsData,
...@@ -2986,6 +2984,7 @@ import { ...@@ -2986,6 +2984,7 @@ import {
CraftListData, CraftListData,
ExportParams, ExportParams,
} from '@/types/api/podCnOrder' } from '@/types/api/podCnOrder'
import { WarehouseListData } from '@/types'
import usePageList from '@/utils/hooks/usePageList' import usePageList from '@/utils/hooks/usePageList'
import { useValue } from '@/utils/hooks/useValue' import { useValue } from '@/utils/hooks/useValue'
import { showConfirm } from '@/utils/ui' import { showConfirm } from '@/utils/ui'
...@@ -3012,6 +3011,7 @@ import { ...@@ -3012,6 +3011,7 @@ import {
type RouteLocationNormalized, type RouteLocationNormalized,
} from 'vue-router' } from 'vue-router'
import UpdateCustomDeclarationInfoDialog from './components/UpdateCustomDeclarationInfoDialog.vue' import UpdateCustomDeclarationInfoDialog from './components/UpdateCustomDeclarationInfoDialog.vue'
import { userData } from '@/types/api/user.ts'
declare global { declare global {
interface Window { interface Window {
...@@ -3087,7 +3087,7 @@ const sourceList = [ ...@@ -3087,7 +3087,7 @@ const sourceList = [
}, },
] ]
const sizes = ['FS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', '3XL', '4XL', '5XL'] const sizes = ['FS', 'XS', 'S', 'M', 'L', 'XL', 'XXL', '3XL', '4XL', '5XL']
const employeeList = ref<{ account: string; id: number }[]>([]) const employeeList = ref<userData[]>([])
const exportData = () => { const exportData = () => {
exportVisible.value = true exportVisible.value = true
...@@ -3626,38 +3626,40 @@ const interceptChange = async (status: boolean) => { ...@@ -3626,38 +3626,40 @@ const interceptChange = async (status: boolean) => {
} }
} }
const rejectOrder = async (type: string) => { const rejectOrder = async (type: string) => {
if (selection.value.length === 0 && cardSelection.value.length === 0) { const targets = selection.value.length
return ElMessage.warning('请选择数据') ? selection.value.flatMap((v: PodCnOrderListData) => v.productList || [])
} : cardSelection.value
// const loading = ElLoading.service({
// fullscreen: true,
// text: '操作中...',
// background: 'rgba(0, 0, 0, 0.3)',
// })
if (!targets.length) return ElMessage.warning('请选择数据')
let reason = ''
try { try {
const { value } = await ElMessageBox.prompt('驳回确认', { const { value } = await ElMessageBox.prompt<string>('驳回确认', {
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
inputType: 'textarea', inputType: 'textarea',
inputPlaceholder: '驳回原因', inputPlaceholder: '驳回原因',
inputPattern: /\S+/, // 非空验证,至少一个非空白字符 inputPattern: /\S+/,
inputErrorMessage: '内容不能为空', inputErrorMessage: '内容不能为空',
}) })
reason = value.trim()
} catch {
return
}
// const loading = ElLoading.service({
// fullscreen: true,
// text: '操作中...',
// background: 'rgba(0, 0, 0, 0.3)',
// })
try {
const res = await rejectToApi({ const res = await rejectToApi({
orderStatus: type, orderStatus: type,
productList: selection.value.length productList: targets,
? selection.value.flatMap( reasonStr: reason,
(item: PodCnOrderListData) => item.productList || [],
)
: cardSelection.value,
reasonStr: value,
}) })
if (res.code !== 200) return
resultInfo.value = res.data if (res.code !== 200) return
resultInfo.value = resultInfo.value.filter((item) => !item.status) resultInfo.value = (res.data || []).filter((item) => !item.status)
if (!resultInfo.value.length) { if (!resultInfo.value.length) {
ElMessage.success('操作成功') ElMessage.success('操作成功')
search() search()
...@@ -6237,7 +6239,7 @@ const onUpdateCustomsDeclarationInfo = () => { ...@@ -6237,7 +6239,7 @@ const onUpdateCustomsDeclarationInfo = () => {
.goods-item { .goods-item {
display: grid; display: grid;
// grid-template-columns: 100px 1fr minmax(150px, 1fr) 150px; // grid-template-columns: 100px 1fr minmax(150px, 1fr) 150px;
grid-template-columns: 100px 254px 1fr minmax(150px, 1fr) 150px 200px; grid-template-columns: 100px 254px 1fr minmax(150px, 1fr) 220px 200px;
gap: 15px; gap: 15px;
.goods-item-img { .goods-item-img {
......
...@@ -267,7 +267,7 @@ import { ...@@ -267,7 +267,7 @@ import {
import useUserStore from '@/store/user' import useUserStore from '@/store/user'
import { Check, Refresh } from '@element-plus/icons-vue' import { Check, Refresh } from '@element-plus/icons-vue'
import socket from '@/utils/websocket' import socket from '@/utils/websocket'
import { WarehouseListData } from '@/types/api/podUsOrder' import { WarehouseListData } from '@/types/index'
import { filePath } from '@/api/axios.ts' import { filePath } from '@/api/axios.ts'
import { ElButton, ElIcon } from 'element-plus' import { ElButton, ElIcon } from 'element-plus'
......
...@@ -227,6 +227,7 @@ ...@@ -227,6 +227,7 @@
<el-radio-button label="single">单面</el-radio-button> <el-radio-button label="single">单面</el-radio-button>
<el-radio-button label="multiple">多面</el-radio-button> <el-radio-button label="multiple">多面</el-radio-button>
<el-radio-button label="normal">普品</el-radio-button> <el-radio-button label="normal">普品</el-radio-button>
<el-radio-button value="custom_normal">胚衣</el-radio-button>
</el-radio-group> </el-radio-group>
</ElFormItem> </ElFormItem>
<ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="数量"> <ElFormItem v-if="status !== 'BATCH_DOWNLOAD'" label="数量">
...@@ -1211,6 +1212,7 @@ ...@@ -1211,6 +1212,7 @@
:cell-class-name="onCellClassName" :cell-class-name="onCellClassName"
:row-style="getRowStyle" :row-style="getRowStyle"
:row-class-name="getRowClassName" :row-class-name="getRowClassName"
:show-overflow-tooltip="false"
@selection-change="handleSelectionChange" @selection-change="handleSelectionChange"
> >
<template #serialNumber="{ row, index }"> <template #serialNumber="{ row, index }">
...@@ -3161,7 +3163,7 @@ ...@@ -3161,7 +3163,7 @@
</template> </template>
<script setup lang="tsx"> <script setup lang="tsx">
import LogisticsWaySelect from '../../logistics/components/LogisticsWaySelect.tsx' import LogisticsWaySelect from '../../logistics/components/LogisticsWaySelect.tsx'
import { getUserMarkList } from '@/api/common' import { getUserMarkList, loadWarehouseListApi } from '@/api/common'
// import { AnyObject } from '@/types/api/warehouse' // import { AnyObject } from '@/types/api/warehouse'
import uploadBox from '@/components/uploadBox.vue' import uploadBox from '@/components/uploadBox.vue'
import { convertToChinaTime } from '@/utils/index' import { convertToChinaTime } from '@/utils/index'
...@@ -3194,7 +3196,6 @@ import { ...@@ -3194,7 +3196,6 @@ import {
printPrintOrderApi, printPrintOrderApi,
stockOutCheckApi, stockOutCheckApi,
toBePickingApi, toBePickingApi,
loadWarehouseListApi,
getLogisticsCalculation, getLogisticsCalculation,
refreshMaterialApi, refreshMaterialApi,
getTrackingNumberApi, getTrackingNumberApi,
...@@ -3240,7 +3241,6 @@ import { ...@@ -3240,7 +3241,6 @@ import {
getLogisticsWayApi, getLogisticsWayApi,
printNormalPickPdfApi, printNormalPickPdfApi,
updatePRNDownloadStatus, updatePRNDownloadStatus,
getEmployeeListApi,
updateProductOutOfStockApi, updateProductOutOfStockApi,
} from '@/api/podUsOrder' } from '@/api/podUsOrder'
import { BaseRespData } from '@/types/api' import { BaseRespData } from '@/types/api'
...@@ -3248,7 +3248,7 @@ import { BaseRespData } from '@/types/api' ...@@ -3248,7 +3248,7 @@ import { BaseRespData } from '@/types/api'
import UpdateAddress from './components/updateAddress.vue' import UpdateAddress from './components/updateAddress.vue'
import { getAllCountryApi } from '@/api/logistics.ts' import { getAllCountryApi } from '@/api/logistics.ts'
import { getEmployeeListApi } from '@/api/common'
import TableView from '@/components/TableView.vue' import TableView from '@/components/TableView.vue'
import { import {
LogListData, LogListData,
...@@ -3257,7 +3257,6 @@ import { ...@@ -3257,7 +3257,6 @@ import {
ProductionClient, ProductionClient,
SearchForm, SearchForm,
Tab, Tab,
WarehouseListData,
cardImages, cardImages,
AddressInfo, AddressInfo,
LogisticsData, LogisticsData,
...@@ -3293,6 +3292,7 @@ import platformJson from '../../../json/platform.json' ...@@ -3293,6 +3292,7 @@ import platformJson from '../../../json/platform.json'
import { getToken } from '@/api/axios' import { getToken } from '@/api/axios'
import usePermissionBtnStore from '@/store/permission' import usePermissionBtnStore from '@/store/permission'
import ReissueOrderComponent from './components/ReissueOrder.vue' import ReissueOrderComponent from './components/ReissueOrder.vue'
import { WarehouseListData } from '@/types'
const permissionBtns = usePermissionBtnStore() const permissionBtns = usePermissionBtnStore()
...@@ -3302,6 +3302,7 @@ import { ...@@ -3302,6 +3302,7 @@ import {
type RouteLocationNormalized, type RouteLocationNormalized,
} from 'vue-router' } from 'vue-router'
import PrintWarehouseSkuTag from '@/views/order/components/printWarehouseSkuTag.vue' import PrintWarehouseSkuTag from '@/views/order/components/printWarehouseSkuTag.vue'
import { userData } from '@/types/api/user.ts'
declare global { declare global {
interface Window { interface Window {
...@@ -3339,7 +3340,7 @@ const printWarehouseSkuDialogRef = ref() ...@@ -3339,7 +3340,7 @@ const printWarehouseSkuDialogRef = ref()
const isAuto = ref(true) const isAuto = ref(true)
const countryList = ref([]) const countryList = ref([])
const logisticsWayList = ref<{ name: string; id: number }[]>([]) const logisticsWayList = ref<{ name: string; id: number }[]>([])
const employeeList = ref<{ account: string; id: number }[]>([]) const employeeList = ref<userData[]>([])
const currentRow = ref<AddressInfo>({ const currentRow = ref<AddressInfo>({
receiverName: '', receiverName: '',
receiverPhone: '', receiverPhone: '',
...@@ -5593,38 +5594,38 @@ const getOrderByIdApi = async (type: string) => { ...@@ -5593,38 +5594,38 @@ const getOrderByIdApi = async (type: string) => {
// 驳回 // 驳回
const rejectOrder = async (type: string) => { const rejectOrder = async (type: string) => {
if (selection.value.length === 0 && cardSelection.value.length === 0) { const targets = selection.value.length
return ElMessage.warning('请选择数据') ? selection.value.flatMap((v: PodUsOrderListData) => v.productList || [])
} : cardSelection.value
// const loading = ElLoading.service({ if (!targets.length) return ElMessage.warning('请选择数据')
// fullscreen: true, let reason = ''
// text: '操作中...',
// background: 'rgba(0, 0, 0, 0.3)',
// })
try { try {
const { value } = await ElMessageBox.prompt('驳回确认', { const { value } = await ElMessageBox.prompt<string>('驳回确认', {
confirmButtonText: '确认', confirmButtonText: '确认',
cancelButtonText: '取消', cancelButtonText: '取消',
inputType: 'textarea', inputType: 'textarea',
inputPlaceholder: '驳回原因', inputPlaceholder: '驳回原因',
inputPattern: /\S+/, // 非空验证,至少一个非空白字符 inputPattern: /\S+/,
inputErrorMessage: '内容不能为空', inputErrorMessage: '内容不能为空',
}) })
reason = value.trim()
} catch {
return
}
// const loading = ElLoading.service({
// fullscreen: true,
// text: '操作中...',
// background: 'rgba(0, 0, 0, 0.3)',
// })
try {
const res = await rejectToApi({ const res = await rejectToApi({
orderStatus: type, orderStatus: type,
productList: selection.value.length productList: targets,
? selection.value.flatMap( reasonStr: reason,
(item: PodUsOrderListData) => item.productList || [],
)
: cardSelection.value,
reasonStr: value,
}) })
if (res.code !== 200) return if (res.code !== 200) return
resultInfo.value = (res.data || []).filter((item) => !item.status)
resultInfo.value = res.data
resultInfo.value = resultInfo.value.filter((item) => !item.status)
if (!resultInfo.value.length) { if (!resultInfo.value.length) {
ElMessage.success('操作成功') ElMessage.success('操作成功')
search() search()
......
...@@ -107,9 +107,9 @@ ...@@ -107,9 +107,9 @@
import { computed, ref, onMounted } from 'vue' import { computed, ref, onMounted } from 'vue'
import TableView from '@/components/TableView.vue' import TableView from '@/components/TableView.vue'
import usePageList from '@/utils/hooks/usePageList' import usePageList from '@/utils/hooks/usePageList'
import { loadWarehouseListApi } from '@/api/podCnOrder' import { loadWarehouseListApi } from '@/api/common'
import type { WarehouseListData } from '@/types/api/podCnOrder' import { WarehouseListData } from '@/types'
import { SearchForm, OutOfStockItem } from '@/types/api/outOfStockStatistics' import { SearchForm, OutOfStockItem } from '@/types/api/supply/outOfStockStatistics'
import { import {
getOutOfStockStatisticsListApi, getOutOfStockStatisticsListApi,
exportOutOfStockStatisticsListApi, exportOutOfStockStatisticsListApi,
......
<template>
<ElTabs
v-model="activeTab"
v-loading="loading"
class="detail-tabs"
@tab-click="handleTabClick"
>
<ElTabPane name="stockProducts" label="备货商品">
<div class="detail-table-content">
<TableView
:serial-numberable="true"
:columns="stockProductsColumns"
:paginated-data="stockProductsData"
/>
</div>
</ElTabPane>
<ElTabPane name="relatedDocuments" label="关联单据">
<div class="detail-table-content">
<TableView
:serial-numberable="true"
:columns="relatedDocumentsColumns"
:paginated-data="relatedDocumentsData"
/>
</div>
</ElTabPane>
<ElTabPane name="internalMemo" label="内部便签">
<div class="detail-table-content memo-content">
<div class="memo-input-wrapper">
<ElInput
v-model="memoInputValue"
placeholder="请输入内容"
clearable
class="memo-input"
/>
<ElButton type="primary" :loading="addingMemo" @click="handleAddMemo">
添加
</ElButton>
</div>
<div class="memo-list">
<template v-if="internalMemoData.length > 0">
<div
v-for="item in internalMemoData"
:key="item.id"
class="memo-item"
>
<span class="memo-user">{{ item.operatorEmployeeName }}</span>
<span class="memo-text">{{ item.content }}</span>
<span class="memo-time">({{ item.operatorTime }})</span>
</div>
</template>
<div v-else class="empty-content">暂无数据</div>
</div>
</div>
</ElTabPane>
<ElTabPane name="operationLog" label="操作日志">
<div class="detail-table-content">
<LogList :log-list="operationLogData" />
<div class="empty-content">暂无数据</div>
</div>
</ElTabPane>
</ElTabs>
</template>
<script setup lang="tsx">
import { ref } from 'vue'
import type { TabsPaneContext } from 'element-plus'
import TableView from '@/components/TableView.vue'
import {
InternalMemoList,
LogListData,
RelatedDocumentList,
StockingOrderProduct,
TableData,
} from '@/types/api/supply/stockingOrder'
import ImageView from '@/components/ImageView.vue'
import {
addStockingOrderInternalTagApi,
getStockingOrderDetailListByIdApi,
getStockingOrderInternalMemoListByIdApi,
getStockingOrderLogListByIdApi,
getStockingOrderRelatedDocumentListByIdApi,
} from '@/api/supplier/stockingOrder'
import { ElMessage } from 'element-plus'
import LogList from '@/components/LogList.vue'
const relatedDocumentsColumns = computed(() => {
return [
{
label: '关联单据',
prop: 'warehouseApplyNo',
align: 'center',
},
{
label: '关联单号',
prop: 'manageNo',
align: 'center',
},
{
label: '制单人',
width: 120,
prop: 'createUserName',
align: 'center',
},
{
label: '制单时间',
width: 160,
prop: 'createTime',
align: 'center',
},
{
label: 'SKU个数',
width: 120,
align: 'right',
prop: 'skuTotal',
},
{
label: '入库数量',
width: 120,
align: 'right',
prop: 'buyStored',
},
{
label: '申请数量',
width: 120,
prop: 'total',
align: 'right',
},
{
label: '预计到货日期',
width: 160,
align: 'center',
prop: 'expectDeliveryTime',
},
{
label: '实际到货日期',
width: 160,
align: 'center',
prop: 'deliveryTime',
},
]
})
const stockProductsColumns = computed(() => {
return [
{
label: 'SKU图片',
prop: 'skuImage',
width: 100,
align: 'center',
render: (item: StockingOrderProduct) => (
<ImageView src={item.warehouseSkuImage} width="50px" height="50px" />
),
},
{
label: '商品名称',
prop: 'warehouseSkuName',
minWidth: 200,
align: 'left',
},
{
label: '款号',
prop: 'productNo',
width: 120,
align: 'center',
},
{
label: '库存SKU',
prop: 'warehouseSku',
width: 180,
align: 'center',
},
{
label: '备货数量',
prop: 'buyAmount',
width: 100,
align: 'right',
},
{
label: '备货单价',
prop: 'price',
width: 100,
align: 'right',
},
{
label: '备货金额',
prop: 'totalPrice',
width: 120,
align: 'right',
},
{
label: '已发货数量',
prop: 'shipmentQuantity',
width: 120,
align: 'right',
},
{
label: '已入库数量',
prop: 'buyStored',
width: 120,
align: 'right',
},
{
label: '不良品数量',
prop: 'rejectsAmount',
width: 120,
align: 'right',
},
]
})
const props = defineProps<{
selectedRow: TableData | null
}>()
const stockProductsData = ref<StockingOrderProduct[]>([])
const relatedDocumentsData = ref<RelatedDocumentList[]>([])
const internalMemoData = ref<InternalMemoList[]>([])
const operationLogData = ref<LogListData[]>([])
const activeTab = ref('stockProducts')
const loading = ref(false)
const memoInputValue = ref('')
const addingMemo = ref(false)
const handleAddMemo = async () => {
if (!memoInputValue.value.trim()) {
ElMessage.warning('请输入内容')
return
}
if (!props.selectedRow) return
addingMemo.value = true
try {
const res = await addStockingOrderInternalTagApi(
memoInputValue.value.trim(),
[props.selectedRow.id],
)
if (res.code === 200) {
ElMessage.success('添加成功')
memoInputValue.value = ''
loadInternalMemo(props.selectedRow)
}
} catch (e) {
console.error(e)
} finally {
addingMemo.value = false
}
}
watch(
() => props.selectedRow,
(newVal) => {
if (newVal) {
if (activeTab.value === 'stockProducts') {
loadStockProducts(newVal)
} else if (activeTab.value === 'relatedDocuments') {
loadRelatedDocuments(newVal)
} else if (activeTab.value === 'internalMemo') {
loadInternalMemo(newVal)
} else if (activeTab.value === 'operationLog') {
loadOperationLog(newVal)
}
} else {
stockProductsData.value = []
relatedDocumentsData.value = []
internalMemoData.value = []
operationLogData.value = []
}
},
)
const loadStockProducts = async (row: TableData) => {
loading.value = true
try {
const res = await getStockingOrderDetailListByIdApi(row.id)
if (res.code !== 200) return
stockProductsData.value = res.data || []
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const loadRelatedDocuments = async (row: TableData) => {
loading.value = true
try {
const res = await getStockingOrderRelatedDocumentListByIdApi(row.id)
if (res.code !== 200) return
relatedDocumentsData.value = res.data || []
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const loadInternalMemo = async (row: TableData) => {
loading.value = true
try {
const res = await getStockingOrderInternalMemoListByIdApi(row.id)
if (res.code !== 200) return
internalMemoData.value = res.data || []
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const loadOperationLog = async (row: TableData) => {
loading.value = true
try {
const res = await getStockingOrderLogListByIdApi(row.id)
if (res.code !== 200) return
operationLogData.value = res.data || []
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const handleTabClick = (tab: TabsPaneContext) => {
activeTab.value = tab.paneName as string
if (!props.selectedRow) return
if (activeTab.value === 'stockProducts') {
loadStockProducts(props.selectedRow as TableData)
} else if (activeTab.value === 'relatedDocuments') {
loadRelatedDocuments(props.selectedRow as TableData)
} else if (activeTab.value === 'internalMemo') {
loadInternalMemo(props.selectedRow as TableData)
} else if (activeTab.value === 'operationLog') {
loadOperationLog(props.selectedRow as TableData)
}
}
</script>
<style lang="scss" scoped>
.detail-tabs {
height: 100%;
display: flex;
:deep(.el-tab-pane) {
height: 100%;
overflow: hidden;
}
}
.detail-table-content {
height: 100%;
overflow: hidden;
}
.empty-content {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: #909399;
font-size: 14px;
}
.memo-content {
display: flex;
flex-direction: column;
}
.memo-input-wrapper {
display: flex;
align-items: center;
gap: 12px;
.memo-input {
flex: 1;
max-width: 300px;
}
}
.memo-list {
flex: 1;
overflow-y: auto;
}
.memo-item {
padding: 8px 0;
font-size: 14px;
line-height: 1.5;
border-bottom: 1px solid #f0f0f0;
&:last-child {
border-bottom: none;
}
.memo-user {
color: #409eff;
}
.memo-text {
color: #303133;
}
.memo-time {
color: #909399;
margin-left: 8px;
}
}
</style>
...@@ -190,10 +190,10 @@ import { ...@@ -190,10 +190,10 @@ import {
getSupplierDetailApi, getSupplierDetailApi,
getPropertyByCateIdApi, getPropertyByCateIdApi,
getProductInfoBySpuApi, getProductInfoBySpuApi,
getBaseCurrencyInfoApi,
addSupplierApi, addSupplierApi,
updateSupplierApi, updateSupplierApi,
} from '@/api/supplier/supplierManagement.ts' } from '@/api/supplier/supplierManagement.ts'
import { getBaseCurrencyInfoApi } from '@/api/common'
import Dialog from './components/dialog.tsx' import Dialog from './components/dialog.tsx'
import CustomizeForm from '@/components/CustomizeForm.tsx' import CustomizeForm from '@/components/CustomizeForm.tsx'
......
...@@ -272,6 +272,7 @@ ...@@ -272,6 +272,7 @@
header-align="center" header-align="center"
align="center" align="center"
></ElTableColumn> ></ElTableColumn>
<ElTableColumn <ElTableColumn
v-if="nodeCode === 'PENDING_SUBMIT'" v-if="nodeCode === 'PENDING_SUBMIT'"
width="100" width="100"
...@@ -386,6 +387,13 @@ ...@@ -386,6 +387,13 @@
prop="remark" prop="remark"
/> />
<ElTableColumn <ElTableColumn
label="所属客户"
show-overflow-tooltip
prop="userMark"
header-align="center"
align="center"
></ElTableColumn>
<ElTableColumn
show-overflow-tooltip show-overflow-tooltip
align="center" align="center"
label="创建时间" label="创建时间"
...@@ -604,6 +612,12 @@ ...@@ -604,6 +612,12 @@
<ElTableColumn <ElTableColumn
show-overflow-tooltip show-overflow-tooltip
align="center" align="center"
label="所属客户"
prop="userMark"
/>
<ElTableColumn
show-overflow-tooltip
align="center"
width="240" width="240"
label="备注" label="备注"
prop="remark" prop="remark"
...@@ -624,7 +638,7 @@ ...@@ -624,7 +638,7 @@
clearable clearable
size="small" size="small"
></el-input> ></el-input>
<el-popover placement="top-start" width="1000" trigger="click"> <el-popover placement="top-start" width="1200" trigger="click">
<div v-if="skuData.length > 0" style="height: 50vh"> <div v-if="skuData.length > 0" style="height: 50vh">
<ElTable size="small" :data="skuData" height="100%" border> <ElTable size="small" :data="skuData" height="100%" border>
<ElTableColumn <ElTableColumn
...@@ -687,6 +701,12 @@ ...@@ -687,6 +701,12 @@
prop="locationCode" prop="locationCode"
/> />
<ElTableColumn <ElTableColumn
show-overflow-tooltip
align="center"
label="所属客户"
prop="userMark"
/>
<ElTableColumn
width="80" width="80"
align="center" align="center"
header-align="center" header-align="center"
...@@ -836,9 +856,7 @@ ...@@ -836,9 +856,7 @@
maxlength="1000" maxlength="1000"
show-word-limit show-word-limit
/> />
<div style="margin-top: 12px; color: #777"> <div style="margin-top: 12px; color: #777">多个字段使用","隔开</div>
{{ '多个字段使用_##_,_##_隔开' }}
</div>
</div> </div>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
...@@ -1268,6 +1286,11 @@ const handleLocalImport = async ({ ...@@ -1268,6 +1286,11 @@ const handleLocalImport = async ({
return { return {
skuImage: skuItem.image, skuImage: skuItem.image,
customerId: skuItem.customerId,
userMark: skuItem.userMark,
customerName: skuItem.customerName,
currencyName: skuItem.currencyName,
currencyCode: skuItem.currencyCode,
warehouseSku: skuItem.warehouseSku, warehouseSku: skuItem.warehouseSku,
skuName: skuItem.skuName, skuName: skuItem.skuName,
productNo: skuItem.productNumber, productNo: skuItem.productNumber,
...@@ -1388,8 +1411,11 @@ const skudblclick = (val: InterskuList) => { ...@@ -1388,8 +1411,11 @@ const skudblclick = (val: InterskuList) => {
// 使用可选链和空值合并运算符处理可能的null值 // 使用可选链和空值合并运算符处理可能的null值
const { const {
locationCode = '', locationCode = '',
customerId = '',
customerName = '',
price = null, price = null,
productNo = '', productNo = '',
userMark = '',
warehouseSku = '', warehouseSku = '',
skuName = '', skuName = '',
image = '', image = '',
...@@ -1415,8 +1441,11 @@ const skudblclick = (val: InterskuList) => { ...@@ -1415,8 +1441,11 @@ const skudblclick = (val: InterskuList) => {
{ {
skuImage: image, skuImage: image,
warehouseSku, warehouseSku,
customerId,
customerName,
skuName, skuName,
productNo, productNo,
userMark,
locationCode: locationCode ?? '', // 确保空值处理 locationCode: locationCode ?? '', // 确保空值处理
locationId: locationId ?? null, // 确保空值处理 locationId: locationId ?? null, // 确保空值处理
costPrice: price, costPrice: price,
...@@ -1752,6 +1781,11 @@ const submitPurchase = async () => { ...@@ -1752,6 +1781,11 @@ const submitPurchase = async () => {
const mergedProductList = filteredSkusList.map((skuItem) => { const mergedProductList = filteredSkusList.map((skuItem) => {
return { return {
skuImage: skuItem.image, skuImage: skuItem.image,
customerId: skuItem.customerId,
userMark: skuItem.userMark,
customerName: skuItem.customerName,
currencyName: skuItem.currencyName,
currencyCode: skuItem.currencyCode,
warehouseSku: skuItem.warehouseSku, warehouseSku: skuItem.warehouseSku,
skuName: skuItem.skuName, skuName: skuItem.skuName,
productNo: skuItem.productNumber, productNo: skuItem.productNumber,
......
<template>
<ElTabs
v-model="activeTab"
v-loading="loading"
class="detail-tabs"
@tab-click="handleTabClick"
>
<ElTabPane name="stockProducts" label="入库商品">
<div class="detail-table-content">
<TableView
:serial-numberable="true"
:columns="stockProductsColumns"
:paginated-data="stockProductsData"
/>
</div>
</ElTabPane>
<ElTabPane name="relatedDocuments" label="关联单据">
<div class="detail-table-content">
<TableView
:serial-numberable="true"
:columns="relatedDocumentsColumns"
:paginated-data="relatedDocumentsData"
/>
</div>
</ElTabPane>
<ElTabPane name="operationLog" label="操作日志">
<div class="detail-table-content">
<LogList :log-list="operationLogData" />
<div class="empty-content">暂无数据</div>
</div>
</ElTabPane>
</ElTabs>
</template>
<script setup lang="tsx">
import { ref } from 'vue'
import type { TabsPaneContext } from 'element-plus'
import TableView from '@/components/TableView.vue'
import {
RelatedDocumentList,
StockingApplyOrderDetailList,
TableData,
} from '@/types/api/warehouse/stockingApplyOrder'
import ImageView from '@/components/ImageView.vue'
import {
getStockingApplyOrderDetailListByIdApi,
getStockingApplyOrderLogListByIdApi,
getStockingApplyOrderRelatedDocumentListByIdApi,
} from '@/api/warehouse/stockingApplyOrder'
import LogList from '@/components/LogList.vue'
import { LogListData } from '@/types/api/supply/stockingOrder'
const relatedDocumentsColumns = computed(() => {
return [
{
label: '关联单据',
prop: 'inNo',
align: 'center',
},
{
label: '关联单号',
prop: 'sourceOn',
align: 'center',
},
{
label: '制单人',
width: 120,
prop: 'checkerName',
align: 'center',
},
{
label: '制单时间',
width: 160,
prop: 'createTime',
align: 'center',
},
{
label: 'SKU个数',
width: 120,
align: 'right',
prop: 'skuAmount',
},
{
label: '入库数量',
width: 120,
align: 'right',
prop: 'total',
},
]
})
const stockProductsColumns = computed(() => {
return [
{
label: 'SKU图片',
prop: 'skuImage',
width: 100,
align: 'center',
render: (item: StockingApplyOrderDetailList) => (
<ImageView src={item.warehouseSkuImage} width="50px" height="50px" />
),
},
{
label: '商品名称',
prop: 'warehouseSkuName',
minWidth: 200,
align: 'left',
},
{
label: '款号',
prop: 'productNo',
width: 120,
align: 'center',
},
{
label: '库存SKU',
prop: 'warehouseSku',
width: 180,
align: 'center',
},
{
label: '申请数量',
prop: 'shipmentQuantity',
width: 100,
align: 'right',
},
{
label: '入库数量',
prop: 'buyStored',
width: 120,
align: 'right',
},
{
label: '不良品数',
prop: 'rejectsAmount',
width: 120,
align: 'right',
},
{
label: '实际质检数',
prop: 'finallyShipmentQuantity',
width: 120,
align: 'right',
},
{
label: '入库待审核数',
prop: 'storedPending',
width: 120,
align: 'right',
},
{
label: '币种',
prop: 'currencyCode',
width: 100,
align: 'center',
},
{
label: '入库单价',
prop: 'price',
width: 100,
align: 'right',
},
]
})
const props = defineProps<{
selectedRow: TableData | null
}>()
const stockProductsData = ref<StockingApplyOrderDetailList[]>([])
const relatedDocumentsData = ref<RelatedDocumentList[]>([])
const activeTab = ref('stockProducts')
const loading = ref(false)
const operationLogData = ref<LogListData[]>([])
watch(
() => props.selectedRow,
(newVal) => {
if (newVal) {
if (activeTab.value === 'stockProducts') {
loadStockProducts(newVal)
} else if (activeTab.value === 'relatedDocuments') {
loadRelatedDocuments(newVal)
} else if (activeTab.value === 'operationLog') {
loadOperationLog(newVal)
}
} else {
stockProductsData.value = []
relatedDocumentsData.value = []
}
},
)
const loadStockProducts = async (row: TableData) => {
loading.value = true
try {
const res = await getStockingApplyOrderDetailListByIdApi(row.id)
if (res.code !== 200) return
stockProductsData.value = res.data || []
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const loadRelatedDocuments = async (row: TableData) => {
loading.value = true
try {
const res = await getStockingApplyOrderRelatedDocumentListByIdApi(
row.warehouseApplyNo,
)
if (res.code !== 200) return
relatedDocumentsData.value = res.data || []
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const loadOperationLog = async (row: TableData) => {
try {
const res = await getStockingApplyOrderLogListByIdApi(row.id)
if (res.code !== 200) return
operationLogData.value = res.data || []
} catch (e) {
console.error(e)
} finally {
loading.value = false
}
}
const handleTabClick = (tab: TabsPaneContext) => {
activeTab.value = tab.paneName as string
if (activeTab.value === 'stockProducts') {
loadStockProducts(props.selectedRow as TableData)
} else if (activeTab.value === 'relatedDocuments') {
loadRelatedDocuments(props.selectedRow as TableData)
} else if (activeTab.value === 'operationLog') {
loadOperationLog(props.selectedRow as TableData)
}
}
</script>
<style lang="scss" scoped>
.detail-tabs {
height: 100%;
display: flex;
:deep(.el-tab-pane) {
height: 100%;
overflow: hidden;
}
}
.detail-table-content {
height: 100%;
overflow: hidden;
}
.empty-content {
display: flex;
align-items: center;
justify-content: center;
height: 100%;
color: #909399;
font-size: 14px;
}
</style>
...@@ -60,11 +60,11 @@ ...@@ -60,11 +60,11 @@
value-format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
/> />
</ElFormItem> </ElFormItem>
<ElFormItem label="备货单号"> <ElFormItem label="备货计划单号">
<ElInput <ElInput
v-model.trim="searchForm.inNo" v-model.trim="searchForm.inNo"
clearable clearable
placeholder="请输入备货单号" placeholder="请输入备货计划单号"
style="width: 160px" style="width: 160px"
/> />
</ElFormItem> </ElFormItem>
...@@ -206,7 +206,7 @@ ...@@ -206,7 +206,7 @@
align="center" align="center"
/> />
<ElTableColumn <ElTableColumn
label="备货单号" label="备货计划单号"
show-overflow-tooltip show-overflow-tooltip
prop="inNo" prop="inNo"
width="130" width="130"
...@@ -553,7 +553,7 @@ ...@@ -553,7 +553,7 @@
inline inline
label-width="90px" label-width="90px"
> >
<ElFormItem label="备货单号" prop="account"> <ElFormItem label="备货计划单号" prop="account">
<ElInput v-model.trim="editForm.inNo" clearable disabled /> <ElInput v-model.trim="editForm.inNo" clearable disabled />
</ElFormItem> </ElFormItem>
<ElFormItem label="工厂编号:" prop="factoryCode"> <ElFormItem label="工厂编号:" prop="factoryCode">
...@@ -926,9 +926,7 @@ ...@@ -926,9 +926,7 @@
maxlength="1000" maxlength="1000"
show-word-limit show-word-limit
/> />
<div style="margin-top: 12px; color: #777"> <div style="margin-top: 12px; color: #777">多个字段使用","隔开</div>
{{ '多个字段使用_##_,_##_隔开' }}
</div>
</div> </div>
<template #footer> <template #footer>
<span class="dialog-footer"> <span class="dialog-footer">
...@@ -943,7 +941,7 @@ ...@@ -943,7 +941,7 @@
width="500px" width="500px"
> >
<ElTable :data="updateShipmentNumberForm" border> <ElTable :data="updateShipmentNumberForm" border>
<ElTableColumn prop="inNo" label="备货单号" /> <ElTableColumn prop="inNo" label="备货计划单号" />
<ElTableColumn prop="shipmentNumber" label="物流单号"> <ElTableColumn prop="shipmentNumber" label="物流单号">
<template #default="{ row }"> <template #default="{ row }">
<el-input <el-input
...@@ -968,7 +966,7 @@ ...@@ -968,7 +966,7 @@
<el-input <el-input
ref="scanInputRef" ref="scanInputRef"
v-model="scanInput" v-model="scanInput"
placeholder="请输入备货单号" placeholder="请输入备货计划单号"
style="width: 90%" style="width: 90%"
clearable clearable
@keyup.enter="scan" @keyup.enter="scan"
...@@ -980,7 +978,7 @@ ...@@ -980,7 +978,7 @@
<el-descriptions-item label="备货仓库"> <el-descriptions-item label="备货仓库">
{{ scanData.warehouseName || '-' }} {{ scanData.warehouseName || '-' }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="备货单号"> <el-descriptions-item label="备货计划单号">
{{ scanData.inNo || '-' }} {{ scanData.inNo || '-' }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="物流单号"> <el-descriptions-item label="物流单号">
...@@ -2063,7 +2061,7 @@ const scan = async () => { ...@@ -2063,7 +2061,7 @@ const scan = async () => {
console.log(scanInput.value, 'scanInput.value') console.log(scanInput.value, 'scanInput.value')
if (!scanInput.value) { if (!scanInput.value) {
return ElMessage.warning('请输入备货单号') return ElMessage.warning('请输入备货计划单号')
} }
scanInput.value = scanInput.value.trim() scanInput.value = scanInput.value.trim()
// 将中文破折号转换为下划线 // 将中文破折号转换为下划线
...@@ -2289,7 +2287,6 @@ $border: solid 1px #ddd; ...@@ -2289,7 +2287,6 @@ $border: solid 1px #ddd;
::v-deep(.el-tree-node) { ::v-deep(.el-tree-node) {
cursor: pointer; cursor: pointer;
margin-bottom: 5px;
} }
::v-deep(.el-tree-node__label) { ::v-deep(.el-tree-node__label) {
......
...@@ -6,14 +6,13 @@ import { ...@@ -6,14 +6,13 @@ import {
updateLocationApi, updateLocationApi,
updateProductNoApi, updateProductNoApi,
updateCustomSkuApi, updateCustomSkuApi,
LocationInfoGetAll,
getWarehouseInventoryInfo, getWarehouseInventoryInfo,
factoryLogWarehouseLog, factoryLogWarehouseLog,
LogListData, LogListData,
WarehouseWarning, WarehouseWarning,
factoryWarehouseInventoryPrint, factoryWarehouseInventoryPrint,
exportWarehouseInfo, exportWarehouseInfo,
loactionData, loactionData, getLocalFactoryList,
} from '@/api/warehouse.ts' } from '@/api/warehouse.ts'
import { AnyObject } from '@/types/api/warehouse' import { AnyObject } from '@/types/api/warehouse'
import { ref, computed } from 'vue' import { ref, computed } from 'vue'
...@@ -21,11 +20,18 @@ import SplitDiv from '@/components/splitDiv/splitDiv.vue' ...@@ -21,11 +20,18 @@ import SplitDiv from '@/components/splitDiv/splitDiv.vue'
import { filePath } from '@/api/axios.ts' import { filePath } from '@/api/axios.ts'
import { useEnterKeyTrigger } from '@/utils/hooks/useEnterKeyTrigger.ts' import { useEnterKeyTrigger } from '@/utils/hooks/useEnterKeyTrigger.ts'
import { getInventoryLowerLimitApi } from '@/api/externalAuth' import { getInventoryLowerLimitApi } from '@/api/externalAuth'
interface UserMark{
userId: number | string
userMark: string
userName: string
}
import { LocationInfoGetAll } from '@/api/common'
const searchForm = ref({ const searchForm = ref({
warehouseId: '', warehouseId: '',
inventoryStart: '', inventoryStart: '',
inventoryEnd: '', inventoryEnd: '',
userMark: '',
productNo: '', productNo: '',
skuName: '', skuName: '',
warehouseSku: '', warehouseSku: '',
...@@ -38,6 +44,7 @@ const searchForm = ref({ ...@@ -38,6 +44,7 @@ const searchForm = ref({
occupyInventoryStart: '', occupyInventoryStart: '',
}) })
const warehouseList = ref<warehouseInfo[]>([]) const warehouseList = ref<warehouseInfo[]>([])
const userMarkList = ref<UserMark[]>([])
const logList = ref<LogListData[]>([]) const logList = ref<LogListData[]>([])
const selections = ref<WarehouseWarning[]>([]) const selections = ref<WarehouseWarning[]>([])
const leftData = ref<WarehouseWarning[]>([]) const leftData = ref<WarehouseWarning[]>([])
...@@ -56,6 +63,13 @@ const isSameWarehouse = computed(() => { ...@@ -56,6 +63,13 @@ const isSameWarehouse = computed(() => {
const modifyLocationDialog = ref(false) const modifyLocationDialog = ref(false)
const modifyProductNoDialog = ref(false) const modifyProductNoDialog = ref(false)
const modifyCustomSkuDialog = ref(false) const modifyCustomSkuDialog = ref(false)
const getUserMark = async () => {
const {data} = await getLocalFactoryList()
userMarkList.value = [
...[{userMark:'九猫商品', userId: 'JMP',userName:''}],
...data
]
}
/** 修改库位 */ /** 修改库位 */
const locationForm = ref({ const locationForm = ref({
...@@ -351,6 +365,7 @@ const getInventoryLowerLimit = async () => { ...@@ -351,6 +365,7 @@ const getInventoryLowerLimit = async () => {
} }
onMounted(async () => { onMounted(async () => {
getData() getData()
getUserMark()
getWarehouse() getWarehouse()
getInventoryLowerLimit() getInventoryLowerLimit()
}) })
...@@ -387,6 +402,7 @@ onMounted(async () => { ...@@ -387,6 +402,7 @@ onMounted(async () => {
prop="productNo" prop="productNo"
label="款号 " label="款号 "
></el-table-column> ></el-table-column>
<el-table-column align="center" prop="number" label="打印数量"> <el-table-column align="center" prop="number" label="打印数量">
<template #default="{ row }"> <template #default="{ row }">
<el-input <el-input
...@@ -407,10 +423,11 @@ onMounted(async () => { ...@@ -407,10 +423,11 @@ onMounted(async () => {
</el-dialog> </el-dialog>
<el-card> <el-card>
<el-form <el-form
ref="searchFormRef"
class="search-form" class="search-form"
inline inline
label-width="80px"
:model="searchForm" :model="searchForm"
ref="searchFormRef"
> >
<el-form-item label="仓库"> <el-form-item label="仓库">
<el-select <el-select
...@@ -418,7 +435,7 @@ onMounted(async () => { ...@@ -418,7 +435,7 @@ onMounted(async () => {
clearable clearable
filterable filterable
placeholder="请输入仓库" placeholder="请输入仓库"
style="width: 140px" style="width: 175px"
> >
<el-option <el-option
v-for="item in warehouseList" v-for="item in warehouseList"
...@@ -497,8 +514,21 @@ onMounted(async () => { ...@@ -497,8 +514,21 @@ onMounted(async () => {
clearable clearable
></el-input> ></el-input>
</el-form-item> </el-form-item>
<el-form-item label="所属客户">
<el-select
v-model="searchForm.userMark"
clearable
filterable
placeholder="请输入所属客户"
style="width: 140px"
>
<el-option
v-for="user in userMarkList" :key="user.userMark" :label="user.userMark" :value="user.userMark==='九猫商品'?'JMP':user.userMark"
></el-option>
</el-select>
</el-form-item>
<el-form-item style="margin-top: 5px"> <el-form-item style="margin-top: 5px">
<el-button type="primary" @click="getData" ref="searchBtnRef" <el-button ref="searchBtnRef" type="primary" @click="getData"
>查询</el-button >查询</el-button
> >
</el-form-item> </el-form-item>
...@@ -618,6 +648,11 @@ onMounted(async () => { ...@@ -618,6 +648,11 @@ onMounted(async () => {
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
align="center" align="center"
prop="userMark"
label="所属客户"
></el-table-column>
<el-table-column
align="center"
prop="unit" prop="unit"
label="单位" label="单位"
width="60" width="60"
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment