feat(inventory): 实现订单与服务入库功能分离

- 新增标签页切换功能,区分订单入库和服务入库
- 增加采购单号和合同编号搜索条件
- 根据入库类型动态显示表格列和操作按钮
- 引入订单详情和服务详情组件,优化查看界面
- 更新Java实体类和Mapper,支持按产品类型筛选和模糊查询
- 实现入库取消功能,同步更新采购订单状态
- 添加根据合同编号查询项目信息的功能
- 优化前端组件结构,提高代码可维护性
dev_1.0.0
chenhao 2025-12-01 14:25:46 +08:00
parent d579a27562
commit 6747c224c8
18 changed files with 296 additions and 157 deletions

View File

@ -0,0 +1,52 @@
<template>
<div style="padding: 20px;">
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="24"><h3>入库信息</h3></el-col>
<el-col :span="12">
<el-form-item label="入库单号:">{{ form.innerCode }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="制造商:">{{ form.vendorName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="入库时间:">{{ parseTime(form.createTime) }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注:">{{ form.remark }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件信息:">
<div v-if="form.originalFilename">
<el-link type="primary" @click="$emit('download-file')">{{ form.originalFilename }}</el-link>
</div>
<span v-else></span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24"><h3>产品信息</h3></el-col>
</el-row>
<el-table :data="form.inventoryInfoList">
<el-table-column label="SN码" prop="productSn" />
<el-table-column label="产品编码" prop="productCode" />
<el-table-column label="产品型号" prop="model" />
<el-table-column label="产品描述" prop="productDesc" width="200" show-overflow-tooltip/>
<el-table-column label="入库价(含税)" prop="innerPrice" />
<el-table-column label="仓库" prop="warehouseName" />
</el-table>
</el-form>
</div>
</template>
<script>
export default {
name: "OrderDetail",
props: {
form: {
type: Object,
required: true
}
}
}
</script>

View File

@ -0,0 +1,60 @@
<template>
<div style="padding: 20px;">
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="24"><h3>入库信息</h3></el-col>
<el-col :span="12">
<el-form-item label="入库单号:">{{ form.innerCode }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="入库时间:">{{ parseTime(form.createTime) }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="经办人:">{{ form.createByName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="产品类型:">
<dict-tag :options="dict.type.product_type" :value="form.productType"/>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="制造商:">{{ form.vendorName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="合同编号:">{{ form.orderCode }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目编号:">{{ form.projectCode }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="项目名称:">{{ form.projectName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="数量:">{{ form.quantity }}</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24"><h3>产品信息</h3></el-col>
</el-row>
<el-table :data="form.inventoryInfoList">
<el-table-column label="产品编码" prop="productCode"/>
<el-table-column label="产品型号" prop="model"/>
<el-table-column label="描述" prop="productDesc"/>
<!-- <el-table-column label="入库价" prop="innerPrice"/>-->
</el-table>
</el-form>
</div>
</template>
<script>
export default {
name: "ServiceDetail",
dicts: ['product_type'],
props: {
form: {
type: Object,
required: true
}
}
}
</script>

View File

@ -1,10 +1,21 @@
<template>
<div class="app-container">
<el-tabs v-model="activeTab" @tab-click="handleTabClick">
<el-tab-pane label="订单入库" name="order"></el-tab-pane>
<el-tab-pane label="服务入库" name="service"></el-tab-pane>
</el-tabs>
<!-- 搜索表单 -->
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="88px">
<el-form-item label="入库单号" prop="innerCode">
<el-input v-model="queryParams.innerCode" placeholder="请输入入库单号" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="采购单号" prop="purchaseNo">
<el-input v-model="queryParams.purchaseNo" placeholder="请输入采购单号" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item v-if="activeTab === 'service'" label="合同编号" prop="orderCode">
<el-input v-model="queryParams.orderCode" placeholder="请输入合同编号" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
<el-form-item label="产品编码" prop="productCode">
<el-input v-model="queryParams.productCode" placeholder="请输入产品编码" clearable @keyup.enter.native="handleQuery"/>
</el-form-item>
@ -30,22 +41,22 @@
<!-- 操作按钮 -->
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-col :span="1.5" v-if="activeTab === 'order'">
<el-button type="primary" plain icon="el-icon-plus" @click="handleAdd()" v-hasPermi="['inventory:inner:add']">
PO订单入库
</el-button>
</el-col>
<el-col :span="1.5">
<el-col :span="1.5" v-if="activeTab === 'service'">
<el-button type="primary" plain icon="el-icon-plus" @click="handleAdd('maintenance')" v-hasPermi="['inventory:inner:add']">
服务入库
</el-button>
</el-col>
<el-col :span="1.5">
<el-col :span="1.5" v-if="activeTab === 'order'">
<el-button type="warning" plain icon="el-icon-download" @click="handleExport"
v-hasPermi="['inventory:inner:export']">导出软硬件产品
</el-button>
</el-col>
<el-col :span="1.5">
<el-col :span="1.5" v-if="activeTab === 'service'">
<el-button type="warning" plain icon="el-icon-download" @click="handleExport"
v-hasPermi="['inventory:inner:export']">导出服务产品
</el-button>
@ -66,14 +77,14 @@
<el-table-column label="产品编码" align="center" prop="productCode" show-overflow-tooltip/>
<el-table-column label="数量" align="center" prop="quantity" />
<el-table-column label="制造商" align="center" prop="vendorName" show-overflow-tooltip/>
<el-table-column label="入库类型" align="center" prop="warehouseType" >
<el-table-column v-if="activeTab === 'order'" label="入库类型" align="center" prop="warehouseType" >
<template slot-scope="scope">
<dict-tag :options="dict.type.warehouse_type" :value="scope.row.warehouseType"/>
</template>
</el-table-column>
<el-table-column label="入库仓" align="center" prop="warehouseName" show-overflow-tooltip/>
<el-table-column v-if="activeTab === 'order'" label="入库仓" align="center" prop="warehouseName" show-overflow-tooltip/>
<el-table-column label="经办人" align="center" prop="createByName" />
<el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>
<!-- <el-table-column label="备注" align="center" prop="remark" show-overflow-tooltip/>-->
<el-table-column label="入库时间" align="center" prop="createTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.createTime) }}</span>
@ -95,45 +106,6 @@
<!-- 新增/修改 Dialog -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body :close-on-click-modal="false">
<el-form ref="form" :model="form" :rules="rules" label-width="100px">
<!-- <el-row>-->
<!-- <el-col :span="24"><h3>入库信息</h3></el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-form-item label="入库单号" prop="innerCode">-->
<!-- <el-input v-model="form.innerCode" placeholder="保存后自动生成" readonly />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-form-item label="制造商" prop="vendorCode">-->
<!-- <el-select v-model="form.vendorCode" placeholder="请选择制造商" style="width:100%">-->
<!-- <el-option v-for="item in vendorOptions" :key="item.vendorCode" :label="item.vendorName" :value="item.vendorCode"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-form-item label="入库时间" prop="createTime">-->
<!-- <el-input v-model="form.createTime" readonly />-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-form-item label="备注" prop="remark">-->
<!-- <el-input v-model="form.remark" placeholder="请输入备注"/>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="8">-->
<!-- <el-form-item label="附件信息">-->
<!-- <el-upload-->
<!-- :action="upload.url"-->
<!-- :headers="upload.headers"-->
<!-- :on-success="handleFileSuccess"-->
<!-- :on-remove="handleFileRemove"-->
<!-- :before-upload="beforeUpload"-->
<!-- :file-list="upload.fileList"-->
<!-- >-->
<!-- <el-button size="small" type="primary">点击上传</el-button>-->
<!-- </el-upload>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<el-row>
<el-col :span="24"><h3>入库信息</h3></el-col>
<el-col :span="12">
@ -205,8 +177,6 @@
<el-table-column label="产品编码" prop="productCode" />
<el-table-column label="产品型号" prop="model" />
<el-table-column label="产品描述" prop="productDesc" width="200" show-overflow-tooltip/>
<!-- <el-table-column label="入库价(含税)" prop="innerPrice" />-->
<!-- <el-table-column label="仓库" prop="warehouseName" />-->
<el-table-column label="操作" align="center">
<template slot-scope="scope">
<el-button size="mini" type="text" icon="el-icon-delete"
@ -246,109 +216,8 @@
<!-- 查看详情 Drawer -->
<el-drawer :title="title" :visible.sync="drawerOpen" direction="rtl" size="70%">
<div style="padding: 20px;">
<el-form :model="form" label-width="100px">
<el-row>
<el-col :span="24"><h3>入库信息</h3></el-col>
<el-col :span="12">
<el-form-item label="入库单号:">{{ form.innerCode }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="制造商:">{{ form.vendorName }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="入库时间:">{{ parseTime(form.createTime) }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="备注:">{{ form.remark }}</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="附件信息:">
<div v-if="form.originalFilename">
<el-link type="primary" @click="handleDownloadFile">{{ form.originalFilename }}</el-link>
</div>
<span v-else></span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24"><h3>产品信息</h3></el-col>
</el-row>
<el-table :data="form.inventoryInfoList">
<el-table-column label="SN码" prop="productSn" />
<el-table-column label="产品编码" prop="productCode" />
<el-table-column label="产品型号" prop="model" />
<el-table-column label="产品描述" prop="productDesc" width="200" show-overflow-tooltip/>
<el-table-column label="入库价(含税)" prop="innerPrice" />
<el-table-column label="仓库" prop="warehouseName" />
</el-table>
</el-form>
</div>
<component :is="detailComponent" :form="form" @download-file="handleDownloadFile" v-if="drawerOpen"/>
</el-drawer>
<!-- 添加产品 Dialog -->
<!-- <el-dialog title="添加产品" :visible.sync="productOpen" width="60%" append-to-body>-->
<!-- <el-form :model="productQuery" ref="productQueryForm" :inline="true" label-width="88px">-->
<!-- <el-form-item label="产品编码" prop="productCodeQuery">-->
<!-- <el-input v-model="productQuery.productCodeQuery" placeholder="请输入产品编码" clearable @keyup.enter.native="handleProductQuery"/>-->
<!-- </el-form-item>-->
<!-- <el-form-item>-->
<!-- <el-button type="primary" icon="el-icon-search" @click="handleProductQuery"></el-button>-->
<!-- <el-button icon="el-icon-refresh" @click="resetProductQuery"></el-button>-->
<!-- </el-form-item>-->
<!-- </el-form>-->
<!-- <el-form :model="productForm" ref="productForm" :rules="productRules" label-width="140px">-->
<!-- <el-row>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="产品编码" prop="productCode">-->
<!-- <el-input v-model="productForm.productCode" readonly/>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="产品型号" prop="model">-->
<!-- <el-input v-model="productForm.model" readonly/>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="24">-->
<!-- <el-form-item label="产品描述" prop="productDesc">-->
<!-- <el-input v-model="productForm.productDesc" readonly/>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="入库价(含税)" prop="innerPrice">-->
<!-- <el-input-number v-model="productForm.innerPrice" :precision="2" :step="0.1" :min="0"></el-input-number>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="数量" prop="quantity">-->
<!-- <el-input-number v-model="productForm.quantity" @change="calcSn" :min="1" :max="3000" :step="1"></el-input-number>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="入库仓" prop="warehouseId">-->
<!-- <el-select v-model="productForm.warehouseId" placeholder="请选择仓库" style="width:100%">-->
<!-- <el-option v-for="item in warehouseOptions" :key="item.id" :label="item.warehouseName" :value="item.id"></el-option>-->
<!-- </el-select>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="12">-->
<!-- <el-form-item label="该批次起始SN码" prop="productSn">-->
<!-- <el-input v-model="productForm.productSn" @input="calcSn" placeholder="只能输入数字和字母"/>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- <el-col :span="24">-->
<!-- <el-form-item label="SN码范围">-->
<!-- <span>{{ snRange }}</span>-->
<!-- </el-form-item>-->
<!-- </el-col>-->
<!-- </el-row>-->
<!-- </el-form>-->
<!-- <div slot="footer" class="dialog-footer">-->
<!-- <el-button type="primary" @click="submitProductForm"> </el-button>-->
<!-- <el-button @click="cancelProduct"> </el-button>-->
<!-- </div>-->
<!-- </el-dialog>-->
</div>
</template>
@ -363,6 +232,8 @@ import {exportProject} from "@/api/project/info";
import PurchaseOrderSelectDialog from '../../purchaseorder/components/PurchaseOrderSelectDialog.vue';
import OrderSelectDialog from '../../project/order/components/OrderSelectDialog.vue';
import Dict from "@/views/system/dict/index.vue";
import OrderDetail from "@/views/inventory/inner/components/OrderDetail.vue";
import ServiceDetail from "@/views/inventory/inner/components/ServiceDetail.vue";
export default {
name: "Inner",
@ -370,10 +241,15 @@ export default {
Dict,
PurchaseOrderSelectDialog,
OrderSelectDialog,
OrderDetail,
ServiceDetail,
},
dicts: ['product_type', 'warehouse_type'],
data() {
return {
detailComponent: null,
// Tab
activeTab: 'order',
//
loading: true,
//
@ -406,6 +282,8 @@ export default {
innerCode: null,
productCode: null,
createByName: null,
orderCode: null,
productTypeList: ['1','2','99'], // 'service' or 'order'
orderByColumn:'createTime',
isAsc: 'desc'
},
@ -469,6 +347,10 @@ export default {
this.loading = false;
});
},
/** Tab 切换 */
handleTabClick() {
this.resetQuery();
},
submitSn() {
if (this.snRow) {
this.snRow.productSn = this.inputSn;
@ -515,6 +397,11 @@ export default {
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
if (this.activeTab==='service'){
this.queryParams.productTypeList = ['11','22'];
}else{
this.queryParams.productTypeList = ['1','2','99'];
}
this.getList();
},
/** 重置按钮操作 */
@ -582,6 +469,11 @@ export default {
const id = row.id;
getInner(id).then(response => {
this.form = response.data;
if (['11', '22'].includes(this.form.productType)) {
this.detailComponent = 'ServiceDetail';
} else {
this.detailComponent = 'OrderDetail';
}
if (this.form.fileId && this.form.originalFilename) {
this.upload.fileList = [{
name: this.form.originalFilename,

View File

@ -84,6 +84,10 @@ export default {
productTypeList:{
type:Array,
default: []
},
type:{
type: String,
default: 'inner'
}
},
dicts:['product_type'],
@ -108,7 +112,8 @@ export default {
productTypeList: [],
vendorName: null,
approveStatus: '2', //
confirmStatus:'1'
confirmStatus:'1',
type: this.type
},
};
},

View File

@ -34,7 +34,10 @@ public class OmsInventoryInner extends BaseEntity {
*/
@Excel(name = "入库单号")
private String innerCode;
@Excel(name = "采购单号")
private String purchaseNo;
@Excel(name = "产品类型",dictType = "product_type")
private String productType;
/**
*
*/
@ -68,12 +71,13 @@ public class OmsInventoryInner extends BaseEntity {
@Excel(name = "入库时间",dateFormat="yyyy-MM-dd HH:mm:ss")
private Date createTime;
private String purchaseNo;
private String productType;
private String orderCode;
private String projectCode;
private String projectName;
private BigDecimal totalAmount;
private BigDecimal taxRate;
private BigDecimal taxTotal;
private Long itemId;
private List<String> productTypeList;
private List<InventoryInfo> inventoryInfoList;
}

View File

@ -27,6 +27,7 @@ public class OmsPurchaseOrderItem extends BaseEntity
/** 关联采购单ID */
private Long purchaseId;
private String purchaseNo;
/** 产品CODE */
private String productCode;

View File

@ -35,7 +35,8 @@ public class OmsPurchaseOrderItemDto extends OmsPurchaseOrder {
private BigDecimal taxRate;
private Long itemId;
// inner 代表查询入库数量和实际数量不一致的
private String type;
/** 单价 */
private BigDecimal price;
private String productType;

View File

@ -62,4 +62,6 @@ public interface OmsInventoryInnerMapper
int selectMaxOrderCode(String code);
List<String> checkDelete(String[] ids);
List<OmsInventoryInner> listById(String[] idArray);
}

View File

@ -106,4 +106,9 @@ public interface OmsPurchaseOrderMapper
List<OmsPurchaseOrderItem> listByItemId(Long itemId);
void updateOmsPurchaseOrderItem(OmsPurchaseOrderItem updateItem);
void cancelInnerItem(List<OmsPurchaseOrderItem> omsPurchaseOrderItems);
List<OmsPurchaseOrderItem> listItemByCodeList(List<String> collect);
}

View File

@ -72,4 +72,6 @@ public interface ProjectInfoMapper
void updateOrderTimeById(Long projectId);
void updateCustomerCodeByCode(@Param("oldValue") String oldValue, @Param("newValue")String newValue);
ProjectInfo selectProjectInfoByOrderCode(String orderCode);
}

View File

@ -2,6 +2,7 @@ package com.ruoyi.sip.service;
import java.util.List;
import com.ruoyi.sip.domain.OmsPurchaseOrder;
import com.ruoyi.sip.domain.OmsPurchaseOrderItem;
import com.ruoyi.sip.dto.inventory.OmsPurchaseOrderItemDto;
import com.ruoyi.sip.flowable.domain.Todo;
@ -92,4 +93,6 @@ public interface IOmsPurchaseOrderService
List<OmsPurchaseOrderItemDto> listItem(OmsPurchaseOrderItemDto omsPurchaseOrder);
void innerWarehouse(Long itemId, Long quantity);
void cancelInnerItem(List<OmsPurchaseOrderItem> omsPurchaseOrderItems);
}

View File

@ -67,4 +67,5 @@ public interface IProjectInfoService
StatisticsDto homePageData(HomepageQueryDto dto);
ProjectInfo selectProjectInfoByOrderCode(String orderCode);
}

View File

@ -1,5 +1,6 @@
package com.ruoyi.sip.service.impl;
import java.math.BigDecimal;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@ -38,6 +39,8 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
@Autowired
private IProductInfoService productInfoService;
@Autowired
private IProjectInfoService projectInfoService;
@Autowired
private IOmsWarehouseInfoService warehouseInfoService;
@Autowired
private IInventoryAuthService inventoryAuthService;
@ -61,6 +64,14 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
List<InventoryInfo> inventoryInfos = inventoryInfoService.selectInventoryInfoList(queryParams);
omsInventoryInner.setInventoryInfoList(inventoryInfos);
}
if (omsInventoryInner != null && StringUtils.isNotEmpty(omsInventoryInner.getOrderCode())) {
ProjectInfo projectInfo = projectInfoService.selectProjectInfoByOrderCode(omsInventoryInner.getOrderCode());
if (projectInfo != null) {
omsInventoryInner.setProjectCode(projectInfo.getProjectCode());
omsInventoryInner.setProjectName(projectInfo.getProjectName());
}
}
return omsInventoryInner;
}
@ -195,6 +206,18 @@ public class OmsInventoryInnerServiceImpl implements IOmsInventoryInnerService {
throw new ServiceException(StrUtil.format("已发货的入库单[{}]不能删除", String.join(",",innerCodeList)));
}
inventoryInfoService.deleteInventoryInfoByInnerIds(idArray);
//还原入库数量
List<OmsInventoryInner> omsInventoryInners = omsInventoryInnerMapper.listById(idArray);
List<OmsPurchaseOrderItem> omsPurchaseOrderItems = omsInventoryInners.stream().map(item -> {
OmsPurchaseOrderItem omsPurchaseOrderItem = new OmsPurchaseOrderItem();
omsPurchaseOrderItem.setInnerQuantity(BigDecimal.valueOf(item.getQuantity()));
omsPurchaseOrderItem.setProductCode(item.getProductCode());
omsPurchaseOrderItem.setPurchaseNo(item.getPurchaseNo());
return omsPurchaseOrderItem;
}).collect(Collectors.toList());
purchaseOrderService.cancelInnerItem(omsPurchaseOrderItems);
return omsInventoryInnerMapper.deleteOmsInventoryInnerByIds(idArray);
}

View File

@ -309,6 +309,46 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService, To
}
@Override
public void cancelInnerItem(List<OmsPurchaseOrderItem> omsPurchaseOrderItems) {
omsPurchaseOrderMapper.cancelInnerItem(omsPurchaseOrderItems);
List<OmsPurchaseOrderItem> omsPurchaseOrderItemList = omsPurchaseOrderMapper.listItemByCodeList(
omsPurchaseOrderItems.stream().map(OmsPurchaseOrderItem::getPurchaseNo).distinct().collect(Collectors.toList()));
Map<String, List<OmsPurchaseOrderItem>> collect = omsPurchaseOrderItemList.stream().collect(Collectors.groupingBy(OmsPurchaseOrderItem::getPurchaseNo));
for (Map.Entry<String, List<OmsPurchaseOrderItem>> entry : collect.entrySet()) {
// 计算该purchaseNo下所有item的数量总和和已入库数量总和
BigDecimal totalQuantity = entry.getValue().stream()
.map(OmsPurchaseOrderItem::getQuantity)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
BigDecimal totalInnerQuantity = entry.getValue().stream()
.map(OmsPurchaseOrderItem::getInnerQuantity)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
// 根据规则判断状态
int status;
if (totalInnerQuantity.compareTo(BigDecimal.ZERO) == 0) {
// 已入库数量为0表示未完成
status = OmsPurchaseOrder.StatusEnum.WAIT_COMPLETED.getCode();
} else if (totalInnerQuantity.compareTo(totalQuantity) == 0) {
// 已入库数量等于总数量,表示已完成
status = OmsPurchaseOrder.StatusEnum.COMPLETED.getCode();
} else {
// 其他情况为部分完成
status = OmsPurchaseOrder.StatusEnum.PART_COMPLETED.getCode();
}
// 创建更新对象
OmsPurchaseOrder order = new OmsPurchaseOrder();
order.setPurchaseNo(entry.getKey());
order.setStatus(status);
order.setUpdateTime(DateUtils.getNowDate());
omsPurchaseOrderMapper.updateOmsPurchaseOrderByCode(order);
}
}
/**
*

View File

@ -589,6 +589,11 @@ public class ProjectInfoServiceImpl implements IProjectInfoService {
return result;
}
@Override
public ProjectInfo selectProjectInfoByOrderCode(String orderCode) {
return projectInfoMapper.selectProjectInfoByOrderCode(orderCode);
}
private List<ProjectInfo> fetchProjectInfos(ProjectInfo projectInfo) {
List<ProjectInfo> projectInfos = projectInfoMapper.selectProjectInfoList(projectInfo);
if (CollUtil.isEmpty(projectInfos)) {

View File

@ -51,9 +51,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="warehouseId != null "> and t1.warehouse_id = #{warehouseId}</if>
<if test="createBy != null and createBy != ''"> and t1.create_by like concat('%', #{createBy}, '%')</if>
<if test="createByName != null and createByName != ''"> and t3.user_name like concat('%', #{createByName}, '%')</if>
<if test="purchaseNo != null and purchaseNo != ''"> and t1.purchase_no = #{purchaseNo}</if>
<if test="purchaseNo != null and purchaseNo != ''"> and t1.purchase_no like concat('%', #{purchaseNo}, '%')</if>
<if test="productType != null and productType != ''"> and t1.product_type = #{productType}</if>
<if test="orderCode != null and orderCode != ''"> and t1.order_code = #{orderCode}</if>
<if test="productTypeList != null and productTypeList.size>0"> and t1.product_type in
<foreach item="productType" collection="productTypeList" open="(" separator="," close=")">#{productType}</foreach></if>
<if test="orderCode != null and orderCode != ''"> and t1.order_code like concat('%', #{orderCode}, '%')</if>
<if test="(params.beginCreateTime != null and params.beginCreateTime != '') or (params.endCreateTime != null and params.endCreateTime!='')">
<choose>
<when test="(params.beginCreateTime != null and params.beginCreateTime != '') and (params.endCreateTime != null and params.endCreateTime!='')">
@ -92,6 +94,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
and inventory_status=1
</select>
<select id="listById" resultType="com.ruoyi.sip.domain.OmsInventoryInner">
<include refid="selectOmsInventoryInnerVo"/>
where t1.id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<insert id="insertOmsInventoryInner" parameterType="OmsInventoryInner" useGeneratedKeys="true" keyProperty="id">

View File

@ -179,6 +179,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
left join oms_vendor_info t4 on t2.vendor_id=t4.vendor_id
<where>
<if test="purchaseNo != null and purchaseNo != ''">and t2.purchase_no = #{purchaseNo}</if>
<if test="type != null and 'inner'.toString() == type">and t1.quantity != t1.inner_quantity</if>
<if test="productCode != null and productCode != '' ">and t1.product_code = #{productCode}</if>
<if test="productType != null">and t3.type = #{productType}</if>
<if test="vendorName != null and vendorName != ''">and t4.vendor_name = #{vendorName}</if>
@ -198,6 +199,27 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
inner JOIN oms_purchase_order_item opoi ON t1.purchase_id = opoi.purchase_id
WHERE opoi.id = #{itemId};
</select>
<select id="listItemByCodeList" resultType="com.ruoyi.sip.domain.OmsPurchaseOrderItem">
SELECT
t1.id,
t1.purchase_id,
t1.product_code,
t1.quantity,
t1.price,
t1.tax_rate,
t1.tax_total,
t1.amount_total,
t1.delivery_date,
t1.inner_quantity,
opo.purchase_no
FROM
oms_purchase_order_item t1
inner join oms_purchase_order opo on t1.purchase_id = opo.id
where opo.purchase_no in
<foreach item="item" collection="list" separator="," open="(" close=")">
#{item}
</foreach>
</select>
<insert id="insertOmsPurchaseOrder" parameterType="OmsPurchaseOrder" useGeneratedKeys="true" keyProperty="id">
insert into oms_purchase_order
@ -379,6 +401,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<delete id="deleteOmsPurchaseOrderItemByPurchaseId" parameterType="Long">
delete from oms_purchase_order_item where purchase_id = #{purchaseId}
</delete>
<update id="cancelInnerItem">
<foreach collection="list" item="item" index="index" separator=";">
update oms_purchase_order_item t1
left join oms_purchase_order t2 on t1.purchase_id = t2.id
set t1.inner_quantity = t1.inner_quantity- #{item.innerQuantity}
where t1.product_code = #{item.productCode} and t2.purchase_no=#{item.purchaseNo}
</foreach>
</update>
<insert id="batchOmsPurchaseOrderItem">
insert into oms_purchase_order_item( purchase_id, product_code, inner_quantity, quantity, price, tax_rate, tax_total, amount_total,delivery_date) values

View File

@ -202,6 +202,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectProjectInfoByOrderCode" resultType="com.ruoyi.sip.domain.ProjectInfo">
<include refid="selectRelationProjectInfoVo"/>
where t1.id in (select project_id from project_order_info where order_code = #{orderCode})
</select>
<insert id="insertProjectInfo" parameterType="ProjectInfo" useGeneratedKeys="true" keyProperty="id">
insert into project_info