feat(purchaseorder): 添加申请采购功能并优化订单版本控制

- 在前端页面增加"申请采购"按钮及权限控制
- 实现采购单状态更新接口与业务逻辑
- 添加采购单版本号字段以支持历史记录追踪
- 完善采购单修改时的历史数据保存机制
- 增加申请采购确认弹窗提示用户体验
- 控制仅在待提交或驳回状态下可进行申请操作
dev_1.0.0
chenhao 2025-11-26 10:46:35 +08:00
parent 4576eaf1df
commit 576475f46e
7 changed files with 122 additions and 15 deletions

View File

@ -35,6 +35,15 @@ export function updatePurchaseorder(data) {
})
}
// 申请采购单主表
export function applyPurchaseorder(data) {
return request({
url: '/sip/purchaseorder/apply',
method: 'put',
data: data
})
}
// 删除采购单主表
export function delPurchaseorder(id) {
return request({

View File

@ -121,6 +121,7 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope">
<el-button
v-if="scope.row.approveStatus === 0 || scope.row.approveStatus === 3"
size="mini"
type="text"
icon="el-icon-edit"
@ -129,6 +130,16 @@
>修改
</el-button>
<el-button
v-if="scope.row.approveStatus === 0 || scope.row.approveStatus === 3"
size="mini"
type="text"
icon="el-icon-s-promotion"
@click="handleApply(scope.row)"
v-hasPermi="['sip:purchaseorder:edit']"
>申请采购
</el-button>
<el-button
v-if="scope.row.approveStatus === 0 || scope.row.approveStatus === 3"
size="mini"
type="text"
icon="el-icon-delete"
@ -168,7 +179,8 @@ import {
getPurchaseorder,
delPurchaseorder,
addPurchaseorder,
updatePurchaseorder
updatePurchaseorder,
applyPurchaseorder
} from "@/api/sip/purchaseorder";
import PurchaseOrderDetail from './components/PurchaseOrderDetail';
@ -293,6 +305,18 @@ export default {
this.$modal.msgSuccess("删除成功");
}).catch(() => {
});
},
/** 申请采购按钮操作 */
handleApply(row) {
this.$modal.confirm('是否确认申请采购编号为"' + row.purchaseNo + '"的数据项?').then(() => {
let form = {...row};
form.approveStatus = 1; // 1 ()
return applyPurchaseorder(form);
}).then(() => {
this.getList();
this.$modal.msgSuccess("申请采购成功");
}).catch(() => {
});
}
}
};

View File

@ -85,6 +85,17 @@ public class OmsPurchaseOrderController extends BaseController
return toAjax(omsPurchaseOrderService.updateOmsPurchaseOrder(omsPurchaseOrder));
}
/**
*
*/
@RequiresPermissions("sip:purchaseorder:edit")
@Log(title = "采购单主表", businessType = BusinessType.UPDATE)
@PutMapping("/apply")
public AjaxResult apply(@RequestBody OmsPurchaseOrder omsPurchaseOrder)
{
return toAjax(omsPurchaseOrderService.applyForPurchaseOrder(omsPurchaseOrder));
}
/**
*
*/

View File

@ -84,6 +84,9 @@ public class OmsPurchaseOrder extends BaseEntity
/** 删除标志0正常 1删除 */
private Integer delFlag;
/** 版本号 */
private Integer version;
/** 采购单明细表信息 */
private List<OmsPurchaseOrderItem> omsPurchaseOrderItemList;

View File

@ -88,4 +88,6 @@ public interface OmsPurchaseOrderMapper
int selectMaxOrderCode(String string);
List<OmsPurchaseOrderItem> listItemByPurchaseId(Long id);
int updateOmsPurchaseOrderStatus(OmsPurchaseOrder omsPurchaseOrder);
}

View File

