生产计划 打印

生产计划 打印
pull/4/head
siontion 8 months ago
parent d880d03bac
commit 7389c5d418

@ -0,0 +1,26 @@
package com.chanko.yunxi.mes.module.heli.enums;
import lombok.Getter;
/**
*
* @author chenxi
* @date 2024-01-18 01:19
*/
@Getter
public enum ProjectPlanStatusEnum {
START(1, "未开始"),
PRODUCING(2, "生产中"),
COMPLETE(3, "已完成"),
TERMINATE(4, "已终止"),
CHANGE(5, "已变更"),
;
private int code;
private String description;
ProjectPlanStatusEnum(int code, String description) {
this.code = code;
this.description = description;
}
}

@ -14,6 +14,8 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.projectorder.vo.Project
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum; import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.service.plan.PlanService;
import com.chanko.yunxi.mes.module.heli.service.plansub.PlanSubService;
import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService; import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService;
import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.Parameter;
@ -43,6 +45,13 @@ public class ProjectOrderController {
@Resource @Resource
private ProjectOrderService projectOrderService; private ProjectOrderService projectOrderService;
@Resource
private PlanService planService;
@Resource
private PlanSubService planSubService;
@Resource @Resource
private OperateLogFrameworkService operateLogFrameworkService; private OperateLogFrameworkService operateLogFrameworkService;
@ -84,7 +93,13 @@ public class ProjectOrderController {
// 批准、终止记录快照 // 批准、终止记录快照
switch (OperateTypeEnum.valueOf(operateReqVO.getActive())){ switch (OperateTypeEnum.valueOf(operateReqVO.getActive())){
case APPROVE: case APPROVE:
// 订单批准时创建或者更新生产计划数据
planService.generatePlanByProjectId(operateReqVO.getId());
projectOrderService.createProjectOrderSnapshot(operateReqVO);
break;
case TERMINATE: case TERMINATE:
// 订单终止时更新生产计划状态
planService.updatePlanStatusToTerminateByProjectId(operateReqVO.getId());
projectOrderService.createProjectOrderSnapshot(operateReqVO); projectOrderService.createProjectOrderSnapshot(operateReqVO);
break; break;
} }

@ -105,7 +105,7 @@ public class PlanDO extends BaseDO {
/** /**
* *
*/ */
private String changeLastDate; private LocalDateTime changeLastDate;
@TableField(exist = false) @TableField(exist = false)
private String projectCode; private String projectCode;

@ -52,4 +52,6 @@ public interface PlanService {
*/ */
PageResult<PlanDO> getPlanPage(PlanPageReqVO pageReqVO); PageResult<PlanDO> getPlanPage(PlanPageReqVO pageReqVO);
void generatePlanByProjectId(Long projectId);
void updatePlanStatusToTerminateByProjectId(Long projectId);
} }

@ -1,15 +1,27 @@
package com.chanko.yunxi.mes.module.heli.service.plan; package com.chanko.yunxi.mes.module.heli.service.plan;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderSubDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.heli.enums.CodeEnum; import com.chanko.yunxi.mes.module.heli.enums.CodeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProjectPlanStatusEnum;
import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService; import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import com.github.dadiyang.equator.FieldInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import javax.annotation.Resource; import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated; import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.*; import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.*;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO; import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult; import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
@ -28,6 +40,7 @@ import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
* *
* @author * @author
*/ */
@Slf4j
@Service @Service
@Validated @Validated
public class PlanServiceImpl implements PlanService { public class PlanServiceImpl implements PlanService {
@ -35,6 +48,12 @@ public class PlanServiceImpl implements PlanService {
@Resource @Resource
private PlanMapper planMapper; private PlanMapper planMapper;
@Resource
private PlanSubMapper planSubMapper;
@Resource
private ProjectOrderService projectOrderService;
@Resource @Resource
private SerialNumberService serialNumberService; private SerialNumberService serialNumberService;
@ -90,4 +109,66 @@ public class PlanServiceImpl implements PlanService {
return planMapper.selectPage(pageReqVO); return planMapper.selectPage(pageReqVO);
} }
@Override
public void generatePlanByProjectId(Long projectId){
// 查询最近归档历史并对比变化字段
try {
PlanDO planDO = planMapper.selectOne(new LambdaQueryWrapper<PlanDO>() {{
eq(PlanDO::getProjectId, projectId);
orderByDesc(PlanDO::getId);
last("LIMIT 1");
}});
if(planDO != null){
// 设置项目更新次数
planDO.setChangeNum(planDO.getChangeNum()+1);
// 设置项目更新时间
planDO.setChangeLastDate(LocalDateTime.now());
// 设置生产计划状态
planDO.setStatus(ProjectPlanStatusEnum.CHANGE.getCode());
planMapper.updateById(planDO);
}else{
planDO = new PlanDO();
// 设置项目更新次数
planDO.setChangeNum(0);
// 设置生产计划状态
planDO.setStatus(ProjectPlanStatusEnum.START.getCode());
planMapper.insert(planDO);
// 生成生产计划子项目信息
List<ProjectOrderSubDO> projectOrderSubDOs = projectOrderService.getProjectOrderSubListByProjectOrderId(projectId);
for(ProjectOrderSubDO item : projectOrderSubDOs){
PlanSubDO planSubDO = new PlanSubDO();
planSubDO.setProjectPlanId(planDO.getId());
planSubDO.setProjectId(projectId);
planSubDO.setProjectSubId(item.getId());
planSubMapper.insert(planSubDO);
}
}
}catch (Exception e){
log.error("base projectId to generate planDo error, id: {}, exception: {}", projectId, e.getMessage(), e);
}
}
@Override
public void updatePlanStatusToTerminateByProjectId(Long projectId){
// 查询最近归档历史并对比变化字段
try {
PlanDO planDO = planMapper.selectOne(new LambdaQueryWrapper<PlanDO>() {{
eq(PlanDO::getProjectId, projectId);
orderByDesc(PlanDO::getId);
last("LIMIT 1");
}});
if(planDO != null){
// 设置项目更新次数
planDO.setChangeNum(planDO.getChangeNum()+1);
// 设置项目更新时间
planDO.setChangeLastDate(LocalDateTime.now());
// 设置生产计划状态
planDO.setStatus(ProjectPlanStatusEnum.TERMINATE.getCode());
planMapper.updateById(planDO);
}
}catch (Exception e){
log.error("base projectId to update planDo's status error, id: {}, exception: {}", projectId, e.getMessage(), e);
}
}
} }

@ -419,7 +419,10 @@
<template #header> 责任人 </template> <template #header> 责任人 </template>
<template #default="{ row, $index }"> <template #default="{ row, $index }">
<el-form-item :prop="`${$index}.owner`" class="mb-0px!"> <el-form-item :prop="`${$index}.owner`" class="mb-0px!">
<el-input v-model="row.owner" placeholder="责任人" /> <el-select class="!w-265px" v-model="row.owner" filterable >
<el-option v-for="dict in userInit" :key="dict.id"
:label="dict.nickname" :value="dict.id" />
</el-select>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>

@ -23,7 +23,7 @@
<tr> <tr>
<td colspan="2"> 客户名称 </td> <td colspan="2"> 客户名称 </td>
<td colspan="5"> <td colspan="5">
<span>{{ formData.customer.name }}</span> <span>{{ formData.customerName }}</span>
</td> </td>
<td colspan="1">{{ formData.customer.brief }}</td> <td colspan="1">{{ formData.customer.brief }}</td>
<td> 编码 </td> <td> 编码 </td>
@ -52,8 +52,8 @@
<td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.isUrgency) }} </td> <td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.isUrgency) }} </td>
</tr> </tr>
<tr> <tr>
<td colspan="2"> 项目负责: </td> <td colspan="2"> 项目负责: </td>
<td colspan="2">{{ `111` }} </td> <td colspan="2">{{ userInit.find((user) => user.id == planData.projectOwner)?.nickname }} </td>
<td colspan="2"> <td colspan="2">
<div style="width: 100%; display: flex; justify-content: center; font-size: 12px"> <div style="width: 100%; display: flex; justify-content: center; font-size: 12px">
<div> <div>
@ -88,14 +88,14 @@
</td> </td>
</tr> </tr>
<tr> <tr>
<td colspan="2">是否要工:</td> <td colspan="2">是否要工:</td>
<td>{{ `` }}</td> <td>{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, planData.property) }}</td>
<td>开始日期</td> <td>开始日期</td>
<td>{{ `2024/1/15` }}</td> <td>{{ formatDate(new Date(planData.craftStartDate), 'YYYY-MM-DD') }}</td>
<td>结束日期</td> <td>结束日期</td>
<td>{{ `2024/1/15` }}</td> <td>{{ formatDate(new Date(planData.craftEndDate), 'YYYY-MM-DD') }}</td>
<td>负责人</td> <td>负责人</td>
<td colspan="2">{{ `2024/1/15` }}</td> <td colspan="2">{{ userInit.find((user) => user.id == planData.craftOwner)?.nickname }}</td>
</tr> </tr>
<tbody> <tbody>
@ -119,8 +119,8 @@
<td colspan="3" style="padding: 0 0"> <td colspan="3" style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between"> <div style="display: flex; flex-direction: column; justify-content: space-between">
<span style="border-bottom: 1px solid #666"> {{item.name}} </span> <span style="border-bottom: 1px solid #666"> {{item.name}} </span>
<span v-if="!item.deviceModel">&nbsp;</span> <span v-if="!item.projectSubShortName">&nbsp;</span>
<span v-else>{{item.deviceModel}}</span> <span v-else>{{item.projectSubShortName}}</span>
</div> </div>
</td> </td>
<td>{{item.compositionName}} </td> <td>{{item.compositionName}} </td>
@ -357,6 +357,7 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
// import { ref, reactive } from 'vue' // import { ref, reactive } from 'vue'
import * as UserApi from '@/api/system/user'
import * as PlanApi from '@/api/heli/plan' import * as PlanApi from '@/api/heli/plan'
import * as PlanSubApi from '@/api/heli/plansub' import * as PlanSubApi from '@/api/heli/plansub'
import * as ProjectOrderApi from '@/api/heli/projectorder' import * as ProjectOrderApi from '@/api/heli/projectorder'
@ -461,7 +462,7 @@ const outopen = () => {
const queryParams: any = ref({ const queryParams: any = ref({
code: undefined code: undefined
}) })
const isSelected = ref([1, 3]) const isSelected = ref([2, 3])
const formData = ref({ const formData = ref({
id: undefined, id: undefined,
@ -534,8 +535,11 @@ const planData = ref({
craftInfos: [], craftInfos: [],
craftContent: undefined craftContent: undefined
}) })
const userInit = ref()
/** 打开弹窗 */ /** 打开弹窗 */
const open = async (id: number) => { const open = async (id: number) => {
//
userInit.value = await UserApi.getSimpleUserList()
// //
// LogoBase64URL // LogoBase64URL
const logoImage = new Image() const logoImage = new Image()

Loading…
Cancel
Save