采购订单审核 UI/UX 接口逻辑完成

采购订单审核 UI/UX 接口逻辑完成
pull/4/head
siontion 8 months ago
parent be72e4f37f
commit a987166ca9

@ -1,5 +1,8 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanRespVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -79,6 +82,14 @@ public class PurchaseOrderController {
return success(BeanUtils.toBean(pageResult, PurchaseOrderRespVO.class));
}
@GetMapping("/page-by-status")
@Operation(summary = "获得生产计划分页")
@PreAuthorize("@ss.hasPermission('heli:purchase-order:query')")
public CommonResult<PageResult<PurchaseOrderRespVO>> getPurchaseOrderPageByStatus(@Valid PurchaseOrderPageReqVO pageReqVO) {
PageResult<PurchaseOrderDO> pageResult = purchaseOrderService.getPurchaseOrderPageByStatus(pageReqVO);
return success(BeanUtils.toBean(pageResult, PurchaseOrderRespVO.class));
}
@GetMapping("/export-excel")
@Operation(summary = "导出采购订单 Excel")
@PreAuthorize("@ss.hasPermission('heli:purchase-order:export')")

@ -48,7 +48,7 @@ public class PurchaseOrderSaveReqVO {
private BigDecimal actualPrice;
@Schema(description = "状态,1已保存2已送审3已审核4已打回 默认是1")
private Boolean status;
private Integer status;
@Schema(description = "送审人")
private Long submitUserId;

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
@ -50,4 +51,28 @@ public class PurchaseOrderMaterialRespVO {
@ExcelProperty("创建时间")
private LocalDateTime createTime;
@Schema(description = "物料id", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("物料id")
private Long matId;
@Schema(description = "备注")
@ExcelProperty("物料名称")
private String matName;
@Schema(description = "备注")
@ExcelProperty("物料编码")
private String matCode;
@Schema(description = "备注")
@ExcelProperty("物料规格型号")
private String matSpec;
@Schema(description = "备注")
@ExcelProperty("物料单位")
private String matUnit;
@Schema(description = "备注")
@ExcelProperty("物料类型")
private String matType;
}

@ -59,4 +59,17 @@ public class PurchaseOrderMaterialDO extends BaseDO {
*/
private String description;
@TableField(exist = false)
private Long matId;
@TableField(exist = false)
private String matName;
@TableField(exist = false)
private String matCode;
@TableField(exist = false)
private String matSpec;
@TableField(exist = false)
private String matUnit;
@TableField(exist = false)
private String matType;
}

@ -5,7 +5,11 @@ import java.util.*;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplandetail.vo.MaterialPlanDetailPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.material.MaterialDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplandetail.MaterialPlanDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermaterial.PurchaseOrderMaterialDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.vo.*;
@ -18,16 +22,28 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermaterial.v
public interface PurchaseOrderMaterialMapper extends BaseMapperX<PurchaseOrderMaterialDO> {
default PageResult<PurchaseOrderMaterialDO> selectPage(PurchaseOrderMaterialPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<PurchaseOrderMaterialDO>()
.eqIfPresent(PurchaseOrderMaterialDO::getPurchaseOrderId, reqVO.getPurchaseOrderId())
.eqIfPresent(PurchaseOrderMaterialDO::getMaterialId, reqVO.getMaterialId())
.eqIfPresent(PurchaseOrderMaterialDO::getPurchaseAmount, reqVO.getPurchaseAmount())
.eqIfPresent(PurchaseOrderMaterialDO::getEstimatedPrice, reqVO.getEstimatedPrice())
.eqIfPresent(PurchaseOrderMaterialDO::getActualPrice, reqVO.getActualPrice())
.betweenIfPresent(PurchaseOrderMaterialDO::getArriveTime, reqVO.getArriveTime())
.eqIfPresent(PurchaseOrderMaterialDO::getDescription, reqVO.getDescription())
.betweenIfPresent(PurchaseOrderMaterialDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(PurchaseOrderMaterialDO::getId));
MPJLambdaWrapper<PurchaseOrderMaterialDO> query = new MPJLambdaWrapper<>();
query.selectAll(PurchaseOrderMaterialDO.class)
.select("mat.id as matId","mat.name as matName","mat.code as matCode","mat.spec as matSpec","mat.unit as matUnit","mat.material_type as matType")
.leftJoin(MaterialDO.class, "mat", MaterialDO::getId, PurchaseOrderMaterialDO::getMaterialId)
.disableSubLogicDel()
.orderByDesc(PurchaseOrderMaterialDO::getCreateTime);
query.eq(reqVO.getPurchaseOrderId()!=null,PurchaseOrderMaterialDO::getPurchaseOrderId, reqVO.getPurchaseOrderId()).orderByAsc(PurchaseOrderMaterialDO::getCreateTime);
return selectPage(reqVO, query);
}
// default PageResult<PurchaseOrderMaterialDO> selectPage(PurchaseOrderMaterialPageReqVO reqVO) {
// return selectPage(reqVO, new LambdaQueryWrapperX<PurchaseOrderMaterialDO>()
// .eqIfPresent(PurchaseOrderMaterialDO::getPurchaseOrderId, reqVO.getPurchaseOrderId())
// .eqIfPresent(PurchaseOrderMaterialDO::getMaterialId, reqVO.getMaterialId())
// .eqIfPresent(PurchaseOrderMaterialDO::getPurchaseAmount, reqVO.getPurchaseAmount())
// .eqIfPresent(PurchaseOrderMaterialDO::getEstimatedPrice, reqVO.getEstimatedPrice())
// .eqIfPresent(PurchaseOrderMaterialDO::getActualPrice, reqVO.getActualPrice())
// .betweenIfPresent(PurchaseOrderMaterialDO::getArriveTime, reqVO.getArriveTime())
// .eqIfPresent(PurchaseOrderMaterialDO::getDescription, reqVO.getDescription())
// .betweenIfPresent(PurchaseOrderMaterialDO::getCreateTime, reqVO.getCreateTime())
// .orderByDesc(PurchaseOrderMaterialDO::getId));
// }
}

@ -1,5 +1,7 @@
package com.chanko.yunxi.mes.module.heli.service.purchaseorder;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import org.springframework.stereotype.Service;
@ -8,6 +10,7 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseorder.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorder.PurchaseOrderDO;
@ -62,6 +65,14 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
validatePurchaseOrderExists(updateReqVO.getId());
// 更新
PurchaseOrderDO updateObj = BeanUtils.toBean(updateReqVO, PurchaseOrderDO.class);
LocalDateTime currTime = LocalDateTime.now();
if(updateReqVO.getStatus()==2){
updateObj.setSubmitTime(currTime);
}
if(updateReqVO.getStatus()== 3 || updateReqVO.getStatus() == 4){
updateObj.setAuditTime(currTime);
}
purchaseOrderMapper.updateById(updateObj);
}
@ -89,4 +100,8 @@ public class PurchaseOrderServiceImpl implements PurchaseOrderService {
return purchaseOrderMapper.selectPage(pageReqVO);
}
@Override
public PageResult<PurchaseOrderDO> getPurchaseOrderPageByStatus(PurchaseOrderPageReqVO pageReqVO) {
return purchaseOrderMapper.selectPageByStatus(pageReqVO);
}
}

