feat(biz): 添加采购订单模块功能

This commit is contained in:
zxy 2026-05-18 17:04:07 +08:00
parent bba176ebec
commit cd99537ba5
10 changed files with 93 additions and 61 deletions

View File

@ -91,4 +91,12 @@ public class PurOrderController {
BeanUtils.toBean(list, PurOrderRespVO.class));
}
// 审批接口通过驳回 审计
@PutMapping("/audit")
@Operation(summary = "审批采购订单主")
@PreAuthorize("@ss.hasPermission('tsc:pur-order:approve')")
public CommonResult<Boolean> approvePurOrder(@RequestBody PurOrderSaveReqVO approveReqVO) {
purOrderService.approvePurOrder(approveReqVO.getIds(), approveReqVO.getPurStatus());
return success(true);
}
}

View File

@ -19,6 +19,8 @@ public class PurOrderSaveReqVO {
@Schema(description = "自增字段", requiredMode = Schema.RequiredMode.REQUIRED, example = "5253")
private Integer id;
private List<Integer> ids;
@Schema(description = "采购订单号(CGDD+年份+月份+3位流水号)")
private String purOrdNo;

View File

@ -6,6 +6,7 @@ import com.ningxia.yunxi.chemmes.module.biz.controller.admin.purorder.vo.PurOrde
import com.ningxia.yunxi.chemmes.module.biz.dal.dataobject.purorder.PurOrderDO;
import javax.validation.Valid;
import java.util.List;
/**
* 采购订单主 Service 接口
@ -60,4 +61,5 @@ public interface PurOrderService {
*/
PurOrderSaveReqVO getPurOrderWithItems(Integer id);
void approvePurOrder(List<Integer> ids, String approveResult);
}

View File

