This commit is contained in:
jhd
2026-07-07 09:42:36 +08:00
118 changed files with 6616 additions and 178 deletions

View File

@@ -140,6 +140,12 @@
<artifactId>klp-pt</artifactId> <artifactId>klp-pt</artifactId>
</dependency> </dependency>
<!-- 工艺模型配置模块-->
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-pltcm</artifactId>
</dependency>
<dependency> <dependency>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId> <artifactId>spring-boot-starter-test</artifactId>

View File

@@ -1,10 +1,13 @@
package com.klp.crm.controller; package com.klp.crm.controller;
import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Arrays; import java.util.Arrays;
import java.util.Date; import java.util.Date;
import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import com.klp.aps.domain.bo.ApsPlanDetailBo; import com.klp.aps.domain.bo.ApsPlanDetailBo;
import com.klp.aps.domain.bo.ApsPlanSheetBo; import com.klp.aps.domain.bo.ApsPlanSheetBo;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
@@ -23,6 +26,7 @@ import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType; import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil; import com.klp.common.utils.poi.ExcelUtil;
import com.klp.crm.domain.vo.CrmOrderVo; import com.klp.crm.domain.vo.CrmOrderVo;
import com.klp.crm.domain.vo.CrmOrderExportVo;
import com.klp.crm.domain.bo.CrmOrderBo; import com.klp.crm.domain.bo.CrmOrderBo;
import com.klp.crm.service.ICrmOrderService; import com.klp.crm.service.ICrmOrderService;
import com.klp.common.core.page.TableDataInfo; import com.klp.common.core.page.TableDataInfo;
@@ -65,6 +69,35 @@ public class CrmOrderController extends BaseController {
ExcelUtil.exportExcel(list, "正式订单主", CrmOrderVo.class, response); ExcelUtil.exportExcel(list, "正式订单主", CrmOrderVo.class, response);
} }
/**
* 导出正式订单主列表(业务精简字段,用于合同编辑详情页导出)
*/
@Log(title = "正式订单主", businessType = BusinessType.EXPORT)
@PostMapping("/exportDetail")
public void exportDetail(@RequestBody CrmOrderBo bo, HttpServletResponse response) {
List<CrmOrderVo> list = iCrmOrderService.queryList(bo);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CrmOrderExportVo> exportList = list.stream().map(vo -> {
CrmOrderExportVo export = new CrmOrderExportVo();
BeanUtil.copyProperties(vo, export);
// 日期格式化
export.setSignTime(vo.getSignTime() != null ? sdf.format(vo.getSignTime()) : null);
export.setDeliveryDate(vo.getDeliveryDate() != null ? sdf.format(vo.getDeliveryDate()) : null);
// 状态转文本
if (vo.getStatus() != null) {
switch (vo.getStatus().intValue()) {
case 0: export.setStatus("草稿"); break;
case 1: export.setStatus("已生效"); break;
case 2: export.setStatus("已作废"); break;
case 3: export.setStatus("已完成"); break;
default: export.setStatus(String.valueOf(vo.getStatus())); break;
}
}
return export;
}).collect(Collectors.toList());
ExcelUtil.exportExcel(exportList, "合同编辑详情", CrmOrderExportVo.class, response);
}
/** /**
* 获取正式订单主详细信息 * 获取正式订单主详细信息
* *

View File

@@ -1,7 +1,11 @@
package com.klp.crm.controller; package com.klp.crm.controller;
import java.text.SimpleDateFormat;
import java.util.List; import java.util.List;
import java.util.Arrays; import java.util.Arrays;
import java.util.stream.Collectors;
import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpServletResponse;
@@ -18,6 +22,7 @@ import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType; import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil; import com.klp.common.utils.poi.ExcelUtil;
import com.klp.crm.domain.vo.CrmOrderItemVo; import com.klp.crm.domain.vo.CrmOrderItemVo;
import com.klp.crm.domain.vo.CrmOrderItemExportVo;
import com.klp.crm.domain.vo.CrmContractOrderFinanceVo; import com.klp.crm.domain.vo.CrmContractOrderFinanceVo;
import com.klp.crm.domain.bo.CrmOrderItemBo; import com.klp.crm.domain.bo.CrmOrderItemBo;
import com.klp.crm.service.ICrmOrderItemService; import com.klp.crm.service.ICrmOrderItemService;
@@ -56,6 +61,30 @@ public class CrmOrderItemController extends BaseController {
ExcelUtil.exportExcel(list, "正式订单明细", CrmOrderItemVo.class, response); ExcelUtil.exportExcel(list, "正式订单明细", CrmOrderItemVo.class, response);
} }
/**
* 导出正式订单明细列表(业务精简字段,用于订单明细列表页导出)
*/
@Log(title = "正式订单明细", businessType = BusinessType.EXPORT)
@PostMapping("/exportDetail")
public void exportDetail(@RequestBody CrmOrderItemBo bo, HttpServletResponse response) {
List<CrmOrderItemVo> list = iCrmOrderItemService.queryList(bo);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
List<CrmOrderItemExportVo> exportList = list.stream().map(vo -> {
CrmOrderItemExportVo export = new CrmOrderItemExportVo();
BeanUtil.copyProperties(vo, export);
// 日期格式化
export.setSignTime(vo.getSignTime() != null ? sdf.format(vo.getSignTime()) : null);
// 展平 orderInfo 中的 salesman、orderCode、contractName
if (vo.getOrderInfo() != null) {
export.setSalesman(vo.getOrderInfo().getSalesman());
export.setOrderCode(vo.getOrderInfo().getOrderCode());
export.setContractName(vo.getOrderInfo().getContractName());
}
return export;
}).collect(Collectors.toList());
ExcelUtil.exportExcel(exportList, "订单明细列表", CrmOrderItemExportVo.class, response);
}
/** /**
* 获取正式订单明细详细信息 * 获取正式订单明细详细信息
* *

View File

@@ -0,0 +1,76 @@
package com.klp.crm.domain.vo;
import java.math.BigDecimal;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 合同编辑详情导出视图对象
* 仅包含页面表格展示的业务字段19列
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class CrmOrderExportVo {
@ExcelProperty(value = "合同号")
private String contractCode;
@ExcelProperty(value = "供方")
private String supplier;
@ExcelProperty(value = "需方")
private String customer;
@ExcelProperty(value = "业务员")
private String salesman;
@ExcelProperty(value = "签订日期")
private String signTime;
@ExcelProperty(value = "交货日期")
private String deliveryDate;
@ExcelProperty(value = "签订地点")
private String signLocation;
@ExcelProperty(value = "供方地址")
private String supplierAddress;
@ExcelProperty(value = "供方电话")
private String supplierPhone;
@ExcelProperty(value = "供方开户行")
private String supplierBank;
@ExcelProperty(value = "供方账号")
private String supplierAccount;
@ExcelProperty(value = "需方地址")
private String customerAddress;
@ExcelProperty(value = "需方电话")
private String customerPhone;
@ExcelProperty(value = "需方开户行")
private String customerBank;
@ExcelProperty(value = "需方账号")
private String customerAccount;
@ExcelProperty(value = "订单金额")
private BigDecimal orderAmount;
@ExcelProperty(value = "已收款")
private BigDecimal receivedAmount;
@ExcelProperty(value = "状态")
private String status;
@ExcelProperty(value = "备注")
private String remark;
}

View File

@@ -0,0 +1,127 @@
package com.klp.crm.domain.vo;
import java.math.BigDecimal;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
/**
* 订单明细列表导出视图对象
* 仅包含页面表格展示的业务字段32列
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class CrmOrderItemExportVo {
// ========== 合同信息(联表) ==========
@ExcelProperty(value = "合同号")
private String contractCode;
@ExcelProperty(value = "合同名称")
private String contractName;
@ExcelProperty(value = "需方")
private String customer;
@ExcelProperty(value = "供方")
private String supplier;
@ExcelProperty(value = "业务员")
private String salesman;
@ExcelProperty(value = "签订时间")
private String signTime;
@ExcelProperty(value = "订单编号")
private String orderCode;
// ========== 明细标识 ==========
@ExcelProperty(value = "明细ID")
private Long itemId;
@ExcelProperty(value = "订单ID")
private Long orderId;
// ========== 产品规格 ==========
@ExcelProperty(value = "产品类型")
private String productType;
@ExcelProperty(value = "原料规格")
private String rawMaterialSpec;
@ExcelProperty(value = "成品规格")
private String finishedProductSpec;
@ExcelProperty(value = "数量")
private Long productNum;
@ExcelProperty(value = "材质")
private String material;
@ExcelProperty(value = "等级")
private String grade;
@ExcelProperty(value = "宽度")
private String width;
@ExcelProperty(value = "厚度")
private String thickness;
@ExcelProperty(value = "宽度公差")
private String widthTolerance;
@ExcelProperty(value = "厚度公差")
private String thicknessTolerance;
@ExcelProperty(value = "重量")
private BigDecimal weight;
// ========== 价格 ==========
@ExcelProperty(value = "合同定价")
private BigDecimal contractPrice;
@ExcelProperty(value = "明细金额")
private BigDecimal itemAmount;
// ========== 加工要求 ==========
@ExcelProperty(value = "表面处理")
private String surfaceTreatment;
@ExcelProperty(value = "包装要求")
private String packagingReq;
@ExcelProperty(value = "切边要求")
private String edgeCuttingReq;
@ExcelProperty(value = "表面质量")
private String surfaceQuality;
// ========== 其他 ==========
@ExcelProperty(value = "特殊要求")
private String specialRequire;
@ExcelProperty(value = "用途")
private String purpose;
@ExcelProperty(value = "备注")
private String remark;
@ExcelProperty(value = "定制人")
private String customizer;
@ExcelProperty(value = "发货人")
private String shipper;
@ExcelProperty(value = "排产批次")
private String productionBatch;
}

View File

@@ -234,6 +234,12 @@ public class CrmOrderItemVo {
@ExcelProperty(value = "交货日期") @ExcelProperty(value = "交货日期")
private Date deliveryDate; private Date deliveryDate;
/**
* 销售员(联表查询直接映射)
*/
@ExcelProperty(value = "销售员")
private String salesman;
/** /**
* 订单信息 * 订单信息
*/ */

View File

@@ -168,7 +168,11 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
Map<Long, CrmOrderVo> orderMap = orderList.stream() Map<Long, CrmOrderVo> orderMap = orderList.stream()
.collect(Collectors.toMap(CrmOrderVo::getOrderId, o -> o, (a, b) -> a)); .collect(Collectors.toMap(CrmOrderVo::getOrderId, o -> o, (a, b) -> a));
for (CrmOrderItemVo item : records) { for (CrmOrderItemVo item : records) {
item.setOrderInfo(orderMap.get(item.getOrderId())); CrmOrderVo order = orderMap.get(item.getOrderId());
item.setOrderInfo(order);
if (order != null) {
item.setSalesman(order.getSalesman());
}
} }
} }

View File

@@ -74,6 +74,7 @@
<result property="customer" column="customer"/> <result property="customer" column="customer"/>
<result property="signTime" column="sign_time"/> <result property="signTime" column="sign_time"/>
<result property="deliveryDate" column="delivery_date"/> <result property="deliveryDate" column="delivery_date"/>
<result property="salesman" column="salesman"/>
</resultMap> </resultMap>
<!-- 根据订单ID列表查询订单明细 --> <!-- 根据订单ID列表查询订单明细 -->
@@ -155,7 +156,8 @@
o.supplier, o.supplier,
o.customer, o.customer,
o.sign_time, o.sign_time,
o.delivery_date o.delivery_date,
o.salesman
FROM crm_order_item i FROM crm_order_item i
LEFT JOIN crm_order o ON i.order_id = o.order_id AND o.del_flag = 0 LEFT JOIN crm_order o ON i.order_id = o.order_id AND o.del_flag = 0
<where> <where>

View File

