【需求开发】完善项目订单、完成订单审核/订单批准基础功能

pull/1/head
zengchenxi 9 months ago
parent 074d5e787a
commit 2e7b32026d

@ -22,6 +22,9 @@ public class ProjectOrderPageReqVO extends PageParam {
@Schema(description = "单据状态 已保存/已送审/已审核/已启动/已打回/已终止", example = "1")
private Integer orderStatus;
@Schema(description = "单据状态列表")
private List<Integer> orderStatusList;
@Schema(description = "发货状态 未发货/部分发货/全部发货", example = "1")
private Integer deliveryStatus;

@ -191,7 +191,7 @@ public class ProjectOrderDO extends BaseDO {
}
public boolean canTerminate(){
return this.orderStatus.intValue() == ProjectOrderStatusEnum.AUDIT.getCode();
return this.orderStatus.intValue() == ProjectOrderStatusEnum.APPROVE.getCode();
}
public boolean canRepulse(){

@ -34,7 +34,8 @@ public interface ProjectOrderMapper extends BaseMapperX<ProjectOrderDO> {
.like(!StringUtils.isEmpty(reqVO.getMouldName()), ProjectOrderDO::getMouldName, reqVO.getMouldName())
.eq(reqVO.getHasPrice() != null, ProjectOrderDO::getHasPrice, reqVO.getHasPrice())
.eq(reqVO.getOrderStatus() != null, ProjectOrderDO::getOrderStatus, reqVO.getOrderStatus())
.eq(reqVO.getDeliveryStatus() != null, ProjectOrderDO::getDeliveryStatus, reqVO.getDeliveryStatus());
.eq(reqVO.getDeliveryStatus() != null, ProjectOrderDO::getDeliveryStatus, reqVO.getDeliveryStatus())
.in(reqVO.getOrderStatusList() != null && !reqVO.getOrderStatusList().isEmpty(), ProjectOrderDO::getOrderStatus, reqVO.getOrderStatusList());
return selectPage(reqVO, query);
}

@ -297,6 +297,9 @@ export default {
generate: 'Generate',
logout: 'Login Out',
test: 'Test',
audit: 'Audit',
approve: 'Approve',
terminate: 'Terminate',
typeCreate: 'Dict Type Create',
typeUpdate: 'Dict Type Eidt',
dataCreate: 'Dict Data Create',

@ -298,6 +298,9 @@ export default {
generate: '生成',
logout: '强制退出',
test: '测试',
audit: '审核',
approve: '批准',
terminate: '终止',
typeCreate: '字典类型新增',
typeUpdate: '字典类型编辑',
dataCreate: '字典数据新增',

@ -230,5 +230,6 @@ export enum DICT_TYPE {
HELI_BUSINESS_LINE = 'heli_business_line', // 业务线
HELI_BUSINESS_FILE_TYPE = 'heli_business_file_type', // 业务文件类型
HELI_PROJECT_ORDER_SUB_UNIT = 'heli_project_order_sub_unit', // 子项目单位
HELI_PROJECT_ORDER_AUDIT_STATUS = 'heli_project_order_audit_status', // 项目单据审核页状态
HELI_PROJECT_ORDER_APPROVE_STATUS = 'heli_project_order_approve_status', // 项目单据批准页状态
}

@ -0,0 +1,357 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="项目编号" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入项目编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input
v-model="queryParams.customerName"
placeholder="请输入客户名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="业务员" prop="businessManName">
<el-input
v-model="queryParams.businessManName"
placeholder="请输入业务员"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="模具名称" prop="mouldName">
<el-input
v-model="queryParams.mouldName"
placeholder="请输入模具名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否有价格" prop="hasPrice">
<el-select
v-model="queryParams.hasPrice"
placeholder="请选择是否有价格"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="单据状态" prop="orderStatus">
<el-select
v-model="queryParams.orderStatus"
placeholder="请选择单据状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_APPROVE_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发货状态" prop="deliveryStatus">
<el-select
v-model="queryParams.deliveryStatus"
placeholder="请选择发货状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_DELIVERY_STATUS)"
: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-button
type="primary"
plain
@click="openDetail('create')"
v-hasPermi="['heli:project-order:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<!-- <el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['heli:project-order:export']"
>
<Icon icon="ep:download" 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 fixed label="序号" type="index" width="100"/>
<el-table-column fixed label="项目编号" align="center" prop="code" width="240"/>
<el-table-column
fixed
label="订单日期"
align="center"
prop="createTime"
:formatter="dateFormatter2"
width="180"
/>
<el-table-column label="提出部门" align="center" prop="businessDeptName" width="150" />
<el-table-column label="业务员" align="center" prop="businessManName" width="150" />
<el-table-column label="客户名称" align="center" prop="customerName" width="240" />
<el-table-column label="合同编号" align="center" prop="contractNo" width="180"/>
<el-table-column label="模具名称" align="center" prop="mouldName" width="180" />
<el-table-column label="所属业务线" align="center" prop="businessLine" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template>
</el-table-column>
<el-table-column label="是否有价格" align="center" prop="hasPrice" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_COMMON_IS_OR_NOT" :value="scope.row.hasPrice" />
</template>
</el-table-column>
<el-table-column label="价格(元)" align="center" prop="price" width="150"/>
<el-table-column label="币种" align="center" prop="currency" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_CURRENCY" :value="scope.row.currency" />
</template>
</el-table-column>
<el-table-column label="是否紧急" align="center" prop="isUrgency" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_COMMON_IS_OR_NOT" :value="scope.row.isUrgency" />
</template>
</el-table-column>
<el-table-column label="性质" align="center" prop="property" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column label="起止日期" align="center" prop="projectStartTime" width="260">
<template #default="scope">
{{formatDate(scope.row.projectStartTime,'YYYY-MM-DD') + '~' + formatDate(scope.row.projectEndTime, 'YYYY-MM-DD')}}
</template>
</el-table-column>
<el-table-column label="是否已变更" align="center" prop="hasAlter" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_COMMON_IS_OR_NOT" :value="scope.row.hasAlter" />
</template>
</el-table-column>
<el-table-column label="单据状态" align="center" prop="orderStatus" fixed="right" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_ORDER_STATUS" :value="scope.row.orderStatus" />
</template>
</el-table-column>
<el-table-column label="发货状态" align="center" prop="deliveryStatus" fixed="right" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_DELIVERY_STATUS" :value="scope.row.deliveryStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="260">
<template #default="scope">
<el-button
link
type="primary"
@click="openDetail('approve', scope.row.id)"
v-if="scope.row.orderStatus == 16"
>
去批准
</el-button>
<el-button
link
type="danger"
@click="openDetail('terminate', scope.row.id)"
v-if="scope.row.orderStatus == 32"
>
去终止
</el-button>
<el-button
link
type="primary"
@click="openDetail('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, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import {dateFormatter, dateFormatter2, formatDate} from '@/utils/formatTime'
import download from '@/utils/download'
import * as ProjectOrderApi from '@/api/heli/projectorder'
defineOptions({ name: 'ProjectOrderApprove' })
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,
code: undefined,
orderStatus: undefined,
orderStatusList: [16, 32, 64],
deliveryStatus: undefined,
businessDeptId: undefined,
customerName: undefined,
mouldName: undefined,
businessLine: undefined,
blueprintNo: undefined,
hasPrice: undefined,
price: undefined,
currency: undefined,
projectStartTime: [],
projectEndTime: [],
isUrgency: undefined,
property: undefined,
referenceTechnology: undefined,
hasAlter: undefined,
lastAlterTime: [],
qualityRequirement: undefined,
remark: undefined,
hasContract: undefined,
hasTechnologyProtocol: undefined,
hasBlueprint: undefined,
blueprintRemark: undefined,
status: undefined,
createTime: [],
businessManName: undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ProjectOrderApi.getProjectOrderPage(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 openDetail = (type: string, id?: number) => {
router.push({
name: 'ProjectOrderDetail',
query: {
active: type,
id: id
}
})
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ProjectOrderApi.deleteProjectOrder(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProjectOrderApi.exportProjectOrder(queryParams)
download.excel(data, '项目订单.xls')
} catch {
} finally {
exportLoading.value = false
}
}
const handleCommand = async (command, id) => {
switch (command){
case 'detail':
openDetail('detail', id);
break;
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
onActivated(() => {
getList()
})
</script>
<style scoped>
.el-dropdown-link {
cursor: pointer;
color: var(--el-color-primary);
display: flex;
align-items: center;
}
</style>

@ -0,0 +1,349 @@
<template>
<ContentWrap>
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="68px"
>
<el-form-item label="项目编号" prop="code">
<el-input
v-model="queryParams.code"
placeholder="请输入项目编号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="客户名称" prop="customerName">
<el-input
v-model="queryParams.customerName"
placeholder="请输入客户名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="业务员" prop="businessManName">
<el-input
v-model="queryParams.businessManName"
placeholder="请输入业务员"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="模具名称" prop="mouldName">
<el-input
v-model="queryParams.mouldName"
placeholder="请输入模具名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="是否有价格" prop="hasPrice">
<el-select
v-model="queryParams.hasPrice"
placeholder="请选择是否有价格"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="单据状态" prop="orderStatus">
<el-select
v-model="queryParams.orderStatus"
placeholder="请选择单据状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_AUDIT_STATUS)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="发货状态" prop="deliveryStatus">
<el-select
v-model="queryParams.deliveryStatus"
placeholder="请选择发货状态"
clearable
class="!w-240px"
>
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_DELIVERY_STATUS)"
: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-button
type="primary"
plain
@click="openDetail('create')"
v-hasPermi="['heli:project-order:create']"
>
<Icon icon="ep:plus" class="mr-5px" /> 新增
</el-button>
<!-- <el-button
type="success"
plain
@click="handleExport"
:loading="exportLoading"
v-hasPermi="['heli:project-order:export']"
>
<Icon icon="ep:download" 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 fixed label="序号" type="index" width="100"/>
<el-table-column fixed label="项目编号" align="center" prop="code" width="240"/>
<el-table-column
fixed
label="订单日期"
align="center"
prop="createTime"
:formatter="dateFormatter2"
width="180"
/>
<el-table-column label="提出部门" align="center" prop="businessDeptName" width="150" />
<el-table-column label="业务员" align="center" prop="businessManName" width="150" />
<el-table-column label="客户名称" align="center" prop="customerName" width="240" />
<el-table-column label="合同编号" align="center" prop="contractNo" width="180"/>
<el-table-column label="模具名称" align="center" prop="mouldName" width="180" />
<el-table-column label="所属业务线" align="center" prop="businessLine" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template>
</el-table-column>
<el-table-column label="是否有价格" align="center" prop="hasPrice" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_COMMON_IS_OR_NOT" :value="scope.row.hasPrice" />
</template>
</el-table-column>
<el-table-column label="价格(元)" align="center" prop="price" width="150"/>
<el-table-column label="币种" align="center" prop="currency" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_CURRENCY" :value="scope.row.currency" />
</template>
</el-table-column>
<el-table-column label="是否紧急" align="center" prop="isUrgency" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_COMMON_IS_OR_NOT" :value="scope.row.isUrgency" />
</template>
</el-table-column>
<el-table-column label="性质" align="center" prop="property" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PROPERTY" :value="scope.row.property" />
</template>
</el-table-column>
<el-table-column label="起止日期" align="center" prop="projectStartTime" width="260">
<template #default="scope">
{{formatDate(scope.row.projectStartTime,'YYYY-MM-DD') + '~' + formatDate(scope.row.projectEndTime, 'YYYY-MM-DD')}}
</template>
</el-table-column>
<el-table-column label="是否已变更" align="center" prop="hasAlter" width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_COMMON_IS_OR_NOT" :value="scope.row.hasAlter" />
</template>
</el-table-column>
<el-table-column label="单据状态" align="center" prop="orderStatus" fixed="right" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_ORDER_STATUS" :value="scope.row.orderStatus" />
</template>
</el-table-column>
<el-table-column label="发货状态" align="center" prop="deliveryStatus" fixed="right" width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_DELIVERY_STATUS" :value="scope.row.deliveryStatus" />
</template>
</el-table-column>
<el-table-column label="操作" align="center" fixed="right" width="260">
<template #default="scope">
<el-button
link
type="primary"
@click="openDetail('audit', scope.row.id)"
v-if="scope.row.orderStatus == 8"
>
去审核
</el-button>
<el-button
link
type="primary"
@click="openDetail('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, getStrDictOptions, DICT_TYPE } from '@/utils/dict'
import {dateFormatter, dateFormatter2, formatDate} from '@/utils/formatTime'
import download from '@/utils/download'
import * as ProjectOrderApi from '@/api/heli/projectorder'
defineOptions({ name: 'ProjectOrderAudit' })
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,
code: undefined,
orderStatus: undefined,
orderStatusList: [8, 16, 32, 64],
deliveryStatus: undefined,
businessDeptId: undefined,
customerName: undefined,
mouldName: undefined,
businessLine: undefined,
blueprintNo: undefined,
hasPrice: undefined,
price: undefined,
currency: undefined,
projectStartTime: [],
projectEndTime: [],
isUrgency: undefined,
property: undefined,
referenceTechnology: undefined,
hasAlter: undefined,
lastAlterTime: [],
qualityRequirement: undefined,
remark: undefined,
hasContract: undefined,
hasTechnologyProtocol: undefined,
hasBlueprint: undefined,
blueprintRemark: undefined,
status: undefined,
createTime: [],
businessManName: undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ProjectOrderApi.getProjectOrderPage(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 openDetail = (type: string, id?: number) => {
router.push({
name: 'ProjectOrderDetail',
query: {
active: type,
id: id
}
})
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ProjectOrderApi.deleteProjectOrder(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProjectOrderApi.exportProjectOrder(queryParams)
download.excel(data, '项目订单.xls')
} catch {
} finally {
exportLoading.value = false
}
}
const handleCommand = async (command, id) => {
switch (command){
case 'detail':
openDetail('detail', id);
break;
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
onActivated(() => {
getList()
})
</script>
<style scoped>
.el-dropdown-link {
cursor: pointer;
color: var(--el-color-primary);
display: flex;
align-items: center;
}
</style>

@ -34,7 +34,7 @@
node-key="id"
clearable
placeholder="请选择提出部门"
:disabled="alterDisabled"
:disabled="alterDisabled || detailDisabled"
/>
</el-form-item>
</el-col>
@ -43,7 +43,7 @@
<el-col :span="24">
<el-form-item label="所属业务线" prop="businessLine">
<el-select v-model="formData.businessLine" placeholder="请选择所属业务线"
:disabled="alterDisabled"
:disabled="alterDisabled || detailDisabled"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)"
@ -63,7 +63,7 @@
type="date"
value-format="x"
placeholder="选择项目开始日期"
:disabled="alterDisabled"
:disabled="alterDisabled || detailDisabled"
/>
</el-form-item>
</el-col>
@ -71,14 +71,14 @@
<el-row>
<el-col :span="24">
<el-form-item label="可引用的原有技术" prop="referenceTechnology">
<el-input v-model="formData.referenceTechnology" placeholder="请输入可引用的原有技术" />
<el-input :disabled="detailDisabled" v-model="formData.referenceTechnology" placeholder="请输入可引用的原有技术" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="检验要求" prop="qualityRequirement">
<el-input type="textarea" v-model="formData.qualityRequirement" placeholder="请输入检验要求" show-word-limit maxlength="200"/>
<el-input :disabled="detailDisabled" type="textarea" v-model="formData.qualityRequirement" placeholder="请输入检验要求" show-word-limit maxlength="200"/>
</el-form-item>
</el-col>
</el-row>
@ -103,7 +103,7 @@
reserve-keyword
filterable
:loading="userSelectLoading"
:disabled="alterDisabled"
:disabled="alterDisabled || detailDisabled"
>
<el-option
v-for="item in userSelectList"
@ -118,7 +118,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="模具图号" prop="blueprintNo">
<el-input :disabled="alterDisabled" v-model="formData.blueprintNo" placeholder="请输入模具图号" />
<el-input :disabled="alterDisabled || detailDisabled" v-model="formData.blueprintNo" placeholder="请输入模具图号" />
</el-form-item>
</el-col>
</el-row>
@ -130,7 +130,9 @@
type="date"
value-format="x"
placeholder="选择项目结束日期"
:disabled="detailDisabled"
/>
<span v-if="formData.projectStartTime && formData.projectEndTime">{{" "+betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime))+""}}</span>
</el-form-item>
</el-col>
</el-row>
@ -155,7 +157,7 @@
reserve-keyword
filterable
:loading="customerSelectLoading"
:disabled="alterDisabled"
:disabled="alterDisabled || detailDisabled"
>
<el-option
v-for="item in customerSelectList"
@ -170,7 +172,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="是否有价格" prop="hasPrice">
<el-radio-group v-model="formData.hasPrice">
<el-radio-group v-model="formData.hasPrice" :disabled="detailDisabled">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value"
@ -185,7 +187,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="是否紧急" prop="isUrgency">
<el-radio-group v-model="formData.isUrgency">
<el-radio-group v-model="formData.isUrgency" :disabled="detailDisabled">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value"
@ -214,8 +216,8 @@
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="备注" prop="remark">
<el-input type="textarea" v-model="formData.remark" show-word-limit maxlength="200"/>
<el-form-item label="备注" prop="remark" :disabled="detailDisabled">
<el-input :disabled="detailDisabled" type="textarea" v-model="formData.remark" show-word-limit maxlength="200"/>
</el-form-item>
</el-col>
</el-row>
@ -232,22 +234,22 @@
<el-row>
<el-col :span="24">
<el-form-item label="合同号" prop="contractNo">
<el-input :disabled="alterDisabled" v-model="formData.contractNo" placeholder="请输入合同号" />
<el-input :disabled="alterDisabled || detailDisabled" v-model="formData.contractNo" placeholder="请输入合同号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="模具名称" prop="mouldName">
<el-input :disabled="alterDisabled" v-model="formData.mouldName" placeholder="请输入模具名称" />
<el-input :disabled="alterDisabled || detailDisabled" v-model="formData.mouldName" placeholder="请输入模具名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="价格(元)" prop="price">
<el-input-number v-model="formData.price" :disabled="formData.hasPrice == 0 && (formData.price = '')" placeholder="请输入价格(元)" :controls="false" :min="0" :precision="6" />
<el-select v-model="formData.currency" placeholder="请选择币种">
<el-input-number v-model="formData.price" :disabled="detailDisabled || (formData.hasPrice == 0 && (formData.price = ''))" placeholder="请输入价格(元)" :controls="false" :min="0" :precision="6" />
<el-select :disabled="detailDisabled" v-model="formData.currency" placeholder="请选择币种">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CURRENCY)"
:key="dict.value"
@ -261,7 +263,7 @@
<el-row>
<el-col :span="24">
<el-form-item label="性质" prop="property">
<el-select v-model="formData.property" placeholder="请选择性质">
<el-select :disabled="detailDisabled" v-model="formData.property" placeholder="请选择性质">
<el-option
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)"
:key="dict.value"
@ -282,7 +284,7 @@
<el-row>
<el-col :span="6">
<el-form-item label="有无合同" prop="hasContract">
<el-radio-group v-model="formData.hasContract">
<el-radio-group :disabled="detailDisabled" v-model="formData.hasContract">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value"
@ -295,7 +297,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="有无技术协议" prop="hasTechnologyProtocol">
<el-radio-group v-model="formData.hasTechnologyProtocol">
<el-radio-group :disabled="detailDisabled" v-model="formData.hasTechnologyProtocol">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value"
@ -308,7 +310,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="有无图纸/数模" prop="hasBlueprint">
<el-radio-group v-model="formData.hasBlueprint">
<el-radio-group :disabled="detailDisabled" v-model="formData.hasBlueprint">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)"
:key="dict.value"
@ -321,7 +323,7 @@
</el-col>
<el-col :span="6">
<el-form-item label="" label-width="0" prop="blueprintRemark">
<el-input v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :disabled="formData.hasBlueprint == 0 && (formData.blueprintRemark = '')"/>
<el-input v-model="formData.blueprintRemark" placeholder="请输入图纸/数模说明" :disabled="detailDisabled || (formData.hasBlueprint == 0 && (formData.blueprintRemark = ''))"/>
</el-form-item>
</el-col>
</el-row>
@ -348,28 +350,28 @@
<el-table-column label="子项目名称" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.name`" :rules="subFormRules.name" class="mb-0px!">
<el-input v-model="row.name" placeholder="请输入子项目名称" />
<el-input :disabled="detailDisabled" v-model="row.name" placeholder="请输入子项目名称" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="设备型号" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.deviceModel`" :rules="subFormRules.deviceModel" class="mb-0px!">
<el-input v-model="row.deviceModel" placeholder="请输入设备型号" />
<el-input :disabled="detailDisabled" v-model="row.deviceModel" placeholder="请输入设备型号" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="数量" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.amount`" :rules="subFormRules.amount" class="mb-0px!">
<el-input-number v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"/>
<el-input-number :disabled="detailDisabled" v-model="row.amount" placeholder="请输入数量" :min="0" :precision="0"/>
</el-form-item>
</template>
</el-table-column>
<el-table-column label="单位" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.unit`" :rules="subFormRules.unit" class="mb-0px!">
<el-select v-model="row.unit" placeholder="请选择单位">
<el-select :disabled="detailDisabled" v-model="row.unit" placeholder="请选择单位">
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_PROJECT_ORDER_SUB_UNIT)"
:key="dict.value"
@ -392,6 +394,7 @@
reserve-keyword
filterable
:loading="compositionSelectLoading"
:disabled="detailDisabled"
>
<el-option
v-for="item in compositionSelectList"
@ -406,14 +409,14 @@
<el-table-column label="备注" min-width="150">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.remark`" :rules="subFormRules.remark" class="mb-0px!">
<el-input v-model="row.remark" placeholder="请输入备注" />
<el-input :disabled="detailDisabled" v-model="row.remark" placeholder="请输入备注" />
</el-form-item>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="240">
<template #default="scope">
<el-button
v-if="('update,create'.indexOf(query.active) > -1) || !alterDisabled"
v-if="('update,create'.indexOf(query.active) > -1) && !formData.hasAlter"
link
type="danger"
size="small"
@ -436,7 +439,7 @@
<el-row>
<el-col>
<el-card class="hl-incard">
<el-col v-if="('update,create'.indexOf(query.active) > -1)">
<el-col v-if="('update,create,alter'.indexOf(query.active) > -1)">
<el-upload
ref="contractUploadRef"
:file-list="contractUploadFiles"
@ -479,7 +482,7 @@
<el-table-column prop="createTime" align="center" label="上传时间" :formatter="dateFormatter"/>
<el-table-column label="操作" align="center">
<template #default="scope">
<el-button v-if="('update,create'.indexOf(query.active) > -1)" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
<el-button v-if="('update,create,alter'.indexOf(query.active) > -1)" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
删除
</el-button>
<el-button v-if="!!scope.row.id" link type="primary" size="small" @click="downloadAttachment(scope.row.name, scope.row.url)"> </el-button>
@ -523,32 +526,42 @@
<el-button v-if="('update,create'.indexOf(query.active) > -1) && formData.orderStatus <= 4" @click="submitForm('SAVE')" type="success" size="large"
> </el-button
>
<el-button v-if="query.active == 'update' && formData.orderStatus < 8" @click="submitForm('SUBMIT_AUDIT')" type="primary" size="large"
<el-button v-if="('update,create'.indexOf(query.active) > -1) && formData.orderStatus < 8" @click="submitForm('SUBMIT_AUDIT')" type="primary" size="large"
> </el-button
>
<el-button v-if="query.active == 'update' && formData.orderStatus == 8" @click="submitForm('AUDIT')" type="primary" size="large"
<el-button v-if="query.active == 'audit' && formData.orderStatus == 8" @click="submitForm('AUDIT')" type="primary" size="large"
> </el-button
>
<el-button v-if="query.active == 'update' && formData.orderStatus == 16" @click="submitForm('APPROVE')" type="primary" size="large"
<el-button v-if="query.active == 'approve' && formData.orderStatus == 16" @click="submitForm('APPROVE')" type="primary" size="large"
> </el-button
>
<el-button v-if="query.active == 'update' && formData.orderStatus == 32" @click="submitForm('ALTER')" type="danger" size="large"
<el-button v-if="query.active == 'alter' && formData.orderStatus == 32" @click="submitForm('ALTER')" type="danger" size="large"
>确定变更</el-button
>
<el-button v-if="query.active == 'update' && formData.orderStatus == 8 || formData.orderStatus == 16" @click="submitForm('REPULSE')" type="danger" size="large"
<el-button v-if="'audit,approve'.indexOf(query.active) > -1 && (formData.orderStatus == 8 || formData.orderStatus == 16)" @click="activeOpinionDialogVisible=true" type="danger" size="large"
> </el-button
>
<el-button v-if="query.active == 'update' && formData.orderStatus == 16" @click="submitForm('TERMINATE')" type="danger" size="large"
<el-button v-if="query.active == 'terminate' && formData.orderStatus == 32" @click="submitForm('TERMINATE')" type="danger" size="large"
>直接终止</el-button
>
</div>
</el-card>
<el-dialog v-model="activeOpinionDialogVisible" title="打回原因" width="30%" center>
<el-input type="textarea" v-model="formData.activeOpinion" placeholder="请输入打回原因" show-word-limit maxlength="200"/>
<template #footer>
<span class="dialog-footer">
<el-button @click="activeOpinionDialogVisible = false">取消</el-button>
<el-button type="primary" @click="submitForm('REPULSE') && (activeOpinionDialogVisible = false)">确认打回</el-button>
</span>
</template>
</el-dialog>
</template>
<script setup lang="ts">
import {inject} from 'vue'
import {getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel} from '@/utils/dict'
import * as ProjectOrderApi from '@/api/heli/projectorder'
import {dateFormatter, formatDate} from "@/utils/formatTime";
import {betweenDay, dateFormatter, formatDate} from "@/utils/formatTime";
import {defaultProps, handleTree} from "@/utils/tree";
import * as DeptApi from '@/api/system/dept'
import * as UserApi from "@/api/system/user";
@ -569,6 +582,7 @@ const { query } = useRoute()
const router = useRouter();
const reload = inject('reload')
const activeOpinionDialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
@ -610,18 +624,18 @@ const formData = ref({
})
const formRules = reactive({
businessDeptId: [{ required: true, message: '提出部门不能为空', trigger: 'blur' }],
customerId: [{ required: true, message: '客户id不能为空', trigger: 'blur' }],
customerId: [{ required: true, message: '客户名称不能为空', trigger: 'blur' }],
mouldName: [{ required: true, message: '模具名称不能为空', trigger: 'blur' }],
businessLine: [{ required: true, message: '所属业务线不能为空', trigger: 'change' }],
hasPrice: [{ required: true, message: '是否有价格不能为空', trigger: 'blur' }],
projectStartTime: [{ required: true, message: '项目开始日期不能为空', trigger: 'blur' }],
projectEndTime: [{ required: true, message: '项目结束日期不能为空', trigger: 'blur' }],
isUrgency: [{ required: true, message: '是否紧急不能为空', trigger: 'blur' }],
property: [{ required: true, message: '性质不能为空', trigger: 'blur' }],
hasAlter: [{ required: true, message: '是否已变更不能为空', trigger: 'blur' }],
hasContract: [{ required: true, message: '有无合同不能为空', trigger: 'blur' }],
hasTechnologyProtocol: [{ required: true, message: '有无技术协议不能为空', trigger: 'blur' }],
hasBlueprint: [{ required: true, message: '有无图纸/数模不能为空', trigger: 'blur' }],
blueprintRemark: [{ required: true, message: '图纸/数模 说明不能为空', trigger: 'blur' }],
status: [{ required: true, message: '状态,1表示正常2表示禁用不能为空', trigger: 'blur' }],
businessMan: [{ required: true, message: '业务员不能为空', trigger: 'blur' }],
})
@ -781,9 +795,21 @@ const submitForm = async (active) => {
//
formLoading.value = true
try {
// 退
if(active != 'REPULSE'){
formData.value.activeOpinion = '';
}
const data = formData.value as unknown as ProjectOrderApi.ProjectOrderVO
if(active == 'SAVE'){
if(active == 'SUBMIT_AUDIT'){
//
if(!data.projectOrderSubs || data.projectOrderSubs.length == 0){
message.error("子项目信息不能为空")
return
}
}
if((active == 'SAVE' || active == 'SUBMIT_AUDIT') && !formData.value.hasAlter){
// 0
if(data.projectOrderSubs && data.projectOrderSubs.length > 0){
if(data.projectOrderSubs.some((sub) => !sub.amount || sub.amount <= 0)){
@ -793,14 +819,6 @@ const submitForm = async (active) => {
}
}
if(active == 'SUBMIT_AUDIT'){
//
if(!data.projectOrderSubs || data.projectOrderSubs.length == 0){
message.error("子项目信息不能为空")
return
}
}
if(active == 'ALTER'){
// 0
if(data.projectOrderSubs && data.projectOrderSubs.length > 0){
@ -814,8 +832,6 @@ const submitForm = async (active) => {
}
}
const orderId = await ProjectOrderApi.operateProjectOrder(data)
message.success(t('common.operationSuccess'))
//
@ -827,9 +843,15 @@ const submitForm = async (active) => {
protocolUploadData.value.businessId = orderId
protocolUploadRef.value!.submit();
}
//
reload();
query.id = orderId;
//
if(active != 'SAVE'){
router.back();
}else{
//
reload();
query.id = orderId;
}
}finally {
formLoading.value = false
}
@ -959,10 +981,15 @@ const openMe = (url) => {
window.open(url)
}
const alterDisabled = () => {
return false;
}
const alterDisabled = ref(false)
const detailDisabled = ref(false)
onMounted(() => {
if(query.active == 'alter'){
alterDisabled.value = true;
}
if('detail,audit,approve,terminate'.indexOf(query.active) > -1){
detailDisabled.value = true;
}
queryData(query.active, query.id);
})
</script>

@ -206,8 +206,8 @@
<el-dropdown-menu>
<el-dropdown-item command="detail">查看详情</el-dropdown-item>
<el-dropdown-item command="printProject">打印开发项目启动单</el-dropdown-item>
<el-dropdown-item v-if="scope.row.orderStatus == 32" command="alterProject"></el-dropdown-item>
<el-dropdown-item command="viewAlterProject">查看变更日志</el-dropdown-item>
<el-dropdown-item v-if="scope.row.orderStatus == 32" command="alter"></el-dropdown-item>
<el-dropdown-item command="viewAlter">查看变更日志</el-dropdown-item>
<el-dropdown-item v-if="scope.row.orderStatus == 32" command="delivery"></el-dropdown-item>
</el-dropdown-menu>
</template>
@ -350,6 +350,9 @@ const handleCommand = async (command, id) => {
onMounted(() => {
getList()
})
onActivated(() => {
getList()
})
</script>
<style scoped>

@ -73,7 +73,7 @@ CREATE TABLE `project_order` (
`price` DECIMAL ( 20, 6 ) COMMENT '价格 保留四位小数',
`currency` char(1) COMMENT '币种',
`project_start_time` DATETIME NOT NULL COMMENT '项目开始时间',
`project_end_time` DATETIME COMMENT '项目结束时间',
`project_end_time` DATETIME NOT NULL COMMENT '项目结束时间',
`is_urgency` TINYINT ( 1 ) NOT NULL COMMENT '是否紧急',
`property` TINYINT ( 1 ) NOT NULL COMMENT '性质 新制|维修',
`reference_technology` VARCHAR ( 255 ) COMMENT '可引用的原有技术',
@ -84,7 +84,7 @@ CREATE TABLE `project_order` (
`has_contract` TINYINT ( 1 ) NOT NULL COMMENT '有无合同',
`has_technology_protocol` TINYINT ( 1 ) NOT NULL COMMENT '有无技术协议',
`has_blueprint` TINYINT ( 1 ) NOT NULL COMMENT '有无图纸/数模',
`blueprint_remark` VARCHAR ( 255 ) NOT NULL COMMENT '图纸/数模 说明',
`blueprint_remark` VARCHAR ( 255 ) COMMENT '图纸/数模 说明',
`status` TINYINT ( 1 ) NOT NULL DEFAULT '1' COMMENT '状态,1表示正常2表示禁用',
`creator` VARCHAR ( 64 ) COLLATE utf8mb4_unicode_ci DEFAULT '' COMMENT '创建者',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

Loading…
Cancel
Save