This commit is contained in:
Ledo 2025-10-08 18:18:41 +08:00
parent 181dc83d4e
commit 88529941bf
7 changed files with 1163 additions and 534 deletions

View File

@ -1,5 +1,8 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.plansub.vo;
import cn.hutool.core.util.ObjectUtil;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail.PlanSubDetailDO;
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
@ -82,5 +85,6 @@ public class PlanSubPageReqVO extends PageParam {
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
private String projectCode;
private String projectSubName;
}

View File

@ -69,11 +69,13 @@ public class PlanSubDetailPageReqVO extends PageParam {
private String queryDate;
@Schema(description = "项目编码", example = "26785")
private Long projectCode;
private String projectCode;
@Schema(description = "子项目名称" ,example = "s")
private String projectSubName;
private String customerBrief;
private String projectName;
private String planNo;
}

View File

@ -219,4 +219,8 @@ public class PlanSubDO extends BaseDO {
private boolean hasSaveIn3DDetail;
@TableField(exist = false)
private boolean hasSaveIn2DDetail;
@TableField(exist = false)
private String projectCode;
@TableField(exist = false)
private String planNo;
}

View File

@ -2,6 +2,7 @@ package com.chanko.yunxi.mes.module.heli.dal.mysql.plansub;
import java.util.*;
import cn.hutool.core.util.ObjectUtil;
import cn.smallbun.screw.core.util.StringUtils;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.query.LambdaQueryWrapperX;
@ -11,6 +12,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.equip.EquipDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansubdetail.PlanSubDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
@ -43,6 +45,29 @@ public interface PlanSubMapper extends BaseMapperX<PlanSubDO> {
query.eq(reqVO.getProjectPlanId() != null, PlanSubDO::getProjectPlanId, reqVO.getProjectPlanId());
return selectPage(reqVO, query);
}
default PageResult<PlanSubDO> getPlanList(PlanSubPageReqVO reqVO) {
MPJLambdaWrapper<PlanSubDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanSubDO.class)
.select("c.name as projectSubName")
.select("b.project_name_sim as projectNameSim")
.select("b.code as projectCode" )
.select("a.brief as customerName")
.select("p.plan_no as planNo")
.leftJoin(PlanDO.class, "p", PlanDO::getId, PlanSubDO::getProjectPlanId)
.leftJoin(ProjectOrderDO.class, "b", ProjectOrderDO::getId, PlanSubDO::getProjectId)
.leftJoin(CustomerDO.class,"a",CustomerDO::getId,ProjectOrderDO::getCustomerId)
.leftJoin(ProjectOrderSubDO.class, "c", ProjectOrderSubDO::getId, PlanSubDO::getProjectSubId)
.eq(ProjectOrderDO::getDeliveryStatus,1)
.disableSubLogicDel()
.orderByAsc(PlanSubDO::getId)
;
query.like(ObjectUtil.isNotEmpty(reqVO.getProjectCode()), PlanDO::getCode, reqVO.getProjectCode())
.like(ObjectUtil.isNotEmpty(reqVO.getProjectSubName()), PlanSubDetailDO::getName, reqVO.getProjectSubName());
return selectPage(reqVO, query);
}
default PlanSubDO selectById(Long id) {
MPJLambdaWrapper<PlanSubDO> query = new MPJLambdaWrapper<>();
query.selectAll(PlanSubDO.class)

View File

@ -27,6 +27,8 @@
v-model="queryParams.beginTime"
value-format="YYYY-MM-DD"
type="date"
clearable
@change="changeBeginDate()"
start-placeholder="开始日期"
end-placeholder="结束日期"
class="!w-280px"
@ -65,7 +67,7 @@
<el-button @click="handleQuery" type="primary"
><Icon icon="ep:search" class="mr-5px" /> 搜索</el-button
>
<el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button>
<!-- <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> 重置</el-button> -->
<el-button @click="saveForm" type="warning">保存</el-button>
<el-button @click="addForm" type="success">新增</el-button>
</el-form-item>
@ -82,13 +84,18 @@
border
>
<el-table-column fixed label="序号" type="index" width="70" align="center" />
<el-table-column fixed label="项目编码" align="center" prop="code" min-width="120" />
<el-table-column fixed label="子项目名称" align="center" prop="name" min-width="250" />
<el-table-column min-width="200px" align="center">
<el-table-column fixed label="项目编码" align="center" prop="code" min-width="130" />
<el-table-column fixed label="子项目名称" align="center" prop="name" min-width="180" />
<el-table-column min-width="110px" align="center">
<template #header>设计类型</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subType`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.subType" clearable filterable :disabled="row.userFlag == false">
<el-select
v-model="row.subType"
clearable
filterable
:disabled="row.userFlag == false"
>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CH_PROCESS_TYPE)"
:key="dict.value"
@ -120,12 +127,11 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center">
<el-table-column min-width="180px" align="center">
<template #header>开始日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.startTwoDimDate`" class="mb-0px!">
<el-date-picker
class="!w-265px"
v-model="row.startTwoDimDate"
type="date"
@change="change1(row, 0)"
@ -137,12 +143,11 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center">
<el-table-column min-width="180px" align="center">
<template #header>结束日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.twoDimDate`" class="mb-0px!">
<el-date-picker
class="!w-265px"
v-model="row.twoDimDate"
type="date"
@change="change1(row, 1)"
@ -154,9 +159,9 @@
</el-form-item>
</template>
</el-table-column>
<el-table-column label="设计天数" align="center" prop="designNum" min-width="120" />
<el-table-column label="时间段顺序" align="center" prop="seqNo" min-width="120" />
<el-table-column label="是否新增" align="center" prop="seqNo" min-width="120">
<el-table-column label="设计天数" align="center" prop="designNum" min-width="100" />
<el-table-column label="时间段顺序" align="center" prop="seqNo" min-width="110" />
<el-table-column label="是否新增" align="center" prop="seqNo" min-width="100">
<template #default="scope">
{{ scope.row.isAdd == 1 ? '是' : '否' }}
</template>
@ -181,23 +186,82 @@
<!----插活弹框-->
<!-- 插活弹窗 -->
<el-dialog v-model="dialogVisible" width="80%" :close-on-click-modal="false">
<div class="dialog-content">
<!-- 第一排当前日期信息 -->
<!-- 第二排状态标题 -->
<div class="status-title">
<el-dialog v-model="dialogVisible" width="100%" :close-on-click-modal="false">
<div class="dialog-content" style="display: flex; gap: 20px">
<!-- 左侧插活前列表 -->
<div style="flex: 1">
<div class="status-title" style="margin-bottom: 15px">
<h3>{{
dialogTitle +
'(当前:' +
'当前子项目' +
currentRow.name +
'' +
formatDate(currentRow?.startTwoDimDate, 'YYYY-MM-DD') +
'至' +
formatDate(currentRow?.twoDimDate, 'YYYY-MM-DD') +
')'
formatDate(currentRow?.twoDimDate, 'YYYY-MM-DD')
}}</h3>
<h3>{{ '插活前' }}</h3>
</div>
<!-- 表格 -->
<el-table
v-loading="loading2"
:data="beforeList"
:show-overflow-tooltip="true"
class="hl-table"
border
max-height="400"
>
<el-table-column fixed label="子项目名称" align="center" prop="name" min-width="120px" />
<el-table-column min-width="50px" align="center">
<template #header>设计类型</template>
<template #default="{ row }">
<span>{{ getDictLabel(DICT_TYPE.HELI_CH_PROCESS_TYPE, row.subType) }}</span>
</template>
</el-table-column>
<el-table-column min-width="55px" align="center">
<template #header>负责人</template>
<template #default="{ row }">
<span>{{ getUserNickname(row.twoDimOwner) }}</span>
</template>
</el-table-column>
<el-table-column min-width="60px" align="center">
<template #header>开始日期</template>
<template #default="{ row }">
<span>{{ formatDate(row.startTwoDimDate, 'YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column min-width="60px" align="center">
<template #header>结束日期</template>
<template #default="{ row }">
<span>{{ formatDate(row.twoDimDate, 'YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column label="设计天数" align="center" prop="designNum" min-width="50px" />
<el-table-column label="时间段顺序" align="center" prop="seqNo" min-width="60px" />
</el-table>
</div>
<!-- 右侧插活后列表 -->
<div style="flex: 1">
<div class="status-title" style="margin-bottom: 15px">
<h3>{{
'当前子项目' +
currentRow.name +
'' +
formatDate(currentRow?.startTwoDimDate, 'YYYY-MM-DD') +
'至' +
formatDate(currentRow?.twoDimDate, 'YYYY-MM-DD')
}}</h3>
<h3>{{ '插活后' }}</h3>
</div>
<!-- 表格 -->
<el-table
v-if="dialogTitle == '插活后'"
v-loading="loading2"
:data="insertList"
:show-overflow-tooltip="true"
@ -205,76 +269,41 @@
border
max-height="400"
>
<el-table-column fixed label="序号" type="index" width="70" align="center" />
<el-table-column fixed label="项目编码" align="center" prop="code" min-width="120" />
<el-table-column fixed label="子项目名称" align="center" prop="name" min-width="250" />
<el-table-column min-width="200px" align="center">
<el-table-column fixed label="子项目名称" align="center" prop="name" min-width="120px" />
<el-table-column min-width="50px" align="center">
<template #header>设计类型</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.subType`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.subType" clearable filterable disabled>
<el-option
v-for="dict in getStrDictOptions(DICT_TYPE.HELI_CH_PROCESS_TYPE)"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<template #default="{ row }">
<span>{{ getDictLabel(DICT_TYPE.HELI_CH_PROCESS_TYPE, row.subType) }}</span>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center">
<el-table-column min-width="55px" align="center">
<template #header>负责人</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.twoDimOwner`" class="mb-0px!">
<el-select class="!w-265px" v-model="row.twoDimOwner" clearable filterable disabled>
<el-option
v-for="dict in userInit"
:key="dict.id"
:label="dict.username + ' ' + dict.nickname"
:value="dict.id"
/>
</el-select>
</el-form-item>
<template #default="{ row }">
<span>{{ getUserNickname(row.twoDimOwner) }}</span>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center">
<el-table-column min-width="60px" align="center">
<template #header>开始日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.startTwoDimDate`" class="mb-0px!">
<el-date-picker
class="!w-265px"
v-model="row.startTwoDimDate"
type="date"
@change="change1(row, 0)"
value-format="x"
placeholder="开始日期"
disabled
:disabled-date="disabledFutureDates"
/>
</el-form-item>
<template #default="{ row }">
<span>{{ formatDate(row.startTwoDimDate, 'YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column min-width="200px" align="center">
<el-table-column min-width="60px" align="center">
<template #header>结束日期</template>
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.twoDimDate`" class="mb-0px!">
<el-date-picker
class="!w-265px"
v-model="row.twoDimDate"
type="date"
@change="change1(row, 1)"
value-format="x"
placeholder="结束日期"
disabled
:disabled-date="disabledFutureDates"
/>
</el-form-item>
<template #default="{ row }">
<span>{{ formatDate(row.twoDimDate, 'YYYY-MM-DD') }}</span>
</template>
</el-table-column>
<el-table-column label="设计天数" align="center" prop="designNum" min-width="120" />
<el-table-column label="设计天数" align="center" prop="designNum" min-width="50px" />
<el-table-column label="时间段顺序" align="center" prop="seqNo" min-width="60px" />
</el-table>
</div>
</div>
<template #footer>
<div class="dialog-footer">
@ -304,13 +333,12 @@
:data="addList"
v-loading="loading3"
highlight-current-row
ref="multipleTableRef" @select="handlerSelect"
ref="multipleTableRef"
@select="handlerSelect"
@selection-change="handleSelectionChange"
@row-click="rowClickHandle"
:row-key="row => row.id"
:row-key="(row) => row.id"
>
<el-table-column type="selection" width="55" />
<el-table-column type="index" label="序号" width="70" align="center" />
<el-table-column prop="projectName" label="项目名称" min-width="180" />
@ -328,13 +356,12 @@
/>
<!-- 底部按钮 -->
<template #footer>
<div class="dialog-footer" style="margin-left: 20%;">
<div class="dialog-footer" style="margin-left: 45%">
<el-button @click="handleAddCancel">取消</el-button>
<el-button type="primary" @click="handleAddConfirm">确认</el-button>
</div>
</template>
</el-dialog>
</template>
@ -370,6 +397,23 @@ const queryParams = reactive({
name: undefined
})
const queryFormRef = ref()
const changeBeginDate = () => {
if (!queryParams.beginTime) {
queryParams.startTime = undefined
}
}
//
const getDictLabel = (dictType, value) => {
const options = getStrDictOptions(dictType)
const option = options.find((item) => item.value === value)
return option ? option.label : value
}
// ID
const getUserNickname = (userId) => {
const user = userInit.value.find((item) => item.id === userId)
return user ? user.nickname : ''
}
//
const addDialogVisible = ref(false)
@ -400,11 +444,11 @@ const rowClickHandle = (row) => {
// multipleTableRef.value.toggleRowSelection(row, true);
// }
if (selectData && selectData.length == 1) {
const [item] = selectData;
const shouldSelect = item !== row;
multipleTableRef.value.toggleRowSelection(row, shouldSelect);
const [item] = selectData
const shouldSelect = item !== row
multipleTableRef.value.toggleRowSelection(row, shouldSelect)
} else {
multipleTableRef.value.toggleRowSelection(row, true);
multipleTableRef.value.toggleRowSelection(row, true)
}
}
// Checkbox
@ -416,7 +460,7 @@ const handlerSelect = (selection, row) => {
}
//
const handleSelectionChange = (val) => {
console.log('表格的选中 可以获得当前选中的数据',val);
console.log('表格的选中 可以获得当前选中的数据', val)
selectedAddRow.value = val
}
//
@ -436,19 +480,19 @@ const resetAddForm = () => {
//
const getAddList = async () => {
try {
loading3.value = true;
loading3.value = true
const params = {
projectCode: addQueryParams.projectCode,
projectSubName: addQueryParams.projectSubName
}
const res = await PlansubdetailApi.pageAddList(params)
console.log(res)
addList.value = res.list;
addtotal.value = res.total;
addList.value = res.list
addtotal.value = res.total
} catch (error) {
message.error('获取项目列表失败:' + error.message)
} finally {
loading3.value = false;
loading3.value = false
}
}
@ -473,9 +517,9 @@ const handleAddCancel = () => {
//
const handleAddConfirm = () => {
for (var i = 0; i < list.value.length; i++) {
var item = list.value[i];
var item = list.value[i]
if (!item.id) {
message.warning('列表中存在未保存数据,请确认!');
message.warning('列表中存在未保存数据,请确认!')
return
}
}
@ -483,16 +527,16 @@ const handleAddConfirm = () => {
message.warning('请先选择要添加的项目')
return
}
selectedAddRow.value[0].twoDimDate = null;
selectedAddRow.value[0].startTwoDimDate = null;
selectedAddRow.value[0].twoDimOwner = null;
selectedAddRow.value[0].subType = null;
selectedAddRow.value[0].designNum = null;
selectedAddRow.value[0].seqNo = null;
selectedAddRow.value[0].isAdd = 1;
selectedAddRow.value[0].flag = 1;
selectedAddRow.value[0].userFlag = true;
selectedAddRow.value[0].id = null;
selectedAddRow.value[0].twoDimDate = null
selectedAddRow.value[0].startTwoDimDate = null
selectedAddRow.value[0].twoDimOwner = null
selectedAddRow.value[0].subType = null
selectedAddRow.value[0].designNum = null
selectedAddRow.value[0].seqNo = null
selectedAddRow.value[0].isAdd = 1
selectedAddRow.value[0].flag = 1
selectedAddRow.value[0].userFlag = true
selectedAddRow.value[0].id = null
list.value.push(selectedAddRow.value[0])
addDialogVisible.value = false
message.success('项目添加成功')
@ -522,9 +566,21 @@ const saveForm = async () => {
}
if (!item.id) {
console.log(item)
var type = ("BLUEPRINT_WORKBLANK" == (item.subType))?"毛坯":("BLUEPRINT_2D" == (item.subType))?"2D":("BLUEPRINT_3D" == (item.subType))?'3D':'新增数据';
var type =
'BLUEPRINT_WORKBLANK' == item.subType
? '毛坯'
: 'BLUEPRINT_2D' == item.subType
? '2D'
: 'BLUEPRINT_3D' == item.subType
? '3D'
: '新增数据'
message.error('该子项目'+item.name+(type == '新增数据'?'新增数据':'设计类型:'+type)+' ,没有保存请确认!')
message.error(
'该子项目' +
item.name +
(type == '新增数据' ? '新增数据' : '设计类型:' + type) +
' ,没有保存请确认!'
)
return
}
}
@ -569,13 +625,14 @@ const dialogVisible = ref(false)
const dialogTitle = ref('插活前')
const currentRow = ref(null)
const insertList = ref([])
const beforeList = ref([])
const modification = async (row) => {
var data = row as unknown as PlansubdetailApi.PlanSubDetailVO
const res = await PlansubdetailApi.modificationPlanSubDetail(data)
if (res.list) {
//
currentRow.value = row
beforeList.value = res.list
insertList.value = res.list
dialogVisible.value = true
dialogTitle.value = '插活前'
@ -587,6 +644,33 @@ const modification = async (row) => {
//
const addItemRow = (row) => {
if (row.id) {
for (var i = 0; i < list.value.length; i++) {
var item = list.value[i]
if (item.isOverProcess) {
item.isOverProcess = 1
} else {
item.isOverProcess = 0
}
if (!item.id) {
console.log(item)
var type =
'BLUEPRINT_WORKBLANK' == item.subType
? '毛坯'
: 'BLUEPRINT_2D' == item.subType
? '2D'
: 'BLUEPRINT_3D' == item.subType
? '3D'
: '新增数据'
message.error(
'该子项目' +
item.name +
(type == '新增数据' ? '新增数据' : '设计类型:' + type) +
' ,没有保存请确认!'
)
return
}
}
//
const newRow = {
...row,
@ -601,22 +685,12 @@ const addItemRow = (row) => {
userFlag: true
}
//
const currentIndex = list.value.findIndex((item) => item === row)
//
if (currentIndex !== -1) {
list.value.splice(currentIndex + 1, 0, newRow)
} else {
//
list.value.push(newRow)
}
list.value.unshift(newRow)
//message.success('')
} else {
message.error('该数据未保存,请确认')
}
}
const getSearchRlTs = async (row, startDateTime: string, endDateTime: string) => {
@ -758,7 +832,7 @@ const change1 = async (row: any, type: number) => {
}
const time = type === 0 ? new Date(row.startTwoDimDate) : new Date(row.twoDimDate)
if (!time || isNaN(time.getTime())) return
if (!time || isNaN(time.getTime()) || formatDate(time, 'YYYY-MM-DD') == '1970-01-01') return
const data = await PlansubdetailApi.getSearchRlTsS(formatDate(time, 'YYYY-MM-DD'))
@ -780,7 +854,7 @@ const change1 = async (row: any, type: number) => {
/** 搜索按钮操作 */
const handleQuery = () => {
if (queryParams.twoDimOwner == null) {
if (!queryParams.twoDimOwner) {
// 使 setTimeout message.error
setTimeout(() => {
message.error('负责人为空,请确认')
@ -803,7 +877,7 @@ const resetQuery = () => {
code: undefined,
name: undefined
})
getList()
// getList()
}
/** 初始化 **/
@ -811,7 +885,7 @@ onMounted(async () => {
try {
//
userInit.value = await UserApi.getDeptName('设计部')
await getList()
// await getList()
} catch (error) {
console.error('初始化失败:', error)
setTimeout(() => {
@ -833,8 +907,9 @@ onMounted(async () => {
}
.status-title {
margin-top: -7%;
margin-bottom: 20px;
text-align: center;
text-align: left;
}
.status-title h3 {

View File

@ -643,7 +643,8 @@
row.id,
'startBlankDate',
'blankDate',
'blankNum'
'blankNum',
'start'
)
"
/>
@ -672,7 +673,8 @@
row.id,
'startBlankDate',
'blankDate',
'blankNum'
'blankNum',
'end'
)
"
/>
@ -731,7 +733,8 @@
row.id,
'startThreeDimDate',
'threeDimDate',
'threeDimNum'
'threeDimNum',
'start'
)
"
/>
@ -760,7 +763,8 @@
row.id,
'startThreeDimDate',
'threeDimDate',
'threeDimNum'
'threeDimNum',
'end'
)
"
/>
@ -818,7 +822,8 @@
row.id,
'startTwoDimDate',
'twoDimDate',
'twoDimNum'
'twoDimNum',
'start'
)
"
/>
@ -847,7 +852,8 @@
row.id,
'startTwoDimDate',
'twoDimDate',
'twoDimNum'
'twoDimNum',
'end'
)
"
/>
@ -1445,7 +1451,8 @@ const handleDateChange = async (
id,
startField,
endField,
dataNumField
dataNumField,
type
) => {
var nowDa = new Date()
var nowDataStr = nowDa.toLocaleDateString('en-CA')
@ -1512,8 +1519,12 @@ const handleDateChange = async (
//
if (startBlankDate > blankDate) {
message.error('开始时间必须早于结束时间,否则无法计算设计天数,请检查')
rowData[startField] = null
if (type == 'end') {
rowData[endField] = null
} else {
rowData[startField] = null
}
rowData[dataNumField] = null
return
}
@ -2396,11 +2407,11 @@ const submitForm = async () => {
// }
// //subData.id = subData.projectSubId
// })
reload()
message.success(t('common.updateSuccess'))
//
// emit('success')
} finally {
reload()
formLoading.value = false
}
}