@ -0,0 +1,221 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form class="-mb-15px" :model="queryParams" ref="queryFormRef" :inline="true" label-width="98px">
<el-form-item label="采购单号" prop="purchaseNo">
<el-input v-model="queryParams.purchaseNo" placeholder="采购单号" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="单据日期" prop="createTime">
<el-date-picker class="!w-265px" v-model="queryParams.createTime" type="date" value-format="x"
placeholder="单据日期" />
</el-form-item>
<el-form-item label="供应商" prop="supplierName">
<el-input v-model="queryParams.supplierName" placeholder="供应商" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="采购单类型" prop="purchaseType">
<el-select v-model="queryParams.purchaseType" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="物料需求计划单号" prop="materialPlanNo">
<el-input v-model="queryParams.materialPlanNo" placeholder="物料需求计划单号" clearable @keyup.enter="handleQuery"
class="!w-240px" />
</el-form-item>
<el-form-item label="采购物类型" prop="goodsType">
<el-select v-model="queryParams.goodsType" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PURCHASE_GOODS_TYPE)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="单据状态" prop="status">
<el-select v-model="queryParams.status" placeholder="下拉选择" clearable class="!w-240px">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PURCHASE_ORDER_STATUS).filter(item=>item.value != 1)" :key="dict.value"
:label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item>
<el-button @click="handleQuery">
<Icon icon="ep:search" class="mr-5px" /> 搜索
</el-button>
<el-button @click="resetQuery">
<Icon icon="ep:refresh" class="mr-5px" /> 重置
</el-button>
</el-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" align="center" fixed min-width="70px" />
<el-table-column label="采购单号" align="center" prop="purchaseNo" fixed min-width="180"/>
<el-table-column label="单据日期" align="center" prop="createTime" :formatter="dateFormatter" min-width="180px" fixed>
<template #default="scope">
{{
formatDate(scope.row.createTime, 'YYYY-MM-DD')
}}
</template>
</el-table-column>
<el-table-column label="供应商" align="center" prop="supplierName" min-width="180px" fixed />
<el-table-column label="采购单类型" align="center" prop="purchaseType" min-width="220">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE" :value="scope.row.purchaseType" />
</template>
</el-table-column>
<el-table-column label="物料需求计划单号" align="center" prop="materialPlanNo" min-width="220"/>
<el-table-column label="采购物类型" align="center" prop="goodsType" min-width="180">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PURCHASE_GOODS_TYPE" :value="scope.row.goodsType" />
</template>
</el-table-column>
<el-table-column label="采购合同号" align="center" prop="contractNo" min-width="180"/>
<el-table-column label="结算币种" align="center" prop="currencyType" min-width="180">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_CURRENCY" :value="scope.row.currencyType" />
</template>
</el-table-column>
<el-table-column label="暂估价金额(元)" align="center" prop="estimatedPrice" min-width="180"/>
<el-table-column label="实际价金额(元)" align="center" prop="actualPrice" min-width="180"/>
<el-table-column label="税率" align="center" prop="taxRatio" />
<el-table-column label="备注" align="center" prop="description" />
<el-table-column label="单据状态" align="center" prop="status" fixed="right" min-width="180">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PURCHASE_ORDER_STATUS" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" min-width="180">
<template #default="scope">
<el-button link type="primary" @click="openForm('audit', scope.row.id)" v-if="scope.row.status == 2">
去审核
</el-button>
<el-button link type="primary" @click="openForm('detail', scope.row.id)">
查看详情
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
</template>
<script setup lang="ts">
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import download from '@/utils/download'
import * as PurchaseOrderApi from '@/api/heli/purchaseorder'
import PurchaseOrderForm from './PurchaseOrderForm.vue'
defineOptions({ name: 'PurchaseOrder' })
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
id: undefined,
purchaseNo: undefined,
supplierId: undefined,
contractNo: undefined,
purchaseType: undefined,
projectMaterialPlanId: undefined,
goodsType: undefined,
currencyType: undefined,
taxRatio: undefined,
estimatedPrice: undefined,
actualPrice: undefined,
status: undefined,
submitUserId: undefined,
submitTime: [],
auditor: undefined,
auditTime: [],
description: undefined,
creator: undefined,
createTime: [],
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await PurchaseOrderApi.getPurchaseOrderPageByStatus(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const openForm = (type: string, id?: number) => {
switch (type) {
case 'audit':
router.push({ path: '/purchase/auditdetail', query: { id: id } })
break;
case 'detail':
router.push({ path: '/purchase/detail', query: { id: id } })
break;
default:
break;
}
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await PurchaseOrderApi.deletePurchaseOrder(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await PurchaseOrderApi.exportPurchaseOrder(queryParams)
download.excel(data, '采购订单.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(async () => {
await getList()
})
</script>

@ -193,7 +193,7 @@
<template #header><span class="hl-table_header">*</span>暂估价金额</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.estimatedPrice`" :rules="subFormRules.estimatedPrice" class="mb-0px!">
<el-input v-model="scope.row.estimatedPrice" />
<el-input v-model="scope.row.estimatedPrice" @change="handleEstimatedPrice" />
</el-form-item>
</template>
</el-table-column>
@ -201,7 +201,7 @@
<template #header>实际价金额</template>
<template #default="scope">
<el-form-item :prop="`${scope.$index}.actualPrice`" class="mb-0px!">
<el-input v-model="scope.row.actualPrice" />
<el-input v-model="scope.row.actualPrice" @change="handleActualPrice" />
</el-form-item>
</template>
</el-table-column>
@ -364,6 +364,8 @@ const formData = ref({
projectMaterialPlanId: undefined,
goodsType: undefined,
currencyType: undefined,
estimatedPrice:undefined,
actualPrice:undefined,
taxRatio: undefined,
status:undefined,
createTime: undefined,
@ -383,6 +385,27 @@ const subFormRules = reactive({
const formRef = ref() // Ref
const subFormRef = ref() // Ref
const handleEstimatedPrice = async () =>{
let allEstimatePrice = 0
formData.value.matItemDOList.forEach(item =>{
if(item.estimatedPrice.length>0)
allEstimatePrice +=Number(item.estimatedPrice)
})
formData.value.estimatedPrice = allEstimatePrice
}
const handleActualPrice = async () =>{
let allActualPrice = 0
formData.value.matItemDOList.forEach(item =>{
if(item.actualPrice.length>0)
allActualPrice +=Number(item.actualPrice)
})
formData.value.actualPrice = allActualPrice
}
// ==================== =======================================
const uploadUrl = ref(import.meta.env.VITE_UPLOAD_BATCH_URL)
const matUploadRef = ref()
@ -593,7 +616,7 @@ const submitForm = async () => {
}
const userList = ref<UserApi.UserVO[]>([]) //
const supplierInit = ref()
const matSimpList = ref([]) //
// const matSimpList = ref([]) //
const queryParams = reactive({
pageNo: 1,
@ -605,18 +628,18 @@ onMounted(async () => {
//
formData.value = await PurchaseOrderApi.getPurchaseOrder(query.id)
//
matSimpList.value = await MaterialApi.getSimpList()
// //
// matSimpList.value = await MaterialApi.getSimpList()
//
formData.value.matItemDOList = (await PurchaseOrderMaterialApi.getPurchaseOrderMaterialPage(queryParams)).list
formData.value.matItemDOList.forEach(item=>{
item.matId = matSimpList.value.find((record) => record.id === item.materialId)?.id
item.matCode = matSimpList.value.find((record) => record.id === item.materialId)?.code
item.matName = matSimpList.value.find((record) => record.id === item.materialId)?.name
item.matSpec = matSimpList.value.find((record) => record.id === item.materialId)?.spec
item.matType = matSimpList.value.find((record) => record.id === item.materialId)?.material_type
item.matUnit = matSimpList.value.find((record) => record.id === item.materialId)?.unit
// item.matId = matSimpList.value.find((record) => record.id === item.materialId)?.id
// item.matCode = matSimpList.value.find((record) => record.id === item.materialId)?.code
// item.matName = matSimpList.value.find((record) => record.id === item.materialId)?.name
// item.matSpec = matSimpList.value.find((record) => record.id === item.materialId)?.spec
// item.matType = matSimpList.value.find((record) => record.id === item.materialId)?.material_type
// item.matUnit = matSimpList.value.find((record) => record.id === item.materialId)?.unit
matList.value.push({id:item.materialId,code:item.matCode})
})
formData.value.matItemRemoveList = []

@ -53,6 +53,7 @@
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true">
<el-table-column label="序号" type="index" align="center" fixed min-width="70px" />
<el-table-column label="采购单号" align="center" prop="purchaseNo" fixed min-width="180"/>
<el-table-column label="单据日期" align="center" prop="createTime" :formatter="dateFormatter" min-width="180px" fixed>
<template #default="scope">
@ -61,7 +62,7 @@
}}
</template>
</el-table-column>
<el-table-column label="供应商" align="center" prop="supplierName" fixed />
<el-table-column label="供应商" align="center" prop="supplierName" min-width="180px" fixed />
<el-table-column label="采购单类型" align="center" prop="purchaseType" min-width="220">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PURCHASE_ORDER_TYPE" :value="scope.row.purchaseType" />
@ -90,7 +91,7 @@
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" min-width="180">
<template #default="scope">
<el-button link type="primary" @click="openForm('edit', scope.row.id)">
<el-button link type="primary" @click="openForm('edit', scope.row.id)" v-if="scope.row.status !== 2 && scope.row.status !==3">
编辑
</el-button>
<el-button link type="primary" @click="openForm('detail', scope.row.id)">

Loading…
Cancel
Save