添加批量审批

This commit is contained in:
z 2025-09-12 20:36:40 +08:00
parent ee32488786
commit c114c17a99
16 changed files with 515 additions and 218 deletions

View File

@ -269,6 +269,20 @@ public class ProcessBomController {
public CommonResult<Boolean> withdraw(@RequestParam("code") String code) {
return processBomService.withdraw(code);
}
@GetMapping("/updateById")
@Operation(summary = "修改生产任务单")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:process-bom:query')")
public CommonResult<Boolean> updateById(@RequestParam("code") String code) {
return processBomService.updateById(code);
}
@GetMapping("/selectPlanTaskStatus")
@Operation(summary = "查看生产任务单状态")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:process-bom:query')")
public CommonResult<Boolean> selectPlanTaskStatus(@RequestParam("id") String id) {
return processBomService.selectPlanTaskStatus(id);
}
@GetMapping("/exportStandard")
@Operation(summary = "导出标准件物料需求计划Excel")
@OperateLog(type = EXPORT)

View File

@ -171,9 +171,9 @@ public class PurchaseOrderMakeController {
public CommonResult<Boolean> rejects(@RequestParam("id") Long id) {
return success(partPurchaseOrderService.rejects(id));
}
@GetMapping("/approvals")
@PostMapping("/approvals")
@Operation(summary = "采购单批准")
public CommonResult<Boolean> approvals(@RequestParam("id") Long id) {
return success(partPurchaseOrderService.approvals(id));
public CommonResult<Boolean> approvals(@Valid @RequestBody List<PurchaseOrderMakeDetailDO> list) {
return success(partPurchaseOrderService.approvals(list));
}
}

View File

@ -139,15 +139,19 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
// 校验存在
DeliverOrderDO oldDO = validateDeliverOrderExists(updateReqVO.getId());
OperateTypeEnum operateTypeEnum = OperateTypeEnum.valueOf(updateReqVO.getActive());
if(!oldDO.canOperate(operateTypeEnum)){
throw exception(INVALID_OPERATE);
}
// 超额校验
overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs());
// if(!oldDO.canOperate(operateTypeEnum)){
// throw exception(INVALID_OPERATE);
// }
// 更新
DeliverOrderDO updateObj = BeanUtils.toBean(updateReqVO, DeliverOrderDO.class);
updateObj.setDeliverStatus(DeliverOrderStatusEnum.valueOf(updateReqVO.getActive()).getCode());
if (oldDO.getDeliverStatus()==2){
updateObj.setDeliverStatus(2);
}else {
// 超额校验
overageDeliverValidate(updateReqVO.getSaleOrderIds(), updateReqVO.getDeliverOrderSubs());
}
deliverOrderMapper.updateById(updateObj);
updateReqVO.setDeliverStatus(updateObj.getDeliverStatus());

View File

@ -7,6 +7,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.Pa
import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermake.vo.PurchaseOrderMakeSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
import java.util.List;
@ -68,7 +69,7 @@ public interface PartPurchaseOrderService {
Long countReview();
Boolean approvals(Long id);
Boolean approvals(List<PurchaseOrderMakeDetailDO> list);
Boolean rejects(Long id);
}

View File

@ -20,6 +20,7 @@ import com.chanko.yunxi.mes.module.heli.controller.admin.purchaseordermakedetail
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.MaterialPlanBoomDO;
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.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermake.PurchaseOrderMakeDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseordermakedetail.PurchaseOrderMakeDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
@ -29,6 +30,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.supplier.SupplierDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanBoomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plan.PlanMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plansub.PlanSubMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermake.PurchaseOrderMakeMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseordermakedetail.PurchaseOrderMakeDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper;
@ -50,10 +52,8 @@ import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils.getLoginUser;
@ -84,6 +84,8 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
private OrderYfService orderYfService;
@Autowired
private SupplierMapper supplierMapper;
@Autowired
private ProcessBomDetailMapper processBomDetailMapper;
@Override
public PageResult<PartPurchaseOrderPageRespVO> getPartPurchaseOrderPage(PartPurchaseOrderPageReqVO pageReqVO) {
@ -190,16 +192,41 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
@Override
public boolean updatePartCheckStatusNo(PurchaseOrderMakeSaveReqVO updateReqVO) {
PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
purchaseOrderMakeDO.setId(updateReqVO.getId());
purchaseOrderMakeDO.setStatus(3);
purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
purchaseOrderMakeMapper.deleteById(purchaseOrderMakeDO);
LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, updateReqVO.getId());
purchaseOrderMakeDetailMapper.delete(wrapper);
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", updateReqVO.getId());
// PurchaseOrderMakeDO purchaseOrderMakeDO = new PurchaseOrderMakeDO();
// purchaseOrderMakeDO.setId(updateReqVO.getId());
// purchaseOrderMakeDO.setStatus(3);
// purchaseOrderMakeMapper.updateById(purchaseOrderMakeDO);
// purchaseOrderMakeMapper.deleteById(purchaseOrderMakeDO);
//
// LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaUpdateWrapper<>();
// wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, updateReqVO.getId());
// purchaseOrderMakeDetailMapper.delete(wrapper);
// List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_id", updateReqVO.getId());
// materialPlanBoomDOs.forEach(materialPlanBoom -> {
// UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
// updateWrapper.eq("id", materialPlanBoom.getId())
// .set("mplan_status", 3)
// .set("project_purchase_order_make_id", null)
// .set("purchase_no", null)
// .set("project_purchase_order_make_detail_id", null)
// .set("rej_remark", updateReqVO.getReason());
// materialPlanBoomMapper.update(updateWrapper);
// });
// return true;
PurchaseOrderMakeDetailDO orderMakeDetailDO = purchaseOrderMakeDetailMapper.selectById(updateReqVO.getId());
if (ObjectUtil.isNotEmpty(orderMakeDetailDO)){
if (orderMakeDetailDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
PurchaseOrderMakeDO orderMakeDO = purchaseOrderMakeMapper.selectById(orderMakeDetailDO.getPurchaseOrderId());
purchaseOrderMakeDetailMapper.deleteById(orderMakeDetailDO);
if (ObjectUtil.isNotEmpty(orderMakeDO)){
LambdaQueryWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(PurchaseOrderMakeDetailDO::getPurchaseOrderId, orderMakeDO.getId());
if (purchaseOrderMakeDetailMapper.selectCount(wrapper) == 0){
purchaseOrderMakeMapper.deleteById(orderMakeDO.getId());
}
}
}
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", updateReqVO.getId());
materialPlanBoomDOs.forEach(materialPlanBoom -> {
UpdateWrapper<MaterialPlanBoomDO> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", materialPlanBoom.getId())
@ -207,11 +234,14 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
.set("project_purchase_order_make_id", null)
.set("purchase_no", null)
.set("project_purchase_order_make_detail_id", null)
.set("rej_remark", updateReqVO.getReason());
.set("estimated_price", BigDecimal.ZERO)
.set("supplier_id", null)
.set("rej_remark", updateReqVO.getReason())
.set("mat_rest",null);
materialPlanBoomMapper.update(updateWrapper);
});
return true;
}
@Override
@ -307,7 +337,20 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
purchaseOrderMakeMapper.insert(purchaseOrderMakeDO);
long purchaseOrderMakeId = purchaseOrderMakeDO.getId();
String purchaseOrderMakeDOPurchaseNo = purchaseOrderMakeDO.getPurchaseNo();
Map<Long, String> groupedResult = updateReqVOs.stream()
.collect(Collectors.groupingBy(
MaterialPlanBoomDO::getBoomDetailId, // 根据 boomDetailId 分组
Collectors.collectingAndThen(
Collectors.toList(), // 将同组元素收集为 List
list -> list.get(0).getBoomSpec() // 取第一个元素的 boomSpec
)
));
groupedResult.forEach((boomDetailId, boomSpec) -> {
LambdaUpdateWrapper<ProcessBomDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(ProcessBomDetailDO::getId,boomDetailId);
lambdaUpdateWrapper.set(ProcessBomDetailDO::getSpec, boomSpec);
processBomDetailMapper.update(lambdaUpdateWrapper);
});
updateReqVOs.forEach(updateReq -> {
createPurchaseOrderMakeAndDetail(updateReq,purchaseOrderMakeId, purchaseOrderMakeDOPurchaseNo,planDO.getId());
});
@ -357,22 +400,31 @@ public class PartPurchaseOrderServiceImpl implements PartPurchaseOrderService{
}
@Override
public Boolean approvals(Long id) {
PurchaseOrderMakeDetailDO orderMakeDetailDO = purchaseOrderMakeDetailMapper.selectById(id);
if (ObjectUtil.isNotEmpty(orderMakeDetailDO)){
if (orderMakeDetailDO.getStatus() != 1) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
orderMakeDetailDO.setStatus(2);
orderMakeDetailDO.setAuditTime(LocalDateTime.now());
orderMakeDetailDO.setAuditor(getLoginUser().getId());
purchaseOrderMakeDetailMapper.updateById(orderMakeDetailDO);
public Boolean approvals(List<PurchaseOrderMakeDetailDO> list) {
if (ObjectUtil.isNotEmpty( list)){
List<Long> ids = list.stream().map(PurchaseOrderMakeDetailDO::getId).collect(Collectors.toList());
LambdaQueryWrapper<PurchaseOrderMakeDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(PurchaseOrderMakeDetailDO::getId, ids);
wrapper.ne(PurchaseOrderMakeDetailDO::getStatus,1);
if (purchaseOrderMakeDetailMapper.selectCount(wrapper) > 0) throw exception(new ErrorCode(400,"该单据状态非待审核,请刷新界面!"));
LambdaUpdateWrapper<PurchaseOrderMakeDetailDO> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper.in(PurchaseOrderMakeDetailDO::getId, ids);
updateWrapper.set(PurchaseOrderMakeDetailDO::getStatus,2);
updateWrapper.set(PurchaseOrderMakeDetailDO::getAuditTime, LocalDateTime.now());
updateWrapper.set(PurchaseOrderMakeDetailDO::getAuditor, getLoginUser().getId());
purchaseOrderMakeDetailMapper.update(updateWrapper);
LambdaUpdateWrapper<MaterialPlanBoomDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.in(MaterialPlanBoomDO::getProjectPurchaseOrderMakeDetailId, ids);
lambdaUpdateWrapper.set(MaterialPlanBoomDO::getMplanStatus,2);
materialPlanBoomMapper.update(lambdaUpdateWrapper);
// List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", id);
// materialPlanBoomDOs.forEach(materialPlanBoomDO -> {
// MaterialPlanBoomDO materialPlanBoom = new MaterialPlanBoomDO();
// materialPlanBoom.setId(materialPlanBoomDO.getId());
// materialPlanBoom.setMplanStatus(2);
// materialPlanBoomMapper.updateById(materialPlanBoom);
// });
}
List<MaterialPlanBoomDO> materialPlanBoomDOs= materialPlanBoomMapper.selectList("project_purchase_order_make_detail_id", id);
materialPlanBoomDOs.forEach(materialPlanBoomDO -> {
MaterialPlanBoomDO materialPlanBoom = new MaterialPlanBoomDO();
materialPlanBoom.setId(materialPlanBoomDO.getId());
materialPlanBoom.setMplanStatus(2);
materialPlanBoomMapper.updateById(materialPlanBoom);
});
return true;
}

View File

@ -116,4 +116,8 @@ public interface ProcessBomService {
BigDecimal assemblyLaborCost(Long id, Long projectSubId);
CommonResult<Boolean> delMaterialPlan(Long id, String projectMaterialPlanNo);
CommonResult<Boolean> updateById(String code);
CommonResult<Boolean> selectPlanTaskStatus(String id);
}

View File

@ -13,6 +13,7 @@ import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
import com.chanko.yunxi.mes.framework.excel.core.util.ExcelUtils;
import com.chanko.yunxi.mes.framework.operatelog.core.enums.OperateTypeEnum;
import com.chanko.yunxi.mes.framework.operatelog.core.service.OperateLogFrameworkService;
import com.chanko.yunxi.mes.framework.security.core.util.SecurityFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomImportExcelVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO;
@ -29,6 +30,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantask.PlanTaskDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plantaskbom.PlanTaskBomDO;
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.purchaseordernodetail.PurchaseOrderNoDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.shenhe.ShenheDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
@ -51,6 +53,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.storagelog.StorageLogNowMapper
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskreport.TaskReportMapper;
import com.chanko.yunxi.mes.module.heli.enums.BusinesTypeEnum;
import com.chanko.yunxi.mes.module.heli.enums.ProcessBomStatusEnum;
import com.chanko.yunxi.mes.module.heli.enums.YesOrNoEnum;
import com.chanko.yunxi.mes.module.heli.service.attentiontodo.AttentiontodoService;
@ -65,6 +68,7 @@ import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.chanko.yunxi.mes.module.system.dal.mysql.dict.DictDataMapper;
import com.chanko.yunxi.mes.module.system.service.user.AdminUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.parameters.P;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
@ -85,6 +89,7 @@ import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.error;
import static com.chanko.yunxi.mes.framework.common.pojo.CommonResult.success;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.MATERIAL_PLAN;
import static com.chanko.yunxi.mes.module.heli.enums.ErrorCodeConstants.*;
@ -486,10 +491,13 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<PlanTaskBomDO> planTaskBomDOS = planTaskBomMapper.selectList(wrapper);
if (ObjectUtil.isNotEmpty(planTaskBomDOS)){
List<Long> collect = planTaskBomDOS.stream().map(PlanTaskBomDO::getTaskId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty( collect)){
LambdaQueryWrapper<PlanTaskDO> planTaskDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
planTaskDOLambdaQueryWrapper.in(PlanTaskDO::getId, collect);
planTaskDOLambdaQueryWrapper.eq(PlanTaskDO::getStatus, 2);
if (planTaskMapper.selectCount(planTaskDOLambdaQueryWrapper) > 0) throw exception(new ErrorCode(1_007_9999,"该生产任务单状态已提交请先取消再修改BOM"));
}
}
//标准件不管材质非标准件材质必填
@ -559,13 +567,21 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
if (ObjectUtil.isNotEmpty(list)){
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty( collect)) {
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
if (ObjectUtil.isNotEmpty(detailDOS)) {
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(collect1)) {
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改零件名称"));
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper) > 0)
throw exception(new ErrorCode(1_007_9988, "物料" + po.getMaterialName() + "已报工,不允许修改零件名称"));
}
}
}
}
}
if (!vo.getBlueprintNo().equals(po.getBlueprintNo())) {
@ -578,14 +594,19 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
if (ObjectUtil.isNotEmpty(list)){
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(collect)){
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
List<Long> collect1 = detailDOS.stream().map(TaskDispatchDetailDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(collect1)){
LambdaQueryWrapper<TaskReportDO> taskReportDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
taskReportDOLambdaQueryWrapper.in(TaskReportDO::getDispatchDetailId, collect1);
if (taskReportMapper.selectCount(taskReportDOLambdaQueryWrapper)>0) throw exception(new ErrorCode(1_007_9988,"物料"+po.getMaterialName()+"已报工,不允许修改图号"));
}
}
}
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
}
if (!vo.getAmount().equals(po.getAmount())) {
@ -595,11 +616,13 @@ public class ProcessBomServiceImpl implements ProcessBomService {
List<TaskDispatchDO> list = taskDispatchMapper.selectList(queryWrapper);
if (ObjectUtil.isNotEmpty(list)){
List<Long> collect = list.stream().map(TaskDispatchDO::getId).distinct().collect(Collectors.toList());
if (ObjectUtil.isNotEmpty( collect)){
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.in(TaskDispatchDetailDO::getDispatchId, collect);
wrapper.eq(TaskDispatchDetailDO::getProcedureStatus, 2);
if (taskDispatchDetailMapper.selectCount(wrapper)>0) throw exception(new ErrorCode(1_007_9998,"该零件"+po.getMaterialName()+"工序已报工完成,不允许修改"));
}
}
vo.setBomEditStatus(BomEditStatusEnum.HAS_EDIT.getStatus());
}
}
@ -1530,6 +1553,26 @@ public class ProcessBomServiceImpl implements ProcessBomService {
return CommonResult.error(400,"boom明细不存在,请刷新页面");
}
@Override
public CommonResult<Boolean> updateById(String code) {
LambdaUpdateWrapper<PlanTaskDO> wrapper = new LambdaUpdateWrapper<>();
wrapper.eq(PlanTaskDO::getProcessBomId, code);
wrapper.set(PlanTaskDO ::getStatus,1);
planTaskMapper.update(wrapper);
return success( true);
}
@Override
public CommonResult<Boolean> selectPlanTaskStatus(String id) {
LambdaQueryWrapper<PlanTaskDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(PlanTaskDO::getProcessBomId, id);
PlanTaskDO planTaskDO = planTaskMapper.selectOne(lambdaQueryWrapper);
if (ObjectUtil.isNotEmpty(planTaskDO)){
if (planTaskDO.getStatus()==2) return CommonResult.success(true);
}
return success(false);
}
private void createProcessBomDetailList(String bomCode,Long bomId, List<ProcessBomDetailDO> list,Integer num) {
LocalDateTime now = LocalDateTime.now();

View File

@ -73,6 +73,6 @@ export const obtainReviewDetails = async (id:number) => {
export const rejects = async (id:number) => {
return await request.get({ url: `/heli/purchase-order-make/rejects?id=` +id })
}
export const approvals = async (id: number) => {
return await request.get({ url: `/heli/purchase-order-make/approvals?id=` + id })
export const approvals = async (data) => {
return await request.post({ url: `/heli/purchase-order-make/approvals`,data })
}

View File

@ -104,3 +104,9 @@ export const planBZJPage = async (params) => {
export const delMaterialPlan = async (id: number,projectMaterialPlanNo:string) => {
return await request.delete({ url: `/heli/process-bom/delMaterialPlan?id=` + id+"&projectMaterialPlanNo="+projectMaterialPlanNo})
}
export const updateById = async (code) => {
return await request.get({ url: `/heli/process-bom/updateById?code=` + code })
}
export const selectPlanTaskStatus = async (id) => {
return await request.get({ url: `/heli/process-bom/selectPlanTaskStatus?id=` + id })
}

View File

@ -243,7 +243,7 @@
</el-table-column>
<el-table-column label="操作" align="center" min-width="100">
<template #default="scope">
<el-button v-if="'update,create,deliver'.indexOf(active) > -1" link type="danger" size="small" @click.prevent="onDeleteItem(scope.$index)">
<el-button v-if="'update,create,deliver'.indexOf(active) > -1 &&formData.deliverStatus != 2" link type="danger" size="small" @click.prevent="onDeleteItem(scope.$index)">
删除
</el-button>
</template>
@ -344,7 +344,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,deliver'.indexOf(active) > -1" link type="danger" size="small" @click="handleDeleteAttachment(scope.$index, scope.row.businessFileType)">
<el-button v-if="'update,create,deliver'.indexOf(active) > -1 && formData.deliverStatus != 2" 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)">
@ -362,9 +362,9 @@
<template #header>
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">操作日志</span>
<el-button @click="goback" size="large" style="margin-left: 5rem"> </el-button>
<el-button v-if="active != 'detail' && formData.deliverStatus == 1" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="active != 'detail'" @click="submitForm('SAVE')" type="success" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="(((active != 'detail' && formData.id) || active == 'deliver') && formData.deliverStatus == 1)" @click="submitForm('DELIVER')" type="primary" :disabled="formLoading" size="large"> </el-button>
<el-button v-if="active == 'detail' && formData.deliverStatus == 2 && formData.id" type="primary" @click="printHandle" :disabled="formLoading" size="large">打印发货单</el-button>
<el-button v-if=" formData.id" type="primary" @click="printHandle" :disabled="formLoading" size="large">打印发货单</el-button>
</template>
<el-row>
<el-col>
@ -912,7 +912,7 @@ const queryData = async (type: string, id?: number) => {
dialogTitle.value = t('action.' + type)
//
formLoading.value = true
formData.value.deliverDate = new Date().getTime()
// formData.value.deliverDate = new Date().getTime()
try {
if (id) {
formData.value = await DeliverOrderApi.getDeliverOrder(id)

View File

@ -0,0 +1,80 @@
<template>
<Dialog :title="dialogTitle" v-model="dialogVisible" @close="cancel">
<el-form
ref="formRef"
:model="formData"
:rules="formRules"
label-width="100px"
v-loading="formLoading"
>
<el-form-item label="驳回原因" prop="reason">
<el-input type="textarea" :rows="5" v-model="formData.reason" placeholder="请输入驳回原因" />
</el-form-item>
</el-form>
<template #footer>
<el-button @click="submitForm" type="primary" :disabled="formLoading"> </el-button>
<el-button @click="dialogVisible = false"> </el-button>
</template>
</Dialog>
</template>
<script setup lang="ts">
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
import {updatePurchaseOrderMakeNo} from "@/api/heli/partpurchaseorder";
const { t } = useI18n() //
const message = useMessage() //
const dialogVisible = ref(false) //
const dialogTitle = ref('') //
const formLoading = ref(false) // 12
const formType = ref('') // create - update -
const formData = ref({
id: undefined,
reason: undefined,
})
const formRules = reactive({
reason: [{ required: true, message: '驳回原因不能为空', trigger: 'blur' }],
})
const formRef = ref() // Ref
/** 打开弹窗 */
const open = async (id?: number) => {
dialogVisible.value = true
resetForm()
formData.value.id=id
}
defineExpose({ open }) // open
/** 提交表单 */
const emit = defineEmits(['success']) // success
const cancel = async () => {
dialogVisible.value = false
emit('success')
}
const submitForm = async () => {
//
await formRef.value.validate()
//
formLoading.value = true
try {
dialogVisible.value = false
await PartPurchaseOrderApi.updatePurchaseOrderMakeNo(formData.value)
//
message.success("驳回成功");
emit('success')
} finally {
formLoading.value = false
}
}
/** 重置表单 */
const resetForm = () => {
formData.value = {
id: undefined,
reason:undefined,
}
formRef.value?.resetFields()
}
</script>

View File

@ -64,16 +64,23 @@
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table" show-summary :summary-method="getSummaries">
<el-card class="hl-card-info">
<template #header>
<el-button style="margin-left: 20px" @click="approves()" type="success" size="large">全部审核</el-button>
</template>
<el-row>
<el-col>
<el-form ref="multipleTable" :model="list" v-loading="formLoading" label-width="0" >
<el-table v-loading="loading" :data="list" :show-overflow-tooltip="true" class="hl-table" show-summary :summary-method="getSummaries" @selection-change="handleSelectionChange" :row-class-name="tableRowClassName">
<el-table-column type="selection" width="70"/>
<el-table-column label="序号" type="index" align="center" fixed min-width="70px" />
<el-table-column label="送审日期" align="center" prop="createTime" min-width="150px" :formatter="dateFormatter1"/>
<el-table-column label="客户简称" align="center" prop="brief" min-width="100px" />
<!-- <el-table-column label="客户简称" align="center" prop="brief" min-width="100px" />-->
<el-table-column label="子项目编码" align="center" prop="projectSubCode" min-width="250px" />
<el-table-column label="图号" align="center" prop="blueprintNo" min-width="120px" />
<el-table-column label="零件名称" align="center" prop="boomName" min-width="180px" />
<el-table-column label="规格" align="center" prop="boomSpec" min-width="120px" />
<el-table-column label="材料" align="center" prop="composition" min-width="120px" />
<el-table-column label="工序" align="center" prop="procedureName" min-width="120px" />
<el-table-column label="需求数量" align="center" prop="boomAmount" min-width="100px" />
<el-table-column label="采购数量" align="center" prop="purchaseAmount" min-width="100px" fixed="right" />
@ -93,11 +100,11 @@
v-if="scope.row.status != 2"
link
type="primary"
@click="approve(scope.row.id)"
@click="approve(scope.row)"
>
审核
</el-button>
<el-button link type="danger" @click="reject(scope.row.id)" v-if="scope.row.status != 2">
<el-button link type="danger" @click="openForm(scope.row.id)" v-if="scope.row.status != 2">
驳回
</el-button>
</template>
@ -106,22 +113,32 @@
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize"
@pagination="getList" />
</ContentWrap>
</el-form>
</el-col>
</el-row>
</el-card>
<Form ref="formRef" @success="getList" />
</el-card>
</template>
<script setup lang="ts">
import {DICT_TYPE, getIntDictOptions} from '@/utils/dict'
import * as MaterialPlanApi from '@/api/heli/materialplan'
import * as PartPurchaseOrderApi from "@/api/heli/partpurchaseorder";
import Form from "./Form.vue"
import {dateFormatter1} from "@/utils/formatTime";
import {approvals, review} from "@/api/heli/partpurchaseorder";
import {ref} from "vue";
import {ElTable, ElTableColumn} from "element-plus";
defineOptions({ name: 'PartPurchaseCheck' })
const router = useRouter()
const message = useMessage() //
const { t } = useI18n() //
const formLoading = ref(false) // 12
const updateParams = reactive({
id: undefined,
reason: undefined
})
const loading = ref(true) //
const list = ref([]) //
@ -155,6 +172,7 @@ const queryParams = reactive({
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
const multipleTable = ref<InstanceType<typeof ElTable>>()
/** 查询列表 */
const getList = async () => {
@ -162,27 +180,77 @@ const getList = async () => {
try {
const data = await PartPurchaseOrderApi.getPartCheckPages(queryParams)
list.value = data.list
list.value.forEach(item=>{
item.isSelected=false
})
total.value = data.total
} finally {
loading.value = false
}
}
const approve = async (id:number) => {
await PartPurchaseOrderApi.approvals(id)
message.success("审批成功");
getList();
const approve = async (row) => {
multipleTable.value=[]
multipleTable.value.push(row)
approves();
}
const approves = async () => {
try{
const list = multipleTable.value|| []; //
// 1.
if (!list || list.length==null) {
message.error("提交明细不能为空,请确认");
return;
}
formLoading.value = true;
// 5.
const res = await Promise.race([
PartPurchaseOrderApi.approvals(list),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("请求超时")), 30000)
)
]);
message.success("审批成功");
getList(); //
emit('success');
} catch (error) {
console.error("提交失败:", error);
} finally {
formLoading.value = false;
}
const reject = async (id:number) => {
await PartPurchaseOrderApi.rejects(id)
message.success("驳回成功");
getList();
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (id?: number) => {
formRef.value.open( id)
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
const handleSelectionChange = (val) => {
// isSelected false
list.value.forEach(row => {
row.isSelected = false;
});
// isSelected true
val.forEach(selectedRow => {
//
const targetRow = list.value.find(row => row.id === selectedRow.id);
if (targetRow) {
targetRow.isSelected = true;
}
});
multipleTable.value=val
}
const tableRowClassName = ({ row }) => {
return row.isSelected ? 'selected-row' : '';
}
const getSummaries = (param: SummaryMethodProps) => {
const summaryField = ["boomAmount","purchaseAmount","estimatedPrice"];
const { columns, data } = param;
@ -256,28 +324,28 @@ const floatMul = (a, b) => {
}
/** 添加/修改操作 */
const openForm = (type: string, id?: number) => {
switch (type) {
case 'create':
router.push({ path: '/purchase/materialplanadd', query: { id: id } })
break;
case 'update':
router.push({ path: '/purchase/materialplanedit', query: { id: id } })
break;
case 'detail':
router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
// window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
break;
case 'check':
router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
// window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
break;
default:
break;
}
}
// const openForm = (type: string, id?: number) => {
//
// switch (type) {
// case 'create':
// router.push({ path: '/purchase/materialplanadd', query: { id: id } })
// break;
// case 'update':
// router.push({ path: '/purchase/materialplanedit', query: { id: id } })
// break;
// case 'detail':
// router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
// // window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
// break;
// case 'check':
// router.push({ path: '/purchase/PartPurchaseCheckDetail', query: { id: id , type: type} })
// // window.open(`/purchase/PartPurchaseCheckDetail?id=${id}&type=${encodeURIComponent(type)}`, '_self');
// break;
// default:
// break;
// }
//
// }
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
@ -297,7 +365,12 @@ const userInit = ref()
/** 初始化 **/
onMounted(async () => {
//
// userInit.value = await UserApi.getSimpleUserList()
getList()
})
</script>
<style>
.selected-row {
background-color: #ffe6cc !important;
}
</style>

View File

@ -13,7 +13,7 @@
<td colspan="6" >
<span style="font-size: 20px; font-weight: 700">模具生产计划单</span>
</td>
<td colspan="2" style="padding: 5px 0">
<td colspan="2" style="padding: 5px 0;" >
<div style="border-bottom: 1px solid #666; padding-bottom: 5px;font-size: 16px" >项目编号</div>
<div style="padding-top: 5px; font-size: 16px" >{{ formData.code }}</div>
</td>
@ -22,10 +22,9 @@
<tbody class="masterClass">
<tr>
<td colspan="2" style="font-size: 16px"> 客户名称 </td>
<td colspan="5">
<span style="font-size: 16px">{{ formData.customerName }}</span>
<td colspan="6">
<span style="font-size: 16px">{{ formData.customerName }}({{ formData.customer.brief}})</span>
</td>
<td colspan="1" style="font-size: 16px">{{ formData.customer.brief }}</td>
<td style="font-size: 16px"> 编码 </td>
<td style="font-size: 16px">{{ formData.customer.code }} </td>
</tr>
@ -41,12 +40,12 @@
</tr>
<tr>
<td colspan="2" style="font-size: 16px"> 项目工期 </td>
<td colspan="1" style="padding: 0 5px"> </td>
<td colspan="1" style="min-width: 70px;">{{ formatDate(new Date(formData.projectStartTime), 'YYYY-MM-DD') }}</td>
<td colspan="1" style="padding: 0 5px; width: 40px"> </td>
<td colspan="1" style="min-width: 90px; font-size: 16px">{{ formatDate(new Date(formData.projectStartTime), 'YYYY-MM-DD') }}</td>
<td colspan="1" style="min-width: 70px;"></td>
<td colspan="1" style="min-width: 70px;">{{ formatDate(new Date(formData.projectEndTime), 'YYYY-MM-DD') }}</td>
<td colspan="1" style="min-width: 90px; font-size: 16px ">{{ formatDate(new Date(formData.projectEndTime), 'YYYY-MM-DD') }}</td>
<td style="min-width: 70px;">天数</td>
<td colspan="1">{{ betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime)) +1 }}</td>
<td colspan="1" width="60px">{{ betweenDay(new Date(formData.projectStartTime), new Date(formData.projectEndTime)) +1 }}</td>
<td colspan="1"> 是否有价格 </td>
<td colspan="1">{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.hasPrice) }} </td>
</tr>
@ -117,17 +116,25 @@
</tr>
<tr>
<td class="xh"> 序号 </td>
<td colspan="3"> 名称/编号 </td>
<td colspan="2"> 名称 </td>
<td> 设备型号 </td>
<td> 数量 </td>
<td> 主要材料 </td>
<td style="width:160px"> 毛坯日期 </td>
<td colspan="2"> 毛坯日期 </td>
<td> 2D/日期 </td>
<td> 3D/日期 </td>
<!-- <td class="xh" style="width:10%" > 序号 </td>-->
<!-- <td colspan="3" style="width: 15%"> 名称/编号 </td>-->
<!-- <td style="width: 10%"> 设备型号 </td>-->
<!-- <td style="width: 10%"> 数量 </td>-->
<!-- <td style="width: 10%"> 主要材料 </td>-->
<!-- <td style="width: 50%"> 毛坯日期 </td>-->
<!-- <td style="width: 10%"> 2D/日期 </td>-->
<!-- <td style="width: 10%"> 3D/日期 </td>-->
</tr>
<tr v-for="(item,idx) in formData.projectOrderSubs.slice(0, 6)" :key="idx">
<tr v-for="(item,idx) in formData.projectOrderSubs" :key="idx">
<td class="xh"> {{ idx+1 }} </td>
<td colspan="3" style="padding: 0 0">
<td colspan="2" style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span> {{item.name}} </span>
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
@ -138,7 +145,7 @@
<td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>
<td>{{item.amount}} </td>
<td>{{ item.compositionName }} </td>
<td>
<td colspan="2">
<span v-if="!item.blankDate"> &nbsp;</span>
<span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>
</td>
@ -167,27 +174,26 @@
<tbody v-if="formData.projectOrderSubs.length<6">
<tr v-for="item in (6-formData.projectOrderSubs.length)" :key="item">
<td> {{item+(formData.projectOrderSubs.length)}}</td>
<td colspan="3">&nbsp; </td>
<td> &nbsp; </td>
<td colspan="2">&nbsp; </td>
<td> &nbsp; </td>
<td> &nbsp; </td>
<td>&nbsp; </td>
<td colspan="2"> &nbsp; </td>
<td> &nbsp; </td>
<td>&nbsp; </td>
</tr>
</tbody>
<tbody class="masterClass">
<tbody>
<tr>
<td class="xh"> 序号 </td>
<td colspan="2" style="width: 200px"> 工艺流程 </td>
<td class="xhs"> 序号 </td>
<td colspan="2"> 工艺流程 </td>
<td colspan="2"> 开始日期 </td>
<td colspan="2"> 结束日期 </td>
<td> 责任人 </td>
<td colspan="2"> 备注 </td>
</tr>
<tr v-for="(its,index) in planData.craftInfos" :key="its.index">
<td class="xh"> {{ index+1 }} </td>
<td class="xhs"> {{ index+1 }} </td>
<td colspan="2"> {{ its.name }}</td>
<td colspan="2">
@ -215,7 +221,7 @@ style="
">
<span>说明:</span>
<span>1.每个项目的零部件制作工艺材料材质硬度要求必须统一出现任何问题各工程师负责!</span>
<span>2.模具调试试模需要根据客户要求自己安排调试我司根据需要安排人员参与配合</span>
<!-- <span>2.模具调试试模需要根据客户要求自己安排调试我司根据需要安排人员参与配合</span>-->
</div>
</td>
</tr>
@ -259,9 +265,9 @@ style="
</tbody>
</table>
<div v-if="formData.projectOrderSubs.length>6">
<!-- 附页是否开启需要判断 根据子项目信息-->
<table border="2" cellspacing="0" id="table" style="height:27.2cm;">
<!-- <div v-if="formData.projectOrderSubs.length>6">-->
<!-- &lt;!&ndash; 附页是否开启需要判断 根据子项目信息&ndash;&gt;-->
<!-- <table border="2" cellspacing="0" id="table" style="height:27.2cm;">-->
<!-- <tbody >-->
<!-- <tr>-->
<!-- <td colspan="2">-->
@ -318,24 +324,24 @@ style="
<!-- </td>-->
<!-- </tr>-->
<tbody >
<tr>
<td colspan="10" style="height: 30px">
<div style="text-align: left; width: 100%">子项目信息:</div>
</td>
</tr>
<tr>
<td class="xh" style="width:20%" > 序号 </td>
<td colspan="3" style="width: 25%"> 名称/编号 </td>
<td style="width: 10%"> 设备型号 </td>
<td style="width: 10%"> 数量 </td>
<td style="width: 10%"> 主要材料 </td>
<td style="width: 10%"> 毛坯日期 </td>
<td style="width: 10%"> 2D/日期 </td>
<td style="width: 10%"> 3D/日期 </td>
</tr>
</tbody>
<tbody>
<!-- <tbody >-->
<!-- <tr>-->
<!-- <td colspan="10" style="height: 30px">-->
<!-- <div style="text-align: left; width: 100%">子项目信息:</div>-->
<!-- </td>-->
<!-- </tr>-->
<!-- <tr>-->
<!-- <td class="xh" style="width:20%" > 序号 </td>-->
<!-- <td colspan="3" style="width: 25%"> 名称/编号 </td>-->
<!-- <td style="width: 10%"> 设备型号 </td>-->
<!-- <td style="width: 10%"> 数量 </td>-->
<!-- <td style="width: 10%"> 主要材料 </td>-->
<!-- <td style="width: 10%"> 毛坯日期 </td>-->
<!-- <td style="width: 10%"> 2D/日期 </td>-->
<!-- <td style="width: 10%"> 3D/日期 </td>-->
<!-- </tr>-->
<!-- </tbody>-->
<!-- <tbody>-->
<!-- <tr v-for="(item, idx) in formData.projectOrderSubs.slice(6)" :key="idx">-->
<!-- <td class="xh"> {{ idx+7 }} </td>-->
<!-- <td colspan="3" style="padding: 0 0">-->
@ -373,56 +379,56 @@ style="
<!-- </div>-->
<!-- </td>-->
<!-- </tr>-->
<tr v-for="(item,idx) in formData.projectOrderSubs.slice(6)" :key="idx" >
<td class="xh"> {{ idx+7 }} </td>
<td colspan="3" style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between">
<span> {{item.name}} </span>
<!--<tr v-for="(item,idx) in formData.projectOrderSubs.slice(6)" :key="idx" >-->
<!-- <td class="xh"> {{ idx+7 }} </td>-->
<!-- <td colspan="3" style="padding: 0 0">-->
<!-- <div style="display: flex; flex-direction: column; justify-content: space-between">-->
<!-- <span> {{item.name}} </span>-->
<!-- <span style="border-bottom: 1px solid #666"> {{item.name}} </span>-->
<!-- <span v-if="!item.projectSubShortName">&nbsp;</span>-->
<!-- <span v-else style="font-size: 10px">{{ formData.code+'-'+formData.customer.code+'-'+ item.projectSubShortName}}</span>-->
</div>
</td>
<td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>
<td>{{item.amount}} </td>
<td>{{ item.compositionName }} </td>
<td>
<span v-if="!item.blankDate"> &nbsp;</span>
<span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>
</td>
<td style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">
<span v-if="!item.twoDimDate" style="border-bottom: 1px solid #666">&nbsp;</span>
<span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.twoDimDate), 'YYYY-MM-DD') }} </span>
<span v-if="userInit.find((user) => user.id === item.twoDimOwner)?.nickname">{{ userInit.find((user) => user.id == item.twoDimOwner)?.nickname }}</span>
<span v-else>&nbsp;</span>
</div>
</td>
<td style="padding: 0 0">
<div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">
<span v-if="!item.threeDimDate" style="border-bottom: 1px solid #666">&nbsp;</span>
<!-- </div>-->
<!-- </td>-->
<!-- <td>{{equipInit.find((equip) => equip.id == item.equipId)?.name}} </td>-->
<!-- <td>{{item.amount}} </td>-->
<!-- <td>{{ item.compositionName }} </td>-->
<!-- <td>-->
<!-- <span v-if="!item.blankDate"> &nbsp;</span>-->
<!-- <span v-else>{{ formatDate(new Date(item.blankDate), 'YYYY-MM-DD') }} </span>-->
<!-- </td>-->
<!-- <td style="padding: 0 0">-->
<!-- <div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">-->
<!-- <span v-if="!item.twoDimDate" style="border-bottom: 1px solid #666">&nbsp;</span>-->
<!-- <span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.twoDimDate), 'YYYY-MM-DD') }} </span>-->
<!-- <span v-if="userInit.find((user) => user.id === item.twoDimOwner)?.nickname">{{ userInit.find((user) => user.id == item.twoDimOwner)?.nickname }}</span>-->
<!-- <span v-else>&nbsp;</span>-->
<!-- </div>-->
<!-- </td>-->
<!-- <td style="padding: 0 0">-->
<!-- <div style="display: flex; flex-direction: column; justify-content: space-between;width: 100px">-->
<!-- <span v-if="!item.threeDimDate" style="border-bottom: 1px solid #666">&nbsp;</span>-->
<span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.threeDimDate), 'YYYY-MM-DD') }} </span>
<span v-if="userInit.find((user) => user.id === item.threeDimOwner)?.nickname">
{{ userInit.find((user) => user.id === item.threeDimOwner)?.nickname }}
</span>
<span v-else>&nbsp;</span>
</div>
</td>
</tr>
</tbody>
<tbody>
<tr v-for="item in num" :key="item">
<td> {{item+(formData.projectOrderSubs.length)}}</td>
<td colspan="3">&nbsp; </td>
<td> &nbsp; </td>
<td> &nbsp; </td>
<td>&nbsp; </td>
<td> &nbsp; </td>
<td> &nbsp; </td>
<td>&nbsp; </td>
</tr>
</tbody>
<!-- <span v-else style="border-bottom: 1px solid #666"> {{ formatDate(new Date(item.threeDimDate), 'YYYY-MM-DD') }} </span>-->
<!-- <span v-if="userInit.find((user) => user.id === item.threeDimOwner)?.nickname">-->
<!-- {{ userInit.find((user) => user.id === item.threeDimOwner)?.nickname }}-->
<!-- </span>-->
<!-- <span v-else>&nbsp;</span>-->
<!-- </div>-->
<!-- </td>-->
<!--</tr>-->
<!-- </tbody>-->
<!-- <tbody>-->
<!-- <tr v-for="item in num" :key="item">-->
<!-- <td> {{item+(formData.projectOrderSubs.length)}}</td>-->
<!-- <td colspan="3">&nbsp; </td>-->
<!-- <td> &nbsp; </td>-->
<!-- <td> &nbsp; </td>-->
<!-- <td>&nbsp; </td>-->
<!-- <td> &nbsp; </td>-->
<!-- <td> &nbsp; </td>-->
<!-- <td>&nbsp; </td>-->
<!-- </tr>-->
<!-- </tbody>-->
<!-- <tbody>-->
<!-- <tr>-->
@ -480,8 +486,8 @@ style="
<!-- </td>-->
<!-- </tr>-->
<!-- </tbody>-->
</table>
</div>
<!-- </table>-->
<!-- </div>-->
</div>
<template #footer>
<!-- 打印 -->
@ -589,6 +595,9 @@ const onPrint = () => {
width: 50px !important;
}
.xh {
height: 40px !important;
}
.xhs {
height: 20px !important;
}
.checkbox {
@ -613,7 +622,6 @@ const onPrint = () => {
document.body.removeChild(newIframe) //
dialogVisible.value = false
}, 100)
}
// const onPrint = () => {
// const printNode = document.querySelector('.print-wrap');