@ -43,6 +43,14 @@ public interface IOmsPurchaseOrderService
*/
public int updateOmsPurchaseOrder(OmsPurchaseOrder omsPurchaseOrder);
/**
*
*
* @param omsPurchaseOrder
* @return
*/
public int applyForPurchaseOrder(OmsPurchaseOrder omsPurchaseOrder);
/**
*
*

View File

@ -5,40 +5,47 @@ import java.util.List;
import cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.sip.domain.Cnarea;
import com.ruoyi.sip.domain.VendorInfo;
import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.mapper.OmsPurchaseOrderItemHistoryMapper;
import com.ruoyi.sip.mapper.OmsPurchaseOrderHistoryMapper;
import com.ruoyi.sip.service.ICnareaService;
import com.ruoyi.sip.service.IVendorInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.sip.domain.OmsPurchaseOrderItem;
import com.ruoyi.sip.mapper.OmsPurchaseOrderMapper;
import com.ruoyi.sip.domain.OmsPurchaseOrder;
import com.ruoyi.sip.service.IOmsPurchaseOrderService;
import javax.annotation.Resource;
/**
* Service
*
*
* @author ruoyi
* @date 2025-11-24
*/
@Service
public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
{
@Resource
private OmsPurchaseOrderMapper omsPurchaseOrderMapper;
@Resource
private OmsPurchaseOrderHistoryMapper omsPurchaseOrderHistoryMapper;
@Resource
private OmsPurchaseOrderItemHistoryMapper omsPurchaseOrderItemHistoryMapper;
@Autowired
private ICnareaService cnareaService;
@Autowired
private IVendorInfoService vendorInfoService;
/**
*
*
*
* @param id
* @return
*/
@ -54,7 +61,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/**
*
*
*
* @param omsPurchaseOrder
* @return
*/
@ -66,7 +73,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/**
*
*
*
* @param omsPurchaseOrder
* @return
*/
@ -76,6 +83,8 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
{
omsPurchaseOrder.setCreateTime(DateUtils.getNowDate());
omsPurchaseOrder.setPurchaseNo(generatePurchaseNo(omsPurchaseOrder.getVendorId()));
// 设置初始版本号为 1
omsPurchaseOrder.setVersion(1);
int rows = omsPurchaseOrderMapper.insertOmsPurchaseOrder(omsPurchaseOrder);
insertOmsPurchaseOrderItem(omsPurchaseOrder);
return rows;
@ -84,7 +93,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/**
*
*
* @param province
* @param vendorId ID
* @return
*/
@ -115,7 +124,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
}
/**
*
*
*
* @param omsPurchaseOrder
* @return
*/
@ -123,15 +132,55 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
@Override
public int updateOmsPurchaseOrder(OmsPurchaseOrder omsPurchaseOrder)
{
// 1. 查询旧的订单信息
OmsPurchaseOrder oldOrder = omsPurchaseOrderMapper.selectOmsPurchaseOrderById(omsPurchaseOrder.getId());
if (oldOrder == null) {
throw new ServiceException("订单不存在");
}
// 2. 保存历史记录
saveOrderHistory(oldOrder);
// 3. 更新订单信息
omsPurchaseOrder.setUpdateTime(DateUtils.getNowDate());
// 版本号 +1
omsPurchaseOrder.setVersion(oldOrder.getVersion() + 1);
omsPurchaseOrderMapper.deleteOmsPurchaseOrderItemByPurchaseId(omsPurchaseOrder.getId());
insertOmsPurchaseOrderItem(omsPurchaseOrder);
return omsPurchaseOrderMapper.updateOmsPurchaseOrder(omsPurchaseOrder);
}
@Override
public int applyForPurchaseOrder(OmsPurchaseOrder omsPurchaseOrder) {
omsPurchaseOrder.setUpdateTime(DateUtils.getNowDate());
return omsPurchaseOrderMapper.updateOmsPurchaseOrderStatus(omsPurchaseOrder);
}
private void saveOrderHistory(OmsPurchaseOrder oldOrder) {
// 复制主表信息到历史表
OmsPurchaseOrderHistory historyOrder = new OmsPurchaseOrderHistory();
BeanUtils.copyProperties(oldOrder, historyOrder);
historyOrder.setPurchaseId(oldOrder.getId()); // 设置原始订单ID
omsPurchaseOrderHistoryMapper.insertOmsPurchaseOrderHistory(historyOrder);
// 复制子表信息到历史表
List<OmsPurchaseOrderItem> oldItems = omsPurchaseOrderMapper.listItemByPurchaseId(oldOrder.getId());
if (CollUtil.isNotEmpty(oldItems)) {
List<OmsPurchaseOrderItemHistory> historyItems = new ArrayList<>();
for (OmsPurchaseOrderItem oldItem : oldItems) {
OmsPurchaseOrderItemHistory historyItem = new OmsPurchaseOrderItemHistory();
BeanUtils.copyProperties(oldItem, historyItem);
historyItem.setPurchaseHistoryId(historyOrder.getId()); // 设置历史主表ID
historyItem.setOriginalPurchaseId(oldOrder.getId()); // 设置原始订单ID
historyItems.add(historyItem);
}
omsPurchaseOrderItemHistoryMapper.batchOmsPurchaseOrderItemHistory(historyItems);
}
}
/**
*
*
*
* @param ids
* @return
*/
@ -145,7 +194,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/**
*
*
*
* @param id
* @return
*/
@ -159,7 +208,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/**
*
*
*
* @param omsPurchaseOrder
*/
public void insertOmsPurchaseOrderItem(OmsPurchaseOrder omsPurchaseOrder)
@ -181,3 +230,4 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
}
}
}