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

- 在前端页面增加"申请采购"按钮及权限控制
- 实现采购单状态更新接口与业务逻辑
- 添加采购单版本号字段以支持历史记录追踪
- 完善采购单修改时的历史数据保存机制
- 增加申请采购确认弹窗提示用户体验
- 控制仅在待提交或驳回状态下可进行申请操作
master
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) { export function delPurchaseorder(id) {
return request({ return request({

View File

@ -121,6 +121,7 @@
<el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right"> <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
v-if="scope.row.approveStatus === 0 || scope.row.approveStatus === 3"
size="mini" size="mini"
type="text" type="text"
icon="el-icon-edit" icon="el-icon-edit"
@ -129,6 +130,16 @@
>修改 >修改
</el-button> </el-button>
<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" size="mini"
type="text" type="text"
icon="el-icon-delete" icon="el-icon-delete"
@ -168,7 +179,8 @@ import {
getPurchaseorder, getPurchaseorder,
delPurchaseorder, delPurchaseorder,
addPurchaseorder, addPurchaseorder,
updatePurchaseorder updatePurchaseorder,
applyPurchaseorder
} from "@/api/sip/purchaseorder"; } from "@/api/sip/purchaseorder";
import PurchaseOrderDetail from './components/PurchaseOrderDetail'; import PurchaseOrderDetail from './components/PurchaseOrderDetail';
@ -293,6 +305,18 @@ export default {
this.$modal.msgSuccess("删除成功"); this.$modal.msgSuccess("删除成功");
}).catch(() => { }).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)); 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删除 */ /** 删除标志0正常 1删除 */
private Integer delFlag; private Integer delFlag;
/** 版本号 */
private Integer version;
/** 采购单明细表信息 */ /** 采购单明细表信息 */
private List<OmsPurchaseOrderItem> omsPurchaseOrderItemList; private List<OmsPurchaseOrderItem> omsPurchaseOrderItemList;

View File

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

View File

@ -43,6 +43,14 @@ public interface IOmsPurchaseOrderService
*/ */
public int updateOmsPurchaseOrder(OmsPurchaseOrder omsPurchaseOrder); 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 cn.hutool.core.collection.CollUtil;
import com.ruoyi.common.exception.ServiceException; import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils; import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.sip.domain.Cnarea; import com.ruoyi.sip.domain.*;
import com.ruoyi.sip.domain.VendorInfo; import com.ruoyi.sip.mapper.OmsPurchaseOrderItemHistoryMapper;
import com.ruoyi.sip.mapper.OmsPurchaseOrderHistoryMapper;
import com.ruoyi.sip.service.ICnareaService; import com.ruoyi.sip.service.ICnareaService;
import com.ruoyi.sip.service.IVendorInfoService; import com.ruoyi.sip.service.IVendorInfoService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.ArrayList; import java.util.ArrayList;
import com.ruoyi.common.utils.StringUtils; import com.ruoyi.common.utils.StringUtils;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.ruoyi.sip.domain.OmsPurchaseOrderItem;
import com.ruoyi.sip.mapper.OmsPurchaseOrderMapper; import com.ruoyi.sip.mapper.OmsPurchaseOrderMapper;
import com.ruoyi.sip.domain.OmsPurchaseOrder;
import com.ruoyi.sip.service.IOmsPurchaseOrderService; import com.ruoyi.sip.service.IOmsPurchaseOrderService;
import javax.annotation.Resource; import javax.annotation.Resource;
/** /**
* Service * Service
* *
* @author ruoyi * @author ruoyi
* @date 2025-11-24 * @date 2025-11-24
*/ */
@Service @Service
public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
{ {
@Resource @Resource
private OmsPurchaseOrderMapper omsPurchaseOrderMapper; private OmsPurchaseOrderMapper omsPurchaseOrderMapper;
@Resource
private OmsPurchaseOrderHistoryMapper omsPurchaseOrderHistoryMapper;
@Resource
private OmsPurchaseOrderItemHistoryMapper omsPurchaseOrderItemHistoryMapper;
@Autowired @Autowired
private ICnareaService cnareaService; private ICnareaService cnareaService;
@Autowired @Autowired
private IVendorInfoService vendorInfoService; private IVendorInfoService vendorInfoService;
/** /**
* *
* *
* @param id * @param id
* @return * @return
*/ */
@ -54,7 +61,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/** /**
* *
* *
* @param omsPurchaseOrder * @param omsPurchaseOrder
* @return * @return
*/ */
@ -66,7 +73,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/** /**
* *
* *
* @param omsPurchaseOrder * @param omsPurchaseOrder
* @return * @return
*/ */
@ -76,6 +83,8 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
{ {
omsPurchaseOrder.setCreateTime(DateUtils.getNowDate()); omsPurchaseOrder.setCreateTime(DateUtils.getNowDate());
omsPurchaseOrder.setPurchaseNo(generatePurchaseNo(omsPurchaseOrder.getVendorId())); omsPurchaseOrder.setPurchaseNo(generatePurchaseNo(omsPurchaseOrder.getVendorId()));
// 设置初始版本号为 1
omsPurchaseOrder.setVersion(1);
int rows = omsPurchaseOrderMapper.insertOmsPurchaseOrder(omsPurchaseOrder); int rows = omsPurchaseOrderMapper.insertOmsPurchaseOrder(omsPurchaseOrder);
insertOmsPurchaseOrderItem(omsPurchaseOrder); insertOmsPurchaseOrderItem(omsPurchaseOrder);
return rows; return rows;
@ -84,7 +93,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/** /**
* *
* *
* @param province * @param vendorId ID
* @return * @return
*/ */
@ -115,7 +124,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
} }
/** /**
* *
* *
* @param omsPurchaseOrder * @param omsPurchaseOrder
* @return * @return
*/ */
@ -123,15 +132,55 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
@Override @Override
public int updateOmsPurchaseOrder(OmsPurchaseOrder omsPurchaseOrder) 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()); omsPurchaseOrder.setUpdateTime(DateUtils.getNowDate());
// 版本号 +1
omsPurchaseOrder.setVersion(oldOrder.getVersion() + 1);
omsPurchaseOrderMapper.deleteOmsPurchaseOrderItemByPurchaseId(omsPurchaseOrder.getId()); omsPurchaseOrderMapper.deleteOmsPurchaseOrderItemByPurchaseId(omsPurchaseOrder.getId());
insertOmsPurchaseOrderItem(omsPurchaseOrder); insertOmsPurchaseOrderItem(omsPurchaseOrder);
return omsPurchaseOrderMapper.updateOmsPurchaseOrder(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 * @param ids
* @return * @return
*/ */
@ -145,7 +194,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/** /**
* *
* *
* @param id * @param id
* @return * @return
*/ */
@ -159,7 +208,7 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
/** /**
* *
* *
* @param omsPurchaseOrder * @param omsPurchaseOrder
*/ */
public void insertOmsPurchaseOrderItem(OmsPurchaseOrder omsPurchaseOrder) public void insertOmsPurchaseOrderItem(OmsPurchaseOrder omsPurchaseOrder)
@ -181,3 +230,4 @@ public class OmsPurchaseOrderServiceImpl implements IOmsPurchaseOrderService
} }
} }
} }