@@ -13,6 +13,7 @@ import java.util.Date;
public class MesRollGrindVo { public class MesRollGrindVo {
private Long grindId; private Long grindId;
private Long lineId;
private Long rollId; private Long rollId;
private String rollNo; private String rollNo;

View File

@@ -3,7 +3,7 @@
<mapper namespace="com.klp.mes.roll.mapper.MesRollGrindMapper"> <mapper namespace="com.klp.mes.roll.mapper.MesRollGrindMapper">
<select id="selectByRollId" resultType="com.klp.mes.roll.domain.vo.MesRollGrindVo"> <select id="selectByRollId" resultType="com.klp.mes.roll.domain.vo.MesRollGrindVo">
SELECT grind_id, roll_id, roll_no, grind_time, team, SELECT grind_id, line_id, roll_id, roll_no, grind_time, team,
dia_before, dia_after, grind_amount, roll_shape, dia_before, dia_after, grind_amount, roll_shape,
flaw_result, flaw_result,
CASE WHEN hardness = '未倒角' THEN 0 ELSE CAST(hardness AS DECIMAL(10,1)) END AS hardness, CASE WHEN hardness = '未倒角' THEN 0 ELSE CAST(hardness AS DECIMAL(10,1)) END AS hardness,
@@ -14,7 +14,7 @@
</select> </select>
<select id="selectList" resultType="com.klp.mes.roll.domain.vo.MesRollGrindVo"> <select id="selectList" resultType="com.klp.mes.roll.domain.vo.MesRollGrindVo">
SELECT g.grind_id, g.roll_id, g.roll_no, g.grind_time, g.team, SELECT g.grind_id, g.line_id, g.roll_id, g.roll_no, g.grind_time, g.team,
g.dia_before, g.dia_after, g.grind_amount, g.roll_shape, g.dia_before, g.dia_after, g.grind_amount, g.roll_shape,
g.flaw_result, g.flaw_result,
CASE WHEN g.hardness = '未倒角' THEN 0 ELSE CAST(g.hardness AS DECIMAL(10,1)) END AS hardness, CASE WHEN g.hardness = '未倒角' THEN 0 ELSE CAST(g.hardness AS DECIMAL(10,1)) END AS hardness,

22
klp-pltcm/pom.xml Normal file
View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.klp</groupId>
<artifactId>klp-oa</artifactId>
<version>0.8.3</version>
</parent>
<artifactId>klp-pltcm</artifactId>
<name>klp-pltcm</name>
<description>工艺模型配置模块(厚度/宽度/屈服强度分类及比例策略)</description>
<dependencies>
<dependency>
<groupId>com.klp</groupId>
<artifactId>klp-common</artifactId>
</dependency>
</dependencies>
</project>

View File

@@ -0,0 +1,68 @@
package com.klp.pltcm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.pltcm.domain.vo.ModDeviceEnableVo;
import com.klp.pltcm.domain.bo.ModDeviceEnableBo;
import com.klp.pltcm.service.IModDeviceEnableService;
import com.klp.common.core.page.TableDataInfo;
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/pltcm/deviceEnable")
public class ModDeviceEnableController extends BaseController {
private final IModDeviceEnableService iModDeviceEnableService;
@GetMapping("/list")
public TableDataInfo<ModDeviceEnableVo> list(ModDeviceEnableBo bo, PageQuery pageQuery) {
return iModDeviceEnableService.queryPageList(bo, pageQuery);
}
@Log(title = "设备启用状态", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ModDeviceEnableBo bo, HttpServletResponse response) {
List<ModDeviceEnableVo> list = iModDeviceEnableService.queryList(bo);
ExcelUtil.exportExcel(list, "设备启用状态", ModDeviceEnableVo.class, response);
}
@GetMapping("/{id}")
public R<ModDeviceEnableVo> getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
return R.ok(iModDeviceEnableService.queryById(id));
}
@Log(title = "设备启用状态", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ModDeviceEnableBo bo) {
return toAjax(iModDeviceEnableService.insertByBo(bo));
}
@Log(title = "设备启用状态", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ModDeviceEnableBo bo) {
return toAjax(iModDeviceEnableService.updateByBo(bo));
}
@Log(title = "设备启用状态", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
return toAjax(iModDeviceEnableService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.pltcm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.pltcm.domain.vo.ModStrategyVo;
import com.klp.pltcm.domain.bo.ModStrategyBo;
import com.klp.pltcm.service.IModStrategyService;
import com.klp.common.core.page.TableDataInfo;
/**
* 策略关联
*
* @author klp
* @date 2026-07-06
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/pltcm/strategy")
public class ModStrategyController extends BaseController {
private final IModStrategyService iModStrategyService;
/**
* 查询策略关联列表
*/
@GetMapping("/list")
public TableDataInfo<ModStrategyVo> list(ModStrategyBo bo, PageQuery pageQuery) {
return iModStrategyService.queryPageList(bo, pageQuery);
}
/**
* 导出策略关联列表
*/
@Log(title = "策略关联", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ModStrategyBo bo, HttpServletResponse response) {
List<ModStrategyVo> list = iModStrategyService.queryList(bo);
ExcelUtil.exportExcel(list, "策略关联", ModStrategyVo.class, response);
}
/**
* 获取策略关联详细信息
*
* @param id 主键
*/
@GetMapping("/{id}")
public R<ModStrategyVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(iModStrategyService.queryById(id));
}
/**
* 新增策略关联
*/
@Log(title = "策略关联", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ModStrategyBo bo) {
return toAjax(iModStrategyService.insertByBo(bo));
}
/**
* 修改策略关联
*/
@Log(title = "策略关联", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ModStrategyBo bo) {
return toAjax(iModStrategyService.updateByBo(bo));
}
/**
* 删除策略关联
*
* @param ids 主键串
*/
@Log(title = "策略关联", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(iModStrategyService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.pltcm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.pltcm.domain.vo.ModThickClassVo;
import com.klp.pltcm.domain.bo.ModThickClassBo;
import com.klp.pltcm.service.IModThickClassService;
import com.klp.common.core.page.TableDataInfo;
/**
* 厚度分类
*
* @author klp
* @date 2026-07-06
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/pltcm/thickClass")
public class ModThickClassController extends BaseController {
private final IModThickClassService iModThickClassService;
/**
* 查询厚度分类列表
*/
@GetMapping("/list")
public TableDataInfo<ModThickClassVo> list(ModThickClassBo bo, PageQuery pageQuery) {
return iModThickClassService.queryPageList(bo, pageQuery);
}
/**
* 导出厚度分类列表
*/
@Log(title = "厚度分类", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ModThickClassBo bo, HttpServletResponse response) {
List<ModThickClassVo> list = iModThickClassService.queryList(bo);
ExcelUtil.exportExcel(list, "厚度分类", ModThickClassVo.class, response);
}
/**
* 获取厚度分类详细信息
*
* @param classId 主键
*/
@GetMapping("/{classId}")
public R<ModThickClassVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long classId) {
return R.ok(iModThickClassService.queryById(classId));
}
/**
* 新增厚度分类
*/
@Log(title = "厚度分类", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ModThickClassBo bo) {
return toAjax(iModThickClassService.insertByBo(bo));
}
/**
* 修改厚度分类
*/
@Log(title = "厚度分类", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ModThickClassBo bo) {
return toAjax(iModThickClassService.updateByBo(bo));
}
/**
* 删除厚度分类
*
* @param classIds 主键串
*/
@Log(title = "厚度分类", businessType = BusinessType.DELETE)
@DeleteMapping("/{classIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] classIds) {
return toAjax(iModThickClassService.deleteWithValidByIds(Arrays.asList(classIds), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.pltcm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.pltcm.domain.vo.ModWidthClassVo;
import com.klp.pltcm.domain.bo.ModWidthClassBo;
import com.klp.pltcm.service.IModWidthClassService;
import com.klp.common.core.page.TableDataInfo;
/**
* 宽度分类
*
* @author klp
* @date 2026-07-06
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/pltcm/widthClass")
public class ModWidthClassController extends BaseController {
private final IModWidthClassService iModWidthClassService;
/**
* 查询宽度分类列表
*/
@GetMapping("/list")
public TableDataInfo<ModWidthClassVo> list(ModWidthClassBo bo, PageQuery pageQuery) {
return iModWidthClassService.queryPageList(bo, pageQuery);
}
/**
* 导出宽度分类列表
*/
@Log(title = "宽度分类", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ModWidthClassBo bo, HttpServletResponse response) {
List<ModWidthClassVo> list = iModWidthClassService.queryList(bo);
ExcelUtil.exportExcel(list, "宽度分类", ModWidthClassVo.class, response);
}
/**
* 获取宽度分类详细信息
*
* @param classId 主键
*/
@GetMapping("/{classId}")
public R<ModWidthClassVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long classId) {
return R.ok(iModWidthClassService.queryById(classId));
}
/**
* 新增宽度分类
*/
@Log(title = "宽度分类", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ModWidthClassBo bo) {
return toAjax(iModWidthClassService.insertByBo(bo));
}
/**
* 修改宽度分类
*/
@Log(title = "宽度分类", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ModWidthClassBo bo) {
return toAjax(iModWidthClassService.updateByBo(bo));
}
/**
* 删除宽度分类
*
* @param classIds 主键串
*/
@Log(title = "宽度分类", businessType = BusinessType.DELETE)
@DeleteMapping("/{classIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] classIds) {
return toAjax(iModWidthClassService.deleteWithValidByIds(Arrays.asList(classIds), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.pltcm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.pltcm.domain.vo.ModYieldStressClassVo;
import com.klp.pltcm.domain.bo.ModYieldStressClassBo;
import com.klp.pltcm.service.IModYieldStressClassService;
import com.klp.common.core.page.TableDataInfo;
/**
* 屈服强度分类
*
* @author klp
* @date 2026-07-06
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/pltcm/yieldStressClass")
public class ModYieldStressClassController extends BaseController {
private final IModYieldStressClassService iModYieldStressClassService;
/**
* 查询屈服强度分类列表
*/
@GetMapping("/list")
public TableDataInfo<ModYieldStressClassVo> list(ModYieldStressClassBo bo, PageQuery pageQuery) {
return iModYieldStressClassService.queryPageList(bo, pageQuery);
}
/**
* 导出屈服强度分类列表
*/
@Log(title = "屈服强度分类", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(ModYieldStressClassBo bo, HttpServletResponse response) {
List<ModYieldStressClassVo> list = iModYieldStressClassService.queryList(bo);
ExcelUtil.exportExcel(list, "屈服强度分类", ModYieldStressClassVo.class, response);
}
/**
* 获取屈服强度分类详细信息
*
* @param classId 主键
*/
@GetMapping("/{classId}")
public R<ModYieldStressClassVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long classId) {
return R.ok(iModYieldStressClassService.queryById(classId));
}
/**
* 新增屈服强度分类
*/
@Log(title = "屈服强度分类", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody ModYieldStressClassBo bo) {
return toAjax(iModYieldStressClassService.insertByBo(bo));
}
/**
* 修改屈服强度分类
*/
@Log(title = "屈服强度分类", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody ModYieldStressClassBo bo) {
return toAjax(iModYieldStressClassService.updateByBo(bo));
}
/**
* 删除屈服强度分类
*
* @param classIds 主键串
*/
@Log(title = "屈服强度分类", businessType = BusinessType.DELETE)
@DeleteMapping("/{classIds}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] classIds) {
return toAjax(iModYieldStressClassService.deleteWithValidByIds(Arrays.asList(classIds), true));
}
}

View File

@@ -0,0 +1,99 @@
package com.klp.pltcm.controller;
import java.util.List;
import java.util.Arrays;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.pltcm.domain.vo.SchRatioVo;
import com.klp.pltcm.domain.bo.SchRatioBo;
import com.klp.pltcm.service.ISchRatioService;
import com.klp.common.core.page.TableDataInfo;
/**
* 比例表
*
* @author klp
* @date 2026-07-06
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/pltcm/ratio")
public class SchRatioController extends BaseController {
private final ISchRatioService iSchRatioService;
/**
* 查询比例列表
*/
@GetMapping("/list")
public TableDataInfo<SchRatioVo> list(SchRatioBo bo, PageQuery pageQuery) {
return iSchRatioService.queryPageList(bo, pageQuery);
}
/**
* 导出比例列表
*/
@Log(title = "比例表", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(SchRatioBo bo, HttpServletResponse response) {
List<SchRatioVo> list = iSchRatioService.queryList(bo);
ExcelUtil.exportExcel(list, "比例表", SchRatioVo.class, response);
}
/**
* 获取比例详细信息
*
* @param id 主键
*/
@GetMapping("/{id}")
public R<SchRatioVo> getInfo(@NotNull(message = "主键不能为空")
@PathVariable Long id) {
return R.ok(iSchRatioService.queryById(id));
}
/**
* 新增比例
*/
@Log(title = "比例表", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody SchRatioBo bo) {
return toAjax(iSchRatioService.insertByBo(bo));
}
/**
* 修改比例
*/
@Log(title = "比例表", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody SchRatioBo bo) {
return toAjax(iSchRatioService.updateByBo(bo));
}
/**
* 删除比例
*
* @param ids 主键串
*/
@Log(title = "比例表", businessType = BusinessType.DELETE)
@DeleteMapping("/{ids}")
public R<Void> remove(@NotEmpty(message = "主键不能为空")
@PathVariable Long[] ids) {
return toAjax(iSchRatioService.deleteWithValidByIds(Arrays.asList(ids), true));
}
}

View File

@@ -0,0 +1,98 @@
package com.klp.pltcm.controller;
import java.util.List;
import lombok.RequiredArgsConstructor;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.*;
import org.springframework.web.bind.annotation.*;
import org.springframework.validation.annotation.Validated;
import com.klp.common.annotation.RepeatSubmit;
import com.klp.common.annotation.Log;
import com.klp.common.core.controller.BaseController;
import com.klp.common.core.domain.PageQuery;
import com.klp.common.core.domain.R;
import com.klp.common.core.validate.AddGroup;
import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
import com.klp.pltcm.domain.vo.TdbSteelgradeVo;
import com.klp.pltcm.domain.bo.TdbSteelgradeBo;
import com.klp.pltcm.service.ITdbSteelgradeService;
import com.klp.common.core.page.TableDataInfo;
/**
* 钢种分类
*
* @author klp
* @date 2026-07-06
*/
@Validated
@RequiredArgsConstructor
@RestController
@RequestMapping("/pltcm/steelgrade")
public class TdbSteelgradeController extends BaseController {
private final ITdbSteelgradeService iTdbSteelgradeService;
/**
* 查询钢种分类列表
*/
@GetMapping("/list")
public TableDataInfo<TdbSteelgradeVo> list(TdbSteelgradeBo bo, PageQuery pageQuery) {
return iTdbSteelgradeService.queryPageList(bo, pageQuery);
}
/**
* 导出钢种分类列表
*/
@Log(title = "钢种分类", businessType = BusinessType.EXPORT)
@PostMapping("/export")
public void export(TdbSteelgradeBo bo, HttpServletResponse response) {
List<TdbSteelgradeVo> list = iTdbSteelgradeService.queryList(bo);
ExcelUtil.exportExcel(list, "钢种分类", TdbSteelgradeVo.class, response);
}
/**
* 获取钢种分类详细信息
*
* @param steelGrade 钢种名(主键)
*/
@GetMapping("/{steelGrade}")
public R<TdbSteelgradeVo> getInfo(@NotBlank(message = "钢种名不能为空")
@PathVariable String steelGrade) {
return R.ok(iTdbSteelgradeService.queryById(steelGrade));
}
/**
* 新增钢种分类
*/
@Log(title = "钢种分类", businessType = BusinessType.INSERT)
@RepeatSubmit()
@PostMapping()
public R<Void> add(@Validated(AddGroup.class) @RequestBody TdbSteelgradeBo bo) {
return toAjax(iTdbSteelgradeService.insertByBo(bo));
}
/**
* 修改钢种分类
*/
@Log(title = "钢种分类", businessType = BusinessType.UPDATE)
@RepeatSubmit()
@PutMapping()
public R<Void> edit(@Validated(EditGroup.class) @RequestBody TdbSteelgradeBo bo) {
return toAjax(iTdbSteelgradeService.updateByBo(bo));
}
/**
* 删除钢种分类
*
* @param steelGrades 钢种名串
*/
@Log(title = "钢种分类", businessType = BusinessType.DELETE)
@DeleteMapping("/{steelGrades}")
public R<Void> remove(@NotEmpty(message = "钢种名不能为空")
@PathVariable String[] steelGrades) {
return toAjax(iTdbSteelgradeService.deleteWithValidByIds(java.util.Arrays.asList(steelGrades), true));
}
}

View File

@@ -0,0 +1,35 @@
package com.klp.pltcm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 设备启用状态 mod_device_enable
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mod_device_enable")
public class ModDeviceEnable extends BaseEntity {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String deviceCode;
private String deviceName;
private String deviceType;
private String workshop;
private String lineName;
private Integer isEnabled;
private Integer sortOrder;
private String remark;
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,47 @@
package com.klp.pltcm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 策略关联表 mod_strategy
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mod_strategy")
public class ModStrategy extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 分类ID
*/
private Long classId;
/**
* 比例表ID
*/
private Long ratioTableid;
/**
* 策略ID
*/
private Long strategyId;
/**
* 删除标志(0正常 1删除)
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 厚度分类 mod_thick_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mod_thick_class")
public class ModThickClass extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 分类ID
*/
@TableId(value = "class_id", type = IdType.INPUT)
private Long classId;
/**
* 边界值
*/
private Double border;
/**
* 描述
*/
private String description;
/**
* 录入日期
*/
private Date insDate;
/**
* 删除标志(0正常 1删除)
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 宽度分类 mod_width_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mod_width_class")
public class ModWidthClass extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 分类ID
*/
@TableId(value = "class_id", type = IdType.INPUT)
private Long classId;
/**
* 边界值
*/
private Double border;
/**
* 描述
*/
private String description;
/**
* 录入日期
*/
private Date insDate;
/**
* 删除标志(0正常 1删除)
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 屈服强度分类 mod_yield_stress_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("mod_yield_stress_class")
public class ModYieldStressClass extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 分类ID
*/
@TableId(value = "class_id", type = IdType.INPUT)
private Long classId;
/**
* 边界值
*/
private Double border;
/**
* 描述
*/
private String description;
/**
* 录入日期
*/
private Date insDate;
/**
* 删除标志(0正常 1删除)
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,114 @@
package com.klp.pltcm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 比例表 sch_ratio
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("sch_ratio")
public class SchRatio extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 比例索引
*/
private Long ratioIndex;
/**
* 比例表ID
*/
private Long ratioTableid;
/**
* 厚度ID
*/
private Long thickId;
/**
* 比例
*/
private Double ratio;
/**
* 标准0
*/
private Double stand0;
/**
* 标准1
*/
private Double stand1;
/**
* 标准2
*/
private Double stand2;
/**
* 标准3
*/
private Double stand3;
/**
* 标准4
*/
private Double stand4;
/**
* 标准5
*/
private Double stand5;
/**
* 标准6
*/
private Double stand6;
/**
* 标准7
*/
private Double stand7;
/**
* 标准8
*/
private Double stand8;
/**
* 标准9
*/
private Double stand9;
/**
* 录入日期
*/
private Date insDate;
/**
* 合计(STAND0-STAND9之和)
*/
private Double total;
/**
* 删除标志(0正常 1删除)
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,65 @@
package com.klp.pltcm.domain;
import com.baomidou.mybatisplus.annotation.*;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
* 钢种分类 tdb_steelgrade
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
@TableName("tdb_steelgrade")
public class TdbSteelgrade extends BaseEntity {
private static final long serialVersionUID = 1L;
/**
* 钢种名
*/
@TableId(value = "steel_grade", type = IdType.INPUT)
private String steelGrade;
/**
* 冲压级别
*/
private String drawingGrade;
/**
* 屈服强度
*/
private BigDecimal yieldStress;
/**
* 屈服等级
*/
private BigDecimal yieldClass;
/**
* 录入日期
*/
private Date insDate;
/**
* 内容/备注
*/
private String content;
/**
* 焊接代码
*/
private Long weldCode;
/**
* 删除标志(0正常 1删除)
*/
@TableLogic
private Long delFlag;
}

View File

@@ -0,0 +1,19 @@
package com.klp.pltcm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = true)
public class ModDeviceEnableBo extends BaseEntity {
private Long id;
private String deviceCode;
private String deviceName;
private String deviceType;
private String workshop;
private String lineName;
private Integer isEnabled;
private Integer sortOrder;
private String remark;
}

View File

@@ -0,0 +1,36 @@
package com.klp.pltcm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* 策略关联业务对象 mod_strategy
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ModStrategyBo extends BaseEntity {
/**
* 主键ID
*/
private Long id;
/**
* 分类ID
*/
private Long classId;
/**
* 比例表ID
*/
private Long ratioTableid;
/**
* 策略ID
*/
private Long strategyId;
}

View File

@@ -0,0 +1,38 @@
package com.klp.pltcm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 厚度分类业务对象 mod_thick_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ModThickClassBo extends BaseEntity {
/**
* 分类ID
*/
private Long classId;
/**
* 边界值
*/
private Double border;
/**
* 描述
*/
private String description;
/**
* 录入日期
*/
private Date insDate;
}

View File

@@ -0,0 +1,38 @@
package com.klp.pltcm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 宽度分类业务对象 mod_width_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ModWidthClassBo extends BaseEntity {
/**
* 分类ID
*/
private Long classId;
/**
* 边界值
*/
private Double border;
/**
* 描述
*/
private String description;
/**
* 录入日期
*/
private Date insDate;
}

View File

@@ -0,0 +1,38 @@
package com.klp.pltcm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 屈服强度分类业务对象 mod_yield_stress_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class ModYieldStressClassBo extends BaseEntity {
/**
* 分类ID
*/
private Long classId;
/**
* 边界值
*/
private Double border;
/**
* 描述
*/
private String description;
/**
* 录入日期
*/
private Date insDate;
}

View File

@@ -0,0 +1,103 @@
package com.klp.pltcm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
/**
* 比例表业务对象 sch_ratio
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class SchRatioBo extends BaseEntity {
/**
* 主键ID
*/
private Long id;
/**
* 比例索引
*/
private Long ratioIndex;
/**
* 比例表ID
*/
private Long ratioTableid;
/**
* 厚度ID
*/
private Long thickId;
/**
* 比例
*/
private Double ratio;
/**
* 标准0
*/
private Double stand0;
/**
* 标准1
*/
private Double stand1;
/**
* 标准2
*/
private Double stand2;
/**
* 标准3
*/
private Double stand3;
/**
* 标准4
*/
private Double stand4;
/**
* 标准5
*/
private Double stand5;
/**
* 标准6
*/
private Double stand6;
/**
* 标准7
*/
private Double stand7;
/**
* 标准8
*/
private Double stand8;
/**
* 标准9
*/
private Double stand9;
/**
* 录入日期
*/
private Date insDate;
/**
* 合计
*/
private Double total;
}

View File

@@ -0,0 +1,54 @@
package com.klp.pltcm.domain.bo;
import com.klp.common.core.domain.BaseEntity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.math.BigDecimal;
import java.util.Date;
/**
* 钢种分类业务对象 tdb_steelgrade
*
* @author klp
* @date 2026-07-06
*/
@Data
@EqualsAndHashCode(callSuper = true)
public class TdbSteelgradeBo extends BaseEntity {
/**
* 钢种名
*/
private String steelGrade;
/**
* 冲压级别
*/
private String drawingGrade;
/**
* 屈服强度
*/
private BigDecimal yieldStress;
/**
* 屈服等级
*/
private BigDecimal yieldClass;
/**
* 录入日期
*/
private Date insDate;
/**
* 内容/备注
*/
private String content;
/**
* 焊接代码
*/
private Long weldCode;
}

View File

@@ -0,0 +1,35 @@
package com.klp.pltcm.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
@Data
@ExcelIgnoreUnannotated
public class ModDeviceEnableVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "主键ID")
private Long id;
@ExcelProperty(value = "设备编码")
private String deviceCode;
@ExcelProperty(value = "设备名称")
private String deviceName;
@ExcelProperty(value = "设备类型")
private String deviceType;
@ExcelProperty(value = "所属车间")
private String workshop;
@ExcelProperty(value = "所属产线")
private String lineName;
@ExcelProperty(value = "是否启用")
private Integer isEnabled;
@ExcelProperty(value = "排序")
private Integer sortOrder;
@ExcelProperty(value = "备注")
private String remark;
@ExcelProperty(value = "创建时间")
private Date createTime;
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,38 @@
package com.klp.pltcm.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 策略关联视图对象 mod_strategy
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class ModStrategyVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "主键ID")
private Long id;
@ExcelProperty(value = "分类ID")
private Long classId;
@ExcelProperty(value = "比例表ID")
private Long ratioTableid;
@ExcelProperty(value = "策略ID")
private Long strategyId;
@ExcelProperty(value = "创建时间")
private Date createTime;
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,38 @@
package com.klp.pltcm.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 厚度分类视图对象 mod_thick_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class ModThickClassVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "分类ID")
private Long classId;
@ExcelProperty(value = "边界值")
private Double border;
@ExcelProperty(value = "描述")
private String description;
@ExcelProperty(value = "录入日期")
private Date insDate;
@ExcelProperty(value = "创建时间")
private Date createTime;
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,38 @@
package com.klp.pltcm.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 宽度分类视图对象 mod_width_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class ModWidthClassVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "分类ID")
private Long classId;
@ExcelProperty(value = "边界值")
private Double border;
@ExcelProperty(value = "描述")
private String description;
@ExcelProperty(value = "录入日期")
private Date insDate;
@ExcelProperty(value = "创建时间")
private Date createTime;
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,38 @@
package com.klp.pltcm.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 屈服强度分类视图对象 mod_yield_stress_class
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class ModYieldStressClassVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "分类ID")
private Long classId;
@ExcelProperty(value = "边界值")
private Double border;
@ExcelProperty(value = "描述")
private String description;
@ExcelProperty(value = "录入日期")
private Date insDate;
@ExcelProperty(value = "创建时间")
private Date createTime;
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,77 @@
package com.klp.pltcm.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.util.Date;
/**
* 比例表视图对象 sch_ratio
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class SchRatioVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "主键ID")
private Long id;
@ExcelProperty(value = "比例索引")
private Long ratioIndex;
@ExcelProperty(value = "比例表ID")
private Long ratioTableid;
@ExcelProperty(value = "厚度ID")
private Long thickId;
@ExcelProperty(value = "比例")
private Double ratio;
@ExcelProperty(value = "标准0")
private Double stand0;
@ExcelProperty(value = "标准1")
private Double stand1;
@ExcelProperty(value = "标准2")
private Double stand2;
@ExcelProperty(value = "标准3")
private Double stand3;
@ExcelProperty(value = "标准4")
private Double stand4;
@ExcelProperty(value = "标准5")
private Double stand5;
@ExcelProperty(value = "标准6")
private Double stand6;
@ExcelProperty(value = "标准7")
private Double stand7;
@ExcelProperty(value = "标准8")
private Double stand8;
@ExcelProperty(value = "标准9")
private Double stand9;
@ExcelProperty(value = "录入日期")
private Date insDate;
@ExcelProperty(value = "合计")
private Double total;
@ExcelProperty(value = "创建时间")
private Date createTime;
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,48 @@
package com.klp.pltcm.domain.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
* 钢种分类视图对象 tdb_steelgrade
*
* @author klp
* @date 2026-07-06
*/
@Data
@ExcelIgnoreUnannotated
public class TdbSteelgradeVo {
private static final long serialVersionUID = 1L;
@ExcelProperty(value = "钢种名")
private String steelGrade;
@ExcelProperty(value = "冲压级别")
private String drawingGrade;
@ExcelProperty(value = "屈服强度")
private BigDecimal yieldStress;
@ExcelProperty(value = "屈服等级")
private BigDecimal yieldClass;
@ExcelProperty(value = "录入日期")
private Date insDate;
@ExcelProperty(value = "内容/备注")
private String content;
@ExcelProperty(value = "焊接代码")
private Long weldCode;
@ExcelProperty(value = "创建时间")
private Date createTime;
@ExcelProperty(value = "更新时间")
private Date updateTime;
}

View File

@@ -0,0 +1,8 @@
package com.klp.pltcm.mapper;
import com.klp.pltcm.domain.ModDeviceEnable;
import com.klp.pltcm.domain.vo.ModDeviceEnableVo;
import com.klp.common.core.mapper.BaseMapperPlus;
public interface ModDeviceEnableMapper extends BaseMapperPlus<ModDeviceEnableMapper, ModDeviceEnable, ModDeviceEnableVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.pltcm.mapper;
import com.klp.pltcm.domain.ModStrategy;
import com.klp.pltcm.domain.vo.ModStrategyVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 策略关联Mapper接口
*
* @author klp
* @date 2026-07-06
*/
public interface ModStrategyMapper extends BaseMapperPlus<ModStrategyMapper, ModStrategy, ModStrategyVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.pltcm.mapper;
import com.klp.pltcm.domain.ModThickClass;
import com.klp.pltcm.domain.vo.ModThickClassVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 厚度分类Mapper接口
*
* @author klp
* @date 2026-07-06
*/
public interface ModThickClassMapper extends BaseMapperPlus<ModThickClassMapper, ModThickClass, ModThickClassVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.pltcm.mapper;
import com.klp.pltcm.domain.ModWidthClass;
import com.klp.pltcm.domain.vo.ModWidthClassVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 宽度分类Mapper接口
*
* @author klp
* @date 2026-07-06
*/
public interface ModWidthClassMapper extends BaseMapperPlus<ModWidthClassMapper, ModWidthClass, ModWidthClassVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.pltcm.mapper;
import com.klp.pltcm.domain.ModYieldStressClass;
import com.klp.pltcm.domain.vo.ModYieldStressClassVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 屈服强度分类Mapper接口
*
* @author klp
* @date 2026-07-06
*/
public interface ModYieldStressClassMapper extends BaseMapperPlus<ModYieldStressClassMapper, ModYieldStressClass, ModYieldStressClassVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.pltcm.mapper;
import com.klp.pltcm.domain.SchRatio;
import com.klp.pltcm.domain.vo.SchRatioVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 比例表Mapper接口
*
* @author klp
* @date 2026-07-06
*/
public interface SchRatioMapper extends BaseMapperPlus<SchRatioMapper, SchRatio, SchRatioVo> {
}

View File

@@ -0,0 +1,15 @@
package com.klp.pltcm.mapper;
import com.klp.pltcm.domain.TdbSteelgrade;
import com.klp.pltcm.domain.vo.TdbSteelgradeVo;
import com.klp.common.core.mapper.BaseMapperPlus;
/**
* 钢种分类Mapper接口
*
* @author klp
* @date 2026-07-06
*/
public interface TdbSteelgradeMapper extends BaseMapperPlus<TdbSteelgradeMapper, TdbSteelgrade, TdbSteelgradeVo> {
}

View File

@@ -0,0 +1,17 @@
package com.klp.pltcm.service;
import com.klp.pltcm.domain.vo.ModDeviceEnableVo;
import com.klp.pltcm.domain.bo.ModDeviceEnableBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
public interface IModDeviceEnableService {
ModDeviceEnableVo queryById(Long id);
TableDataInfo<ModDeviceEnableVo> queryPageList(ModDeviceEnableBo bo, PageQuery pageQuery);
List<ModDeviceEnableVo> queryList(ModDeviceEnableBo bo);
Boolean insertByBo(ModDeviceEnableBo bo);
Boolean updateByBo(ModDeviceEnableBo bo);
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.service;
import com.klp.pltcm.domain.ModStrategy;
import com.klp.pltcm.domain.vo.ModStrategyVo;
import com.klp.pltcm.domain.bo.ModStrategyBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 策略关联Service接口
*
* @author klp
* @date 2026-07-06
*/
public interface IModStrategyService {
/**
* 查询策略关联
*/
ModStrategyVo queryById(Long id);
/**
* 查询策略关联列表
*/
TableDataInfo<ModStrategyVo> queryPageList(ModStrategyBo bo, PageQuery pageQuery);
/**
* 查询策略关联列表
*/
List<ModStrategyVo> queryList(ModStrategyBo bo);
/**
* 新增策略关联
*/
Boolean insertByBo(ModStrategyBo bo);
/**
* 修改策略关联
*/
Boolean updateByBo(ModStrategyBo bo);
/**
* 校验并批量删除策略关联信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.service;
import com.klp.pltcm.domain.ModThickClass;
import com.klp.pltcm.domain.vo.ModThickClassVo;
import com.klp.pltcm.domain.bo.ModThickClassBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 厚度分类Service接口
*
* @author klp
* @date 2026-07-06
*/
public interface IModThickClassService {
/**
* 查询厚度分类
*/
ModThickClassVo queryById(Long classId);
/**
* 查询厚度分类列表
*/
TableDataInfo<ModThickClassVo> queryPageList(ModThickClassBo bo, PageQuery pageQuery);
/**
* 查询厚度分类列表
*/
List<ModThickClassVo> queryList(ModThickClassBo bo);
/**
* 新增厚度分类
*/
Boolean insertByBo(ModThickClassBo bo);
/**
* 修改厚度分类
*/
Boolean updateByBo(ModThickClassBo bo);
/**
* 校验并批量删除厚度分类信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.service;
import com.klp.pltcm.domain.ModWidthClass;
import com.klp.pltcm.domain.vo.ModWidthClassVo;
import com.klp.pltcm.domain.bo.ModWidthClassBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 宽度分类Service接口
*
* @author klp
* @date 2026-07-06
*/
public interface IModWidthClassService {
/**
* 查询宽度分类
*/
ModWidthClassVo queryById(Long classId);
/**
* 查询宽度分类列表
*/
TableDataInfo<ModWidthClassVo> queryPageList(ModWidthClassBo bo, PageQuery pageQuery);
/**
* 查询宽度分类列表
*/
List<ModWidthClassVo> queryList(ModWidthClassBo bo);
/**
* 新增宽度分类
*/
Boolean insertByBo(ModWidthClassBo bo);
/**
* 修改宽度分类
*/
Boolean updateByBo(ModWidthClassBo bo);
/**
* 校验并批量删除宽度分类信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.service;
import com.klp.pltcm.domain.ModYieldStressClass;
import com.klp.pltcm.domain.vo.ModYieldStressClassVo;
import com.klp.pltcm.domain.bo.ModYieldStressClassBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 屈服强度分类Service接口
*
* @author klp
* @date 2026-07-06
*/
public interface IModYieldStressClassService {
/**
* 查询屈服强度分类
*/
ModYieldStressClassVo queryById(Long classId);
/**
* 查询屈服强度分类列表
*/
TableDataInfo<ModYieldStressClassVo> queryPageList(ModYieldStressClassBo bo, PageQuery pageQuery);
/**
* 查询屈服强度分类列表
*/
List<ModYieldStressClassVo> queryList(ModYieldStressClassBo bo);
/**
* 新增屈服强度分类
*/
Boolean insertByBo(ModYieldStressClassBo bo);
/**
* 修改屈服强度分类
*/
Boolean updateByBo(ModYieldStressClassBo bo);
/**
* 校验并批量删除屈服强度分类信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,49 @@
package com.klp.pltcm.service;
import com.klp.pltcm.domain.SchRatio;
import com.klp.pltcm.domain.vo.SchRatioVo;
import com.klp.pltcm.domain.bo.SchRatioBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 比例表Service接口
*
* @author klp
* @date 2026-07-06
*/
public interface ISchRatioService {
/**
* 查询比例
*/
SchRatioVo queryById(Long id);
/**
* 查询比例列表
*/
TableDataInfo<SchRatioVo> queryPageList(SchRatioBo bo, PageQuery pageQuery);
/**
* 查询比例列表
*/
List<SchRatioVo> queryList(SchRatioBo bo);
/**
* 新增比例
*/
Boolean insertByBo(SchRatioBo bo);
/**
* 修改比例
*/
Boolean updateByBo(SchRatioBo bo);
/**
* 校验并批量删除比例信息
*/
Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);
}

View File

@@ -0,0 +1,48 @@
package com.klp.pltcm.service;
import com.klp.pltcm.domain.vo.TdbSteelgradeVo;
import com.klp.pltcm.domain.bo.TdbSteelgradeBo;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import java.util.Collection;
import java.util.List;
/**
* 钢种分类Service接口
*
* @author klp
* @date 2026-07-06
*/
public interface ITdbSteelgradeService {
/**
* 查询钢种分类
*/
TdbSteelgradeVo queryById(String steelGrade);
/**
* 查询钢种分类列表
*/
TableDataInfo<TdbSteelgradeVo> queryPageList(TdbSteelgradeBo bo, PageQuery pageQuery);
/**
* 查询钢种分类列表
*/
List<TdbSteelgradeVo> queryList(TdbSteelgradeBo bo);
/**
* 新增钢种分类
*/
Boolean insertByBo(TdbSteelgradeBo bo);
/**
* 修改钢种分类
*/
Boolean updateByBo(TdbSteelgradeBo bo);
/**
* 校验并批量删除钢种分类信息
*/
Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid);
}

View File

@@ -0,0 +1,81 @@
package com.klp.pltcm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.pltcm.domain.bo.ModDeviceEnableBo;
import com.klp.pltcm.domain.vo.ModDeviceEnableVo;
import com.klp.pltcm.domain.ModDeviceEnable;
import com.klp.pltcm.mapper.ModDeviceEnableMapper;
import com.klp.pltcm.service.IModDeviceEnableService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
@RequiredArgsConstructor
@Service
public class ModDeviceEnableServiceImpl implements IModDeviceEnableService {
private final ModDeviceEnableMapper baseMapper;
@Override
public ModDeviceEnableVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@Override
public TableDataInfo<ModDeviceEnableVo> queryPageList(ModDeviceEnableBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ModDeviceEnable> lqw = buildQueryWrapper(bo);
Page<ModDeviceEnableVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<ModDeviceEnableVo> queryList(ModDeviceEnableBo bo) {
LambdaQueryWrapper<ModDeviceEnable> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ModDeviceEnable> buildQueryWrapper(ModDeviceEnableBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ModDeviceEnable> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getDeviceCode()), ModDeviceEnable::getDeviceCode, bo.getDeviceCode());
lqw.like(StringUtils.isNotBlank(bo.getDeviceName()), ModDeviceEnable::getDeviceName, bo.getDeviceName());
lqw.eq(StringUtils.isNotBlank(bo.getDeviceType()), ModDeviceEnable::getDeviceType, bo.getDeviceType());
lqw.like(StringUtils.isNotBlank(bo.getWorkshop()), ModDeviceEnable::getWorkshop, bo.getWorkshop());
lqw.like(StringUtils.isNotBlank(bo.getLineName()), ModDeviceEnable::getLineName, bo.getLineName());
lqw.eq(bo.getIsEnabled() != null, ModDeviceEnable::getIsEnabled, bo.getIsEnabled());
lqw.orderByAsc(ModDeviceEnable::getSortOrder);
return lqw;
}
@Override
public Boolean insertByBo(ModDeviceEnableBo bo) {
ModDeviceEnable add = BeanUtil.toBean(bo, ModDeviceEnable.class);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
@Override
public Boolean updateByBo(ModDeviceEnableBo bo) {
ModDeviceEnable update = BeanUtil.toBean(bo, ModDeviceEnable.class);
return baseMapper.updateById(update) > 0;
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,83 @@
package com.klp.pltcm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.pltcm.domain.bo.ModStrategyBo;
import com.klp.pltcm.domain.vo.ModStrategyVo;
import com.klp.pltcm.domain.ModStrategy;
import com.klp.pltcm.mapper.ModStrategyMapper;
import com.klp.pltcm.service.IModStrategyService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 策略关联Service业务层处理
*
* @author klp
* @date 2026-07-06
*/
@RequiredArgsConstructor
@Service
public class ModStrategyServiceImpl implements IModStrategyService {
private final ModStrategyMapper baseMapper;
@Override
public ModStrategyVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@Override
public TableDataInfo<ModStrategyVo> queryPageList(ModStrategyBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ModStrategy> lqw = buildQueryWrapper(bo);
Page<ModStrategyVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<ModStrategyVo> queryList(ModStrategyBo bo) {
LambdaQueryWrapper<ModStrategy> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ModStrategy> buildQueryWrapper(ModStrategyBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ModStrategy> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getClassId() != null, ModStrategy::getClassId, bo.getClassId());
lqw.eq(bo.getRatioTableid() != null, ModStrategy::getRatioTableid, bo.getRatioTableid());
lqw.eq(bo.getStrategyId() != null, ModStrategy::getStrategyId, bo.getStrategyId());
return lqw;
}
@Override
public Boolean insertByBo(ModStrategyBo bo) {
ModStrategy add = BeanUtil.toBean(bo, ModStrategy.class);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
@Override
public Boolean updateByBo(ModStrategyBo bo) {
ModStrategy update = BeanUtil.toBean(bo, ModStrategy.class);
return baseMapper.updateById(update) > 0;
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,85 @@
package com.klp.pltcm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.pltcm.domain.bo.ModThickClassBo;
import com.klp.pltcm.domain.vo.ModThickClassVo;
import com.klp.pltcm.domain.ModThickClass;
import com.klp.pltcm.mapper.ModThickClassMapper;
import com.klp.pltcm.service.IModThickClassService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 厚度分类Service业务层处理
*
* @author klp
* @date 2026-07-06
*/
@RequiredArgsConstructor
@Service
public class ModThickClassServiceImpl implements IModThickClassService {
private final ModThickClassMapper baseMapper;
@Override
public ModThickClassVo queryById(Long classId) {
return baseMapper.selectVoById(classId);
}
@Override
public TableDataInfo<ModThickClassVo> queryPageList(ModThickClassBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ModThickClass> lqw = buildQueryWrapper(bo);
Page<ModThickClassVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<ModThickClassVo> queryList(ModThickClassBo bo) {
LambdaQueryWrapper<ModThickClass> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ModThickClass> buildQueryWrapper(ModThickClassBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ModThickClass> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getClassId() != null, ModThickClass::getClassId, bo.getClassId());
lqw.eq(bo.getBorder() != null, ModThickClass::getBorder, bo.getBorder());
lqw.like(StringUtils.isNotBlank(bo.getDescription()), ModThickClass::getDescription, bo.getDescription());
lqw.orderByAsc(ModThickClass::getClassId);
return lqw;
}
@Override
public Boolean insertByBo(ModThickClassBo bo) {
ModThickClass add = BeanUtil.toBean(bo, ModThickClass.class);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setClassId(add.getClassId());
}
return flag;
}
@Override
public Boolean updateByBo(ModThickClassBo bo) {
ModThickClass update = BeanUtil.toBean(bo, ModThickClass.class);
return baseMapper.updateById(update) > 0;
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,85 @@
package com.klp.pltcm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.pltcm.domain.bo.ModWidthClassBo;
import com.klp.pltcm.domain.vo.ModWidthClassVo;
import com.klp.pltcm.domain.ModWidthClass;
import com.klp.pltcm.mapper.ModWidthClassMapper;
import com.klp.pltcm.service.IModWidthClassService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 宽度分类Service业务层处理
*
* @author klp
* @date 2026-07-06
*/
@RequiredArgsConstructor
@Service
public class ModWidthClassServiceImpl implements IModWidthClassService {
private final ModWidthClassMapper baseMapper;
@Override
public ModWidthClassVo queryById(Long classId) {
return baseMapper.selectVoById(classId);
}
@Override
public TableDataInfo<ModWidthClassVo> queryPageList(ModWidthClassBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ModWidthClass> lqw = buildQueryWrapper(bo);
Page<ModWidthClassVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<ModWidthClassVo> queryList(ModWidthClassBo bo) {
LambdaQueryWrapper<ModWidthClass> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ModWidthClass> buildQueryWrapper(ModWidthClassBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ModWidthClass> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getClassId() != null, ModWidthClass::getClassId, bo.getClassId());
lqw.eq(bo.getBorder() != null, ModWidthClass::getBorder, bo.getBorder());
lqw.like(StringUtils.isNotBlank(bo.getDescription()), ModWidthClass::getDescription, bo.getDescription());
lqw.orderByAsc(ModWidthClass::getClassId);
return lqw;
}
@Override
public Boolean insertByBo(ModWidthClassBo bo) {
ModWidthClass add = BeanUtil.toBean(bo, ModWidthClass.class);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setClassId(add.getClassId());
}
return flag;
}
@Override
public Boolean updateByBo(ModWidthClassBo bo) {
ModWidthClass update = BeanUtil.toBean(bo, ModWidthClass.class);
return baseMapper.updateById(update) > 0;
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,85 @@
package com.klp.pltcm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.pltcm.domain.bo.ModYieldStressClassBo;
import com.klp.pltcm.domain.vo.ModYieldStressClassVo;
import com.klp.pltcm.domain.ModYieldStressClass;
import com.klp.pltcm.mapper.ModYieldStressClassMapper;
import com.klp.pltcm.service.IModYieldStressClassService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 屈服强度分类Service业务层处理
*
* @author klp
* @date 2026-07-06
*/
@RequiredArgsConstructor
@Service
public class ModYieldStressClassServiceImpl implements IModYieldStressClassService {
private final ModYieldStressClassMapper baseMapper;
@Override
public ModYieldStressClassVo queryById(Long classId) {
return baseMapper.selectVoById(classId);
}
@Override
public TableDataInfo<ModYieldStressClassVo> queryPageList(ModYieldStressClassBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<ModYieldStressClass> lqw = buildQueryWrapper(bo);
Page<ModYieldStressClassVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<ModYieldStressClassVo> queryList(ModYieldStressClassBo bo) {
LambdaQueryWrapper<ModYieldStressClass> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<ModYieldStressClass> buildQueryWrapper(ModYieldStressClassBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<ModYieldStressClass> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getClassId() != null, ModYieldStressClass::getClassId, bo.getClassId());
lqw.eq(bo.getBorder() != null, ModYieldStressClass::getBorder, bo.getBorder());
lqw.like(StringUtils.isNotBlank(bo.getDescription()), ModYieldStressClass::getDescription, bo.getDescription());
lqw.orderByAsc(ModYieldStressClass::getClassId);
return lqw;
}
@Override
public Boolean insertByBo(ModYieldStressClassBo bo) {
ModYieldStressClass add = BeanUtil.toBean(bo, ModYieldStressClass.class);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setClassId(add.getClassId());
}
return flag;
}
@Override
public Boolean updateByBo(ModYieldStressClassBo bo) {
ModYieldStressClass update = BeanUtil.toBean(bo, ModYieldStressClass.class);
return baseMapper.updateById(update) > 0;
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,104 @@
package com.klp.pltcm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.pltcm.domain.bo.SchRatioBo;
import com.klp.pltcm.domain.vo.SchRatioVo;
import com.klp.pltcm.domain.SchRatio;
import com.klp.pltcm.mapper.SchRatioMapper;
import com.klp.pltcm.service.ISchRatioService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 比例表Service业务层处理
*
* @author klp
* @date 2026-07-06
*/
@RequiredArgsConstructor
@Service
public class SchRatioServiceImpl implements ISchRatioService {
private final SchRatioMapper baseMapper;
@Override
public SchRatioVo queryById(Long id) {
return baseMapper.selectVoById(id);
}
@Override
public TableDataInfo<SchRatioVo> queryPageList(SchRatioBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<SchRatio> lqw = buildQueryWrapper(bo);
Page<SchRatioVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<SchRatioVo> queryList(SchRatioBo bo) {
LambdaQueryWrapper<SchRatio> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<SchRatio> buildQueryWrapper(SchRatioBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<SchRatio> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getRatioIndex() != null, SchRatio::getRatioIndex, bo.getRatioIndex());
lqw.eq(bo.getRatioTableid() != null, SchRatio::getRatioTableid, bo.getRatioTableid());
lqw.eq(bo.getThickId() != null, SchRatio::getThickId, bo.getThickId());
lqw.eq(bo.getRatio() != null, SchRatio::getRatio, bo.getRatio());
return lqw;
}
@Override
public Boolean insertByBo(SchRatioBo bo) {
SchRatio add = BeanUtil.toBean(bo, SchRatio.class);
// 替代Oracle触发器: 计算STAND0-STAND9的合计值
calculateTotal(add);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setId(add.getId());
}
return flag;
}
@Override
public Boolean updateByBo(SchRatioBo bo) {
SchRatio update = BeanUtil.toBean(bo, SchRatio.class);
// 替代Oracle触发器: 计算STAND0-STAND9的合计值
calculateTotal(update);
return baseMapper.updateById(update) > 0;
}
/**
* 计算STAND0-STAND9之和 (替代Oracle触发器 TRG_BEF_SCH_RATIO)
*/
private void calculateTotal(SchRatio entity) {
double total = nvl(entity.getStand0()) + nvl(entity.getStand1())
+ nvl(entity.getStand2()) + nvl(entity.getStand3())
+ nvl(entity.getStand4()) + nvl(entity.getStand5())
+ nvl(entity.getStand6()) + nvl(entity.getStand7())
+ nvl(entity.getStand8()) + nvl(entity.getStand9());
entity.setTotal(total);
}
private double nvl(Double val) {
return val != null ? val : 0D;
}
@Override
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,87 @@
package com.klp.pltcm.service.impl;
import cn.hutool.core.bean.BeanUtil;
import com.klp.common.core.page.TableDataInfo;
import com.klp.common.core.domain.PageQuery;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.klp.common.utils.StringUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import com.klp.pltcm.domain.bo.TdbSteelgradeBo;
import com.klp.pltcm.domain.vo.TdbSteelgradeVo;
import com.klp.pltcm.domain.TdbSteelgrade;
import com.klp.pltcm.mapper.TdbSteelgradeMapper;
import com.klp.pltcm.service.ITdbSteelgradeService;
import java.util.List;
import java.util.Map;
import java.util.Collection;
/**
* 钢种分类Service业务层处理
*
* @author klp
* @date 2026-07-06
*/
@RequiredArgsConstructor
@Service
public class TdbSteelgradeServiceImpl implements ITdbSteelgradeService {
private final TdbSteelgradeMapper baseMapper;
@Override
public TdbSteelgradeVo queryById(String steelGrade) {
return baseMapper.selectVoById(steelGrade);
}
@Override
public TableDataInfo<TdbSteelgradeVo> queryPageList(TdbSteelgradeBo bo, PageQuery pageQuery) {
LambdaQueryWrapper<TdbSteelgrade> lqw = buildQueryWrapper(bo);
Page<TdbSteelgradeVo> result = baseMapper.selectVoPage(pageQuery.build(), lqw);
return TableDataInfo.build(result);
}
@Override
public List<TdbSteelgradeVo> queryList(TdbSteelgradeBo bo) {
LambdaQueryWrapper<TdbSteelgrade> lqw = buildQueryWrapper(bo);
return baseMapper.selectVoList(lqw);
}
private LambdaQueryWrapper<TdbSteelgrade> buildQueryWrapper(TdbSteelgradeBo bo) {
Map<String, Object> params = bo.getParams();
LambdaQueryWrapper<TdbSteelgrade> lqw = Wrappers.lambdaQuery();
lqw.like(StringUtils.isNotBlank(bo.getSteelGrade()), TdbSteelgrade::getSteelGrade, bo.getSteelGrade());
lqw.eq(StringUtils.isNotBlank(bo.getDrawingGrade()), TdbSteelgrade::getDrawingGrade, bo.getDrawingGrade());
lqw.eq(bo.getYieldStress() != null, TdbSteelgrade::getYieldStress, bo.getYieldStress());
lqw.eq(bo.getYieldClass() != null, TdbSteelgrade::getYieldClass, bo.getYieldClass());
lqw.like(StringUtils.isNotBlank(bo.getContent()), TdbSteelgrade::getContent, bo.getContent());
lqw.orderByAsc(TdbSteelgrade::getSteelGrade);
return lqw;
}
@Override
public Boolean insertByBo(TdbSteelgradeBo bo) {
TdbSteelgrade add = BeanUtil.toBean(bo, TdbSteelgrade.class);
boolean flag = baseMapper.insert(add) > 0;
if (flag) {
bo.setSteelGrade(add.getSteelGrade());
}
return flag;
}
@Override
public Boolean updateByBo(TdbSteelgradeBo bo) {
TdbSteelgrade update = BeanUtil.toBean(bo, TdbSteelgrade.class);
return baseMapper.updateById(update) > 0;
}
@Override
public Boolean deleteWithValidByIds(Collection<String> ids, Boolean isValid) {
if (isValid) {
// TODO 做一些业务上的校验,判断是否需要校验
}
return baseMapper.deleteBatchIds(ids) > 0;
}
}

View File

@@ -0,0 +1,20 @@
<?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.klp.pltcm.mapper.ModDeviceEnableMapper">
<resultMap type="com.klp.pltcm.domain.ModDeviceEnable" id="ModDeviceEnableResult">
<result property="id" column="id"/>
<result property="deviceCode" column="device_code"/>
<result property="deviceName" column="device_name"/>
<result property="deviceType" column="device_type"/>
<result property="workshop" column="workshop"/>
<result property="lineName" column="line_name"/>
<result property="isEnabled" column="is_enabled"/>
<result property="sortOrder" column="sort_order"/>
<result property="remark" column="remark"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,19 @@
<?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.klp.pltcm.mapper.ModStrategyMapper">
<resultMap type="com.klp.pltcm.domain.ModStrategy" id="ModStrategyResult">
<result property="id" column="id"/>
<result property="classId" column="class_id"/>
<result property="ratioTableid" column="ratio_tableid"/>
<result property="strategyId" column="strategy_id"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,19 @@
<?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.klp.pltcm.mapper.ModThickClassMapper">
<resultMap type="com.klp.pltcm.domain.ModThickClass" id="ModThickClassResult">
<result property="classId" column="class_id"/>
<result property="border" column="border"/>
<result property="description" column="description"/>
<result property="insDate" column="ins_date"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,19 @@
<?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.klp.pltcm.mapper.ModWidthClassMapper">
<resultMap type="com.klp.pltcm.domain.ModWidthClass" id="ModWidthClassResult">
<result property="classId" column="class_id"/>
<result property="border" column="border"/>
<result property="description" column="description"/>
<result property="insDate" column="ins_date"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,19 @@
<?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.klp.pltcm.mapper.ModYieldStressClassMapper">
<resultMap type="com.klp.pltcm.domain.ModYieldStressClass" id="ModYieldStressClassResult">
<result property="classId" column="class_id"/>
<result property="border" column="border"/>
<result property="description" column="description"/>
<result property="insDate" column="ins_date"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,32 @@
<?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.klp.pltcm.mapper.SchRatioMapper">
<resultMap type="com.klp.pltcm.domain.SchRatio" id="SchRatioResult">
<result property="id" column="id"/>
<result property="ratioIndex" column="ratio_index"/>
<result property="ratioTableid" column="ratio_tableid"/>
<result property="thickId" column="thick_id"/>
<result property="ratio" column="ratio"/>
<result property="stand0" column="stand0"/>
<result property="stand1" column="stand1"/>
<result property="stand2" column="stand2"/>
<result property="stand3" column="stand3"/>
<result property="stand4" column="stand4"/>
<result property="stand5" column="stand5"/>
<result property="stand6" column="stand6"/>
<result property="stand7" column="stand7"/>
<result property="stand8" column="stand8"/>
<result property="stand9" column="stand9"/>
<result property="insDate" column="ins_date"/>
<result property="total" column="total"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -0,0 +1,22 @@
<?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.klp.pltcm.mapper.TdbSteelgradeMapper">
<resultMap type="com.klp.pltcm.domain.TdbSteelgrade" id="TdbSteelgradeResult">
<result property="steelGrade" column="steel_grade"/>
<result property="drawingGrade" column="drawing_grade"/>
<result property="yieldStress" column="yield_stress"/>
<result property="yieldClass" column="yield_class"/>
<result property="insDate" column="ins_date"/>
<result property="content" column="content"/>
<result property="weldCode" column="weld_code"/>
<result property="createBy" column="create_by"/>
<result property="createTime" column="create_time"/>
<result property="updateBy" column="update_by"/>
<result property="updateTime" column="update_time"/>
<result property="delFlag" column="del_flag"/>
</resultMap>
</mapper>

View File

@@ -64,3 +64,13 @@ export function listTodayOrder(query) {
params: query params: query
}) })
} }
// 导出正式订单主列表(业务精简字段)
export function exportOrder(query) {
return request({
url: '/crm/order/exportDetail',
method: 'post',
data: query,
responseType: 'blob'
})
}

View File

@@ -42,3 +42,13 @@ export function delOrderItem(itemId) {
method: 'delete' method: 'delete'
}) })
} }
// 导出正式订单明细列表(业务精简字段)
export function exportOrderItem(query) {
return request({
url: '/crm/orderItem/exportDetail',
method: 'post',
data: query,
responseType: 'blob'
})
}

View File

@@ -1,7 +1,7 @@
<template> <template>
<div class="app-container cost-trend-page"> <div class="app-container cost-trend-page">
<!-- 筛选区 --> <!-- 筛选区 -->
<el-card class="mb8"> <el-card class="mb8 filter-card">
<div class="filter-bar"> <div class="filter-bar">
<el-radio-group <el-radio-group
v-model="selectedLine" v-model="selectedLine"
@@ -16,7 +16,6 @@
{{ line.lineName }} {{ line.lineName }}
</el-radio-button> </el-radio-button>
</el-radio-group> </el-radio-group>
<el-button type="primary" size="small" icon="el-icon-search" :loading="loading" @click="fetchData"> <el-button type="primary" size="small" icon="el-icon-search" :loading="loading" @click="fetchData">
查询 查询
</el-button> </el-button>
@@ -47,10 +46,10 @@
multiple multiple
collapse-tags collapse-tags
placeholder="成本类别(全部)" placeholder="成本类别(全部)"
size="small"
style="width:160px"
@change="onCategoryChange"
clearable clearable
size="small"
style="width:150px"
@change="onCategoryChange"
> >
<el-option label="原料" value="原料" /> <el-option label="原料" value="原料" />
<el-option label="能耗" value="能耗" /> <el-option label="能耗" value="能耗" />
@@ -67,10 +66,10 @@
collapse-tags collapse-tags
filterable filterable
placeholder="成本项(全部)" placeholder="成本项(全部)"
size="small"
style="width:220px"
@change="onItemChange"
clearable clearable
size="small"
style="width:200px"
@change="onItemChange"
> >
<el-option <el-option
v-for="it in filteredItemOptions" v-for="it in filteredItemOptions"
@@ -81,13 +80,21 @@
</el-select> </el-select>
</div> </div>
<!-- 图表区 --> <!-- 迷你图表网格 -->
<div class="chart-box" v-loading="loading"> <div v-loading="loading" class="mini-charts-grid">
<div ref="trendChart" class="chart-body" /> <template v-if="seriesList.length">
</div> <div v-for="s in seriesList" :key="s.key" class="mini-chart-card">
<div class="mini-chart-header">
<div v-if="summary.seriesCount > 15" class="legend-hint"> <span class="mini-chart-dot" :style="{ background: s.color }" />
<i class="el-icon-info" /> 图例较多可在下方图例区滚动查看或缩小筛选范围以减少趋势线数量 <span class="mini-chart-name">{{ s.name }}</span>
<span class="mini-chart-max">峰值 {{ formatMiniMax(s.maxVal) }}</span>
</div>
<div ref="miniCharts" class="mini-chart-body" />
</div>
</template>
<div v-else-if="!loading && reports.length" class="empty-hint">
暂无匹配的成本项数据
</div>
</div> </div>
</div> </div>
</template> </template>
@@ -116,7 +123,8 @@ export default {
selectedItems: [], selectedItems: [],
allItems: [], allItems: [],
loading: false, loading: false,
chart: null, chartInstances: [],
seriesList: [],
reports: [], reports: [],
cachedDetails: [], cachedDetails: [],
summary: { seriesCount: 0, maxLabel: '-' } summary: { seriesCount: 0, maxLabel: '-' }
@@ -128,10 +136,6 @@ export default {
if (!this.selectedLine || !this.productionLines.length) return null if (!this.selectedLine || !this.productionLines.length) return null
return this.productionLines.find(l => l.lineId === this.selectedLine) || null return this.productionLines.find(l => l.lineId === this.selectedLine) || null
}, },
lineNameDisplay() {
const line = this.selectedLineObj
return line ? line.lineName : ''
},
filteredItemOptions() { filteredItemOptions() {
if (!this.selectedCategories.length) return this.allItems if (!this.selectedCategories.length) return this.allItems
return this.allItems.filter(it => this.selectedCategories.includes(it.category)) return this.allItems.filter(it => this.selectedCategories.includes(it.category))
@@ -143,12 +147,12 @@ export default {
this.$nextTick(() => this.fetchData()) this.$nextTick(() => this.fetchData())
}) })
this.loadItems() this.loadItems()
this._resizeHandler = () => { if (this.chart) this.chart.resize() } this._resizeHandler = () => this.resizeAllCharts()
window.addEventListener('resize', this._resizeHandler) window.addEventListener('resize', this._resizeHandler)
}, },
beforeDestroy() { beforeDestroy() {
window.removeEventListener('resize', this._resizeHandler) window.removeEventListener('resize', this._resizeHandler)
if (this.chart) { this.chart.dispose(); this.chart = null } this.disposeAllCharts()
}, },
methods: { methods: {
initDefaultLine() { initDefaultLine() {
@@ -186,11 +190,9 @@ export default {
this.allItems = r.rows || [] this.allItems = r.rows || []
} catch (e) { /* ignore */ } } catch (e) { /* ignore */ }
}, },
async fetchData() { async fetchData() {
if (this.selectedLine == null) { if (this.selectedLine == null) return
return
}
this.loading = true this.loading = true
try { try {
@@ -204,13 +206,13 @@ export default {
const allReports = (reportRes.rows || []).sort((a, b) => { const allReports = (reportRes.rows || []).sort((a, b) => {
return (a.reportDate || '').localeCompare(b.reportDate || '') return (a.reportDate || '').localeCompare(b.reportDate || '')
}) })
console.log('[CostTrend] reports:', allReports.length, allReports.map(r => ({ id: r.reportId, title: r.reportTitle, date: r.reportDate })))
if (!allReports.length) { if (!allReports.length) {
this.$modal.msgWarning('该产线暂无报表') this.$modal.msgWarning('该产线暂无报表')
this.reports = [] this.reports = []
this.seriesList = []
this.summary = { seriesCount: 0, maxLabel: '-' } this.summary = { seriesCount: 0, maxLabel: '-' }
if (this.chart) this.chart.clear() this.disposeAllCharts()
return return
} }
this.reports = allReports this.reports = allReports
@@ -224,15 +226,11 @@ export default {
} }
}, },
// ==================== 成本项模式 ====================
async fetchDetailsAndCache(reports) { async fetchDetailsAndCache(reports) {
const allDetailResults = await Promise.all( const allDetailResults = await Promise.all(
reports.map(r => reports.map(r =>
listProdDetail({ reportId: r.reportId, pageNum: 1, pageSize: 99999 }) listProdDetail({ reportId: r.reportId, pageNum: 1, pageSize: 99999 })
.then(res => { .then(res => ({ reportId: r.reportId, rows: res.rows || [] }))
console.log('[CostTrend] detail for report', r.reportId, 'rows:', (res.rows || []).length)
return { reportId: r.reportId, rows: res.rows || [] }
})
.catch(e => { .catch(e => {
console.error('[CostTrend] detail fetch error for report', r.reportId, e) console.error('[CostTrend] detail fetch error for report', r.reportId, e)
return { reportId: r.reportId, rows: [] } return { reportId: r.reportId, rows: [] }
@@ -279,7 +277,7 @@ export default {
}) })
const xLabels = reports.map(r => this.reportLabel(r)) const xLabels = reports.map(r => this.reportLabel(r))
const series = [] const list = []
let globalMax = 0 let globalMax = 0
Array.from(allItemIds).forEach((key, idx) => { Array.from(allItemIds).forEach((key, idx) => {
@@ -288,115 +286,121 @@ export default {
const data = reports.map(r => { const data = reports.map(r => {
const sums = reportSums[r.reportId] || {} const sums = reportSums[r.reportId] || {}
const val = sums[key] ?? null const val = sums[key] ?? null
if (val != null && val > globalMax) globalMax = val
return val return val
}) })
if (data.every(v => v === null)) return if (data.every(v => v === null)) return
series.push({ const maxVal = Math.max(...data.filter(v => v != null))
if (maxVal > globalMax) globalMax = maxVal
list.push({
key,
name, name,
type: 'line', color: COLORS[idx % COLORS.length],
data, data,
smooth: true, xLabels,
symbol: 'circle', maxVal
symbolSize: 6,
lineStyle: { width: 2, color: COLORS[idx % COLORS.length] },
itemStyle: { color: COLORS[idx % COLORS.length] },
emphasis: { focus: 'series' }
}) })
}) })
this.seriesList = list
this.summary = { this.summary = {
seriesCount: series.length, seriesCount: list.length,
maxLabel: this.formatMoney(globalMax) maxLabel: this.formatMoney(globalMax)
} }
this.$nextTick(() => { this.$nextTick(() => this.renderMiniCharts())
setTimeout(() => this.renderChart(xLabels, series, '数量'), 50) },
// ==================== 迷你图表渲染 ====================
disposeAllCharts() {
this.chartInstances.forEach(c => {
try { c.dispose() } catch (e) { /* ignore */ }
})
this.chartInstances = []
},
resizeAllCharts() {
this.chartInstances.forEach(c => {
try { c.resize() } catch (e) { /* ignore */ }
}) })
}, },
// ==================== 图表渲染 ==================== renderMiniCharts() {
renderChart(xLabels, series, yAxisName) { this.disposeAllCharts()
console.log('[CostTrend] renderChart called, ref:', !!this.$refs.trendChart, 'series:', series.length, 'xLabels:', xLabels.length)
if (!this.$refs.trendChart) return
if (this.chart) this.chart.dispose()
this.chart = echarts.init(this.$refs.trendChart)
if (!series.length) { const containers = this.$refs.miniCharts
this.chart.setOption({ if (!containers || !containers.length) return
title: { text: '暂无数据', left: 'center', top: 'center', textStyle: { color: '#999', fontSize: 14 } },
xAxis: { show: false },
yAxis: { show: false },
series: []
})
return
}
this.chart.setOption({ this.seriesList.forEach((s, idx) => {
tooltip: { const el = containers[idx]
trigger: 'axis', if (!el) return
formatter: function (params) {
if (!params || !params.length) return '' const chart = echarts.init(el)
let html = '<b>' + params[0].axisValue + '</b><br/>' chart.setOption({
params.forEach(p => { tooltip: {
if (p.value != null) { trigger: 'axis',
html += '<span style="display:inline-block;width:10px;height:10px;border-radius:50%;background:' + formatter: function(params) {
p.color + ';margin-right:5px;"></span>' + if (!params || !params.length) return ''
p.seriesName + ': <b>' + const p = params[0]
Number(p.value).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) + return '<b>' + p.axisValue + '</b><br/>' +
'</b><br/>' '<span style="display:inline-block;width:8px;height:8px;border-radius:50%;background:' +
} p.color + ';margin-right:4px;"></span>' +
}) p.seriesName + ': <b>' +
return html Number(p.value).toLocaleString('zh-CN', { minimumFractionDigits: 2, maximumFractionDigits: 2 }) +
} '</b>'
},
legend: {
type: 'scroll',
bottom: 0,
textStyle: { fontSize: 11 },
pageIconSize: 12,
pageTextStyle: { fontSize: 11 }
},
grid: {
left: '3%',
right: '4%',
top: '3%',
bottom: series.length > 20 ? '18%' : (series.length > 10 ? '14%' : '10%'),
containLabel: true
},
xAxis: {
type: 'category',
data: xLabels,
boundaryGap: false,
axisLabel: {
fontSize: 11,
rotate: xLabels.length > 8 ? 30 : 0
}
},
yAxis: {
type: 'value',
name: yAxisName,
axisLabel: {
fontSize: 11,
formatter: function (v) {
if (v >= 10000) return (v / 10000).toFixed(1) + '万'
return v
} }
}, },
splitLine: { lineStyle: { type: 'dashed', color: '#e8e8e8' } } grid: {
}, left: 8,
dataZoom: xLabels.length > 10 ? [ right: 12,
{ top: 8,
type: 'slider', bottom: 24,
bottom: series.length > 10 ? (series.length > 20 ? 60 : 50) : 35, containLabel: true
height: 16,
textStyle: { fontSize: 10 }
}, },
{ type: 'inside' } xAxis: {
] : [], type: 'category',
series data: s.xLabels,
}, true) boundaryGap: false,
axisLabel: {
fontSize: 10,
rotate: s.xLabels.length > 8 ? 25 : 0,
interval: s.xLabels.length > 12 ? 'auto' : 0
},
axisTick: { show: false },
axisLine: { lineStyle: { color: '#ddd' }}
},
yAxis: {
type: 'value',
axisLabel: {
fontSize: 10,
formatter: function(v) {
if (v >= 10000) return (v / 10000).toFixed(1) + '万'
return v
}
},
splitLine: { lineStyle: { type: 'dashed', color: '#eee' }},
splitNumber: 3
},
series: [{
name: s.name,
type: 'line',
data: s.data,
smooth: true,
symbol: 'none',
lineStyle: { width: 1.5, color: s.color },
itemStyle: { color: s.color },
areaStyle: {
color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
{ offset: 0, color: s.color + '30' },
{ offset: 1, color: s.color + '05' }
])
}
}]
}, true)
this.chartInstances.push(chart)
})
}, },
reportLabel(r) { reportLabel(r) {
@@ -411,78 +415,132 @@ export default {
const num = Number(val) const num = Number(val)
if (num >= 10000) return (num / 10000).toFixed(2) + '万' if (num >= 10000) return (num / 10000).toFixed(2) + '万'
return num.toFixed(2) return num.toFixed(2)
},
formatMiniMax(val) {
if (val == null || isNaN(val)) return '-'
if (val >= 10000) return (val / 10000).toFixed(1) + '万'
return Number(val).toFixed(1)
} }
} }
} }
</script> </script>
<style scoped> <style scoped>
.mb8 { margin-bottom: 10px; } .mb8 { margin-bottom: 8px; }
.filter-card {
border: none;
box-shadow: none;
background: transparent;
}
.filter-card >>> .el-card__body {
padding: 0;
}
.filter-bar { .filter-bar {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 8px;
flex-wrap: wrap; flex-wrap: wrap;
} }
/* 统计摘要 */
.stats-row { .stats-row {
display: flex; display: flex;
gap: 8px; gap: 6px;
margin-bottom: 10px; margin-bottom: 8px;
} }
.stat-item { .stat-item {
flex: 1; flex: 1;
min-width: 100px; min-width: 80px;
background: #fff; background: #fff;
border: 1px solid #ebeef5; border: 1px solid #ebeef5;
border-radius: 2px; border-radius: 4px;
padding: 10px 12px; padding: 8px 10px;
text-align: center; text-align: center;
} }
.stat-val { .stat-val {
display: block; display: block;
font-size: 22px; font-size: 20px;
font-weight: 600; font-weight: 600;
color: #303133; color: #303133;
line-height: 1.2; line-height: 1.2;
} }
.stat-label { .stat-label {
display: block; display: block;
font-size: 12px; font-size: 11px;
color: #909399; color: #909399;
margin-top: 2px; margin-top: 1px;
} }
.stat-blue .stat-val { color: #409eff; } .stat-blue .stat-val { color: #409eff; }
.stat-orange .stat-val { color: #e6a23c; } .stat-orange .stat-val { color: #e6a23c; }
.stat-green .stat-val { color: #67c23a; } .stat-green .stat-val { color: #67c23a; }
.chart-box { /* 图表筛选 */
background: #fff;
border: 1px solid #ebeef5;
border-radius: 2px;
}
.chart-filter-bar { .chart-filter-bar {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 10px; gap: 8px;
margin-bottom: 8px; margin-bottom: 8px;
} }
.chart-filter-bar .filter-label { .chart-filter-bar .filter-label {
font-size: 13px; font-size: 12px;
color: #606266; color: #606266;
white-space: nowrap; white-space: nowrap;
} }
.chart-body {
width: 100%; /* 迷你图表网格 */
height: 480px; .mini-charts-grid {
display: grid;
grid-template-columns: repeat(auto-fill, minmax(340px, 1fr));
gap: 10px;
} }
.legend-hint {
margin-top: 8px; .mini-chart-card {
font-size: 12px; background: #fff;
color: #909399; border: 1px solid #ebeef5;
border-radius: 4px;
overflow: hidden;
}
.mini-chart-header {
display: flex; display: flex;
align-items: center; align-items: center;
gap: 4px; gap: 6px;
padding: 8px 10px 0 10px;
font-size: 13px;
color: #303133;
}
.mini-chart-dot {
width: 8px;
height: 8px;
border-radius: 50%;
flex-shrink: 0;
}
.mini-chart-name {
font-weight: 500;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.mini-chart-max {
margin-left: auto;
font-size: 11px;
color: #909399;
flex-shrink: 0;
}
.mini-chart-body {
width: 100%;
height: 220px;
}
.empty-hint {
grid-column: 1 / -1;
text-align: center;
padding: 60px 0;
font-size: 13px;
color: #909399;
} }
</style> </style>

View File

@@ -66,6 +66,7 @@
/> />
<el-button type="primary" size="small" icon="el-icon-search" @click="handleQuery">筛选</el-button> <el-button type="primary" size="small" icon="el-icon-search" @click="handleQuery">筛选</el-button>
<el-button size="small" icon="el-icon-refresh" @click="resetQuery">重置</el-button> <el-button size="small" icon="el-icon-refresh" @click="resetQuery">重置</el-button>
<el-button size="small" icon="el-icon-download" @click="handleExport">导出</el-button>
<span v-if="total > 0" class="result-count"> {{ total }} 条记录</span> <span v-if="total > 0" class="result-count"> {{ total }} 条记录</span>
</div> </div>
@@ -130,6 +131,14 @@
</div> </div>
</template> </template>
</el-table-column> </el-table-column>
<!-- 业务员 -->
<el-table-column label="业务员" width="110">
<template slot-scope="scope">
<el-select v-model="scope.row.salesman" size="small" class="editable-cell" style="width: 100%" @change="saveRow(scope.row)">
<el-option v-for="item in dict.type.wip_pack_saleman" :key="item.value" :label="item.label" :value="item.value" />
</el-select>
</template>
</el-table-column>
<!-- 签订日期 --> <!-- 签订日期 -->
<el-table-column label="签订日期" prop="signTime" width="100"> <el-table-column label="签订日期" prop="signTime" width="100">
<template slot-scope="scope"> <template slot-scope="scope">
@@ -421,8 +430,10 @@
</template> </template>
<script> <script>
import { listOrder, updateOrder } from '@/api/crm/order' import { listOrder, updateOrder, exportOrder } from '@/api/crm/order'
import { listCustomer } from '@/api/crm/customer' import { listCustomer } from '@/api/crm/customer'
import { blobValidate } from "@/utils/klp";
import { saveAs } from 'file-saver'
const STATUS_MAP = { const STATUS_MAP = {
'0': { label: '草稿', type: 'info' }, '0': { label: '草稿', type: 'info' },
@@ -433,6 +444,7 @@ const STATUS_MAP = {
export default { export default {
name: 'ContractDetailEdit', name: 'ContractDetailEdit',
dicts: ['wip_pack_saleman'],
data() { data() {
return { return {
loading: false, loading: false,
@@ -628,7 +640,38 @@ export default {
} }
this.customerDialogVisible = false this.customerDialogVisible = false
this.saveRow(row) this.saveRow(row)
} },
// 导出合同明细(按当前筛选条件)
handleExport() {
const params = {}
if (this.contractQuery.contractCode) params.contractCode = this.contractQuery.contractCode
if (this.contractQuery.supplier) params.supplier = this.contractQuery.supplier
if (this.contractQuery.customer) params.customer = this.contractQuery.customer
if (this.contractQuery.status !== undefined && this.contractQuery.status !== null) params.status = this.contractQuery.status
if (this.contractQuery.signDateStart) params.signDateStart = this.contractQuery.signDateStart
if (this.contractQuery.signDateEnd) params.signDateEnd = this.contractQuery.signDateEnd
if (this.contractQuery.deliveryDateStart) params.deliveryDateStart = this.contractQuery.deliveryDateStart
if (this.contractQuery.deliveryDateEnd) params.deliveryDateEnd = this.contractQuery.deliveryDateEnd
if (this.contractQuery.signLocation) params.signLocation = this.contractQuery.signLocation
exportOrder(params).then((res) => {
this.handleExportBlob(res, '合同编辑详情.xlsx')
}).catch(() => {})
},
// 处理blob文件导出
async handleExportBlob(res, fileName) {
const isBlob = blobValidate(res);
if (isBlob) {
saveAs(res, fileName);
this.$message.success('导出成功!');
} else {
const resText = await res.text();
const rspObj = JSON.parse(resText);
const errMsg = rspObj.msg || '导出失败';
this.$message.error(errMsg);
}
},
} }
} }
</script> </script>
@@ -727,6 +770,22 @@ export default {
white-space: normal; white-space: normal;
} }
/* 业务员下拉框样式 */
.select-salesman ::v-deep .el-input__inner {
background-color: #f3f0ff;
border-color: transparent;
padding: 0 8px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.select-salesman ::v-deep .el-input__inner:focus {
border-color: #5F7BA0;
background-color: #fff;
overflow: visible;
white-space: normal;
}
/* 日期选择器样式 */ /* 日期选择器样式 */
.editable-cell-date ::v-deep .el-input__inner { .editable-cell-date ::v-deep .el-input__inner {
background-color: #e6f7ff; background-color: #e6f7ff;

View File

@@ -21,6 +21,7 @@
<div class="toolbar"> <div class="toolbar">
<el-button type="danger" size="small" icon="el-icon-delete" :disabled="!selection.length" @click="handleBatchDelete">批量删除</el-button> <el-button type="danger" size="small" icon="el-icon-delete" :disabled="!selection.length" @click="handleBatchDelete">批量删除</el-button>
<el-button type="primary" size="small" icon="el-icon-download" @click="handleExport">导出</el-button>
<span class="toolbar-tip">合同列为只读明细列失焦自动保存需有修改权限</span> <span class="toolbar-tip">合同列为只读明细列失焦自动保存需有修改权限</span>
</div> </div>
@@ -50,6 +51,9 @@
<el-table-column label="供方" min-width="120" show-overflow-tooltip> <el-table-column label="供方" min-width="120" show-overflow-tooltip>
<template slot-scope="{ row }">{{ (row.orderInfo && row.orderInfo.supplier) || '-' }}</template> <template slot-scope="{ row }">{{ (row.orderInfo && row.orderInfo.supplier) || '-' }}</template>
</el-table-column> </el-table-column>
<el-table-column label="业务员" min-width="80" show-overflow-tooltip>
<template slot-scope="{ row }">{{ (row.orderInfo && row.orderInfo.salesman) || row.salesman || '-' }}</template>
</el-table-column>
<el-table-column label="签订时间" width="110"> <el-table-column label="签订时间" width="110">
<template slot-scope="{ row }">{{ row.orderInfo && row.orderInfo.signTime ? parseTime(row.orderInfo.signTime, '{y}-{m}-{d}') : '-' }}</template> <template slot-scope="{ row }">{{ row.orderInfo && row.orderInfo.signTime ? parseTime(row.orderInfo.signTime, '{y}-{m}-{d}') : '-' }}</template>
</el-table-column> </el-table-column>
@@ -201,7 +205,9 @@
</template> </template>
<script> <script>
import { listOrderItem, updateOrderItem, delOrderItem } from '@/api/crm/orderItem' import { listOrderItem, updateOrderItem, delOrderItem, exportOrderItem } from '@/api/crm/orderItem'
import { blobValidate } from "@/utils/klp";
import { saveAs } from 'file-saver'
const ITEM_PAYLOAD_KEYS = [ const ITEM_PAYLOAD_KEYS = [
'itemId', 'itemId',
@@ -354,7 +360,36 @@ export default {
console.error('批量删除失败:', err) console.error('批量删除失败:', err)
} }
}) })
} },
// 导出订单明细(按当前筛选条件)
handleExport() {
const params = {}
if (this.queryParams.contractCode) params.contractCode = this.queryParams.contractCode
if (this.queryParams.customer) params.customer = this.queryParams.customer
if (this.queryParams.material) params.material = this.queryParams.material
if (this.queryParams.orderId) {
const n = Number(this.queryParams.orderId)
params.orderId = Number.isNaN(n) ? this.queryParams.orderId : n
}
exportOrderItem(params).then((res) => {
this.handleExportBlob(res, '正式订单明细.xlsx')
}).catch(() => {})
},
// 处理blob文件导出
async handleExportBlob(res, fileName) {
const isBlob = blobValidate(res);
if (isBlob) {
saveAs(res, fileName);
this.$modal.msgSuccess('导出成功!');
} else {
const resText = await res.text();
const rspObj = JSON.parse(resText);
const errMsg = rspObj.msg || '导出失败';
this.$modal.msgError(errMsg);
}
},
} }
} }
</script> </script>

View File

@@ -52,6 +52,7 @@
/> />
<el-button type="primary" size="small" icon="el-icon-search" @click="handleQuery">筛选</el-button> <el-button type="primary" size="small" icon="el-icon-search" @click="handleQuery">筛选</el-button>
<el-button size="small" icon="el-icon-refresh" @click="resetQuery">重置</el-button> <el-button size="small" icon="el-icon-refresh" @click="resetQuery">重置</el-button>
<el-button size="small" icon="el-icon-download" @click="handleExport">导出</el-button>
<span class="sort-hint">已按合同签订日期默认当月结果按交货日期倒序排列</span> <span class="sort-hint">已按合同签订日期默认当月结果按交货日期倒序排列</span>
</div> </div>
@@ -96,6 +97,11 @@
<span class="contract-info" :title="row.customer">{{ row.customer }}</span> <span class="contract-info" :title="row.customer">{{ row.customer }}</span>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="业务员" width="80">
<template slot-scope="{ row }">
<span class="contract-info">{{ row._order && row._order.salesman ? row._order.salesman : '-' }}</span>
</template>
</el-table-column>
<el-table-column label="签订日期" prop="signTime" width="100"> <el-table-column label="签订日期" prop="signTime" width="100">
<template slot-scope="{ row }"> <template slot-scope="{ row }">
<span class="contract-info contract-date">{{ formatDate(row.signTime) }}</span> <span class="contract-info contract-date">{{ formatDate(row.signTime) }}</span>
@@ -270,8 +276,10 @@
</template> </template>
<script> <script>
import { listOrder, updateOrder } from '@/api/crm/order' import { listOrder, updateOrder, exportOrder } from '@/api/crm/order'
import { parseProductContent, stringifyProductContent, calculateProductFields, recalculateTotals } from '@/utils/productContent' import { parseProductContent, stringifyProductContent, calculateProductFields, recalculateTotals } from '@/utils/productContent'
import { blobValidate } from "@/utils/klp";
import { saveAs } from 'file-saver'
export default { export default {
name: 'OrderItemList', name: 'OrderItemList',
@@ -555,6 +563,34 @@ export default {
this.getList() this.getList()
}, },
// 导出订单明细(按当前筛选条件)
handleExport() {
const params = {}
if (this.queryParams.contractCode) params.contractCode = this.queryParams.contractCode
if (this.queryParams.customer) params.customer = this.queryParams.customer
if (this.queryParams.signDateStart) params.signDateStart = this.queryParams.signDateStart
if (this.queryParams.signDateEnd) params.signDateEnd = this.queryParams.signDateEnd
if (this.queryParams.deliveryDateStart) params.deliveryDateStart = this.queryParams.deliveryDateStart
if (this.queryParams.deliveryDateEnd) params.deliveryDateEnd = this.queryParams.deliveryDateEnd
exportOrder(params).then((res) => {
this.handleExportBlob(res, '订单明细列表.xlsx')
}).catch(() => {})
},
// 处理blob文件导出
async handleExportBlob(res, fileName) {
const isBlob = blobValidate(res);
if (isBlob) {
saveAs(res, fileName);
this.$message.success('导出成功!');
} else {
const resText = await res.text();
const rspObj = JSON.parse(resText);
const errMsg = rspObj.msg || '导出失败';
this.$message.error(errMsg);
}
},
groupRowClassName({ row, rowIndex }) { groupRowClassName({ row, rowIndex }) {
if (row.productIndex === 0) { if (row.productIndex === 0) {
return 'group-row-a' return 'group-row-a'

View File

@@ -56,7 +56,12 @@
<el-col :span="14"> <el-col :span="14">
<div class="chart-card"> <div class="chart-card">
<div class="chart-header"> <div class="chart-header">
<span class="chart-title"><i class="el-icon-data-line" /> 每日磨削趋势</span> <span class="chart-title"><i class="el-icon-data-line" /> {{ trendChartTitle }}</span>
<el-radio-group v-model="trendDimension" size="mini" @change="onTrendDimensionChange" style="margin-left:12px">
<el-radio-button label="day">按天</el-radio-button>
<el-radio-button label="week">按周</el-radio-button>
<el-radio-button label="month">按月</el-radio-button>
</el-radio-group>
</div> </div>
<div ref="trendChartRef" class="chart-container" style="height:340px"></div> <div ref="trendChartRef" class="chart-container" style="height:340px"></div>
<div v-if="!dailyTrend.length" class="chart-empty">暂无数据</div> <div v-if="!dailyTrend.length" class="chart-empty">暂无数据</div>
@@ -131,6 +136,38 @@
<el-empty v-else description="暂无磨削记录" /> <el-empty v-else description="暂无磨削记录" />
</div> </div>
<!-- 月度产线汇总二维表 -->
<div class="table-card mt16">
<div class="card-header">
<span class="card-title"><i class="el-icon-s-data" /> 月度产线汇总</span>
<span class="card-subtitle" v-if="monthlyPivot.length">{{ monthlyPivotMonths.length }} 个月 · {{ monthlyPivot.length }} 条产线</span>
<el-button size="mini" type="primary" plain icon="el-icon-download" style="margin-left:8px" @click="exportMonthlyPivot" :disabled="!monthlyPivot.length">导出</el-button>
</div>
<div style="overflow-x:auto" v-if="monthlyPivot.length">
<el-table :data="monthlyPivot" size="small" border stripe style="min-width:100%"
:header-cell-style="{ textAlign: 'center', fontWeight: 600 }">
<el-table-column label="产线" prop="lineName" fixed="left" width="140" align="center" />
<el-table-column v-for="m in monthlyPivotMonths" :key="m" :label="m" align="center">
<el-table-column label="磨削次数" align="center" min-width="80">
<template slot-scope="{row}">{{ row[m + '_count'] || 0 }}</template>
</el-table-column>
<el-table-column label="磨削量(mm)" align="right" min-width="110">
<template slot-scope="{row}">{{ (row[m + '_amount'] || 0).toFixed(2) }}</template>
</el-table-column>
</el-table-column>
<el-table-column label="合计" align="center">
<el-table-column label="磨削次数" align="center" min-width="80">
<template slot-scope="{row}">{{ row.totalCount }}</template>
</el-table-column>
<el-table-column label="磨削量(mm)" align="right" min-width="110">
<template slot-scope="{row}">{{ row.totalAmount.toFixed(2) }}</template>
</el-table-column>
</el-table-column>
</el-table>
</div>
<el-empty v-else description="暂无磨削记录" />
</div>
</div> </div>
</template> </template>
@@ -139,12 +176,19 @@ import * as echarts from 'echarts'
import * as XLSX from 'xlsx' import * as XLSX from 'xlsx'
import { getRollStats, listRollInfo } from '@/api/mes/roll/rollInfo' import { getRollStats, listRollInfo } from '@/api/mes/roll/rollInfo'
import { listRollGrindAll } from '@/api/mes/roll/rollGrind' import { listRollGrindAll } from '@/api/mes/roll/rollGrind'
import { mapGetters } from 'vuex'
import rollLineMixin from '../rollLineMixin' import rollLineMixin from '../rollLineMixin'
export default { export default {
name: 'RollReport', name: 'RollReport',
mixins: [rollLineMixin], mixins: [rollLineMixin],
dicts: ['mes_roll_operator'], dicts: ['mes_roll_operator'],
computed: {
...mapGetters(['productionLines']),
trendChartTitle() {
return { day: '每日磨削趋势', week: '每周磨削趋势', month: '每月磨削趋势' }[this.trendDimension] || '磨削趋势'
}
},
data() { data() {
const now = new Date() const now = new Date()
const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000) const sevenDaysAgo = new Date(now.getTime() - 7 * 24 * 60 * 60 * 1000)
@@ -161,7 +205,10 @@ export default {
trendChart: null, trendChart: null,
pieChart: null, pieChart: null,
_beginTime: fmt(sevenDaysAgo), _beginTime: fmt(sevenDaysAgo),
_endTime: fmt(now) _endTime: fmt(now),
monthlyPivot: [],
monthlyPivotMonths: [],
trendDimension: 'day'
} }
}, },
watch: { watch: {
@@ -197,8 +244,8 @@ export default {
this.stats = statsRes.data || {} this.stats = statsRes.data || {}
} }
// 2. 获取全部轧辊(用于辊型映射) // 2. 获取全部轧辊(用于辊型映射和产线关联
const rollRes = await listRollInfo({ pageNum: 1, pageSize: 99999, lineId: this.lineId || undefined }) const rollRes = await listRollInfo({ pageNum: 1, pageSize: 99999 })
const rolls = rollRes.rows || [] const rolls = rollRes.rows || []
const rollMap = {} const rollMap = {}
rolls.forEach(r => { rollMap[r.rollId] = r }) rolls.forEach(r => { rollMap[r.rollId] = r })
@@ -211,10 +258,20 @@ export default {
const allRecords = grindRes.data || [] const allRecords = grindRes.data || []
// 4. 汇总计算 // 4. 汇总计算
this.autoDetectTrendDimension()
this.computeSummary(allRecords, rollMap) this.computeSummary(allRecords, rollMap)
this.computeDailyTrend(allRecords) this.computeTrendData(allRecords)
this.computeRollTypeDist(allRecords, rollMap) this.computeRollTypeDist(allRecords, rollMap)
this.computeOperatorStats(allRecords, rollMap) this.computeOperatorStats(allRecords, rollMap)
// 5. 月度产线汇总(跨全部产线,不受当前 lineId 限制)
await this.$store.dispatch('productionLine/getProductionLines')
const allParams = {}
if (this._beginTime) allParams.beginTime = this._beginTime
if (this._endTime) allParams.endTime = this._endTime + ' 23:59:59'
const allGrindRes = await listRollGrindAll(allParams)
this.computeMonthlyPivot(allGrindRes.data || [], rollMap)
this.updateCharts() this.updateCharts()
} catch (e) { } catch (e) {
console.error('加载报表数据失败', e) console.error('加载报表数据失败', e)
@@ -249,6 +306,56 @@ export default {
}) })
this.dailyTrend = Object.values(dateMap).sort((a, b) => a.grindDate.localeCompare(b.grindDate)) this.dailyTrend = Object.values(dateMap).sort((a, b) => a.grindDate.localeCompare(b.grindDate))
}, },
computeWeeklyTrend(records) {
const weekMap = {}
const pad = n => String(n).padStart(2, '0')
records.forEach(r => {
if (!r.grindTime) return
const d = new Date(r.grindTime)
const dayOfWeek = d.getDay() || 7
const monday = new Date(d)
monday.setDate(d.getDate() - dayOfWeek + 1)
const sunday = new Date(monday)
sunday.setDate(monday.getDate() + 6)
const key = `${monday.getFullYear()}-${pad(monday.getMonth() + 1)}-${pad(monday.getDate())}`
const label = `${pad(monday.getMonth() + 1)}-${pad(monday.getDate())}~${pad(sunday.getMonth() + 1)}-${pad(sunday.getDate())}`
if (!weekMap[key]) weekMap[key] = { grindDate: label, grindCount: 0, totalGrindAmount: 0, _sort: key }
weekMap[key].grindCount++
weekMap[key].totalGrindAmount += Number(r.grindAmount || 0)
})
this.dailyTrend = Object.values(weekMap).sort((a, b) => a._sort.localeCompare(b._sort))
},
computeMonthlyTrend(records) {
const monthMap = {}
records.forEach(r => {
if (!r.grindTime) return
const m = r.grindTime.substring(0, 7)
if (!monthMap[m]) monthMap[m] = { grindDate: m, grindCount: 0, totalGrindAmount: 0 }
monthMap[m].grindCount++
monthMap[m].totalGrindAmount += Number(r.grindAmount || 0)
})
this.dailyTrend = Object.values(monthMap).sort((a, b) => a.grindDate.localeCompare(b.grindDate))
},
computeTrendData(records) {
this._cachedRecords = records
if (this.trendDimension === 'week') this.computeWeeklyTrend(records)
else if (this.trendDimension === 'month') this.computeMonthlyTrend(records)
else this.computeDailyTrend(records)
},
autoDetectTrendDimension() {
const [b, e] = this.dateRange
if (!b || !e) return
const days = (new Date(e) - new Date(b)) / (24 * 60 * 60 * 1000)
if (days <= 31) this.trendDimension = 'day'
else if (days <= 90) this.trendDimension = 'week'
else this.trendDimension = 'month'
},
onTrendDimensionChange() {
if (this._cachedRecords) {
this.computeTrendData(this._cachedRecords)
this.updateTrendChart()
}
},
computeRollTypeDist(records, rollMap) { computeRollTypeDist(records, rollMap) {
const typeMap = {} const typeMap = {}
records.forEach(r => { records.forEach(r => {
@@ -420,6 +527,79 @@ export default {
link.click() link.click()
document.body.removeChild(link) document.body.removeChild(link)
URL.revokeObjectURL(url) URL.revokeObjectURL(url)
},
computeMonthlyPivot(records, rollMap) {
const lineMonthMap = {}
const monthSet = new Set()
records.forEach(r => {
if (!r.grindTime) return
const month = r.grindTime.substring(0, 7)
const roll = rollMap[r.rollId]
const lid = Number(roll?.lineId) || 0
if (!lineMonthMap[lid]) {
const line = this.productionLines.find(l => Number(l.lineId) === lid)
lineMonthMap[lid] = { lineId: lid, lineName: line ? line.lineName : (r.lineName || '未知产线'), months: {} }
}
if (!lineMonthMap[lid].months[month]) {
lineMonthMap[lid].months[month] = { grindCount: 0, totalGrindAmount: 0 }
}
lineMonthMap[lid].months[month].grindCount++
lineMonthMap[lid].months[month].totalGrindAmount += Number(r.grindAmount || 0)
monthSet.add(month)
})
const months = [...monthSet].sort()
const rows = this.productionLines.map(line => {
const ld = lineMonthMap[line.lineId]
const row = { lineId: line.lineId, lineName: line.lineName, totalCount: 0, totalAmount: 0 }
months.forEach(m => {
if (ld && ld.months[m]) {
row[m + '_count'] = ld.months[m].grindCount
row[m + '_amount'] = Number(ld.months[m].totalGrindAmount.toFixed(2))
row.totalCount += ld.months[m].grindCount
row.totalAmount += ld.months[m].totalGrindAmount
} else {
row[m + '_count'] = 0
row[m + '_amount'] = 0
}
})
row.totalAmount = Number(row.totalAmount.toFixed(2))
return row
})
this.monthlyPivotMonths = months
this.monthlyPivot = rows
},
exportMonthlyPivot() {
const months = this.monthlyPivotMonths
const header1 = ['产线']
const header2 = ['']
months.forEach(m => { header1.push(m, ''); header2.push('磨削次数', '磨削量(mm)') })
header1.push('合计', '')
header2.push('磨削次数', '磨削量(mm)')
const rows = [header1, header2]
this.monthlyPivot.forEach(row => {
const r = [row.lineName]
months.forEach(m => { r.push(row[m + '_count'] || 0, (row[m + '_amount'] || 0).toFixed(2)) })
r.push(row.totalCount, row.totalAmount.toFixed(2))
rows.push(r)
})
const ws = XLSX.utils.aoa_to_sheet(rows)
// merge header row 1 for month groups
ws['!merges'] = []
let col = 1
months.forEach(() => { ws['!merges'].push({ s: { r: 0, c: col }, e: { r: 0, c: col + 1 } }); col += 2 })
ws['!merges'].push({ s: { r: 0, c: col }, e: { r: 0, c: col + 1 } })
const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, '月度产线汇总')
const buf = XLSX.write(wb, { bookType: 'xlsx', type: 'array' })
const blob = new Blob([buf], { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' })
const url = URL.createObjectURL(blob)
const link = document.createElement('a')
link.href = url
link.download = `月度产线汇总_${this._beginTime || ''}_${this._endTime ? this._endTime.substring(0, 10) : ''}.xlsx`
document.body.appendChild(link)
link.click()
document.body.removeChild(link)
URL.revokeObjectURL(url)
} }
} }
} }
@@ -431,6 +611,7 @@ export default {
min-height: 100%; min-height: 100%;
} }
.mb16 { margin-bottom: 16px; } .mb16 { margin-bottom: 16px; }
.mt16 { margin-top: 16px; }
/* 筛选栏 */ /* 筛选栏 */
.filter-panel { .filter-panel {

View File

@@ -0,0 +1,40 @@
<template>
<div class="inventory-container">
<BasePage
:qrcode="false"
:querys="querys"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { DR_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'DrInventory',
components: {
BasePage,
},
data() {
return {
querys: {
dataType: 1,
status: 0,
},
warehouseOptions: DR_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.inventory-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,39 @@
<template>
<div class="processing-container">
<el-tabs v-model="activeTab" type="border-card">
<el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.title" :name="tab.name">
<DoPage
v-if="activeTab === tab.name"
:label="tab.label"
:tabs="tab.tabs"
:useSpecialSplit="tab.useSpecialSplit"
/>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import DoPage from '@/views/wms/coil/panels/do.vue'
import { DR_PROCESSING_TABS } from '../config'
export default {
name: 'DrProcessing',
components: {
DoPage,
},
data() {
return {
activeTab: 'process',
tabs: DR_PROCESSING_TABS,
}
},
}
</script>
<style scoped lang="scss">
.processing-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,92 @@
<template>
<div class="quality-container">
<el-tabs v-model="activeTab" class="quality-tabs">
<el-tab-pane label="异常钢卷" name="abnormal">
<div v-if="activeTab === 'abnormal'" class="tab-content">
<BasePage
:qrcode="false"
:querys="abnormalQuerys"
:labelType="'2'"
:hideType="false"
:showAbnormal="true"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="次品钢卷" name="defect">
<div v-if="activeTab === 'defect'" class="tab-content">
<BasePage
:qrcode="false"
:querys="defectQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="O卷" name="oil">
<div v-if="activeTab === 'oil'" class="tab-content">
<BasePage
:qrcode="false"
:querys="oilQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { DR_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'DrQuality',
components: {
BasePage,
},
data() {
return {
activeTab: 'abnormal',
abnormalQuerys: {
dataType: 1,
orderByAbnormal: true,
},
defectQuerys: {
dataType: 1,
OnlyScrap: true,
},
oilQuerys: {
dataType: 1,
status: 0,
qualityStatus: 'O',
},
warehouseOptions: DR_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.quality-container {
width: 100%;
height: 100%;
.quality-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,67 @@
<template>
<div class="report-container">
<el-tabs v-model="activeTab" class="report-tabs">
<el-tab-pane label="综合报表" name="comprehensive">
<Comprehensive v-if="activeTab === 'comprehensive'" />
</el-tab-pane>
<el-tab-pane label="日报表" name="day">
<DayReport v-if="activeTab === 'day'" />
</el-tab-pane>
<el-tab-pane label="月报表" name="month">
<MonthReport v-if="activeTab === 'month'" />
</el-tab-pane>
<el-tab-pane label="年报表" name="year">
<YearReport v-if="activeTab === 'year'" />
</el-tab-pane>
<el-tab-pane label="损耗报表" name="loss">
<LossReport v-if="activeTab === 'loss'" />
</el-tab-pane>
<el-tab-pane label="产出报表" name="out">
<OutReport v-if="activeTab === 'out'" />
</el-tab-pane>
<el-tab-pane label="班报表" name="team">
<TeamReport v-if="activeTab === 'team'" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import Comprehensive from '@/views/wms/report/shuang/comprehensive.vue'
import DayReport from '@/views/wms/report/shuang/day.vue'
import MonthReport from '@/views/wms/report/shuang/month.vue'
import YearReport from '@/views/wms/report/shuang/year.vue'
import LossReport from '@/views/wms/report/shuang/loss.vue'
import OutReport from '@/views/wms/report/shuang/out.vue'
import TeamReport from '@/views/wms/report/shuang/team.vue'
export default {
name: 'DrReport',
components: {
Comprehensive,
DayReport,
MonthReport,
YearReport,
LossReport,
OutReport,
TeamReport,
},
data() {
return {
activeTab: 'comprehensive',
}
},
}
</script>
<style scoped lang="scss">
.report-container {
width: 100%;
height: 100%;
.report-tabs {
height: 100%;
overflow-y: auto;
}
}
</style>

View File

@@ -0,0 +1,79 @@
<template>
<div class="shipping-container">
<el-tabs v-model="activeTab" class="shipping-tabs">
<el-tab-pane label="配卷情况" name="waybill">
<div class="tab-content">
<BasePage
:qrcode="false"
:showWaybill="true"
:showNewExport="true"
:querys="waybillQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="发货记录" name="ship">
<div class="tab-content">
<BasePage
:qrcode="false"
:querys="shipQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showExportTime="true"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { DR_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'DrShipping',
components: {
BasePage,
},
data() {
return {
activeTab: 'waybill',
waybillQuerys: {
dataType: 1,
includeBindInfo: true,
},
shipQuerys: {
dataType: 1,
status: 1,
},
warehouseOptions: DR_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.shipping-container {
width: 100%;
height: 100%;
.shipping-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,28 @@
export const DR_WAREHOUSE_OPTIONS = [
{ value: '1992873386047643650', label: '双机架原料库' },
{ value: '1992873437713080322', label: '双机架成品库' },
{ value: '1988151076996706306', label: '镀铬原料库' },
]
export const DR_PROCESSING_TABS = [
{
title: '双机架工序',
name: 'process',
label: '双机架工序',
tabs: DR_WAREHOUSE_OPTIONS,
useSpecialSplit: true,
},
{
title: '合卷',
name: 'merge',
label: '双机架合卷',
useSpecialSplit: false,
},
{
title: '双机架修复',
name: 'repair',
label: '双机架修复工序',
tabs: DR_WAREHOUSE_OPTIONS,
useSpecialSplit: true,
},
]

View File

@@ -2,6 +2,26 @@
<div class="dr-container"> <div class="dr-container">
<div class="dr-sidebar"> <div class="dr-sidebar">
<el-menu :default-active="activeMenu" class="sidebar-menu" @select="handleMenuSelect"> <el-menu :default-active="activeMenu" class="sidebar-menu" @select="handleMenuSelect">
<el-menu-item index="inventory">
<i class="el-icon-box"></i>
<span slot="title">库存</span>
</el-menu-item>
<el-menu-item index="processing">
<i class="el-icon-s-operation"></i>
<span slot="title">WIP</span>
</el-menu-item>
<el-menu-item index="report">
<i class="el-icon-document"></i>
<span slot="title">报表</span>
</el-menu-item>
<el-menu-item index="shipping">
<i class="el-icon-truck"></i>
<span slot="title">发货</span>
</el-menu-item>
<el-menu-item index="quality">
<i class="el-icon-warning-outline"></i>
<span slot="title">品质</span>
</el-menu-item>
<el-menu-item index="plan"> <el-menu-item index="plan">
<i class="el-icon-s-order"></i> <i class="el-icon-s-order"></i>
<span slot="title">计划</span> <span slot="title">计划</span>
@@ -23,19 +43,42 @@
</template> </template>
<script> <script>
import Plan from './components/Plan.vue' import Plan from './components/Plan.vue'
import ProcessSpec from './components/ProcessSpec.vue' import ProcessSpec from './components/ProcessSpec.vue'
import Actual from './components/Actual.vue' import Actual from './components/Actual.vue'
import Inventory from './components/Inventory.vue'
import Processing from './components/Processing.vue'
import Report from './components/Report.vue'
import Shipping from './components/Shipping.vue'
import Quality from './components/Quality.vue'
export default { export default {
name: 'DrSystem', name: 'DrSystem',
components: { Plan, ProcessSpec, Actual }, components: {
Plan,
ProcessSpec,
Actual,
Inventory,
Processing,
Report,
Shipping,
Quality,
},
data() { data() {
return { activeMenu: 'plan' } return { activeMenu: 'inventory' }
}, },
computed: { computed: {
currentComponent() { currentComponent() {
return { plan: 'Plan', processSpec: 'ProcessSpec', actual: 'Actual' }[this.activeMenu] return {
plan: 'Plan',
processSpec: 'ProcessSpec',
actual: 'Actual',
inventory: 'Inventory',
processing: 'Processing',
report: 'Report',
shipping: 'Shipping',
quality: 'Quality',
}[this.activeMenu]
} }
}, },
methods: { methods: {
@@ -45,6 +88,10 @@ export default {
</script> </script>
<style scoped lang="scss"> <style scoped lang="scss">
.app-container {
padding: 0 !important;
}
.dr-container { .dr-container {
display: flex; display: flex;
width: 100%; width: 100%;

View File

@@ -0,0 +1,40 @@
<template>
<div class="inventory-container">
<BasePage
:qrcode="false"
:querys="querys"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { DUGE_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'DugeInventory',
components: {
BasePage,
},
data() {
return {
querys: {
dataType: 1,
status: 0,
},
warehouseOptions: DUGE_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.inventory-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,39 @@
<template>
<div class="processing-container">
<el-tabs v-model="activeTab" type="border-card">
<el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.title" :name="tab.name">
<DoPage
v-if="activeTab === tab.name"
:label="tab.label"
:tabs="tab.tabs"
:useSpecialSplit="tab.useSpecialSplit"
/>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import DoPage from '@/views/wms/coil/panels/do.vue'
import { DUGE_PROCESSING_TABS } from '../config'
export default {
name: 'DugeProcessing',
components: {
DoPage,
},
data() {
return {
activeTab: 'process',
tabs: DUGE_PROCESSING_TABS,
}
},
}
</script>
<style scoped lang="scss">
.processing-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,92 @@
<template>
<div class="quality-container">
<el-tabs v-model="activeTab" class="quality-tabs">
<el-tab-pane label="异常钢卷" name="abnormal">
<div v-if="activeTab === 'abnormal'" class="tab-content">
<BasePage
:qrcode="false"
:querys="abnormalQuerys"
:labelType="'2'"
:hideType="false"
:showAbnormal="true"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="次品钢卷" name="defect">
<div v-if="activeTab === 'defect'" class="tab-content">
<BasePage
:qrcode="false"
:querys="defectQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="O卷" name="oil">
<div v-if="activeTab === 'oil'" class="tab-content">
<BasePage
:qrcode="false"
:querys="oilQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { DUGE_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'DugeQuality',
components: {
BasePage,
},
data() {
return {
activeTab: 'abnormal',
abnormalQuerys: {
dataType: 1,
orderByAbnormal: true,
},
defectQuerys: {
dataType: 1,
OnlyScrap: true,
},
oilQuerys: {
dataType: 1,
status: 0,
qualityStatus: 'O',
},
warehouseOptions: DUGE_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.quality-container {
width: 100%;
height: 100%;
.quality-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,67 @@
<template>
<div class="report-container">
<el-tabs v-model="activeTab" class="report-tabs">
<el-tab-pane label="综合报表" name="comprehensive">
<Comprehensive v-if="activeTab === 'comprehensive'" />
</el-tab-pane>
<el-tab-pane label="日报表" name="day">
<DayReport v-if="activeTab === 'day'" />
</el-tab-pane>
<el-tab-pane label="月报表" name="month">
<MonthReport v-if="activeTab === 'month'" />
</el-tab-pane>
<el-tab-pane label="年报表" name="year">
<YearReport v-if="activeTab === 'year'" />
</el-tab-pane>
<el-tab-pane label="损耗报表" name="loss">
<LossReport v-if="activeTab === 'loss'" />
</el-tab-pane>
<el-tab-pane label="产出报表" name="out">
<OutReport v-if="activeTab === 'out'" />
</el-tab-pane>
<el-tab-pane label="班报表" name="team">
<TeamReport v-if="activeTab === 'team'" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import Comprehensive from '@/views/wms/report/duge/comprehensive.vue'
import DayReport from '@/views/wms/report/duge/day.vue'
import MonthReport from '@/views/wms/report/duge/month.vue'
import YearReport from '@/views/wms/report/duge/year.vue'
import LossReport from '@/views/wms/report/duge/loss.vue'
import OutReport from '@/views/wms/report/duge/out.vue'
import TeamReport from '@/views/wms/report/duge/team.vue'
export default {
name: 'DugeReport',
components: {
Comprehensive,
DayReport,
MonthReport,
YearReport,
LossReport,
OutReport,
TeamReport,
},
data() {
return {
activeTab: 'comprehensive',
}
},
}
</script>
<style scoped lang="scss">
.report-container {
width: 100%;
height: 100%;
.report-tabs {
height: 100%;
overflow-y: auto;
}
}
</style>

View File

@@ -0,0 +1,79 @@
<template>
<div class="shipping-container">
<el-tabs v-model="activeTab" class="shipping-tabs">
<el-tab-pane label="配卷情况" name="waybill">
<div class="tab-content">
<BasePage
:qrcode="false"
:showWaybill="true"
:showNewExport="true"
:querys="waybillQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="发货记录" name="ship">
<div class="tab-content">
<BasePage
:qrcode="false"
:querys="shipQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showExportTime="true"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { DUGE_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'DugeShipping',
components: {
BasePage,
},
data() {
return {
activeTab: 'waybill',
waybillQuerys: {
dataType: 1,
includeBindInfo: true,
},
shipQuerys: {
dataType: 1,
status: 1,
},
warehouseOptions: DUGE_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.shipping-container {
width: 100%;
height: 100%;
.shipping-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,27 @@
export const DUGE_WAREHOUSE_OPTIONS = [
{ value: '1988151076996706306', label: '镀铬原料库' },
{ value: '1988151132361519105', label: '镀铬成品库' },
]
export const DUGE_PROCESSING_TABS = [
{
title: '镀铬工序',
name: 'process',
label: '镀铬工序',
tabs: DUGE_WAREHOUSE_OPTIONS,
useSpecialSplit: true,
},
{
title: '合卷',
name: 'merge',
label: '镀铬合卷',
useSpecialSplit: false,
},
{
title: '镀铬修复',
name: 'repair',
label: '镀铬修复工序',
tabs: DUGE_WAREHOUSE_OPTIONS,
useSpecialSplit: true,
},
]

View File

@@ -0,0 +1,129 @@
<template>
<div class="duge-container">
<div class="duge-sidebar">
<el-menu :default-active="activeMenu" class="sidebar-menu" @select="handleMenuSelect">
<el-menu-item index="inventory">
<i class="el-icon-box"></i>
<span slot="title">库存</span>
</el-menu-item>
<el-menu-item index="processing">
<i class="el-icon-s-operation"></i>
<span slot="title">WIP</span>
</el-menu-item>
<el-menu-item index="report">
<i class="el-icon-document"></i>
<span slot="title">报表</span>
</el-menu-item>
<el-menu-item index="shipping">
<i class="el-icon-truck"></i>
<span slot="title">发货</span>
</el-menu-item>
<el-menu-item index="quality">
<i class="el-icon-warning-outline"></i>
<span slot="title">品质</span>
</el-menu-item>
</el-menu>
</div>
<div class="duge-content">
<component :is="currentComponent" />
</div>
</div>
</template>
<script>
import Inventory from './components/Inventory.vue'
import Processing from './components/Processing.vue'
import Report from './components/Report.vue'
import Shipping from './components/Shipping.vue'
import Quality from './components/Quality.vue'
export default {
name: 'DugeSystem',
components: {
Inventory,
Processing,
Report,
Shipping,
Quality,
},
data() {
return {
activeMenu: 'inventory',
}
},
computed: {
currentComponent() {
const componentMap = {
inventory: 'Inventory',
processing: 'Processing',
report: 'Report',
shipping: 'Shipping',
quality: 'Quality',
}
return componentMap[this.activeMenu]
},
},
methods: {
handleMenuSelect(index) {
this.activeMenu = index
},
},
}
</script>
<style scoped lang="scss">
.app-container {
padding: 0 !important;
}
.duge-container {
display: flex;
width: 100%;
height: calc(100vh - 84px);
background-color: #f5f7fa;
}
.duge-sidebar {
width: 100px;
background-color: #fff;
border-right: 1px solid #e4e7ed;
display: flex;
flex-direction: column;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.05);
.sidebar-menu {
border: none;
background-color: transparent;
flex: 1;
overflow-y: auto;
border-right: none;
::v-deep .el-menu-item {
color: #606266;
padding: 0 20px;
font-size: 14px;
&:hover {
background-color: #ecf5ff;
color: #409eff;
}
&.is-active {
background-color: #ecf5ff;
color: #409eff;
border-right: 3px solid #409eff;
}
i {
font-size: 18px;
margin-right: 8px;
}
}
}
}
.duge-content {
flex: 1;
overflow: hidden;
}
</style>

View File

@@ -0,0 +1,42 @@
<template>
<div class="inventory-container">
<BasePage
:qrcode="false"
:querys="querys"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { LAJIAO_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'LajiaoInventory',
components: {
BasePage,
},
data() {
return {
// 拉矫平整集成库存直接复用钢卷基础查询面板,仅切换逻辑库区范围。
querys: {
dataType: 1,
status: 0,
},
// 这里使用拉矫平整主链路库区,避免把技术部/废品库等外围库区混入集成入口。
warehouseOptions: LAJIAO_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.inventory-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="processing-container">
<el-tabs v-model="activeTab" type="border-card">
<el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.title" :name="tab.name">
<DoPage
v-if="activeTab === tab.name"
:label="tab.label"
:tabs="tab.tabs"
:useSpecialSplit="tab.useSpecialSplit"
/>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import DoPage from '@/views/wms/coil/panels/do.vue'
import { LAJIAO_PROCESSING_TABS } from '../config'
export default {
name: 'LajiaoProcessing',
components: {
DoPage,
},
data() {
return {
// 拉矫平整 WIP 复用现有工序待办组件,只切换为拉矫平整工序标签与对应逻辑库区。
activeTab: 'process',
// 配置集中定义在 config.js便于后续同步调整工序名称与库区映射。
tabs: LAJIAO_PROCESSING_TABS,
}
},
}
</script>
<style scoped lang="scss">
.processing-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,97 @@
<template>
<div class="quality-container">
<el-tabs v-model="activeTab" class="quality-tabs">
<el-tab-pane label="异常钢卷" name="abnormal">
<div v-if="activeTab === 'abnormal'" class="tab-content">
<BasePage
:qrcode="false"
:querys="abnormalQuerys"
:labelType="'2'"
:hideType="false"
:showAbnormal="true"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="次品钢卷" name="defect">
<div v-if="activeTab === 'defect'" class="tab-content">
<BasePage
:qrcode="false"
:querys="defectQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="O卷" name="oil">
<div v-if="activeTab === 'oil'" class="tab-content">
<BasePage
:qrcode="false"
:querys="oilQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { LAJIAO_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'LajiaoQuality',
components: {
BasePage,
},
data() {
return {
// 品质页复用现有异常/次品/O 卷查询逻辑,只切换拉矫平整库区范围。
activeTab: 'abnormal',
abnormalQuerys: {
// 异常钢卷默认按异常信息排序,便于品质人员优先处理。
dataType: 1,
orderByAbnormal: true,
},
defectQuerys: {
// 次品钢卷使用现有 scrap 口径。
dataType: 1,
OnlyScrap: true,
},
oilQuerys: {
// O 卷通过质量状态过滤,不额外增加专用接口。
dataType: 1,
status: 0,
qualityStatus: 'O',
},
// 品质板块的库区范围与拉矫平整集成其余板块一致,保证筛选口径统一。
warehouseOptions: LAJIAO_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.quality-container {
width: 100%;
height: 100%;
.quality-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,69 @@
<template>
<div class="report-container">
<el-tabs v-model="activeTab" class="report-tabs">
<el-tab-pane label="综合报表" name="comprehensive">
<Comprehensive v-if="activeTab === 'comprehensive'" />
</el-tab-pane>
<el-tab-pane label="日报表" name="day">
<DayReport v-if="activeTab === 'day'" />
</el-tab-pane>
<el-tab-pane label="月报表" name="month">
<MonthReport v-if="activeTab === 'month'" />
</el-tab-pane>
<el-tab-pane label="年报表" name="year">
<YearReport v-if="activeTab === 'year'" />
</el-tab-pane>
<el-tab-pane label="损耗报表" name="loss">
<LossReport v-if="activeTab === 'loss'" />
</el-tab-pane>
<el-tab-pane label="产出报表" name="out">
<OutReport v-if="activeTab === 'out'" />
</el-tab-pane>
<el-tab-pane label="班报表" name="team">
<TeamReport v-if="activeTab === 'team'" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import Comprehensive from '@/views/wms/report/lajiao/comprehensive.vue'
import DayReport from '@/views/wms/report/lajiao/day.vue'
import MonthReport from '@/views/wms/report/lajiao/month.vue'
import YearReport from '@/views/wms/report/lajiao/year.vue'
import LossReport from '@/views/wms/report/lajiao/loss.vue'
import OutReport from '@/views/wms/report/lajiao/out.vue'
import TeamReport from '@/views/wms/report/lajiao/team.vue'
export default {
name: 'LajiaoReport',
components: {
Comprehensive,
DayReport,
MonthReport,
YearReport,
LossReport,
OutReport,
TeamReport,
},
data() {
return {
// 报表页直接复用 wms/report/lajiao 下的既有报表资源,
// 集成页只负责聚合入口,不额外改写报表查询逻辑。
activeTab: 'comprehensive',
}
},
}
</script>
<style scoped lang="scss">
.report-container {
width: 100%;
height: 100%;
.report-tabs {
height: 100%;
overflow-y: auto;
}
}
</style>

View File

@@ -0,0 +1,83 @@
<template>
<div class="shipping-container">
<el-tabs v-model="activeTab" class="shipping-tabs">
<el-tab-pane label="配卷情况" name="waybill">
<div class="tab-content">
<BasePage
:qrcode="false"
:showWaybill="true"
:showNewExport="true"
:querys="waybillQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="发货记录" name="ship">
<div class="tab-content">
<BasePage
:qrcode="false"
:querys="shipQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showExportTime="true"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { LAJIAO_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'LajiaoShipping',
components: {
BasePage,
},
data() {
return {
// 发货板块沿用现有钢卷发运能力,仅将过滤库区限定为拉矫平整工序链路。
activeTab: 'waybill',
waybillQuerys: {
// 配卷情况需要带上发货绑定信息,便于直接查看配卷结果。
dataType: 1,
includeBindInfo: true,
},
shipQuerys: {
// 发货记录仅查看已发货数据。
dataType: 1,
status: 1,
},
// 发货板块与库存/WIP 保持相同库区口径,避免统计口径不一致。
warehouseOptions: LAJIAO_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.shipping-container {
width: 100%;
height: 100%;
.shipping-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,40 @@
// 拉矫平整集成页公共配置。
// 这里统一维护五个板块共用的逻辑库区保持库存、WIP、发货、品质口径一致。
// 拉矫平整主链路逻辑库区:
// 1. 拉矫原料库:拉矫平整工序入口原料
// 2. 拉矫成品库:拉矫平整工序产出成品
// 3. 双机架原料库:拉矫下游衔接库区
export const LAJIAO_WAREHOUSE_OPTIONS = [
{ value: '1988150854442741762', label: '拉矫原料库' },
{ value: '1988150915591499777', label: '拉矫成品库' },
{ value: '1992873386047643650', label: '双机架原料库' },
]
// 拉矫平整 WIP 直接复用现有 WMS 工序组件:
// - 拉矫平整工序、拉矫修复工序走 specialSplit 流程
// - 拉矫平整合卷走普通待办流程
export const LAJIAO_PROCESSING_TABS = [
{
title: '拉矫平整工序',
name: 'process',
label: '拉矫平整工序',
// 拉矫平整工序和修复工序都限定在主链路库区内操作。
tabs: LAJIAO_WAREHOUSE_OPTIONS,
useSpecialSplit: true,
},
{
title: '合卷',
name: 'merge',
label: '拉矫平整合卷',
// 合卷沿用待办单模式,不需要传入库区页签。
useSpecialSplit: false,
},
{
title: '拉矫修复',
name: 'repair',
label: '拉矫修复工序',
tabs: LAJIAO_WAREHOUSE_OPTIONS,
useSpecialSplit: true,
},
]

View File

@@ -0,0 +1,133 @@
<template>
<div class="lajiao-container">
<div class="lajiao-sidebar">
<el-menu :default-active="activeMenu" class="sidebar-menu" @select="handleMenuSelect">
<!-- 拉矫平整集成页按需求只保留五个核心业务板块 -->
<el-menu-item index="inventory">
<i class="el-icon-box"></i>
<span slot="title">库存</span>
</el-menu-item>
<el-menu-item index="processing">
<i class="el-icon-s-operation"></i>
<span slot="title">WIP</span>
</el-menu-item>
<el-menu-item index="report">
<i class="el-icon-document"></i>
<span slot="title">报表</span>
</el-menu-item>
<el-menu-item index="shipping">
<i class="el-icon-truck"></i>
<span slot="title">发货</span>
</el-menu-item>
<el-menu-item index="quality">
<i class="el-icon-warning-outline"></i>
<span slot="title">品质</span>
</el-menu-item>
</el-menu>
</div>
<div class="lajiao-content">
<component :is="currentComponent" />
</div>
</div>
</template>
<script>
import Inventory from './components/Inventory.vue'
import Processing from './components/Processing.vue'
import Report from './components/Report.vue'
import Shipping from './components/Shipping.vue'
import Quality from './components/Quality.vue'
export default {
name: 'LajiaoSystem',
components: {
Inventory,
Processing,
Report,
Shipping,
Quality,
},
data() {
return {
// 默认先展示库存板块,与酸轧、镀锌、脱脂集成入口保持一致。
activeMenu: 'inventory',
}
},
computed: {
currentComponent() {
// 集成页只作为业务导航壳,具体业务能力由各子组件承载。
const componentMap = {
inventory: 'Inventory',
processing: 'Processing',
report: 'Report',
shipping: 'Shipping',
quality: 'Quality',
}
return componentMap[this.activeMenu]
},
},
methods: {
handleMenuSelect(index) {
// 左侧菜单切换时,仅替换右侧业务面板,不做额外路由跳转。
this.activeMenu = index
},
},
}
</script>
<style scoped lang="scss">
.app-container {
padding: 0 !important;
}
.lajiao-container {
display: flex;
width: 100%;
height: calc(100vh - 84px);
background-color: #f5f7fa;
}
.lajiao-sidebar {
width: 100px;
background-color: #fff;
border-right: 1px solid #e4e7ed;
display: flex;
flex-direction: column;
box-shadow: 2px 0 8px rgba(0, 0, 0, 0.05);
.sidebar-menu {
border: none;
background-color: transparent;
flex: 1;
overflow-y: auto;
border-right: none;
::v-deep .el-menu-item {
color: #606266;
padding: 0 20px;
font-size: 14px;
&:hover {
background-color: #ecf5ff;
color: #409eff;
}
&.is-active {
background-color: #ecf5ff;
color: #409eff;
border-right: 3px solid #409eff;
}
i {
font-size: 18px;
margin-right: 8px;
}
}
}
}
.lajiao-content {
flex: 1;
overflow: hidden;
}
</style>

View File

@@ -0,0 +1,41 @@
<template>
<div class="inventory-container">
<BasePage
:qrcode="false"
:querys="querys"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { SPLIT_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'SplitInventory',
components: {
BasePage,
},
data() {
return {
// 分条集成库存直接复用钢卷基础查询面板,仅切换到分条成品链路库区。
querys: {
dataType: 1,
status: 0,
},
warehouseOptions: SPLIT_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.inventory-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,40 @@
<template>
<div class="processing-container">
<el-tabs v-model="activeTab" type="border-card">
<el-tab-pane v-for="tab in tabs" :key="tab.name" :label="tab.title" :name="tab.name">
<DoPage
v-if="activeTab === tab.name"
:label="tab.label"
:tabs="tab.tabs"
:useSpecialSplit="tab.useSpecialSplit"
/>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import DoPage from '@/views/wms/coil/panels/do.vue'
import { SPLIT_PROCESSING_TABS } from '../config'
export default {
name: 'SplitProcessing',
components: {
DoPage,
},
data() {
return {
// 纵剪分条 WIP 目前仅复用现有“纵剪分条工序”能力,不额外引入不存在的合卷/修复页签。
activeTab: 'process',
tabs: SPLIT_PROCESSING_TABS,
}
},
}
</script>
<style scoped lang="scss">
.processing-container {
width: 100%;
height: 100%;
}
</style>

View File

@@ -0,0 +1,93 @@
<template>
<div class="quality-container">
<el-tabs v-model="activeTab" class="quality-tabs">
<el-tab-pane label="异常钢卷" name="abnormal">
<div v-if="activeTab === 'abnormal'" class="tab-content">
<BasePage
:qrcode="false"
:querys="abnormalQuerys"
:labelType="'2'"
:hideType="false"
:showAbnormal="true"
:showControl="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="次品钢卷" name="defect">
<div v-if="activeTab === 'defect'" class="tab-content">
<BasePage
:qrcode="false"
:querys="defectQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="O卷" name="oil">
<div v-if="activeTab === 'oil'" class="tab-content">
<BasePage
:qrcode="false"
:querys="oilQuerys"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { SPLIT_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'SplitQuality',
components: {
BasePage,
},
data() {
return {
// 品质页复用现有异常/次品/O 卷查询逻辑,只切换分条成品链路库区范围。
activeTab: 'abnormal',
abnormalQuerys: {
dataType: 1,
orderByAbnormal: true,
},
defectQuerys: {
dataType: 1,
OnlyScrap: true,
},
oilQuerys: {
dataType: 1,
status: 0,
qualityStatus: 'O',
},
warehouseOptions: SPLIT_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.quality-container {
width: 100%;
height: 100%;
.quality-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

View File

@@ -0,0 +1,68 @@
<template>
<div class="report-container">
<el-tabs v-model="activeTab" class="report-tabs">
<el-tab-pane label="综合报表" name="comprehensive">
<Comprehensive v-if="activeTab === 'comprehensive'" />
</el-tab-pane>
<el-tab-pane label="日报表" name="day">
<DayReport v-if="activeTab === 'day'" />
</el-tab-pane>
<el-tab-pane label="月报表" name="month">
<MonthReport v-if="activeTab === 'month'" />
</el-tab-pane>
<el-tab-pane label="年报表" name="year">
<YearReport v-if="activeTab === 'year'" />
</el-tab-pane>
<el-tab-pane label="损耗报表" name="loss">
<LossReport v-if="activeTab === 'loss'" />
</el-tab-pane>
<el-tab-pane label="产出报表" name="out">
<OutReport v-if="activeTab === 'out'" />
</el-tab-pane>
<el-tab-pane label="班报表" name="team">
<TeamReport v-if="activeTab === 'team'" />
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import Comprehensive from '@/views/wms/report/split/comprehensive.vue'
import DayReport from '@/views/wms/report/split/day.vue'
import MonthReport from '@/views/wms/report/split/month.vue'
import YearReport from '@/views/wms/report/split/year.vue'
import LossReport from '@/views/wms/report/split/loss.vue'
import OutReport from '@/views/wms/report/split/out.vue'
import TeamReport from '@/views/wms/report/split/team.vue'
export default {
name: 'SplitReport',
components: {
Comprehensive,
DayReport,
MonthReport,
YearReport,
LossReport,
OutReport,
TeamReport,
},
data() {
return {
// 报表页直接复用 wms/report/split 下的既有报表资源。
activeTab: 'comprehensive',
}
},
}
</script>
<style scoped lang="scss">
.report-container {
width: 100%;
height: 100%;
.report-tabs {
height: 100%;
overflow-y: auto;
}
}
</style>

View File

@@ -0,0 +1,80 @@
<template>
<div class="shipping-container">
<el-tabs v-model="activeTab" class="shipping-tabs">
<el-tab-pane label="配卷情况" name="waybill">
<div class="tab-content">
<BasePage
:qrcode="false"
:showWaybill="true"
:showNewExport="true"
:querys="waybillQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
<el-tab-pane label="发货记录" name="ship">
<div class="tab-content">
<BasePage
:qrcode="false"
:querys="shipQuerys"
:showStatus="false"
:hideType="false"
:useWarehouseIds="true"
:warehouseOptions="warehouseOptions"
:showControl="false"
:showExportTime="true"
:showMaterialType="true"
/>
</div>
</el-tab-pane>
</el-tabs>
</div>
</template>
<script>
import BasePage from '@/views/wms/coil/panels/base.vue'
import { SPLIT_WAREHOUSE_OPTIONS } from '../config'
export default {
name: 'SplitShipping',
components: {
BasePage,
},
data() {
return {
// 发货板块沿用现有钢卷发运能力,仅将过滤库区限定为分条成品链路。
activeTab: 'waybill',
waybillQuerys: {
dataType: 1,
includeBindInfo: true,
},
shipQuerys: {
dataType: 1,
status: 1,
},
warehouseOptions: SPLIT_WAREHOUSE_OPTIONS,
}
},
}
</script>
<style scoped lang="scss">
.shipping-container {
width: 100%;
height: 100%;
.shipping-tabs {
height: 100%;
overflow-y: auto;
}
.tab-content {
height: 100%;
}
}
</style>

Some files were not shown because too many files have changed in this diff Show More