近期修改

This commit is contained in:
z 2025-08-08 17:58:23 +08:00
parent cc43aebb57
commit d0e96b3722
71 changed files with 1769 additions and 358 deletions

View File

@ -82,6 +82,10 @@ public interface ErrorCodeConstants {
ErrorCode PROCESS_BOM_CODE_IS_EMPTY= new ErrorCode(1_006_005, "工艺bom编码为空");
ErrorCode PROCESS_BOM_DETAIL_BLUE_PRINT_NO_REPEAT = new ErrorCode(1_006_006, "工艺bom明细图号重复");
ErrorCode PROCESS_BOM_DETAIL_MATERIAL_NAME_IS_NULL = new ErrorCode(1_006_007, "工艺bom明细物料名称为空");
ErrorCode PROCESS_BOM_DETAIL_TYPE_IS_NULL = new ErrorCode(1_006_013, "工艺bom明细是否标准件为空");
ErrorCode PROCESS_BOM_DETAIL_AMOUNT_IS_NULL = new ErrorCode(1_006_014, "工艺bom明细数量为空");
ErrorCode PROCESS_BOM_DETAIL_UNIT_IS_NULL = new ErrorCode(1_006_015, "工艺bom明细单位为空");
ErrorCode PROCESS_BOM_DETAIL_AMOUNT = new ErrorCode(1_006_016, "工艺bom明细数量必须大于0");
ErrorCode PROCESS_BOM_DETAIL_MATERIAL_AMOUNT_ILLGAL = new ErrorCode(1_006_0012, "工艺bom明细数量必须为数字");
ErrorCode PROCESS_BOM_DETAIL_UNSTANDARD_MATERIAL_NAME_IS_NULL = new ErrorCode(1_006_008, "非标准件工艺bom明细物料名称为空");
ErrorCode PROCESS_BOM_DETAIL_UNSTANDARD_MATERIAL_NAME_IS_REPEAT= new ErrorCode(1_006_009, "非标准件工艺bom明细物料名称重复");

View File

@ -13,7 +13,8 @@ public enum ProcessDesignTypeEnum {
BLUEPRINT_FOUNDRY_TECHNOLOGY("铸造工艺"),
BLUEPRINT_3D("3D图纸"),
BLUEPRINT_2D("2D图纸"),
BLUEPRINT_WORKBLANK("毛坯图纸");
BLUEPRINT_WORKBLANK("毛坯图纸"),
CASTING_DRAWING("铸件图工艺");
private String description;

View File

@ -180,19 +180,19 @@ public class DeliverOrderController {
return success(deliverOrderService.getDeliverOrderSubListByDeliveryOrderId(deliveryOrderId));
}
@GetMapping("/getListYf")
@Operation(summary = "获得运费成本")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:query')")
public CommonResult<List<DeliverOrderDO>> getListYf(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
List<DeliverOrderDO> deliverOrderDO = deliverOrderService.getListYf(id,projectSubId);
return success( deliverOrderDO);
}
// @GetMapping("/getListYf")
// @Operation(summary = "获得运费成本")
// @PreAuthorize("@ss.hasPermission('heli:deliver-order:query')")
// public CommonResult<List<DeliverOrderDO>> getListYf(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
// List<DeliverOrderDO> deliverOrderDO = deliverOrderService.getListYf(id,projectSubId);
// return success( deliverOrderDO);
// }
@GetMapping("/getListYfDetails")
@Operation(summary = "获得运费成本明细")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:query')")
public CommonResult<List<DeliverOrderDO>> getListYfDetails(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
List<DeliverOrderDO> deliverOrderDO = deliverOrderService.getListYfDetails(id,projectSubId);
return success( deliverOrderDO);
public CommonResult<List<DeliverOrderSubDO>> getListYfDetails(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
List<DeliverOrderSubDO> deliverOrderSubDO = deliverOrderService.getListYfDetails(id,projectSubId);
return success(deliverOrderSubDO);
}
}

View File

@ -4,6 +4,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplanboom.Material
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import org.apache.ibatis.annotations.Param;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import org.springframework.validation.annotation.Validated;
@ -108,6 +109,13 @@ public class MaterialPlanController {
PageResult<MaterialPlanDO> pageResult = materialPlanService.getMaterialPlanPages(pageReqVO);
return success(BeanUtils.toBean(pageResult, MaterialPlanRespVO.class));
}
@DeleteMapping("/delMaterialPlanBoom")
@Operation(summary = "删除物料需求计划")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('heli:material-plan:delete')")
public CommonResult<Boolean> delMaterialPlanBoom(@RequestParam("id") Long id, @Param("projectMaterialPlanNo") String projectMaterialPlanNo) {
return materialPlanService.delMaterialPlanBoom(id,projectMaterialPlanNo);
}
@DeleteMapping("/delMaterialPlan")
@Operation(summary = "删除物料需求计划")
@Parameter(name = "id", description = "编号", required = true)
@ -115,7 +123,6 @@ public class MaterialPlanController {
public CommonResult<Boolean> delMaterialPlan(@RequestParam("id") Long id) {
return materialPlanService.delMaterialPlan(id);
}
@GetMapping("/getPartPage")
@Operation(summary = "获得零件物料需求计划分页")
@PreAuthorize("@ss.hasPermission('heli:material-plan:query')")

View File

@ -79,4 +79,5 @@ public class MaterialPlanPageReqVO extends PageParam {
private String blueprintNo;
@Schema(description = "工序")
private String procedureName;
}

View File

@ -48,8 +48,8 @@ public class PlanController {
@Operation(summary = "更新生产计划")
@PreAuthorize("@ss.hasPermission('heli:plan:update')")
public CommonResult<Boolean> updatePlan(@Valid @RequestBody PlanSaveReqVO updateReqVO) {
planService.updatePlan(updateReqVO);
return success(true);
return planService.updatePlan(updateReqVO);
}
@DeleteMapping("/delete")
@ -104,5 +104,12 @@ public class PlanController {
ExcelUtils.write(response, "生产计划.xls", "数据", PlanRespVO.class,
BeanUtils.toBean(list, PlanRespVO.class));
}
@GetMapping("/verification")
@Operation(summary = "获得生产计划")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
@PreAuthorize("@ss.hasPermission('heli:plan:query')")
public CommonResult<Boolean> verification(@RequestParam("id") Long id,@RequestParam("type") String type) {
return planService.verification(id,type);
}
}

View File

@ -144,5 +144,13 @@ public class PlanRespVO {
@TableField(exist = false)
private LocalDateTime orderTime;
@Schema(description = "工艺负责人")
private Long castOwner;
@Schema(description = "工艺开始日期")
private LocalDateTime castStartDate;
@Schema(description = "工艺结束日期")
private LocalDateTime castEndDate;
}

View File

@ -36,6 +36,17 @@ public class PlanSaveReqVO {
@Schema(description = "工艺结束日期")
private LocalDateTime craftEndDate;
@Schema(description = "是否需要铸件图:1表示需要0表示不需要")
private Integer hasCast;
@Schema(description = "铸件图负责人")
private String castOwner;
@Schema(description = "铸件图开始日期")
private LocalDateTime castStartDate;
@Schema(description = "铸件图结束日期")
private LocalDateTime castEndDate;
@Schema(description = "工艺流程数组信息[{'id':1,'sdate':'','edate':'','owner':'','description':''}]")
private String craftContent;

View File

@ -159,7 +159,14 @@ public class ProcessBomController {
PageResult<ProcessBomDetailDO> pageResult = processBomService.getProcessBomPageNew(pageReqVO);
return success(pageResult);
}
@DeleteMapping("/delMaterialPlan")
@Operation(summary = "删除工艺bom明细")
@Parameter(name = "id", description = "编号", required = true)
@PreAuthorize("@ss.hasPermission('heli:process-bom:delete')")
public CommonResult<Boolean> delMaterialPlan(@RequestParam("id") Long id,@RequestParam("projectMaterialPlanNo") String projectMaterialPlanNo) {
return processBomService.delMaterialPlan(id,projectMaterialPlanNo);
}
@GetMapping("/export-excel")
@Operation(summary = "导出工艺bom Excel")
@PreAuthorize("@ss.hasPermission('system:user:import')")

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.controller.admin.processdesign.vo;
import com.baomidou.mybatisplus.annotation.TableField;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@ -60,7 +61,20 @@ public class ProcessDesignPageReqVO extends PageParam {
@Schema(description = "工艺负责人")
private String craftOwnerName;
@Schema(description = "工艺负责人")
private String castOwnerName;
@Schema(description = "工艺负责人")
private LocalDateTime castStartDate;
@Schema(description = "工艺负责人")
private LocalDateTime castEndDate;
@TableField(exist = false)
private Integer hasCast;
@TableField(exist = false)
private LocalDateTime craftStartDate;
@TableField(exist = false)
private LocalDateTime craftEndDate;
@Schema(description = "3D负责人")
private String threeDimOwnerName;

View File

@ -87,7 +87,17 @@ public class ProcessDesignRespVO {
@Schema(description = "工艺结束日期")
private LocalDateTime craftEndDate;
@Schema(description = "是否需要铸件图:1表示需要0表示不需要")
private Integer hasCast;
@Schema(description = "铸件图负责人")
private String castOwnerName;
@Schema(description = "铸件图开始日期")
private LocalDateTime castStartDate;
@Schema(description = "铸件图结束日期")
private LocalDateTime castEndDate;
@Schema(description = "毛坯结束日期")
private LocalDateTime blankDate;
@Schema(description = "毛坯开始日期")

View File

@ -178,16 +178,16 @@ public class ProjectOrderController {
BigDecimal standardPartsCost;
standardPartsCost=processBomService.StandardPartsCost(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setBiaoZhunJianCost(standardPartsCost);
//材料成本
BigDecimal materialCost;
materialCost=processBomService.materialCost(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setCailiaoCost(materialCost);
//外协加工费
BigDecimal outsourcedProcessingFee;
outsourcedProcessingFee=processBomService.outsourcedProcessingFee(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setWaixeiCost(outsourcedProcessingFee);
//材料成本
BigDecimal materialCost;
materialCost=processBomService.materialCost(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setCailiaoCost(materialCost.add(outsourcedProcessingFee));
//内部工时费
BigDecimal internalLaborCost;
internalLaborCost=processBomService.internalLaborCost(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
@ -198,34 +198,10 @@ public class ProjectOrderController {
projectOrderDO.setZpCost(assemblyLaborCost);
//运费成本
List<DeliverOrderDO> deliverOrderDO = deliverOrderService.getListYf(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
if (deliverOrderDO!=null&&deliverOrderDO.size()>0){
BigDecimal totalAmount = deliverOrderDO.stream()
.map(deliverOrderSubDO -> deliverOrderSubDO.getYunFeiMoney() != null ? deliverOrderSubDO.getYunFeiMoney() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
projectOrderDO.setYunFeiCost(totalAmount);
}else {
projectOrderDO.setYunFeiCost(BigDecimal.ZERO);
}
// List<TaskDispatchDO> list= taskDispatchService.getListJg(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
// if (list!=null&&list.size()>0){
// BigDecimal totalAmount = list.stream()
// .map(TaskDispatchDO -> TaskDispatchDO.getZanGuMoney() != null ?new BigDecimal(TaskDispatchDO.getZanGuMoney()) : BigDecimal.ZERO)
// .reduce(BigDecimal.ZERO, BigDecimal::add);
// projectOrderDO.setJiaGongShiCost(totalAmount);
// }else {
// projectOrderDO.setJiaGongShiCost(BigDecimal.ZERO);
// }
BigDecimal yunFeiCost;
yunFeiCost = deliverOrderService.getListYf(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
projectOrderDO.setYunFeiCost(yunFeiCost);
// List<PurchaseOrderDO> list2 =purchaseOrderService.getListqt(projectOrderDO.getId(),projectOrderDO.getProjectSubId());
// if (list2!=null&&list2.size()>0){
// BigDecimal totalAmount = list2.stream()
// .map(PurchaseOrderDO -> PurchaseOrderDO.getCaiGouMoney() != null ?PurchaseOrderDO.getCaiGouMoney() : BigDecimal.ZERO)
// .reduce(BigDecimal.ZERO, BigDecimal::add);
// projectOrderDO.setQitaCost(totalAmount);
// }else {
// projectOrderDO.setQitaCost(BigDecimal.ZERO);
// }
BigDecimal sum = projectOrderDO.getYunFeiCost().add(projectOrderDO.getCailiaoCost()).add(projectOrderDO.getBiaoZhunJianCost()).add(projectOrderDO.getNeibuCost()).add(projectOrderDO.getWaixeiCost().add(projectOrderDO.getZpCost()));
projectOrderDO.setSumCost(sum);
}

View File

@ -263,5 +263,11 @@ public class TaskDispatchController {
List<TaskDispatchDO> list= taskDispatchService.getListZp(id,projectSubId);
return success( list);
}
@GetMapping("/getListCl")
@Operation(summary = "获得材料成本")
@PreAuthorize("@ss.hasPermission('heli:deliver-order:query')")
public CommonResult<List<TaskDispatchDO>> getListCl(@RequestParam("id") Long id, @RequestParam("projectSubId") Long projectSubId ) {
List<TaskDispatchDO> list= taskDispatchService.getListCl(id,projectSubId);
return success( list);
}
}

View File

@ -104,4 +104,7 @@ public class DeliverOrderSubDO extends BaseDO {
private Integer remAmount;
@TableField(exist = false)
private LocalDateTime deliverDate;
@TableField(exist = false)
private String deliverPersonName;
}

View File

@ -64,6 +64,26 @@ public class PlanDO extends BaseDO {
* 工艺结束日期
*/
private LocalDateTime craftEndDate;
/**
* 是否需要铸件:1表示需要0表示不需要
*
* 枚举 {@link TODO heli_common_is_or_not 对应的类}
*/
private Integer hasCast;
/**
* 铸件图负责人
*/
@TableField(fill = FieldFill.UPDATE)
private Long castOwner;
/**
* 铸件图开始日期
*/
private LocalDateTime castStartDate;
/**
*铸件图结束日期
*/
private LocalDateTime castEndDate;
/**
* 工艺流程数组信息[{'id':1,'sdate':'','edate':'','owner':'','description':''}]
*/

View File

@ -97,6 +97,8 @@ public class ProcessDesignDO extends BaseDO {
@TableField(exist = false)
private String craftOwnerName;
@TableField(exist = false)
private Integer hasCast;
@TableField(exist = false)
private LocalDateTime craftStartDate;
@ -112,7 +114,12 @@ public class ProcessDesignDO extends BaseDO {
private Date lastDate;
@TableField(exist = false)
private String blankOwnerName;
@TableField(exist = false)
private String castOwnerName;
@TableField(exist = false)
private LocalDateTime castStartDate;
@TableField(exist = false)
private LocalDateTime castEndDate;
@TableField(exist = false)
private String progressBlank;

View File

@ -3,6 +3,7 @@ package com.chanko.yunxi.mes.module.heli.dal.mysql.deliverorder;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.deliverorder.DeliverOrderSubDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
@ -35,4 +36,16 @@ public interface DeliverOrderSubMapper extends BaseMapperX<DeliverOrderSubDO> {
return selectOne(query);
}
default List<DeliverOrderSubDO> getListYf(Long projectSubId){
MPJLambdaWrapper<DeliverOrderSubDO> query = new MPJLambdaWrapper<>();
query.selectAll(DeliverOrderSubDO.class)
.select("a.deliver_date as deliverDate","b.nickName as deliverPersonName")
.leftJoin(DeliverOrderDO.class,"a",DeliverOrderDO::getId,DeliverOrderSubDO::getDeliveryOrderId)
.leftJoin(AdminUserDO.class,"b",AdminUserDO::getId,DeliverOrderDO::getDeliverPerson)
.eq(DeliverOrderSubDO::getSaleOrderSubId,projectSubId)
.eq(DeliverOrderSubDO::getCategory,"DELIVER_LIST")
.eq(DeliverOrderDO::getDeliverStatus,"2");
return selectList(query);
}
}

View File

@ -10,12 +10,14 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.materialplan.MaterialPlanDO;
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.processbom.ProcessBomDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.projectorder.ProjectOrderDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO;
import com.chanko.yunxi.mes.module.system.dal.dataobject.user.AdminUserDO;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.ibatis.annotations.Mapper;
import com.chanko.yunxi.mes.module.heli.controller.admin.materialplan.vo.*;
import org.apache.ibatis.annotations.Param;
import org.springframework.util.StringUtils;
/**
@ -48,12 +50,14 @@ public interface MaterialPlanMapper extends BaseMapperX<MaterialPlanDO> {
MPJLambdaWrapper<MaterialPlanDO> query = new MPJLambdaWrapper<>();
query.selectAll(MaterialPlanDO.class)
.leftJoin(MaterialPlanBoomDO.class, "b", MaterialPlanBoomDO::getProjectMaterialPlanId, MaterialPlanDO::getId)
.leftJoin(ProcessBomDetailDO.class,"p",ProcessBomDetailDO::getId, MaterialPlanBoomDO::getBoomDetailId)
.groupBy(MaterialPlanDO::getId)
.orderByDesc(MaterialPlanDO::getCreateTime);
query.like(!StringUtils.isEmpty(pageReqVO.getProjectMaterialPlanNo()), MaterialPlanDO::getProjectMaterialPlanNo, pageReqVO.getProjectMaterialPlanNo())
.like(!StringUtils.isEmpty(pageReqVO.getProjectName()),MaterialPlanDO::getProjectName, pageReqVO.getProjectName())
.like(!StringUtils.isEmpty(pageReqVO.getProjectSubName()), MaterialPlanDO::getName, pageReqVO.getProjectSubName())
.like(!StringUtils.isEmpty(pageReqVO.getMaterialName()), MaterialPlanBoomDO::getMatName, pageReqVO.getMaterialName())
.like(!StringUtils.isEmpty(pageReqVO.getBlueprintNo()), ProcessBomDetailDO::getBlueprintNo, pageReqVO.getBlueprintNo())
.eq(!StringUtils.isEmpty(pageReqVO.getMatType()), MaterialPlanDO::getMatType, pageReqVO.getMatType());
if (pageReqVO.getMatPlanDate() != null) {
query.between( MaterialPlanDO::getMatPlanDate, pageReqVO.getMatPlanDate()[0], pageReqVO.getMatPlanDate()[1]);
@ -77,6 +81,10 @@ public interface MaterialPlanMapper extends BaseMapperX<MaterialPlanDO> {
return selectPage(pageReqVO, query);
}
void delMaterialPlan(@Param("id") Long id);
void delMaterialPlanBoom(@Param("bomDetailId")Long bomDetailId, @Param("procedureId")Long procedureId);
// default PageResult<MaterialPlanDO> selectPage(MaterialPlanPageReqVO reqVO) {
// return selectPage(reqVO, new LambdaQueryWrapperX<MaterialPlanDO>()
// .eqIfPresent(MaterialPlanDO::getId, reqVO.getId())

View File

@ -84,12 +84,14 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
.select("bc.`name` as compositionName","b.`composition_id` as compositionId")
.select("ma.brief as customerBriefName,ma.project_name as projectName,ma.name as projectSubName,ma.project_id as projectId")
.select("m.name as materialName")
.leftJoin(MaterialPlanDO.class,"ma",MaterialPlanDO::getId, MaterialPlanBoomDO::getProjectMaterialPlanId)
// .leftJoin(StorageMaterialDO.class,"sm",StorageMaterialDO::getId, MaterialPlanDetailDO::getMaterialId)
.leftJoin(ProcessBomDetailDO.class, "b", ProcessBomDetailDO::getId, MaterialPlanBoomDO::getBoomDetailId)
.leftJoin(CompositionDO.class, "bc", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
.leftJoin(ProjectOrderDO.class,"po",ProjectOrderDO::getId,MaterialPlanDO::getProjectId)
.leftJoin(AdminUserDO.class,"u",AdminUserDO::getId, MaterialPlanBoomDO::getDuEmpId)
.leftJoin(MaterialDO.class,"m",MaterialDO::getId, MaterialPlanBoomDO::getMaterialId)
.eq(MaterialPlanDO::getMatType,0)
.in(MaterialPlanBoomDO::getIsPurYard,Arrays.asList(0,5))
.disableSubLogicDel()
@ -152,6 +154,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
query.selectAll(MaterialPlanBoomDO.class)
.select("a.nickname as nickname,b.spec as boomSpec,g.name as procedureName,bc.`name` as compositionName")
.select("m.code as matCode,m.spec as matSpec,m.unit as matUnit")
.select("b.blueprint_no as blueprintNo")
.leftJoin(AdminUserDO.class, "a", AdminUserDO::getId, MaterialPlanBoomDO::getDuEmpId)
.leftJoin(ProcessBomDetailDO.class, "b", ProcessBomDetailDO::getId, MaterialPlanBoomDO::getBoomDetailId)
.leftJoin(CompositionDO.class, "bc", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
@ -186,8 +189,10 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
default PageResult<MaterialPlanBoomDO> getStandardPartsPages(MaterialPlanPageReqVO pageReqVO){
MPJLambdaWrapper<MaterialPlanBoomDO> query = new MPJLambdaWrapper<>();
query.selectAll(MaterialPlanBoomDO.class)
.select("p.project_name as projectName","p.project_id as projectId","p.name as projectSubName","mat.material_id as matId","m.code as materialName","m.name as materialNames")
.select("p.project_name as projectName","p.project_id as projectId","p.name as projectSubName","m.code as materialName")
.select("IFNULL(mat.pick_amount, t.boom_amount) AS pickAmount")
.select("IFNULL(mater.name, m.name) AS materialNames")
.select("IFNULL(mater.id, mat.material_id) AS matId")
.select("w.wh_name as whName","r.rg_name as rgName","pn.pn_name as pnName")
.select("d.spec as boomSpec","d.blueprint_no as blueprintNo","d.unit as boomUnit","DATE_FORMAT(t.boom_arrive_date, '%Y-%m-%d') AS boomArriveDates")
.leftJoin(MaterialPlanDO.class, "p", MaterialPlanDO::getId,MaterialPlanBoomDO::getProjectMaterialPlanId)
@ -195,6 +200,7 @@ public interface MaterialPlanBoomMapper extends BaseMapperX<MaterialPlanBoomDO>
.leftJoin(ProcessBomDetailDO.class,"d",ProcessBomDetailDO::getId,MaterialPlanBoomDO::getBoomDetailId)
.leftJoin("project_mat_req_detail mat on (t.id=mat.project_material_plan_detail_id and mat.deleted=0 and mat.tenant_id = 2)")
.leftJoin("base_material m ON (m.id = mat.material_id and m.tenant_id = 2) ")
.leftJoin(MaterialDO.class,"mater", MaterialDO::getId,MaterialPlanBoomDO::getMaterialId)
.leftJoin("wms_wh w ON (w.id = mat.wh_id and w.tenant_id = 2) ")
.leftJoin("wms_rg r ON (r.id = mat.rg_id and r.tenant_id = 2) ")
.leftJoin("wms_pn pn ON (pn.id = mat.pn_id and pn.tenant_id = 2) ")

View File

@ -256,7 +256,7 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
.groupBy(ProcessBomDetailDO::getId)
.disableSubLogicDel();
query.like(!ObjectUtils.isEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode,pageReqVO.getProjectCode())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectName()),ProjectOrderDO::getProjectName,pageReqVO.getProjectName())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectName()),ProjectOrderDO::getProjectNameSim,pageReqVO.getProjectName())
.like(!ObjectUtils.isEmpty(pageReqVO.getTaskNo()),PlanTaskDO::getTaskNo,pageReqVO.getTaskNo())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectSubName()),ProjectOrderSubDO::getName,pageReqVO.getProjectSubName())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectSubCode()),ProjectOrderSubDO::getNameSim,pageReqVO.getProjectSubCode())
@ -292,7 +292,7 @@ public interface ProcessBomDetailMapper extends BaseMapperX<ProcessBomDetailDO>
.groupBy(ProcessBomDetailDO::getId)
.disableSubLogicDel();
query.like(!ObjectUtils.isEmpty(pageReqVO.getProjectCode()), ProjectOrderDO::getCode,pageReqVO.getProjectCode())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectName()),ProjectOrderDO::getProjectName,pageReqVO.getProjectName())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectName()),ProjectOrderDO::getProjectNameSim,pageReqVO.getProjectName())
.like(!ObjectUtils.isEmpty(pageReqVO.getTaskNo()),PlanTaskDO::getTaskNo,pageReqVO.getTaskNo())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectSubName()),ProjectOrderSubDO::getName,pageReqVO.getProjectSubName())
.like(!ObjectUtils.isEmpty(pageReqVO.getProjectSubCode()),ProjectOrderSubDO::getNameSim,pageReqVO.getProjectSubCode())

View File

@ -197,4 +197,12 @@ public interface ProcessBomMapper extends BaseMapperX<ProcessBomDO> {
BigDecimal internalLaborCost(@Param("id") Long id,@Param("projectSubId") Long projectSubId);
BigDecimal assemblyLaborCost(@Param("id") Long id,@Param("projectSubId") Long projectSubId);
BigDecimal inspection(@Param("id") Long id,@Param("projectSubId") Long projectSubId);
BigDecimal finalInspection(@Param("id") Long id,@Param("projectSubId") Long projectSubId);
BigDecimal inspection1(@Param("id") Long id,@Param("projectSubId") Long projectSubId);
void delMaterialPlan(@Param("id")Long id);
}

View File

@ -31,6 +31,7 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
query.selectAll(ProcessDesignDO.class)
.select("a.status as planStatus")
.select("a.plan_no as planCode","a.has_craft as hasCraft", "a.craft_start_date as craftStartDate", "a.craft_end_date as craftEndDate", "e.name as customerName")
.select( "a.cast_start_date as castStartDate", "a.cast_end_date as castEndDate","u6.nickname as castOwnerName","a.has_cast as hasCast")
.select("d.code as projectCode", "d.project_name as projectName", "d.business_line as businessLine", "d.property","d.is_urgency as isUrgency")
.select("u1.nickname as projectOwnerName", "u2.nickname as craftOwnerName")
.select("b.blank_date as blankDate","b.start_blank_date as startBlankDate", "b.two_dim_date as twoDimDate","b.start_two_dim_date as startTwoDimDate", "b.three_dim_date as threeDimDate", "b.start_three_dim_date as startThreeDimDate")
@ -47,6 +48,8 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
.leftJoin("system_users u3 on u3.id = b.blank_owner")
.leftJoin("system_users u4 on u4.id = b.two_dim_owner")
.leftJoin("system_users u5 on u5.id = b.three_dim_owner")
.leftJoin(AdminUserDO.class, "u6", AdminUserDO::getId, PlanDO::getCastOwner)
.leftJoin("(select progress,process_design_id,blueprint_link FROM pro_process_design_progress where id in (select max(id) FROM pro_process_design_progress GROUP BY process_design_id) ) z on z.process_design_id = t.id")
.disableSubLogicDel();
if(reqVO.getPgType()!=null && reqVO.getPgType() == 0){
@ -66,6 +69,7 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
.like(!StringUtils.isEmpty(reqVO.getThreeDimOwnerName()), "u5.nickname", reqVO.getThreeDimOwnerName())
.like(!StringUtils.isEmpty(reqVO.getTwoDimOwnerName()), "u4.nickname", reqVO.getTwoDimOwnerName())
.like(!StringUtils.isEmpty(reqVO.getBlankOwnerName()), "u3.nickname", reqVO.getBlankOwnerName())
.like(!StringUtils.isEmpty(reqVO.getCastOwnerName()), "u6.nickname", reqVO.getCastOwnerName())
.like(!StringUtils.isEmpty(reqVO.getProjectSubName()), ProjectOrderSubDO::getName, reqVO.getProjectSubName())
.eq(!StringUtils.isEmpty(reqVO.getProcessDesignType()), ProcessDesignDO::getProcessDesignType, reqVO.getProcessDesignType())
.in(reqVO.getProcessDesignTypeList() != null && !reqVO.getProcessDesignTypeList().isEmpty(), ProcessDesignDO::getProcessDesignType, reqVO.getProcessDesignTypeList())
@ -114,7 +118,7 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
.select("u1.nickname as projectOwnerName", "u2.nickname as craftOwnerName")
.select("b.blank_date as blankDate", "b.two_dim_date as twoDimDate", "b.three_dim_date as threeDimDate")
.select("b.start_blank_date as startBlankDate", "b.start_two_dim_date as startTwoDimDate", "b.start_three_dim_date as startThreeDimDate")
.select( "a.cast_start_date as castStartDate", "a.cast_end_date as castEndDate","u6.nickname as castOwnerName","a.has_cast as hasCast")
.select("u3.nickname as blankOwnerName", "u4.nickname as twoDimOwnerName", "u5.nickname as threeDimOwnerName")
.select("c.name as projectSubName", "b.project_sub_code as projectSubCode")
.leftJoin(PlanDO.class, "a", PlanDO::getId, ProcessDesignDO::getPlanId)
@ -127,6 +131,8 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
.leftJoin("system_users u3 on u3.id = b.blank_owner")
.leftJoin("system_users u4 on u4.id = b.two_dim_owner")
.leftJoin("system_users u5 on u5.id = b.three_dim_owner")
.leftJoin(AdminUserDO.class, "u6", AdminUserDO::getId, PlanDO::getCastOwner)
.eq(ProcessDesignDO::getId, id)
.last("LIMIT 1")
.disableSubLogicDel();
@ -216,11 +222,11 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
if(!StringUtils.isEmpty(reqVO.getOwnerName())){
query.and(QueryWrapper -> QueryWrapper.apply("u2.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_FOUNDRY_TECHNOLOGY.name())
.or()
.apply("u3.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_WORKBLANK.name())
.apply("u3.nickname like concat('%', {0}, '%') and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_WORKBLANK.name())
.or()
.apply("u4.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_2D.name())
.apply("u4.nickname like concat('%', {0}, '%') and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_2D.name())
.or()
.apply("u5.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_3D.name()));
.apply("u5.nickname like concat('%', {0}, '%') and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_3D.name()));
}
return selectPage(reqVO, query);
}
@ -276,13 +282,13 @@ public interface ProcessDesignMapper extends BaseMapperX<ProcessDesignDO> {
;
if(!StringUtils.isEmpty(reqVO.getOwnerName())){
query.and(QueryWrapper -> QueryWrapper.apply("u2.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_FOUNDRY_TECHNOLOGY.name())
query.and(QueryWrapper -> QueryWrapper.apply("u2.nickname like concat('%', {0}, '%') and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_FOUNDRY_TECHNOLOGY.name())
.or()
.apply("u3.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_WORKBLANK.name())
.apply("u3.nickname like concat('%', {0}, '%') and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_WORKBLANK.name())
.or()
.apply("u4.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_2D.name())
.apply("u4.nickname like concat('%', {0}, '%') and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_2D.name())
.or()
.apply("u5.nickname = {0} and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_3D.name()));
.apply("u5.nickname like concat('%', {0}, '%') and t.process_design_type = {1}", reqVO.getOwnerName(), ProcessDesignTypeEnum.BLUEPRINT_3D.name()));
}
System.out.println(query.getSqlSelect()); // 查看实际执行的 SQL
return selectPage(reqVO, query);

View File

@ -785,4 +785,14 @@ public interface TaskDispatchDetailMapper extends BaseMapperX<TaskDispatchDetail
}
BigDecimal assemblyLaborCost(@Param("id") Long id);
BigDecimal bubbleFees(@Param("bomDetailId") Long bomDetailId, @Param("procedureId") Long procedureId);
BigDecimal materialCost(@Param("id") Long id);
BigDecimal internalLaborCost(@Param("id") Long id);
BigDecimal finalInspection(@Param("id")Long id, @Param("projectSubId")Long projectSubId);
BigDecimal processInspection(@Param("id") Long id);
}

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.mybatis.core.mapper.BaseMapperX;
import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.TaskDispatchPageReqVO;
@ -185,4 +186,18 @@ public interface TaskDispatchMapper extends BaseMapperX<TaskDispatchDO> {
return selectList(query);
}
default List<TaskDispatchDO> getListCl(Long id, Long projectSubId){
MPJLambdaWrapper<TaskDispatchDO> query = new MPJLambdaWrapper<>();
query.selectAll(TaskDispatchDO.class)
.select("p.material_name as materialName","z.name as compositionName","p.spec as spec","p.amount*s.amount as amount")
.leftJoin(ProcessBomDetailDO.class, "p", ProcessBomDetailDO::getId,TaskDispatchDO::getBomDetailId)
.leftJoin(CompositionDO.class, "z", CompositionDO::getId, ProcessBomDetailDO::getCompositionId)
.leftJoin(ProjectOrderSubDO.class,"s", ProjectOrderSubDO::getId, TaskDispatchDO::getProjectSubId);
query.eq(TaskDispatchDO::getProjectId, id)
.eq(TaskDispatchDO::getProjectSubId,projectSubId)
.eq(TaskDispatchDO::getDispatchType,"PRODUCTION");
return selectList(query);
}
}

View File

@ -397,14 +397,20 @@ public class CrossOrderManager {
List<Long> existProjectSubIdList = processDesignDOList.stream().map(ProcessDesignDO::getProjectSubId).collect(Collectors.toList());
List<Long> needSavedProjectSubIdList = projectSubIdList.stream().filter(projectSubId -> !existProjectSubIdList.contains(projectSubId)).collect(Collectors.toList());
// 如未插入过 则生成铸造工艺
if(existProjectSubIdList.isEmpty()){
ProcessDesignSaveReqVO saveReqVO = new ProcessDesignSaveReqVO();
saveReqVO.setPlanId(planId)
.setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_FOUNDRY_TECHNOLOGY.name())
.setStatus(ValidStatusEnum.VALID.getCode())
.setProjectId(projectId);
processDesignService.createProcessDesign(saveReqVO);
}
// if(existProjectSubIdList.isEmpty()){
// ProcessDesignSaveReqVO saveReqVO = new ProcessDesignSaveReqVO();
// saveReqVO.setPlanId(planId)
// .setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_FOUNDRY_TECHNOLOGY.name())
// .setStatus(ValidStatusEnum.VALID.getCode())
// .setProjectId(projectId);
// processDesignService.createProcessDesign(saveReqVO);
// ProcessDesignSaveReqVO casting = new ProcessDesignSaveReqVO();
// casting.setPlanId(planId)
// .setProcessDesignType(ProcessDesignTypeEnum.CASTING_DRAWING.name())
// .setStatus(ValidStatusEnum.VALID.getCode())
// .setProjectId(projectId);
// processDesignService.createProcessDesign(casting);
// }
// 按每个子项目生成工艺设计
if(!needSavedProjectSubIdList.isEmpty()){
LocalDateTime startTime = LocalDateTime.now();
@ -417,6 +423,8 @@ public class CrossOrderManager {
.setProjectId(projectId);
processDesignService.createProcessDesign(threeD);
ProcessDesignSaveReqVO twoD = new ProcessDesignSaveReqVO();
twoD.setPlanId(planId)
.setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_2D.name())

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.service.deliverorder;
import java.math.BigDecimal;
import java.util.*;
import javax.validation.*;
import com.chanko.yunxi.mes.module.heli.controller.admin.deliverorder.vo.*;
@ -71,7 +72,7 @@ public interface DeliverOrderService {
List<DeliverOrderDO> getListYf(Long id, Long projectSubId);
BigDecimal getListYf(Long id, Long projectSubId);
List<DeliverOrderDO> getListYfDetails(Long id, Long projectSubId);
List<DeliverOrderSubDO> getListYfDetails(Long id, Long projectSubId);
}

View File

@ -388,78 +388,22 @@ public class DeliverOrderServiceImpl implements DeliverOrderService {
}
@Override
public List<DeliverOrderDO> getListYf(Long id, Long projectSubId) {
LambdaQueryWrapper<DeliverOrderDO> wrapper = new LambdaQueryWrapper<>();
wrapper.like(DeliverOrderDO::getSaleOrderIds,id);
wrapper.eq(DeliverOrderDO::getDeliverStatus,2);
wrapper.orderByDesc(DeliverOrderDO::getDeliverDate);
List<DeliverOrderDO> deliverOrderDOS = deliverOrderMapper.selectList(wrapper);
LambdaQueryWrapper<ProjectOrderSubDO> queryWrapper1 = new LambdaQueryWrapper<>();
queryWrapper1.eq(ProjectOrderSubDO::getProjectOrderId,id);
List<ProjectOrderSubDO> projectOrderSubDOS = projectOrderSubMapper.selectList(queryWrapper1);
if (deliverOrderDOS!=null&&deliverOrderDOS.size()>0&&projectOrderSubDOS!=null&&projectOrderSubDOS.size()>0){
List<Long> ids = projectOrderSubDOS.stream()
.map(ProjectOrderSubDO::getId)
.collect(Collectors.toList());
for (DeliverOrderDO deliverOrderDO : deliverOrderDOS) {
LambdaQueryWrapper<DeliverOrderSubDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DeliverOrderSubDO::getDeliveryOrderId,deliverOrderDO.getId());
queryWrapper.in(DeliverOrderSubDO::getSaleOrderSubId,ids);
List<DeliverOrderSubDO> deliverOrderSubDOS = deliverOrderSubMapper.selectList(queryWrapper);
public BigDecimal getListYf(Long id, Long projectSubId) {
List<DeliverOrderSubDO> deliverOrderSubDOS = deliverOrderSubMapper.getListYf(projectSubId);
if (ObjectUtil.isNotEmpty(deliverOrderSubDOS)){
BigDecimal totalAmount = deliverOrderSubDOS.stream()
.map(deliverOrderSubDO -> deliverOrderSubDO.getYunFei() != null ? deliverOrderSubDO.getYunFei() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
deliverOrderDO.setYunFeiMoney(totalAmount);
}
return deliverOrderDOS;
}
return null;
return totalAmount;
}
return BigDecimal.ZERO;
}
@Override
public List<DeliverOrderDO> getListYfDetails(Long id, Long projectSubId) {
LambdaQueryWrapper<DeliverOrderDO> wrapper = new LambdaQueryWrapper<>();
wrapper.like(DeliverOrderDO::getSaleOrderIds,id);
wrapper.eq(DeliverOrderDO::getDeliverStatus,2);
wrapper.orderByDesc(DeliverOrderDO::getDeliverDate);
List<DeliverOrderDO> deliverOrderDOS = deliverOrderMapper.selectList(wrapper);
LambdaQueryWrapper<ProjectOrderSubDO> queryWrapper1 = new LambdaQueryWrapper<>();
queryWrapper1.eq(ProjectOrderSubDO::getProjectOrderId,id);
List<ProjectOrderSubDO> projectOrderSubDOS = projectOrderSubMapper.selectList(queryWrapper1);
if (deliverOrderDOS!=null&&deliverOrderDOS.size()>0&&projectOrderSubDOS!=null&&projectOrderSubDOS.size()>0){
List<Long> ids = projectOrderSubDOS.stream()
.map(ProjectOrderSubDO::getId)
.collect(Collectors.toList());
for (DeliverOrderDO deliverOrderDO : deliverOrderDOS) {
LambdaQueryWrapper<DeliverOrderSubDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(DeliverOrderSubDO::getDeliveryOrderId,deliverOrderDO.getId());
queryWrapper.in(DeliverOrderSubDO::getSaleOrderSubId,ids);
List<DeliverOrderSubDO> deliverOrderSubDOS = deliverOrderSubMapper.selectList(queryWrapper);
BigDecimal totalAmount = deliverOrderSubDOS.stream()
.map(deliverOrderSubDO -> deliverOrderSubDO.getYunFei() != null ? deliverOrderSubDO.getYunFei() : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
deliverOrderDO.setYunFeiMoney(totalAmount);
int amounts = deliverOrderSubDOS.stream()
.mapToInt(deliverOrderSubDO ->
deliverOrderSubDO.getAmount() != null
? deliverOrderSubDO.getAmount()
: 0
)
.sum();
deliverOrderDO.setAmounts( amounts);
BigDecimal weight = deliverOrderSubDOS.stream()
.map(deliverOrderSubDO -> deliverOrderSubDO.getWeight() != null ? new BigDecimal(deliverOrderSubDO.getWeight()) : BigDecimal.ZERO)
.reduce(BigDecimal.ZERO, BigDecimal::add);
deliverOrderDO.setWeights(weight);
AdminUserDO adminUserDO = adminUserMapper.selectById(deliverOrderDO.getDeliverPerson());
if (ObjectUtil.isNotEmpty(adminUserDO)){
deliverOrderDO.setDeliverPersonName(adminUserDO.getNickname());
}
public List<DeliverOrderSubDO> getListYfDetails(Long id, Long projectSubId) {
List<DeliverOrderSubDO> deliverOrderSubDOS = deliverOrderSubMapper.getListYf(projectSubId);
}
return deliverOrderDOS;
}
return null;
return deliverOrderSubDOS;
}

View File

@ -82,4 +82,6 @@ public interface MaterialPlanService {
CommonResult<Boolean> delMaterial(Long id);
PageResult<MaterialPlanBoomDO> getPartPurchasePages(MaterialPlanPageReqVO pageReqVO);
CommonResult<Boolean> delMaterialPlanBoom(Long id, String projectMaterialPlanNo);
}

View File

@ -14,6 +14,7 @@ import com.chanko.yunxi.mes.module.heli.dal.dataobject.processbom.ProcessBomDeta
import com.chanko.yunxi.mes.module.heli.dal.dataobject.purchaseorderno.PurchaseOrderNoDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.serialnumber.SerialNumberDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.storagelogNow.StorageLogNowDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.mysql.attentiontodo.AttentiontodoMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.material.MaterialMapper;
@ -21,6 +22,7 @@ import com.chanko.yunxi.mes.module.heli.dal.mysql.materialplanboom.MaterialPlanB
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.purchaseorderno.PurchaseOrderNoMapper;
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.service.attentiontodo.AttentiontodoService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import com.chanko.yunxi.mes.module.system.api.user.AdminUserApi;
@ -85,6 +87,8 @@ public class MaterialPlanServiceImpl implements MaterialPlanService {
@Resource
private TaskDispatchDetailMapper taskDispatchDetailMapper;
@Resource
private TaskDispatchMapper taskDispatchMapper;
@Resource
private MaterialMapper materialMapper;
@Override
public Long createMaterialPlan(MaterialPlanSaveReqVO createReqVO) {
@ -509,4 +513,40 @@ public class MaterialPlanServiceImpl implements MaterialPlanService {
return materialPlanBoomMapper.getPartsPages(pageReqVO);
}
@Override
public CommonResult<Boolean> delMaterialPlanBoom(Long id, String projectMaterialPlanNo) {
TaskDispatchDetailDO taskDispatchDetailDO = taskDispatchDetailMapper.selectById(id);
if (ObjectUtil.isNotEmpty(taskDispatchDetailDO)){
LambdaQueryWrapper<MaterialPlanDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MaterialPlanDO::getProjectMaterialPlanNo, taskDispatchDetailDO.getProjectMaterialPlanNo());
MaterialPlanDO planDO = materialPlanMapper.selectOne(wrapper);
if(ObjectUtil.isEmpty(planDO)) return CommonResult.error(400,"该物料需求单号不存在,请确认!");
LambdaQueryWrapper<TaskDispatchDO> lambdaQueryWrapper1 = new LambdaQueryWrapper<>();
lambdaQueryWrapper1.eq(TaskDispatchDO::getId, taskDispatchDetailDO.getDispatchId());
TaskDispatchDO taskDispatchDO = taskDispatchMapper.selectOne(lambdaQueryWrapper1);
if (ObjectUtil.isNotEmpty(taskDispatchDO)){
LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MaterialPlanBoomDO::getBoomDetailId, taskDispatchDO.getBomDetailId());
queryWrapper.eq(MaterialPlanBoomDO::getProcedureId, taskDispatchDetailDO.getProcedureId());
queryWrapper.in(MaterialPlanBoomDO::getMplanStatus,1,2,3);
if (materialPlanBoomMapper.selectCount(queryWrapper) > 0)return CommonResult.error(400,"该零件已送审,不允许删除,请确认!");
materialPlanMapper.delMaterialPlanBoom(taskDispatchDO.getBomDetailId(),taskDispatchDetailDO.getProcedureId());
}
LambdaQueryWrapper<MaterialPlanBoomDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId());
if (materialPlanBoomMapper.selectCount(lambdaQueryWrapper) <=0) materialPlanMapper.delMaterialPlan(planDO.getId());
LambdaUpdateWrapper<TaskDispatchDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(TaskDispatchDetailDO::getId, id);
lambdaUpdateWrapper.set(TaskDispatchDetailDO::getProjectMaterialPlanNo, null);
lambdaUpdateWrapper.set(TaskDispatchDetailDO::getPlanStatus,0);
lambdaUpdateWrapper.set(TaskDispatchDetailDO::getProjectMaterialPlanDetailId,null);
lambdaUpdateWrapper.set(TaskDispatchDetailDO::getMatPlanProcess,"N");
taskDispatchDetailMapper.update(lambdaUpdateWrapper);
return CommonResult.success( true);
}
return CommonResult.error(400,"派工单明细不存在,请刷新页面");
}
}

View File

@ -1,5 +1,6 @@
package com.chanko.yunxi.mes.module.heli.service.plan;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanSaveReqVO;
@ -26,8 +27,9 @@ public interface PlanService {
* 更新生产计划
*
* @param updateReqVO 更新信息
* @return
*/
void updatePlan(@Valid PlanSaveReqVO updateReqVO);
CommonResult<Boolean> updatePlan(@Valid PlanSaveReqVO updateReqVO);
/**
* 删除生产计划
@ -62,4 +64,6 @@ public interface PlanService {
boolean complete(Long id);
int updateById(PlanDO planDO);
CommonResult<Boolean> verification(Long id, String type);
}

View File

@ -1,9 +1,10 @@
package com.chanko.yunxi.mes.module.heli.service.plan;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.chanko.yunxi.mes.framework.common.exception.ErrorCode;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageParam;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.framework.common.util.object.BeanUtils;
@ -13,6 +14,7 @@ import com.chanko.yunxi.mes.framework.web.core.util.WebFrameworkUtils;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.plan.vo.PlanSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.plansub.vo.PlanSubPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processdesign.vo.ProcessDesignSaveReqVO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.customer.CustomerDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plan.PlanDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.plansub.PlanSubDO;
@ -20,18 +22,21 @@ 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.processdesign.ProcessDesignDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.processdesignprogress.ProcessDesignProgressDO;
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.taskdispatch.TaskDispatchDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskdispatch.TaskDispatchDetailDO;
import com.chanko.yunxi.mes.module.heli.dal.dataobject.taskreport.TaskReportDO;
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.plantask.PlanTaskMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.plantaskbom.PlanTaskBomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.processdesign.ProcessDesignProgressMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.projectorder.ProjectOrderMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchDetailMapper;
import com.chanko.yunxi.mes.module.heli.dal.mysql.taskdispatch.TaskDispatchMapper;
@ -40,10 +45,10 @@ import com.chanko.yunxi.mes.module.heli.enums.*;
import com.chanko.yunxi.mes.module.heli.service.customer.CustomerService;
import com.chanko.yunxi.mes.module.heli.service.projectorder.ProjectOrderService;
import com.chanko.yunxi.mes.module.heli.service.serialnumber.SerialNumberService;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.validation.annotation.Validated;
import org.thymeleaf.util.StringUtils;
@ -51,10 +56,8 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
import static com.chanko.yunxi.mes.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.chanko.yunxi.mes.module.heli.enums.CodeEnum.PROJECT_PLAN;
@ -109,6 +112,10 @@ public class PlanServiceImpl implements PlanService {
private TaskDispatchDetailMapper taskDispatchDetailMapper;
@Resource
private CustomerService customerService;
@Resource
private ProcessDesignMapper processDesignMapper;
@Resource
private ProcessDesignProgressMapper processDesignProgressMapper;
@Resource
private TaskReportMapper taskReportMapper;
@Override
@ -131,12 +138,51 @@ private TaskReportMapper taskReportMapper;
}
@Override
public void updatePlan(PlanSaveReqVO updateReqVO) {
public CommonResult<Boolean> updatePlan(PlanSaveReqVO updateReqVO) {
// 校验存在
validatePlanExists(updateReqVO.getId());
// 更新
PlanDO updateObj = BeanUtils.toBean(updateReqVO, PlanDO.class);
LambdaQueryWrapper<ProcessDesignDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessDesignDO::getPlanId,updateObj.getId());
queryWrapper.eq(ProcessDesignDO::getProcessDesignType,"BLUEPRINT_FOUNDRY_TECHNOLOGY");
ProcessDesignDO processDesignDO = processDesignMapper.selectOne(queryWrapper);
if (updateObj.getHasCraft()==1){
if (ObjectUtil.isEmpty(processDesignDO)){
ProcessDesignDO saveReqVO = new ProcessDesignDO();
saveReqVO.setPlanId(updateObj.getId())
.setProcessDesignType(ProcessDesignTypeEnum.BLUEPRINT_FOUNDRY_TECHNOLOGY.name())
.setStatus(ValidStatusEnum.VALID.getCode())
.setProjectId(updateObj.getProjectId());
processDesignMapper.insert(saveReqVO);
}
}else {
if (ObjectUtil.isNotEmpty(processDesignDO)){
processDesignMapper.deleteById(processDesignDO.getId());
}
}
LambdaQueryWrapper<ProcessDesignDO> queryWrapper1 = new LambdaQueryWrapper<>();
queryWrapper1.eq(ProcessDesignDO::getPlanId,updateObj.getId());
queryWrapper1.eq(ProcessDesignDO::getProcessDesignType,"CASTING_DRAWING");
ProcessDesignDO processDesignDO1 = processDesignMapper.selectOne(queryWrapper1);
if (updateObj.getHasCast()==1){
if (ObjectUtil.isEmpty(processDesignDO1)){
ProcessDesignDO casting = new ProcessDesignDO();
casting.setPlanId(updateObj.getId())
.setProcessDesignType(ProcessDesignTypeEnum.CASTING_DRAWING.name())
.setStatus(ValidStatusEnum.VALID.getCode())
.setProjectId(updateObj.getProjectId());
processDesignMapper.insert(casting);
}
}else {
if (ObjectUtil.isNotEmpty(processDesignDO1)){
processDesignMapper.deleteById(processDesignDO1.getId());
}
}
planMapper.updateById(updateObj);
return CommonResult.success(true);
}
@Override
@ -298,6 +344,23 @@ private TaskReportMapper taskReportMapper;
public int updateById(PlanDO planDO){
return planMapper.updateById(planDO);
}
@Override
public CommonResult<Boolean> verification(Long id, String type) {
LambdaQueryWrapper<ProcessDesignDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(ProcessDesignDO::getPlanId,id);
queryWrapper.eq(ProcessDesignDO::getProcessDesignType,type);
ProcessDesignDO processDesignDO = processDesignMapper.selectOne(queryWrapper);
if (ObjectUtil.isNotEmpty(processDesignDO)){
LambdaQueryWrapper<ProcessDesignProgressDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(ProcessDesignProgressDO::getProcessDesignId,processDesignDO.getId());
if (processDesignProgressMapper.selectCount(wrapper)>0) return CommonResult.success(false);
}
return CommonResult.success(true);
}
@Override
public boolean complete(Long id) {
LambdaQueryWrapper<TaskDispatchDO> queryWrapper = new LambdaQueryWrapper<>();

View File

@ -2,6 +2,7 @@ package com.chanko.yunxi.mes.module.heli.service.processbom;
import com.chanko.yunxi.mes.framework.common.pojo.CommonResult;
import com.chanko.yunxi.mes.framework.common.pojo.PageResult;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomImportRespVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomPageReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.processbom.vo.ProcessBomSaveReqVO;
import com.chanko.yunxi.mes.module.heli.controller.admin.taskdispatch.vo.TaskPlanJDBaoBiaoPageReqVO;
@ -39,7 +40,7 @@ public interface ProcessBomService {
* @param file 文件
* @return 编号
*/
void importExcel(@Valid MultipartFile file,String bomCode) throws IOException;
void importExcel(@Valid MultipartFile file, String bomCode) throws IOException;
/**
* 更新工艺bom
*
@ -113,4 +114,6 @@ public interface ProcessBomService {
BigDecimal internalLaborCost(Long id, Long projectSubId);
BigDecimal assemblyLaborCost(Long id, Long projectSubId);
CommonResult<Boolean> delMaterialPlan(Long id, String projectMaterialPlanNo);
}

View File

@ -183,7 +183,10 @@ public class ProcessBomServiceImpl implements ProcessBomService {
HashSet<String> blueprintNoList = new HashSet<String>();
Map<String, List<ProcessBomImportExcelVO>> groupedByCode = list.stream().collect(Collectors.groupingBy(vo -> vo.getCode() == null ? "NULL" : vo.getCode()));
Map<String, List<ProcessBomImportExcelVO>> groupedByBluePrintfNo = list.stream().collect(Collectors.groupingBy(vo -> vo.getBlueprintNo() == null ? "NULL" : vo.getBlueprintNo()));
Map<String, List<ProcessBomImportExcelVO>> groupedByMaterialName = list.stream().filter(e -> e.getType().equals("")).collect(Collectors.groupingBy(vo -> vo.getMaterialName() == null ? "NULL" : vo.getMaterialName()));
Map<String, List<ProcessBomImportExcelVO>> groupedByMaterialName = list.stream().collect(Collectors.groupingBy(vo -> vo.getMaterialName() == null ? "NULL" : vo.getMaterialName()));
Map<String, List<ProcessBomImportExcelVO>> groupedByType = list.stream().collect(Collectors.groupingBy(vo -> vo.getType() == null ? "NULL" : vo.getType()));
Map<String, List<ProcessBomImportExcelVO>> groupedByAmount = list.stream().collect(Collectors.groupingBy(vo -> vo.getAmount() == null ? "NULL" : vo.getAmount().toString()));
Map<String, List<ProcessBomImportExcelVO>> groupedByUnit = list.stream().collect(Collectors.groupingBy(vo -> vo.getUnit() == null ? "NULL" : vo.getUnit()));
// if (CollUtil.isNotEmpty(groupedByCode.get("NULL"))) {
// throw exception(PROCESS_BOM_CODE_IS_EMPTY);
@ -194,7 +197,22 @@ public class ProcessBomServiceImpl implements ProcessBomService {
if (CollUtil.isNotEmpty(groupedByMaterialName.get("NULL"))) {
throw exception(PROCESS_BOM_DETAIL_MATERIAL_NAME_IS_NULL);
}
if (CollUtil.isNotEmpty(groupedByType.get("NULL"))) {
throw exception(PROCESS_BOM_DETAIL_TYPE_IS_NULL);
}
if (CollUtil.isNotEmpty(groupedByAmount.get("NULL"))) {
throw exception(PROCESS_BOM_DETAIL_AMOUNT_IS_NULL);
}
if (CollUtil.isNotEmpty(groupedByUnit.get("NULL"))) {
throw exception(PROCESS_BOM_DETAIL_UNIT_IS_NULL);
}
Map<String, List<ProcessBomImportExcelVO>> groupedByAmounts = list.stream()
.collect(Collectors.groupingBy(vo -> {
if (vo.getAmount() <= 0) {
throw exception(PROCESS_BOM_DETAIL_AMOUNT);
}
return vo.getAmount().toString();
}));
// list.forEach(item->{
// blueprintNoList.add(item.getBlueprintNo());
// });
@ -1304,7 +1322,7 @@ public class ProcessBomServiceImpl implements ProcessBomService {
// }
BigDecimal cost= processBomMapper.bubbleFees(id,projectSubId);
BigDecimal cost1=processBomMapper.materialCost(id,projectSubId);
BigDecimal cost1=processBomMapper.inspection(id,projectSubId);
if (ObjectUtil.isEmpty(cost1)) cost1=BigDecimal.ZERO;
if (ObjectUtil.isEmpty(cost)) cost=BigDecimal.ZERO;
@ -1321,14 +1339,48 @@ public class ProcessBomServiceImpl implements ProcessBomService {
@Override
public BigDecimal internalLaborCost(Long id, Long projectSubId) {
BigDecimal cost=processBomMapper.internalLaborCost(id,projectSubId);
BigDecimal cost1= processBomMapper.inspection1(id,projectSubId);
if (ObjectUtil.isEmpty(cost)) cost=BigDecimal.ZERO;
return cost; }
if (ObjectUtil.isEmpty(cost1)) cost1=BigDecimal.ZERO;
return cost.add(cost1);
}
@Override
public BigDecimal assemblyLaborCost(Long id, Long projectSubId) {
BigDecimal cost=processBomMapper.assemblyLaborCost(id,projectSubId);
BigDecimal cost1= processBomMapper.finalInspection(id,projectSubId);
if (ObjectUtil.isEmpty(cost)) cost=BigDecimal.ZERO;
return cost;
if (ObjectUtil.isEmpty(cost1)) cost1=BigDecimal.ZERO;
return cost.add(cost1);
}
@Override
public CommonResult<Boolean> delMaterialPlan(Long id, String projectMaterialPlanNo) {
ProcessBomDetailDO bomDetailDO = processBomDetailMapper.selectById(id);
if (ObjectUtil.isNotEmpty(bomDetailDO)){
LambdaQueryWrapper<MaterialPlanDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(MaterialPlanDO::getProjectMaterialPlanNo, bomDetailDO.getProjectMaterialPlanNo());
MaterialPlanDO planDO = materialPlanMapper.selectOne(wrapper);
if(ObjectUtil.isEmpty(planDO)) return CommonResult.error(400,"该物料需求单号不存在,请确认!");
LambdaQueryWrapper<MaterialPlanBoomDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(MaterialPlanBoomDO::getBoomDetailId, bomDetailDO.getId());
queryWrapper.in(MaterialPlanBoomDO::getMplanStatus,1,2,3);
if (materialPlanBoomMapper.selectCount(queryWrapper) > 0)return CommonResult.error(400,"该物料已送审,不允许删除,请确认!");
processBomMapper.delMaterialPlan(id);
LambdaQueryWrapper<MaterialPlanBoomDO> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(MaterialPlanBoomDO::getProjectMaterialPlanId, planDO.getId());
if (materialPlanBoomMapper.selectCount(lambdaQueryWrapper) <=0) materialPlanMapper.delMaterialPlan(planDO.getId());
LambdaUpdateWrapper<ProcessBomDetailDO> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
lambdaUpdateWrapper.eq(ProcessBomDetailDO::getId,id);
lambdaUpdateWrapper.set(ProcessBomDetailDO::getProjectMaterialPlanNo, null);
lambdaUpdateWrapper.set(ProcessBomDetailDO::getDuEmpId, null);
lambdaUpdateWrapper.set(ProcessBomDetailDO::getMplanStatus,0);
lambdaUpdateWrapper.set(ProcessBomDetailDO::getMplanDate,null);
processBomDetailMapper.update(lambdaUpdateWrapper);
return CommonResult.success( true);
}
return CommonResult.error(400,"boom明细不存在,请刷新页面");
}

View File

@ -510,6 +510,8 @@ public class ProcessDesignServiceImpl implements ProcessDesignService {
thingname="2D设计任务提醒";
}else if ("BLUEPRINT_WORKBLANK".equals(processDesignDO.getProcessDesignType())){
thingname="毛坯设计任务提醒";
}else if ("CASTING_DRAWING".equals(processDesignDO.getProcessDesignType())){
thingname="铸件图设计任务提醒";
}
// String things = processDesignDO.getCustomerName()+processDesignDO.getProjectName()+processDesignDO.getProjectSubName()+processDesignProgressDO.getRemark();
for (AttentiontodoDO attentiontodoDO : attentiontodookddfh) {

View File

@ -104,4 +104,6 @@ public interface TaskDispatchService {
List<AdminUserDO> getOwnerUserList(Long id, Long type);
List<TaskDispatchDO> getListZp(Long id, Long projectSubId);
List<TaskDispatchDO> getListCl(Long id, Long projectSubId);
}

View File

@ -1080,6 +1080,8 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
public List<TaskDispatchDO> getListZp(Long id, Long projectSubId) {
LambdaQueryWrapper<TaskDispatchDO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(TaskDispatchDO::getProjectId, id);
queryWrapper.eq(TaskDispatchDO::getProjectSubId, projectSubId);
queryWrapper.eq(TaskDispatchDO::getDispatchType,"ASSEMBLE");
List<TaskDispatchDO> taskDispatchDOS = taskDispatchMapper.selectList(queryWrapper);
for (TaskDispatchDO taskDispatchDO : taskDispatchDOS) {
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
@ -1088,7 +1090,7 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
Map<String, BigDecimal> map = new HashMap<>();
ProjectOrderSubDO projectOrderSubDO = projectOrderSubMapper.selectById(taskDispatchDO.getProjectSubId());
BigDecimal assemblyLaborCost = BigDecimal.ONE;
BigDecimal assemblyLaborCost = BigDecimal.ZERO;
for (TaskDispatchDetailDO detailDO : detailDOS) {
ProcedureDO procedureDO = procedureMapper.selectById(detailDO.getProcedureId());
BigDecimal cost=taskDispatchDetailMapper.assemblyLaborCost(detailDO.getId());
@ -1100,12 +1102,15 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
map.put(procedureDO.getName(),cost);
}
}
assemblyLaborCost.add(cost);
assemblyLaborCost= assemblyLaborCost.add(cost);
}
BigDecimal finalInspection = taskDispatchDetailMapper.finalInspection(id, projectSubId);
map.put("检验",ObjectUtil.isEmpty(finalInspection)?null:finalInspection);
assemblyLaborCost.add(ObjectUtil.isEmpty(finalInspection)?BigDecimal.ZERO:finalInspection);
taskDispatchDO.setAssemblyLaborSum(assemblyLaborCost);
taskDispatchDO.setMap( map);
if (ObjectUtil.isNotEmpty(projectOrderSubDO)){
taskDispatchDO.setAssemblyLaborCost(assemblyLaborCost.divide(new BigDecimal(projectOrderSubDO.getAmount()),1,RoundingMode.HALF_UP));
taskDispatchDO.setAssemblyLaborCost(assemblyLaborCost.divide(new BigDecimal(projectOrderSubDO.getAmount()),1, RoundingMode.HALF_UP));
taskDispatchDO.setProjectSubName(projectOrderSubDO.getName());
taskDispatchDO.setQuantity(projectOrderSubDO.getAmount());
LambdaQueryWrapper<PlanSubDO> planSubDOLambdaQueryWrapper = new LambdaQueryWrapper<>();
@ -1118,7 +1123,43 @@ public class TaskDispatchServiceImpl implements TaskDispatchService {
}
}
return null;
return taskDispatchDOS;
}
@Override
public List<TaskDispatchDO> getListCl(Long id, Long projectSubId) {
List<TaskDispatchDO> taskDispatchDOS = taskDispatchMapper.getListCl(id, projectSubId);
for (TaskDispatchDO taskDispatchDO : taskDispatchDOS) {
LambdaQueryWrapper<TaskDispatchDetailDO> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(TaskDispatchDetailDO::getDispatchId, taskDispatchDO.getId());
List<TaskDispatchDetailDO> detailDOS = taskDispatchDetailMapper.selectList(wrapper);
Map<String, BigDecimal> map = new HashMap<>();
BigDecimal assemblyLaborCost = BigDecimal.ZERO;
for (TaskDispatchDetailDO detailDO : detailDOS) {
ProcedureDO procedureDO = procedureMapper.selectById(detailDO.getProcedureId());
BigDecimal procedureCost=taskDispatchDetailMapper.bubbleFees(taskDispatchDO.getBomDetailId(),detailDO.getProcedureId());
BigDecimal materialCost = taskDispatchDetailMapper.materialCost(detailDO.getId());
BigDecimal internalLaborCost = taskDispatchDetailMapper.internalLaborCost(detailDO.getId());
BigDecimal processInspection=taskDispatchDetailMapper.processInspection(detailDO.getId());
if (ObjectUtil.isEmpty(procedureCost)) procedureCost=BigDecimal.ZERO;
if (ObjectUtil.isEmpty(materialCost)) materialCost=BigDecimal.ZERO;
if (ObjectUtil.isEmpty(internalLaborCost)) internalLaborCost=BigDecimal.ZERO;
if (ObjectUtil.isEmpty(processInspection)) processInspection=BigDecimal.ZERO;
BigDecimal sum = procedureCost.add(materialCost).add(internalLaborCost).add(processInspection);
if (ObjectUtil.isNotEmpty(procedureDO)){
map.put(procedureDO.getName(),sum);
}
assemblyLaborCost=assemblyLaborCost.add(sum);
}
taskDispatchDO.setAssemblyLaborSum(assemblyLaborCost);
taskDispatchDO.setMap( map);
taskDispatchDO.setAssemblyLaborCost(assemblyLaborCost.divide(taskDispatchDO.getAmount(),1, RoundingMode.HALF_UP));
}
return taskDispatchDOS;
}
private void updateAssembleDetail(OperateTypeEnum operateTypeEnum,Long dispatchId, List<TaskDispatchDetailOwnerDO> list) {

View File

@ -9,4 +9,11 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<delete id="delMaterialPlan">
delete from project_material_plan where id=#{id}
</delete>
<delete id="delMaterialPlanBoom">
delete from project_material_plan_boom where boom_detail_id=#{bomDetailId} and procedure_id=#{procedureId}
</delete>
</mapper>

View File

@ -1,6 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.chanko.yunxi.mes.module.heli.dal.mysql.processbom.ProcessBomMapper">
<delete id="delMaterialPlan">
delete from project_material_plan_boom where boom_detail_id=#{id}
</delete>
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
@ -46,7 +49,7 @@
from pro_task_dispatch t
left join pro_task_dispatch_detail t1 on t.id=t1.dispatch_id and t1.deleted=0 and t1.tenant_id=2
left join pro_task_report r on r.dispatch_detail_id=t1.id and r.deleted=0 and r.tenant_id=2
where t1.is_outsourcing='Y' and t.deleted=0 and t.dispatch_type='PRODUCTION' and r.work_type=2 and t.project_id=#{id}
where t1.is_outsourcing='Y' and t.deleted=0 and t.dispatch_type='PRODUCTION' and r.work_type=2 and t.project_id=#{id} and t.project_sub_id= #{projectSubId}
</select>
<select id="bubbleFees" resultType="java.math.BigDecimal">
SELECT
@ -70,7 +73,7 @@
left join pro_task_report r on r.dispatch_detail_id=t1.id and r.deleted=0 and r.tenant_id=2
left join system_user_post u on u.user_id=r.owner and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
where t1.is_outsourcing='N' and t.deleted=0 and t.dispatch_type='PRODUCTION' and r.work_type=1 and t.project_id=#{id}
where t1.is_outsourcing='N' and t.deleted=0 and t.dispatch_type='PRODUCTION' and r.work_type=1 and t.project_id=#{id} and t.project_sub_id= #{projectSubId}
</select>
<select id="assemblyLaborCost" resultType="java.math.BigDecimal">
SELECT sum(COALESCE(r.work_time, 0) * p.grade_cost) cost
@ -79,7 +82,33 @@
left join pro_task_report r on r.dispatch_detail_id=t1.id and r.deleted=0 and r.tenant_id=2
left join system_user_post u on u.user_id=r.owner and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
where t.deleted=0 and t.dispatch_type='ASSEMBLE' and t.project_id=#{id}
where t.deleted=0 and t.dispatch_type='ASSEMBLE' and t.project_id=#{id} and t.project_sub_id= #{projectSubId}
</select>
<select id="inspection" resultType="java.math.BigDecimal">
SELECT sum(COALESCE(t.work_time, 0) * p.grade_cost) cost
FROM quality_pg_master_line g
LEFT JOIN quality_bg_master_line t ON t.zj_mx_id = g.id and t.deleted = 0 and t.tenant_id = 2
left join system_user_post u on u.user_id=t.bg_user and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
left join pro_task_dispatch_detail d on d.id=g.dispatch_detail_id and d.deleted=0 and d.tenant_id=2
where g.deleted = 0 and g.project_id=#{id} and g.project_sub_id= #{projectSubId} and d.is_outsourcing='Y'
</select>
<select id="finalInspection" resultType="java.math.BigDecimal">
SELECT sum(COALESCE(t.work_time, 0) * p.grade_cost) cost
FROM quality_zj_pg_master_line g
LEFT JOIN quality_zj_bg_master_line t ON t.zj_mx_id = g.id and t.deleted = 0 and t.tenant_id = 2
left join system_user_post u on u.user_id=t.bg_user and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
where g.deleted = 0 and g.project_id=#{id} and g.project_sub_id= #{projectSubId}
</select>
<select id="inspection1" resultType="java.math.BigDecimal">
SELECT sum(COALESCE(t.work_time, 0) * p.grade_cost) cost
FROM quality_pg_master_line g
LEFT JOIN quality_bg_master_line t ON t.zj_mx_id = g.id and t.deleted = 0 and t.tenant_id = 2
left join system_user_post u on u.user_id=t.bg_user and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
left join pro_task_dispatch_detail d on d.id=g.dispatch_detail_id and d.deleted=0 and d.tenant_id=2
where g.deleted = 0 and g.project_id=#{id} and g.project_sub_id= #{projectSubId} and d.is_outsourcing='N'
</select>
<update id="updateDetailEditStatusById" parameterType="Long">

View File

@ -118,4 +118,51 @@
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
where r.deleted=0 and r.dispatch_detail_id=#{id}
</select>
<select id="bubbleFees" resultType="java.math.BigDecimal">
SELECT
SUM(COALESCE(p.mat_weight, 0) * COALESCE(c.price, 0)) AS cost
FROM
pro_process_bom_detail t
LEFT JOIN project_material_plan_boom p ON p.boom_detail_id = t.id
AND p.deleted = 0
AND p.tenant_id = 2
LEFT JOIN base_composition c ON t.composition_id = c.id
AND c.deleted = 0
AND c.tenant_id = 2
WHERE
t.type = 2
AND p.boom_detail_id =#{bomDetailId} and p.procedure_id=#{procedureId}
</select>
<select id="materialCost" resultType="java.math.BigDecimal">
SELECT sum(r.work_time) cost
from pro_task_dispatch t
left join pro_task_dispatch_detail t1 on t.id=t1.dispatch_id and t1.deleted=0 and t1.tenant_id=2
left join pro_task_report r on r.dispatch_detail_id=t1.id and r.deleted=0 and r.tenant_id=2
where t1.is_outsourcing='Y' and t.deleted=0 and t.dispatch_type='PRODUCTION' and r.work_type=2 and t1.id=#{id}
</select>
<select id="internalLaborCost" resultType="java.math.BigDecimal">
SELECT sum(COALESCE(r.work_time, 0) * p.grade_cost) cost
from pro_task_dispatch t
left join pro_task_dispatch_detail t1 on t.id=t1.dispatch_id and t1.deleted=0 and t1.tenant_id=2
left join pro_task_report r on r.dispatch_detail_id=t1.id and r.deleted=0 and r.tenant_id=2
left join system_user_post u on u.user_id=r.owner and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
where t1.is_outsourcing='N' and t.deleted=0 and t.dispatch_type='PRODUCTION' and r.work_type=1 and t1.id=#{id}
</select>
<select id="finalInspection" resultType="java.math.BigDecimal">
SELECT sum(COALESCE(t.work_time, 0) * p.grade_cost) cost
FROM quality_zj_pg_master_line g
LEFT JOIN quality_zj_bg_master_line t ON t.zj_mx_id = g.id and t.deleted = 0 and t.tenant_id = 2
left join system_user_post u on u.user_id=t.bg_user and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
where g.deleted = 0 and g.project_id=#{id} and g.project_sub_id= #{projectSubId}
</select>
<select id="processInspection" resultType="java.math.BigDecimal">
SELECT sum(COALESCE(t.work_time, 0) * p.grade_cost) cost
FROM quality_pg_master_line g
LEFT JOIN quality_bg_master_line t ON t.zj_mx_id = g.id and t.deleted = 0 and t.tenant_id = 2
left join system_user_post u on u.user_id=t.bg_user and u.deleted=0 and u.tenant_id=2
left join system_post p on p.id=u.post_id and u.deleted=0 and p.tenant_id=2 and p.status=0
where g.deleted = 0 and g.dispatch_detail_id=#{id}
</select>
</mapper>

View File

@ -99,3 +99,7 @@ export const delMaterial = async (id: number) => {
export const getPartPurchasePages = async (params) => {
return await request.get({ url: `/heli/material-plan/getPartPurchasePages`, params })
}
// 删除工艺bom
export const delMaterialPlanBoom = async (id: number,projectMaterialPlanNo:string) => {
return await request.delete({ url: `/heli/material-plan/delMaterialPlanBoom?id=` + id+"&projectMaterialPlanNo="+projectMaterialPlanNo})
}

View File

@ -18,7 +18,7 @@ export interface PlanVO {
approveDate: Date
description: string
status: number
}
// 查询生产计划分页
@ -58,3 +58,7 @@ export const deletePlan = async (id: number) => {
export const exportPlan = async (params) => {
return await request.download({ url: `/heli/plan/export-excel`, params })
}
// 查询生产计划详情
export const verification = async (id: number,type:string) => {
return await request.get({ url: `/heli/plan/verification?id=` + id+`&type=`+type })
}

View File

@ -100,3 +100,7 @@ export const getPlanBb = async (params) => {
export const planBZJPage = async (params) => {
return await request.get({ url: `/heli/process-bom/planBZJPage`, params })
}
// 删除工艺bom
export const delMaterialPlan = async (id: number,projectMaterialPlanNo:string) => {
return await request.delete({ url: `/heli/process-bom/delMaterialPlan?id=` + id+"&projectMaterialPlanNo="+projectMaterialPlanNo})
}

View File

@ -45,7 +45,7 @@ export const getListYfDetails = async (id: number,projectSubId: number) => {
}
//查询材料成本
export const getListcl = async (id: number,projectSubId: number) => {
return await request.get({ url: `/heli/task-dispatch/getListcl?id=`+id+`&projectSubId=`+projectSubId })
return await request.get({ url: `/heli/task-dispatch/getListCl?id=`+id+`&projectSubId=`+projectSubId })
}
//查询装配成本
export const getListZp = async (id: number,projectSubId: number) => {

View File

@ -85,6 +85,7 @@
<dict-tag :type="DICT_TYPE.HELI_COMPOSITION_ORIGINAL" :value="scope.row.status" />
</template>
</el-table-column>
<el-table-column label="单价" align="center" prop="price" />
<el-table-column label="密度" align="center" prop="density" />
<el-table-column label="密度单位" align="center" prop="density" >
<template #default>

View File

@ -124,9 +124,17 @@
<el-table-column label="物料需求单号" align="center" prop="projectMaterialPlanNo" min-width="180" />
<el-table-column label="操作" align="center" fixed="right" min-width="120">
<template #default="scope">
<el-button link type="primary" @click="singleSubmission(scope.row)">
<el-button link type="primary" @click="singleSubmission(scope.row)" v-if="scope.row.planStatus==0">
提交
</el-button>
<el-button
link
type="danger"
@click="handleDelete(scope.row.id,scope.row.projectMaterialPlanNo)"
v-if="scope.row.planStatus==1"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
@ -144,7 +152,6 @@
import { getIntDictOptions, DICT_TYPE } from '@/utils/dict'
import download from '@/utils/download'
import { useCommonStateWithOut } from '@/store/modules/common'
import UserSelect from "@/views/heli/materialplan/userSelectNew.vue";
import {inject, ref} from "vue";
import * as MaterialPlanApi from "@/api/heli/materialplan";
import {ElTable} from "element-plus";
@ -270,6 +277,18 @@ const handleSelectionChange = (val) => {
}
}
}
/** 删除按钮操作 */
const handleDelete = async (id: number,projectMaterialPlanNo:string) => {
try {
//
await message.delConfirm()
//
await MaterialPlanApi.delMaterialPlanBoom(id,projectMaterialPlanNo)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1

View File

@ -20,6 +20,9 @@
<el-form-item label="零件名称" prop="materialName">
<el-input v-model="queryParams.materialName" placeholder="请输入零件名称" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item label="件号" prop="blueprintNo">
<el-input v-model="queryParams.blueprintNo" placeholder="请输入件号" clearable @keyup.enter="handleQuery" class="!w-240px" />
</el-form-item>
<el-form-item style="margin-left:15px">
<el-button @click="handleQuery" type="primary">
<Icon icon="ep:search" class="mr-5px" /> 搜索
@ -109,6 +112,7 @@ const queryParams = reactive({
description: undefined,
createTime: [],
matType:1,
blueprintNo:undefined,
})
const queryFormRef = ref() //
const exportLoading = ref(false) //

View File

@ -48,6 +48,7 @@
<el-card class="hl-incard">
<el-table :data="formData.matBoomDOList" class="hl-table" v-loading="loading">
<el-table-column type="index" label="序号" fixed align="center" min-width="60" />
<el-table-column prop="blueprintNo" min-width="100" label="件号" align="center"/>
<el-table-column prop="matName" min-width="200" label="物料名称" align="center"/>
<el-table-column label="工序" align="center" prop="procedureName" min-width="100" >
<template #default="scope">

View File

@ -118,6 +118,19 @@
</template>
</el-table-column>
<el-table-column label="物料需求单号" align="center" prop="projectMaterialPlanNo" min-width="180" fixed="right"/>
<el-table-column label="操作" align="center" fixed="right" min-width="180">
<template #default="scope">
<el-button
link
type="danger"
@click="handleDelete(scope.row.id,scope.row.projectMaterialPlanNo)"
v-if="scope.row.mplanStatus==1"
>
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!-- 分页 -->
<Pagination :total="total" v-model:page="queryParams.pageNo" v-model:limit="queryParams.pageSize" @pagination="getList" />
@ -320,7 +333,18 @@ const resetQuery = () => {
handleQuery()
}
/** 删除按钮操作 */
const handleDelete = async (id: number,projectMaterialPlanNo:string) => {
try {
//
await message.delConfirm()
//
await ProcessBomApi.delMaterialPlan(id,projectMaterialPlanNo)
message.success(t('common.delSuccess'))
//
await getList()
} catch { }
}
/** 导出按钮操作 */
const handleExport = async () => {

View File

@ -262,13 +262,8 @@ const rowClick = async (row) => {
// OrderYsDetailLiat.value.map(item=>{item.cgTypee=Number(item.cgTypee)})
}
const getDictLabel = (dictType, value) => {
console.log(dictType)
console.log(value)
var intDictOptions = getIntDictOptions(dictType);
console.log(intDictOptions)
const dict = intDictOptions.find(item => item.value == value)
console.log(value)
console.log(dict)
return dict?.label || value //
}
const tableRowClassName = ({ row }) => {

View File

@ -0,0 +1,228 @@
<template>
<div class="modal-overlay" v-if="showModal" @click.self="closeModal">
<div class="modal-content">
<div class="modal-body">
<div class="modal-header">
<h3></h3>
<button @click="closeModal" class="close-btn"> <svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M15 5L5 15M5 5L15 15" stroke="currentColor" stroke-width="2"/>
</svg></button>
</div>
<div class="content-wrapper">
<h4 class="section-title">描述说明</h4>
<div class="info-grid">
<div class="info-item">
<span class="label">数字-1</span>
<span>
<img
src="/src/assets/imgs/checkstatusss.png"
class="status-icon"
/>
<!-- isOutsourcing 图片 -->
<img
src="/src/assets/imgs/out.png"
class="status-icon"
/>
<!-- checkYn 图片 -->
</span> </div>
<div class="info-item">
<span class="label">数字</span>
<span class="value">代表该工序派工顺序如果已报工替换数字显示报工时间25-08-07</span>
</div>
<div class="info-item">
<span class="label"></span>
<span class="value">表示零件该工序需要过程检验</span>
</div>
<div class="info-item">
<span class="label"></span>
<span class="value">表示该零件工序需要外协</span>
</div>
</div>
<div class="color-section">
<h4 class="section-title">单元格底色说明</h4>
<div class="color-container">
<div class="color-box green-box">
<div class="color-block">检验合格 + 生产报工日期未延期</div>
</div>
<div class="color-box yellow-box">
<div class="color-block">检验合格 + 生产报工日期延期</div>
</div>
<div class="color-box red-box">
<div class="color-block">检验不合格报废或返修</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<script setup>
import { ref } from 'vue';
const showModal = ref(false);
const openModal = () => {
showModal.value = true;
};
const closeModal = () => {
showModal.value = false;
};
defineExpose({
openModal,
closeModal
});
</script>
<style scoped>
.modal-overlay {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
display: flex;
justify-content: center;
align-items: center;
z-index: 1000;
}
.modal-content {
background-color: white;
border-radius: 8px;
width: 1000px;
max-width: 90%;
max-height: 90vh;
overflow-y: auto;
box-shadow: 0 2px 10px rgba(0, 0, 0, 0.1);
}
.close-btn {
background: none;
border: none;
font-size: 20px;
cursor: pointer;
color: #000000;
}
.modal-header {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px;
border-bottom: 1px solid #eee;
}
.modal-header h3 {
font-size: 18px;
margin: 0;
font-weight: 600;
}
.modal-body {
padding: 20px;
}
.content-wrapper {
display: flex;
flex-direction: column;
gap: 20px;
}
.section-title {
font-size: 15px;
color: #333;
margin: 0 0 12px 0;
font-weight: 600;
}
.info-grid {
display: flex;
flex-direction: column;
gap: 12px;
margin-bottom: 8px;
}
.info-item {
display: flex;
gap: 10px;
}
.label {
font-weight: bold;
min-width: 40px;
color: #333;
}
.value {
color: #666;
line-height: 1.5;
}
.color-block {
width: 20px;
height: 20px;
border-radius: 4px;
flex-shrink: 0;
}
.status-icon {
width: 35px; /* 增大图片宽度 */
height: 35px; /* 增大图片高度 */
margin-left: 8px;
vertical-align: middle;
object-fit: contain; /* 确保图片比例不变形 */
}
.color-section {
margin-top: 20px;
}
.color-container {
display: flex;
gap: 15px;
border: 1px solid #ddd;
border-radius: 6px;
padding: 15px;
background-color: #f9f9f9;
width: 100%;
}
.color-box {
flex: 1; /* 各占三分之一 */
min-width: 0; /* 防止内容溢出 */
}
.color-block {
width: 100%;
height: 60px; /* 方块高度 */
display: flex;
align-items: center;
justify-content: center;
text-align: center;
padding: 5px;
border-radius: 4px;
color: #333;
font-size: 14px;
line-height: 1.4;
word-break: break-word; /* 长文本自动换行 */
}
.green-box .color-block {
background-color: #e0ffe0;
}
.yellow-box .color-block {
background-color: #ffffe0;
}
.red-box .color-block {
background-color: #ffded6;
}
</style>

View File

@ -38,6 +38,19 @@ v-for="dict in userInit" :key="dict.id"
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="是否要铸件图" prop="hasCast">
<el-radio-group v-model="formData.hasCast">
<el-radio
disabled v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.value"
:label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="是否要工艺" prop="hasCraft">
@ -108,6 +121,17 @@ disabled v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)" :key="d
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="铸件图负责人" prop="castOwner">
<el-select class="!w-265px" v-model="formData.castOwner" 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>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="工艺负责人" prop="craftOwner">
@ -173,6 +197,15 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)" :key="dict.va
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="铸件图开始日期" prop="castStartDate">
<el-date-picker
disabled class="!w-265px" v-model="formData.castStartDate" type="date" value-format="x"
placeholder="工艺开始日期" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="工艺开始日期" prop="craftStartTime">
@ -185,7 +218,7 @@ disabled class="!w-265px" v-model="formData.craftStartDate" type="date" value-fo
<el-row>
<el-col :span="24">
<el-form-item label="计划批准人" prop="approver">
<el-select class="!w-265px" v-model="formData.approver" filterable >
<el-select class="!w-265px" v-model="formData.approver" filterable disabled>
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username + ' '+ dict.nickname" :value="dict.id" />
@ -251,6 +284,15 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.va
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="铸件图结束日期" prop="castEndDate">
<el-date-picker
disabled class="!w-265px" v-model="formData.castEndDate" type="date" value-format="x"
placeholder="铸件图结束日期" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="工艺结束日期" prop="craftEndTime">
@ -548,7 +590,11 @@ const formData = ref({
projectOrderSubs: [],
projectPlanSubs: [],
craftInfos: [],
craftContent:undefined
craftContent:undefined,
castOwner:undefined,
hasCast:undefined,
castStartDate:undefined,
castEndDate:undefined,
})
const formRules = reactive({
projectCode: [{ required: true, message: '项目编号不能为空', trigger: 'blur' }],

View File

@ -44,6 +44,19 @@ v-for="dict in userInit" :key="dict.id"
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="是否要铸件图" prop="hasCast">
<el-radio-group v-model="formData.hasCast" @change="handleCastInfo">
<el-radio
v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.value"
:label="dict.value">
{{ dict.label }}
</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="是否要工艺" prop="hasCraft">
@ -114,6 +127,22 @@ v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)" :key="dict.value
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="铸件图负责人" prop="castOwner">
<!-- <el-select class="!w-265px" v-model="formData.craftOwner" filterable :disabled="!formData.hasCraft " >
<el-option v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select> -->
<!-- <UserSelect v-model="formData.craftOwner" @update:new-value="handleSelectedUser2" class="!w-265px"/>-->
<el-select class="!w-265px" v-model="formData.castOwner" clearable :disabled="formData.hasCast==0" filterable>
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="工艺负责人" prop="craftOwner">
@ -122,7 +151,7 @@ v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)" :key="dict.value
:label="dict.username+' '+dict.nickname" :value="dict.id" />
</el-select> -->
<!-- <UserSelect v-model="formData.craftOwner" @update:new-value="handleSelectedUser2" class="!w-265px"/>-->
<el-select class="!w-265px" v-model="formData.craftOwner" clearable filterable>
<el-select class="!w-265px" v-model="formData.craftOwner" clearable :disabled="formData.hasCraft==0" filterable>
<el-option
v-for="dict in userInit" :key="dict.id"
:label="dict.username+' '+dict.nickname" :value="dict.id" />
@ -184,6 +213,15 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)" :key="dict.va
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="铸件图开始日期" prop="castStartDate">
<el-date-picker
class="!w-265px" v-model="formData.castStartDate" type="date" value-format="x"
placeholder="铸件图开始日期" :disabled="!formData.hasCast "/>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="工艺开始日期" prop="craftStartTime">
@ -262,6 +300,15 @@ v-for="dict in getIntDictOptions(DICT_TYPE.HELI_COMMON_IS_OR_NOT)" :key="dict.va
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="铸件图结束日期" prop="castEndDate">
<el-date-picker
class="!w-265px" v-model="formData.castEndDate" type="date" value-format="x"
placeholder="铸件图结束日期" :disabled="!formData.hasCast " />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="工艺结束日期" prop="craftEndTime">
@ -645,6 +692,7 @@ import UserSelect from '@/views/heli/hlvuestyle/userSelect.vue'
import EquipSelect from '@/views/heli/hlvuestyle/equipSelect.vue'
import * as ProjectLeaderApi from "@/api/heli/projectleader";
import * as TaskDispatchApi from "@/api/heli/taskdispatch";
import {verification} from "@/api/heli/plan";
const printref = ref()
const { t } = useI18n() //
const message = useMessage() //
@ -693,7 +741,11 @@ const formData = ref({
projectPlanSubs: [],
craftInfos: [],
craftContent: undefined,
changeEndTime: undefined
changeEndTime: undefined,
castOwner:undefined,
hasCast:1,
castStartDate:undefined,
castEndDate:undefined,
})
const ownerId = ref('');
const dateOne = ref('');
@ -932,16 +984,14 @@ const getSearchRlTs = async(startDateTime:string,endDateTime:string,index:number
if(num === "1"){
//
formData.value.projectPlanSubs[index].blankNum = data;
// formatDate(startBlankDate,'YYYY-MM-DD')
if(ownder){
prod.value.projectPlanSubs = JSON.parse(JSON.stringify(formData.value.projectPlanSubs));
startTimeOne.value = formatDate(startDateTime,'YYYY-MM-DD');
endTimeTwo.value = formatDate(endDateTime,'YYYY-MM-DD');
fuzerenId.value = ownder;
getOwnderList(index)
}
// if(ownder){
// prod.value.projectPlanSubs = JSON.parse(JSON.stringify(formData.value.projectPlanSubs));
// startTimeOne.value = formatDate(startDateTime,'YYYY-MM-DD');
// endTimeTwo.value = formatDate(endDateTime,'YYYY-MM-DD');
// fuzerenId.value = ownder;
// getOwnderList(index)
// }
/* getOwnderList(index,ownder,startBlankDate,blankDate,id) */
@ -950,23 +1000,23 @@ const getSearchRlTs = async(startDateTime:string,endDateTime:string,index:number
//
formData.value.projectPlanSubs[index].twoDimNum = data;
if(ownder){
prod.value.projectPlanSubs = JSON.parse(JSON.stringify(formData.value.projectPlanSubs));
startTimeOne.value = formatDate(startDateTime,'YYYY-MM-DD');
endTimeTwo.value = formatDate(endDateTime,'YYYY-MM-DD');
fuzerenId.value = ownder;
getOwnderLists(index)
}
// if(ownder){
// prod.value.projectPlanSubs = JSON.parse(JSON.stringify(formData.value.projectPlanSubs));
// startTimeOne.value = formatDate(startDateTime,'YYYY-MM-DD');
// endTimeTwo.value = formatDate(endDateTime,'YYYY-MM-DD');
// fuzerenId.value = ownder;
// getOwnderLists(index)
// }
}else{
formData.value.projectPlanSubs[index].threeDimNum = data;
if(ownder){
prod.value.projectPlanSubs = JSON.parse(JSON.stringify(formData.value.projectPlanSubs));
startTimeOne.value = formatDate(startDateTime,'YYYY-MM-DD');
endTimeTwo.value = formatDate(endDateTime,'YYYY-MM-DD');
fuzerenId.value = ownder;
getOwnderListss(index)
}
// if(ownder){
// prod.value.projectPlanSubs = JSON.parse(JSON.stringify(formData.value.projectPlanSubs));
// startTimeOne.value = formatDate(startDateTime,'YYYY-MM-DD');
// endTimeTwo.value = formatDate(endDateTime,'YYYY-MM-DD');
// fuzerenId.value = ownder;
// getOwnderListss(index)
// }
}
@ -1531,11 +1581,40 @@ const handleUpdate = () => {
console.log("子组件已更新");
};
const handleCraftInfo = (val) =>{
const handleCraftInfo = async (val) =>{
if(val == 0){
const a = await PlanApi.verification(query.id,"BLUEPRINT_FOUNDRY_TECHNOLOGY")
if (a){
formData.value.craftOwner = undefined
formData.value.craftStartDate = undefined
formData.value.craftEndDate = undefined
}else {
message.error("铸造工艺进度上报有报工数据,不允许修改为否")
formData.value.hasCraft=1
}
}else {
const data = await PlanApi.getPlan(query.id)
formData.value.craftOwner = data.craftOwner
formData.value.craftStartDate = data.craftStartDate
formData.value.craftEndDate = data.craftEndDate
}
}
const handleCastInfo = async (val) =>{
if(val == 0){
const a = await PlanApi.verification(query.id,"CASTING_DRAWING")
if (a){
formData.value.castOwner = undefined
formData.value.castStartDate = undefined
formData.value.castEndDate = undefined
}else {
message.error("铸件图设计进度上报有报工数据 不允许修改为否")
formData.value.hasCast=1
}
}else{
const data = await PlanApi.getPlan(query.id)
formData.value.castOwner = data.castOwner
formData.value.castStartDate = data.castStartDate
formData.value.castEndDate = data.castEndDate
}
}
const handleSubCode = (row, name) => {
@ -1705,8 +1784,14 @@ onMounted(async () => {
formData.value = await PlanApi.getPlan(query.id)
userInit1.value = await TaskDispatchApi.getOwnerUserList(0,1);
// ownerList.value = await getOwnerListThis();
if (formData.value.hasCraft==null){
formData.value.hasCraft = 1
}
if ( formData.value.hasCast ==null
){
formData.value.hasCast = 1
}
const data = await ProjectLeaderApi.getProjectLeaderType(4)
const data1 = await ProjectLeaderApi.getProjectLeaderType(5)
const data2 = await ProjectLeaderApi.getProjectLeaderType(6)
@ -1951,6 +2036,9 @@ const handleSelectedUser1 = (newValue: any) => {
const handleSelectedUser2 = (newValue: any) => {
formData.value.craftOwner = newValue?.id
}
const handleSelectedUser10 = (newValue: any) => {
formData.value.castOwner = newValue?.id
}
//
const handleSelectedUser3 = (newValue: any) => {
formData.value.editor = newValue?.id

View File

@ -17,10 +17,10 @@
class="!w-240px"
/>
</el-form-item>
<el-form-item label="项目名称" prop="projectName">
<el-form-item label="项目简码" prop="projectName">
<el-input
v-model="queryParams.projectName"
placeholder="请输入项目名称"
placeholder="请输入项目简码"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
@ -78,6 +78,7 @@
<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 @click="openModal">显示说明</el-button>
<!-- <el-button-->
<!-- type="success"-->
@ -92,6 +93,25 @@
</el-form>
</ContentWrap>
<!-- <ContentWrap>-->
<!-- <div class="color-legend">-->
<!-- <div class="color-item">-->
<!-- <div class="color-block green-cell"></div>-->
<!-- <span>报工日期未延期同时检验合格</span>-->
<!-- </div>-->
<!-- <div class="color-item">-->
<!-- <div class="color-block yellow-cell"></div>-->
<!-- <span>报工日期延期同时检验合格</span>-->
<!-- </div>-->
<!-- <div class="color-item">-->
<!-- <div class="color-block red-cell"></div>-->
<!-- <span>检验不合格(报废或返修)</span>-->
<!-- </div>-->
<!-- </div>-->
<!-- </ContentWrap>-->
<!-- 列表 -->
<ContentWrap>
<el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick">
@ -652,6 +672,7 @@
@pagination="getList"
/>
</ContentWrap>
<ProcessStatusModal ref="modal" />
<!-- 表单弹窗添加/修改 -->
@ -659,18 +680,15 @@
<script setup lang="ts">
import download from '@/utils/download'
import * as PlanSchedule from '@/api/heli/planSchedule'
import * as processbomApi from '@/api/heli/processbom'
import { getIntDictOptions, getStrDictOptions, DICT_TYPE, getDictLabel } from '@/utils/dict'
import UserSelect from '@/views/heli/hlvuestyle/userSelect.vue'
import * as UserApi from '@/api/system/user'
import type { TabsPaneContext } from 'element-plus'
import { get } from 'sortablejs'
import ProcessStatusModal from './ProcessStatusModal.vue';
defineOptions({ name: 'Shenhe' })
const userList = ref<UserApi.UserVO[]>([]) //
const message = useMessage() //
const { t } = useI18n() //
const modal = ref();
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
@ -698,7 +716,9 @@ const formatDateT = (timestamp) => {
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`; // YYYY-MM-DD
}
const openModal = () => {
modal.value.openModal();
};
const activeName = ref('first')
const activeIndex = ref('first')
/**切换tab */
@ -834,4 +854,19 @@ justify-content: flex-start;
vertical-align: middle;
object-fit: contain; /* 确保图片比例不变形 */
}
.color-legend {
display: flex; /* 横向排列 */
gap: 20px; /* 项间距 */
align-items: center; /* 垂直居中 */
}
.color-item {
display: flex;
align-items: center;
gap: 8px; /* 方块和文字的间距 */
}
.color-block {
width: 20px;
height: 20px;
border-radius: 4px;
}
</style>

View File

@ -24,6 +24,7 @@
<script setup lang="ts">
import QRCode from 'qrcode'
import printFinalDialog from './printFinalDialog.vue';
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
const dialogVisible = ref(false)
let clauseId = null;
const startPageNum = ref(0);
@ -47,7 +48,11 @@ const datavals = ref([])
const specarr = ref([])
const cnenList = ref([])
const bomCodes = ref('')
const getDictLabel = (dictType, value) => {
var intDictOptions = getIntDictOptions(dictType);
const dict = intDictOptions.find(item => item.value == value)
return dict?.label || value //
}
const open = async ( vals) => {
@ -66,14 +71,16 @@ const open = async ( vals) => {
const row1 = {
code: item.projectSubCode,
name: item.name == null ? '' : item.name,
amount: item.amount == null ? '' : item.amount
amount: item.amount == null ? '' : item.amount,
unit:getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT,item.unit)
}
printCodeName.value.push(row1)
})
dialogVisible.value = true
const currentDate = new Date()
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
// const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}`
var i = 0;
await Promise.all(
@ -89,16 +96,16 @@ const open = async ( vals) => {
<span style="display: inline-block; width: 100%;font-weight: 700; border-bottom: 1px solid black; padding-bottom: 0.2mm;">${item.code}</span>
</div>
<div style="display: flex; align-items: center;">
<span style="white-space: nowrap; "> </span>
<span style="white-space: nowrap; ">&thinsp;</span>
<span style="flex-grow: 1; border-bottom: 1px solid black; margin-left: -1.2mm; padding-bottom: 0.2mm;">${item.name}</span>
</div>
<div style="display: flex; position: absolute; bottom: 2mm; left: 0.1mm; right: 2mm; height: 34mm;">
<div style="display: flex; flex-direction: column; justify-content: center; align-items: flex-start; width: 13mm; margin-right: 1mm;">
<div style="display: flex; align-items: center;">
<span style="white-space: nowrap; margin-right: 1mm;"> </span>
<span style="font-size: 11px; margin-bottom: 0.5mm;white-space: nowrap;margin-left: -2.3mm;">${item.amount}</span>
<span style="white-space: nowrap; margin-right: 1mm;">&thinsp;</span>
<span style="font-size: 11px; margin-bottom: 0.5mm;white-space: nowrap;margin-left: -2.3mm;">${item.amount}&thinsp;${item.unit}</span>
</div>
<span style="font-size: 5px; line-height: 1; margin-top: auto; white-space: nowrap;">${formattedDate}</span>
<span style="font-size: 11px; line-height: 1; margin-top: auto; white-space: nowrap;">${formattedDate}</span>
</div>
<div style="width: 34mm; height: 34mm; margin-left: auto; display: flex; align-items: flex-end; justify-content: flex-end;">
<img style="width: 100%; height: 100%;" src="${qrCodeData}" alt="QR Code">

View File

@ -22,6 +22,7 @@
<script setup lang="ts">
import QRCode from 'qrcode'
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
const dialogVisible = ref(false)
let clauseId = null;
@ -98,7 +99,7 @@ const onPrint = () => {
flex-grow: 1;
border-bottom: 1px solid black;
height: 1em;
margin-left: -1mm;
margin-left: -1.2mm;
}
.bottom-section {
display: flex;
@ -135,7 +136,7 @@ const onPrint = () => {
white-space: nowrap;
}
.timestamp {
font-size: 12px;
font-size: 14px;
line-height: 1;
margin-left: 0.5mm;
margin-top: auto;
@ -165,7 +166,11 @@ function beforeDialogClose(doClose: (shouldClose: boolean) => void): void {
const outopen = () => {
dialogVisible.value = false
}
const getDictLabel = (dictType, value) => {
var intDictOptions = getIntDictOptions(dictType);
const dict = intDictOptions.find(item => item.value == value)
return dict?.label || value //
}
const printCodeName = ref([])
const datavals = ref([])
const specarr = ref([])
@ -182,14 +187,16 @@ const open = async ( vals) => {
const row1 = {
code: item.projectSubCode,
name: item.name == null ? '' : item.name,
amount: item.amount == null ? '' : item.amount
amount: item.amount == null ? '' : item.amount,
unit:getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT,item.unit)
}
printCodeName.value.push(row1)
})
dialogVisible.value = true
const currentDate = new Date()
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
// const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}`
await Promise.all(
printCodeName.value.map(async (item) => {
@ -204,12 +211,12 @@ const open = async ( vals) => {
<span>${item.code}</span>
</div>
<div class="name-line">
<span class="name-label"> </span>
<span class="name-label">&thinsp;:&thinsp;</span>
<span class="name-underline">${item.name}</span>
</div>
<div class="bottom-section">
<div class="quantity-container">
<span class="quantity"> ${item.amount}</span>
<span class="quantity">&thinsp;:&thinsp;${item.amount}&thinsp;${item.unit}</span>
<span class="timestamp">${formattedDate}</span>
</div>
<div class="qr-container">

View File

@ -80,31 +80,31 @@
</el-row>
</el-col>
<el-col :span="6">
<el-col :span="7">
<el-row>
<el-col :span="24">
<el-form-item label="项目编号" prop="projectCode">
<el-input class="!w-265px" placeholder="项目编号" v-model="formData.projectCode" disabled />
<el-input class="!w-350px" placeholder="项目编号" v-model="formData.projectCode" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="子项目名称" prop="projectSubName">
<el-input class="!w-265px" placeholder="子项目名称" v-model="formData.projectSubName" disabled />
<el-input class="!w-350px" placeholder="子项目名称" v-model="formData.projectSubName" disabled />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="创建时间" prop="createTime">
<el-date-picker class="!w-265px" v-model="formData.createTime" type="date" value-format="x" placeholder="创建时间" disabled />
<el-date-picker class="!w-350px" v-model="formData.createTime" type="date" value-format="x" placeholder="创建时间" disabled />
</el-form-item>
</el-col>
</el-row>
</el-col>
<el-col :span="6">
<el-col :span="5">
<el-row>
<el-col :span="24">
<el-form-item label="客户名称" prop="customerName">

View File

@ -49,42 +49,42 @@
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" type="index" width="60" align="center" />
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="150" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template>
</el-table-column>
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="240" />
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="150" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="250" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="280" />
<el-table-column label="性质" align="center" prop="property" min-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="planCode" min-width="180">
<el-table-column label="计划单号" align="center" prop="planCode" min-width="120">
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="200" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template>
</el-table-column>
<el-table-column fixed="right" label="2D负责人" align="center" prop="twoDimOwnerName" width="120" />
<el-table-column fixed="right" label="2D截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" min-width="140" />
<el-table-column fixed="right" label="2D截止日期" align="center" prop="twoDimDate" :formatter="dateFormatter2" min-width="120" />
<el-table-column fixed="right" label="完成情况" align="center" prop="progress" min-width="120">
<template #default="scope">
{{getDetailMsg(scope.row)}}
</template>
</el-table-column>
<el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120">
<el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="100">
<template #default="scope">
{{scope.row.isOverProcess == 1 ? '已完成':'实施中'}}
</template>
@ -217,7 +217,7 @@ const getDetailMsg = (row) =>{
}
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {

View File

@ -87,35 +87,35 @@
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" type="index" width="60" align="center" />
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="150" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template>
</el-table-column>
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="240" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="150" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="250" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="280" />
<el-table-column label="性质" align="center" prop="property" min-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="planCode" min-width="180" >
<el-table-column label="计划单号" align="center" prop="planCode" min-width="120" >
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="200" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template>
</el-table-column>
<el-table-column fixed="right" label="3D负责人" align="center" prop="threeDimOwnerName" min-width="120"/>
<el-table-column fixed="right" label="3D截止日期" align="center" prop="threeDimDate" :formatter="dateFormatter2" min-width="140"/>
<el-table-column fixed="right" label="3D截止日期" align="center" prop="threeDimDate" :formatter="dateFormatter2" min-width="120"/>
<el-table-column fixed="right" label="完成情况" align="center" prop="progress" min-width="120">
<template #default="scope">
{{getDetailMsg(scope.row)}}
@ -266,7 +266,7 @@ const getDetailMsg = (row) =>{
}
}
/** 删除按钮操作 */

View File

@ -651,9 +651,12 @@ const queryData = async (id?: number) => {
try {
formData.value = await ProcessBomApi.getProcessBom(id)
if(formData.value.property == 1){
formData.value.propertyMsg = '新作';
}else if(formData.value.property == 2){
formData.value.propertyMsg = '维修';
}else{
formData.value.propertyMsg = '新制';
}else if(formData.value.property == 3){
formData.value.propertyMsg = '拉回修';
}
formData.value.processBomDetails = await ProcessBomApi.getProcessBomDetailListByBomId(id)
//isSelectedtrue

View File

@ -0,0 +1,297 @@
<template>
<el-card class="hl-card">
<template #header>
<span>铸造工艺进度上报</span>
</template>
<ContentWrap class="borderxx">
<!-- 搜索工作栏 -->
<el-form
class="-mb-15px"
:model="queryParams"
ref="queryFormRef"
:inline="true"
label-width="120px"
>
<el-form-item label="计划单号" prop="planCode">
<el-input
v-model="queryParams.planCode"
placeholder="请输入计划单号"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="项目编号" prop="projectCode">
<el-input
v-model="queryParams.projectCode"
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="projectName">
<el-input
v-model="queryParams.projectName"
placeholder="请输入项目名称"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item label="所属业务线" prop="businessLine">
<el-select clearable class="!w-240px" v-model="queryParams.businessLine" placeholder="下拉选择">
<el-option v-for="dict in getStrDictOptions(DICT_TYPE.HELI_BUSINESS_LINE)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="性质" prop="property">
<el-select clearable class="!w-240px" v-model="queryParams.property" placeholder="下拉选择">
<el-option v-for="dict in getIntDictOptions(DICT_TYPE.HELI_PROJECT_PROPERTY)" :key="dict.value" :label="dict.label" :value="dict.value" />
</el-select>
</el-form-item>
<el-form-item label="铸件图负责人" prop="castOwnerName">
<el-input
v-model="queryParams.castOwnerName"
placeholder="请输入铸件图负责人"
clearable
@keyup.enter="handleQuery"
class="!w-240px"
/>
</el-form-item>
<el-form-item style="margin-left:20px">
<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-form-item>
</el-form>
</ContentWrap>
<!-- 列表 -->
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" align="center" type="index" width="60" />
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="150" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template>
</el-table-column>
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="150" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="=250" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="120">
<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="property" min-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="planCode" min-width="120" >
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column fixed="right" label="项目负责人" align="center" prop="projectOwnerName" min-width="120" />
<el-table-column fixed="right" label="铸件图负责人" align="center" prop="castOwnerName" min-width="150" />
<el-table-column fixed="right" label="铸件图起止日期" align="center" prop="craftDate" min-width="240" >
<template #default="scope">
{{formatDate(scope.row.castStartDate, 'YYYY-MM-DD') + '~' + formatDate(scope.row.castEndDate, 'YYYY-MM-DD')}}
</template>
</el-table-column>
<el-table-column fixed="right" label="完成情况" align="center" prop="progress" min-width="120">
<template #default="scope">
{{getDetailMsg(scope.row)}}
</template>
</el-table-column>
<el-table-column fixed="right" label="最新进度" align="center" prop="progress" min-width="120">
<template #default="scope">
{{scope.row.isOverProcess == 1 ? '已完成':'实施中'}}
</template>
</el-table-column>
<el-table-column fixed="right" label="操作" align="center" min-width="160">
<template #default="scope">
<el-button
link
type="primary"
@click="openDetail('update', scope.row.id)"
>
编辑
</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>
</el-card>
</template>
<script setup lang="ts">
import {getStrDictOptions, DICT_TYPE, getDictLabel, getIntDictOptions} from '@/utils/dict'
import {dateFormatter, formatDate} from '@/utils/formatTime'
import download from '@/utils/download'
import * as ProcessDesignApi from '@/api/heli/processdesign'
import {useCommonStore} from "@/store/modules/common";
import {useUserStore} from "@/store/modules/user";
defineOptions({ name: 'ProcessDesign' })
const message = useMessage() //
const { t } = useI18n() //
const router = useRouter()
const commonStore = useCommonStore()
const userStore = useUserStore()
const username = userStore.getUser.nickname
const loading = ref(true) //
const list = ref([]) //
const total = ref(0) //
const queryParams = reactive({
pageNo: 1,
pageSize: 10,
planCode: undefined,
projectCode: undefined,
processDesignType: 'CASTING_DRAWING',
customerName: undefined,
projectName: undefined,
businessLine: undefined,
property: undefined,
castOwnerName: username
})
const queryFormRef = ref() //
const exportLoading = ref(false) //
/** 查询列表 */
const getList = async () => {
loading.value = true
try {
const data = await ProcessDesignApi.getProcessDesignPage(queryParams)
list.value = data.list
total.value = data.total
} finally {
loading.value = false
}
}
/** 搜索按钮操作 */
const handleQuery = () => {
queryParams.pageNo = 1
getList()
}
const getDetailMsg = (row) =>{
if(row.isOverProcess){
//
if(row.castEndDate != null && row.lastDate != null ){
const starttemp = new Date(row.castEndDate);
starttemp.setHours(23,59,59,999);
const endtemp = new Date(row.lastDate);
endtemp.setHours(23,59,59,999);
const start =starttemp.getTime()
const end = endtemp.getTime();
const diffTime = end - start
var day = Math.floor(diffTime / (1000 * 60 * 60 * 24));
if(day == 0){
if(row.isDelay == 1 && row.lastDate > starttemp){
return '延后' + (day+1) +'天';
}
return '按时完成'
}else{
if(row.lastDate > starttemp){
return '延后' + day +'天';
}else if (row.lastDate < starttemp){
return '提前' + day +'天';
}else{
return '按时完成'
}
}
}else{
// return '';
}
}
}
/** 重置按钮操作 */
const resetQuery = () => {
queryFormRef.value.resetFields()
handleQuery()
}
/** 添加/修改操作 */
const formRef = ref()
const openForm = (type: string, id?: number) => {
formRef.value.open(type, id)
}
/** 添加/修改操作 */
const openDetail = (type: string, id?: number) => {
commonStore.setStore("active", type);
commonStore.setStore("id", id);
commonStore.setStore("processDesignType", 'CASTING_DRAWING');
router.push({
name: 'ProcessDesignDetail',
query: {
operateId: Math.random()
}
})
}
/** 删除按钮操作 */
const handleDelete = async (id: number) => {
try {
//
await message.delConfirm()
//
await ProcessDesignApi.deleteProcessDesign(id)
message.success(t('common.delSuccess'))
//
await getList()
} catch {}
}
/** 导出按钮操作 */
const handleExport = async () => {
try {
//
await message.exportConfirm()
//
exportLoading.value = true
const data = await ProcessDesignApi.exportProcessDesign(queryParams)
download.excel(data, '工艺设计.xls')
} catch {
} finally {
exportLoading.value = false
}
}
/** 初始化 **/
onMounted(() => {
getList()
})
</script>

View File

@ -3,7 +3,7 @@
<template #header>
<span><span v-html="dialogTitle"></span></span>
</template>
<el-form ref="formRef" label-width="120px" :model="formData" v-loading="formLoading">
<el-form ref="formRef" label-width="140px" :model="formData" v-loading="formLoading">
<!-- 基础信息 横向布局 -->
<el-card class="hl-card-info">
<template #header>
@ -96,6 +96,35 @@
</el-form-item>
</el-col>
</el-row>
<el-row v-if="processDesignType == 'CASTING_DRAWING'">
<el-col :span="6">
<el-form-item label="是否要铸件图" prop="hasCast">
<!-- {{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, formData.hasCraft) }} -->
<el-select class="!w-260px" :disabled="true" v-model="formData.hasCast" placeholder="请选择是否要铸件图">
<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-col>
<el-col :span="6">
<el-form-item label="铸件图负责人" prop="castOwnerName">
<!-- {{formData.craftOwnerName}} -->
<el-input class="!w-260px" v-model="formData.castOwnerName" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="铸件图开始日期" prop="castStartDate">
<!-- {{formatDate(formData.craftStartDate, 'YYYY-MM-DD')}} -->
<el-date-picker class="!w-260px" v-model="formData.castStartDate" type="date" placeholder="请选择铸件图开始日期" :disabled="true" />
</el-form-item>
</el-col>
<el-col :span="6">
<el-form-item label="铸件图结束日期" prop="castEndDate">
<!-- {{formatDate(formData.craftEndDate, 'YYYY-MM-DD')}} -->
<el-date-picker class="!w-260px" v-model="formData.castEndDate" type="date" placeholder="请选择铸件图结束日期" :disabled="true" />
</el-form-item>
</el-col>
</el-row>
<el-row v-if="processDesignType == 'BLUEPRINT_3D'">
<el-col :span="6">
<el-form-item label="3D负责人" prop="threeDimOwnerName">
@ -527,7 +556,13 @@ const getWorkTime = (type) =>{
}
}
if(processDesignType.value == 'CASTING_DRAWING'){
if(formData.value.castStartDate != null && formData.value.castEndDate != null ){
beginTime = formData.value.castStartDate;
endTime = formData.value.castEndDate
}
}
if(beginTime != null && endTime != null){
const start = new Date(beginTime ).getTime();
@ -654,6 +689,20 @@ const openDelay = async() =>{
return
}
}
if(processDesignType.value == 'CASTING_DRAWING'){
if(formData.value.castEndDate != null ){
var dateT = new Date(formData.value.blankDate)
dateT.setHours(23,59,59,999)
if(dateT.getTime() > date.getTime()){
message.error("当前日期为正常生产周期,未达到延期条件,请确认!")
return
}
}else{
message.error("铸件图结束时间为空!请确认!")
return
}
}
await delaySubmit()
}
@ -913,7 +962,22 @@ const onAddItem = async() => {
// return
}
}
if(processDesignType.value == 'CASTING_DRAWING'){
console.log(formData.value.castEndDate)
if(formData.value.castEndDate != null ){
var date1 = new Date(formData.value.castEndDate);
date1.setHours(0,0,0,0)
if(date1.getTime()< date.getTime()){
if(formData.value.isDelay == null || formData.value.isDelay == 0){
message.error("当前任务已超期,请延期后重试!")
return
}
}
}else{
// message.error("!!")
// return
}
}
if (formData.value.processDesignProgressList != null && formData.value.processDesignProgressList.length>0){
for ( var i = 0 ; i < formData.value.processDesignProgressList.length ; i++){
@ -978,6 +1042,9 @@ onMounted(() => {
if(processDesignType.value == 'BLUEPRINT_FOUNDRY_TECHNOLOGY'){
overbuttonName.value='铸造项目完结'
}
if(processDesignType.value == 'CASTING_DRAWING'){
overbuttonName.value='铸件图项目完结'
}
})
</script>
<style scoped lang="less"></style>

View File

@ -78,14 +78,14 @@
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" align="center" type="index" width="60" />
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="150" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template>
</el-table-column>
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="240" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="150" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="250" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
@ -234,7 +234,7 @@ const getDetailMsg = (row) =>{
}
}
/** 重置按钮操作 */

View File

@ -24,6 +24,7 @@
<script setup lang="ts">
import QRCode from 'qrcode'
import printFinalDialog from './printFinalDialog.vue';
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
const dialogVisible = ref(false)
let clauseId = null;
const startPageNum = ref(0);
@ -48,6 +49,11 @@ const specarr = ref([])
const cnenList = ref([])
const bomCodes = ref('')
const getDictLabel = (dictType, value) => {
var intDictOptions = getIntDictOptions(dictType);
const dict = intDictOptions.find(item => item.value == value)
return dict?.label || value //
}
const open = async (bomCode, vals) => {
@ -88,7 +94,9 @@ const open = async (bomCode, vals) => {
const row1 = {
code: newName,
name: item.materialName == null ? '' : item.materialName,
amount: item.amount == null ? '' : item.amount
amount: item.amount == null ? '' : item.amount,
unit:getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT,item.unit)
}
printCodeName.value.push(row1)
datavals.value.push(row)
@ -96,7 +104,8 @@ const open = async (bomCode, vals) => {
dialogVisible.value = true
const currentDate = new Date()
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
// const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}`
var i = 0;
await Promise.all(
printCodeName.value.map(async (item) => {
@ -111,16 +120,16 @@ const open = async (bomCode, vals) => {
<span style="display: inline-block; width: 100%;font-weight: 700; border-bottom: 1px solid black; padding-bottom: 0.2mm;">${item.code}</span>
</div>
<div style="display: flex; align-items: center;">
<span style="white-space: nowrap; margin-right: 1mm;"> </span>
<span style="white-space: nowrap; margin-right: 1mm;">&thinsp;</span>
<span style="flex-grow: 1; border-bottom: 1px solid black; margin-left: -2.5mm;padding-bottom: 0.2mm;">${item.name}</span>
</div>
<div style="display: flex; position: absolute; bottom: 2mm; left: 0.1mm; right: 2mm; height: 34mm;">
<div style="display: flex; flex-direction: column; justify-content: center; align-items: flex-start; width: 13mm; margin-right: 1mm;">
<div style="display: flex; align-items: center;">
<span style="white-space: nowrap; margin-right: 1mm;"> </span>
<span style="font-size: 11px; margin-bottom: 0.5mm;white-space: nowrap;margin-left: -2.3mm;">${item.amount}</span>
<span style="white-space: nowrap; margin-right: 1mm;">&thinsp;</span>
<span style="font-size: 11px; margin-bottom: 0.5mm;white-space: nowrap;margin-left: -2.3mm;">${item.amount}&thinsp;${item.unit}</span>
</div>
<span style="font-size: 5px; line-height: 1; margin-top: auto; white-space: nowrap;">${formattedDate}</span>
<span style="font-size: 11px; line-height: 1; margin-top: auto; white-space: nowrap;">${formattedDate}</span>
</div>
<div style="width: 34mm; height: 34mm; margin-left: auto; display: flex; align-items: flex-end; justify-content: flex-end;">
<img style="width: 100%; height: 100%;" src="${qrCodeData}" alt="QR Code">

View File

@ -22,6 +22,7 @@
<script setup lang="ts">
import QRCode from 'qrcode'
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
const dialogVisible = ref(false)
let clauseId = null;
@ -130,7 +131,7 @@ const onPrint = () => {
white-space: nowrap;
}
.timestamp {
font-size: 12px;
font-size: 14px;
line-height: 1;
margin-left: 0.5mm;
margin-top: auto;
@ -152,6 +153,11 @@ const onPrint = () => {
dialogVisible.value = false;
}, 100);
};
const getDictLabel = (dictType, value) => {
var intDictOptions = getIntDictOptions(dictType);
const dict = intDictOptions.find(item => item.value == value)
return dict?.label || value //
}
function beforeDialogClose(doClose: (shouldClose: boolean) => void): void {
outopen()
@ -180,7 +186,8 @@ const open = async (bomCode, vals) => {
const row1 = {
code: newName,
name: item.materialName == null ? '' : item.materialName,
amount: item.amount == null ? '' : item.amount
amount: item.amount == null ? '' : item.amount,
unit:getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT,item.unit)
}
printCodeName.value.push(row1)
datavals.value.push(row)
@ -188,7 +195,8 @@ const open = async (bomCode, vals) => {
dialogVisible.value = true
const currentDate = new Date()
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
// const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}:${String(currentDate.getSeconds()).padStart(2, '0')}`
const formattedDate = `${currentDate.getFullYear()}-${String(currentDate.getMonth() + 1).padStart(2, '0')}-${String(currentDate.getDate()).padStart(2, '0')} ${String(currentDate.getHours()).padStart(2, '0')}:${String(currentDate.getMinutes()).padStart(2, '0')}`
await Promise.all(
printCodeName.value.map(async (item) => {
@ -203,12 +211,12 @@ const open = async (bomCode, vals) => {
<span >${item.code}</span>
</div>
<div class="name-line">
<span class="name-label"> </span>
<span class="name-label">&thinsp;:&thinsp;</span>
<span class="name-underline">${item.name}</span>
</div>
<div class="bottom-section">
<div class="quantity-container">
<span class="quantity"> ${item.amount}</span>
<span class="quantity">&thinsp;:&thinsp;${item.amount}&thinsp;${item.unit}</span>
<span class="timestamp">${formattedDate}</span>
</div>
<div class="qr-container">

View File

@ -49,35 +49,35 @@
<ContentWrap>
<el-table v-loading="loading" :data="list" :stripe="true" :show-overflow-tooltip="true" class="hl-table">
<el-table-column fixed label="序号" align="center" type="index" width="60" />
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="220" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="150">
<el-table-column fixed label="项目编号" align="center" prop="projectCode" min-width="150" />
<el-table-column fixed label="生产状态" align="center" prop="status" width="100">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_PROJECT_PLAN_STATUS" :value="scope.row.planStatus" />
</template>
</el-table-column>
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="300" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="180" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="180" />
<el-table-column fixed label="客户名称" align="center" prop="customerName" min-width="150" />
<el-table-column label="项目名称" align="center" prop="projectName" min-width="250" />
<el-table-column label="子项目名称" align="center" prop="projectSubName" min-width="280" />
<el-table-column label="性质" align="center" prop="property" min-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="planCode" min-width="180">
<el-table-column label="计划单号" align="center" prop="planCode" min-width="120">
<template #default="scope">
<el-button link type="primary" @click="openDetail('detail', scope.row.id)">
{{ scope.row.planCode }}
</el-button>
</template>
</el-table-column>
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="350" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="150">
<el-table-column label="子项目编号" align="center" prop="projectSubCode" min-width="200" />
<el-table-column label="所属业务线" align="center" prop="businessLine" min-width="120">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_BUSINESS_LINE" :value="scope.row.businessLine" />
</template>
</el-table-column>
<el-table-column fixed="right" label="毛坯负责人" align="center" prop="blankOwnerName" min-width="120" />
<el-table-column fixed="right" label="毛坯截止日期" align="center" prop="blankDate" :formatter="dateFormatter2" min-width="140" />
<el-table-column fixed="right" label="毛坯截止日期" align="center" prop="blankDate" :formatter="dateFormatter2" min-width="120" />
<el-table-column fixed="right" label="完成情况" align="center" prop="progress" min-width="120">
<template #default="scope">
{{getDetailMsg(scope.row)}}
@ -213,7 +213,7 @@ const getDetailMsg = (row) =>{
return '实施中';
}
}
}
/** 删除按钮操作 */

View File

@ -108,7 +108,7 @@
<div class="print-header">
<div class="order-info">
<div style="display: flex;">
<span style="width: 200px;">订单编号{{ printData.purchaseNo }}</span>
<span style="width: 160px;">订单编号{{ printData.purchaseNo }}</span>
<span style="margin-left:10px; width: 120px;">订单日期{{ formatDate(printData.ordDate) }}</span>
<span style="margin-left:10px;width: 210px; white-space: nowrap;">供应商{{ printData.supplierName }}</span>
</div>
@ -116,7 +116,6 @@
<span style="margin-left:10px;width: 100px">联系人{{ printData.contactName }}</span>
<span style="margin-left:10px;width: 100px">电话{{ printData.contactMobile }}</span>
</div>
</div>
</div>
<table class="print-table">
@ -146,8 +145,8 @@
<th>要求完成日期</th>
<th>技术要求</th>
<th>理论重量</th>
<th>单价()</th>
<th>总价格()</th>
<th>单价</th>
<th>总价格</th>
<th>备注</th>
</tr>
</thead>
@ -324,7 +323,7 @@ function doPrint() {
<style>
@page {
size: 241mm 140mm;
margin: 5mm;
margin: 5mm 12mm;
}
body {
font-family: Arial, sans-serif;
@ -340,8 +339,6 @@ function doPrint() {
display: flex;
flex-wrap: wrap;
align-items: center;
padding-left:8px
}
.stamp-info {

View File

@ -79,31 +79,31 @@
<div class="print-header">
<div class="order-info">
<div style="display: flex;">
<span style="width: 200px;">订单编号{{ printData.purchaseNo }}</span>
<span style="margin-left:10px; width: 140px;">订单日期{{ formatDate(printData.ordDate) }}</span>
<span style="margin-left:10px;width: 220px">供应商{{ printData.supplierName }}</span>
<span style="width: 160px;">订单编号{{ printData.purchaseNo }}</span>
<span style="margin-left:10px; width: 120px;">订单日期{{ formatDate(printData.ordDate) }}</span>
<span style="margin-left:10px;width: 200px">供应商{{ printData.supplierName }}</span>
</div>
<div style="display: flex;">
<span style="margin-left:10px;width: 100px">联系人{{ printData.contactName }}</span>
<span style="margin-left:10px;width: 120px">电话{{ printData.contactMobile }}</span>
<span style="margin-left:10px;width: 110px">电话{{ printData.contactMobile }}</span>
</div>
</div>
</div>
<table class="print-table">
<colgroup>
<col style="width: 4%;" />
<col style="width: 3%;" />
<col style="width: 14%;" />
<col style="width: 4%;" />
<col style="width: 3%;" />
<col style="width: 15%;" />
<col style="width: 7%;" />
<col style="width: 8%;" />
<col style="width: 4%;" />
<col style="width: 7%;" />
<col style="width: 8%;" />
<col style="width: 8%;" />
<col style="width: 7%;" />
<col style="width: 6%;" />
<col style="width: 9%;" />
<col style="width: 9%;" />
<col style="width: 7%;" />
<col style="width: 3%;" />
<col style="width: 5%;" />
</colgroup>
<thead>
@ -118,8 +118,8 @@
<th>要求完成日期</th>
<th>计划到货日期</th>
<th>采购数量</th>
<th>单价()</th>
<th>总价格()</th>
<th>单价</th>
<th>总价格</th>
</tr>
</thead>
<tbody>
@ -304,7 +304,7 @@ function doPrint() {
<style>
@page {
size: 241mm 140mm;
margin: 5mm;
margin: 5mm 21mm;
}
body {
font-family: Arial, sans-serif;
@ -320,7 +320,6 @@ function doPrint() {
display: flex;
flex-wrap: wrap;
align-items: center;
padding-left:8px
}
@ -339,7 +338,7 @@ function doPrint() {
.print-table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
/*margin-top: 10px;*/
table-layout: fixed;
border: 2px solid #000 !important; /* 加粗外边框 */
}
@ -347,8 +346,8 @@ function doPrint() {
border: 1px solid #000 !important; /* 使用黑色边框,更清晰 */
padding: 2px 0px;
text-align: center;
height: auto;
min-height: 26px;
height: 12px;
/*min-height: 26px;*/
// line-height: 1.2;
word-wrap: break-word;
word-break: break-all;
@ -369,7 +368,7 @@ function doPrint() {
overflow-wrap: break-word !important;
padding: 4px 2px;
}
</style>
</head>
<body>
@ -472,7 +471,7 @@ const getList = async () => {
.print-table {
width: 100%;
border-collapse: collapse;
margin-top: 10px;
//margin-top: 10px;
border: 1px solid #ccc;
}

View File

@ -117,34 +117,177 @@
<div class="hl-card-info-icona"></div><span class="hl-card-info-text">材料成本</span>
</template>
<el-table v-loading="loading" :data="listcl" :stripe="true" :show-overflow-tooltip="true" border class="hl-table">
<el-table-column type="index" width="100" fixed label="序号" align="center" />
<el-table-column type="index" width="70" fixed label="序号" align="center" />
<el-table-column v-if="false" label="ID" align="center" prop="id" width="240px" />
<el-table-column label="物料编号" align="center" prop="materialCode" width="200px" />
<el-table-column label="物料名称" align="center" prop="materialName" width="240px"/>
<!-- <el-table-column label="物料类型" align="center" prop="materialType" width="240px"/>-->
<el-table-column label="物料类型" align="center" prop="materialType" width="150px" >
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_TYPE" :value="scope.row.materialType" v-if="scope.row.type==0"/>
<el-table-column label="零件名称" align="center" prop="materialName" width="200px" />
<el-table-column label="材质" align="center" prop="compositionName" width="150px"/>
<el-table-column label="规格型号" align="center" prop="spec" width="100"/>
<el-table-column label="数量" align="center" prop="amount" width="100"/>
<el-table-column label="泡沫" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['泡沫']">
<span >
<span >{{ row.map['泡沫'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="规格型号" align="center" prop="materialSpec" width="100"/>
<el-table-column label="领料数量" align="center" prop="amount" width="100"/>
<!-- <el-table-column label="系统单位" align="center" prop="unit" />-->
<el-table-column label="系统单位" align="center" prop="unit" width="100px">
<template #default="scope">
<dict-tag :type="DICT_TYPE.HELI_MATERIAL_UNIT" :value="scope.row.unit" />
<el-table-column label="下料" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['下料']">
<span >
<span >{{ row.map['下料'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="平均采购价(暂估)" align="center" prop="zanGuMoney" width="200"/>
<el-table-column label="平均采购价(实际)" align="center" prop="shiJiMoney" width="200"/>
<!-- <el-table-column label="平均采购价(实际)" align="center" width="100">-->
<!-- <template v-slot="scope">-->
<!-- <el-input v-model="scope.row.shiJiMoney" />-->
<!-- </template>-->
<!-- </el-table-column>-->
<el-table-column label="采购金额(实际)" align="center" prop="caiGouMoney" width="200"/>
<el-table-column label="电焊" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['电焊']">
<span >
<span >{{ row.map['电焊'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="编程" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['编程']">
<span >
<span >{{ row.map['编程'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="开粗" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['开粗']">
<span >
<span >{{ row.map['开粗'] }}</span>
</span>
</template>
</template>
</el-table-column> <el-table-column label="" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['铣床']">
<span >
<span >{{ row.map['铣床'] }}</span>
</span>
</template>
</template>
</el-table-column> <el-table-column label="" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['车床']">
<span >
<span >{{ row.map['车床'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="热处理" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['热处理']">
<span >
<span >{{ row.map['热处理'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="磨床" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['磨床']">
<span >
<span >{{ row.map['磨床'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="数控1" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['数控1']">
<span >
<span >{{ row.map['数控1'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="数控2" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['数控2']">
<span >
<span >{{ row.map['数控2']}}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="线切割" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['线切割']">
<span >
<span >{{ row.map['线切割'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="电极" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['电极']">
<span >
<span >{{ row.map['电极'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="火花" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['火花']">
<span >
<span >{{ row.map['火花'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="刻字" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['刻字']">
<span >
<span >{{ row.map['刻字'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="网格" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['网格']">
<span >
<span >{{ row.map['网格'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="深孔钻" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['深孔钻']">
<span >
<span >{{ row.map['深孔钻'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="钻孔" min-width="100" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['钻孔']">
<span >
<span >{{ row.map['钻孔'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="单件成本" align="center" prop="assemblyLaborCost" width="120px"/>
</el-table>
@ -163,27 +306,36 @@
<el-table-column label="数量" align="center" prop="quantity" />
<el-table-column label="装配" min-width="145" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map.has('装配')">
<template v-if="row.map && row.map['装配']">
<span >
<span >{{ row.map.get('装配') }}</span>
<span >{{ row.map['装配'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="包装" min-width="145" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map.has('包装')">
<template v-if="row.map && row.map['包装']">
<span >
<span >{{ row.map.get('包装') }}</span>
<span >{{ row.map['包装'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="钻孔" min-width="145" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map.has('钻孔')">
<template v-if="row.map && row.map['钻孔']">
<span >
<span >{{ row.map.get('钻孔') }}</span>
<span >{{ row.map['钻孔'] }}</span>
</span>
</template>
</template>
</el-table-column>
<el-table-column label="检验成本" min-width="145" align="center">
<template #default="{ row }">
<template v-if="row.map && row.map['检验']">
<span >
<span >{{ row.map['检验'] }}</span>
</span>
</template>
</template>
@ -202,11 +354,11 @@
<el-table v-loading="loading" :data="listYf" :stripe="true" :show-overflow-tooltip="true" border class="hl-table">
<el-table-column type="index" min-width="60" fixed label="序号" align="center" />
<el-table-column label="发货日期" align="center" prop="deliverDate" width="240px" :formatter="dateFormatter2"/>
<el-table-column label="发货数量" align="center" prop="amounts" />
<el-table-column label="重量" align="center" prop="weights" />
<el-table-column label="发货数量" align="center" prop="amount" />
<el-table-column label="重量" align="center" prop="weight" />
<el-table-column label="发货人" align="center" prop="deliverPersonName" />
<el-table-column label="运费" align="center" prop="yunFeiMoney" />
<el-table-column label="运费" align="center" prop="yunFei" />
@ -227,8 +379,7 @@
import * as SaleeOrderCost from '@/api/heli/saleordercost'
import {dateFormatter2} from "@/utils/formatTime";
import {DICT_TYPE} from "@/utils/dict";
import {number} from "vue-types";
import {getListcl, getListYfDetails, getListZp} from "@/api/heli/saleordercost";
const { t } = useI18n() //
const message = useMessage() //
const { query } = useRoute()

View File

@ -24,6 +24,7 @@
<script setup lang="ts">
import QRCode from 'qrcode'
import printFinalDialog from './printFinalDialog.vue';
import {getIntDictOptions} from "@/utils/dict";
const dialogVisible = ref(false)
let clauseId = null;
const startPageNum = ref(0);
@ -47,8 +48,6 @@ const datavals = ref([])
const cnenList = ref([])
const bomCodes = ref('')
const open = async (vals) => {
const sortedVals = [...vals].sort((a, b) => {
return b.id - a.id;
@ -84,13 +83,13 @@ const open = async (vals) => {
const qrCodeElement = document.getElementById('qrCodeContainer')
if (qrCodeElement) {
(qrCodeElement.innerHTML +=
`<div style="width: 90mm; height: 60mm; padding: 2mm; box-sizing: border-box; font-family: monospace; position: relative; background-color: white; color: black;">
`<div style="width: 90mm; height: 60mm; box-sizing: border-box; font-family: monospace; position: relative; background-color: white; color: black;">
<div style="font-size: 11px; margin-bottom: 1mm;">
<span style="display: inline-block; width: 100%; border-bottom: 1px solid black; padding-bottom: 0.2mm;">物料编码:${item.code}</span>
<span style="display: inline-block; width: 100%; border-bottom: 1px solid black; padding-bottom: 0.2mm;">物料编码: ${item.code}</span>
</div>
<div style="display: flex; align-items: center;">
<span style="white-space: nowrap; margin-right: 1mm;"> </span>
<span style="flex-grow: 1; border-bottom: 1px solid black; margin-left: -1mm;padding-bottom: 0.2mm;">${item.name}</span>
<span style="white-space: nowrap; margin-right: 1mm;">&thinsp;:</span>
<span style="flex-grow: 1; border-bottom: 1px solid black; padding-bottom: 0.2mm;">${item.name}</span>
</div>
<div style="display: flex; position: absolute; bottom: 2mm; left: 2mm; right: 2mm; height: 34mm;">
<div style="display: flex; flex-direction: column; justify-content: center; align-items: flex-start; width: 13mm; margin-right: 1mm;">
@ -104,8 +103,9 @@ const open = async (vals) => {
line-height: 1.2; min-height: calc(14px * 1.2 * 2);
display: -webkit-box;
-webkit-line-clamp: 2;
margin-left: -2.5mm;
-webkit-box-orient: vertical;
overflow: hidden;"> ${item.spec}</span>
overflow: hidden;">&thinsp;: ${item.spec}</span>
<span style=" width: 52mm;
white-space: pre-wrap;
word-break: break-all;
@ -113,7 +113,8 @@ const open = async (vals) => {
text-indent: -15.8mm;
padding-left: 15.8mm;
font-size: 11px;
line-height: 1.2;"> ${item.rg}</span>
margin-left: -2.5mm;
line-height: 1.2;">&thinsp;: ${item.rg}</span>
<span style=" width: 52mm;
white-space: pre-wrap;
word-break: break-all;
@ -121,7 +122,8 @@ const open = async (vals) => {
text-indent: -15.8mm;
padding-left: 15.8mm;
font-size: 11px;
line-height: 1.2;"> ${item.pg}</span>
margin-left: -2.5mm;
line-height: 1.2;">&thinsp;: ${item.pg}</span>
</div>
<div style="width: 34mm; height: 34mm; margin-left: auto; display: flex; align-items: flex-end; justify-content: flex-end;">
<img style="width: 100%; height: 100%;" src="${qrCodeData}" alt="QR Code">

View File

@ -22,6 +22,7 @@
<script setup lang="ts">
import QRCode from 'qrcode'
import {DICT_TYPE, getIntDictOptions} from "@/utils/dict";
const dialogVisible = ref(false)
let clauseId = null;
@ -201,6 +202,7 @@ const open = async (vals) => {
rg: item.rgName == null ? '' : item.rgName,
pg: item.pnName == null ? '' : item.pnName,
//amount: item.amount == null ? '' : item.amount
}
printCodeName.value.push(row1)
})
@ -217,17 +219,17 @@ const open = async (vals) => {
(qrCodeElement.innerHTML +=
`<div class="page qr-page">
<div class="code-line">
<span>物料编码${item.code}</span>
<span>物料编码:&thinsp;${item.code}</span>
</div>
<div class="name-line">
<span class="name-label"> </span>
<span class="name-label">&thinsp;:&thinsp;</span>
<span class="name-underline">${item.name}</span>
</div>
<div class="bottom-section">
<div class="quantity-container">
<span class="quantity spec"> : ${item.spec}</span>
<span class="quantity rg"> : ${item.rg}</span>
<span class="quantity pg"> : ${item.pg}</span>
<span class="quantity spec">&thinsp;:&thinsp;${item.spec}</span>
<span class="quantity rg">&thinsp;:&thinsp;${item.rg}</span>
<span class="quantity pg">&thinsp;:&thinsp;${item.pg}</span>
</div>
<div class="qr-container">
<img class="qr-code" src="${qrCodeData}" alt="QR Code">

View File

@ -319,7 +319,7 @@ style=" display: flex;
:value="item.id"
/>
</el-select>
<el-select :disabled="getDisabledState(row)" clearable filterable v-if="row.dispatchType==2 && (row.owner == '' || row.owner == null)" v-model="row.postId" placeholder="请选择岗位" style="width: 110px">
<el-select :disabled="getDisabledState(row)" clearable filterable v-if="row.dispatchType==2 && (row.owner == '' || row.owner == null)&&procedureList.find(p => p.id == row.procedureId)?.name != '钻孔'" v-model="row.postId" placeholder="请选择岗位" style="width: 110px">
<el-option
v-for="item in ownerList2"
:key="item.index"
@ -327,6 +327,14 @@ style=" display: flex;
:value="item.id"
/>
</el-select>
<el-select :disabled="getDisabledState(row)" clearable filterable v-if="row.dispatchType==2 && (row.owner == '' || row.owner == null)&&procedureList.find(p => p.id == row.procedureId)?.name == '钻孔'" v-model="row.postId" placeholder="请选择岗位" style="width: 110px">
<el-option
v-for="item in ownerList3"
:key="item.index"
:label="item.label"
:value="item.id"
/>
</el-select>
</el-form-item>
<!-- <el-form-item :prop="`${$index}.owner`" :rules="subFormRules.owner" class="mb-0px!">
<UserSelect
@ -387,7 +395,7 @@ v-model="row.deviceModel"
</el-form-item>
</template>
</el-table-column>
<el-table-column label="备注" prop="summary" min-width="130px">
<el-table-column label="备注" prop="summary" min-width="400px">
<template #default="{ row, $index }">
<el-form-item :prop="`${$index}.summary`" class="mb-0px!">
<el-input
@ -396,17 +404,17 @@ v-model="row.deviceModel"
</el-form-item>
</template>
</el-table-column>
<el-table-column label="系统单位" align="center" prop="unit" width="70px">
<template #default>
{{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, formData.unit) }}
</template>
</el-table-column>
<el-table-column label="是否报工" prop="isReport" width="70px">
<template #default="scope">
{{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, scope.row.isReport) }}
</template>
</el-table-column>
<el-table-column label="工序编号" prop="procedureCode" width="140" />
<!-- <el-table-column label="系统单位" align="center" prop="unit" width="70px">-->
<!-- <template #default>-->
<!-- {{ getDictLabel(DICT_TYPE.HELI_MATERIAL_UNIT, formData.unit) }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="是否报工" prop="isReport" width="70px">-->
<!-- <template #default="scope">-->
<!-- {{ getDictLabel(DICT_TYPE.HELI_COMMON_IS_OR_NOT, scope.row.isReport) }}-->
<!-- </template>-->
<!-- </el-table-column>-->
<!-- <el-table-column label="工序编号" prop="procedureCode" width="140" />-->
<el-table-column fixed="right" label="操作" align="center" min-width="90">
<template #default="scope">
@ -1281,6 +1289,7 @@ const personList = ref([])
const ownerList1 = ref<OwnerListType[]>([]);
const ownerList2 = ref<OwnerListPostType[]>([]);
const ownerList3 = ref<OwnerListPostType[]>([]);
const dispatchListTemp = ref([])
const craftInfos = ref([])
const queryData = async (id?: number) => {
@ -1337,6 +1346,13 @@ const queryData = async (id?: number) => {
if (!exists) {
ownerList2.value.push({ index: 1, id: '3', label: '3' });
}
const maxIndex = ownerList2.value.reduce((max, item) => Math.max(max, item.index || 0), 0);
// ownerList3.value 4 5index
ownerList3.value = [
...ownerList2.value,
{ index: maxIndex + 1, id: '4', label: '4' },
{ index: maxIndex + 2, id: '5', label: '5' }
];
}
formData.value.bomCode = formData.value.projectSubCode