View File

@ -367,23 +367,21 @@
</template>
<script setup lang="ts">
import { DICT_TYPE, getDictLabel, getIntDictOptions, getStrDictOptions } from '@/utils/dict'
import { dateFormatter, formatDate } from '@/utils/formatTime'
import { dateFormatter} from '@/utils/formatTime'
import BomImportForm from './bomImportForm.vue'
import { ref } from 'vue'
import { inject } from 'vue'
import { useUserStore } from '@/store/modules/user'
import { useCommonStore } from '@/store/modules/common'
import MaterialSelect from '@/views/heli/hlvuestyle/materialSelect.vue'
import CompositionSelect from '@/views/heli/hlvuestyle/compositionSelect.vue'
import * as ProcessBomApi from '@/api/heli/processbom'
import * as storageApi from '@/api/heli/storage'
import { getOperateLogPage } from '@/api/system/operatelog'
import { deleteProcessBomDetail } from "@/api/heli/processbom";
import printDialog from './printDialog.vue'
import { UploadUserFile } from 'element-plus'
import { getAccessToken, getTenantId } from '@/utils/auth'
import { deleteFileLogic, downloadFile, getFilePage } from '@/api/infra/file'
import { Row } from 'element-plus/es/components/table-v2/src/components'
import {selectBomStatus, selectPlanTaskStatus} from "@/api/heli/processbom";
defineOptions({ name: 'ProcessBomDetail' })
@ -438,7 +436,17 @@ const formRef = ref() // 表单 Ref
const subFormRef = ref()
//20250601
const importFormRef = ref()
const handleImport = () => {
const handleImport = async () => {
if (formData.value.processBomDetails!=null){
var status
await ProcessBomApi.selectPlanTaskStatus(formData.value.id).then(data=>{
status=data
});
if (status){
await message.confirm("是否取消提交生产任务单")
await ProcessBomApi.updateById(formData.value.id)
}
}
importFormRef.value.open(formData.value.id)
}

View File

@ -35,6 +35,7 @@ import DOMPurify from 'dompurify';
defineOptions({ name: 'BomImportForm' })
const message = useMessage() //
import * as ProcessBomApi from '@/api/heli/processbom'
const dialogVisible = ref(false) //
@ -72,7 +73,7 @@ const submitForm = async () => {
/** 文件上传成功 */
const emits = defineEmits(['success'])
const submitFormSuccess = (response: any) => {
const submitFormSuccess = async (response: any) => {
if (response.code == 500) {
uploadRef.value!.clearFiles()
let formattedMsg = response.msg
@ -90,10 +91,9 @@ const submitFormSuccess = (response: any) => {
center: true
});
}else{
message.error(response.msg)
}
formLoading.value = false
return
}

View File

@ -110,7 +110,7 @@
</el-table-column>
<el-table-column v-if="activeIndex == 'first'" label="零件采购订单" prop="planStatus" min-width="180" align="center">
<template #default="{ row }">
{{ row.receivingStatus ?(row.receivingStatus== 1?'已生成':(row.receivingStatus == 2? '部分收货':(row.planStatus == 3? '已收货':''))):''}}
{{ row.receivingStatus ?(row.receivingStatus== 1?'已生成':(row.receivingStatus == 2? '部分收货':(row.receivingStatus == 3? '已收货':''))):''}}
</template>
</el-table-column>
<el-table-column v-if="activeIndex == 'second'" label="生产报工" prop="procedureStatus" min-width="180" align="center">
@ -182,8 +182,12 @@ const handleClick = async(tab: TabsPaneContext, event: Event) => {
var tabIndex = tab.props.name;
queryParams.pageNo = 1;
activeIndex.value = tabIndex;
if (allConditionsEmpty.value) {
message.error("必须输入查询条件查询")
}else{
await getList(tabIndex);
}
}
/** 查询列表 */
const getList = async () => {