diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearReimbursementController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearReimbursementController.java new file mode 100644 index 0000000..e6ee805 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearReimbursementController.java @@ -0,0 +1,91 @@ +package com.gear.oa.controller; + +import com.gear.common.annotation.Log; +import com.gear.common.annotation.RepeatSubmit; +import com.gear.common.core.controller.BaseController; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.domain.R; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; +import com.gear.oa.domain.bo.GearReimbursementBo; +import com.gear.oa.domain.vo.GearReimbursementVo; +import com.gear.oa.service.IGearReimbursementService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 报销 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/reimbursement") +public class GearReimbursementController extends BaseController { + + private final IGearReimbursementService iGearReimbursementService; + + /** + * 查询报销列表 + */ + @GetMapping("/list") + public TableDataInfo list(GearReimbursementBo bo, PageQuery pageQuery) { + return iGearReimbursementService.queryPageList(bo, pageQuery); + } + + /** + * 导出报销列表 + */ + @Log(title = "报销", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearReimbursementBo bo, HttpServletResponse response) { + List list = iGearReimbursementService.queryList(bo); + ExcelUtil.exportExcel(list, "报销", GearReimbursementVo.class, response); + } + + /** + * 获取报销详细信息 + */ + @GetMapping("/{reimbursementId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long reimbursementId) { + return R.ok(iGearReimbursementService.queryById(reimbursementId)); + } + + /** + * 新增报销 + */ + @Log(title = "报销", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody GearReimbursementBo bo) { + return toAjax(iGearReimbursementService.insertByBo(bo)); + } + + /** + * 修改报销 + */ + @Log(title = "报销", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody GearReimbursementBo bo) { + return toAjax(iGearReimbursementService.updateByBo(bo)); + } + + /** + * 删除报销 + */ + @Log(title = "报销", businessType = BusinessType.DELETE) + @DeleteMapping("/{reimbursementIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] reimbursementIds) { + return toAjax(iGearReimbursementService.deleteWithValidByIds(Arrays.asList(reimbursementIds), true)); + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearWageEntryDetailController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearWageEntryDetailController.java new file mode 100644 index 0000000..4f5208f --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearWageEntryDetailController.java @@ -0,0 +1,81 @@ +package com.gear.oa.controller; + +import com.gear.common.annotation.Log; +import com.gear.common.annotation.RepeatSubmit; +import com.gear.common.core.controller.BaseController; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.domain.R; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; +import com.gear.oa.domain.bo.GearWageEntryDetailBo; +import com.gear.oa.domain.vo.GearWageEntryDetailVo; +import com.gear.oa.service.IGearWageEntryDetailService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; +import java.util.Map; + +/** + * 工资录入明细 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/wageEntryDetail") +public class GearWageEntryDetailController extends BaseController { + + private final IGearWageEntryDetailService iGearWageEntryDetailService; + + @GetMapping("/list") + public TableDataInfo list(GearWageEntryDetailBo bo, PageQuery pageQuery) { + return iGearWageEntryDetailService.queryPageList(bo, pageQuery); + } + + @Log(title = "工资录入明细", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearWageEntryDetailBo bo, HttpServletResponse response) { + List list = iGearWageEntryDetailService.queryList(bo); + ExcelUtil.exportExcel(list, "工资录入明细", GearWageEntryDetailVo.class, response); + } + + @GetMapping("/{detailId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long detailId) { + return R.ok(iGearWageEntryDetailService.queryById(detailId)); + } + + @Log(title = "工资录入明细", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody GearWageEntryDetailBo bo) { + return toAjax(iGearWageEntryDetailService.insertByBo(bo)); + } + + @Log(title = "工资录入明细", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody GearWageEntryDetailBo bo) { + return toAjax(iGearWageEntryDetailService.updateByBo(bo)); + } + + @Log(title = "工资录入明细", businessType = BusinessType.DELETE) + @DeleteMapping("/{detailIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] detailIds) { + return toAjax(iGearWageEntryDetailService.deleteWithValidByIds(Arrays.asList(detailIds), true)); + } + + @PostMapping("/initDailyWorkers") + public R initDailyWorkers(@RequestBody Map payload) { + String entryDate = String.valueOf(payload.get("entryDate")); + Boolean forceReset = payload.get("forceReset") != null && Boolean.parseBoolean(String.valueOf(payload.get("forceReset"))); + return R.ok(iGearWageEntryDetailService.initDailyWorkers(entryDate, forceReset)); + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearWageMakeupLogController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearWageMakeupLogController.java new file mode 100644 index 0000000..5757eed --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearWageMakeupLogController.java @@ -0,0 +1,73 @@ +package com.gear.oa.controller; + +import com.gear.common.annotation.Log; +import com.gear.common.annotation.RepeatSubmit; +import com.gear.common.core.controller.BaseController; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.domain.R; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; +import com.gear.oa.domain.bo.GearWageMakeupLogBo; +import com.gear.oa.domain.vo.GearWageMakeupLogVo; +import com.gear.oa.service.IGearWageMakeupLogService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 工资补录日志 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/wageMakeupLog") +public class GearWageMakeupLogController extends BaseController { + + private final IGearWageMakeupLogService iGearWageMakeupLogService; + + @GetMapping("/list") + public TableDataInfo list(GearWageMakeupLogBo bo, PageQuery pageQuery) { + return iGearWageMakeupLogService.queryPageList(bo, pageQuery); + } + + @Log(title = "工资补录日志", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearWageMakeupLogBo bo, HttpServletResponse response) { + List list = iGearWageMakeupLogService.queryList(bo); + ExcelUtil.exportExcel(list, "工资补录日志", GearWageMakeupLogVo.class, response); + } + + @GetMapping("/{logId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long logId) { + return R.ok(iGearWageMakeupLogService.queryById(logId)); + } + + @Log(title = "工资补录日志", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody GearWageMakeupLogBo bo) { + return toAjax(iGearWageMakeupLogService.insertByBo(bo)); + } + + @Log(title = "工资补录日志", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody GearWageMakeupLogBo bo) { + return toAjax(iGearWageMakeupLogService.updateByBo(bo)); + } + + @Log(title = "工资补录日志", businessType = BusinessType.DELETE) + @DeleteMapping("/{logIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] logIds) { + return toAjax(iGearWageMakeupLogService.deleteWithValidByIds(Arrays.asList(logIds), true)); + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearWageRateConfigController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearWageRateConfigController.java new file mode 100644 index 0000000..10fe49d --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearWageRateConfigController.java @@ -0,0 +1,73 @@ +package com.gear.oa.controller; + +import com.gear.common.annotation.Log; +import com.gear.common.annotation.RepeatSubmit; +import com.gear.common.core.controller.BaseController; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.domain.R; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; +import com.gear.oa.domain.bo.GearWageRateConfigBo; +import com.gear.oa.domain.vo.GearWageRateConfigVo; +import com.gear.oa.service.IGearWageRateConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.util.Arrays; +import java.util.List; + +/** + * 工资费率配置 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/wageRateConfig") +public class GearWageRateConfigController extends BaseController { + + private final IGearWageRateConfigService iGearWageRateConfigService; + + @GetMapping("/list") + public TableDataInfo list(GearWageRateConfigBo bo, PageQuery pageQuery) { + return iGearWageRateConfigService.queryPageList(bo, pageQuery); + } + + @Log(title = "工资费率配置", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearWageRateConfigBo bo, HttpServletResponse response) { + List list = iGearWageRateConfigService.queryList(bo); + ExcelUtil.exportExcel(list, "工资费率配置", GearWageRateConfigVo.class, response); + } + + @GetMapping("/{rateId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long rateId) { + return R.ok(iGearWageRateConfigService.queryById(rateId)); + } + + @Log(title = "工资费率配置", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody GearWageRateConfigBo bo) { + return toAjax(iGearWageRateConfigService.insertByBo(bo)); + } + + @Log(title = "工资费率配置", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody GearWageRateConfigBo bo) { + return toAjax(iGearWageRateConfigService.updateByBo(bo)); + } + + @Log(title = "工资费率配置", businessType = BusinessType.DELETE) + @DeleteMapping("/{rateIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] rateIds) { + return toAjax(iGearWageRateConfigService.deleteWithValidByIds(Arrays.asList(rateIds), true)); + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/controller/GearWorkerController.java b/gear-oa/src/main/java/com/gear/oa/controller/GearWorkerController.java new file mode 100644 index 0000000..212424a --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/controller/GearWorkerController.java @@ -0,0 +1,96 @@ +package com.gear.oa.controller; + +import com.gear.common.annotation.Log; +import com.gear.common.annotation.RepeatSubmit; +import com.gear.common.core.controller.BaseController; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.domain.R; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import com.gear.common.enums.BusinessType; +import com.gear.common.utils.poi.ExcelUtil; +import com.gear.oa.domain.bo.GearWorkerBo; +import com.gear.oa.domain.bo.GearWorkerImportBo; +import com.gear.oa.domain.vo.GearWorkerVo; +import com.gear.oa.service.IGearWorkerService; +import lombok.RequiredArgsConstructor; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.servlet.http.HttpServletResponse; +import javax.validation.constraints.NotEmpty; +import javax.validation.constraints.NotNull; +import java.io.InputStream; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +/** + * 工人管理 + */ +@Validated +@RequiredArgsConstructor +@RestController +@RequestMapping("/oa/worker") +public class GearWorkerController extends BaseController { + + private final IGearWorkerService iGearWorkerService; + + @GetMapping("/list") + public TableDataInfo list(GearWorkerBo bo, PageQuery pageQuery) { + return iGearWorkerService.queryPageList(bo, pageQuery); + } + + @Log(title = "工人管理", businessType = BusinessType.EXPORT) + @PostMapping("/export") + public void export(GearWorkerBo bo, HttpServletResponse response) { + List list = iGearWorkerService.queryList(bo); + ExcelUtil.exportExcel(list, "工人管理", GearWorkerVo.class, response); + } + + @RequestMapping(value = "/importTemplate", method = {RequestMethod.GET, RequestMethod.POST}) + public void importTemplate(HttpServletResponse response) { + ExcelUtil.exportExcel(Collections.singletonList(new GearWorkerImportBo()), "工人导入模板", GearWorkerImportBo.class, response); + } + + @Log(title = "工人管理", businessType = BusinessType.IMPORT) + @PostMapping("/importData") + public R importData(@RequestPart("file") MultipartFile file, + @RequestParam(value = "updateSupport", required = false, defaultValue = "false") Boolean updateSupport) throws Exception { + if (file == null || file.isEmpty()) { + return R.fail("导入文件不能为空"); + } + try (InputStream is = file.getInputStream()) { + List list = ExcelUtil.importExcel(is, GearWorkerImportBo.class); + String msg = iGearWorkerService.importByExcel(list, updateSupport); + return R.ok(msg); + } + } + + @GetMapping("/{workerId}") + public R getInfo(@NotNull(message = "主键不能为空") @PathVariable Long workerId) { + return R.ok(iGearWorkerService.queryById(workerId)); + } + + @Log(title = "工人管理", businessType = BusinessType.INSERT) + @RepeatSubmit + @PostMapping + public R add(@Validated(AddGroup.class) @RequestBody GearWorkerBo bo) { + return toAjax(iGearWorkerService.insertByBo(bo)); + } + + @Log(title = "工人管理", businessType = BusinessType.UPDATE) + @RepeatSubmit + @PutMapping + public R edit(@Validated(EditGroup.class) @RequestBody GearWorkerBo bo) { + return toAjax(iGearWorkerService.updateByBo(bo)); + } + + @Log(title = "工人管理", businessType = BusinessType.DELETE) + @DeleteMapping("/{workerIds}") + public R remove(@NotEmpty(message = "主键不能为空") @PathVariable Long[] workerIds) { + return toAjax(iGearWorkerService.deleteWithValidByIds(Arrays.asList(workerIds), true)); + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearReimbursement.java b/gear-oa/src/main/java/com/gear/oa/domain/GearReimbursement.java new file mode 100644 index 0000000..7ee4efa --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearReimbursement.java @@ -0,0 +1,69 @@ +package com.gear.oa.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 报销对象 gear_reimbursement + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gear_reimbursement") +public class GearReimbursement extends BaseEntity { + + private static final long serialVersionUID = 1L; + + /** + * 报销ID + */ + @TableId(value = "reimbursement_id") + private Long reimbursementId; + + /** + * 申请人用户ID + */ + private Long applicantId; + + /** + * 申请人名称 + */ + private String applicantName; + + /** + * 附件(OSS ID串,逗号分隔) + */ + private String attachmentUrl; + + /** + * 上传时间 + */ + private Date uploadTime; + + /** + * 报销金额 + */ + private BigDecimal amount; + + /** + * 报销状态(0未报销 1已报销) + */ + private String reimburseStatus; + + /** + * 删除标志(0存在 2删除) + */ + @TableLogic + private String delFlag; + + /** + * 备注 + */ + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearWageEntryDetail.java b/gear-oa/src/main/java/com/gear/oa/domain/GearWageEntryDetail.java new file mode 100644 index 0000000..8a7f699 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearWageEntryDetail.java @@ -0,0 +1,79 @@ +package com.gear.oa.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 工资录入明细对象 gear_wage_entry_detail + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gear_wage_entry_detail") +public class GearWageEntryDetail extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "detail_id") + private Long detailId; + + private Date entryDate; + + private Long empId; + + private String empName; + + /** + * 计费类型(1小时工 2计件工 3天工) + */ + private String billingType; + + private Long rateId; + + private String workTypeName; + + private String itemName; + + private String processName; + + private String orderNo; + + /** + * 工作量(小时/件数/天数) + */ + private BigDecimal workload; + + private BigDecimal unitPrice; + + private BigDecimal baseAmount; + + private BigDecimal extraAmount; + + private String extraReason; + + private BigDecimal totalAmount; + + /** + * 是否补录(0否 1是) + */ + private String isMakeup; + + private Long sourceDetailId; + + private Long makeupResponsibleId; + + private String makeupResponsible; + + private String makeupReason; + + @TableLogic + private String delFlag; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearWageMakeupLog.java b/gear-oa/src/main/java/com/gear/oa/domain/GearWageMakeupLog.java new file mode 100644 index 0000000..3c103aa --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearWageMakeupLog.java @@ -0,0 +1,48 @@ +package com.gear.oa.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.util.Date; + +/** + * 工资补录日志对象 gear_wage_makeup_log + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gear_wage_makeup_log") +public class GearWageMakeupLog extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "log_id") + private Long logId; + + private Long detailId; + + private Long sourceDetailId; + + /** + * 操作类型(1新增补录 2修改补录 3撤销补录) + */ + private String operationType; + + private Date operationDate; + + private Long empId; + + private Long makeupResponsibleId; + + private String makeupResponsible; + + private String makeupReason; + + @TableLogic + private String delFlag; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearWageRateConfig.java b/gear-oa/src/main/java/com/gear/oa/domain/GearWageRateConfig.java new file mode 100644 index 0000000..3a2de26 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearWageRateConfig.java @@ -0,0 +1,59 @@ +package com.gear.oa.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; + +/** + * 工资费率配置对象 gear_wage_rate_config + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gear_wage_rate_config") +public class GearWageRateConfig extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "rate_id") + private Long rateId; + + private String rateCode; + + private String rateName; + + /** + * 计费类型(1小时工 2计件工 3天工) + */ + private String billingType; + + private String workTypeName; + + private String itemName; + + private String processName; + + /** + * 日工时制度(如8/9,仅天工) + */ + private BigDecimal workdayHours; + + /** + * 小时单价/件单价/日薪 + */ + private BigDecimal unitPrice; + + /** + * 状态(0启用 1停用) + */ + private String status; + + @TableLogic + private String delFlag; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/GearWorker.java b/gear-oa/src/main/java/com/gear/oa/domain/GearWorker.java new file mode 100644 index 0000000..88f0e31 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/GearWorker.java @@ -0,0 +1,45 @@ +package com.gear.oa.domain; + +import com.baomidou.mybatisplus.annotation.TableId; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.baomidou.mybatisplus.annotation.TableName; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 工人主数据对象 gear_worker + */ +@Data +@EqualsAndHashCode(callSuper = true) +@TableName("gear_worker") +public class GearWorker extends BaseEntity { + + private static final long serialVersionUID = 1L; + + @TableId(value = "worker_id") + private Long workerId; + + private String workerNo; + + private String workerName; + + private String phone; + + /** + * 默认计费类型(1小时工 2计件工 3天工) + */ + private String defaultBillingType; + + private String defaultWorkTypeName; + + /** + * 状态(0在职 1离职) + */ + private String status; + + @TableLogic + private String delFlag; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearReimbursementBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearReimbursementBo.java new file mode 100644 index 0000000..78e75c1 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearReimbursementBo.java @@ -0,0 +1,60 @@ +package com.gear.oa.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 报销业务对象 gear_reimbursement + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class GearReimbursementBo extends BaseEntity { + + /** + * 报销ID + */ + private Long reimbursementId; + + /** + * 申请人用户ID + */ + private Long applicantId; + + /** + * 申请人名称 + */ + private String applicantName; + + /** + * 附件(OSS ID串,逗号分隔) + */ + private String attachmentUrl; + + /** + * 上传时间 + */ + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date uploadTime; + + /** + * 报销金额 + */ + private BigDecimal amount; + + /** + * 报销状态(0未报销 1已报销) + */ + private String reimburseStatus; + + /** + * 备注 + */ + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageEntryDetailBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageEntryDetailBo.java new file mode 100644 index 0000000..2333454 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageEntryDetailBo.java @@ -0,0 +1,74 @@ +package com.gear.oa.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.gear.common.core.domain.BaseEntity; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; +import java.util.Date; + +/** + * 工资录入明细业务对象 gear_wage_entry_detail + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class GearWageEntryDetailBo extends BaseEntity { + + @NotNull(message = "明细ID不能为空", groups = {EditGroup.class}) + private Long detailId; + + @NotNull(message = "业务日期不能为空", groups = {AddGroup.class, EditGroup.class}) + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date entryDate; + + @NotNull(message = "员工ID不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long empId; + + private String empName; + + @NotBlank(message = "计费类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String billingType; + + @NotNull(message = "费率配置不能为空", groups = {AddGroup.class, EditGroup.class}) + private Long rateId; + + private String workTypeName; + + private String itemName; + + private String processName; + + private String orderNo; + + @NotNull(message = "工作量不能为空", groups = {AddGroup.class, EditGroup.class}) + private BigDecimal workload; + + private BigDecimal unitPrice; + + private BigDecimal baseAmount; + + private BigDecimal extraAmount; + + private String extraReason; + + private BigDecimal totalAmount; + + private String isMakeup; + + private Long sourceDetailId; + + private Long makeupResponsibleId; + + private String makeupResponsible; + + private String makeupReason; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageMakeupLogBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageMakeupLogBo.java new file mode 100644 index 0000000..0bae028 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageMakeupLogBo.java @@ -0,0 +1,39 @@ +package com.gear.oa.domain.bo; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.gear.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 工资补录日志业务对象 gear_wage_makeup_log + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class GearWageMakeupLogBo extends BaseEntity { + + private Long logId; + + private Long detailId; + + private Long sourceDetailId; + + private String operationType; + + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date operationDate; + + private Long empId; + + private Long makeupResponsibleId; + + private String makeupResponsible; + + private String makeupReason; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageRateConfigBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageRateConfigBo.java new file mode 100644 index 0000000..59f861b --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWageRateConfigBo.java @@ -0,0 +1,51 @@ +package com.gear.oa.domain.bo; + +import com.gear.common.core.domain.BaseEntity; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; +import java.math.BigDecimal; + +/** + * 工资费率配置业务对象 gear_wage_rate_config + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class GearWageRateConfigBo extends BaseEntity { + + @NotNull(message = "费率ID不能为空", groups = {EditGroup.class}) + private Long rateId; + + /** + * 费率编码(后端自动生成) + */ + private String rateCode; + + @NotBlank(message = "费率名称不能为空", groups = {AddGroup.class, EditGroup.class}) + private String rateName; + + /** + * 计费类型(1小时工 2计件工 3天工) + */ + @NotBlank(message = "计费类型不能为空", groups = {AddGroup.class, EditGroup.class}) + private String billingType; + + private String workTypeName; + + private String itemName; + + private String processName; + + private BigDecimal workdayHours; + + @NotNull(message = "单价不能为空", groups = {AddGroup.class, EditGroup.class}) + private BigDecimal unitPrice; + + private String status; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWorkerBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWorkerBo.java new file mode 100644 index 0000000..6ef1bdf --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWorkerBo.java @@ -0,0 +1,37 @@ +package com.gear.oa.domain.bo; + +import com.gear.common.core.domain.BaseEntity; +import com.gear.common.core.validate.AddGroup; +import com.gear.common.core.validate.EditGroup; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +/** + * 工人主数据业务对象 gear_worker + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class GearWorkerBo extends BaseEntity { + + @NotNull(message = "工人ID不能为空", groups = {EditGroup.class}) + private Long workerId; + + @NotBlank(message = "工号不能为空", groups = {AddGroup.class, EditGroup.class}) + private String workerNo; + + @NotBlank(message = "姓名不能为空", groups = {AddGroup.class, EditGroup.class}) + private String workerName; + + private String phone; + + private String defaultBillingType; + + private String defaultWorkTypeName; + + private String status; + + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWorkerImportBo.java b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWorkerImportBo.java new file mode 100644 index 0000000..0dd745e --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/bo/GearWorkerImportBo.java @@ -0,0 +1,32 @@ +package com.gear.oa.domain.bo; + +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 工人工资模板导入对象 + */ +@Data +public class GearWorkerImportBo { + + @ExcelProperty(value = "工号") + private String workerNo; + + @ExcelProperty(value = "姓名") + private String workerName; + + @ExcelProperty(value = "手机号") + private String phone; + + @ExcelProperty(value = "默认计费类型(1小时工/2计件工/3天工)") + private String defaultBillingType; + + @ExcelProperty(value = "默认工种") + private String defaultWorkTypeName; + + @ExcelProperty(value = "状态(0在职/1离职)") + private String status; + + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearReimbursementVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearReimbursementVo.java new file mode 100644 index 0000000..1647606 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearReimbursementVo.java @@ -0,0 +1,68 @@ +package com.gear.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 报销视图对象 gear_reimbursement + */ +@Data +@ExcelIgnoreUnannotated +public class GearReimbursementVo { + + /** + * 报销ID + */ + @ExcelProperty(value = "报销ID") + private Long reimbursementId; + + /** + * 申请人用户ID + */ + @ExcelProperty(value = "申请人ID") + private Long applicantId; + + /** + * 申请人名称 + */ + @ExcelProperty(value = "申请人") + private String applicantName; + + /** + * 附件(OSS ID串,逗号分隔) + */ + @ExcelProperty(value = "附件") + private String attachmentUrl; + + /** + * 上传时间 + */ + @ExcelProperty(value = "上传时间") + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") + private Date uploadTime; + + /** + * 报销金额 + */ + @ExcelProperty(value = "金额") + private BigDecimal amount; + + /** + * 报销状态(0未报销 1已报销) + */ + @ExcelProperty(value = "报销状态") + private String reimburseStatus; + + /** + * 备注 + */ + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageEntryDetailVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageEntryDetailVo.java new file mode 100644 index 0000000..774ea15 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageEntryDetailVo.java @@ -0,0 +1,80 @@ +package com.gear.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 工资录入明细视图对象 gear_wage_entry_detail + */ +@Data +@ExcelIgnoreUnannotated +public class GearWageEntryDetailVo { + + @ExcelProperty(value = "明细ID") + private Long detailId; + + @ExcelProperty(value = "业务日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date entryDate; + + @ExcelProperty(value = "员工ID") + private Long empId; + + @ExcelProperty(value = "员工姓名") + private String empName; + + @ExcelProperty(value = "计费类型") + private String billingType; + + @ExcelProperty(value = "费率配置ID") + private Long rateId; + + @ExcelProperty(value = "工种") + private String workTypeName; + + @ExcelProperty(value = "加工物品") + private String itemName; + + @ExcelProperty(value = "工序") + private String processName; + + @ExcelProperty(value = "订单号") + private String orderNo; + + @ExcelProperty(value = "工作量") + private BigDecimal workload; + + @ExcelProperty(value = "单价") + private BigDecimal unitPrice; + + @ExcelProperty(value = "基础金额") + private BigDecimal baseAmount; + + @ExcelProperty(value = "额外金额") + private BigDecimal extraAmount; + + @ExcelProperty(value = "额外原因") + private String extraReason; + + @ExcelProperty(value = "总金额") + private BigDecimal totalAmount; + + @ExcelProperty(value = "是否补录") + private String isMakeup; + + @ExcelProperty(value = "补录责任人") + private String makeupResponsible; + + @ExcelProperty(value = "补录原因") + private String makeupReason; + + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageMakeupLogVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageMakeupLogVo.java new file mode 100644 index 0000000..eca6c9a --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageMakeupLogVo.java @@ -0,0 +1,49 @@ +package com.gear.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.util.Date; + +/** + * 工资补录日志视图对象 gear_wage_makeup_log + */ +@Data +@ExcelIgnoreUnannotated +public class GearWageMakeupLogVo { + + @ExcelProperty(value = "日志ID") + private Long logId; + + @ExcelProperty(value = "补录后明细ID") + private Long detailId; + + @ExcelProperty(value = "补录前明细ID") + private Long sourceDetailId; + + @ExcelProperty(value = "操作类型") + private String operationType; + + @ExcelProperty(value = "补录目标日期") + @DateTimeFormat(pattern = "yyyy-MM-dd") + @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8") + private Date operationDate; + + @ExcelProperty(value = "员工ID") + private Long empId; + + @ExcelProperty(value = "责任人ID") + private Long makeupResponsibleId; + + @ExcelProperty(value = "责任人") + private String makeupResponsible; + + @ExcelProperty(value = "补录原因") + private String makeupReason; + + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageRateConfigVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageRateConfigVo.java new file mode 100644 index 0000000..38759f4 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWageRateConfigVo.java @@ -0,0 +1,48 @@ +package com.gear.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +import java.math.BigDecimal; + +/** + * 工资费率配置视图对象 gear_wage_rate_config + */ +@Data +@ExcelIgnoreUnannotated +public class GearWageRateConfigVo { + + @ExcelProperty(value = "费率ID") + private Long rateId; + + @ExcelProperty(value = "费率编码") + private String rateCode; + + @ExcelProperty(value = "费率名称") + private String rateName; + + @ExcelProperty(value = "计费类型") + private String billingType; + + @ExcelProperty(value = "工种") + private String workTypeName; + + @ExcelProperty(value = "加工物品") + private String itemName; + + @ExcelProperty(value = "工序") + private String processName; + + @ExcelProperty(value = "日工时制度") + private BigDecimal workdayHours; + + @ExcelProperty(value = "单价") + private BigDecimal unitPrice; + + @ExcelProperty(value = "状态") + private String status; + + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWorkerVo.java b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWorkerVo.java new file mode 100644 index 0000000..89f8ceb --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/domain/vo/GearWorkerVo.java @@ -0,0 +1,37 @@ +package com.gear.oa.domain.vo; + +import com.alibaba.excel.annotation.ExcelIgnoreUnannotated; +import com.alibaba.excel.annotation.ExcelProperty; +import lombok.Data; + +/** + * 工人主数据视图对象 gear_worker + */ +@Data +@ExcelIgnoreUnannotated +public class GearWorkerVo { + + @ExcelProperty(value = "工人ID") + private Long workerId; + + @ExcelProperty(value = "工号") + private String workerNo; + + @ExcelProperty(value = "姓名") + private String workerName; + + @ExcelProperty(value = "手机号") + private String phone; + + @ExcelProperty(value = "默认计费类型") + private String defaultBillingType; + + @ExcelProperty(value = "默认工种") + private String defaultWorkTypeName; + + @ExcelProperty(value = "状态") + private String status; + + @ExcelProperty(value = "备注") + private String remark; +} diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearReimbursementMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearReimbursementMapper.java new file mode 100644 index 0000000..8191436 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearReimbursementMapper.java @@ -0,0 +1,11 @@ +package com.gear.oa.mapper; + +import com.gear.common.core.mapper.BaseMapperPlus; +import com.gear.oa.domain.GearReimbursement; +import com.gear.oa.domain.vo.GearReimbursementVo; + +/** + * 报销Mapper接口 + */ +public interface GearReimbursementMapper extends BaseMapperPlus { +} diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearWageEntryDetailMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearWageEntryDetailMapper.java new file mode 100644 index 0000000..1f712dd --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearWageEntryDetailMapper.java @@ -0,0 +1,17 @@ +package com.gear.oa.mapper; + +import com.gear.common.core.mapper.BaseMapperPlus; +import com.gear.oa.domain.GearWageEntryDetail; +import com.gear.oa.domain.vo.GearWageEntryDetailVo; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Param; + +/** + * 工资录入明细Mapper接口 + */ +public interface GearWageEntryDetailMapper extends BaseMapperPlus { + + @Delete("delete from gear_wage_entry_detail where entry_date = #{entryDate}") + int deletePhysicalByEntryDate(@Param("entryDate") java.sql.Date entryDate); +} + diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearWageMakeupLogMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearWageMakeupLogMapper.java new file mode 100644 index 0000000..40dfe05 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearWageMakeupLogMapper.java @@ -0,0 +1,11 @@ +package com.gear.oa.mapper; + +import com.gear.common.core.mapper.BaseMapperPlus; +import com.gear.oa.domain.GearWageMakeupLog; +import com.gear.oa.domain.vo.GearWageMakeupLogVo; + +/** + * 工资补录日志Mapper接口 + */ +public interface GearWageMakeupLogMapper extends BaseMapperPlus { +} diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearWageRateConfigMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearWageRateConfigMapper.java new file mode 100644 index 0000000..a2d7e7c --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearWageRateConfigMapper.java @@ -0,0 +1,11 @@ +package com.gear.oa.mapper; + +import com.gear.common.core.mapper.BaseMapperPlus; +import com.gear.oa.domain.GearWageRateConfig; +import com.gear.oa.domain.vo.GearWageRateConfigVo; + +/** + * 工资费率配置Mapper接口 + */ +public interface GearWageRateConfigMapper extends BaseMapperPlus { +} diff --git a/gear-oa/src/main/java/com/gear/oa/mapper/GearWorkerMapper.java b/gear-oa/src/main/java/com/gear/oa/mapper/GearWorkerMapper.java new file mode 100644 index 0000000..01b4a50 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/mapper/GearWorkerMapper.java @@ -0,0 +1,11 @@ +package com.gear.oa.mapper; + +import com.gear.common.core.mapper.BaseMapperPlus; +import com.gear.oa.domain.GearWorker; +import com.gear.oa.domain.vo.GearWorkerVo; + +/** + * 工人主数据Mapper接口 + */ +public interface GearWorkerMapper extends BaseMapperPlus { +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearReimbursementService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearReimbursementService.java new file mode 100644 index 0000000..e41ed31 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearReimbursementService.java @@ -0,0 +1,45 @@ +package com.gear.oa.service; + +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.oa.domain.bo.GearReimbursementBo; +import com.gear.oa.domain.vo.GearReimbursementVo; + +import java.util.Collection; +import java.util.List; + +/** + * 报销Service接口 + */ +public interface IGearReimbursementService { + + /** + * 查询报销 + */ + GearReimbursementVo queryById(Long reimbursementId); + + /** + * 查询报销列表 + */ + TableDataInfo queryPageList(GearReimbursementBo bo, PageQuery pageQuery); + + /** + * 查询报销列表 + */ + List queryList(GearReimbursementBo bo); + + /** + * 新增报销 + */ + Boolean insertByBo(GearReimbursementBo bo); + + /** + * 修改报销 + */ + Boolean updateByBo(GearReimbursementBo bo); + + /** + * 校验并批量删除报销 + */ + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearWageEntryDetailService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearWageEntryDetailService.java new file mode 100644 index 0000000..2e78c79 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearWageEntryDetailService.java @@ -0,0 +1,29 @@ +package com.gear.oa.service; + +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.oa.domain.bo.GearWageEntryDetailBo; +import com.gear.oa.domain.vo.GearWageEntryDetailVo; + +import java.util.Collection; +import java.util.List; + +/** + * 工资录入明细Service接口 + */ +public interface IGearWageEntryDetailService { + + GearWageEntryDetailVo queryById(Long detailId); + + TableDataInfo queryPageList(GearWageEntryDetailBo bo, PageQuery pageQuery); + + List queryList(GearWageEntryDetailBo bo); + + Boolean insertByBo(GearWageEntryDetailBo bo); + + Boolean updateByBo(GearWageEntryDetailBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Integer initDailyWorkers(String entryDate, Boolean forceReset); +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearWageMakeupLogService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearWageMakeupLogService.java new file mode 100644 index 0000000..6165535 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearWageMakeupLogService.java @@ -0,0 +1,30 @@ +package com.gear.oa.service; + +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.oa.domain.bo.GearWageEntryDetailBo; +import com.gear.oa.domain.bo.GearWageMakeupLogBo; +import com.gear.oa.domain.vo.GearWageMakeupLogVo; + +import java.util.Collection; +import java.util.List; + +/** + * 工资补录日志Service接口 + */ +public interface IGearWageMakeupLogService { + + GearWageMakeupLogVo queryById(Long logId); + + TableDataInfo queryPageList(GearWageMakeupLogBo bo, PageQuery pageQuery); + + List queryList(GearWageMakeupLogBo bo); + + Boolean insertByBo(GearWageMakeupLogBo bo); + + Boolean updateByBo(GearWageMakeupLogBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + Boolean insertMakeupLog(Long detailId, Long sourceDetailId, String operationType, GearWageEntryDetailBo detailBo); +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearWageRateConfigService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearWageRateConfigService.java new file mode 100644 index 0000000..001a966 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearWageRateConfigService.java @@ -0,0 +1,27 @@ +package com.gear.oa.service; + +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.oa.domain.bo.GearWageRateConfigBo; +import com.gear.oa.domain.vo.GearWageRateConfigVo; + +import java.util.Collection; +import java.util.List; + +/** + * 工资费率配置Service接口 + */ +public interface IGearWageRateConfigService { + + GearWageRateConfigVo queryById(Long rateId); + + TableDataInfo queryPageList(GearWageRateConfigBo bo, PageQuery pageQuery); + + List queryList(GearWageRateConfigBo bo); + + Boolean insertByBo(GearWageRateConfigBo bo); + + Boolean updateByBo(GearWageRateConfigBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/IGearWorkerService.java b/gear-oa/src/main/java/com/gear/oa/service/IGearWorkerService.java new file mode 100644 index 0000000..aaed10c --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/IGearWorkerService.java @@ -0,0 +1,30 @@ +package com.gear.oa.service; + +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.oa.domain.bo.GearWorkerBo; +import com.gear.oa.domain.bo.GearWorkerImportBo; +import com.gear.oa.domain.vo.GearWorkerVo; + +import java.util.Collection; +import java.util.List; + +/** + * 工人主数据Service接口 + */ +public interface IGearWorkerService { + + GearWorkerVo queryById(Long workerId); + + TableDataInfo queryPageList(GearWorkerBo bo, PageQuery pageQuery); + + List queryList(GearWorkerBo bo); + + Boolean insertByBo(GearWorkerBo bo); + + Boolean updateByBo(GearWorkerBo bo); + + Boolean deleteWithValidByIds(Collection ids, Boolean isValid); + + String importByExcel(List list, Boolean updateSupport); +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearReimbursementServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearReimbursementServiceImpl.java new file mode 100644 index 0000000..5b1f823 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearReimbursementServiceImpl.java @@ -0,0 +1,98 @@ +package com.gear.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.helper.LoginHelper; +import com.gear.common.utils.StringUtils; +import com.gear.oa.domain.GearReimbursement; +import com.gear.oa.domain.bo.GearReimbursementBo; +import com.gear.oa.domain.vo.GearReimbursementVo; +import com.gear.oa.mapper.GearReimbursementMapper; +import com.gear.oa.service.IGearReimbursementService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 报销Service业务层处理 + */ +@RequiredArgsConstructor +@Service +public class GearReimbursementServiceImpl implements IGearReimbursementService { + + private final GearReimbursementMapper baseMapper; + + @Override + public GearReimbursementVo queryById(Long reimbursementId) { + return baseMapper.selectVoById(reimbursementId); + } + + @Override + public TableDataInfo queryPageList(GearReimbursementBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(GearReimbursementBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(GearReimbursementBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getReimbursementId() != null, GearReimbursement::getReimbursementId, bo.getReimbursementId()); + lqw.eq(bo.getApplicantId() != null, GearReimbursement::getApplicantId, bo.getApplicantId()); + lqw.like(StringUtils.isNotBlank(bo.getApplicantName()), GearReimbursement::getApplicantName, bo.getApplicantName()); + lqw.eq(StringUtils.isNotBlank(bo.getReimburseStatus()), GearReimbursement::getReimburseStatus, bo.getReimburseStatus()); + lqw.eq(bo.getAmount() != null, GearReimbursement::getAmount, bo.getAmount()); + lqw.orderByDesc(GearReimbursement::getCreateTime); + return lqw; + } + + @Override + public Boolean insertByBo(GearReimbursementBo bo) { + GearReimbursement add = BeanUtil.toBean(bo, GearReimbursement.class); + + // 新增时自动回填当前登录人为申请人 + if (LoginHelper.getUserId() != null) { + add.setApplicantId(LoginHelper.getUserId()); + add.setApplicantName(LoginHelper.getNickName()); + } + // 新增时状态固定为未报销 + add.setReimburseStatus("0"); + + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setReimbursementId(add.getReimbursementId()); + } + return flag; + } + + @Override + public Boolean updateByBo(GearReimbursementBo bo) { + GearReimbursement update = BeanUtil.toBean(bo, GearReimbursement.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(GearReimbursement entity) { + // TODO 可扩展校验逻辑 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + if (isValid) { + // TODO 可扩展业务校验逻辑 + } + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageEntryDetailServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageEntryDetailServiceImpl.java new file mode 100644 index 0000000..511c584 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageEntryDetailServiceImpl.java @@ -0,0 +1,225 @@ +package com.gear.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.helper.LoginHelper; +import com.gear.common.utils.StringUtils; +import com.gear.oa.domain.GearWageEntryDetail; +import com.gear.oa.domain.GearWageRateConfig; +import com.gear.oa.domain.GearWorker; +import com.gear.oa.domain.bo.GearWageEntryDetailBo; +import com.gear.oa.domain.vo.GearWageEntryDetailVo; +import com.gear.oa.mapper.GearWageEntryDetailMapper; +import com.gear.oa.mapper.GearWageRateConfigMapper; +import com.gear.oa.mapper.GearWorkerMapper; +import com.gear.oa.service.IGearWageEntryDetailService; +import com.gear.oa.service.IGearWageMakeupLogService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.math.BigDecimal; +import java.util.Collection; +import java.util.List; + +/** + * 工资录入明细Service业务层处理 + */ +@RequiredArgsConstructor +@Service +public class GearWageEntryDetailServiceImpl implements IGearWageEntryDetailService { + + private final GearWageEntryDetailMapper baseMapper; + private final IGearWageMakeupLogService iGearWageMakeupLogService; + private final GearWorkerMapper gearWorkerMapper; + private final GearWageRateConfigMapper gearWageRateConfigMapper; + + @Override + public GearWageEntryDetailVo queryById(Long detailId) { + return baseMapper.selectVoById(detailId); + } + + @Override + public TableDataInfo queryPageList(GearWageEntryDetailBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(GearWageEntryDetailBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(GearWageEntryDetailBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getDetailId() != null, GearWageEntryDetail::getDetailId, bo.getDetailId()); + lqw.eq(bo.getEntryDate() != null, GearWageEntryDetail::getEntryDate, bo.getEntryDate()); + lqw.eq(bo.getEmpId() != null, GearWageEntryDetail::getEmpId, bo.getEmpId()); + lqw.like(StringUtils.isNotBlank(bo.getEmpName()), GearWageEntryDetail::getEmpName, bo.getEmpName()); + lqw.eq(StringUtils.isNotBlank(bo.getBillingType()), GearWageEntryDetail::getBillingType, bo.getBillingType()); + lqw.eq(bo.getRateId() != null, GearWageEntryDetail::getRateId, bo.getRateId()); + lqw.eq(StringUtils.isNotBlank(bo.getIsMakeup()), GearWageEntryDetail::getIsMakeup, bo.getIsMakeup()); + lqw.like(StringUtils.isNotBlank(bo.getOrderNo()), GearWageEntryDetail::getOrderNo, bo.getOrderNo()); + lqw.orderByDesc(GearWageEntryDetail::getEntryDate) + .orderByDesc(GearWageEntryDetail::getCreateTime); + return lqw; + } + + @Override + public Boolean insertByBo(GearWageEntryDetailBo bo) { + GearWageEntryDetail add = BeanUtil.toBean(bo, GearWageEntryDetail.class); + fillAmountFields(add); + fillMakeupFields(add); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setDetailId(add.getDetailId()); + if ("1".equals(add.getIsMakeup())) { + iGearWageMakeupLogService.insertMakeupLog(add.getDetailId(), add.getSourceDetailId(), "1", bo); + } + } + return flag; + } + + @Override + public Boolean updateByBo(GearWageEntryDetailBo bo) { + GearWageEntryDetail old = baseMapper.selectById(bo.getDetailId()); + GearWageEntryDetail update = BeanUtil.toBean(bo, GearWageEntryDetail.class); + fillAmountFields(update); + fillMakeupFields(update); + validEntityBeforeSave(update); + boolean flag = baseMapper.updateById(update) > 0; + if (flag && "1".equals(update.getIsMakeup())) { + iGearWageMakeupLogService.insertMakeupLog(update.getDetailId(), old == null ? null : old.getDetailId(), "2", bo); + } + return flag; + } + + private void fillAmountFields(GearWageEntryDetail entity) { + BigDecimal workload = entity.getWorkload() == null ? BigDecimal.ZERO : entity.getWorkload(); + BigDecimal extraAmount = entity.getExtraAmount() == null ? BigDecimal.ZERO : entity.getExtraAmount(); + + // 小时工/天工默认按1个计量单位计算基础金额(1小时或1天) + if (("1".equals(entity.getBillingType()) || "3".equals(entity.getBillingType())) && workload.compareTo(BigDecimal.ZERO) <= 0) { + workload = BigDecimal.ONE; + entity.setWorkload(workload); + } + + // 小时工/天工优先使用费率配置中的单价;计件工允许前端录入单价 + if ("1".equals(entity.getBillingType()) || "3".equals(entity.getBillingType())) { + if (entity.getRateId() != null && entity.getRateId() > 0) { + GearWageRateConfig config = gearWageRateConfigMapper.selectById(entity.getRateId()); + if (config != null && config.getUnitPrice() != null) { + entity.setUnitPrice(config.getUnitPrice()); + } + if (StringUtils.isBlank(entity.getWorkTypeName()) && config != null) { + entity.setWorkTypeName(config.getRateName()); + } + } + } + + BigDecimal unitPrice = entity.getUnitPrice() == null ? BigDecimal.ZERO : entity.getUnitPrice(); + BigDecimal baseAmount = workload.multiply(unitPrice); + entity.setBaseAmount(baseAmount); + entity.setExtraAmount(extraAmount); + entity.setTotalAmount(baseAmount.add(extraAmount)); + } + + private void fillMakeupFields(GearWageEntryDetail entity) { + if (!"1".equals(entity.getIsMakeup())) { + entity.setIsMakeup("0"); + entity.setSourceDetailId(null); + entity.setMakeupResponsibleId(null); + entity.setMakeupResponsible(null); + entity.setMakeupReason(null); + return; + } + if (entity.getMakeupResponsibleId() == null) { + entity.setMakeupResponsibleId(LoginHelper.getUserId()); + } + if (StringUtils.isBlank(entity.getMakeupResponsible())) { + entity.setMakeupResponsible(LoginHelper.getNickName()); + } + } + + private void validEntityBeforeSave(GearWageEntryDetail entity) { + // 可扩展:按 rate_id 自动回填单价,或校验唯一索引冲突前置提示 + if (entity.getUnitPrice() == null) { + entity.setUnitPrice(BigDecimal.ZERO); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Integer initDailyWorkers(String entryDate, Boolean forceReset) { + java.sql.Date date = java.sql.Date.valueOf(entryDate); + + LambdaQueryWrapper dayWrapper = Wrappers.lambdaQuery() + .eq(GearWageEntryDetail::getEntryDate, date); + + Long exists = baseMapper.selectCount(dayWrapper); + if (exists != null && exists > 0) { + if (Boolean.TRUE.equals(forceReset)) { + baseMapper.deletePhysicalByEntryDate(date); + } else { + return 0; + } + } + + List workers = gearWorkerMapper.selectList(Wrappers.lambdaQuery() + .eq(GearWorker::getStatus, "0") + .orderByAsc(GearWorker::getWorkerNo)); + + int count = 0; + for (GearWorker worker : workers) { + String billingType = StringUtils.isBlank(worker.getDefaultBillingType()) ? "1" : worker.getDefaultBillingType(); + + GearWageRateConfig rateConfig = gearWageRateConfigMapper.selectOne(Wrappers.lambdaQuery() + .eq(GearWageRateConfig::getBillingType, billingType) + .eq(StringUtils.isNotBlank(worker.getDefaultWorkTypeName()), GearWageRateConfig::getRateName, worker.getDefaultWorkTypeName()) + .eq(GearWageRateConfig::getStatus, "0") + .last("limit 1")); + + Long rateId = rateConfig == null ? 0L : rateConfig.getRateId(); + String orderNo = ""; + + Long existsSame = baseMapper.selectCount(Wrappers.lambdaQuery() + .eq(GearWageEntryDetail::getEntryDate, date) + .eq(GearWageEntryDetail::getEmpId, worker.getWorkerId()) + .eq(GearWageEntryDetail::getBillingType, billingType) + .eq(GearWageEntryDetail::getRateId, rateId) + .eq(GearWageEntryDetail::getOrderNo, orderNo)); + if (existsSame != null && existsSame > 0) { + continue; + } + + GearWageEntryDetail detail = new GearWageEntryDetail(); + detail.setEntryDate(date); + detail.setEmpId(worker.getWorkerId()); + detail.setEmpName(worker.getWorkerName()); + detail.setBillingType(billingType); + detail.setWorkTypeName(StringUtils.isNotBlank(worker.getDefaultWorkTypeName()) ? worker.getDefaultWorkTypeName() : (rateConfig == null ? null : rateConfig.getRateName())); + detail.setRateId(rateId); + detail.setWorkload(BigDecimal.ZERO); + detail.setUnitPrice(rateConfig == null || rateConfig.getUnitPrice() == null ? BigDecimal.ZERO : rateConfig.getUnitPrice()); + detail.setBaseAmount(BigDecimal.ZERO); + detail.setExtraAmount(BigDecimal.ZERO); + detail.setTotalAmount(BigDecimal.ZERO); + detail.setIsMakeup("0"); + detail.setOrderNo(orderNo); + detail.setRemark("当日名单初始化"); + baseMapper.insert(detail); + count++; + } + return count; + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageMakeupLogServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageMakeupLogServiceImpl.java new file mode 100644 index 0000000..fb312e1 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageMakeupLogServiceImpl.java @@ -0,0 +1,94 @@ +package com.gear.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.helper.LoginHelper; +import com.gear.common.utils.StringUtils; +import com.gear.oa.domain.GearWageMakeupLog; +import com.gear.oa.domain.bo.GearWageEntryDetailBo; +import com.gear.oa.domain.bo.GearWageMakeupLogBo; +import com.gear.oa.domain.vo.GearWageMakeupLogVo; +import com.gear.oa.mapper.GearWageMakeupLogMapper; +import com.gear.oa.service.IGearWageMakeupLogService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 工资补录日志Service业务层处理 + */ +@RequiredArgsConstructor +@Service +public class GearWageMakeupLogServiceImpl implements IGearWageMakeupLogService { + + private final GearWageMakeupLogMapper baseMapper; + + @Override + public GearWageMakeupLogVo queryById(Long logId) { + return baseMapper.selectVoById(logId); + } + + @Override + public TableDataInfo queryPageList(GearWageMakeupLogBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(GearWageMakeupLogBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(GearWageMakeupLogBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getLogId() != null, GearWageMakeupLog::getLogId, bo.getLogId()); + lqw.eq(bo.getDetailId() != null, GearWageMakeupLog::getDetailId, bo.getDetailId()); + lqw.eq(bo.getEmpId() != null, GearWageMakeupLog::getEmpId, bo.getEmpId()); + lqw.eq(bo.getOperationDate() != null, GearWageMakeupLog::getOperationDate, bo.getOperationDate()); + lqw.eq(StringUtils.isNotBlank(bo.getOperationType()), GearWageMakeupLog::getOperationType, bo.getOperationType()); + lqw.eq(bo.getMakeupResponsibleId() != null, GearWageMakeupLog::getMakeupResponsibleId, bo.getMakeupResponsibleId()); + lqw.like(StringUtils.isNotBlank(bo.getMakeupResponsible()), GearWageMakeupLog::getMakeupResponsible, bo.getMakeupResponsible()); + lqw.orderByDesc(GearWageMakeupLog::getCreateTime); + return lqw; + } + + @Override + public Boolean insertByBo(GearWageMakeupLogBo bo) { + GearWageMakeupLog add = BeanUtil.toBean(bo, GearWageMakeupLog.class); + return baseMapper.insert(add) > 0; + } + + @Override + public Boolean updateByBo(GearWageMakeupLogBo bo) { + GearWageMakeupLog update = BeanUtil.toBean(bo, GearWageMakeupLog.class); + return baseMapper.updateById(update) > 0; + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public Boolean insertMakeupLog(Long detailId, Long sourceDetailId, String operationType, GearWageEntryDetailBo detailBo) { + GearWageMakeupLog add = new GearWageMakeupLog(); + add.setDetailId(detailId); + add.setSourceDetailId(sourceDetailId); + add.setOperationType(operationType); + add.setOperationDate(detailBo.getEntryDate()); + add.setEmpId(detailBo.getEmpId()); + add.setMakeupResponsibleId(detailBo.getMakeupResponsibleId() != null ? detailBo.getMakeupResponsibleId() : LoginHelper.getUserId()); + add.setMakeupResponsible(StringUtils.isNotBlank(detailBo.getMakeupResponsible()) ? detailBo.getMakeupResponsible() : LoginHelper.getNickName()); + add.setMakeupReason(detailBo.getMakeupReason()); + add.setRemark(detailBo.getRemark()); + return baseMapper.insert(add) > 0; + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageRateConfigServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageRateConfigServiceImpl.java new file mode 100644 index 0000000..669b89d --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWageRateConfigServiceImpl.java @@ -0,0 +1,91 @@ +package com.gear.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.utils.StringUtils; +import com.gear.oa.domain.GearWageRateConfig; +import com.gear.oa.domain.bo.GearWageRateConfigBo; +import com.gear.oa.domain.vo.GearWageRateConfigVo; +import com.gear.oa.mapper.GearWageRateConfigMapper; +import com.gear.oa.service.IGearWageRateConfigService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 工资费率配置Service业务层处理 + */ +@RequiredArgsConstructor +@Service +public class GearWageRateConfigServiceImpl implements IGearWageRateConfigService { + + private final GearWageRateConfigMapper baseMapper; + + @Override + public GearWageRateConfigVo queryById(Long rateId) { + return baseMapper.selectVoById(rateId); + } + + @Override + public TableDataInfo queryPageList(GearWageRateConfigBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(GearWageRateConfigBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(GearWageRateConfigBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getRateId() != null, GearWageRateConfig::getRateId, bo.getRateId()); + lqw.eq(StringUtils.isNotBlank(bo.getRateCode()), GearWageRateConfig::getRateCode, bo.getRateCode()); + lqw.like(StringUtils.isNotBlank(bo.getRateName()), GearWageRateConfig::getRateName, bo.getRateName()); + lqw.eq(StringUtils.isNotBlank(bo.getBillingType()), GearWageRateConfig::getBillingType, bo.getBillingType()); + lqw.like(StringUtils.isNotBlank(bo.getWorkTypeName()), GearWageRateConfig::getWorkTypeName, bo.getWorkTypeName()); + lqw.like(StringUtils.isNotBlank(bo.getItemName()), GearWageRateConfig::getItemName, bo.getItemName()); + lqw.like(StringUtils.isNotBlank(bo.getProcessName()), GearWageRateConfig::getProcessName, bo.getProcessName()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), GearWageRateConfig::getStatus, bo.getStatus()); + lqw.orderByDesc(GearWageRateConfig::getCreateTime); + return lqw; + } + + @Override + public Boolean insertByBo(GearWageRateConfigBo bo) { + GearWageRateConfig add = BeanUtil.toBean(bo, GearWageRateConfig.class); + // 前端不传rateCode,后端自动生成 + add.setRateCode("RATE_" + IdUtil.getSnowflakeNextIdStr()); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setRateId(add.getRateId()); + } + return flag; + } + + @Override + public Boolean updateByBo(GearWageRateConfigBo bo) { + GearWageRateConfig update = BeanUtil.toBean(bo, GearWageRateConfig.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(GearWageRateConfig entity) { + // 可扩展:按计费类型校验必填字段 + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } +} diff --git a/gear-oa/src/main/java/com/gear/oa/service/impl/GearWorkerServiceImpl.java b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWorkerServiceImpl.java new file mode 100644 index 0000000..b72e8b1 --- /dev/null +++ b/gear-oa/src/main/java/com/gear/oa/service/impl/GearWorkerServiceImpl.java @@ -0,0 +1,127 @@ +package com.gear.oa.service.impl; + +import cn.hutool.core.bean.BeanUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.gear.common.core.domain.PageQuery; +import com.gear.common.core.page.TableDataInfo; +import com.gear.common.utils.StringUtils; +import com.gear.oa.domain.GearWorker; +import com.gear.oa.domain.bo.GearWorkerBo; +import com.gear.oa.domain.bo.GearWorkerImportBo; +import com.gear.oa.domain.vo.GearWorkerVo; +import com.gear.oa.mapper.GearWorkerMapper; +import com.gear.oa.service.IGearWorkerService; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.List; + +/** + * 工人主数据Service业务层处理 + */ +@RequiredArgsConstructor +@Service +public class GearWorkerServiceImpl implements IGearWorkerService { + + private final GearWorkerMapper baseMapper; + + @Override + public GearWorkerVo queryById(Long workerId) { + return baseMapper.selectVoById(workerId); + } + + @Override + public TableDataInfo queryPageList(GearWorkerBo bo, PageQuery pageQuery) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + Page result = baseMapper.selectVoPage(pageQuery.build(), lqw); + return TableDataInfo.build(result); + } + + @Override + public List queryList(GearWorkerBo bo) { + LambdaQueryWrapper lqw = buildQueryWrapper(bo); + return baseMapper.selectVoList(lqw); + } + + private LambdaQueryWrapper buildQueryWrapper(GearWorkerBo bo) { + LambdaQueryWrapper lqw = Wrappers.lambdaQuery(); + lqw.eq(bo.getWorkerId() != null, GearWorker::getWorkerId, bo.getWorkerId()); + lqw.eq(StringUtils.isNotBlank(bo.getWorkerNo()), GearWorker::getWorkerNo, bo.getWorkerNo()); + lqw.like(StringUtils.isNotBlank(bo.getWorkerName()), GearWorker::getWorkerName, bo.getWorkerName()); + lqw.eq(StringUtils.isNotBlank(bo.getPhone()), GearWorker::getPhone, bo.getPhone()); + lqw.eq(StringUtils.isNotBlank(bo.getStatus()), GearWorker::getStatus, bo.getStatus()); + lqw.orderByDesc(GearWorker::getCreateTime); + return lqw; + } + + @Override + public Boolean insertByBo(GearWorkerBo bo) { + GearWorker add = BeanUtil.toBean(bo, GearWorker.class); + validEntityBeforeSave(add); + boolean flag = baseMapper.insert(add) > 0; + if (flag) { + bo.setWorkerId(add.getWorkerId()); + } + return flag; + } + + @Override + public Boolean updateByBo(GearWorkerBo bo) { + GearWorker update = BeanUtil.toBean(bo, GearWorker.class); + validEntityBeforeSave(update); + return baseMapper.updateById(update) > 0; + } + + private void validEntityBeforeSave(GearWorker entity) { + if (StringUtils.isBlank(entity.getStatus())) { + entity.setStatus("0"); + } + if (StringUtils.isBlank(entity.getDefaultBillingType())) { + entity.setDefaultBillingType("1"); + } + } + + @Override + public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) { + return baseMapper.deleteBatchIds(ids) > 0; + } + + @Override + public String importByExcel(List list, Boolean updateSupport) { + if (list == null || list.isEmpty()) { + return "导入数据为空"; + } + int success = 0; + int fail = 0; + StringBuilder msg = new StringBuilder(); + for (GearWorkerImportBo item : list) { + if (StringUtils.isBlank(item.getWorkerNo()) || StringUtils.isBlank(item.getWorkerName())) { + fail++; + msg.append("[工号/姓名为空]"); + continue; + } + GearWorker exist = baseMapper.selectOne(Wrappers.lambdaQuery() + .eq(GearWorker::getWorkerNo, item.getWorkerNo())); + + if (exist == null) { + GearWorker add = BeanUtil.toBean(item, GearWorker.class); + validEntityBeforeSave(add); + baseMapper.insert(add); + success++; + } else if (Boolean.TRUE.equals(updateSupport)) { + GearWorker update = BeanUtil.toBean(item, GearWorker.class); + update.setWorkerId(exist.getWorkerId()); + validEntityBeforeSave(update); + baseMapper.updateById(update); + success++; + } else { + fail++; + msg.append("[工号重复:").append(item.getWorkerNo()).append("]"); + } + } + return "导入完成,成功" + success + "条,失败" + fail + "条" + (msg.length() > 0 ? "," + msg : ""); + } +} diff --git a/gear-oa/src/main/resources/mapper/oa/GearWageEntryDetailMapper.xml b/gear-oa/src/main/resources/mapper/oa/GearWageEntryDetailMapper.xml new file mode 100644 index 0000000..eb60ddc --- /dev/null +++ b/gear-oa/src/main/resources/mapper/oa/GearWageEntryDetailMapper.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gear-oa/src/main/resources/mapper/oa/GearWageMakeupLogMapper.xml b/gear-oa/src/main/resources/mapper/oa/GearWageMakeupLogMapper.xml new file mode 100644 index 0000000..1b438ef --- /dev/null +++ b/gear-oa/src/main/resources/mapper/oa/GearWageMakeupLogMapper.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gear-oa/src/main/resources/mapper/oa/GearWageRateConfigMapper.xml b/gear-oa/src/main/resources/mapper/oa/GearWageRateConfigMapper.xml new file mode 100644 index 0000000..43496f2 --- /dev/null +++ b/gear-oa/src/main/resources/mapper/oa/GearWageRateConfigMapper.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/gear-oa/src/main/resources/mapper/oa/GearWorkerMapper.xml b/gear-oa/src/main/resources/mapper/oa/GearWorkerMapper.xml new file mode 100644 index 0000000..aed60de --- /dev/null +++ b/gear-oa/src/main/resources/mapper/oa/GearWorkerMapper.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/gear-ui3/src/api/oa/reimbursement.js b/gear-ui3/src/api/oa/reimbursement.js new file mode 100644 index 0000000..3c19e4e --- /dev/null +++ b/gear-ui3/src/api/oa/reimbursement.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询报销列表 +export function listReimbursement(query) { + return request({ + url: '/oa/reimbursement/list', + method: 'get', + params: query + }) +} + +// 查询报销详细 +export function getReimbursement(reimbursementId) { + return request({ + url: '/oa/reimbursement/' + reimbursementId, + method: 'get' + }) +} + +// 新增报销 +export function addReimbursement(data) { + return request({ + url: '/oa/reimbursement', + method: 'post', + data: data + }) +} + +// 修改报销 +export function updateReimbursement(data) { + return request({ + url: '/oa/reimbursement', + method: 'put', + data: data + }) +} + +// 删除报销 +export function delReimbursement(reimbursementId) { + return request({ + url: '/oa/reimbursement/' + reimbursementId, + method: 'delete' + }) +} diff --git a/gear-ui3/src/api/oa/wageEntryDetail.js b/gear-ui3/src/api/oa/wageEntryDetail.js new file mode 100644 index 0000000..3413832 --- /dev/null +++ b/gear-ui3/src/api/oa/wageEntryDetail.js @@ -0,0 +1,53 @@ +import request from '@/utils/request' + +// 查询工资录入明细列表 +export function listWageEntryDetail(query) { + return request({ + url: '/oa/wageEntryDetail/list', + method: 'get', + params: query + }) +} + +// 查询工资录入明细详细 +export function getWageEntryDetail(detailId) { + return request({ + url: '/oa/wageEntryDetail/' + detailId, + method: 'get' + }) +} + +// 新增工资录入明细 +export function addWageEntryDetail(data) { + return request({ + url: '/oa/wageEntryDetail', + method: 'post', + data: data + }) +} + +// 修改工资录入明细 +export function updateWageEntryDetail(data) { + return request({ + url: '/oa/wageEntryDetail', + method: 'put', + data: data + }) +} + +// 删除工资录入明细 +export function delWageEntryDetail(detailId) { + return request({ + url: '/oa/wageEntryDetail/' + detailId, + method: 'delete' + }) +} + +// 一键初始化当日工人名单 +export function initDailyWorkers(data) { + return request({ + url: '/oa/wageEntryDetail/initDailyWorkers', + method: 'post', + data + }) +} diff --git a/gear-ui3/src/api/oa/wageMakeupLog.js b/gear-ui3/src/api/oa/wageMakeupLog.js new file mode 100644 index 0000000..efe191f --- /dev/null +++ b/gear-ui3/src/api/oa/wageMakeupLog.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询工资补录日志列表 +export function listWageMakeupLog(query) { + return request({ + url: '/oa/wageMakeupLog/list', + method: 'get', + params: query + }) +} + +// 查询工资补录日志详细 +export function getWageMakeupLog(logId) { + return request({ + url: '/oa/wageMakeupLog/' + logId, + method: 'get' + }) +} + +// 新增工资补录日志 +export function addWageMakeupLog(data) { + return request({ + url: '/oa/wageMakeupLog', + method: 'post', + data + }) +} + +// 修改工资补录日志 +export function updateWageMakeupLog(data) { + return request({ + url: '/oa/wageMakeupLog', + method: 'put', + data + }) +} + +// 删除工资补录日志 +export function delWageMakeupLog(logId) { + return request({ + url: '/oa/wageMakeupLog/' + logId, + method: 'delete' + }) +} diff --git a/gear-ui3/src/api/oa/wageRateConfig.js b/gear-ui3/src/api/oa/wageRateConfig.js new file mode 100644 index 0000000..c85f359 --- /dev/null +++ b/gear-ui3/src/api/oa/wageRateConfig.js @@ -0,0 +1,44 @@ +import request from '@/utils/request' + +// 查询工资费率配置列表 +export function listWageRateConfig(query) { + return request({ + url: '/oa/wageRateConfig/list', + method: 'get', + params: query + }) +} + +// 查询工资费率配置详细 +export function getWageRateConfig(rateId) { + return request({ + url: '/oa/wageRateConfig/' + rateId, + method: 'get' + }) +} + +// 新增工资费率配置 +export function addWageRateConfig(data) { + return request({ + url: '/oa/wageRateConfig', + method: 'post', + data: data + }) +} + +// 修改工资费率配置 +export function updateWageRateConfig(data) { + return request({ + url: '/oa/wageRateConfig', + method: 'put', + data: data + }) +} + +// 删除工资费率配置 +export function delWageRateConfig(rateId) { + return request({ + url: '/oa/wageRateConfig/' + rateId, + method: 'delete' + }) +} diff --git a/gear-ui3/src/api/oa/worker.js b/gear-ui3/src/api/oa/worker.js new file mode 100644 index 0000000..4360bef --- /dev/null +++ b/gear-ui3/src/api/oa/worker.js @@ -0,0 +1,65 @@ +import request from '@/utils/request' + +// 查询工人列表 +export function listWorker(query) { + return request({ + url: '/oa/worker/list', + method: 'get', + params: query + }) +} + +// 查询工人详细 +export function getWorker(workerId) { + return request({ + url: '/oa/worker/' + workerId, + method: 'get' + }) +} + +// 新增工人 +export function addWorker(data) { + return request({ + url: '/oa/worker', + method: 'post', + data + }) +} + +// 修改工人 +export function updateWorker(data) { + return request({ + url: '/oa/worker', + method: 'put', + data + }) +} + +// 删除工人 +export function delWorker(workerId) { + return request({ + url: '/oa/worker/' + workerId, + method: 'delete' + }) +} + +// 下载导入模板 +export function importTemplateWorker() { + return request({ + url: '/oa/worker/importTemplate', + method: 'get', + responseType: 'blob' + }) +} + +// 导入工人 +export function importWorkerData(data) { + return request({ + url: '/oa/worker/importData', + method: 'post', + headers: { + 'Content-Type': 'multipart/form-data' + }, + data + }) +} diff --git a/gear-ui3/src/assets/images/index.jpg b/gear-ui3/src/assets/images/index.jpg new file mode 100644 index 0000000..4a8b979 Binary files /dev/null and b/gear-ui3/src/assets/images/index.jpg differ diff --git a/gear-ui3/src/components/FileUpload/index.vue b/gear-ui3/src/components/FileUpload/index.vue index ba3176d..f4b78c7 100644 --- a/gear-ui3/src/components/FileUpload/index.vue +++ b/gear-ui3/src/components/FileUpload/index.vue @@ -17,14 +17,14 @@ 选取文件 -
+ + +
请上传 的文件
- -
  • diff --git a/gear-ui3/src/views/index.vue b/gear-ui3/src/views/index.vue index ffc8fde..8876f50 100644 --- a/gear-ui3/src/views/index.vue +++ b/gear-ui3/src/views/index.vue @@ -1,289 +1,11 @@ - - \ No newline at end of file + diff --git a/gear-ui3/src/views/oms/reimbursement/index.vue b/gear-ui3/src/views/oms/reimbursement/index.vue new file mode 100644 index 0000000..66441cf --- /dev/null +++ b/gear-ui3/src/views/oms/reimbursement/index.vue @@ -0,0 +1,322 @@ + + + + + diff --git a/gear-ui3/src/views/oms/wageEntryDetail/index.vue b/gear-ui3/src/views/oms/wageEntryDetail/index.vue new file mode 100644 index 0000000..069cab2 --- /dev/null +++ b/gear-ui3/src/views/oms/wageEntryDetail/index.vue @@ -0,0 +1,275 @@ + + + diff --git a/gear-ui3/src/views/oms/wageMakeup/index.vue b/gear-ui3/src/views/oms/wageMakeup/index.vue new file mode 100644 index 0000000..1058d6b --- /dev/null +++ b/gear-ui3/src/views/oms/wageMakeup/index.vue @@ -0,0 +1,233 @@ + + + diff --git a/gear-ui3/src/views/oms/wageMakeupLog/index.vue b/gear-ui3/src/views/oms/wageMakeupLog/index.vue new file mode 100644 index 0000000..0a72ded --- /dev/null +++ b/gear-ui3/src/views/oms/wageMakeupLog/index.vue @@ -0,0 +1,268 @@ + + + diff --git a/gear-ui3/src/views/oms/wageRateConfig/index.vue b/gear-ui3/src/views/oms/wageRateConfig/index.vue new file mode 100644 index 0000000..613ac31 --- /dev/null +++ b/gear-ui3/src/views/oms/wageRateConfig/index.vue @@ -0,0 +1,268 @@ + + + diff --git a/gear-ui3/src/views/oms/worker/index.vue b/gear-ui3/src/views/oms/worker/index.vue new file mode 100644 index 0000000..a3d51f1 --- /dev/null +++ b/gear-ui3/src/views/oms/worker/index.vue @@ -0,0 +1,362 @@ + + + diff --git a/gear-ui3/vite.config.js b/gear-ui3/vite.config.js index 2e38da5..3e62039 100644 --- a/gear-ui3/vite.config.js +++ b/gear-ui3/vite.config.js @@ -42,7 +42,7 @@ export default defineConfig(({ mode, command }) => { }, // vite 相关配置 server: { - port: 81, + port: 1024, host: true, open: true, // 如果端口占用自动切换端口 diff --git a/script/sql/mysql/update/update_v0.8.2~v0.8.3.sql b/script/sql/mysql/update/update_v0.8.2~v0.8.3.sql new file mode 100644 index 0000000..1a73c25 --- /dev/null +++ b/script/sql/mysql/update/update_v0.8.2~v0.8.3.sql @@ -0,0 +1,188 @@ +-- 报销模块表结构(仅CRUD,无审批流) +DROP TABLE IF EXISTS gear_reimbursement; +CREATE TABLE gear_reimbursement ( + reimbursement_id bigint(20) NOT NULL COMMENT '报销ID', + applicant_id bigint(20) NOT NULL COMMENT '申请人用户ID', + applicant_name varchar(64) NOT NULL COMMENT '申请人名称', + attachment_url varchar(500) DEFAULT '' COMMENT '附件地址', + upload_time datetime COMMENT '上传时间', + amount decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '报销金额', + reimburse_status char(1) NOT NULL DEFAULT '0' COMMENT '报销状态(0未报销 1已报销)', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (reimbursement_id), + KEY idx_applicant_id (applicant_id), + KEY idx_reimburse_status (reimburse_status), + KEY idx_upload_time (upload_time) +) ENGINE=InnoDB COMMENT='报销表'; + +-- 菜单(挂载到“办公管理”下,parent_id=5) +INSERT INTO sys_menu VALUES ('131', '报销管理', '5', '7', 'reimbursement', 'oms/reimbursement/index', '', 1, 0, 'C', '0', '0', 'oa:reimbursement:list', 'money', 'admin', sysdate(), '', null, '报销管理菜单'); +-- 按钮权限 +INSERT INTO sys_menu VALUES ('1311', '报销查询', '131', '1', '#', '', '', 1, 0, 'F', '0', '0', 'oa:reimbursement:query', '#', 'admin', sysdate(), '', null, ''); +INSERT INTO sys_menu VALUES ('1312', '报销新增', '131', '2', '#', '', '', 1, 0, 'F', '0', '0', 'oa:reimbursement:add', '#', 'admin', sysdate(), '', null, ''); +INSERT INTO sys_menu VALUES ('1313', '报销修改', '131', '3', '#', '', '', 1, 0, 'F', '0', '0', 'oa:reimbursement:edit', '#', 'admin', sysdate(), '', null, ''); +INSERT INTO sys_menu VALUES ('1314', '报销删除', '131', '4', '#', '', '', 1, 0, 'F', '0', '0', 'oa:reimbursement:remove', '#', 'admin', sysdate(), '', null, ''); +INSERT INTO sys_menu VALUES ('1315', '报销导出', '131', '5', '#', '', '', 1, 0, 'F', '0', '0', 'oa:reimbursement:export', '#', 'admin', sysdate(), '', null, ''); + +-- ================================ +-- 工资录入/补录模块(v0.8.3) +-- ================================ + +-- 1) 计费基础配置(小时工/计件工/天工) +DROP TABLE IF EXISTS gear_wage_rate_config; +CREATE TABLE gear_wage_rate_config ( + rate_id bigint(20) NOT NULL COMMENT '费率配置ID', + rate_code varchar(64) NOT NULL COMMENT '费率编码(唯一)', + rate_name varchar(128) NOT NULL COMMENT '费率名称', + billing_type char(1) NOT NULL COMMENT '计费类型(1小时工 2计件工 3天工)', + work_type_name varchar(64) DEFAULT '' COMMENT '工种名称(小时工/天工使用)', + item_name varchar(128) DEFAULT '' COMMENT '加工物品名称(计件工使用)', + process_name varchar(128) DEFAULT '' COMMENT '工序名称(计件工使用)', + workday_hours decimal(5,2) DEFAULT NULL COMMENT '日工时制度(如8/9,仅天工)', + unit_price decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '单价(小时单价/件单价/日薪)', + status char(1) NOT NULL DEFAULT '0' COMMENT '状态(0启用 1停用)', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (rate_id), + UNIQUE KEY uk_rate_code (rate_code), + KEY idx_billing_type_status (billing_type, status), + KEY idx_work_type_name (work_type_name), + KEY idx_item_process (item_name, process_name) +) ENGINE=InnoDB COMMENT='工资费率配置表'; + +-- 2) 每日录入批次(用于“自动带入全员员工”和录入进度统计) +DROP TABLE IF EXISTS gear_wage_entry_batch; +CREATE TABLE gear_wage_entry_batch ( + batch_id bigint(20) NOT NULL COMMENT '批次ID', + entry_date date NOT NULL COMMENT '录入日期', + total_emp_count int(11) NOT NULL DEFAULT 0 COMMENT '应录入员工总数', + entered_emp_count int(11) NOT NULL DEFAULT 0 COMMENT '已录入员工数', + unentered_emp_count int(11) NOT NULL DEFAULT 0 COMMENT '未录入员工数', + status char(1) NOT NULL DEFAULT '0' COMMENT '状态(0进行中 1已完成)', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (batch_id), + UNIQUE KEY uk_entry_date (entry_date), + KEY idx_status (status) +) ENGINE=InnoDB COMMENT='工资每日录入批次表'; + +-- 3) 每日员工录入状态(用于“已录入/未录入”检索) +DROP TABLE IF EXISTS gear_wage_entry_emp_status; +CREATE TABLE gear_wage_entry_emp_status ( + status_id bigint(20) NOT NULL COMMENT '状态ID', + batch_id bigint(20) NOT NULL COMMENT '批次ID', + entry_date date NOT NULL COMMENT '录入日期', + emp_id bigint(20) NOT NULL COMMENT '员工ID', + emp_name varchar(64) NOT NULL COMMENT '员工姓名', + entered_flag char(1) NOT NULL DEFAULT '0' COMMENT '是否已录入(0否 1是)', + first_entry_time datetime COMMENT '首次录入时间', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (status_id), + UNIQUE KEY uk_entry_date_emp (entry_date, emp_id), + KEY idx_batch_id (batch_id), + KEY idx_entered_flag (entered_flag) +) ENGINE=InnoDB COMMENT='工资录入员工状态表'; + +-- 4) 工资录入明细(原始录入 + 补录) +DROP TABLE IF EXISTS gear_wage_entry_detail; +CREATE TABLE gear_wage_entry_detail ( + detail_id bigint(20) NOT NULL COMMENT '明细ID', + entry_date date NOT NULL COMMENT '业务日期', + emp_id bigint(20) NOT NULL COMMENT '员工ID', + emp_name varchar(64) NOT NULL COMMENT '员工姓名', + billing_type char(1) NOT NULL COMMENT '计费类型(1小时工 2计件工 3天工)', + rate_id bigint(20) NOT NULL COMMENT '费率配置ID', + work_type_name varchar(64) DEFAULT '' COMMENT '工种名称(快照)', + item_name varchar(128) DEFAULT '' COMMENT '加工物品(快照)', + process_name varchar(128) DEFAULT '' COMMENT '工序(快照)', + order_no varchar(64) DEFAULT '' COMMENT '订单号(订单维度去重)', + workload decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '工作量(小时/件数/天数)', + unit_price decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '单价快照', + base_amount decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '基础金额(工作量*单价)', + extra_amount decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '额外金额(高温/交通等)', + extra_reason varchar(255) DEFAULT '' COMMENT '额外金额原因', + total_amount decimal(12,2) NOT NULL DEFAULT 0.00 COMMENT '总金额(基础+额外)', + is_makeup char(1) NOT NULL DEFAULT '0' COMMENT '是否补录(0否 1是)', + source_detail_id bigint(20) DEFAULT NULL COMMENT '被补录/被修改的原始明细ID', + makeup_responsible_id bigint(20) DEFAULT NULL COMMENT '补录责任人ID', + makeup_responsible varchar(64) DEFAULT '' COMMENT '补录责任人姓名', + makeup_reason varchar(500) DEFAULT '' COMMENT '补录原因', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (detail_id), + UNIQUE KEY uk_entry_unique (entry_date, emp_id, billing_type, rate_id, order_no, del_flag), + KEY idx_entry_date_emp (entry_date, emp_id), + KEY idx_is_makeup (is_makeup), + KEY idx_makeup_resp (makeup_responsible_id), + KEY idx_source_detail_id (source_detail_id), + KEY idx_order_no (order_no) +) ENGINE=InnoDB COMMENT='工资录入明细表'; + +-- 5) 补录操作日志(确保责任链可追溯) +DROP TABLE IF EXISTS gear_wage_makeup_log; +CREATE TABLE gear_wage_makeup_log ( + log_id bigint(20) NOT NULL COMMENT '日志ID', + detail_id bigint(20) NOT NULL COMMENT '补录后明细ID', + source_detail_id bigint(20) DEFAULT NULL COMMENT '补录前明细ID', + operation_type char(1) NOT NULL DEFAULT '1' COMMENT '操作类型(1新增补录 2修改补录 3撤销补录)', + operation_date date NOT NULL COMMENT '补录目标日期', + emp_id bigint(20) NOT NULL COMMENT '员工ID', + makeup_responsible_id bigint(20) NOT NULL COMMENT '补录责任人ID', + makeup_responsible varchar(64) NOT NULL COMMENT '补录责任人姓名', + makeup_reason varchar(500) NOT NULL COMMENT '补录原因', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (log_id), + KEY idx_operation_date (operation_date), + KEY idx_resp_id (makeup_responsible_id), + KEY idx_emp_id (emp_id), + KEY idx_detail_id (detail_id) +) ENGINE=InnoDB COMMENT='工资补录日志表'; + +-- 6) 工人主数据(支持模板导入,长期复用) +DROP TABLE IF EXISTS gear_worker; +CREATE TABLE gear_worker ( + worker_id bigint(20) NOT NULL COMMENT '工人ID', + worker_no varchar(64) NOT NULL COMMENT '工号', + worker_name varchar(64) NOT NULL COMMENT '姓名', + phone varchar(20) DEFAULT '' COMMENT '手机号', + default_billing_type char(1) DEFAULT '1' COMMENT '默认计费类型(1小时工 2计件工 3天工)', + default_work_type_name varchar(64) DEFAULT '' COMMENT '默认工种', + status char(1) NOT NULL DEFAULT '0' COMMENT '状态(0在职 1离职)', + del_flag char(1) NOT NULL DEFAULT '0' COMMENT '删除标志(0存在 2删除)', + create_by varchar(64) DEFAULT '' COMMENT '创建者', + create_time datetime COMMENT '创建时间', + update_by varchar(64) DEFAULT '' COMMENT '更新者', + update_time datetime COMMENT '更新时间', + remark varchar(500) DEFAULT NULL COMMENT '备注', + PRIMARY KEY (worker_id), + UNIQUE KEY uk_worker_no (worker_no), + KEY idx_worker_name (worker_name), + KEY idx_status (status) +) ENGINE=InnoDB COMMENT='工人主数据表';