diff --git a/klp-admin/pom.xml b/klp-admin/pom.xml
index 08c5aa7c2..676b77b58 100644
--- a/klp-admin/pom.xml
+++ b/klp-admin/pom.xml
@@ -146,6 +146,12 @@
klp-pltcm
+
+
+ com.klp
+ klp-perf
+
+
org.springframework.boot
spring-boot-starter-test
diff --git a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java
index 0630ab031..002a2e3ec 100644
--- a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java
+++ b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderController.java
@@ -1,10 +1,13 @@
package com.klp.crm.controller;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Arrays;
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.ApsPlanSheetBo;
import lombok.RequiredArgsConstructor;
@@ -23,6 +26,7 @@ import com.klp.common.core.validate.EditGroup;
import com.klp.common.enums.BusinessType;
import com.klp.common.utils.poi.ExcelUtil;
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.service.ICrmOrderService;
import com.klp.common.core.page.TableDataInfo;
@@ -65,6 +69,35 @@ public class CrmOrderController extends BaseController {
ExcelUtil.exportExcel(list, "正式订单主", CrmOrderVo.class, response);
}
+ /**
+ * 导出正式订单主列表(业务精简字段,用于合同编辑详情页导出)
+ */
+ @Log(title = "正式订单主", businessType = BusinessType.EXPORT)
+ @PostMapping("/exportDetail")
+ public void exportDetail(@RequestBody CrmOrderBo bo, HttpServletResponse response) {
+ List list = iCrmOrderService.queryList(bo);
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ List 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);
+ }
+
/**
* 获取正式订单主详细信息
*
diff --git a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java
index e18d2f75b..610aaedbd 100644
--- a/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java
+++ b/klp-crm/src/main/java/com/klp/crm/controller/CrmOrderItemController.java
@@ -1,7 +1,11 @@
package com.klp.crm.controller;
+import java.text.SimpleDateFormat;
import java.util.List;
import java.util.Arrays;
+import java.util.stream.Collectors;
+
+import cn.hutool.core.bean.BeanUtil;
import lombok.RequiredArgsConstructor;
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.utils.poi.ExcelUtil;
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.bo.CrmOrderItemBo;
import com.klp.crm.service.ICrmOrderItemService;
@@ -56,6 +61,30 @@ public class CrmOrderItemController extends BaseController {
ExcelUtil.exportExcel(list, "正式订单明细", CrmOrderItemVo.class, response);
}
+ /**
+ * 导出正式订单明细列表(业务精简字段,用于订单明细列表页导出)
+ */
+ @Log(title = "正式订单明细", businessType = BusinessType.EXPORT)
+ @PostMapping("/exportDetail")
+ public void exportDetail(@RequestBody CrmOrderItemBo bo, HttpServletResponse response) {
+ List list = iCrmOrderItemService.queryList(bo);
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+ List 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);
+ }
+
/**
* 获取正式订单明细详细信息
*
diff --git a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderExportVo.java b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderExportVo.java
new file mode 100644
index 000000000..5fe801d0d
--- /dev/null
+++ b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderExportVo.java
@@ -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;
+}
diff --git a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemExportVo.java b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemExportVo.java
new file mode 100644
index 000000000..82c1248c3
--- /dev/null
+++ b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemExportVo.java
@@ -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;
+}
diff --git a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java
index d0a5da630..06900d0e9 100644
--- a/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java
+++ b/klp-crm/src/main/java/com/klp/crm/domain/vo/CrmOrderItemVo.java
@@ -234,6 +234,12 @@ public class CrmOrderItemVo {
@ExcelProperty(value = "交货日期")
private Date deliveryDate;
+ /**
+ * 销售员(联表查询直接映射)
+ */
+ @ExcelProperty(value = "销售员")
+ private String salesman;
+
/**
* 订单信息
*/
diff --git a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java
index 9a493a3d2..d6a6d6346 100644
--- a/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java
+++ b/klp-crm/src/main/java/com/klp/crm/service/impl/CrmOrderItemServiceImpl.java
@@ -168,7 +168,11 @@ public class CrmOrderItemServiceImpl implements ICrmOrderItemService {
Map orderMap = orderList.stream()
.collect(Collectors.toMap(CrmOrderVo::getOrderId, o -> o, (a, b) -> a));
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());
+ }
}
}
diff --git a/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml b/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml
index 040882f6a..0c8e425d4 100644
--- a/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml
+++ b/klp-crm/src/main/resources/mapper/CrmOrderItemMapper.xml
@@ -74,6 +74,7 @@
+
@@ -155,7 +156,8 @@
o.supplier,
o.customer,
o.sign_time,
- o.delivery_date
+ o.delivery_date,
+ o.salesman
FROM crm_order_item i
LEFT JOIN crm_order o ON i.order_id = o.order_id AND o.del_flag = 0
diff --git a/klp-perf/pom.xml b/klp-perf/pom.xml
new file mode 100644
index 000000000..383f73a92
--- /dev/null
+++ b/klp-perf/pom.xml
@@ -0,0 +1,28 @@
+
+
+
+ klp-oa
+ com.klp
+ 0.8.3
+
+ 4.0.0
+
+ klp-perf
+
+
+ 性能管理模块
+
+
+
+
+
+
+ com.klp
+ klp-common
+
+
+
+
+
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfAppraisalController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfAppraisalController.java
new file mode 100644
index 000000000..6904fc9e3
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfAppraisalController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfAppraisalVo;
+import com.klp.perf.domain.bo.PerfAppraisalBo;
+import com.klp.perf.service.IPerfAppraisalService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 月度绩效考核记录
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/appraisal")
+public class PerfAppraisalController extends BaseController {
+
+ private final IPerfAppraisalService iPerfAppraisalService;
+
+ /**
+ * 查询月度绩效考核记录列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfAppraisalBo bo, PageQuery pageQuery) {
+ return iPerfAppraisalService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出月度绩效考核记录列表
+ */
+ @Log(title = "月度绩效考核记录", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfAppraisalBo bo, HttpServletResponse response) {
+ List list = iPerfAppraisalService.queryList(bo);
+ ExcelUtil.exportExcel(list, "月度绩效考核记录", PerfAppraisalVo.class, response);
+ }
+
+ /**
+ * 获取月度绩效考核记录详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfAppraisalService.queryById(id));
+ }
+
+ /**
+ * 新增月度绩效考核记录
+ */
+ @Log(title = "月度绩效考核记录", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfAppraisalBo bo) {
+ return toAjax(iPerfAppraisalService.insertByBo(bo));
+ }
+
+ /**
+ * 修改月度绩效考核记录
+ */
+ @Log(title = "月度绩效考核记录", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfAppraisalBo bo) {
+ return toAjax(iPerfAppraisalService.updateByBo(bo));
+ }
+
+ /**
+ * 删除月度绩效考核记录
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "月度绩效考核记录", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfAppraisalService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfAppraisalDetailController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfAppraisalDetailController.java
new file mode 100644
index 000000000..d35b90601
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfAppraisalDetailController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfAppraisalDetailVo;
+import com.klp.perf.domain.bo.PerfAppraisalDetailBo;
+import com.klp.perf.service.IPerfAppraisalDetailService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 考核维度评分明细
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/appraisalDetail")
+public class PerfAppraisalDetailController extends BaseController {
+
+ private final IPerfAppraisalDetailService iPerfAppraisalDetailService;
+
+ /**
+ * 查询考核维度评分明细列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfAppraisalDetailBo bo, PageQuery pageQuery) {
+ return iPerfAppraisalDetailService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出考核维度评分明细列表
+ */
+ @Log(title = "考核维度评分明细", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfAppraisalDetailBo bo, HttpServletResponse response) {
+ List list = iPerfAppraisalDetailService.queryList(bo);
+ ExcelUtil.exportExcel(list, "考核维度评分明细", PerfAppraisalDetailVo.class, response);
+ }
+
+ /**
+ * 获取考核维度评分明细详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfAppraisalDetailService.queryById(id));
+ }
+
+ /**
+ * 新增考核维度评分明细
+ */
+ @Log(title = "考核维度评分明细", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfAppraisalDetailBo bo) {
+ return toAjax(iPerfAppraisalDetailService.insertByBo(bo));
+ }
+
+ /**
+ * 修改考核维度评分明细
+ */
+ @Log(title = "考核维度评分明细", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfAppraisalDetailBo bo) {
+ return toAjax(iPerfAppraisalDetailService.updateByBo(bo));
+ }
+
+ /**
+ * 删除考核维度评分明细
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "考核维度评分明细", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfAppraisalDetailService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfCoeffRangeController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfCoeffRangeController.java
new file mode 100644
index 000000000..1cc520bc8
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfCoeffRangeController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfCoeffRangeVo;
+import com.klp.perf.domain.bo.PerfCoeffRangeBo;
+import com.klp.perf.service.IPerfCoeffRangeService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 绩效系数换算
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/coeffRange")
+public class PerfCoeffRangeController extends BaseController {
+
+ private final IPerfCoeffRangeService iPerfCoeffRangeService;
+
+ /**
+ * 查询绩效系数换算列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfCoeffRangeBo bo, PageQuery pageQuery) {
+ return iPerfCoeffRangeService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出绩效系数换算列表
+ */
+ @Log(title = "绩效系数换算", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfCoeffRangeBo bo, HttpServletResponse response) {
+ List list = iPerfCoeffRangeService.queryList(bo);
+ ExcelUtil.exportExcel(list, "绩效系数换算", PerfCoeffRangeVo.class, response);
+ }
+
+ /**
+ * 获取绩效系数换算详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfCoeffRangeService.queryById(id));
+ }
+
+ /**
+ * 新增绩效系数换算
+ */
+ @Log(title = "绩效系数换算", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfCoeffRangeBo bo) {
+ return toAjax(iPerfCoeffRangeService.insertByBo(bo));
+ }
+
+ /**
+ * 修改绩效系数换算
+ */
+ @Log(title = "绩效系数换算", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfCoeffRangeBo bo) {
+ return toAjax(iPerfCoeffRangeService.updateByBo(bo));
+ }
+
+ /**
+ * 删除绩效系数换算
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "绩效系数换算", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfCoeffRangeService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptConfigController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptConfigController.java
new file mode 100644
index 000000000..5ed8a8b9e
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptConfigController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfDeptConfigVo;
+import com.klp.perf.domain.bo.PerfDeptConfigBo;
+import com.klp.perf.service.IPerfDeptConfigService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 车间考核参数配置
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/deptConfig")
+public class PerfDeptConfigController extends BaseController {
+
+ private final IPerfDeptConfigService iPerfDeptConfigService;
+
+ /**
+ * 查询车间考核参数配置列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfDeptConfigBo bo, PageQuery pageQuery) {
+ return iPerfDeptConfigService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出车间考核参数配置列表
+ */
+ @Log(title = "车间考核参数配置", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfDeptConfigBo bo, HttpServletResponse response) {
+ List list = iPerfDeptConfigService.queryList(bo);
+ ExcelUtil.exportExcel(list, "车间考核参数配置", PerfDeptConfigVo.class, response);
+ }
+
+ /**
+ * 获取车间考核参数配置详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfDeptConfigService.queryById(id));
+ }
+
+ /**
+ * 新增车间考核参数配置
+ */
+ @Log(title = "车间考核参数配置", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfDeptConfigBo bo) {
+ return toAjax(iPerfDeptConfigService.insertByBo(bo));
+ }
+
+ /**
+ * 修改车间考核参数配置
+ */
+ @Log(title = "车间考核参数配置", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfDeptConfigBo bo) {
+ return toAjax(iPerfDeptConfigService.updateByBo(bo));
+ }
+
+ /**
+ * 删除车间考核参数配置
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "车间考核参数配置", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfDeptConfigService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptController.java
new file mode 100644
index 000000000..b58b43dee
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfDeptVo;
+import com.klp.perf.domain.bo.PerfDeptBo;
+import com.klp.perf.service.IPerfDeptService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 绩效系统部门
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/dept")
+public class PerfDeptController extends BaseController {
+
+ private final IPerfDeptService iPerfDeptService;
+
+ /**
+ * 查询绩效系统部门列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfDeptBo bo, PageQuery pageQuery) {
+ return iPerfDeptService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出绩效系统部门列表
+ */
+ @Log(title = "绩效系统部门", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfDeptBo bo, HttpServletResponse response) {
+ List list = iPerfDeptService.queryList(bo);
+ ExcelUtil.exportExcel(list, "绩效系统部门", PerfDeptVo.class, response);
+ }
+
+ /**
+ * 获取绩效系统部门详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfDeptService.queryById(id));
+ }
+
+ /**
+ * 新增绩效系统部门
+ */
+ @Log(title = "绩效系统部门", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfDeptBo bo) {
+ return toAjax(iPerfDeptService.insertByBo(bo));
+ }
+
+ /**
+ * 修改绩效系统部门
+ */
+ @Log(title = "绩效系统部门", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfDeptBo bo) {
+ return toAjax(iPerfDeptService.updateByBo(bo));
+ }
+
+ /**
+ * 删除绩效系统部门
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "绩效系统部门", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfDeptService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptItemConfigController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptItemConfigController.java
new file mode 100644
index 000000000..9e632b78b
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptItemConfigController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfDeptItemConfigVo;
+import com.klp.perf.domain.bo.PerfDeptItemConfigBo;
+import com.klp.perf.service.IPerfDeptItemConfigService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 车间扣款/奖励项目配置
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/deptItemConfig")
+public class PerfDeptItemConfigController extends BaseController {
+
+ private final IPerfDeptItemConfigService iPerfDeptItemConfigService;
+
+ /**
+ * 查询车间扣款/奖励项目配置列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfDeptItemConfigBo bo, PageQuery pageQuery) {
+ return iPerfDeptItemConfigService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出车间扣款/奖励项目配置列表
+ */
+ @Log(title = "车间扣款/奖励项目配置", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfDeptItemConfigBo bo, HttpServletResponse response) {
+ List list = iPerfDeptItemConfigService.queryList(bo);
+ ExcelUtil.exportExcel(list, "车间扣款/奖励项目配置", PerfDeptItemConfigVo.class, response);
+ }
+
+ /**
+ * 获取车间扣款/奖励项目配置详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfDeptItemConfigService.queryById(id));
+ }
+
+ /**
+ * 新增车间扣款/奖励项目配置
+ */
+ @Log(title = "车间扣款/奖励项目配置", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfDeptItemConfigBo bo) {
+ return toAjax(iPerfDeptItemConfigService.insertByBo(bo));
+ }
+
+ /**
+ * 修改车间扣款/奖励项目配置
+ */
+ @Log(title = "车间扣款/奖励项目配置", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfDeptItemConfigBo bo) {
+ return toAjax(iPerfDeptItemConfigService.updateByBo(bo));
+ }
+
+ /**
+ * 删除车间扣款/奖励项目配置
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "车间扣款/奖励项目配置", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfDeptItemConfigService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptSummaryController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptSummaryController.java
new file mode 100644
index 000000000..609c40ea5
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfDeptSummaryController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfDeptSummaryVo;
+import com.klp.perf.domain.bo.PerfDeptSummaryBo;
+import com.klp.perf.service.IPerfDeptSummaryService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 车间月度汇总
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/deptSummary")
+public class PerfDeptSummaryController extends BaseController {
+
+ private final IPerfDeptSummaryService iPerfDeptSummaryService;
+
+ /**
+ * 查询车间月度汇总列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfDeptSummaryBo bo, PageQuery pageQuery) {
+ return iPerfDeptSummaryService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出车间月度汇总列表
+ */
+ @Log(title = "车间月度汇总", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfDeptSummaryBo bo, HttpServletResponse response) {
+ List list = iPerfDeptSummaryService.queryList(bo);
+ ExcelUtil.exportExcel(list, "车间月度汇总", PerfDeptSummaryVo.class, response);
+ }
+
+ /**
+ * 获取车间月度汇总详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfDeptSummaryService.queryById(id));
+ }
+
+ /**
+ * 新增车间月度汇总
+ */
+ @Log(title = "车间月度汇总", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfDeptSummaryBo bo) {
+ return toAjax(iPerfDeptSummaryService.insertByBo(bo));
+ }
+
+ /**
+ * 修改车间月度汇总
+ */
+ @Log(title = "车间月度汇总", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfDeptSummaryBo bo) {
+ return toAjax(iPerfDeptSummaryService.updateByBo(bo));
+ }
+
+ /**
+ * 删除车间月度汇总
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "车间月度汇总", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfDeptSummaryService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfEmployeeInfoController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfEmployeeInfoController.java
new file mode 100644
index 000000000..5d18464cc
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfEmployeeInfoController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfEmployeeInfoVo;
+import com.klp.perf.domain.bo.PerfEmployeeInfoBo;
+import com.klp.perf.service.IPerfEmployeeInfoService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 员工绩效薪资基本信息
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/employeeInfo")
+public class PerfEmployeeInfoController extends BaseController {
+
+ private final IPerfEmployeeInfoService iPerfEmployeeInfoService;
+
+ /**
+ * 查询员工绩效薪资基本信息列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfEmployeeInfoBo bo, PageQuery pageQuery) {
+ return iPerfEmployeeInfoService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出员工绩效薪资基本信息列表
+ */
+ @Log(title = "员工绩效薪资基本信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfEmployeeInfoBo bo, HttpServletResponse response) {
+ List list = iPerfEmployeeInfoService.queryList(bo);
+ ExcelUtil.exportExcel(list, "员工绩效薪资基本信息", PerfEmployeeInfoVo.class, response);
+ }
+
+ /**
+ * 获取员工绩效薪资基本信息详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfEmployeeInfoService.queryById(id));
+ }
+
+ /**
+ * 新增员工绩效薪资基本信息
+ */
+ @Log(title = "员工绩效薪资基本信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfEmployeeInfoBo bo) {
+ return toAjax(iPerfEmployeeInfoService.insertByBo(bo));
+ }
+
+ /**
+ * 修改员工绩效薪资基本信息
+ */
+ @Log(title = "员工绩效薪资基本信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfEmployeeInfoBo bo) {
+ return toAjax(iPerfEmployeeInfoService.updateByBo(bo));
+ }
+
+ /**
+ * 删除员工绩效薪资基本信息
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "员工绩效薪资基本信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfEmployeeInfoService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfPositionTemplateController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfPositionTemplateController.java
new file mode 100644
index 000000000..9a266bb7d
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfPositionTemplateController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfPositionTemplateVo;
+import com.klp.perf.domain.bo.PerfPositionTemplateBo;
+import com.klp.perf.service.IPerfPositionTemplateService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 岗位绩效考核模板
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/positionTemplate")
+public class PerfPositionTemplateController extends BaseController {
+
+ private final IPerfPositionTemplateService iPerfPositionTemplateService;
+
+ /**
+ * 查询岗位绩效考核模板列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfPositionTemplateBo bo, PageQuery pageQuery) {
+ return iPerfPositionTemplateService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出岗位绩效考核模板列表
+ */
+ @Log(title = "岗位绩效考核模板", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfPositionTemplateBo bo, HttpServletResponse response) {
+ List list = iPerfPositionTemplateService.queryList(bo);
+ ExcelUtil.exportExcel(list, "岗位绩效考核模板", PerfPositionTemplateVo.class, response);
+ }
+
+ /**
+ * 获取岗位绩效考核模板详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfPositionTemplateService.queryById(id));
+ }
+
+ /**
+ * 新增岗位绩效考核模板
+ */
+ @Log(title = "岗位绩效考核模板", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfPositionTemplateBo bo) {
+ return toAjax(iPerfPositionTemplateService.insertByBo(bo));
+ }
+
+ /**
+ * 修改岗位绩效考核模板
+ */
+ @Log(title = "岗位绩效考核模板", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfPositionTemplateBo bo) {
+ return toAjax(iPerfPositionTemplateService.updateByBo(bo));
+ }
+
+ /**
+ * 删除岗位绩效考核模板
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "岗位绩效考核模板", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfPositionTemplateService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfSalaryController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfSalaryController.java
new file mode 100644
index 000000000..55d783204
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfSalaryController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfSalaryVo;
+import com.klp.perf.domain.bo.PerfSalaryBo;
+import com.klp.perf.service.IPerfSalaryService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 月度薪资计算记录
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/salary")
+public class PerfSalaryController extends BaseController {
+
+ private final IPerfSalaryService iPerfSalaryService;
+
+ /**
+ * 查询月度薪资计算记录列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfSalaryBo bo, PageQuery pageQuery) {
+ return iPerfSalaryService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出月度薪资计算记录列表
+ */
+ @Log(title = "月度薪资计算记录", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfSalaryBo bo, HttpServletResponse response) {
+ List list = iPerfSalaryService.queryList(bo);
+ ExcelUtil.exportExcel(list, "月度薪资计算记录", PerfSalaryVo.class, response);
+ }
+
+ /**
+ * 获取月度薪资计算记录详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfSalaryService.queryById(id));
+ }
+
+ /**
+ * 新增月度薪资计算记录
+ */
+ @Log(title = "月度薪资计算记录", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfSalaryBo bo) {
+ return toAjax(iPerfSalaryService.insertByBo(bo));
+ }
+
+ /**
+ * 修改月度薪资计算记录
+ */
+ @Log(title = "月度薪资计算记录", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfSalaryBo bo) {
+ return toAjax(iPerfSalaryService.updateByBo(bo));
+ }
+
+ /**
+ * 删除月度薪资计算记录
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "月度薪资计算记录", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfSalaryService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/controller/PerfTemplateDimensionController.java b/klp-perf/src/main/java/com/klp/perf/controller/PerfTemplateDimensionController.java
new file mode 100644
index 000000000..5298ae3ba
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/controller/PerfTemplateDimensionController.java
@@ -0,0 +1,99 @@
+package com.klp.perf.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.perf.domain.vo.PerfTemplateDimensionVo;
+import com.klp.perf.domain.bo.PerfTemplateDimensionBo;
+import com.klp.perf.service.IPerfTemplateDimensionService;
+import com.klp.common.core.page.TableDataInfo;
+
+/**
+ * 考核维度明细
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/perf/templateDimension")
+public class PerfTemplateDimensionController extends BaseController {
+
+ private final IPerfTemplateDimensionService iPerfTemplateDimensionService;
+
+ /**
+ * 查询考核维度明细列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(PerfTemplateDimensionBo bo, PageQuery pageQuery) {
+ return iPerfTemplateDimensionService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出考核维度明细列表
+ */
+ @Log(title = "考核维度明细", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(PerfTemplateDimensionBo bo, HttpServletResponse response) {
+ List list = iPerfTemplateDimensionService.queryList(bo);
+ ExcelUtil.exportExcel(list, "考核维度明细", PerfTemplateDimensionVo.class, response);
+ }
+
+ /**
+ * 获取考核维度明细详细信息
+ *
+ * @param id 主键
+ */
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long id) {
+ return R.ok(iPerfTemplateDimensionService.queryById(id));
+ }
+
+ /**
+ * 新增考核维度明细
+ */
+ @Log(title = "考核维度明细", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody PerfTemplateDimensionBo bo) {
+ return toAjax(iPerfTemplateDimensionService.insertByBo(bo));
+ }
+
+ /**
+ * 修改考核维度明细
+ */
+ @Log(title = "考核维度明细", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody PerfTemplateDimensionBo bo) {
+ return toAjax(iPerfTemplateDimensionService.updateByBo(bo));
+ }
+
+ /**
+ * 删除考核维度明细
+ *
+ * @param ids 主键串
+ */
+ @Log(title = "考核维度明细", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] ids) {
+ return toAjax(iPerfTemplateDimensionService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfAppraisal.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfAppraisal.java
new file mode 100644
index 000000000..26083df80
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfAppraisal.java
@@ -0,0 +1,92 @@
+package com.klp.perf.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;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 月度绩效考核记录对象 perf_appraisal
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_appraisal")
+public class PerfAppraisal extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联现有员工表主键
+ */
+ private Long employeeId;
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+ /**
+ * 关联 perf_position_template.id (当月使用的模板)
+ */
+ private Long templateId;
+ /**
+ * 考核周期 YYYY-MM
+ */
+ private String period;
+ /**
+ * 加权得分 = SUM(维度得分)
+ */
+ private BigDecimal weightedScore;
+ /**
+ * 总加分
+ */
+ private BigDecimal bonusScore;
+ /**
+ * 总扣分
+ */
+ private BigDecimal penaltyScore;
+ /**
+ * 最终得分 = MIN(120, 加权得分+加分-扣分)
+ */
+ private BigDecimal finalScore;
+ /**
+ * 评级 S/A/B/C/D
+ */
+ private String grade;
+ /**
+ * 绩效系数(线性插值换算,自动同步到岗位系数)
+ */
+ private BigDecimal perfCoeff;
+ /**
+ * 0=草稿 1=已确认 2=已归档
+ */
+ private Long status;
+ /**
+ *
+ */
+ private Date confirmedAt;
+ /**
+ * 确认人
+ */
+ private Long confirmedBy;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfAppraisalDetail.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfAppraisalDetail.java
new file mode 100644
index 000000000..78cc67259
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfAppraisalDetail.java
@@ -0,0 +1,86 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 考核维度评分明细对象 perf_appraisal_detail
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_appraisal_detail")
+public class PerfAppraisalDetail extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联 perf_appraisal.id
+ */
+ private Long appraisalId;
+ /**
+ * 关联 perf_template_dimension.id
+ */
+ private Long dimensionId;
+ /**
+ * 序号(从模板快照)
+ */
+ private String seq;
+ /**
+ * 维度名称(从模板快照)
+ */
+ private String dimName;
+ /**
+ * 权重(从模板快照)
+ */
+ private String weight;
+ /**
+ * 目标值(可覆盖模板默认值)
+ */
+ private String targetValue;
+ /**
+ * 实际值(考核人填写)
+ */
+ private String actualValue;
+ /**
+ * 维度得分(公式计算)
+ */
+ private BigDecimal dimScore;
+ /**
+ * 本维度额外加分
+ */
+ private BigDecimal bonus;
+ /**
+ * 本维度额外扣分
+ */
+ private BigDecimal penalty;
+ /**
+ * 评分公式(从模板快照)
+ */
+ private String scoreFormula;
+ /**
+ * 评分规则(从模板快照)
+ */
+ private String scoreRule;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfCoeffRange.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfCoeffRange.java
new file mode 100644
index 000000000..f81c5f5c8
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfCoeffRange.java
@@ -0,0 +1,66 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 绩效系数换算对象 perf_coeff_range
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_coeff_range")
+public class PerfCoeffRange extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 等级标识 S/A/B/C/D
+ */
+ private String grade;
+ /**
+ * 等级名称 卓越/优秀/合格/待改进/不合格
+ */
+ private String gradeLabel;
+ /**
+ * 得分下限(含)
+ */
+ private BigDecimal scoreMin;
+ /**
+ * 得分上限(含)
+ */
+ private BigDecimal scoreMax;
+ /**
+ * 最低绩效系数
+ */
+ private BigDecimal coeffMin;
+ /**
+ * 最高绩效系数
+ */
+ private BigDecimal coeffMax;
+ /**
+ * 排序(高→低)
+ */
+ private Long sortOrder;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfDept.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfDept.java
new file mode 100644
index 000000000..105cb377d
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfDept.java
@@ -0,0 +1,53 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+ * 绩效系统部门对象 perf_dept
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_dept")
+public class PerfDept extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 部门/车间名称 如:酸轧车间/技术部
+ */
+ private String deptName;
+ /**
+ * 排序
+ */
+ private Long orderNum;
+ /**
+ * 是否有保底薪资模式 0=否 1=是
+ */
+ private Integer hasBaoSalary;
+ /**
+ * 状态(0正常 1停用)
+ */
+ private String status;
+ /**
+ * 删除标志(0=正常 1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptConfig.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptConfig.java
new file mode 100644
index 000000000..67b813bf5
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptConfig.java
@@ -0,0 +1,83 @@
+package com.klp.perf.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;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 车间考核参数配置对象 perf_dept_config
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_dept_config")
+public class PerfDeptConfig extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+ /**
+ * 月产量目标(吨) 或 月产长度目标(m)
+ */
+ private BigDecimal monthlyProductionTarget;
+ /**
+ * 产量单位: 吨 / m
+ */
+ private String productionUnit;
+ /**
+ * 绩效吨钢(元) 或 绩效米钢(元)
+ */
+ private BigDecimal perfUnitPrice;
+ /**
+ * 生产班数
+ */
+ private Long productionShifts;
+ /**
+ * 停机保底班数
+ */
+ private Long guaranteedShifts;
+ /**
+ * 车间系数(默认1.0)
+ */
+ private BigDecimal deptCoeff;
+ /**
+ * 薪资模式: 0=普通模式 1=保底模式(hasBaoSalary)
+ */
+ private Long salaryMode;
+ /**
+ * 保底薪资除数(底薪÷60=保底每班金额)
+ */
+ private Long baseDivisor;
+ /**
+ * 月份
+ */
+ private Date month;
+ /**
+ *
+ */
+ private String remark;
+ /**
+ *
+ */
+ private Date createdAt;
+ /**
+ *
+ */
+ private Date updatedAt;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptItemConfig.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptItemConfig.java
new file mode 100644
index 000000000..aa42a22f1
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptItemConfig.java
@@ -0,0 +1,63 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 车间扣款/奖励项目配置对象 perf_dept_item_config
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_dept_item_config")
+public class PerfDeptItemConfig extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+ /**
+ * 类型: 1=扣款项目 2=奖励项目
+ */
+ private Long itemType;
+ /**
+ * 项目名称 如:质量扣款/节能奖励
+ */
+ private String itemName;
+ /**
+ *
+ */
+ private Long sortOrder;
+ /**
+ * 月份
+ */
+ private Date month;
+ /**
+ *
+ */
+ private Long isEnabled;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptSummary.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptSummary.java
new file mode 100644
index 000000000..8bd930cf0
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfDeptSummary.java
@@ -0,0 +1,102 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 车间月度汇总对象 perf_dept_summary
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_dept_summary")
+public class PerfDeptSummary extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+ /**
+ * 周期 YYYY-MM
+ */
+ private String period;
+ /**
+ * 总人数
+ */
+ private Long totalEmployees;
+ /**
+ * 系数总计(所有人员总系数之和)
+ */
+ private BigDecimal totalCoeffSum;
+ /**
+ * 平均考核得分
+ */
+ private BigDecimal avgPerfScore;
+ /**
+ * 平均绩效系数
+ */
+ private BigDecimal avgPerfCoeff;
+ /**
+ * 底薪合计
+ */
+ private BigDecimal totalBaseSalary;
+ /**
+ * 月度绩效工资合计
+ */
+ private BigDecimal totalPerfWage;
+ /**
+ * 扣款合计
+ */
+ private BigDecimal totalDeductions;
+ /**
+ * 奖励合计
+ */
+ private BigDecimal totalBonuses;
+ /**
+ * 其他合计
+ */
+ private BigDecimal totalOther;
+ /**
+ * 实领薪资合计
+ */
+ private BigDecimal totalActualSalary;
+ /**
+ * 人均实领薪资
+ */
+ private BigDecimal avgActualSalary;
+ /**
+ * 当月实际产量
+ */
+ private BigDecimal monthlyProduction;
+ /**
+ * 系数单价(自动计算) = 月产量×绩效吨钢/系数总计
+ */
+ private BigDecimal unitPrice;
+ /**
+ * 0=草稿 1=已确认
+ */
+ private Long status;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfEmployeeInfo.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfEmployeeInfo.java
new file mode 100644
index 000000000..64d05d1f7
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfEmployeeInfo.java
@@ -0,0 +1,66 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.math.BigDecimal;
+
+/**
+ * 员工绩效薪资基本信息对象 perf_employee_info
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_employee_info")
+public class PerfEmployeeInfo extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联现有员工表主键
+ */
+ private Long employeeId;
+ /**
+ * 关联 perf_dept.id (冗余,便于按部门查询)
+ */
+ private Long deptId;
+ /**
+ * 岗位/工种
+ */
+ private String positionName;
+ /**
+ * 底薪(元)
+ */
+ private BigDecimal baseSalary;
+ /**
+ * 岗位绩效基数(元), 默认≈底薪×20%
+ */
+ private BigDecimal perfBase;
+ /**
+ * 默认岗位系数(初始值,后续月度由绩效自动覆盖)
+ */
+ private BigDecimal posCoeffDefault;
+ /**
+ * 是否在职 1=在职 0=离职
+ */
+ private Long isActive;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfPositionTemplate.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfPositionTemplate.java
new file mode 100644
index 000000000..5f15b47b5
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfPositionTemplate.java
@@ -0,0 +1,53 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+ * 岗位绩效考核模板对象 perf_position_template
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_position_template")
+public class PerfPositionTemplate extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+ /**
+ * 岗位名称 (与员工表岗位字段匹配)
+ */
+ private String positionName;
+ /**
+ * 模板标题 如:轧机主操绩效考核评分表
+ */
+ private String title;
+ /**
+ *
+ */
+ private Long isEnabled;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfSalary.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfSalary.java
new file mode 100644
index 000000000..650c5dcb8
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfSalary.java
@@ -0,0 +1,156 @@
+package com.klp.perf.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;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 月度薪资计算记录对象 perf_salary
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_salary")
+public class PerfSalary extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联现有员工表主键
+ */
+ private Long employeeId;
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+ /**
+ * 关联 perf_appraisal.id (可为空=未考核)
+ */
+ private Long appraisalId;
+ /**
+ * 薪资周期 YYYY-MM
+ */
+ private String period;
+ /**
+ * 底薪
+ */
+ private BigDecimal baseSalary;
+ /**
+ * 岗位绩效基数
+ */
+ private BigDecimal perfBase;
+ /**
+ * 考核得分(关联 perf_appraisal.final_score)
+ */
+ private BigDecimal perfScore;
+ /**
+ * 绩效系数(得分换算,关联 perf_appraisal.perf_coeff)
+ */
+ private BigDecimal perfCoeff;
+ /**
+ * 车间系数(来自 perf_dept_config.dept_coeff)
+ */
+ private BigDecimal deptCoeff;
+ /**
+ * 月度绩效工资 = perf_base × perf_coeff × dept_coeff
+ */
+ private BigDecimal perfWage;
+ /**
+ * 岗位系数 (=绩效系数,自动同步)
+ */
+ private BigDecimal posCoeff;
+ /**
+ * 固定系数 = pos_coeff × 0.7
+ */
+ private BigDecimal fixedCoeff;
+ /**
+ * 可调系数(手动覆盖,默认=pos_coeff×0.3)
+ */
+ private BigDecimal adjCoeff;
+ /**
+ * 可调系数是否手动覆盖: 0=自动 1=手动
+ */
+ private Long adjCoeffManual;
+ /**
+ * 总系数 = fixed_coeff + adj_coeff
+ */
+ private BigDecimal totalCoeff;
+ /**
+ * 扣款明细 {"质量扣款":0,"倒卷扣款":0,"客诉扣款":0,...}
+ */
+ private String deductionsJson;
+ /**
+ * 扣款合计
+ */
+ private BigDecimal deductionsTotal;
+ /**
+ * 奖励明细 {"节能奖励":0,...}
+ */
+ private String bonusesJson;
+ /**
+ * 奖励合计
+ */
+ private BigDecimal bonusesTotal;
+ /**
+ * 其他金额
+ */
+ private BigDecimal otherAmount;
+ /**
+ * 实领薪资 = 底薪+月度绩效工资-扣款合计+奖励合计+其他
+ */
+ private BigDecimal actualSalary;
+ /**
+ * 固定系数薪资(参考) = fixed_coeff × 系数单价
+ */
+ private BigDecimal fixedSalaryRef;
+ /**
+ * 可调系数薪资(参考) = adj_coeff × 系数单价
+ */
+ private BigDecimal adjSalaryRef;
+ /**
+ * 保底每班(参考) = base_salary / 60
+ */
+ private BigDecimal baoPerShiftRef;
+ /**
+ * 保底薪资(参考) = bao_per_shift × 保底班数
+ */
+ private BigDecimal baoSalaryRef;
+ /**
+ * 合计薪资(参考) = fixed_salary_ref+adj_salary_ref+bao_salary_ref
+ */
+ private BigDecimal totalSalaryRef;
+ /**
+ * 0=草稿 1=已确认 2=已归档
+ */
+ private Long status;
+ /**
+ *
+ */
+ private Date confirmedAt;
+ /**
+ *
+ */
+ private Long confirmedBy;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/PerfTemplateDimension.java b/klp-perf/src/main/java/com/klp/perf/domain/PerfTemplateDimension.java
new file mode 100644
index 000000000..f87e86d13
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/PerfTemplateDimension.java
@@ -0,0 +1,73 @@
+package com.klp.perf.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+
+/**
+ * 考核维度明细对象 perf_template_dimension
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("perf_template_dimension")
+public class PerfTemplateDimension extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "id")
+ private Long id;
+ /**
+ * 关联 perf_position_template.id
+ */
+ private Long templateId;
+ /**
+ * 序号
+ */
+ private String seq;
+ /**
+ * 考核维度 如:产量/质量/安全/检测准确性
+ */
+ private String dimName;
+ /**
+ * 权重 如:40% 或 0.4
+ */
+ private String weight;
+ /**
+ * 量化指标 如:月产量达标率/产品合格率
+ */
+ private String indicator;
+ /**
+ * 目标值 如:≥98% / 100% / 0次 / 达标
+ */
+ private String targetValue;
+ /**
+ * 评分公式 如:=IF(E4>0,25*(F4/E4),0)
+ */
+ private String scoreFormula;
+ /**
+ * 评分规则文字描述
+ */
+ private String scoreRule;
+ /**
+ *
+ */
+ private Long isEnabled;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfAppraisalBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfAppraisalBo.java
new file mode 100644
index 000000000..efb7ff490
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfAppraisalBo.java
@@ -0,0 +1,99 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 月度绩效考核记录业务对象 perf_appraisal
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfAppraisalBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联现有员工表主键
+ */
+ private Long employeeId;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+
+ /**
+ * 关联 perf_position_template.id (当月使用的模板)
+ */
+ private Long templateId;
+
+ /**
+ * 考核周期 YYYY-MM
+ */
+ private String period;
+
+ /**
+ * 加权得分 = SUM(维度得分)
+ */
+ private BigDecimal weightedScore;
+
+ /**
+ * 总加分
+ */
+ private BigDecimal bonusScore;
+
+ /**
+ * 总扣分
+ */
+ private BigDecimal penaltyScore;
+
+ /**
+ * 最终得分 = MIN(120, 加权得分+加分-扣分)
+ */
+ private BigDecimal finalScore;
+
+ /**
+ * 评级 S/A/B/C/D
+ */
+ private String grade;
+
+ /**
+ * 绩效系数(线性插值换算,自动同步到岗位系数)
+ */
+ private BigDecimal perfCoeff;
+
+ /**
+ * 0=草稿 1=已确认 2=已归档
+ */
+ private Long status;
+
+ /**
+ *
+ */
+ private Date confirmedAt;
+
+ /**
+ * 确认人
+ */
+ private Long confirmedBy;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfAppraisalDetailBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfAppraisalDetailBo.java
new file mode 100644
index 000000000..e565dafc9
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfAppraisalDetailBo.java
@@ -0,0 +1,92 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 考核维度评分明细业务对象 perf_appraisal_detail
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfAppraisalDetailBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联 perf_appraisal.id
+ */
+ private Long appraisalId;
+
+ /**
+ * 关联 perf_template_dimension.id
+ */
+ private Long dimensionId;
+
+ /**
+ * 序号(从模板快照)
+ */
+ private String seq;
+
+ /**
+ * 维度名称(从模板快照)
+ */
+ private String dimName;
+
+ /**
+ * 权重(从模板快照)
+ */
+ private String weight;
+
+ /**
+ * 目标值(可覆盖模板默认值)
+ */
+ private String targetValue;
+
+ /**
+ * 实际值(考核人填写)
+ */
+ private String actualValue;
+
+ /**
+ * 维度得分(公式计算)
+ */
+ private BigDecimal dimScore;
+
+ /**
+ * 本维度额外加分
+ */
+ private BigDecimal bonus;
+
+ /**
+ * 本维度额外扣分
+ */
+ private BigDecimal penalty;
+
+ /**
+ * 评分公式(从模板快照)
+ */
+ private String scoreFormula;
+
+ /**
+ * 评分规则(从模板快照)
+ */
+ private String scoreRule;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfCoeffRangeBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfCoeffRangeBo.java
new file mode 100644
index 000000000..3ce828ac4
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfCoeffRangeBo.java
@@ -0,0 +1,67 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 绩效系数换算业务对象 perf_coeff_range
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfCoeffRangeBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 等级标识 S/A/B/C/D
+ */
+ private String grade;
+
+ /**
+ * 等级名称 卓越/优秀/合格/待改进/不合格
+ */
+ private String gradeLabel;
+
+ /**
+ * 得分下限(含)
+ */
+ private BigDecimal scoreMin;
+
+ /**
+ * 得分上限(含)
+ */
+ private BigDecimal scoreMax;
+
+ /**
+ * 最低绩效系数
+ */
+ private BigDecimal coeffMin;
+
+ /**
+ * 最高绩效系数
+ */
+ private BigDecimal coeffMax;
+
+ /**
+ * 排序(高→低)
+ */
+ private Long sortOrder;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptBo.java
new file mode 100644
index 000000000..aab7b048c
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptBo.java
@@ -0,0 +1,51 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+
+/**
+ * 绩效系统部门业务对象 perf_dept
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfDeptBo extends BaseEntity {
+
+ /**
+ * 主键
+ */
+ private Long id;
+
+ /**
+ * 部门/车间名称 如:酸轧车间/技术部
+ */
+ private String deptName;
+
+ /**
+ * 排序
+ */
+ private Long orderNum;
+
+ /**
+ * 是否有保底薪资模式 0=否 1=是
+ */
+ private Integer hasBaoSalary;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ private String status;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptConfigBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptConfigBo.java
new file mode 100644
index 000000000..442cb4b1b
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptConfigBo.java
@@ -0,0 +1,94 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 车间考核参数配置业务对象 perf_dept_config
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfDeptConfigBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+
+ /**
+ * 月产量目标(吨) 或 月产长度目标(m)
+ */
+ private BigDecimal monthlyProductionTarget;
+
+ /**
+ * 产量单位: 吨 / m
+ */
+ private String productionUnit;
+
+ /**
+ * 绩效吨钢(元) 或 绩效米钢(元)
+ */
+ private BigDecimal perfUnitPrice;
+
+ /**
+ * 生产班数
+ */
+ private Long productionShifts;
+
+ /**
+ * 停机保底班数
+ */
+ private Long guaranteedShifts;
+
+ /**
+ * 车间系数(默认1.0)
+ */
+ private BigDecimal deptCoeff;
+
+ /**
+ * 薪资模式: 0=普通模式 1=保底模式(hasBaoSalary)
+ */
+ private Long salaryMode;
+
+ /**
+ * 保底薪资除数(底薪÷60=保底每班金额)
+ */
+ private Long baseDivisor;
+
+ /**
+ * 月份
+ */
+ private Date month;
+
+ /**
+ *
+ */
+ private String remark;
+
+ /**
+ *
+ */
+ private Date createdAt;
+
+ /**
+ *
+ */
+ private Date updatedAt;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptItemConfigBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptItemConfigBo.java
new file mode 100644
index 000000000..5371efa47
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptItemConfigBo.java
@@ -0,0 +1,63 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 车间扣款/奖励项目配置业务对象 perf_dept_item_config
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfDeptItemConfigBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+
+ /**
+ * 类型: 1=扣款项目 2=奖励项目
+ */
+ private Long itemType;
+
+ /**
+ * 项目名称 如:质量扣款/节能奖励
+ */
+ private String itemName;
+
+ /**
+ *
+ */
+ private Long sortOrder;
+
+ /**
+ * 月份
+ */
+ private Date month;
+
+ /**
+ *
+ */
+ private Long isEnabled;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptSummaryBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptSummaryBo.java
new file mode 100644
index 000000000..5c216715e
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfDeptSummaryBo.java
@@ -0,0 +1,112 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 车间月度汇总业务对象 perf_dept_summary
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfDeptSummaryBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+
+ /**
+ * 周期 YYYY-MM
+ */
+ private String period;
+
+ /**
+ * 总人数
+ */
+ private Long totalEmployees;
+
+ /**
+ * 系数总计(所有人员总系数之和)
+ */
+ private BigDecimal totalCoeffSum;
+
+ /**
+ * 平均考核得分
+ */
+ private BigDecimal avgPerfScore;
+
+ /**
+ * 平均绩效系数
+ */
+ private BigDecimal avgPerfCoeff;
+
+ /**
+ * 底薪合计
+ */
+ private BigDecimal totalBaseSalary;
+
+ /**
+ * 月度绩效工资合计
+ */
+ private BigDecimal totalPerfWage;
+
+ /**
+ * 扣款合计
+ */
+ private BigDecimal totalDeductions;
+
+ /**
+ * 奖励合计
+ */
+ private BigDecimal totalBonuses;
+
+ /**
+ * 其他合计
+ */
+ private BigDecimal totalOther;
+
+ /**
+ * 实领薪资合计
+ */
+ private BigDecimal totalActualSalary;
+
+ /**
+ * 人均实领薪资
+ */
+ private BigDecimal avgActualSalary;
+
+ /**
+ * 当月实际产量
+ */
+ private BigDecimal monthlyProduction;
+
+ /**
+ * 系数单价(自动计算) = 月产量×绩效吨钢/系数总计
+ */
+ private BigDecimal unitPrice;
+
+ /**
+ * 0=草稿 1=已确认
+ */
+ private Long status;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfEmployeeInfoBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfEmployeeInfoBo.java
new file mode 100644
index 000000000..ed01261b7
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfEmployeeInfoBo.java
@@ -0,0 +1,67 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+
+/**
+ * 员工绩效薪资基本信息业务对象 perf_employee_info
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfEmployeeInfoBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联现有员工表主键
+ */
+ private Long employeeId;
+
+ /**
+ * 关联 perf_dept.id (冗余,便于按部门查询)
+ */
+ private Long deptId;
+
+ /**
+ * 岗位/工种
+ */
+ private String positionName;
+
+ /**
+ * 底薪(元)
+ */
+ private BigDecimal baseSalary;
+
+ /**
+ * 岗位绩效基数(元), 默认≈底薪×20%
+ */
+ private BigDecimal perfBase;
+
+ /**
+ * 默认岗位系数(初始值,后续月度由绩效自动覆盖)
+ */
+ private BigDecimal posCoeffDefault;
+
+ /**
+ * 是否在职 1=在职 0=离职
+ */
+ private Long isActive;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfPositionTemplateBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfPositionTemplateBo.java
new file mode 100644
index 000000000..766ffaeab
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfPositionTemplateBo.java
@@ -0,0 +1,51 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+
+/**
+ * 岗位绩效考核模板业务对象 perf_position_template
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfPositionTemplateBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+
+ /**
+ * 岗位名称 (与员工表岗位字段匹配)
+ */
+ private String positionName;
+
+ /**
+ * 模板标题 如:轧机主操绩效考核评分表
+ */
+ private String title;
+
+ /**
+ *
+ */
+ private Long isEnabled;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfSalaryBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfSalaryBo.java
new file mode 100644
index 000000000..81db7bf20
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfSalaryBo.java
@@ -0,0 +1,179 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+
+/**
+ * 月度薪资计算记录业务对象 perf_salary
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfSalaryBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联现有员工表主键
+ */
+ private Long employeeId;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ private Long deptId;
+
+ /**
+ * 关联 perf_appraisal.id (可为空=未考核)
+ */
+ private Long appraisalId;
+
+ /**
+ * 薪资周期 YYYY-MM
+ */
+ private String period;
+
+ /**
+ * 底薪
+ */
+ private BigDecimal baseSalary;
+
+ /**
+ * 岗位绩效基数
+ */
+ private BigDecimal perfBase;
+
+ /**
+ * 考核得分(关联 perf_appraisal.final_score)
+ */
+ private BigDecimal perfScore;
+
+ /**
+ * 绩效系数(得分换算,关联 perf_appraisal.perf_coeff)
+ */
+ private BigDecimal perfCoeff;
+
+ /**
+ * 车间系数(来自 perf_dept_config.dept_coeff)
+ */
+ private BigDecimal deptCoeff;
+
+ /**
+ * 月度绩效工资 = perf_base × perf_coeff × dept_coeff
+ */
+ private BigDecimal perfWage;
+
+ /**
+ * 岗位系数 (=绩效系数,自动同步)
+ */
+ private BigDecimal posCoeff;
+
+ /**
+ * 固定系数 = pos_coeff × 0.7
+ */
+ private BigDecimal fixedCoeff;
+
+ /**
+ * 可调系数(手动覆盖,默认=pos_coeff×0.3)
+ */
+ private BigDecimal adjCoeff;
+
+ /**
+ * 可调系数是否手动覆盖: 0=自动 1=手动
+ */
+ private Long adjCoeffManual;
+
+ /**
+ * 总系数 = fixed_coeff + adj_coeff
+ */
+ private BigDecimal totalCoeff;
+
+ /**
+ * 扣款明细 {"质量扣款":0,"倒卷扣款":0,"客诉扣款":0,...}
+ */
+ private String deductionsJson;
+
+ /**
+ * 扣款合计
+ */
+ private BigDecimal deductionsTotal;
+
+ /**
+ * 奖励明细 {"节能奖励":0,...}
+ */
+ private String bonusesJson;
+
+ /**
+ * 奖励合计
+ */
+ private BigDecimal bonusesTotal;
+
+ /**
+ * 其他金额
+ */
+ private BigDecimal otherAmount;
+
+ /**
+ * 实领薪资 = 底薪+月度绩效工资-扣款合计+奖励合计+其他
+ */
+ private BigDecimal actualSalary;
+
+ /**
+ * 固定系数薪资(参考) = fixed_coeff × 系数单价
+ */
+ private BigDecimal fixedSalaryRef;
+
+ /**
+ * 可调系数薪资(参考) = adj_coeff × 系数单价
+ */
+ private BigDecimal adjSalaryRef;
+
+ /**
+ * 保底每班(参考) = base_salary / 60
+ */
+ private BigDecimal baoPerShiftRef;
+
+ /**
+ * 保底薪资(参考) = bao_per_shift × 保底班数
+ */
+ private BigDecimal baoSalaryRef;
+
+ /**
+ * 合计薪资(参考) = fixed_salary_ref+adj_salary_ref+bao_salary_ref
+ */
+ private BigDecimal totalSalaryRef;
+
+ /**
+ * 0=草稿 1=已确认 2=已归档
+ */
+ private Long status;
+
+ /**
+ *
+ */
+ private Date confirmedAt;
+
+ /**
+ *
+ */
+ private Long confirmedBy;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfTemplateDimensionBo.java b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfTemplateDimensionBo.java
new file mode 100644
index 000000000..a33ada3a8
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/bo/PerfTemplateDimensionBo.java
@@ -0,0 +1,76 @@
+package com.klp.perf.domain.bo;
+
+import com.klp.common.core.domain.BaseEntity;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+
+/**
+ * 考核维度明细业务对象 perf_template_dimension
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class PerfTemplateDimensionBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long id;
+
+ /**
+ * 关联 perf_position_template.id
+ */
+ private Long templateId;
+
+ /**
+ * 序号
+ */
+ private String seq;
+
+ /**
+ * 考核维度 如:产量/质量/安全/检测准确性
+ */
+ private String dimName;
+
+ /**
+ * 权重 如:40% 或 0.4
+ */
+ private String weight;
+
+ /**
+ * 量化指标 如:月产量达标率/产品合格率
+ */
+ private String indicator;
+
+ /**
+ * 目标值 如:≥98% / 100% / 0次 / 达标
+ */
+ private String targetValue;
+
+ /**
+ * 评分公式 如:=IF(E4>0,25*(F4/E4),0)
+ */
+ private String scoreFormula;
+
+ /**
+ * 评分规则文字描述
+ */
+ private String scoreRule;
+
+ /**
+ *
+ */
+ private Long isEnabled;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfAppraisalDetailVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfAppraisalDetailVo.java
new file mode 100644
index 000000000..d7a624a4f
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfAppraisalDetailVo.java
@@ -0,0 +1,108 @@
+package com.klp.perf.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 考核维度评分明细视图对象 perf_appraisal_detail
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfAppraisalDetailVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联 perf_appraisal.id
+ */
+ @ExcelProperty(value = "关联 perf_appraisal.id")
+ private Long appraisalId;
+
+ /**
+ * 关联 perf_template_dimension.id
+ */
+ @ExcelProperty(value = "关联 perf_template_dimension.id")
+ private Long dimensionId;
+
+ /**
+ * 序号(从模板快照)
+ */
+ @ExcelProperty(value = "序号(从模板快照)")
+ private String seq;
+
+ /**
+ * 维度名称(从模板快照)
+ */
+ @ExcelProperty(value = "维度名称(从模板快照)")
+ private String dimName;
+
+ /**
+ * 权重(从模板快照)
+ */
+ @ExcelProperty(value = "权重(从模板快照)")
+ private String weight;
+
+ /**
+ * 目标值(可覆盖模板默认值)
+ */
+ @ExcelProperty(value = "目标值(可覆盖模板默认值)")
+ private String targetValue;
+
+ /**
+ * 实际值(考核人填写)
+ */
+ @ExcelProperty(value = "实际值(考核人填写)")
+ private String actualValue;
+
+ /**
+ * 维度得分(公式计算)
+ */
+ @ExcelProperty(value = "维度得分(公式计算)")
+ private BigDecimal dimScore;
+
+ /**
+ * 本维度额外加分
+ */
+ @ExcelProperty(value = "本维度额外加分")
+ private BigDecimal bonus;
+
+ /**
+ * 本维度额外扣分
+ */
+ @ExcelProperty(value = "本维度额外扣分")
+ private BigDecimal penalty;
+
+ /**
+ * 评分公式(从模板快照)
+ */
+ @ExcelProperty(value = "评分公式(从模板快照)")
+ private String scoreFormula;
+
+ /**
+ * 评分规则(从模板快照)
+ */
+ @ExcelProperty(value = "评分规则(从模板快照)")
+ private String scoreRule;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfAppraisalVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfAppraisalVo.java
new file mode 100644
index 000000000..08d565adf
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfAppraisalVo.java
@@ -0,0 +1,116 @@
+package com.klp.perf.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 月度绩效考核记录视图对象 perf_appraisal
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfAppraisalVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联现有员工表主键
+ */
+ @ExcelProperty(value = "关联现有员工表主键")
+ private Long employeeId;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ @ExcelProperty(value = "关联 perf_dept.id")
+ private Long deptId;
+
+ /**
+ * 关联 perf_position_template.id (当月使用的模板)
+ */
+ @ExcelProperty(value = "关联 perf_position_template.id (当月使用的模板)")
+ private Long templateId;
+
+ /**
+ * 考核周期 YYYY-MM
+ */
+ @ExcelProperty(value = "考核周期 YYYY-MM")
+ private String period;
+
+ /**
+ * 加权得分 = SUM(维度得分)
+ */
+ @ExcelProperty(value = "加权得分 = SUM(维度得分)")
+ private BigDecimal weightedScore;
+
+ /**
+ * 总加分
+ */
+ @ExcelProperty(value = "总加分")
+ private BigDecimal bonusScore;
+
+ /**
+ * 总扣分
+ */
+ @ExcelProperty(value = "总扣分")
+ private BigDecimal penaltyScore;
+
+ /**
+ * 最终得分 = MIN(120, 加权得分+加分-扣分)
+ */
+ @ExcelProperty(value = "最终得分 = MIN(120, 加权得分+加分-扣分)")
+ private BigDecimal finalScore;
+
+ /**
+ * 评级 S/A/B/C/D
+ */
+ @ExcelProperty(value = "评级 S/A/B/C/D")
+ private String grade;
+
+ /**
+ * 绩效系数(线性插值换算,自动同步到岗位系数)
+ */
+ @ExcelProperty(value = "绩效系数(线性插值换算,自动同步到岗位系数)")
+ private BigDecimal perfCoeff;
+
+ /**
+ * 0=草稿 1=已确认 2=已归档
+ */
+ @ExcelProperty(value = "0=草稿 1=已确认 2=已归档")
+ private Long status;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Date confirmedAt;
+
+ /**
+ * 确认人
+ */
+ @ExcelProperty(value = "确认人")
+ private Long confirmedBy;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfCoeffRangeVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfCoeffRangeVo.java
new file mode 100644
index 000000000..2bc9c1e2d
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfCoeffRangeVo.java
@@ -0,0 +1,78 @@
+package com.klp.perf.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 绩效系数换算视图对象 perf_coeff_range
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfCoeffRangeVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 等级标识 S/A/B/C/D
+ */
+ @ExcelProperty(value = "等级标识 S/A/B/C/D")
+ private String grade;
+
+ /**
+ * 等级名称 卓越/优秀/合格/待改进/不合格
+ */
+ @ExcelProperty(value = "等级名称 卓越/优秀/合格/待改进/不合格")
+ private String gradeLabel;
+
+ /**
+ * 得分下限(含)
+ */
+ @ExcelProperty(value = "得分下限(含)")
+ private BigDecimal scoreMin;
+
+ /**
+ * 得分上限(含)
+ */
+ @ExcelProperty(value = "得分上限(含)")
+ private BigDecimal scoreMax;
+
+ /**
+ * 最低绩效系数
+ */
+ @ExcelProperty(value = "最低绩效系数")
+ private BigDecimal coeffMin;
+
+ /**
+ * 最高绩效系数
+ */
+ @ExcelProperty(value = "最高绩效系数")
+ private BigDecimal coeffMax;
+
+ /**
+ * 排序(高→低)
+ */
+ @ExcelProperty(value = "排序(高→低)")
+ private Long sortOrder;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptConfigVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptConfigVo.java
new file mode 100644
index 000000000..1e1a01a44
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptConfigVo.java
@@ -0,0 +1,110 @@
+package com.klp.perf.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 车间考核参数配置视图对象 perf_dept_config
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfDeptConfigVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ @ExcelProperty(value = "关联 perf_dept.id")
+ private Long deptId;
+
+ /**
+ * 月产量目标(吨) 或 月产长度目标(m)
+ */
+ @ExcelProperty(value = "月产量目标(吨) 或 月产长度目标(m)")
+ private BigDecimal monthlyProductionTarget;
+
+ /**
+ * 产量单位: 吨 / m
+ */
+ @ExcelProperty(value = "产量单位: 吨 / m")
+ private String productionUnit;
+
+ /**
+ * 绩效吨钢(元) 或 绩效米钢(元)
+ */
+ @ExcelProperty(value = "绩效吨钢(元) 或 绩效米钢(元)")
+ private BigDecimal perfUnitPrice;
+
+ /**
+ * 生产班数
+ */
+ @ExcelProperty(value = "生产班数")
+ private Long productionShifts;
+
+ /**
+ * 停机保底班数
+ */
+ @ExcelProperty(value = "停机保底班数")
+ private Long guaranteedShifts;
+
+ /**
+ * 车间系数(默认1.0)
+ */
+ @ExcelProperty(value = "车间系数(默认1.0)")
+ private BigDecimal deptCoeff;
+
+ /**
+ * 薪资模式: 0=普通模式 1=保底模式(hasBaoSalary)
+ */
+ @ExcelProperty(value = "薪资模式: 0=普通模式 1=保底模式(hasBaoSalary)")
+ private Long salaryMode;
+
+ /**
+ * 保底薪资除数(底薪÷60=保底每班金额)
+ */
+ @ExcelProperty(value = "保底薪资除数(底薪÷60=保底每班金额)")
+ private Long baseDivisor;
+
+ /**
+ * 月份
+ */
+ @ExcelProperty(value = "月份")
+ private Date month;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private String remark;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Date createdAt;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Date updatedAt;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptItemConfigVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptItemConfigVo.java
new file mode 100644
index 000000000..b8be79555
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptItemConfigVo.java
@@ -0,0 +1,73 @@
+package com.klp.perf.domain.vo;
+
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 车间扣款/奖励项目配置视图对象 perf_dept_item_config
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfDeptItemConfigVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ @ExcelProperty(value = "关联 perf_dept.id")
+ private Long deptId;
+
+ /**
+ * 类型: 1=扣款项目 2=奖励项目
+ */
+ @ExcelProperty(value = "类型: 1=扣款项目 2=奖励项目")
+ private Long itemType;
+
+ /**
+ * 项目名称 如:质量扣款/节能奖励
+ */
+ @ExcelProperty(value = "项目名称 如:质量扣款/节能奖励")
+ private String itemName;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long sortOrder;
+
+ /**
+ * 月份
+ */
+ @ExcelProperty(value = "月份")
+ private Date month;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long isEnabled;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptSummaryVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptSummaryVo.java
new file mode 100644
index 000000000..ede2b56f7
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptSummaryVo.java
@@ -0,0 +1,132 @@
+package com.klp.perf.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 车间月度汇总视图对象 perf_dept_summary
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfDeptSummaryVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ @ExcelProperty(value = "关联 perf_dept.id")
+ private Long deptId;
+
+ /**
+ * 周期 YYYY-MM
+ */
+ @ExcelProperty(value = "周期 YYYY-MM")
+ private String period;
+
+ /**
+ * 总人数
+ */
+ @ExcelProperty(value = "总人数")
+ private Long totalEmployees;
+
+ /**
+ * 系数总计(所有人员总系数之和)
+ */
+ @ExcelProperty(value = "系数总计(所有人员总系数之和)")
+ private BigDecimal totalCoeffSum;
+
+ /**
+ * 平均考核得分
+ */
+ @ExcelProperty(value = "平均考核得分")
+ private BigDecimal avgPerfScore;
+
+ /**
+ * 平均绩效系数
+ */
+ @ExcelProperty(value = "平均绩效系数")
+ private BigDecimal avgPerfCoeff;
+
+ /**
+ * 底薪合计
+ */
+ @ExcelProperty(value = "底薪合计")
+ private BigDecimal totalBaseSalary;
+
+ /**
+ * 月度绩效工资合计
+ */
+ @ExcelProperty(value = "月度绩效工资合计")
+ private BigDecimal totalPerfWage;
+
+ /**
+ * 扣款合计
+ */
+ @ExcelProperty(value = "扣款合计")
+ private BigDecimal totalDeductions;
+
+ /**
+ * 奖励合计
+ */
+ @ExcelProperty(value = "奖励合计")
+ private BigDecimal totalBonuses;
+
+ /**
+ * 其他合计
+ */
+ @ExcelProperty(value = "其他合计")
+ private BigDecimal totalOther;
+
+ /**
+ * 实领薪资合计
+ */
+ @ExcelProperty(value = "实领薪资合计")
+ private BigDecimal totalActualSalary;
+
+ /**
+ * 人均实领薪资
+ */
+ @ExcelProperty(value = "人均实领薪资")
+ private BigDecimal avgActualSalary;
+
+ /**
+ * 当月实际产量
+ */
+ @ExcelProperty(value = "当月实际产量")
+ private BigDecimal monthlyProduction;
+
+ /**
+ * 系数单价(自动计算) = 月产量×绩效吨钢/系数总计
+ */
+ @ExcelProperty(value = "系数单价(自动计算) = 月产量×绩效吨钢/系数总计")
+ private BigDecimal unitPrice;
+
+ /**
+ * 0=草稿 1=已确认
+ */
+ @ExcelProperty(value = "0=草稿 1=已确认")
+ private Long status;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptVo.java
new file mode 100644
index 000000000..e0f32c0b4
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfDeptVo.java
@@ -0,0 +1,60 @@
+package com.klp.perf.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 绩效系统部门视图对象 perf_dept
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfDeptVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ExcelProperty(value = "主键")
+ private Long id;
+
+ /**
+ * 部门/车间名称 如:酸轧车间/技术部
+ */
+ @ExcelProperty(value = "部门/车间名称 如:酸轧车间/技术部")
+ private String deptName;
+
+ /**
+ * 排序
+ */
+ @ExcelProperty(value = "排序")
+ private Long orderNum;
+
+ /**
+ * 是否有保底薪资模式 0=否 1=是
+ */
+ @ExcelProperty(value = "是否有保底薪资模式 0=否 1=是")
+ private Integer hasBaoSalary;
+
+ /**
+ * 状态(0正常 1停用)
+ */
+ @ExcelProperty(value = "状态", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "0=正常,1=停用")
+ private String status;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfEmployeeInfoVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfEmployeeInfoVo.java
new file mode 100644
index 000000000..86aa50faa
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfEmployeeInfoVo.java
@@ -0,0 +1,78 @@
+package com.klp.perf.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 员工绩效薪资基本信息视图对象 perf_employee_info
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfEmployeeInfoVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联现有员工表主键
+ */
+ @ExcelProperty(value = "关联现有员工表主键")
+ private Long employeeId;
+
+ /**
+ * 关联 perf_dept.id (冗余,便于按部门查询)
+ */
+ @ExcelProperty(value = "关联 perf_dept.id (冗余,便于按部门查询)")
+ private Long deptId;
+
+ /**
+ * 岗位/工种
+ */
+ @ExcelProperty(value = "岗位/工种")
+ private String positionName;
+
+ /**
+ * 底薪(元)
+ */
+ @ExcelProperty(value = "底薪(元)")
+ private BigDecimal baseSalary;
+
+ /**
+ * 岗位绩效基数(元), 默认≈底薪×20%
+ */
+ @ExcelProperty(value = "岗位绩效基数(元), 默认≈底薪×20%")
+ private BigDecimal perfBase;
+
+ /**
+ * 默认岗位系数(初始值,后续月度由绩效自动覆盖)
+ */
+ @ExcelProperty(value = "默认岗位系数(初始值,后续月度由绩效自动覆盖)")
+ private BigDecimal posCoeffDefault;
+
+ /**
+ * 是否在职 1=在职 0=离职
+ */
+ @ExcelProperty(value = "是否在职 1=在职 0=离职")
+ private Long isActive;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfPositionTemplateVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfPositionTemplateVo.java
new file mode 100644
index 000000000..1f68d98b8
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfPositionTemplateVo.java
@@ -0,0 +1,59 @@
+package com.klp.perf.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 岗位绩效考核模板视图对象 perf_position_template
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfPositionTemplateVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ @ExcelProperty(value = "关联 perf_dept.id")
+ private Long deptId;
+
+ /**
+ * 岗位名称 (与员工表岗位字段匹配)
+ */
+ @ExcelProperty(value = "岗位名称 (与员工表岗位字段匹配)")
+ private String positionName;
+
+ /**
+ * 模板标题 如:轧机主操绩效考核评分表
+ */
+ @ExcelProperty(value = "模板标题 如:轧机主操绩效考核评分表")
+ private String title;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long isEnabled;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfSalaryVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfSalaryVo.java
new file mode 100644
index 000000000..ae34c92bf
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfSalaryVo.java
@@ -0,0 +1,212 @@
+package com.klp.perf.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 月度薪资计算记录视图对象 perf_salary
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfSalaryVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联现有员工表主键
+ */
+ @ExcelProperty(value = "关联现有员工表主键")
+ private Long employeeId;
+
+ /**
+ * 关联 perf_dept.id
+ */
+ @ExcelProperty(value = "关联 perf_dept.id")
+ private Long deptId;
+
+ /**
+ * 关联 perf_appraisal.id (可为空=未考核)
+ */
+ @ExcelProperty(value = "关联 perf_appraisal.id (可为空=未考核)")
+ private Long appraisalId;
+
+ /**
+ * 薪资周期 YYYY-MM
+ */
+ @ExcelProperty(value = "薪资周期 YYYY-MM")
+ private String period;
+
+ /**
+ * 底薪
+ */
+ @ExcelProperty(value = "底薪")
+ private BigDecimal baseSalary;
+
+ /**
+ * 岗位绩效基数
+ */
+ @ExcelProperty(value = "岗位绩效基数")
+ private BigDecimal perfBase;
+
+ /**
+ * 考核得分(关联 perf_appraisal.final_score)
+ */
+ @ExcelProperty(value = "考核得分(关联 perf_appraisal.final_score)")
+ private BigDecimal perfScore;
+
+ /**
+ * 绩效系数(得分换算,关联 perf_appraisal.perf_coeff)
+ */
+ @ExcelProperty(value = "绩效系数(得分换算,关联 perf_appraisal.perf_coeff)")
+ private BigDecimal perfCoeff;
+
+ /**
+ * 车间系数(来自 perf_dept_config.dept_coeff)
+ */
+ @ExcelProperty(value = "车间系数(来自 perf_dept_config.dept_coeff)")
+ private BigDecimal deptCoeff;
+
+ /**
+ * 月度绩效工资 = perf_base × perf_coeff × dept_coeff
+ */
+ @ExcelProperty(value = "月度绩效工资 = perf_base × perf_coeff × dept_coeff")
+ private BigDecimal perfWage;
+
+ /**
+ * 岗位系数 (=绩效系数,自动同步)
+ */
+ @ExcelProperty(value = "岗位系数 (=绩效系数,自动同步)")
+ private BigDecimal posCoeff;
+
+ /**
+ * 固定系数 = pos_coeff × 0.7
+ */
+ @ExcelProperty(value = "固定系数 = pos_coeff × 0.7")
+ private BigDecimal fixedCoeff;
+
+ /**
+ * 可调系数(手动覆盖,默认=pos_coeff×0.3)
+ */
+ @ExcelProperty(value = "可调系数(手动覆盖,默认=pos_coeff×0.3)")
+ private BigDecimal adjCoeff;
+
+ /**
+ * 可调系数是否手动覆盖: 0=自动 1=手动
+ */
+ @ExcelProperty(value = "可调系数是否手动覆盖: 0=自动 1=手动")
+ private Long adjCoeffManual;
+
+ /**
+ * 总系数 = fixed_coeff + adj_coeff
+ */
+ @ExcelProperty(value = "总系数 = fixed_coeff + adj_coeff")
+ private BigDecimal totalCoeff;
+
+ /**
+ * 扣款明细 {"质量扣款":0,"倒卷扣款":0,"客诉扣款":0,...}
+ */
+ @ExcelProperty(value = "扣款明细")
+ private String deductionsJson;
+
+ /**
+ * 扣款合计
+ */
+ @ExcelProperty(value = "扣款合计")
+ private BigDecimal deductionsTotal;
+
+ /**
+ * 奖励明细 {"节能奖励":0,...}
+ */
+ @ExcelProperty(value = "奖励明细")
+ private String bonusesJson;
+
+ /**
+ * 奖励合计
+ */
+ @ExcelProperty(value = "奖励合计")
+ private BigDecimal bonusesTotal;
+
+ /**
+ * 其他金额
+ */
+ @ExcelProperty(value = "其他金额")
+ private BigDecimal otherAmount;
+
+ /**
+ * 实领薪资 = 底薪+月度绩效工资-扣款合计+奖励合计+其他
+ */
+ @ExcelProperty(value = "实领薪资 = 底薪+月度绩效工资-扣款合计+奖励合计+其他")
+ private BigDecimal actualSalary;
+
+ /**
+ * 固定系数薪资(参考) = fixed_coeff × 系数单价
+ */
+ @ExcelProperty(value = "固定系数薪资(参考) = fixed_coeff × 系数单价")
+ private BigDecimal fixedSalaryRef;
+
+ /**
+ * 可调系数薪资(参考) = adj_coeff × 系数单价
+ */
+ @ExcelProperty(value = "可调系数薪资(参考) = adj_coeff × 系数单价")
+ private BigDecimal adjSalaryRef;
+
+ /**
+ * 保底每班(参考) = base_salary / 60
+ */
+ @ExcelProperty(value = "保底每班(参考) = base_salary / 60")
+ private BigDecimal baoPerShiftRef;
+
+ /**
+ * 保底薪资(参考) = bao_per_shift × 保底班数
+ */
+ @ExcelProperty(value = "保底薪资(参考) = bao_per_shift × 保底班数")
+ private BigDecimal baoSalaryRef;
+
+ /**
+ * 合计薪资(参考) = fixed_salary_ref+adj_salary_ref+bao_salary_ref
+ */
+ @ExcelProperty(value = "合计薪资(参考) = fixed_salary_ref+adj_salary_ref+bao_salary_ref")
+ private BigDecimal totalSalaryRef;
+
+ /**
+ * 0=草稿 1=已确认 2=已归档
+ */
+ @ExcelProperty(value = "0=草稿 1=已确认 2=已归档")
+ private Long status;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Date confirmedAt;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long confirmedBy;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfTemplateDimensionVo.java b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfTemplateDimensionVo.java
new file mode 100644
index 000000000..4e0da61c4
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/domain/vo/PerfTemplateDimensionVo.java
@@ -0,0 +1,89 @@
+package com.klp.perf.domain.vo;
+
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.klp.common.annotation.ExcelDictFormat;
+import com.klp.common.convert.ExcelDictConvert;
+import lombok.Data;
+
+
+/**
+ * 考核维度明细视图对象 perf_template_dimension
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class PerfTemplateDimensionVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long id;
+
+ /**
+ * 关联 perf_position_template.id
+ */
+ @ExcelProperty(value = "关联 perf_position_template.id")
+ private Long templateId;
+
+ /**
+ * 序号
+ */
+ @ExcelProperty(value = "序号")
+ private String seq;
+
+ /**
+ * 考核维度 如:产量/质量/安全/检测准确性
+ */
+ @ExcelProperty(value = "考核维度 如:产量/质量/安全/检测准确性")
+ private String dimName;
+
+ /**
+ * 权重 如:40% 或 0.4
+ */
+ @ExcelProperty(value = "权重 如:40% 或 0.4")
+ private String weight;
+
+ /**
+ * 量化指标 如:月产量达标率/产品合格率
+ */
+ @ExcelProperty(value = "量化指标 如:月产量达标率/产品合格率")
+ private String indicator;
+
+ /**
+ * 目标值 如:≥98% / 100% / 0次 / 达标
+ */
+ @ExcelProperty(value = "目标值 如:≥98% / 100% / 0次 / 达标")
+ private String targetValue;
+
+ /**
+ * 评分公式 如:=IF(E4>0,25*(F4/E4),0)
+ */
+ @ExcelProperty(value = "评分公式 如:=IF(E4>0,25*(F4/E4),0)")
+ private String scoreFormula;
+
+ /**
+ * 评分规则文字描述
+ */
+ @ExcelProperty(value = "评分规则文字描述")
+ private String scoreRule;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long isEnabled;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfAppraisalDetailMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfAppraisalDetailMapper.java
new file mode 100644
index 000000000..f8fb00e28
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfAppraisalDetailMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfAppraisalDetail;
+import com.klp.perf.domain.vo.PerfAppraisalDetailVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 考核维度评分明细Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfAppraisalDetailMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfAppraisalMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfAppraisalMapper.java
new file mode 100644
index 000000000..51b6ba693
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfAppraisalMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfAppraisal;
+import com.klp.perf.domain.vo.PerfAppraisalVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 月度绩效考核记录Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfAppraisalMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfCoeffRangeMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfCoeffRangeMapper.java
new file mode 100644
index 000000000..a2e7682f8
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfCoeffRangeMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfCoeffRange;
+import com.klp.perf.domain.vo.PerfCoeffRangeVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 绩效系数换算Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfCoeffRangeMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptConfigMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptConfigMapper.java
new file mode 100644
index 000000000..d983e3110
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptConfigMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfDeptConfig;
+import com.klp.perf.domain.vo.PerfDeptConfigVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 车间考核参数配置Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfDeptConfigMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptItemConfigMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptItemConfigMapper.java
new file mode 100644
index 000000000..4d7960b17
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptItemConfigMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfDeptItemConfig;
+import com.klp.perf.domain.vo.PerfDeptItemConfigVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 车间扣款/奖励项目配置Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfDeptItemConfigMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptMapper.java
new file mode 100644
index 000000000..4a313e77b
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfDept;
+import com.klp.perf.domain.vo.PerfDeptVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 绩效系统部门Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfDeptMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptSummaryMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptSummaryMapper.java
new file mode 100644
index 000000000..5d35c958e
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfDeptSummaryMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfDeptSummary;
+import com.klp.perf.domain.vo.PerfDeptSummaryVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 车间月度汇总Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfDeptSummaryMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfEmployeeInfoMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfEmployeeInfoMapper.java
new file mode 100644
index 000000000..df9a2467e
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfEmployeeInfoMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfEmployeeInfo;
+import com.klp.perf.domain.vo.PerfEmployeeInfoVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 员工绩效薪资基本信息Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfEmployeeInfoMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfPositionTemplateMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfPositionTemplateMapper.java
new file mode 100644
index 000000000..e658c94ef
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfPositionTemplateMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfPositionTemplate;
+import com.klp.perf.domain.vo.PerfPositionTemplateVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 岗位绩效考核模板Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfPositionTemplateMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfSalaryMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfSalaryMapper.java
new file mode 100644
index 000000000..6bc780ceb
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfSalaryMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfSalary;
+import com.klp.perf.domain.vo.PerfSalaryVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 月度薪资计算记录Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfSalaryMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/mapper/PerfTemplateDimensionMapper.java b/klp-perf/src/main/java/com/klp/perf/mapper/PerfTemplateDimensionMapper.java
new file mode 100644
index 000000000..5b076c159
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/mapper/PerfTemplateDimensionMapper.java
@@ -0,0 +1,15 @@
+package com.klp.perf.mapper;
+
+import com.klp.perf.domain.PerfTemplateDimension;
+import com.klp.perf.domain.vo.PerfTemplateDimensionVo;
+import com.klp.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 考核维度明细Mapper接口
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+public interface PerfTemplateDimensionMapper extends BaseMapperPlus {
+
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfAppraisalDetailService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfAppraisalDetailService.java
new file mode 100644
index 000000000..90b3b779e
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfAppraisalDetailService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfAppraisalDetail;
+import com.klp.perf.domain.vo.PerfAppraisalDetailVo;
+import com.klp.perf.domain.bo.PerfAppraisalDetailBo;
+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-07
+ */
+public interface IPerfAppraisalDetailService {
+
+ /**
+ * 查询考核维度评分明细
+ */
+ PerfAppraisalDetailVo queryById(Long id);
+
+ /**
+ * 查询考核维度评分明细列表
+ */
+ TableDataInfo queryPageList(PerfAppraisalDetailBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询考核维度评分明细列表
+ */
+ List queryList(PerfAppraisalDetailBo bo);
+
+ /**
+ * 新增考核维度评分明细
+ */
+ Boolean insertByBo(PerfAppraisalDetailBo bo);
+
+ /**
+ * 修改考核维度评分明细
+ */
+ Boolean updateByBo(PerfAppraisalDetailBo bo);
+
+ /**
+ * 校验并批量删除考核维度评分明细信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfAppraisalService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfAppraisalService.java
new file mode 100644
index 000000000..d6a65f218
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfAppraisalService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfAppraisal;
+import com.klp.perf.domain.vo.PerfAppraisalVo;
+import com.klp.perf.domain.bo.PerfAppraisalBo;
+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-07
+ */
+public interface IPerfAppraisalService {
+
+ /**
+ * 查询月度绩效考核记录
+ */
+ PerfAppraisalVo queryById(Long id);
+
+ /**
+ * 查询月度绩效考核记录列表
+ */
+ TableDataInfo queryPageList(PerfAppraisalBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询月度绩效考核记录列表
+ */
+ List queryList(PerfAppraisalBo bo);
+
+ /**
+ * 新增月度绩效考核记录
+ */
+ Boolean insertByBo(PerfAppraisalBo bo);
+
+ /**
+ * 修改月度绩效考核记录
+ */
+ Boolean updateByBo(PerfAppraisalBo bo);
+
+ /**
+ * 校验并批量删除月度绩效考核记录信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfCoeffRangeService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfCoeffRangeService.java
new file mode 100644
index 000000000..f589a113b
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfCoeffRangeService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfCoeffRange;
+import com.klp.perf.domain.vo.PerfCoeffRangeVo;
+import com.klp.perf.domain.bo.PerfCoeffRangeBo;
+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-07
+ */
+public interface IPerfCoeffRangeService {
+
+ /**
+ * 查询绩效系数换算
+ */
+ PerfCoeffRangeVo queryById(Long id);
+
+ /**
+ * 查询绩效系数换算列表
+ */
+ TableDataInfo queryPageList(PerfCoeffRangeBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询绩效系数换算列表
+ */
+ List queryList(PerfCoeffRangeBo bo);
+
+ /**
+ * 新增绩效系数换算
+ */
+ Boolean insertByBo(PerfCoeffRangeBo bo);
+
+ /**
+ * 修改绩效系数换算
+ */
+ Boolean updateByBo(PerfCoeffRangeBo bo);
+
+ /**
+ * 校验并批量删除绩效系数换算信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptConfigService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptConfigService.java
new file mode 100644
index 000000000..69d713892
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptConfigService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfDeptConfig;
+import com.klp.perf.domain.vo.PerfDeptConfigVo;
+import com.klp.perf.domain.bo.PerfDeptConfigBo;
+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-07
+ */
+public interface IPerfDeptConfigService {
+
+ /**
+ * 查询车间考核参数配置
+ */
+ PerfDeptConfigVo queryById(Long id);
+
+ /**
+ * 查询车间考核参数配置列表
+ */
+ TableDataInfo queryPageList(PerfDeptConfigBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询车间考核参数配置列表
+ */
+ List queryList(PerfDeptConfigBo bo);
+
+ /**
+ * 新增车间考核参数配置
+ */
+ Boolean insertByBo(PerfDeptConfigBo bo);
+
+ /**
+ * 修改车间考核参数配置
+ */
+ Boolean updateByBo(PerfDeptConfigBo bo);
+
+ /**
+ * 校验并批量删除车间考核参数配置信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptItemConfigService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptItemConfigService.java
new file mode 100644
index 000000000..b72673527
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptItemConfigService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfDeptItemConfig;
+import com.klp.perf.domain.vo.PerfDeptItemConfigVo;
+import com.klp.perf.domain.bo.PerfDeptItemConfigBo;
+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-07
+ */
+public interface IPerfDeptItemConfigService {
+
+ /**
+ * 查询车间扣款/奖励项目配置
+ */
+ PerfDeptItemConfigVo queryById(Long id);
+
+ /**
+ * 查询车间扣款/奖励项目配置列表
+ */
+ TableDataInfo queryPageList(PerfDeptItemConfigBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询车间扣款/奖励项目配置列表
+ */
+ List queryList(PerfDeptItemConfigBo bo);
+
+ /**
+ * 新增车间扣款/奖励项目配置
+ */
+ Boolean insertByBo(PerfDeptItemConfigBo bo);
+
+ /**
+ * 修改车间扣款/奖励项目配置
+ */
+ Boolean updateByBo(PerfDeptItemConfigBo bo);
+
+ /**
+ * 校验并批量删除车间扣款/奖励项目配置信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptService.java
new file mode 100644
index 000000000..443eaa518
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfDept;
+import com.klp.perf.domain.vo.PerfDeptVo;
+import com.klp.perf.domain.bo.PerfDeptBo;
+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-07
+ */
+public interface IPerfDeptService {
+
+ /**
+ * 查询绩效系统部门
+ */
+ PerfDeptVo queryById(Long id);
+
+ /**
+ * 查询绩效系统部门列表
+ */
+ TableDataInfo queryPageList(PerfDeptBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询绩效系统部门列表
+ */
+ List queryList(PerfDeptBo bo);
+
+ /**
+ * 新增绩效系统部门
+ */
+ Boolean insertByBo(PerfDeptBo bo);
+
+ /**
+ * 修改绩效系统部门
+ */
+ Boolean updateByBo(PerfDeptBo bo);
+
+ /**
+ * 校验并批量删除绩效系统部门信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptSummaryService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptSummaryService.java
new file mode 100644
index 000000000..517e6e983
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfDeptSummaryService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfDeptSummary;
+import com.klp.perf.domain.vo.PerfDeptSummaryVo;
+import com.klp.perf.domain.bo.PerfDeptSummaryBo;
+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-07
+ */
+public interface IPerfDeptSummaryService {
+
+ /**
+ * 查询车间月度汇总
+ */
+ PerfDeptSummaryVo queryById(Long id);
+
+ /**
+ * 查询车间月度汇总列表
+ */
+ TableDataInfo queryPageList(PerfDeptSummaryBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询车间月度汇总列表
+ */
+ List queryList(PerfDeptSummaryBo bo);
+
+ /**
+ * 新增车间月度汇总
+ */
+ Boolean insertByBo(PerfDeptSummaryBo bo);
+
+ /**
+ * 修改车间月度汇总
+ */
+ Boolean updateByBo(PerfDeptSummaryBo bo);
+
+ /**
+ * 校验并批量删除车间月度汇总信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfEmployeeInfoService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfEmployeeInfoService.java
new file mode 100644
index 000000000..9c76f822c
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfEmployeeInfoService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfEmployeeInfo;
+import com.klp.perf.domain.vo.PerfEmployeeInfoVo;
+import com.klp.perf.domain.bo.PerfEmployeeInfoBo;
+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-07
+ */
+public interface IPerfEmployeeInfoService {
+
+ /**
+ * 查询员工绩效薪资基本信息
+ */
+ PerfEmployeeInfoVo queryById(Long id);
+
+ /**
+ * 查询员工绩效薪资基本信息列表
+ */
+ TableDataInfo queryPageList(PerfEmployeeInfoBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询员工绩效薪资基本信息列表
+ */
+ List queryList(PerfEmployeeInfoBo bo);
+
+ /**
+ * 新增员工绩效薪资基本信息
+ */
+ Boolean insertByBo(PerfEmployeeInfoBo bo);
+
+ /**
+ * 修改员工绩效薪资基本信息
+ */
+ Boolean updateByBo(PerfEmployeeInfoBo bo);
+
+ /**
+ * 校验并批量删除员工绩效薪资基本信息信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfPositionTemplateService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfPositionTemplateService.java
new file mode 100644
index 000000000..3c29e50d2
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfPositionTemplateService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfPositionTemplate;
+import com.klp.perf.domain.vo.PerfPositionTemplateVo;
+import com.klp.perf.domain.bo.PerfPositionTemplateBo;
+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-07
+ */
+public interface IPerfPositionTemplateService {
+
+ /**
+ * 查询岗位绩效考核模板
+ */
+ PerfPositionTemplateVo queryById(Long id);
+
+ /**
+ * 查询岗位绩效考核模板列表
+ */
+ TableDataInfo queryPageList(PerfPositionTemplateBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询岗位绩效考核模板列表
+ */
+ List queryList(PerfPositionTemplateBo bo);
+
+ /**
+ * 新增岗位绩效考核模板
+ */
+ Boolean insertByBo(PerfPositionTemplateBo bo);
+
+ /**
+ * 修改岗位绩效考核模板
+ */
+ Boolean updateByBo(PerfPositionTemplateBo bo);
+
+ /**
+ * 校验并批量删除岗位绩效考核模板信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfSalaryService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfSalaryService.java
new file mode 100644
index 000000000..73bdffddc
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfSalaryService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfSalary;
+import com.klp.perf.domain.vo.PerfSalaryVo;
+import com.klp.perf.domain.bo.PerfSalaryBo;
+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-07
+ */
+public interface IPerfSalaryService {
+
+ /**
+ * 查询月度薪资计算记录
+ */
+ PerfSalaryVo queryById(Long id);
+
+ /**
+ * 查询月度薪资计算记录列表
+ */
+ TableDataInfo queryPageList(PerfSalaryBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询月度薪资计算记录列表
+ */
+ List queryList(PerfSalaryBo bo);
+
+ /**
+ * 新增月度薪资计算记录
+ */
+ Boolean insertByBo(PerfSalaryBo bo);
+
+ /**
+ * 修改月度薪资计算记录
+ */
+ Boolean updateByBo(PerfSalaryBo bo);
+
+ /**
+ * 校验并批量删除月度薪资计算记录信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/IPerfTemplateDimensionService.java b/klp-perf/src/main/java/com/klp/perf/service/IPerfTemplateDimensionService.java
new file mode 100644
index 000000000..78f613ce9
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/IPerfTemplateDimensionService.java
@@ -0,0 +1,49 @@
+package com.klp.perf.service;
+
+import com.klp.perf.domain.PerfTemplateDimension;
+import com.klp.perf.domain.vo.PerfTemplateDimensionVo;
+import com.klp.perf.domain.bo.PerfTemplateDimensionBo;
+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-07
+ */
+public interface IPerfTemplateDimensionService {
+
+ /**
+ * 查询考核维度明细
+ */
+ PerfTemplateDimensionVo queryById(Long id);
+
+ /**
+ * 查询考核维度明细列表
+ */
+ TableDataInfo queryPageList(PerfTemplateDimensionBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询考核维度明细列表
+ */
+ List queryList(PerfTemplateDimensionBo bo);
+
+ /**
+ * 新增考核维度明细
+ */
+ Boolean insertByBo(PerfTemplateDimensionBo bo);
+
+ /**
+ * 修改考核维度明细
+ */
+ Boolean updateByBo(PerfTemplateDimensionBo bo);
+
+ /**
+ * 校验并批量删除考核维度明细信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfAppraisalDetailServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfAppraisalDetailServiceImpl.java
new file mode 100644
index 000000000..962bb5b28
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfAppraisalDetailServiceImpl.java
@@ -0,0 +1,120 @@
+package com.klp.perf.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.perf.domain.bo.PerfAppraisalDetailBo;
+import com.klp.perf.domain.vo.PerfAppraisalDetailVo;
+import com.klp.perf.domain.PerfAppraisalDetail;
+import com.klp.perf.mapper.PerfAppraisalDetailMapper;
+import com.klp.perf.service.IPerfAppraisalDetailService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 考核维度评分明细Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfAppraisalDetailServiceImpl implements IPerfAppraisalDetailService {
+
+ private final PerfAppraisalDetailMapper baseMapper;
+
+ /**
+ * 查询考核维度评分明细
+ */
+ @Override
+ public PerfAppraisalDetailVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询考核维度评分明细列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfAppraisalDetailBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询考核维度评分明细列表
+ */
+ @Override
+ public List queryList(PerfAppraisalDetailBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfAppraisalDetailBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getAppraisalId() != null, PerfAppraisalDetail::getAppraisalId, bo.getAppraisalId());
+ lqw.eq(bo.getDimensionId() != null, PerfAppraisalDetail::getDimensionId, bo.getDimensionId());
+ lqw.eq(StringUtils.isNotBlank(bo.getSeq()), PerfAppraisalDetail::getSeq, bo.getSeq());
+ lqw.like(StringUtils.isNotBlank(bo.getDimName()), PerfAppraisalDetail::getDimName, bo.getDimName());
+ lqw.eq(StringUtils.isNotBlank(bo.getWeight()), PerfAppraisalDetail::getWeight, bo.getWeight());
+ lqw.eq(StringUtils.isNotBlank(bo.getTargetValue()), PerfAppraisalDetail::getTargetValue, bo.getTargetValue());
+ lqw.eq(StringUtils.isNotBlank(bo.getActualValue()), PerfAppraisalDetail::getActualValue, bo.getActualValue());
+ lqw.eq(bo.getDimScore() != null, PerfAppraisalDetail::getDimScore, bo.getDimScore());
+ lqw.eq(bo.getBonus() != null, PerfAppraisalDetail::getBonus, bo.getBonus());
+ lqw.eq(bo.getPenalty() != null, PerfAppraisalDetail::getPenalty, bo.getPenalty());
+ lqw.eq(StringUtils.isNotBlank(bo.getScoreFormula()), PerfAppraisalDetail::getScoreFormula, bo.getScoreFormula());
+ lqw.eq(StringUtils.isNotBlank(bo.getScoreRule()), PerfAppraisalDetail::getScoreRule, bo.getScoreRule());
+ return lqw;
+ }
+
+ /**
+ * 新增考核维度评分明细
+ */
+ @Override
+ public Boolean insertByBo(PerfAppraisalDetailBo bo) {
+ PerfAppraisalDetail add = BeanUtil.toBean(bo, PerfAppraisalDetail.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改考核维度评分明细
+ */
+ @Override
+ public Boolean updateByBo(PerfAppraisalDetailBo bo) {
+ PerfAppraisalDetail update = BeanUtil.toBean(bo, PerfAppraisalDetail.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfAppraisalDetail entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除考核维度评分明细
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfAppraisalServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfAppraisalServiceImpl.java
new file mode 100644
index 000000000..563cbbabd
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfAppraisalServiceImpl.java
@@ -0,0 +1,121 @@
+package com.klp.perf.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.perf.domain.bo.PerfAppraisalBo;
+import com.klp.perf.domain.vo.PerfAppraisalVo;
+import com.klp.perf.domain.PerfAppraisal;
+import com.klp.perf.mapper.PerfAppraisalMapper;
+import com.klp.perf.service.IPerfAppraisalService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 月度绩效考核记录Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfAppraisalServiceImpl implements IPerfAppraisalService {
+
+ private final PerfAppraisalMapper baseMapper;
+
+ /**
+ * 查询月度绩效考核记录
+ */
+ @Override
+ public PerfAppraisalVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询月度绩效考核记录列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfAppraisalBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询月度绩效考核记录列表
+ */
+ @Override
+ public List queryList(PerfAppraisalBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfAppraisalBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getEmployeeId() != null, PerfAppraisal::getEmployeeId, bo.getEmployeeId());
+ lqw.eq(bo.getDeptId() != null, PerfAppraisal::getDeptId, bo.getDeptId());
+ lqw.eq(bo.getTemplateId() != null, PerfAppraisal::getTemplateId, bo.getTemplateId());
+ lqw.eq(StringUtils.isNotBlank(bo.getPeriod()), PerfAppraisal::getPeriod, bo.getPeriod());
+ lqw.eq(bo.getWeightedScore() != null, PerfAppraisal::getWeightedScore, bo.getWeightedScore());
+ lqw.eq(bo.getBonusScore() != null, PerfAppraisal::getBonusScore, bo.getBonusScore());
+ lqw.eq(bo.getPenaltyScore() != null, PerfAppraisal::getPenaltyScore, bo.getPenaltyScore());
+ lqw.eq(bo.getFinalScore() != null, PerfAppraisal::getFinalScore, bo.getFinalScore());
+ lqw.eq(StringUtils.isNotBlank(bo.getGrade()), PerfAppraisal::getGrade, bo.getGrade());
+ lqw.eq(bo.getPerfCoeff() != null, PerfAppraisal::getPerfCoeff, bo.getPerfCoeff());
+ lqw.eq(bo.getStatus() != null, PerfAppraisal::getStatus, bo.getStatus());
+ lqw.eq(bo.getConfirmedAt() != null, PerfAppraisal::getConfirmedAt, bo.getConfirmedAt());
+ lqw.eq(bo.getConfirmedBy() != null, PerfAppraisal::getConfirmedBy, bo.getConfirmedBy());
+ return lqw;
+ }
+
+ /**
+ * 新增月度绩效考核记录
+ */
+ @Override
+ public Boolean insertByBo(PerfAppraisalBo bo) {
+ PerfAppraisal add = BeanUtil.toBean(bo, PerfAppraisal.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改月度绩效考核记录
+ */
+ @Override
+ public Boolean updateByBo(PerfAppraisalBo bo) {
+ PerfAppraisal update = BeanUtil.toBean(bo, PerfAppraisal.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfAppraisal entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除月度绩效考核记录
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfCoeffRangeServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfCoeffRangeServiceImpl.java
new file mode 100644
index 000000000..29c8d8658
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfCoeffRangeServiceImpl.java
@@ -0,0 +1,115 @@
+package com.klp.perf.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.perf.domain.bo.PerfCoeffRangeBo;
+import com.klp.perf.domain.vo.PerfCoeffRangeVo;
+import com.klp.perf.domain.PerfCoeffRange;
+import com.klp.perf.mapper.PerfCoeffRangeMapper;
+import com.klp.perf.service.IPerfCoeffRangeService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 绩效系数换算Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfCoeffRangeServiceImpl implements IPerfCoeffRangeService {
+
+ private final PerfCoeffRangeMapper baseMapper;
+
+ /**
+ * 查询绩效系数换算
+ */
+ @Override
+ public PerfCoeffRangeVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询绩效系数换算列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfCoeffRangeBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询绩效系数换算列表
+ */
+ @Override
+ public List queryList(PerfCoeffRangeBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfCoeffRangeBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getGrade()), PerfCoeffRange::getGrade, bo.getGrade());
+ lqw.eq(StringUtils.isNotBlank(bo.getGradeLabel()), PerfCoeffRange::getGradeLabel, bo.getGradeLabel());
+ lqw.eq(bo.getScoreMin() != null, PerfCoeffRange::getScoreMin, bo.getScoreMin());
+ lqw.eq(bo.getScoreMax() != null, PerfCoeffRange::getScoreMax, bo.getScoreMax());
+ lqw.eq(bo.getCoeffMin() != null, PerfCoeffRange::getCoeffMin, bo.getCoeffMin());
+ lqw.eq(bo.getCoeffMax() != null, PerfCoeffRange::getCoeffMax, bo.getCoeffMax());
+ lqw.eq(bo.getSortOrder() != null, PerfCoeffRange::getSortOrder, bo.getSortOrder());
+ return lqw;
+ }
+
+ /**
+ * 新增绩效系数换算
+ */
+ @Override
+ public Boolean insertByBo(PerfCoeffRangeBo bo) {
+ PerfCoeffRange add = BeanUtil.toBean(bo, PerfCoeffRange.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改绩效系数换算
+ */
+ @Override
+ public Boolean updateByBo(PerfCoeffRangeBo bo) {
+ PerfCoeffRange update = BeanUtil.toBean(bo, PerfCoeffRange.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfCoeffRange entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除绩效系数换算
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptConfigServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptConfigServiceImpl.java
new file mode 100644
index 000000000..c5c86017f
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptConfigServiceImpl.java
@@ -0,0 +1,120 @@
+package com.klp.perf.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.perf.domain.bo.PerfDeptConfigBo;
+import com.klp.perf.domain.vo.PerfDeptConfigVo;
+import com.klp.perf.domain.PerfDeptConfig;
+import com.klp.perf.mapper.PerfDeptConfigMapper;
+import com.klp.perf.service.IPerfDeptConfigService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 车间考核参数配置Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfDeptConfigServiceImpl implements IPerfDeptConfigService {
+
+ private final PerfDeptConfigMapper baseMapper;
+
+ /**
+ * 查询车间考核参数配置
+ */
+ @Override
+ public PerfDeptConfigVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询车间考核参数配置列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfDeptConfigBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询车间考核参数配置列表
+ */
+ @Override
+ public List queryList(PerfDeptConfigBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfDeptConfigBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getDeptId() != null, PerfDeptConfig::getDeptId, bo.getDeptId());
+ lqw.eq(bo.getMonthlyProductionTarget() != null, PerfDeptConfig::getMonthlyProductionTarget, bo.getMonthlyProductionTarget());
+ lqw.eq(StringUtils.isNotBlank(bo.getProductionUnit()), PerfDeptConfig::getProductionUnit, bo.getProductionUnit());
+ lqw.eq(bo.getPerfUnitPrice() != null, PerfDeptConfig::getPerfUnitPrice, bo.getPerfUnitPrice());
+ lqw.eq(bo.getProductionShifts() != null, PerfDeptConfig::getProductionShifts, bo.getProductionShifts());
+ lqw.eq(bo.getGuaranteedShifts() != null, PerfDeptConfig::getGuaranteedShifts, bo.getGuaranteedShifts());
+ lqw.eq(bo.getDeptCoeff() != null, PerfDeptConfig::getDeptCoeff, bo.getDeptCoeff());
+ lqw.eq(bo.getSalaryMode() != null, PerfDeptConfig::getSalaryMode, bo.getSalaryMode());
+ lqw.eq(bo.getBaseDivisor() != null, PerfDeptConfig::getBaseDivisor, bo.getBaseDivisor());
+ lqw.eq(bo.getMonth() != null, PerfDeptConfig::getMonth, bo.getMonth());
+ lqw.eq(bo.getCreatedAt() != null, PerfDeptConfig::getCreatedAt, bo.getCreatedAt());
+ lqw.eq(bo.getUpdatedAt() != null, PerfDeptConfig::getUpdatedAt, bo.getUpdatedAt());
+ return lqw;
+ }
+
+ /**
+ * 新增车间考核参数配置
+ */
+ @Override
+ public Boolean insertByBo(PerfDeptConfigBo bo) {
+ PerfDeptConfig add = BeanUtil.toBean(bo, PerfDeptConfig.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改车间考核参数配置
+ */
+ @Override
+ public Boolean updateByBo(PerfDeptConfigBo bo) {
+ PerfDeptConfig update = BeanUtil.toBean(bo, PerfDeptConfig.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfDeptConfig entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除车间考核参数配置
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptItemConfigServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptItemConfigServiceImpl.java
new file mode 100644
index 000000000..2de36f9c0
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptItemConfigServiceImpl.java
@@ -0,0 +1,114 @@
+package com.klp.perf.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.perf.domain.bo.PerfDeptItemConfigBo;
+import com.klp.perf.domain.vo.PerfDeptItemConfigVo;
+import com.klp.perf.domain.PerfDeptItemConfig;
+import com.klp.perf.mapper.PerfDeptItemConfigMapper;
+import com.klp.perf.service.IPerfDeptItemConfigService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 车间扣款/奖励项目配置Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfDeptItemConfigServiceImpl implements IPerfDeptItemConfigService {
+
+ private final PerfDeptItemConfigMapper baseMapper;
+
+ /**
+ * 查询车间扣款/奖励项目配置
+ */
+ @Override
+ public PerfDeptItemConfigVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询车间扣款/奖励项目配置列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfDeptItemConfigBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询车间扣款/奖励项目配置列表
+ */
+ @Override
+ public List queryList(PerfDeptItemConfigBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfDeptItemConfigBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getDeptId() != null, PerfDeptItemConfig::getDeptId, bo.getDeptId());
+ lqw.eq(bo.getItemType() != null, PerfDeptItemConfig::getItemType, bo.getItemType());
+ lqw.like(StringUtils.isNotBlank(bo.getItemName()), PerfDeptItemConfig::getItemName, bo.getItemName());
+ lqw.eq(bo.getSortOrder() != null, PerfDeptItemConfig::getSortOrder, bo.getSortOrder());
+ lqw.eq(bo.getMonth() != null, PerfDeptItemConfig::getMonth, bo.getMonth());
+ lqw.eq(bo.getIsEnabled() != null, PerfDeptItemConfig::getIsEnabled, bo.getIsEnabled());
+ return lqw;
+ }
+
+ /**
+ * 新增车间扣款/奖励项目配置
+ */
+ @Override
+ public Boolean insertByBo(PerfDeptItemConfigBo bo) {
+ PerfDeptItemConfig add = BeanUtil.toBean(bo, PerfDeptItemConfig.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改车间扣款/奖励项目配置
+ */
+ @Override
+ public Boolean updateByBo(PerfDeptItemConfigBo bo) {
+ PerfDeptItemConfig update = BeanUtil.toBean(bo, PerfDeptItemConfig.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfDeptItemConfig entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除车间扣款/奖励项目配置
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptServiceImpl.java
new file mode 100644
index 000000000..2e40e7183
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptServiceImpl.java
@@ -0,0 +1,112 @@
+package com.klp.perf.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.perf.domain.bo.PerfDeptBo;
+import com.klp.perf.domain.vo.PerfDeptVo;
+import com.klp.perf.domain.PerfDept;
+import com.klp.perf.mapper.PerfDeptMapper;
+import com.klp.perf.service.IPerfDeptService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 绩效系统部门Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfDeptServiceImpl implements IPerfDeptService {
+
+ private final PerfDeptMapper baseMapper;
+
+ /**
+ * 查询绩效系统部门
+ */
+ @Override
+ public PerfDeptVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询绩效系统部门列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfDeptBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询绩效系统部门列表
+ */
+ @Override
+ public List queryList(PerfDeptBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfDeptBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.like(StringUtils.isNotBlank(bo.getDeptName()), PerfDept::getDeptName, bo.getDeptName());
+ lqw.eq(bo.getOrderNum() != null, PerfDept::getOrderNum, bo.getOrderNum());
+ lqw.eq(bo.getHasBaoSalary() != null, PerfDept::getHasBaoSalary, bo.getHasBaoSalary());
+ lqw.eq(StringUtils.isNotBlank(bo.getStatus()), PerfDept::getStatus, bo.getStatus());
+ return lqw;
+ }
+
+ /**
+ * 新增绩效系统部门
+ */
+ @Override
+ public Boolean insertByBo(PerfDeptBo bo) {
+ PerfDept add = BeanUtil.toBean(bo, PerfDept.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改绩效系统部门
+ */
+ @Override
+ public Boolean updateByBo(PerfDeptBo bo) {
+ PerfDept update = BeanUtil.toBean(bo, PerfDept.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfDept entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除绩效系统部门
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptSummaryServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptSummaryServiceImpl.java
new file mode 100644
index 000000000..2b0e9a243
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfDeptSummaryServiceImpl.java
@@ -0,0 +1,124 @@
+package com.klp.perf.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.perf.domain.bo.PerfDeptSummaryBo;
+import com.klp.perf.domain.vo.PerfDeptSummaryVo;
+import com.klp.perf.domain.PerfDeptSummary;
+import com.klp.perf.mapper.PerfDeptSummaryMapper;
+import com.klp.perf.service.IPerfDeptSummaryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 车间月度汇总Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfDeptSummaryServiceImpl implements IPerfDeptSummaryService {
+
+ private final PerfDeptSummaryMapper baseMapper;
+
+ /**
+ * 查询车间月度汇总
+ */
+ @Override
+ public PerfDeptSummaryVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询车间月度汇总列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfDeptSummaryBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询车间月度汇总列表
+ */
+ @Override
+ public List queryList(PerfDeptSummaryBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfDeptSummaryBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getDeptId() != null, PerfDeptSummary::getDeptId, bo.getDeptId());
+ lqw.eq(StringUtils.isNotBlank(bo.getPeriod()), PerfDeptSummary::getPeriod, bo.getPeriod());
+ lqw.eq(bo.getTotalEmployees() != null, PerfDeptSummary::getTotalEmployees, bo.getTotalEmployees());
+ lqw.eq(bo.getTotalCoeffSum() != null, PerfDeptSummary::getTotalCoeffSum, bo.getTotalCoeffSum());
+ lqw.eq(bo.getAvgPerfScore() != null, PerfDeptSummary::getAvgPerfScore, bo.getAvgPerfScore());
+ lqw.eq(bo.getAvgPerfCoeff() != null, PerfDeptSummary::getAvgPerfCoeff, bo.getAvgPerfCoeff());
+ lqw.eq(bo.getTotalBaseSalary() != null, PerfDeptSummary::getTotalBaseSalary, bo.getTotalBaseSalary());
+ lqw.eq(bo.getTotalPerfWage() != null, PerfDeptSummary::getTotalPerfWage, bo.getTotalPerfWage());
+ lqw.eq(bo.getTotalDeductions() != null, PerfDeptSummary::getTotalDeductions, bo.getTotalDeductions());
+ lqw.eq(bo.getTotalBonuses() != null, PerfDeptSummary::getTotalBonuses, bo.getTotalBonuses());
+ lqw.eq(bo.getTotalOther() != null, PerfDeptSummary::getTotalOther, bo.getTotalOther());
+ lqw.eq(bo.getTotalActualSalary() != null, PerfDeptSummary::getTotalActualSalary, bo.getTotalActualSalary());
+ lqw.eq(bo.getAvgActualSalary() != null, PerfDeptSummary::getAvgActualSalary, bo.getAvgActualSalary());
+ lqw.eq(bo.getMonthlyProduction() != null, PerfDeptSummary::getMonthlyProduction, bo.getMonthlyProduction());
+ lqw.eq(bo.getUnitPrice() != null, PerfDeptSummary::getUnitPrice, bo.getUnitPrice());
+ lqw.eq(bo.getStatus() != null, PerfDeptSummary::getStatus, bo.getStatus());
+ return lqw;
+ }
+
+ /**
+ * 新增车间月度汇总
+ */
+ @Override
+ public Boolean insertByBo(PerfDeptSummaryBo bo) {
+ PerfDeptSummary add = BeanUtil.toBean(bo, PerfDeptSummary.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改车间月度汇总
+ */
+ @Override
+ public Boolean updateByBo(PerfDeptSummaryBo bo) {
+ PerfDeptSummary update = BeanUtil.toBean(bo, PerfDeptSummary.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfDeptSummary entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除车间月度汇总
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfEmployeeInfoServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfEmployeeInfoServiceImpl.java
new file mode 100644
index 000000000..58ce5e835
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfEmployeeInfoServiceImpl.java
@@ -0,0 +1,115 @@
+package com.klp.perf.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.perf.domain.bo.PerfEmployeeInfoBo;
+import com.klp.perf.domain.vo.PerfEmployeeInfoVo;
+import com.klp.perf.domain.PerfEmployeeInfo;
+import com.klp.perf.mapper.PerfEmployeeInfoMapper;
+import com.klp.perf.service.IPerfEmployeeInfoService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 员工绩效薪资基本信息Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfEmployeeInfoServiceImpl implements IPerfEmployeeInfoService {
+
+ private final PerfEmployeeInfoMapper baseMapper;
+
+ /**
+ * 查询员工绩效薪资基本信息
+ */
+ @Override
+ public PerfEmployeeInfoVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询员工绩效薪资基本信息列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfEmployeeInfoBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询员工绩效薪资基本信息列表
+ */
+ @Override
+ public List queryList(PerfEmployeeInfoBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfEmployeeInfoBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getEmployeeId() != null, PerfEmployeeInfo::getEmployeeId, bo.getEmployeeId());
+ lqw.eq(bo.getDeptId() != null, PerfEmployeeInfo::getDeptId, bo.getDeptId());
+ lqw.like(StringUtils.isNotBlank(bo.getPositionName()), PerfEmployeeInfo::getPositionName, bo.getPositionName());
+ lqw.eq(bo.getBaseSalary() != null, PerfEmployeeInfo::getBaseSalary, bo.getBaseSalary());
+ lqw.eq(bo.getPerfBase() != null, PerfEmployeeInfo::getPerfBase, bo.getPerfBase());
+ lqw.eq(bo.getPosCoeffDefault() != null, PerfEmployeeInfo::getPosCoeffDefault, bo.getPosCoeffDefault());
+ lqw.eq(bo.getIsActive() != null, PerfEmployeeInfo::getIsActive, bo.getIsActive());
+ return lqw;
+ }
+
+ /**
+ * 新增员工绩效薪资基本信息
+ */
+ @Override
+ public Boolean insertByBo(PerfEmployeeInfoBo bo) {
+ PerfEmployeeInfo add = BeanUtil.toBean(bo, PerfEmployeeInfo.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改员工绩效薪资基本信息
+ */
+ @Override
+ public Boolean updateByBo(PerfEmployeeInfoBo bo) {
+ PerfEmployeeInfo update = BeanUtil.toBean(bo, PerfEmployeeInfo.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfEmployeeInfo entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除员工绩效薪资基本信息
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfPositionTemplateServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfPositionTemplateServiceImpl.java
new file mode 100644
index 000000000..f3221a8b8
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfPositionTemplateServiceImpl.java
@@ -0,0 +1,112 @@
+package com.klp.perf.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.perf.domain.bo.PerfPositionTemplateBo;
+import com.klp.perf.domain.vo.PerfPositionTemplateVo;
+import com.klp.perf.domain.PerfPositionTemplate;
+import com.klp.perf.mapper.PerfPositionTemplateMapper;
+import com.klp.perf.service.IPerfPositionTemplateService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 岗位绩效考核模板Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfPositionTemplateServiceImpl implements IPerfPositionTemplateService {
+
+ private final PerfPositionTemplateMapper baseMapper;
+
+ /**
+ * 查询岗位绩效考核模板
+ */
+ @Override
+ public PerfPositionTemplateVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询岗位绩效考核模板列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfPositionTemplateBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询岗位绩效考核模板列表
+ */
+ @Override
+ public List queryList(PerfPositionTemplateBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfPositionTemplateBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getDeptId() != null, PerfPositionTemplate::getDeptId, bo.getDeptId());
+ lqw.like(StringUtils.isNotBlank(bo.getPositionName()), PerfPositionTemplate::getPositionName, bo.getPositionName());
+ lqw.eq(StringUtils.isNotBlank(bo.getTitle()), PerfPositionTemplate::getTitle, bo.getTitle());
+ lqw.eq(bo.getIsEnabled() != null, PerfPositionTemplate::getIsEnabled, bo.getIsEnabled());
+ return lqw;
+ }
+
+ /**
+ * 新增岗位绩效考核模板
+ */
+ @Override
+ public Boolean insertByBo(PerfPositionTemplateBo bo) {
+ PerfPositionTemplate add = BeanUtil.toBean(bo, PerfPositionTemplate.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改岗位绩效考核模板
+ */
+ @Override
+ public Boolean updateByBo(PerfPositionTemplateBo bo) {
+ PerfPositionTemplate update = BeanUtil.toBean(bo, PerfPositionTemplate.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfPositionTemplate entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除岗位绩效考核模板
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfSalaryServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfSalaryServiceImpl.java
new file mode 100644
index 000000000..d6d65bcc4
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfSalaryServiceImpl.java
@@ -0,0 +1,137 @@
+package com.klp.perf.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.perf.domain.bo.PerfSalaryBo;
+import com.klp.perf.domain.vo.PerfSalaryVo;
+import com.klp.perf.domain.PerfSalary;
+import com.klp.perf.mapper.PerfSalaryMapper;
+import com.klp.perf.service.IPerfSalaryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 月度薪资计算记录Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfSalaryServiceImpl implements IPerfSalaryService {
+
+ private final PerfSalaryMapper baseMapper;
+
+ /**
+ * 查询月度薪资计算记录
+ */
+ @Override
+ public PerfSalaryVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询月度薪资计算记录列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfSalaryBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询月度薪资计算记录列表
+ */
+ @Override
+ public List queryList(PerfSalaryBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfSalaryBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getEmployeeId() != null, PerfSalary::getEmployeeId, bo.getEmployeeId());
+ lqw.eq(bo.getDeptId() != null, PerfSalary::getDeptId, bo.getDeptId());
+ lqw.eq(bo.getAppraisalId() != null, PerfSalary::getAppraisalId, bo.getAppraisalId());
+ lqw.eq(StringUtils.isNotBlank(bo.getPeriod()), PerfSalary::getPeriod, bo.getPeriod());
+ lqw.eq(bo.getBaseSalary() != null, PerfSalary::getBaseSalary, bo.getBaseSalary());
+ lqw.eq(bo.getPerfBase() != null, PerfSalary::getPerfBase, bo.getPerfBase());
+ lqw.eq(bo.getPerfScore() != null, PerfSalary::getPerfScore, bo.getPerfScore());
+ lqw.eq(bo.getPerfCoeff() != null, PerfSalary::getPerfCoeff, bo.getPerfCoeff());
+ lqw.eq(bo.getDeptCoeff() != null, PerfSalary::getDeptCoeff, bo.getDeptCoeff());
+ lqw.eq(bo.getPerfWage() != null, PerfSalary::getPerfWage, bo.getPerfWage());
+ lqw.eq(bo.getPosCoeff() != null, PerfSalary::getPosCoeff, bo.getPosCoeff());
+ lqw.eq(bo.getFixedCoeff() != null, PerfSalary::getFixedCoeff, bo.getFixedCoeff());
+ lqw.eq(bo.getAdjCoeff() != null, PerfSalary::getAdjCoeff, bo.getAdjCoeff());
+ lqw.eq(bo.getAdjCoeffManual() != null, PerfSalary::getAdjCoeffManual, bo.getAdjCoeffManual());
+ lqw.eq(bo.getTotalCoeff() != null, PerfSalary::getTotalCoeff, bo.getTotalCoeff());
+ lqw.eq(StringUtils.isNotBlank(bo.getDeductionsJson()), PerfSalary::getDeductionsJson, bo.getDeductionsJson());
+ lqw.eq(bo.getDeductionsTotal() != null, PerfSalary::getDeductionsTotal, bo.getDeductionsTotal());
+ lqw.eq(StringUtils.isNotBlank(bo.getBonusesJson()), PerfSalary::getBonusesJson, bo.getBonusesJson());
+ lqw.eq(bo.getBonusesTotal() != null, PerfSalary::getBonusesTotal, bo.getBonusesTotal());
+ lqw.eq(bo.getOtherAmount() != null, PerfSalary::getOtherAmount, bo.getOtherAmount());
+ lqw.eq(bo.getActualSalary() != null, PerfSalary::getActualSalary, bo.getActualSalary());
+ lqw.eq(bo.getFixedSalaryRef() != null, PerfSalary::getFixedSalaryRef, bo.getFixedSalaryRef());
+ lqw.eq(bo.getAdjSalaryRef() != null, PerfSalary::getAdjSalaryRef, bo.getAdjSalaryRef());
+ lqw.eq(bo.getBaoPerShiftRef() != null, PerfSalary::getBaoPerShiftRef, bo.getBaoPerShiftRef());
+ lqw.eq(bo.getBaoSalaryRef() != null, PerfSalary::getBaoSalaryRef, bo.getBaoSalaryRef());
+ lqw.eq(bo.getTotalSalaryRef() != null, PerfSalary::getTotalSalaryRef, bo.getTotalSalaryRef());
+ lqw.eq(bo.getStatus() != null, PerfSalary::getStatus, bo.getStatus());
+ lqw.eq(bo.getConfirmedAt() != null, PerfSalary::getConfirmedAt, bo.getConfirmedAt());
+ lqw.eq(bo.getConfirmedBy() != null, PerfSalary::getConfirmedBy, bo.getConfirmedBy());
+ return lqw;
+ }
+
+ /**
+ * 新增月度薪资计算记录
+ */
+ @Override
+ public Boolean insertByBo(PerfSalaryBo bo) {
+ PerfSalary add = BeanUtil.toBean(bo, PerfSalary.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改月度薪资计算记录
+ */
+ @Override
+ public Boolean updateByBo(PerfSalaryBo bo) {
+ PerfSalary update = BeanUtil.toBean(bo, PerfSalary.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfSalary entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除月度薪资计算记录
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/java/com/klp/perf/service/impl/PerfTemplateDimensionServiceImpl.java b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfTemplateDimensionServiceImpl.java
new file mode 100644
index 000000000..eb6ff8784
--- /dev/null
+++ b/klp-perf/src/main/java/com/klp/perf/service/impl/PerfTemplateDimensionServiceImpl.java
@@ -0,0 +1,117 @@
+package com.klp.perf.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.perf.domain.bo.PerfTemplateDimensionBo;
+import com.klp.perf.domain.vo.PerfTemplateDimensionVo;
+import com.klp.perf.domain.PerfTemplateDimension;
+import com.klp.perf.mapper.PerfTemplateDimensionMapper;
+import com.klp.perf.service.IPerfTemplateDimensionService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 考核维度明细Service业务层处理
+ *
+ * @author klp
+ * @date 2026-07-07
+ */
+@RequiredArgsConstructor
+@Service
+public class PerfTemplateDimensionServiceImpl implements IPerfTemplateDimensionService {
+
+ private final PerfTemplateDimensionMapper baseMapper;
+
+ /**
+ * 查询考核维度明细
+ */
+ @Override
+ public PerfTemplateDimensionVo queryById(Long id){
+ return baseMapper.selectVoById(id);
+ }
+
+ /**
+ * 查询考核维度明细列表
+ */
+ @Override
+ public TableDataInfo queryPageList(PerfTemplateDimensionBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询考核维度明细列表
+ */
+ @Override
+ public List queryList(PerfTemplateDimensionBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(PerfTemplateDimensionBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getTemplateId() != null, PerfTemplateDimension::getTemplateId, bo.getTemplateId());
+ lqw.eq(StringUtils.isNotBlank(bo.getSeq()), PerfTemplateDimension::getSeq, bo.getSeq());
+ lqw.like(StringUtils.isNotBlank(bo.getDimName()), PerfTemplateDimension::getDimName, bo.getDimName());
+ lqw.eq(StringUtils.isNotBlank(bo.getWeight()), PerfTemplateDimension::getWeight, bo.getWeight());
+ lqw.eq(StringUtils.isNotBlank(bo.getIndicator()), PerfTemplateDimension::getIndicator, bo.getIndicator());
+ lqw.eq(StringUtils.isNotBlank(bo.getTargetValue()), PerfTemplateDimension::getTargetValue, bo.getTargetValue());
+ lqw.eq(StringUtils.isNotBlank(bo.getScoreFormula()), PerfTemplateDimension::getScoreFormula, bo.getScoreFormula());
+ lqw.eq(StringUtils.isNotBlank(bo.getScoreRule()), PerfTemplateDimension::getScoreRule, bo.getScoreRule());
+ lqw.eq(bo.getIsEnabled() != null, PerfTemplateDimension::getIsEnabled, bo.getIsEnabled());
+ return lqw;
+ }
+
+ /**
+ * 新增考核维度明细
+ */
+ @Override
+ public Boolean insertByBo(PerfTemplateDimensionBo bo) {
+ PerfTemplateDimension add = BeanUtil.toBean(bo, PerfTemplateDimension.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setId(add.getId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改考核维度明细
+ */
+ @Override
+ public Boolean updateByBo(PerfTemplateDimensionBo bo) {
+ PerfTemplateDimension update = BeanUtil.toBean(bo, PerfTemplateDimension.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(PerfTemplateDimension entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除考核维度明细
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfAppraisalDetailMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfAppraisalDetailMapper.xml
new file mode 100644
index 000000000..bfefc06c8
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfAppraisalDetailMapper.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfAppraisalMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfAppraisalMapper.xml
new file mode 100644
index 000000000..bdcffde34
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfAppraisalMapper.xml
@@ -0,0 +1,31 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfCoeffRangeMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfCoeffRangeMapper.xml
new file mode 100644
index 000000000..7614df6bd
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfCoeffRangeMapper.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfDeptConfigMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfDeptConfigMapper.xml
new file mode 100644
index 000000000..0c96822b8
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfDeptConfigMapper.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfDeptItemConfigMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfDeptItemConfigMapper.xml
new file mode 100644
index 000000000..6e8e16306
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfDeptItemConfigMapper.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfDeptMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfDeptMapper.xml
new file mode 100644
index 000000000..a359fc9f4
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfDeptMapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfDeptSummaryMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfDeptSummaryMapper.xml
new file mode 100644
index 000000000..bf29d200a
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfDeptSummaryMapper.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfEmployeeInfoMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfEmployeeInfoMapper.xml
new file mode 100644
index 000000000..17bb24965
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfEmployeeInfoMapper.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfPositionTemplateMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfPositionTemplateMapper.xml
new file mode 100644
index 000000000..d2b27d489
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfPositionTemplateMapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfSalaryMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfSalaryMapper.xml
new file mode 100644
index 000000000..778538fd1
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfSalaryMapper.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-perf/src/main/resources/mapper/perf/PerfTemplateDimensionMapper.xml b/klp-perf/src/main/resources/mapper/perf/PerfTemplateDimensionMapper.xml
new file mode 100644
index 000000000..75dd0838c
--- /dev/null
+++ b/klp-perf/src/main/resources/mapper/perf/PerfTemplateDimensionMapper.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-pltcm/src/main/java/com/klp/pltcm/controller/ModDeviceEnableController.java b/klp-pltcm/src/main/java/com/klp/pltcm/controller/ModDeviceEnableController.java
new file mode 100644
index 000000000..d33fc2425
--- /dev/null
+++ b/klp-pltcm/src/main/java/com/klp/pltcm/controller/ModDeviceEnableController.java
@@ -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 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 list = iModDeviceEnableService.queryList(bo);
+ ExcelUtil.exportExcel(list, "设备启用状态", ModDeviceEnableVo.class, response);
+ }
+
+ @GetMapping("/{id}")
+ public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long id) {
+ return R.ok(iModDeviceEnableService.queryById(id));
+ }
+
+ @Log(title = "设备启用状态", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody ModDeviceEnableBo bo) {
+ return toAjax(iModDeviceEnableService.insertByBo(bo));
+ }
+
+ @Log(title = "设备启用状态", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody ModDeviceEnableBo bo) {
+ return toAjax(iModDeviceEnableService.updateByBo(bo));
+ }
+
+ @Log(title = "设备启用状态", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{ids}")
+ public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] ids) {
+ return toAjax(iModDeviceEnableService.deleteWithValidByIds(Arrays.asList(ids), true));
+ }
+}
diff --git a/klp-pltcm/src/main/java/com/klp/pltcm/domain/ModDeviceEnable.java b/klp-pltcm/src/main/java/com/klp/pltcm/domain/ModDeviceEnable.java
new file mode 100644
index 000000000..3f3886793
--- /dev/null
+++ b/klp-pltcm/src/main/java/com/klp/pltcm/domain/ModDeviceEnable.java
@@ -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;
+}
diff --git a/klp-pltcm/src/main/java/com/klp/pltcm/domain/bo/ModDeviceEnableBo.java b/klp-pltcm/src/main/java/com/klp/pltcm/domain/bo/ModDeviceEnableBo.java
new file mode 100644
index 000000000..d3a949c45
--- /dev/null
+++ b/klp-pltcm/src/main/java/com/klp/pltcm/domain/bo/ModDeviceEnableBo.java
@@ -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;
+}
diff --git a/klp-pltcm/src/main/java/com/klp/pltcm/domain/vo/ModDeviceEnableVo.java b/klp-pltcm/src/main/java/com/klp/pltcm/domain/vo/ModDeviceEnableVo.java
new file mode 100644
index 000000000..8fdbbfaa9
--- /dev/null
+++ b/klp-pltcm/src/main/java/com/klp/pltcm/domain/vo/ModDeviceEnableVo.java
@@ -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;
+}
diff --git a/klp-pltcm/src/main/java/com/klp/pltcm/mapper/ModDeviceEnableMapper.java b/klp-pltcm/src/main/java/com/klp/pltcm/mapper/ModDeviceEnableMapper.java
new file mode 100644
index 000000000..935bc1d22
--- /dev/null
+++ b/klp-pltcm/src/main/java/com/klp/pltcm/mapper/ModDeviceEnableMapper.java
@@ -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 {
+}
diff --git a/klp-pltcm/src/main/java/com/klp/pltcm/service/IModDeviceEnableService.java b/klp-pltcm/src/main/java/com/klp/pltcm/service/IModDeviceEnableService.java
new file mode 100644
index 000000000..8f81c8637
--- /dev/null
+++ b/klp-pltcm/src/main/java/com/klp/pltcm/service/IModDeviceEnableService.java
@@ -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 queryPageList(ModDeviceEnableBo bo, PageQuery pageQuery);
+ List queryList(ModDeviceEnableBo bo);
+ Boolean insertByBo(ModDeviceEnableBo bo);
+ Boolean updateByBo(ModDeviceEnableBo bo);
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/klp-pltcm/src/main/java/com/klp/pltcm/service/impl/ModDeviceEnableServiceImpl.java b/klp-pltcm/src/main/java/com/klp/pltcm/service/impl/ModDeviceEnableServiceImpl.java
new file mode 100644
index 000000000..ea244b3fe
--- /dev/null
+++ b/klp-pltcm/src/main/java/com/klp/pltcm/service/impl/ModDeviceEnableServiceImpl.java
@@ -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 queryPageList(ModDeviceEnableBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ @Override
+ public List queryList(ModDeviceEnableBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(ModDeviceEnableBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper 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 ids, Boolean isValid) {
+ if (isValid) {
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/klp-pltcm/src/main/resources/mapper/pltcm/ModDeviceEnableMapper.xml b/klp-pltcm/src/main/resources/mapper/pltcm/ModDeviceEnableMapper.xml
new file mode 100644
index 000000000..277d76f8c
--- /dev/null
+++ b/klp-pltcm/src/main/resources/mapper/pltcm/ModDeviceEnableMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java b/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java
index 66c91baf2..ff1dbc629 100644
--- a/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java
+++ b/klp-system/src/main/java/com/klp/system/domain/vo/SysFileVo.java
@@ -86,4 +86,10 @@ public class SysFileVo extends BaseEntity {
@ExcelProperty(value = "浏览次数")
private Long viewCount;
+ /**
+ * 创建者昵称
+ */
+ @ExcelProperty(value = "创建者昵称")
+ private String createByName;
+
}
diff --git a/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java b/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java
index 09b1c2ccf..306c1bde6 100644
--- a/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java
+++ b/klp-system/src/main/java/com/klp/system/service/impl/SysFileServiceImpl.java
@@ -17,12 +17,15 @@ import com.klp.system.domain.SysFile;
import com.klp.system.domain.SysFileVisibleUser;
import com.klp.system.mapper.SysFileMapper;
import com.klp.system.mapper.SysFileVisibleUserMapper;
+import com.klp.system.mapper.SysUserMapper;
import com.klp.system.service.ISysFileService;
+import com.klp.common.core.domain.entity.SysUser;
import java.util.List;
import java.util.Map;
import java.util.Collection;
import java.util.stream.Collectors;
+import java.util.Optional;
/**
* 文件主信息Service业务层处理
@@ -36,6 +39,7 @@ public class SysFileServiceImpl implements ISysFileService {
private final SysFileMapper baseMapper;
private final SysFileVisibleUserMapper visibleUserMapper;
+ private final SysUserMapper userMapper;
/**
* 查询文件主信息
@@ -52,6 +56,7 @@ public class SysFileServiceImpl implements ISysFileService {
public TableDataInfo queryPageList(SysFileBo bo, PageQuery pageQuery) {
LambdaQueryWrapper lqw = buildQueryWrapper(bo);
Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ fillCreateByName(result.getRecords());
return TableDataInfo.build(result);
}
@@ -61,7 +66,9 @@ public class SysFileServiceImpl implements ISysFileService {
@Override
public List queryList(SysFileBo bo) {
LambdaQueryWrapper lqw = buildQueryWrapper(bo);
- return baseMapper.selectVoList(lqw);
+ List list = baseMapper.selectVoList(lqw);
+ fillCreateByName(list);
+ return list;
}
private LambdaQueryWrapper buildQueryWrapper(SysFileBo bo) {
@@ -122,6 +129,7 @@ public class SysFileServiceImpl implements ISysFileService {
LambdaQueryWrapper lqw = buildQueryWrapper(bo);
lqw.in(SysFile::getFileId, fileIds);
Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ fillCreateByName(result.getRecords());
return TableDataInfo.build(result);
}
@@ -135,6 +143,35 @@ public class SysFileServiceImpl implements ISysFileService {
.eq(SysFile::getFileId, fileId));
}
+ /**
+ * 根据 createBy(登录名)批量填充 createByName(用户昵称)
+ */
+ private void fillCreateByName(List list) {
+ if (list == null || list.isEmpty()) {
+ return;
+ }
+ // 收集所有不重复的 createBy
+ List userNames = list.stream()
+ .map(SysFileVo::getCreateBy)
+ .filter(StringUtils::isNotBlank)
+ .distinct()
+ .collect(Collectors.toList());
+ if (userNames.isEmpty()) {
+ return;
+ }
+ // 批量查询用户
+ List users = userMapper.selectUserList(
+ Wrappers.lambdaQuery().in(SysUser::getUserName, userNames));
+ Map nickNameMap = users.stream()
+ .collect(Collectors.toMap(SysUser::getUserName, SysUser::getNickName, (a, b) -> a));
+ // 赋值
+ for (SysFileVo vo : list) {
+ if (StringUtils.isNotBlank(vo.getCreateBy())) {
+ vo.setCreateByName(nickNameMap.get(vo.getCreateBy()));
+ }
+ }
+ }
+
/**
* 保存前的数据校验
*/
diff --git a/klp-ui/src/api/crm/order.js b/klp-ui/src/api/crm/order.js
index 6f151bae5..428fb2cc8 100644
--- a/klp-ui/src/api/crm/order.js
+++ b/klp-ui/src/api/crm/order.js
@@ -64,3 +64,13 @@ export function listTodayOrder(query) {
params: query
})
}
+
+// 导出正式订单主列表(业务精简字段)
+export function exportOrder(query) {
+ return request({
+ url: '/crm/order/exportDetail',
+ method: 'post',
+ data: query,
+ responseType: 'blob'
+ })
+}
diff --git a/klp-ui/src/api/crm/orderItem.js b/klp-ui/src/api/crm/orderItem.js
index 3ae03d026..d938634db 100644
--- a/klp-ui/src/api/crm/orderItem.js
+++ b/klp-ui/src/api/crm/orderItem.js
@@ -42,3 +42,13 @@ export function delOrderItem(itemId) {
method: 'delete'
})
}
+
+// 导出正式订单明细列表(业务精简字段)
+export function exportOrderItem(query) {
+ return request({
+ url: '/crm/orderItem/exportDetail',
+ method: 'post',
+ data: query,
+ responseType: 'blob'
+ })
+}
diff --git a/klp-ui/src/components/CoilSelector/index.vue b/klp-ui/src/components/CoilSelector/index.vue
index 6b9045388..7b5482e83 100644
--- a/klp-ui/src/components/CoilSelector/index.vue
+++ b/klp-ui/src/components/CoilSelector/index.vue
@@ -84,7 +84,10 @@
-
+
+
+
@@ -303,7 +306,7 @@ export default {
DragResizePanel,
OrderDetail
},
- dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status'],
+ dicts: ['coil_itemname', 'coil_material', 'coil_manufacturer', 'coil_quality_status', 'wip_pack_saleman'],
props: {
// 非触发器模式下,外部控制显隐(触发器模式下无效)
visible: {
diff --git a/klp-ui/src/components/KLPService/UserSelect/index.vue b/klp-ui/src/components/KLPService/UserSelect/index.vue
index 8a39408fa..633009e1c 100644
--- a/klp-ui/src/components/KLPService/UserSelect/index.vue
+++ b/klp-ui/src/components/KLPService/UserSelect/index.vue
@@ -1,26 +1,28 @@
-
-
+
-