@ -53,6 +53,10 @@ public class PurOrderServiceImpl implements PurOrderService {
validatePurOrderExists(updateReqVO.getId());
// 更新
PurOrderDO updateObj = BeanUtils.toBean(updateReqVO, PurOrderDO.class);
// 已驳回
if ("4".equals(updateObj.getPurStatus())) {
updateObj.setPurStatus("1");
}
purOrderMapper.updateById(updateObj);
updatePurOrderItemList(updateReqVO.getId(), updateReqVO.getItemList());
@ -77,7 +81,13 @@ public class PurOrderServiceImpl implements PurOrderService {
@Override
public void deletePurOrder(Integer id) {
// 校验存在
validatePurOrderExists(id);
PurOrderDO purOrderDO = purOrderMapper.selectById(id);
if (purOrderDO == null) {
throw exception("采购订单不存在,请刷新页面!");
}
if ("2".equals(purOrderDO.getPurStatus()) || "3".equals(purOrderDO.getPurStatus())) {
throw exception("该采购单已确认或审批不允许删除,请刷新界面!");
}
// 删除
purOrderMapper.deleteById(id);
}
@ -135,4 +145,21 @@ public class PurOrderServiceImpl implements PurOrderService {
}
@Override
@Transactional(rollbackFor = Exception.class)
public void approvePurOrder(List<Integer> ids, String approveResult) {
for (Integer id : ids) {
PurOrderDO purOrderDO = purOrderMapper.selectById(id);
if (purOrderDO == null) {
throw exception("采购订单不存在,请刷新页面!");
}
if (!"2".equals(purOrderDO.getPurStatus())) {
throw exception("采购订单状态不等于已确认,请刷新界面!");
}
purOrderDO.setPurStatus(approveResult);
purOrderMapper.updateById(purOrderDO);
}
}
}

View File

@ -51,3 +51,8 @@ export const deletePurOrder = async (id: number) => {
export const exportPurOrder = async (params) => {
return await request.download({ url: `/tsc/pur-order/export-excel`, params })
}
// 审批采购订单主
export const auditPurOrder = async (ids: number[], purStatus: string) => {
return await request.put({ url: `/tsc/pur-order/audit`, data: { ids, purStatus } })
}

View File

@ -11,6 +11,7 @@ declare module 'vue' {
AppLinkSelectDialog: typeof import('./../components/AppLinkInput/AppLinkSelectDialog.vue')['default']
Backtop: typeof import('./../components/Backtop/src/Backtop.vue')['default']
CardTitle: typeof import('./../components/Card/src/CardTitle.vue')['default']
'CheckstyleIdea.xml': typeof import('./../../.idea/checkstyle-idea.xml.tmp')['default']
ColorInput: typeof import('./../components/ColorInput/index.vue')['default']
ComponentContainer: typeof import('./../components/DiyEditor/components/ComponentContainer.vue')['default']
ComponentContainerProperty: typeof import('./../components/DiyEditor/components/ComponentContainerProperty.vue')['default']

View File

@ -1,5 +1,5 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1200px">
<Dialog :title="dialogTitle" v-model="dialogVisible" width="1500px">
<el-form
ref="formRef"
:model="formData"
@ -29,10 +29,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="单据状态">
<el-tag v-if="formData.purStatus === '1'" type="info">已创建</el-tag>
<el-tag v-else-if="formData.purStatus === '2'" type="warning">已确认</el-tag>
<el-tag v-else-if="formData.purStatus === '3'" type="success">已审批</el-tag>
<el-tag v-else-if="formData.purStatus === '4'" type="danger">已驳回</el-tag>
<el-input v-model="formData.purStatus" disabled :value="formData.purStatus === '1' ? '已创建' : formData.purStatus === '2' ? '已确认' : formData.purStatus === '3' ? '已审批' : '已驳回'" />
</el-form-item>
</el-col>
</el-row>
@ -74,24 +71,29 @@
</template>
<el-table :data="itemList" show-summary border :summary-method="getSummary">
<el-table-column label="序号" type="index" width="60px" align="center" />
<el-table-column label="物料编码" prop="materialCode" width="120px" align="center" />
<el-table-column label="物料名称" prop="materialName" width="150px" align="center" />
<el-table-column label="规格型号" prop="spec" width="100px" align="center" />
<el-table-column label="单位" prop="unit" width="80px" align="center" />
<el-table-column label="采购数量" prop="purQty" width="100px" align="center" />
<el-table-column label="要求交货日期" prop="reqDeliveryDate" width="130px" align="center" />
<el-table-column label="采购单价" prop="priceTax" width="100px" align="center">
<el-table-column label="物料编码" prop="materialCode" align="center" />
<el-table-column label="物料名称" prop="materialName" align="center" />
<el-table-column label="收货状态" prop="acceptStatus" align="center">
<template #default="scope">
{{ scope.row.acceptStatus === '1' ? '已收货' : '未收货' }}
</template>
</el-table-column>
<el-table-column label="收货数量" prop="acceptQty" align="center" />
<el-table-column label="单位" prop="unit" align="center" />
<el-table-column label="规格型号" prop="spec" align="center" />
<el-table-column label="采购数量" prop="purQty" align="center" />
<el-table-column label="要求交货日期" prop="reqDeliveryDate" align="center" />
<el-table-column label="采购单价" prop="priceTax" align="center">
<template #default="scope">
<span style="color: #409EFF;">{{ scope.row.priceTax }}</span>
</template>
</el-table-column>
<el-table-column label="税率(%)" prop="taxRatio" width="80px" align="center">
<el-table-column label="采购总价" prop="totalPrice" align="center" />
<el-table-column label="税率" prop="taxRatio" align="center">
<template #default="scope">
{{ scope.row.taxRatio }}%
</template>
</el-table-column>
<el-table-column label="采购总价" prop="totalPrice" width="100px" align="center" />
<el-table-column label="备注" prop="remark" width="100px" align="center" />
</el-table>
</el-card>
</el-form>
@ -135,14 +137,7 @@ const open = async (id: number) => {
try {
const data = await PurOrderApi.getPurOrder(id)
Object.assign(formData, data)
//
const itemData = await PurOrderItemApi.getPurOrderItemPage({
pageNo: 1,
pageSize: 100,
purId: id
})
itemList.value = (itemData.list || []).map((item: any) => ({
itemList.value = (data.itemList || []).map((item: any) => ({
materialCode: item.materialCode,
materialName: item.materialName,
spec: item.spec,

View File

@ -252,6 +252,7 @@ import * as UserApi from '@/api/system/user'
import { handleTree } from '@/utils/tree'
import MoneyInput from '../components/MoneyInput.vue'
import { getDictOptions } from '@/utils/dict'
import * as DeptApi from '@/api/system/dept'
const { t } = useI18n()
const message = useMessage()
@ -266,10 +267,10 @@ const supplierOptions = ref<any[]>([])
const supplierLoading = ref(false)
//
const deptList = ref<any[]>([])
const deptList = ref<DeptApi.DeptVO[]>([])
//
const userList = ref<any[]>([])
const userList = ref<UserApi.UserVO[]>([])
const userSelectLoading = ref(false)
//
@ -308,9 +309,11 @@ const itemList = ref<any[]>([])
const formRules = reactive({
purDate: [{ required: true, message: '订单日期不能为空', trigger: 'change' }],
billType: [{ required: true, message: '单据类型不能为空', trigger: 'change' }],
applyType: [{ required: true, message: '申请类型不能为空', trigger: 'change' }],
supplierId: [{ required: true, message: '供应商不能为空', trigger: 'change' }],
purDeptId: [{ required: true, message: '采购部门不能为空', trigger: 'change' }],
purEmpId: [{ required: true, message: '采购人员不能为空', trigger: 'change' }],
purStatus: [{ required: true, message: '单据状态不能为空', trigger: 'change' }],
acceptMeth: [{ required: true, message: '验收方式不能为空', trigger: 'change' }],
})
const formRef = ref()

View File

@ -97,16 +97,16 @@
@selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="50px" align="center" />
<el-table-column label="序号" align="center" type="index" width="60px"/>
<el-table-column label="单据类型" align="center" prop="billType" width="160px">
<el-table-column label="序号" align="center" type="index" width="60px" />
<el-table-column label="单据类型" align="center" prop="billType">
<template #default="scope">
{{ scope.row.billType === '1' ? '标准采购申请' : '设备采购申请' }}
</template>
</el-table-column>
<el-table-column label="采购订单号" align="center" prop="purOrdNo" width="160px" />
<el-table-column label="订单日期" align="center" prop="purDate" width="140px" />
<el-table-column label="采购订单号" align="center" prop="purOrdNo" />
<el-table-column label="订单日期" align="center" prop="purDate" />
<el-table-column label="供应商名称" align="center" prop="supplierName" width="300px" />
<el-table-column label="单据状态" align="center" prop="purStatus" width="120px">
<el-table-column label="单据状态" align="center" prop="purStatus">
<template #default="scope">
<el-tag v-if="scope.row.purStatus === '1'" type="info">已创建</el-tag>
<el-tag v-else-if="scope.row.purStatus === '2'" type="warning">已确认</el-tag>
@ -114,17 +114,17 @@
<el-tag v-else-if="scope.row.purStatus === '4'" type="danger">已驳回</el-tag>
</template>
</el-table-column>
<el-table-column label="收货状态" align="center" prop="deliveryStatus" width="120px">
<el-table-column label="收货状态" align="center" prop="deliveryStatus" >
<template #default="scope">
{{ scope.row.deliveryStatus === '1' ? '未收货' : scope.row.deliveryStatus === '2' ? '部分收货' : '全部收货' }}
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200px">
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button
link
type="primary"
v-if="scope.row.purStatus === '1'"
v-if="scope.row.purStatus === '1' || scope.row.purStatus === '4'"
@click.stop="openForm('update', scope.row.id)"
v-hasPermi="['biz:pur-order:update']"
>
@ -173,10 +173,10 @@
:summary-method="getItemSummary"
border
>
<el-table-column label="序号" align="center" type="index" width="60px"/>
<el-table-column label="物料编码" align="center" prop="materialCode" width="120px" />
<el-table-column label="物料名称" align="center" prop="materialName" width="200px" />
<el-table-column label="收货状态" align="center" prop="deliveryStatus" width="100px">
<el-table-column label="序号" align="center" type="index" width="60px" />
<el-table-column label="物料编码" align="center" prop="materialCode" />
<el-table-column label="物料名称" align="center" prop="materialName" />
<el-table-column label="收货状态" align="center" prop="deliveryStatus">
<template #default="scope">
{{ scope.row.deliveryStatus === '1' ? '未收货' : scope.row.deliveryStatus === '2' ? '部分收货' : '全部收货' }}
</template>
@ -188,16 +188,16 @@
</template>
</el-table-column>
<el-table-column label="规格型号" align="center" prop="spec" width="120px" />
<el-table-column label="采购数量" align="center" prop="purQty" width="100px" />
<el-table-column label="要求交货日期" align="center" prop="reqDeliveryDate" width="150px" />
<el-table-column label="采购单价" align="center" prop="priceTax" width="100px">
<el-table-column label="规格型号" align="center" prop="spec" />
<el-table-column label="采购数量" align="center" prop="purQty" />
<el-table-column label="要求交货日期" align="center" prop="reqDeliveryDate" />
<el-table-column label="采购单价" align="center" prop="priceTax">
<template #default="scope">
<span style="color: #409EFF;">{{ scope.row.priceTax }}</span>
</template>
</el-table-column>
<el-table-column label="采购总价" align="center" prop="totalPrice" width="100px" />
<el-table-column label="税率" align="center" prop="taxRatio" width="80px">
<el-table-column label="采购总价" align="center" prop="totalPrice" />
<el-table-column label="税率" align="center" prop="taxRatio">
<template #default="scope">
{{ scope.row.taxRatio || 0 }}%
</template>
@ -338,6 +338,7 @@ const handleDelete = async (id: number) => {
}
}
/** 审批操作 */
const handleAudit = async () => {
if (selectedIds.value.length === 0) {
@ -347,6 +348,7 @@ const handleAudit = async () => {
try {
await message.confirm('确认审批选中的采购订单吗?')
// API
await PurOrderApi.auditPurOrder(selectedIds.value, '3')
message.success('审批成功')
getList()
} catch (error) {
@ -363,6 +365,7 @@ const handleReject = async () => {
try {
await message.confirm('确认驳回选中的采购订单吗?')
// API
await PurOrderApi.auditPurOrder(selectedIds.value, '4')
message.success('驳回成功')
getList()
} catch (error) {

View File

@ -492,20 +492,6 @@ const formRules = reactive({
const emit = defineEmits(['success', 'close'])
/** 详情偶发多包一层:根上无 items但 data.items 为数组时取内层 */
const unwrapOrderDetail = (raw: Record<string, any>) => {
if (!raw || typeof raw !== 'object') {
return raw
}
if (Array.isArray(raw.items)) {
return raw
}
const inner = raw.data
if (inner && typeof inner === 'object' && !Array.isArray(inner) && Array.isArray(inner.items)) {
return inner
}
return raw
}
/** 获取业务部门列表 */
const loadDeptList = async () => {