已修改15个文件
已添加43个文件
2545 ■■■■■ 文件已修改
main-business/pom.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/annotation/Anonymous.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/annotation/DataScope.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/annotation/Excel.java 198 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/annotation/Excels.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/controller/AccountFileController.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/controller/CompensationPerformanceController.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/controller/ProductionSchedulingController.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/controller/StaffJoinLeaveRecordController.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/controller/StaffOnJobController.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/dto/DateQueryDto.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/AccountFile.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/CompensationPerformance.java 230 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/OfficialInventory.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/Production.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/ProductionScheduling.java 102 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/PurchaseRegistration.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/StaffJoinLeaveRecord.java 156 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/entity/StaffOnJob.java 148 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/mapper/AccountFileMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/mapper/CompensationPerformanceMapper.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/mapper/ProductionSchedulingMapper.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/mapper/StaffJoinLeaveRecordMapper.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/mapper/StaffOnJobMapper.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/other/controller/TempFileController.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/other/mapper/CommonFileMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/other/mapper/TempFileMapper.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/other/pojo/CommonFile.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/other/pojo/TempFile.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/other/service/TempFileService.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/other/service/impl/TempFileServiceImpl.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/AccountFileService.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/CompensationPerformanceService.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/IStaffJoinLeaveRecordService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/IStaffOnJobService.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/ProductionSchedulingService.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/AccountFileServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/CompensationPerformanceServiceImpl.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/ProductionSchedulingServiceImpl.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/ProductionServiceImpl.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/StaffJoinLeaveRecordServiceImpl.java 168 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/java/com/ruoyi/business/service/impl/StaffOnJobServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/db/migration/postgresql/V20250603160101__create_table_purchase_registration.sql 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/db/migration/postgresql/V20250604101800__create_table_production.sql 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/db/migration/postgresql/V20250604104500__create_table_pending_inventory.sql 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/db/migration/postgresql/V20250604111200__create_table_official_inventory.sql 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/db/migration/postgresql/V20250825111200__create_table_production_scheduling.sql 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/mapper/AccountFileMapper.xml 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/mapper/CompensationPerformanceMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/mapper/ProductionSchedulingMapper.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/mapper/StaffJoinLeaveRecordMapper.xml 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/src/main/resources/mapper/StaffOnJobMapper.xml 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-admin/src/main/resources/application.yml.example 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
main-business/pom.xml
@@ -16,6 +16,22 @@
            <groupId>com.ruoyi</groupId>
            <artifactId>ruoyi-common</artifactId>
        </dependency>
        <!-- é˜²æ­¢è¿›å…¥swagger页面报类型转换错误,排除3.0.0中的引用,手动增加1.6.2版本 -->
        <dependency>
            <groupId>io.swagger</groupId>
            <artifactId>swagger-models</artifactId>
            <version>1.6.2</version>
        </dependency>
        <!-- excel工具 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>5.2.3</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- æ ¸å¿ƒæ¨¡å—-->
        <dependency>
main-business/src/main/java/com/ruoyi/business/annotation/Anonymous.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.business.annotation;
import java.lang.annotation.*;
/**
 * åŒ¿åè®¿é—®ä¸é‰´æƒæ³¨è§£
 *
 * @author ruoyi
 */
@Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Anonymous
{
}
main-business/src/main/java/com/ruoyi/business/annotation/DataScope.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,29 @@
package com.ruoyi.business.annotation;
import java.lang.annotation.*;
/**
 * æ•°æ®æƒé™è¿‡æ»¤æ³¨è§£
 *
 * @author ruoyi
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataScope
{
    /**
     * éƒ¨é—¨è¡¨çš„别名
     */
    public String deptAlias() default "";
    /**
     * ç”¨æˆ·è¡¨çš„别名
     */
    public String userAlias() default "";
    /**
     * æƒé™å­—符(用于多个角色匹配符合要求的权限)默认根据权限注解@ss获取,多个权限用逗号分隔开来
     */
    public String permission() default "";
}
main-business/src/main/java/com/ruoyi/business/annotation/Excel.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,198 @@
package com.ruoyi.business.annotation;
import com.ruoyi.common.utils.poi.ExcelHandlerAdapter;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import java.math.BigDecimal;
/**
 * è‡ªå®šä¹‰å¯¼å‡ºExcel数据注解
 *
 * @author ruoyi
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface Excel
{
    /**
     * å¯¼å‡ºæ—¶åœ¨excel中排序
     */
    public int sort() default Integer.MAX_VALUE;
    /**
     * å¯¼å‡ºåˆ°Excel中的名字.
     */
    public String name() default "";
    /**
     * æ—¥æœŸæ ¼å¼, å¦‚: yyyy-MM-dd
     */
    public String dateFormat() default "";
    /**
     * å¦‚果是字典类型,请设置字典的type值 (如: sys_user_sex)
     */
    public String dictType() default "";
    /**
     * è¯»å–内容转表达式 (如: 0=男,1=女,2=未知)
     */
    public String readConverterExp() default "";
    /**
     * åˆ†éš”符,读取字符串组内容
     */
    public String separator() default ",";
    /**
     * BigDecimal ç²¾åº¦ é»˜è®¤:-1(默认不开启BigDecimal格式化)
     */
    public int scale() default -1;
    /**
     * BigDecimal èˆå…¥è§„则 é»˜è®¤:BigDecimal.ROUND_HALF_EVEN
     */
    public int roundingMode() default BigDecimal.ROUND_HALF_EVEN;
    /**
     * å¯¼å‡ºæ—¶åœ¨excel中每个列的高度
     */
    public double height() default 14;
    /**
     * å¯¼å‡ºæ—¶åœ¨excel中每个列的宽度
     */
    public double width() default 16;
    /**
     * æ–‡å­—后缀,如% 90 å˜æˆ90%
     */
    public String suffix() default "";
    /**
     * å½“值为空时,字段的默认值
     */
    public String defaultValue() default "";
    /**
     * æç¤ºä¿¡æ¯
     */
    public String prompt() default "";
    /**
     * æ˜¯å¦å…è®¸å†…容换行
     */
    public boolean wrapText() default false;
    /**
     * è®¾ç½®åªèƒ½é€‰æ‹©ä¸èƒ½è¾“入的列内容.
     */
    public String[] combo() default {};
    /**
     * æ˜¯å¦ä»Žå­—典读数据到combo,默认不读取,如读取需要设置dictType注解.
     */
    public boolean comboReadDict() default false;
    /**
     * æ˜¯å¦éœ€è¦çºµå‘合并单元格,应对需求:含有list集合单元格)
     */
    public boolean needMerge() default false;
    /**
     * æ˜¯å¦å¯¼å‡ºæ•°æ®,应对需求:有时我们需要导出一份模板,这是标题需要但内容需要用户手工填写.
     */
    public boolean isExport() default true;
    /**
     * å¦ä¸€ä¸ªç±»ä¸­çš„属性名称,支持多级获取,以小数点隔开
     */
    public String targetAttr() default "";
    /**
     * æ˜¯å¦è‡ªåŠ¨ç»Ÿè®¡æ•°æ®,在最后追加一行统计数据总和
     */
    public boolean isStatistics() default false;
    /**
     * å¯¼å‡ºç±»åž‹ï¼ˆ0数字 1字符串 2图片)
     */
    public ColumnType cellType() default ColumnType.STRING;
    /**
     * å¯¼å‡ºåˆ—头背景颜色
     */
    public IndexedColors headerBackgroundColor() default IndexedColors.GREY_50_PERCENT;
    /**
     * å¯¼å‡ºåˆ—头字体颜色
     */
    public IndexedColors headerColor() default IndexedColors.WHITE;
    /**
     * å¯¼å‡ºå•元格背景颜色
     */
    public IndexedColors backgroundColor() default IndexedColors.WHITE;
    /**
     * å¯¼å‡ºå•元格字体颜色
     */
    public IndexedColors color() default IndexedColors.BLACK;
    /**
     * å¯¼å‡ºå­—段对齐方式
     */
    public HorizontalAlignment align() default HorizontalAlignment.CENTER;
    /**
     * è‡ªå®šä¹‰æ•°æ®å¤„理器
     */
    public Class<?> handler() default ExcelHandlerAdapter.class;
    /**
     * è‡ªå®šä¹‰æ•°æ®å¤„理器参数
     */
    public String[] args() default {};
    /**
     * å­—段类型(0:导出导入;1:仅导出;2:仅导入)
     */
    Type type() default Type.ALL;
    public enum Type
    {
        ALL(0), EXPORT(1), IMPORT(2);
        private final int value;
        Type(int value)
        {
            this.value = value;
        }
        public int value()
        {
            return this.value;
        }
    }
    public enum ColumnType
    {
        NUMERIC(0), STRING(1), IMAGE(2), TEXT(3);
        private final int value;
        ColumnType(int value)
        {
            this.value = value;
        }
        public int value()
        {
            return this.value;
        }
    }
}
main-business/src/main/java/com/ruoyi/business/annotation/Excels.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.business.annotation;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
 * Excel注解集
 *
 * @author ruoyi
 */
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Excels
{
    public Excel[] value();
}
main-business/src/main/java/com/ruoyi/business/controller/AccountFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,63 @@
package com.ruoyi.business.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.AccountFile;
import com.ruoyi.business.service.AccountFileService;
import com.ruoyi.common.core.domain.AjaxResult;
import jakarta.annotation.Resource;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * è´¢åС附件
 */
@RestController
@RequestMapping("/account/accountFile")
public class AccountFileController {
    @Resource
    private AccountFileService accountFileService;
    /**
     * æ–°å¢ž
     * @param accountFile
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody AccountFile accountFile) {
        return AjaxResult.success(accountFileService.save(accountFile));
    }
    /**
     * åˆ é™¤
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    public AjaxResult delAccountFile(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        //删除检验附件
        return AjaxResult.success(accountFileService.removeBatchByIds(ids));
    }
    /**
     *分页查询
     * @param page
     * @param accountFile
     * @return
     */
    @GetMapping("/listPage")
    public AjaxResult accountFileListPage(Page page, AccountFile accountFile) {
        return AjaxResult.success(accountFileService.accountFileListPage(page, accountFile));
    }
}
main-business/src/main/java/com/ruoyi/business/controller/CompensationPerformanceController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,64 @@
package com.ruoyi.business.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.CompensationPerformance;
import com.ruoyi.business.service.CompensationPerformanceService;
import com.ruoyi.common.core.domain.R;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/8/8 9:56
 */
@RestController
@Api(tags = "薪酬绩效")
@AllArgsConstructor
@RequestMapping("/compensationPerformance")
public class CompensationPerformanceController{
    @Autowired
    private CompensationPerformanceService compensationPerformanceService;
    @GetMapping("/listPage")
    @ApiOperation("薪酬绩效-分页查询")
    public R listPage(Page page, CompensationPerformance compensationPerformance){
        IPage<CompensationPerformance> listPage = compensationPerformanceService.listPage(page, compensationPerformance);
        return R.ok(listPage);
    }
    @PostMapping("/add")
    @ApiOperation("薪酬绩效-添加")
    @Transactional(rollbackFor = Exception.class)
    public R add(@RequestBody CompensationPerformance compensationPerformance){
        boolean save = compensationPerformanceService.save(compensationPerformance);
        return save ? R.ok("添加成功") : R.fail("添加失败");
    }
    @PostMapping("/update")
    @ApiOperation("薪酬绩效-修改")
    @Transactional(rollbackFor = Exception.class)
    public R update(@RequestBody CompensationPerformance compensationPerformance){
        boolean update = compensationPerformanceService.updateById(compensationPerformance);
        return update ? R.ok("修改成功") : R.fail("修改失败");
    }
    @DeleteMapping("/delete")
    @ApiOperation("薪酬绩效-删除")
    @Transactional(rollbackFor = Exception.class)
    public R delete(@RequestBody List<Long> ids){
        if(CollectionUtils.isEmpty(ids)) return R.fail("请传入要删除的ID");
        boolean delete = compensationPerformanceService.removeBatchByIds(ids);
        return delete ? R.ok("删除成功") : R.fail("删除失败");
    }
}
main-business/src/main/java/com/ruoyi/business/controller/ProductionSchedulingController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,65 @@
package com.ruoyi.business.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.dto.PurchaseRegistrationDto;
import com.ruoyi.business.entity.ProductionScheduling;
import com.ruoyi.business.entity.PurchaseRegistration;
import com.ruoyi.business.service.ProductionSchedulingService;
import com.ruoyi.common.core.domain.R;
import lombok.AllArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/8/25 16:39
 */
@RestController
@AllArgsConstructor
@RequestMapping("/productionScheduling")
public class ProductionSchedulingController {
    @Autowired
    private ProductionSchedulingService productionSchedulingService;
    @GetMapping("/list")
    public R<IPage<ProductionScheduling>> list(Page<ProductionScheduling> page, ProductionScheduling productionScheduling) {
        IPage<ProductionScheduling> list = productionSchedulingService.listPage(page,productionScheduling);
        return R.ok(list);
    }
    @PostMapping("/addProductionScheduling")
    @Transactional(rollbackFor = Exception.class)
    public R addProductionScheduling(@RequestBody List<ProductionScheduling> productionScheduling) {
        boolean save = productionSchedulingService.addProductionScheduling(productionScheduling);
        return save ? R.ok() : R.fail();
    }
    @PostMapping("/updateProductionScheduling")
    @Transactional(rollbackFor = Exception.class)
    public R updateProductionScheduling(@RequestBody ProductionScheduling productionScheduling) {
        boolean update = productionSchedulingService.updateById(productionScheduling);
        return update ? R.ok() : R.fail();
    }
    @DeleteMapping("/delProductionScheduling")
    @Transactional(rollbackFor = Exception.class)
    public R delProductionScheduling(@RequestBody List<Long> ids) {
        boolean delete = productionSchedulingService.removeByIds(ids);
        return delete ? R.ok() : R.fail();
    }
    @PostMapping("/work")
    @Transactional(rollbackFor = Exception.class)
    public R work(@RequestBody ProductionScheduling productionScheduling) {
        boolean update = productionSchedulingService.work(productionScheduling);
        return update ? R.ok() : R.fail();
    }
}
main-business/src/main/java/com/ruoyi/business/controller/StaffJoinLeaveRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,90 @@
package com.ruoyi.business.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.StaffJoinLeaveRecord;
import com.ruoyi.business.service.IStaffJoinLeaveRecordService;
import com.ruoyi.common.core.domain.AjaxResult;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * æ–°å¢žå…¥èŒ/离职
 */
@RestController
@RequestMapping("/staff/staffJoinLeaveRecord")
public class StaffJoinLeaveRecordController {
    @Resource
    private IStaffJoinLeaveRecordService staffJoinLeaveRecordService;
    /**
     * æ–°å¢žå…¥èŒ/离职
     * @param staffJoinLeaveRecord
     * @return
     */
    @PostMapping("/add")
    public AjaxResult add(@RequestBody StaffJoinLeaveRecord staffJoinLeaveRecord) {
        return AjaxResult.success(staffJoinLeaveRecordService.add(staffJoinLeaveRecord));
    }
    /**
     * åˆ é™¤å…¥èŒ/离职
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    public AjaxResult delStaffJoinLeaveRecord(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        return AjaxResult.success(staffJoinLeaveRecordService.delStaffJoinLeaveRecord(ids));
    }
    /**
     * å…¥èŒ/离职详情
     * @param id
     * @return
     */
    @GetMapping("/{id}")
    public AjaxResult staffJoinLeaveRecordDetail(@PathVariable("id") Integer id) {
        return AjaxResult.success(staffJoinLeaveRecordService.getById(id));
    }
    /**
     * å…¥èŒ/离职修改
     * @param staffJoinLeaveRecord
     * @return
     */
    @PostMapping("/update")
    public AjaxResult update(@RequestBody StaffJoinLeaveRecord staffJoinLeaveRecord) {
        return AjaxResult.success(staffJoinLeaveRecordService.updateStaffJoinLeaveRecord(staffJoinLeaveRecord));
    }
    /**
     * å…¥èŒ/离职分页查询
     * @param page
     * @param staffJoinLeaveRecord
     * @return
     */
    @GetMapping("/listPage")
    public AjaxResult staffJoinLeaveRecordListPage(Page page, StaffJoinLeaveRecord staffJoinLeaveRecord) {
        return AjaxResult.success(staffJoinLeaveRecordService.staffJoinLeaveRecordListPage(page, staffJoinLeaveRecord));
    }
    /**
     * å…¥èŒ/离职导出
     * @param response
     * @param staffJoinLeaveRecord
     */
    @PostMapping("/export")
    public void staffJoinLeaveRecordExport(HttpServletResponse response, StaffJoinLeaveRecord staffJoinLeaveRecord) {
        staffJoinLeaveRecordService.staffJoinLeaveRecordExport(response, staffJoinLeaveRecord);
    }
}
main-business/src/main/java/com/ruoyi/business/controller/StaffOnJobController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.ruoyi.business.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.StaffOnJob;
import com.ruoyi.business.service.IStaffOnJobService;
import com.ruoyi.common.core.domain.AjaxResult;
import jakarta.annotation.Resource;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
/**
 * å‘˜å·¥å°è´¦/合同管理
 */
@RestController
@RequestMapping("/staff/staffOnJob")
public class StaffOnJobController {
    @Resource
    private IStaffOnJobService staffOnJobService;
    /**
     * åœ¨èŒå‘˜å·¥å°è´¦åˆ†é¡µæŸ¥è¯¢
     * @param page
     * @param staffOnJob
     * @return
     */
    @GetMapping("/listPage")
    public AjaxResult staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
        return AjaxResult.success(staffOnJobService.staffOnJobListPage(page, staffOnJob));
    }
    /**
     * åœ¨èŒå‘˜å·¥ä¸‹æ‹‰(新增离职用)
     * @return
     */
    @GetMapping("/list")
    public AjaxResult staffOnJobList() {
        return AjaxResult.success(staffOnJobService.staffOnJobList());
    }
    /**
     * åœ¨èŒå‘˜å·¥è¯¦æƒ…
     * @param staffNo
     * @return
     */
    @GetMapping("/staffNo")
    public AjaxResult staffOnJobDetail(String staffNo) {
        return AjaxResult.success(staffOnJobService.staffOnJobDetail(staffNo));
    }
    /**
     * åœ¨èŒå‘˜å·¥å¯¼å…¥
     */
    @PostMapping("/import")
    public AjaxResult importData(@RequestPart("file") MultipartFile file) {
        Boolean b = staffOnJobService.importData(file);
        if (b) {
            return AjaxResult.success("导入成功");
        }
        return AjaxResult.error("导入失败");
    }
    /**
     * åœ¨èŒå‘˜å·¥å¯¼å‡º
     * @param response
     * @param staffOnJob
     */
    @PostMapping("/export")
    public void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob) {
        staffOnJobService.staffOnJobExport(response, staffOnJob);
    }
}
main-business/src/main/java/com/ruoyi/business/dto/DateQueryDto.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.business.dto;
import com.baomidou.mybatisplus.annotation.TableField;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * @author :yys
 * @date : 2025/7/23 11:31
 */
@Data
@ApiModel
public class DateQueryDto {
    @ApiModelProperty(value = "开始时间")
    @TableField(exist = false)
    private String entryDateStart;
    @ApiModelProperty(value = "结束时间")
    @TableField(exist = false)
    private String entryDateEnd;
}
main-business/src/main/java/com/ruoyi/business/dto/OfficialInventoryDto.java
@@ -14,6 +14,8 @@
    private List<Long> ids;//要合并的正式库的id
    private Integer type;
    private String coal; //煤种
    private String supplierName; //供应商
main-business/src/main/java/com/ruoyi/business/entity/AccountFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,67 @@
package com.ruoyi.business.entity;
import com.baomidou.mybatisplus.annotation.*;
import io.swagger.annotations.ApiModelProperty;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
 * è´¢åŠ¡ç®¡ç†--附件
 * account_file
 */
@TableName(value = "account_file")
@Data
public class AccountFile implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    @ApiModelProperty(value = "文件名称")
    private String name;
    @ApiModelProperty(value = "文件路径")
    private String url;
    @ApiModelProperty(value = "文件大小")
    private int fileSize;
    @ApiModelProperty(value = "财务ID")
    @NotBlank(message = "财务id不能为空!")
    private Long accountId;
    /**
     * ç±»åž‹(收入/支出)
     */
    @ApiModelProperty(value = "类型(收入/支出)")
    private String accountType;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
main-business/src/main/java/com/ruoyi/business/entity/CompensationPerformance.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,230 @@
package com.ruoyi.business.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.business.annotation.Excel;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/8/8 9:40
 */
@Data
@TableName("compensation_performance")
@ApiModel
public class CompensationPerformance {
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * å‘˜å·¥id
     */
    @ApiModelProperty("员工id")
    @Excel(name = "员工id")
    private Long staffId;
    /**
     * å§“名
     */
    @ApiModelProperty("姓名")
    @Excel(name = "姓名")
    private String name;
    /**
     * è–ªèµ„月份(查询)
     */
    @ApiModelProperty("薪资月份(查询)")
    @TableField(exist = false)
    private String payDateStr;
    /**
     * è–ªèµ„月份
     */
    @ApiModelProperty("薪资月份")
    @Excel(name = "薪资月份", dateFormat = "yyyy-MM", width = 30)
    @JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM")
    private Date payDate;
    /**
     * åº”出勤天数
     */
    @ApiModelProperty("应出勤天数")
    @Excel(name = "应出勤天数")
    private BigDecimal shouldAttendedNum;
    /**
     * å®žé™…出勤天数
     */
    @ApiModelProperty("实际出勤天数")
    @Excel(name = "实际出勤天数")
    private BigDecimal actualAttendedNum;
    /**
     * åŸºæœ¬å·¥èµ„
     */
    @ApiModelProperty("基本工资")
    @Excel(name = "基本工资")
    private BigDecimal basicSalary;
    /**
     * å²—位工资
     */
    @ApiModelProperty("岗位工资")
    @Excel(name = "岗位工资")
    private BigDecimal postSalary;
    /**
     * å…¥ç¦»èŒç¼ºå‹¤æ‰£æ¬¾
     */
    @ApiModelProperty("入离职缺勤扣款")
    @Excel(name = "入离职缺勤扣款")
    private BigDecimal deductionAbsenteeism;
    /**
     * ç—…假扣款
     */
    @ApiModelProperty("病假扣款")
    @Excel(name = "病假扣款")
    private BigDecimal sickLeaveDeductions;
    /**
     * äº‹å‡æ‰£æ¬¾
     */
    @ApiModelProperty("事假扣款")
    @Excel(name = "事假扣款")
    private BigDecimal deductionPersonalLeave;
    /**
     * å¿˜è®°æ‰“卡扣款
     */
    @ApiModelProperty("忘记打卡扣款")
    @Excel(name = "忘记打卡扣款")
    private BigDecimal forgetClockDeduct;
    /**
     * ç»©æ•ˆå¾—分
     */
    @ApiModelProperty("绩效得分")
    @Excel(name = "绩效得分")
    private BigDecimal performanceScore;
    /**
     * ç»©æ•ˆå·¥èµ„
     */
    @ApiModelProperty("绩效工资")
    @Excel(name = "绩效工资")
    private BigDecimal performancePay;
    /**
     * åº”发合计
     */
    @ApiModelProperty("应发合计")
    @Excel(name = "应发合计")
    private BigDecimal payableWages;
    /**
     * ç¤¾ä¿ä¸ªäºº
     */
    @ApiModelProperty("社保个人")
    @Excel(name = "社保个人")
    private BigDecimal socialSecurityIndividuals;
    /**
     * ç¤¾ä¿å…¬å¸
     */
    @ApiModelProperty("社保公司")
    @Excel(name = "社保公司")
    private BigDecimal socialSecurityCompanies;
    /**
     * ç¤¾ä¿åˆè®¡
     */
    @ApiModelProperty("社保合计")
    @Excel(name = "社保合计")
    private BigDecimal socialSecurityTotal;
    /**
     * å…¬ç§¯é‡‘合计
     */
    @ApiModelProperty("公积金合计")
    @Excel(name = "公积金合计")
    private BigDecimal providentFundTotal;
    /**
     * å…¬ç§¯é‡‘公司
     */
    @ApiModelProperty("公积金公司")
    @Excel(name = "公积金公司")
    private BigDecimal providentFundCompany;
    /**
     * å…¬ç§¯é‡‘个人
     */
    @ApiModelProperty("公积金个人")
    @Excel(name = "公积金个人")
    private BigDecimal providentFundIndividuals;
    /**
     * åº”税工资
     */
    @ApiModelProperty("应税工资")
    @Excel(name = "应税工资")
    private BigDecimal taxableWaget;
    /**
     * ä¸ªäººæ‰€å¾—税
     */
    @ApiModelProperty("个人所得税")
    @Excel(name = "个人所得税")
    private BigDecimal personalIncomeTax;
    /**
     * å®žå‘工资
     */
    @ApiModelProperty("实发工资")
    @Excel(name = "实发工资")
    private BigDecimal actualWages;
    /**
     * åˆ›å»ºè€…
     */
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    /**
     * åˆ›å»ºæ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /**
     * ä¿®æ”¹è€…
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    /**
     * ä¿®æ”¹æ—¶é—´
     */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    /**
     * ç§Ÿæˆ·ID
     */
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
main-business/src/main/java/com/ruoyi/business/entity/OfficialInventory.java
@@ -38,6 +38,12 @@
    private Long supplierId;
    /**
     * ç…¤æ–™ç±»åž‹ 1-成品 2-原料
     */
    @TableField(value = "type")
    private Integer type;
    /**
     * ç…¤ç§
     */
    @TableField(value = "coal_id")
main-business/src/main/java/com/ruoyi/business/entity/PendingInventory.java
@@ -55,6 +55,11 @@
    @TableField(value = "coal_id")
    private Long coalId;
    /**
     * ç…¤æ–™ç±»åž‹ 1-成品 2-原料
     */
    @TableField(value = "type")
    private Integer type;
    /**
     * å•位
     */
    @TableField(value = "unit")
main-business/src/main/java/com/ruoyi/business/entity/Production.java
@@ -82,4 +82,16 @@
     */
    @TableField(value = "production_date")
    private LocalDate productionDate;
    /**
     * ç…¤æ–™ç±»åž‹(1-成品 2-原料)
     */
    @TableField(value = "type")
    private Integer type;
    /**
     * çŠ¶æ€ï¼ˆ1-待排产 2-排产中 3-已排产)
     */
    @TableField(value = "status")
    private Integer status;
}
main-business/src/main/java/com/ruoyi/business/entity/ProductionScheduling.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,102 @@
package com.ruoyi.business.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.core.domain.MyBaseEntity;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.Date;
/**
 * @author :yys
 * @date : 2025/8/25 16:28
 */
@Data
@TableName("production_scheduling")
public class ProductionScheduling extends MyBaseEntity {
    private static final long serialVersionUID = 1L;
    /**
     * ä¸»é”®ID
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     *  ç”Ÿäº§æ˜Žç»†id
     */
    @TableField(value = "production_id")
    private Long productionId;
    /**
     * ç…¤ç§ID
     */
    @TableField(value = "coal_id")
    private Long coalId;
    /**
     * æ€»æ•°é‡
     */
    @TableField(exist = false)
    private BigDecimal productionQuantity;
    /**
     * æŽ’产数量
     */
    @TableField(value = "scheduling_num")
    private BigDecimal schedulingNum;
    /**
     * å…¥åº“数量
     */
    @TableField(value = "success_num")
    private BigDecimal successNum;
    /**
     * ç…¤æ–™ç±»åž‹ï¼ˆ1-成品 2-原料)
     */
    @TableField(value = "type")
    private Integer type;
    /**
     *状态(1-待生产 2-生产中 3-已报工)
     */
    @TableField(value = "status")
    private Integer status;
    /**
     * å•位
     */
    @TableField(value = "unit")
    private String unit;
    /**
     * å·¥åºï¼ˆå­—典)
     */
    @TableField(value = "process")
    private String process;
    /**
     * å·¥æ—¶å®šé¢
     */
    @TableField(value = "work_hours")
    private BigDecimal workHours;
    /**
     * æŽ’产日期
     */
    @TableField(value = "scheduling_date")
    @JsonFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date schedulingDate;
    /**
     * æŽ’产人id
     */
    @TableField(value = "scheduling_user_id")
    private Long schedulingUserId;
    /**
     * æŽ’产人名称
     */
    @TableField(value = "scheduling_user_name")
    private String schedulingUserName;
}
main-business/src/main/java/com/ruoyi/business/entity/PurchaseRegistration.java
@@ -93,4 +93,10 @@
     */
    @TableField(value = "freight")
    private BigDecimal freight;
    /**
     * ç±»åž‹ï¼ˆ1-成品,2-原料)
     */
    @TableField(value = "type")
    private Integer type;
}
main-business/src/main/java/com/ruoyi/business/entity/StaffJoinLeaveRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,156 @@
package com.ruoyi.business.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.business.annotation.Excel;
import com.ruoyi.business.dto.DateQueryDto;
import io.swagger.annotations.ApiModelProperty;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * äººå‘˜ç®¡ç†--新增入职/离职
 * staff_join_leave_record
 */
@TableName(value = "staff_join_leave_record")
@Data
public class StaffJoinLeaveRecord extends DateQueryDto implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * çŠ¶æ€(0:离职;1:入职)
     */
    @NotBlank(message = "员工状态不能为空!!!!!!!!")
    @Excel(name = "状态",readConverterExp = "0=离职,1=入职")
    private Integer staffState;
    /**
     * å‘˜å·¥ç¼–号
     */
    @Excel(name = "员工编号")
    private String staffNo;
    /**
     * å‘˜å·¥å§“名
     */
    @Excel(name = "员工姓名")
    private String staffName;
    /**
     * æ€§åˆ«
     */
    @Excel(name = "性别")
    private String sex;
    /**
     * ç±è´¯
     */
    @Excel(name = "籍贯")
    private String nativePlace;
    /**
     * å²—位
     */
    @Excel(name = "岗位")
    private String postJob;
    /**
     * å®¶åº­ä½å€
     */
    @Excel(name = "家庭住址")
    private String adress;
    /**
     * ç¬¬ä¸€å­¦åކ
     */
    @Excel(name = "第一学历")
    private String firstStudy;
    /**
     * ä¸“业
     */
    @Excel(name = "专业")
    private String profession;
    /**
     * èº«ä»½è¯å·ç 
     */
    @Excel(name = "身份证号码")
    private String identityCard;
    /**
     * å¹´é¾„
     */
    @Excel(name = "年龄")
    private String age;
    /**
     * è”系电话
     */
    @Excel(name = "联系电话")
    private String phone;
    /**
     * ç´§æ€¥è”系人
     */
    @Excel(name = "紧急联系人")
    private String emergencyContact;
    /**
     * ç´§æ€¥è”系人电话
     */
    @Excel(name = "紧急联系人电话")
    private String emergencyContactPhone;
    /**
     * åˆåŒå¹´é™
     */
    @Excel(name = "合同年限")
    private String contractTerm;
    /**
     * åˆåŒå¼€å§‹æ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "合同开始日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date contractStartTime;
    /**
     * åˆåŒç»“束日期
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "合同结束日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date contractEndTime;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
main-business/src/main/java/com/ruoyi/business/entity/StaffOnJob.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,148 @@
package com.ruoyi.business.entity;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.business.dto.DateQueryDto;
import com.ruoyi.business.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Date;
/**
 * äººå‘˜ç®¡ç†--员工台账/合同管理
 * staff_on_job
 */
@TableName(value = "staff_on_job")
@Data
public class StaffOnJob extends DateQueryDto implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * åºå·
     */
    @TableId(type = IdType.AUTO)
    private Long id;
    /**
     * çŠ¶æ€(0:离职;1:在职)
     */
    @Excel(name = "状态",readConverterExp = "0=离职,1=在职")
    private Integer staffState;
    /**
     * å‘˜å·¥ç¼–号
     */
    @Excel(name = "员工编号", type = Excel.Type.EXPORT, cellType = Excel.ColumnType.STRING)
    private String staffNo;
    /**
     * å‘˜å·¥å§“名
     */
    @Excel(name = "员工姓名")
    private String staffName;
    /**
     * æ€§åˆ«
     */
    @Excel(name = "性别")
    private String sex;
    /**
     * ç±è´¯
     */
    @Excel(name = "籍贯")
    private String nativePlace;
    /**
     * å²—位
     */
    @Excel(name = "岗位")
    private String postJob;
    /**
     * å®¶åº­ä½å€
     */
    @Excel(name = "家庭住址")
    private String adress;
    /**
     * ç¬¬ä¸€å­¦åކ
     */
    @Excel(name = "第一学历")
    private String firstStudy;
    /**
     * ä¸“业
     */
    @Excel(name = "专业")
    private String profession;
    /**
     * èº«ä»½è¯å·ç 
     */
    @Excel(name = "身份证号码")
    private String identityCard;
    /**
     * å¹´é¾„
     */
    @Excel(name = "年龄")
    private String age;
    /**
     * è”系电话
     */
    @Excel(name = "联系电话")
    private String phone;
    /**
     * ç´§æ€¥è”系人
     */
    @Excel(name = "紧急联系人")
    private String emergencyContact;
    /**
     * ç´§æ€¥è”系人电话
     */
    @Excel(name = "紧急联系人电话")
    private String emergencyContactPhone;
    /**
     * åˆåŒå¹´é™
     */
    @Excel(name = "合同年限")
    private String contractTerm;
    /**
     * åˆåŒåˆ°æœŸæ—¥æœŸ
     */
    @JsonFormat(pattern = "yyyy-MM-dd")
    @Excel(name = "合同到期日期", width = 30, dateFormat = "yyyy-MM-dd")
    private Date contractExpireTime;
    @ApiModelProperty(value = "创建时间")
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @ApiModelProperty(value = "创建用户")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty(value = "修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty(value = "修改用户")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
    @ApiModelProperty(value = "租户ID")
    @TableField(fill = FieldFill.INSERT)
    private Long tenantId;
}
main-business/src/main/java/com/ruoyi/business/mapper/AccountFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.ruoyi.business.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.AccountFile;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@Mapper
public interface AccountFileMapper extends BaseMapper<AccountFile> {
    IPage<AccountFile> accountFileListPage(Page page, @Param("accountFile") AccountFile accountFile);
}
main-business/src/main/java/com/ruoyi/business/mapper/CompensationPerformanceMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.business.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.CompensationPerformance;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/8/8 9:54
 */
public interface CompensationPerformanceMapper extends BaseMapper<CompensationPerformance> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param compensationPerformance
     * @return
     */
    IPage<CompensationPerformance> listPage(Page page,@Param("req") CompensationPerformance compensationPerformance);
}
main-business/src/main/java/com/ruoyi/business/mapper/ProductionSchedulingMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.business.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.ProductionScheduling;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
 * @author :yys
 * @date : 2025/8/25 16:35
 */
@Mapper
public interface ProductionSchedulingMapper extends BaseMapper<ProductionScheduling> {
    /**
     * æŸ¥è¯¢åˆ—表
     *
     * @param page
     * @param productionScheduling
     * @return
     */
    IPage<ProductionScheduling> listPage(Page<ProductionScheduling> page,@Param("req") ProductionScheduling productionScheduling);
}
main-business/src/main/java/com/ruoyi/business/mapper/StaffJoinLeaveRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.business.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.StaffJoinLeaveRecord;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface StaffJoinLeaveRecordMapper extends BaseMapper<StaffJoinLeaveRecord> {
    IPage<StaffJoinLeaveRecord> staffJoinLeaveRecordListPage(Page page, @Param("staffJoinLeaveRecord") StaffJoinLeaveRecord staffJoinLeaveRecord);
    List<StaffJoinLeaveRecord> staffJoinLeaveRecordList(@Param("staffJoinLeaveRecord") StaffJoinLeaveRecord staffJoinLeaveRecord);
    List<StaffJoinLeaveRecord> staffOnJobList();
}
main-business/src/main/java/com/ruoyi/business/mapper/StaffOnJobMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.business.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.business.entity.StaffOnJob;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
@Mapper
public interface StaffOnJobMapper extends BaseMapper<StaffOnJob> {
    IPage<StaffOnJob> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJob staffOnJob);
    List<StaffOnJob> staffOnJobList(@Param("staffOnJob") StaffOnJob staffOnJob);
}
main-business/src/main/java/com/ruoyi/business/other/controller/TempFileController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,32 @@
package com.ruoyi.business.other.controller;
import com.ruoyi.business.other.service.TempFileService;
import com.ruoyi.common.core.domain.AjaxResult;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/file")
@AllArgsConstructor
public class TempFileController {
    private TempFileService tempFileService;
    @PostMapping("/upload")
    public AjaxResult uploadFile(MultipartFile file, Integer type) {
        try {
            return AjaxResult.success(tempFileService.uploadFile(file, type));
        } catch (Exception e) {
            return AjaxResult.error(e.getMessage());
        }
    }
}
main-business/src/main/java/com/ruoyi/business/other/mapper/CommonFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.business.other.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.business.other.pojo.CommonFile;
public interface CommonFileMapper extends BaseMapper<CommonFile> {
}
main-business/src/main/java/com/ruoyi/business/other/mapper/TempFileMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
package com.ruoyi.business.other.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.ruoyi.business.other.pojo.TempFile;
public interface TempFileMapper extends BaseMapper<TempFile> {
}
main-business/src/main/java/com/ruoyi/business/other/pojo/CommonFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
package com.ruoyi.business.other.pojo;
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
/**
 * é€šç”¨é™„件上传表
 */
@Data
@TableName("common_file")
public class CommonFile {
    private static final long serialVersionUID = 1L;
    @TableId(type = IdType.AUTO)
    private Long id;
    /** å…³è”表主键D */
    private Long commonId;
    /** æ–‡ä»¶åç§° */
    private String name;
    /** æ–‡ä»¶è·¯å¾„ */
    private String url;
    /** å…³è”表 */
    private Integer type;
    /** åˆ›å»ºæ—¶é—´ */
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    /** æ›´æ–°æ—¶é—´ */
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}
main-business/src/main/java/com/ruoyi/business/other/pojo/TempFile.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.business.other.pojo;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("temp_file")
public class TempFile {
    private static final long serialVersionUID = 1L;
    @TableId
    private String tempId;         // ä¸´æ—¶æ–‡ä»¶ID(UUID)
    private String originalName;   // åŽŸå§‹æ–‡ä»¶å
    private String tempPath;       // ä¸´æ—¶å­˜å‚¨è·¯å¾„
    private LocalDateTime expireTime; // è¿‡æœŸæ—¶é—´
    private Integer type;       // å…³è”表类型
}
main-business/src/main/java/com/ruoyi/business/other/service/TempFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
package com.ruoyi.business.other.service;
import com.ruoyi.business.other.pojo.TempFile;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
public interface TempFileService {
    TempFile uploadFile(MultipartFile file, Integer type) throws IOException;
}
main-business/src/main/java/com/ruoyi/business/other/service/impl/TempFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,183 @@
package com.ruoyi.business.other.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.other.mapper.CommonFileMapper;
import com.ruoyi.business.other.mapper.TempFileMapper;
import com.ruoyi.business.other.pojo.CommonFile;
import com.ruoyi.business.other.pojo.TempFile;
import com.ruoyi.business.other.service.TempFileService;
import com.ruoyi.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FilenameUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.UUID;
@Service
@Slf4j
public class TempFileServiceImpl extends ServiceImpl<TempFileMapper, TempFile> implements TempFileService {
    @Autowired
    private TempFileMapper tempFileMapper;
    @Autowired
    private CommonFileMapper commonFileMapper;
    @Value("${file.upload-dir}")
    private String uploadDir;
    @Value("${file.temp-dir}")
    private String tempDir;
    // ä¸Šä¼ åˆ°ä¸´æ—¶ç›®å½•
    @Override
    public TempFile uploadFile(MultipartFile file,Integer type) throws IOException {
        // 1. ç”Ÿæˆä¸´æ—¶æ–‡ä»¶ID和路径
        String tempId = UUID.randomUUID().toString();
        String originalFilename = file.getOriginalFilename();
        if(originalFilename == null) throw new IOException("文件名不能为空");
//        URLEncoder urlEncoder = new URLEncoder();
//        String encodedFilename = urlEncoder.encode(originalFilename, StandardCharsets.UTF_8);
//        encodedFilename = encodedFilename.replaceAll("%2E",".");
//        Path tempFilePath = Paths.get(tempDir, tempId + "_" + encodedFilename);
        Path tempFilePath = Paths.get(tempDir, tempId + "_" + file.getOriginalFilename());
        // 2. ç¡®ä¿ç›®å½•存在
        Path parentDir = tempFilePath.getParent();
        if (parentDir != null && !Files.exists(parentDir)) {
            try {
                // é€’归创建目录并检查结果
                Files.createDirectories(parentDir);
            } catch (IOException e) {
                log.error("创建目录失败: {}", parentDir, e);
                throw new IOException("无法创建目录: " + parentDir, e);
            }
        }
//        if (parentDir != null) {
//            Files.createDirectories(parentDir); // é€’归创建目录
//        }
        // 3. ä¿å­˜æ–‡ä»¶åˆ°ä¸´æ—¶ç›®å½•
        file.transferTo(tempFilePath.toFile());
        // 4. ä¿å­˜ä¸´æ—¶æ–‡ä»¶è®°å½•
        TempFile tempFileRecord = new TempFile();
        tempFileRecord.setTempId(tempId);
        tempFileRecord.setOriginalName(file.getOriginalFilename());
        tempFileRecord.setTempPath(tempFilePath.toString());
        tempFileRecord.setExpireTime(LocalDateTime.now().plusHours(2)); // 2小时后过期
        tempFileRecord.setType(type);
        tempFileMapper.insert(tempFileRecord);
        return tempFileRecord;
    }
    /**
     * å°†ä¸´æ—¶æ–‡ä»¶è¿ç§»åˆ°æ­£å¼ç›®å½•
     *
     * @param businessId  ä¸šåŠ¡ID(销售台账ID)
     * @param tempFileIds ä¸´æ—¶æ–‡ä»¶ID列表
     * @param fileType     æ–‡ä»¶ç±»åž‹(来自FileNameType)
     * @throws IOException æ–‡ä»¶æ“ä½œå¼‚常
     */
    public void migrateTempFilesToFormal(Long businessId, List<String> tempFileIds, Integer fileType) throws IOException {
        if (com.baomidou.mybatisplus.core.toolkit.CollectionUtils.isEmpty(tempFileIds)) {
            return;
        }
        // æž„建正式目录路径(按业务类型和日期分组)
        String formalDir = uploadDir + LocalDate.now().format(DateTimeFormatter.ISO_LOCAL_DATE);
        Path formalDirPath = Paths.get(formalDir);
        // ç¡®ä¿æ­£å¼ç›®å½•存在(递归创建)
        if (!Files.exists(formalDirPath)) {
            Files.createDirectories(formalDirPath);
        }
        for (String tempFileId : tempFileIds) {
            // æŸ¥è¯¢ä¸´æ—¶æ–‡ä»¶è®°å½•
            TempFile tempFile = tempFileMapper.selectById(tempFileId);
            if (tempFile == null) {
                log.warn("临时文件不存在,跳过处理: {}", tempFileId);
                continue;
            }
            // æž„建正式文件名(包含业务ID和时间戳,避免冲突)
            String originalFilename = tempFile.getOriginalName();
            String fileExtension = FilenameUtils.getExtension(originalFilename);
            String formalFilename = businessId + "_" +
                    System.currentTimeMillis() + "_" +
                    UUID.randomUUID().toString().substring(0, 8) +
                    (StringUtils.hasText(fileExtension) ? "." + fileExtension : "");
            Path formalFilePath = formalDirPath.resolve(formalFilename);
            try {
                // æ‰§è¡Œæ–‡ä»¶è¿ç§»ï¼ˆä½¿ç”¨åŽŸå­æ“ä½œç¡®ä¿å®‰å…¨æ€§ï¼‰
                Files.move(
                        Paths.get(tempFile.getTempPath()),
                        formalFilePath,
                        StandardCopyOption.REPLACE_EXISTING,
                        StandardCopyOption.ATOMIC_MOVE
                );
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
                // æ›´æ–°æ–‡ä»¶è®°å½•(关联到业务ID)
                CommonFile fileRecord = new CommonFile();
                fileRecord.setCommonId(businessId);
                fileRecord.setName(originalFilename);
                fileRecord.setUrl(formalFilePath.toString());
                fileRecord.setCreateTime(LocalDateTime.now());
                fileRecord.setType(fileType);
                commonFileMapper.insert(fileRecord);
                // åˆ é™¤ä¸´æ—¶æ–‡ä»¶è®°å½•
                tempFileMapper.deleteById(tempFile);
                log.info("文件迁移成功: {} -> {}", tempFile.getTempPath(), formalFilePath);
            } catch (IOException e) {
                log.error("文件迁移失败: {}", tempFile.getTempPath(), e);
                // å¯é€‰æ‹©å›žæ»šäº‹åŠ¡æˆ–è®°å½•å¤±è´¥æ–‡ä»¶
                throw new IOException("文件迁移异常", e);
            }
        }
    }
    @Scheduled(cron = "0 0 3 * * ?") // æ¯å¤©å‡Œæ™¨3点执行
    public void cleanupExpiredTempFiles() {
        LambdaQueryWrapper<TempFile> wrapper = new LambdaQueryWrapper<>();
        wrapper.lt(TempFile::getExpireTime, LocalDateTime.now()); // expireTime < å½“前时间
        List<TempFile> expiredFiles = tempFileMapper.selectList(wrapper);
        for (TempFile file : expiredFiles) {
            try {
                // åˆ é™¤ç‰©ç†æ–‡ä»¶
                Files.deleteIfExists(Paths.get(file.getTempPath()));
                // åˆ é™¤æ•°æ®åº“记录
                tempFileMapper.deleteById(file);
                log.info("已清理过期临时文件: {}", file.getTempPath());
            } catch (IOException e) {
                log.error("删除文件失败: {}", file.getTempPath(), e);
                // å¯é€‰æ‹©è®°å½•失败日志或重试
            }
        }
        log.info("过期临时文件清理完成,共清理 {} ä¸ªæ–‡ä»¶", expiredFiles.size());
    }
}
main-business/src/main/java/com/ruoyi/business/service/AccountFileService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,14 @@
package com.ruoyi.business.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.business.entity.AccountFile;
public interface AccountFileService extends IService<AccountFile> {
    IPage<AccountFile> accountFileListPage(Page page, AccountFile accountFile);
}
main-business/src/main/java/com/ruoyi/business/service/CompensationPerformanceService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,22 @@
package com.ruoyi.business.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.business.entity.CompensationPerformance;
/**
 * @author :yys
 * @date : 2025/8/8 9:55
 */
public interface CompensationPerformanceService extends IService<CompensationPerformance> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param compensationPerformance
     * @return
     */
    IPage<CompensationPerformance> listPage(Page page, CompensationPerformance compensationPerformance);
}
main-business/src/main/java/com/ruoyi/business/service/IStaffJoinLeaveRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,23 @@
package com.ruoyi.business.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.business.entity.StaffJoinLeaveRecord;
import jakarta.servlet.http.HttpServletResponse;
import java.util.List;
public interface IStaffJoinLeaveRecordService extends IService<StaffJoinLeaveRecord> {
    IPage<StaffJoinLeaveRecord> staffJoinLeaveRecordListPage(Page page, StaffJoinLeaveRecord staffJoinLeaveRecord);
    void staffJoinLeaveRecordExport(HttpServletResponse response, StaffJoinLeaveRecord staffJoinLeaveRecord);
    int add(StaffJoinLeaveRecord staffJoinLeaveRecord);
    int delStaffJoinLeaveRecord(List<Integer> ids);
    int updateStaffJoinLeaveRecord(StaffJoinLeaveRecord staffJoinLeaveRecord);
}
main-business/src/main/java/com/ruoyi/business/service/IStaffOnJobService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,27 @@
package com.ruoyi.business.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.business.entity.StaffJoinLeaveRecord;
import com.ruoyi.business.entity.StaffOnJob;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
public interface IStaffOnJobService extends IService<StaffOnJob> {
    IPage<StaffOnJob> staffOnJobListPage(Page page, StaffOnJob staffOnJob);
    List<StaffJoinLeaveRecord> staffOnJobDetail(String staffNo);
    void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob);
    List<StaffJoinLeaveRecord> staffOnJobList();
    Boolean importData(MultipartFile file);
}
main-business/src/main/java/com/ruoyi/business/service/ProductionSchedulingService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.ruoyi.business.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.business.entity.ProductionScheduling;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/8/25 16:37
 */
public interface ProductionSchedulingService extends IService<ProductionScheduling> {
    /**
     * åˆ†é¡µæŸ¥è¯¢
     *
     * @param page
     * @param productionScheduling
     * @return
     */
    IPage<ProductionScheduling> listPage(Page<ProductionScheduling> page, ProductionScheduling productionScheduling);
    boolean addProductionScheduling(List<ProductionScheduling> productionScheduling);
    boolean work(ProductionScheduling productionScheduling);
}
main-business/src/main/java/com/ruoyi/business/service/impl/AccountFileServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.ruoyi.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.entity.AccountFile;
import com.ruoyi.business.mapper.AccountFileMapper;
import com.ruoyi.business.service.AccountFileService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@AllArgsConstructor
@Service
public class AccountFileServiceImpl extends ServiceImpl<AccountFileMapper, AccountFile> implements AccountFileService {
    private AccountFileMapper accountFileMapper;
    @Override
    public IPage<AccountFile> accountFileListPage(Page page, AccountFile accountFile) {
        return accountFileMapper.accountFileListPage(page,accountFile);
    }
}
main-business/src/main/java/com/ruoyi/business/service/impl/CompensationPerformanceServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,30 @@
package com.ruoyi.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.mapper.CompensationPerformanceMapper;
import com.ruoyi.business.entity.CompensationPerformance;
import com.ruoyi.business.service.CompensationPerformanceService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * @author :yys
 * @date : 2025/8/8 9:55
 */
@Service
@Slf4j
public class CompensationPerformanceServiceImpl extends ServiceImpl<CompensationPerformanceMapper, CompensationPerformance> implements CompensationPerformanceService {
    @Autowired
    private CompensationPerformanceMapper compensationPerformanceMapper;
    @Override
    public IPage<CompensationPerformance> listPage(Page page, CompensationPerformance compensationPerformance) {
        IPage<CompensationPerformance> compensationPerformanceIPage = compensationPerformanceMapper.listPage(page, compensationPerformance);
        return compensationPerformanceIPage;
    }
}
main-business/src/main/java/com/ruoyi/business/service/impl/PendingInventoryServiceImpl.java
@@ -19,6 +19,7 @@
import com.ruoyi.basic.service.CoalFieldService;
import com.ruoyi.basic.service.CoalPlanService;
import com.ruoyi.basic.service.CoalValueService;
import com.ruoyi.business.constant.InventoryRecordConstant;
import com.ruoyi.business.dto.PendingInventoryDto;
import com.ruoyi.business.entity.OfficialInventory;
import com.ruoyi.business.entity.PendingInventory;
@@ -290,6 +291,7 @@
                officialInventory.setPendingId(pendingInventoryDto.getPId());
                officialInventory.setInventoryQuantity(quantity);
                officialInventory.setRegistrantId(1L);
                officialInventory.setType(pendingInventory.getType());
                officialInventory.setSupplierId(pendingInventoryDto.getSupplierId());
                officialInventoryMapper.insert(officialInventory);
            } else {
main-business/src/main/java/com/ruoyi/business/service/impl/ProductionMasterServiceImpl.java
@@ -173,7 +173,7 @@
        batchInsertInventories(masterId, dto.getProductionInventoryList());
        // æ’入待入库数据
        insertPendingInventory(dto.getProductionList());
//        insertPendingInventory(dto.getProductionList());
        return 1;
    }
@@ -263,6 +263,7 @@
            BeanUtils.copyProperties(p, copy);
            copy.setId(null);
            copy.setProductionMasterId(masterId);
            copy.setStatus(1);
            productionMapper.insert(copy);
        }
    }
@@ -283,7 +284,7 @@
    /**
     * å°†åŠ å·¥äº§ç”Ÿçš„äº§å“è®°å½•åˆ°å¾…å…¥åº“è¡¨
     */
    private void insertPendingInventory(List<Production> list) {
    public void insertPendingInventory(List<Production> list) {
        LocalDate currentDate = LocalDate.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
        String formattedDate = currentDate.format(formatter);
@@ -402,20 +403,20 @@
        }
        // æ‰¹é‡æ›´æ–°å®˜æ–¹åº“å­˜
        for (Map.Entry<Long, BigDecimal> entry : inventoryAdjustMap.entrySet()) {
            OfficialInventory official = officialInventoryMapper.selectById(entry.getKey());
            if (official == null) {
                throw new BaseException("官方库存不存在,ID: " + entry.getKey());
            }
            // ä½¿ç”¨çº¿ç¨‹å®‰å…¨çš„BigDecimal操作
            official.setInventoryQuantity(
                    Optional.ofNullable(official.getInventoryQuantity())
                            .orElse(BigDecimal.ZERO)
                            .add(entry.getValue())
            );
            officialInventoryMapper.updateById(official);
        }
//        for (Map.Entry<Long, BigDecimal> entry : inventoryAdjustMap.entrySet()) {
//            OfficialInventory official = officialInventoryMapper.selectById(entry.getKey());
//            if (official == null) {
//                throw new BaseException("官方库存不存在,ID: " + entry.getKey());
//            }
//
//            // ä½¿ç”¨çº¿ç¨‹å®‰å…¨çš„BigDecimal操作
//            official.setInventoryQuantity(
//                    Optional.ofNullable(official.getInventoryQuantity())
//                            .orElse(BigDecimal.ZERO)
//                            .add(entry.getValue())
//            );
//            officialInventoryMapper.updateById(official);
//        }
        // æ‰¹é‡åˆ é™¤ç”Ÿäº§åº“å­˜
        if (!productionIdsToDelete.isEmpty()) {
main-business/src/main/java/com/ruoyi/business/service/impl/ProductionSchedulingServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,103 @@
package com.ruoyi.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.entity.Production;
import com.ruoyi.business.entity.ProductionScheduling;
import com.ruoyi.business.mapper.ProductionMapper;
import com.ruoyi.business.mapper.ProductionSchedulingMapper;
import com.ruoyi.business.service.ProductionSchedulingService;
import com.ruoyi.common.core.domain.entity.SysUser;
import com.ruoyi.system.mapper.SysUserMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
/**
 * @author :yys
 * @date : 2025/8/25 16:38
 */
@Service
@Slf4j
public class ProductionSchedulingServiceImpl extends ServiceImpl<ProductionSchedulingMapper, ProductionScheduling> implements ProductionSchedulingService {
    @Autowired
    private ProductionSchedulingMapper productionSchedulingMapper;
    @Autowired
    private ProductionMapper productionMapper;
    @Autowired
    private SysUserMapper sysUserMapper;
    @Autowired
    private ProductionMasterServiceImpl productionMasterService;
    @Override
    public IPage<ProductionScheduling> listPage(Page<ProductionScheduling> page, ProductionScheduling productionScheduling) {
        return productionSchedulingMapper.listPage(page, productionScheduling);
    }
    @Override
    public boolean addProductionScheduling(List<ProductionScheduling> productionScheduling) {
        if (CollectionUtils.isEmpty(productionScheduling)) {
            return false;
        }
        BigDecimal reduce = productionScheduling.stream()
                .map(ProductionScheduling::getSchedulingNum)
                .reduce(BigDecimal.ZERO, BigDecimal::add);
        if(reduce.compareTo(productionScheduling.get(0).getProductionQuantity()) < 0){
            return false;
        }
        Production production = productionMapper.selectById(productionScheduling.get(0).getProductionId());
        if(production == null){
            throw new RuntimeException("生产订单为空");
        }
        production.setStatus(2);
        if(reduce.compareTo(productionScheduling.get(0).getProductionQuantity()) == 0){
            production.setStatus(3);
        }
        productionMapper.updateById(production);
        for (ProductionScheduling scheduling : productionScheduling) {
            SysUser sysUser = sysUserMapper.selectUserById(scheduling.getSchedulingUserId());
            if(sysUser == null) throw new RuntimeException("排产人员不存在");
            scheduling.setStatus(1);
            scheduling.setSchedulingUserName(sysUser.getNickName());
            productionSchedulingMapper.insert(scheduling);
        }
        return true;
    }
    @Override
    public boolean work(ProductionScheduling productionScheduling) {
        ProductionScheduling productionScheduling1 = productionSchedulingMapper.selectById(productionScheduling.getId());
        if(productionScheduling1 == null){
            throw new RuntimeException("生产报工不存在");
        }
        Production production = productionMapper.selectById(productionScheduling1.getProductionId());
        if(production == null){
            throw new RuntimeException("生产订单为空");
        }
        production.setProductionQuantity(productionScheduling.getSuccessNum());
        production.setProducerId(productionScheduling.getSchedulingUserId());
        // å…¥åº“
        productionMasterService.insertPendingInventory(Arrays.asList(production));
        // ä¿®æ”¹æŠ¥å·¥è¡¨çš„入库数量
        productionScheduling1.setSuccessNum(productionScheduling1.getSuccessNum().add(productionScheduling.getSuccessNum()));
        productionScheduling1.setStatus(2);
        // å…¥åº“数量 == æŽ’产数量 åˆ™ä¿®æ”¹ç”Ÿäº§è®¢å•状态
        if(productionScheduling1.getSuccessNum().compareTo(productionScheduling1.getSchedulingNum()) == 0){
            productionScheduling1.setStatus(3);
        }
        productionSchedulingMapper.updateById(productionScheduling1);
        return true;
    }
}
main-business/src/main/java/com/ruoyi/business/service/impl/ProductionServiceImpl.java
@@ -11,6 +11,7 @@
import com.ruoyi.business.service.ProductionService;
import com.ruoyi.common.utils.bean.BeanUtils;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Objects;
@@ -27,6 +28,7 @@
@RequiredArgsConstructor
public class ProductionServiceImpl extends ServiceImpl<ProductionMapper, Production> implements ProductionService {
    @Autowired
    private ProductionMapper productionMapper;
    @Override
main-business/src/main/java/com/ruoyi/business/service/impl/PurchaseRegistrationServiceImpl.java
@@ -127,6 +127,7 @@
        pendingInventory.setPurchaseId(purchaseRegistration.getId());
        pendingInventory.setCoalId(purchaseRegistration.getCoalId());
        pendingInventory.setInventoryQuantity(purchaseRegistration.getPurchaseQuantity());
        pendingInventory.setType(purchaseRegistration.getType());
        return pendingInventory;
    }
main-business/src/main/java/com/ruoyi/business/service/impl/StaffJoinLeaveRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,168 @@
package com.ruoyi.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.entity.StaffJoinLeaveRecord;
import com.ruoyi.business.entity.StaffOnJob;
import com.ruoyi.business.mapper.StaffJoinLeaveRecordMapper;
import com.ruoyi.business.mapper.StaffOnJobMapper;
import com.ruoyi.business.service.IStaffJoinLeaveRecordService;
import com.ruoyi.common.exception.base.BaseException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
@Service
@AllArgsConstructor
@Transactional(rollbackFor = Exception.class)
public class StaffJoinLeaveRecordServiceImpl extends ServiceImpl<StaffJoinLeaveRecordMapper, StaffJoinLeaveRecord>  implements IStaffJoinLeaveRecordService {
    private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
    private StaffOnJobMapper staffOnJobMapper;
    //分页查询
    @Override
    public IPage<StaffJoinLeaveRecord> staffJoinLeaveRecordListPage(Page page, StaffJoinLeaveRecord staffJoinLeaveRecord) {
        return staffJoinLeaveRecordMapper.staffJoinLeaveRecordListPage(page,staffJoinLeaveRecord);
    }
    //导出
    @Override
    public void staffJoinLeaveRecordExport(HttpServletResponse response, StaffJoinLeaveRecord staffJoinLeaveRecord) {
        List<StaffJoinLeaveRecord> staffJoinLeaveRecords =staffJoinLeaveRecordMapper.staffJoinLeaveRecordList(staffJoinLeaveRecord);
        ExcelUtil<StaffJoinLeaveRecord> util = new ExcelUtil<StaffJoinLeaveRecord>(StaffJoinLeaveRecord.class);
        util.exportExcel(response, staffJoinLeaveRecords, staffJoinLeaveRecord.getStaffState()==0?"员工离职":"员工入职"+"导出");
    }
    //新增入职/离职
    @Override
    public int add(StaffJoinLeaveRecord staffJoinLeaveRecord) {
        String[] ignoreProperties = {"id"};//排除id属性
        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
        if (staffJoinLeaveRecord.getStaffState()==1){
            /*入职*/
            //(根据员工编号判断是否已经新增到在职表里面,如果已经有就更新,没有就新增)
            if (staffOnJobs.size()>0){
                StaffOnJob staffOnJob = staffOnJobs.get(0);
                //先比较到期日期,这里选用到期日期最久的
                if (staffJoinLeaveRecord.getContractEndTime().compareTo(staffOnJob.getContractExpireTime())>0) {
                    BeanUtils.copyProperties(staffJoinLeaveRecord,staffOnJob,ignoreProperties);
                    staffOnJobMapper.updateById(staffOnJob);
                }
            }else {
                StaffOnJob staffOnJob = new StaffOnJob();
                BeanUtils.copyProperties(staffJoinLeaveRecord,staffOnJob,ignoreProperties);
                staffOnJob.setContractExpireTime(staffJoinLeaveRecord.getContractEndTime());
                staffOnJobMapper.insert(staffOnJob);
            }
        }else {
            /*离职*/
            //根据员工编号找到对应的数据将状态变更
            if (staffOnJobs.size()>0){
                StaffOnJob staffOnJob = staffOnJobs.get(0);
                staffOnJob.setStaffState(staffJoinLeaveRecord.getStaffState());
                staffOnJobMapper.updateById(staffOnJob);
            }else {
                throw new BaseException("没有找到"+staffJoinLeaveRecord.getStaffNo()+"编号的员工,无法新增离职!!!");
            }
        }
        return staffJoinLeaveRecordMapper.insert(staffJoinLeaveRecord);
    }
    //删除入职/离职
    @Override
    public int delStaffJoinLeaveRecord(List<Integer> ids) {
        List<StaffJoinLeaveRecord> staffJoinLeaveRecords = staffJoinLeaveRecordMapper.selectBatchIds(ids);
        for (StaffJoinLeaveRecord staffJoinLeaveRecord : staffJoinLeaveRecords) {
            //先判断是入职还是离职
            if (staffJoinLeaveRecord.getStaffState()==1){
                /*入职*/
                //如果是入职,需要先根据员工编号判断该员工是否还有其他入职信息
                List<StaffJoinLeaveRecord> joinLeaveRecords = staffJoinLeaveRecordMapper.selectList(Wrappers.<StaffJoinLeaveRecord>lambdaQuery()
                        .eq(StaffJoinLeaveRecord::getStaffState, 1)
                        .eq(StaffJoinLeaveRecord::getStaffNo, staffJoinLeaveRecord.getStaffNo())
                        .ne(StaffJoinLeaveRecord::getId, staffJoinLeaveRecord.getId()));
                if (joinLeaveRecords.size()>0){
                    //还需要判断该员工是否有离职信息
                    List<StaffJoinLeaveRecord> leaveRecords = staffJoinLeaveRecordMapper.selectList(Wrappers.<StaffJoinLeaveRecord>lambdaQuery()
                            .eq(StaffJoinLeaveRecord::getStaffState, 0)
                            .eq(StaffJoinLeaveRecord::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
                    // å¦‚果有那在职表仅做更新不删除,如果没有其他入职信息,那么在职表需同步删除
                    if (leaveRecords.size()>0){
                        //如果有离职信息,判断离职数量和入职数量毕竟,如果入职数量大于离职
                        if (joinLeaveRecords.size()>leaveRecords.size()){
                            //该员工就还是在职
                            //先比较到期日期,这里选用到期日期最久的
                            Optional<StaffJoinLeaveRecord> max = joinLeaveRecords.stream().max(Comparator.comparing(StaffJoinLeaveRecord::getContractEndTime));
                            staffOnJobMapper.update(null,Wrappers.<StaffOnJob>lambdaUpdate()
                                    .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())
                                    .set(StaffOnJob::getContractTerm, max.get().getContractTerm())
                                    .set(StaffOnJob::getContractExpireTime, max.get().getContractEndTime()));
                        }else {
                            //该员工属于离职
                            staffOnJobMapper.update(null,Wrappers.<StaffOnJob>lambdaUpdate()
                                    .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())
                                    .set(StaffOnJob::getStaffState, 0));
                        }
                    }else {
                        //如果没有离职信息那么就比较到期日期,这里选用到期日期最久的
                        Optional<StaffJoinLeaveRecord> max = joinLeaveRecords.stream().max(Comparator.comparing(StaffJoinLeaveRecord::getContractEndTime));
                        staffOnJobMapper.update(null,Wrappers.<StaffOnJob>lambdaUpdate()
                                .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())
                                .set(StaffOnJob::getContractTerm, max.get().getContractTerm())
                                .set(StaffOnJob::getContractExpireTime, max.get().getContractEndTime()));
                    }
                }else {
                    staffOnJobMapper.delete(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo,staffJoinLeaveRecord.getStaffNo()));
                }
            }else {
                /*离职*/
                //先查询在职表是否有这个,如果有,就将该员工的状态变更为在职
                List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
                if (staffOnJobs.size()>0){
                    StaffOnJob staffOnJob = staffOnJobs.get(0);
                    staffOnJob.setStaffState(1);
                    staffOnJobMapper.updateById(staffOnJob);
                }else {
                    throw new BaseException("没有找到"+staffJoinLeaveRecord.getStaffNo()+"编号的员工,请检查是否有脏数据!!!");
                }
            }
            staffJoinLeaveRecordMapper.deleteById(staffJoinLeaveRecord);
        }
        return 0;
    }
    //修改入职/离职
    @Override
    public int updateStaffJoinLeaveRecord(StaffJoinLeaveRecord staffJoinLeaveRecord) {
        String[] ignoreProperties = {"id"};//排除id属性
        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo()));
        if (staffJoinLeaveRecord.getStaffState()==1){
            /*入职*/
            StaffOnJob job = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery()
                    .eq(StaffOnJob::getStaffNo, staffJoinLeaveRecord.getStaffNo())).get(0);
            //如果更改的合同到期时间更久则更新,如果没有就不用更新
            if (staffJoinLeaveRecord.getContractEndTime().compareTo(job.getContractExpireTime())>0) {
                BeanUtils.copyProperties(staffJoinLeaveRecord,job,ignoreProperties);
                staffOnJobMapper.updateById(job);
            }
        }else {
            /*离职*/
            //离职的编辑不会影响在职表
        }
        return staffJoinLeaveRecordMapper.updateById(staffJoinLeaveRecord);
    }
}
main-business/src/main/java/com/ruoyi/business/service/impl/StaffOnJobServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,71 @@
package com.ruoyi.business.service.impl;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.business.entity.StaffJoinLeaveRecord;
import com.ruoyi.business.entity.StaffOnJob;
import com.ruoyi.business.mapper.StaffJoinLeaveRecordMapper;
import com.ruoyi.business.mapper.StaffOnJobMapper;
import com.ruoyi.business.service.IStaffOnJobService;
import com.ruoyi.common.utils.poi.ExcelUtil;
import jakarta.servlet.http.HttpServletResponse;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@AllArgsConstructor
@Service
public class StaffOnJobServiceImpl extends ServiceImpl<StaffOnJobMapper, StaffOnJob>  implements IStaffOnJobService {
    private StaffOnJobMapper staffOnJobMapper;
    private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
    //在职员工台账分页查询
    @Override
    public IPage<StaffOnJob> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
        return staffOnJobMapper.staffOnJobListPage(page,staffOnJob);
    }
    //在职员工详情
    @Override
    public List<StaffJoinLeaveRecord> staffOnJobDetail(String staffNo) {
        return staffJoinLeaveRecordMapper.selectList(Wrappers.<StaffJoinLeaveRecord>lambdaQuery()
                .eq(StaffJoinLeaveRecord::getStaffState,1)
                .eq(StaffJoinLeaveRecord::getStaffNo,staffNo));
    }
    //在职员工导出
    @Override
    public void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob) {
        List<StaffOnJob> staffOnJobs = staffOnJobMapper.staffOnJobList(staffOnJob);
        ExcelUtil<StaffOnJob> util = new ExcelUtil<StaffOnJob>(StaffOnJob.class);
        util.exportExcel(response, staffOnJobs, "在职员工台账导出");
    }
    @Override
    public List<StaffJoinLeaveRecord> staffOnJobList() {
        return staffJoinLeaveRecordMapper.staffOnJobList();
    }
    @Override
    public Boolean importData(MultipartFile file) {
        try {
            ExcelUtil<StaffOnJob> util = new ExcelUtil<>(StaffOnJob.class);
            List<StaffOnJob> staffOnJobs = util.importExcel(file.getInputStream());
            return saveOrUpdateBatch(staffOnJobs);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}
main-business/src/main/resources/db/migration/postgresql/V20250603160101__create_table_purchase_registration.sql
@@ -21,7 +21,8 @@
    create_by                 VARCHAR(255),                      -- åˆ›å»ºäººç”¨æˆ·å
    create_time               TIMESTAMP WITHOUT TIME ZONE,       -- åˆ›å»ºæ—¶é—´ï¼Œé»˜è®¤å½“前时间
    update_by                 VARCHAR(255),                      -- æœ€åŽæ›´æ–°äººç”¨æˆ·å
    update_time               TIMESTAMP WITHOUT TIME ZONE        -- æœ€åŽæ›´æ–°æ—¶é—´ï¼Œé»˜è®¤å½“前时间
    update_time               TIMESTAMP WITHOUT TIME ZONE,        -- æœ€åŽæ›´æ–°æ—¶é—´ï¼Œé»˜è®¤å½“前时间
    type                      BIGINT,                              -- ç±»åž‹ï¼ˆ1-成品,2-原料)
);
-- ä¸ºè¡¨æ·»åŠ æ³¨é‡Š
@@ -46,4 +47,5 @@
COMMENT ON COLUMN purchase_registration.create_by IS '创建该记录的用户';
COMMENT ON COLUMN purchase_registration.create_time IS '记录创建时间';
COMMENT ON COLUMN purchase_registration.update_by IS '最后修改该记录的用户';
COMMENT ON COLUMN purchase_registration.update_time IS '记录最后更新时间';
COMMENT ON COLUMN purchase_registration.update_time IS '记录最后更新时间';
COMMENT ON COLUMN purchase_registration.type IS '类型(1-成品,2-原料)';
main-business/src/main/resources/db/migration/postgresql/V20250604101800__create_table_production.sql
@@ -13,6 +13,8 @@
    producer_id             BIGINT,                       -- ç”Ÿäº§äººid
    producer                VARCHAR(50),                       -- ç”Ÿäº§äºº
    production_date         DATE,                              -- ç”Ÿäº§æ—¥æœŸ
    type                    BIGINT,                                 -- ç…¤æ–™ç±»åž‹ 1-成品 2-原料
    status                  BIGINT,                           -- çŠ¶æ€ï¼ˆ1-待排产 2-已排产)
    deleted                 INT            NOT NULL DEFAULT 0, -- è½¯åˆ é™¤æ ‡å¿—:0=未删除,1=已删除
    create_by               VARCHAR(255),                      -- åˆ›å»ºäººç”¨æˆ·å
@@ -35,6 +37,8 @@
COMMENT ON COLUMN production.total_cost IS '总成本';
COMMENT ON COLUMN production.producer IS '生产人';
COMMENT ON COLUMN production.production_date IS '生产日期';
COMMENT ON COLUMN production.type IS '煤料类型 1-成品 2-原料';
COMMENT ON COLUMN production.status IS '状态(1-待排产 2-已排产)';
COMMENT ON COLUMN production.deleted IS '软删除标志,0=未删除,1=已删除';
COMMENT ON COLUMN production.create_by IS '创建该记录的用户';
main-business/src/main/resources/db/migration/postgresql/V20250604104500__create_table_pending_inventory.sql
@@ -18,6 +18,7 @@
    master_id                 BIGINT,                                 -- ç”Ÿäº§åŠ å·¥id
    purchase_id               BIGINT,                                 -- é‡‡è´­id
    coal_plan_id               BIGINT,                                 -- ç…¤è´¨æ–¹æ¡ˆid
    type               BIGINT,                                 -- ç…¤æ–™ç±»åž‹ 1-成品 2-原料
    deleted                   INTEGER      DEFAULT 0,                 -- è½¯åˆ é™¤æ ‡å¿—,0=未删除,1=已删除
    create_by                 VARCHAR(255),                           -- åˆ›å»ºè¯¥è®°å½•的用户
@@ -37,6 +38,7 @@
COMMENT ON COLUMN pending_inventory.price_including_tax IS '单价(含税)';
COMMENT ON COLUMN pending_inventory.total_price_including_tax IS '总价(含税)';
COMMENT ON COLUMN pending_inventory.registrant IS '登记人';
COMMENT ON COLUMN pending_inventory.type IS '煤料类型 1-成品 2-原料';
COMMENT ON COLUMN pending_inventory.registration_time IS '登记时间';
COMMENT ON COLUMN pending_inventory.price_excluding_tax IS '单价(不含税)';
COMMENT ON COLUMN pending_inventory.total_price_excluding_tax IS '总价(不含税)';
main-business/src/main/resources/db/migration/postgresql/V20250604111200__create_table_official_inventory.sql
@@ -12,7 +12,7 @@
    total_price_excluding_tax DECIMAL(10, 2) NOT NULL,           -- ä¸å«ç¨Žæ€»ä»·
    pending_replenishment     DECIMAL(10, 0),                    -- å¾…补库
    registrant_id             BIGINT         NOT NULL,           -- ç™»è®°äººid
    type                      VARCHAR(50),                       -- ç±»åž‹       1 é‡‡è´­/ 2 æ­£å¼   å…¥åº“
    type                      BIGINT,                            -- ç…¤æ–™ç±»åž‹       1 æˆå“/ 2 åŽŸæ–™
    pending_id                BIGINT,                            -- å¾…入库id
    coal_plan_id               BIGINT,                                 -- ç…¤è´¨æ–¹æ¡ˆid
    merge_id                  VARCHAR(255),                      -- åˆå¹¶id
@@ -37,6 +37,7 @@
COMMENT ON COLUMN official_inventory.price_including_tax IS '单价(含税)';
COMMENT ON COLUMN official_inventory.total_price_including_tax IS '总价(含税)';
COMMENT ON COLUMN official_inventory.pending_replenishment IS '待补库';
COMMENT ON COLUMN official_inventory.type IS '煤料类型       1 æˆå“/ 2 åŽŸæ–™';
COMMENT ON COLUMN official_inventory.registrant_id IS '登记人id';
COMMENT ON COLUMN official_inventory.registration_date IS '登记日期';
COMMENT ON COLUMN official_inventory.merge_id IS '合并id';
main-business/src/main/resources/db/migration/postgresql/V20250825111200__create_table_production_scheduling.sql
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,59 @@
-- åˆ›å»ºæ­£å¼åº“表
CREATE TABLE production_scheduling
(
    id BIGSERIAL PRIMARY KEY,  -- BIGSERIAL å¯¹åº” int8
    production_id int8 NOT NULL DEFAULT 0,
    coal_id                 BIGINT         NOT NULL DEFAULT 0, -- ç…¤ç§ID
    scheduling_num numeric(10,2),
    type int8,
    status int8,
    unit varchar(50),
    process varchar(50) NOT NULL,
    work_hours numeric(10,2) NOT NULL,
    scheduling_date date,
    scheduling_user_id int8,
    scheduling_user_name varchar(50),
    deleted int4 NOT NULL DEFAULT 0,
    create_by varchar(255) COLLATE "pg_catalog"."default",
    create_time timestamp(6),
    update_by varchar(255) COLLATE "pg_catalog"."default",
    success_num int8 DEFAULT 0,
    update_time timestamp(6)
);
COMMENT ON COLUMN "production_scheduling"."id" IS '主键ID';
COMMENT ON COLUMN "production_scheduling"."production_id" IS '生产明细id';
COMMENT ON COLUMN production_scheduling.coal_id IS '煤种ID';
COMMENT ON COLUMN "production_scheduling"."scheduling_num" IS '排产数量';
COMMENT ON COLUMN "production_scheduling"."unit" IS '单位';
COMMENT ON COLUMN "production_scheduling"."process" IS '工序(字典)';
COMMENT ON COLUMN "production_scheduling"."work_hours" IS '工时定额';
COMMENT ON COLUMN "production_scheduling"."scheduling_date" IS '排产日期';
COMMENT ON COLUMN "production_scheduling"."scheduling_user_id" IS '排产人id';
COMMENT ON COLUMN "production_scheduling"."scheduling_user_name" IS '排产人名称';
COMMENT ON COLUMN "production_scheduling"."deleted" IS '软删除标志,0=未删除,1=已删除';
COMMENT ON COLUMN "production_scheduling"."create_by" IS '创建该记录的用户';
COMMENT ON COLUMN "production_scheduling"."create_time" IS '记录创建时间';
COMMENT ON COLUMN "production_scheduling"."production_scheduling"."update_by" IS '最后修改该记录的用户';
COMMENT ON COLUMN "production_scheduling"."production_scheduling"."update_time" IS '记录最后更新时间';
COMMENT ON COLUMN "production_scheduling"."production_scheduling"."type" IS '煤料类型(1-成品 2-原料)';
COMMENT ON COLUMN "production_scheduling"."production_scheduling"."status" IS '状态(1-待生产 2-生产中 3-已报工)';
COMMENT ON COLUMN "production_scheduling"."production_scheduling"."success_num" IS '入库数量';
COMMENT ON TABLE "public"."production_scheduling" IS '生产报工表';
main-business/src/main/resources/mapper/AccountFileMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ruoyi.business.mapper.AccountFileMapper">
    <select id="accountFileListPage" resultType="com.ruoyi.business.entity.AccountFile">
        SELECT
        *
        FROM account_file
        where
        1=1
        <if test="accountFile.accountId != null and accountFile.accountId != ''">
            AND account_id = #{accountFile.accountId}
        </if>
        <if test="accountFile.name != null and accountFile.name != '' ">
            AND name = #{accountFile.name}
        </if>
        <if test="accountFile.accountType != null and accountFile.accountType != '' ">
            AND account_type = #{accountFile.accountType}
        </if>
    </select>
</mapper>
main-business/src/main/resources/mapper/CompensationPerformanceMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.business.mapper.CompensationPerformanceMapper">
    <select id="listPage" resultType="com.ruoyi.business.entity.CompensationPerformance">
        select * from compensation_performance
        <where>
            <if test="req.name != null and req.name != ''">
                and `name` like concat('%',#{req.name},'%')
            </if>
            <if test="req.payDateStr != null and req.payDateStr != ''">
                and pay_date like concat('%',#{req.payDateStr},'%')
            </if>
        </where>
    </select>
</mapper>
main-business/src/main/resources/mapper/ProductionSchedulingMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.business.mapper.ProductionSchedulingMapper">
    <select id="listPage" resultType="com.ruoyi.business.entity.ProductionScheduling">
        select * from production_scheduling where deleted = 0
    </select>
</mapper>
main-business/src/main/resources/mapper/StaffJoinLeaveRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,39 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ruoyi.business.mapper.StaffJoinLeaveRecordMapper">
    <select id="staffJoinLeaveRecordListPage" resultType="com.ruoyi.business.entity.StaffJoinLeaveRecord">
        SELECT
        *
        FROM staff_join_leave_record
        where
        staff_state = #{staffJoinLeaveRecord.staffState}
        <if test="staffJoinLeaveRecord.staffName != null and staffJoinLeaveRecord.staffName != '' ">
            AND staff_name LIKE CONCAT('%',#{staffJoinLeaveRecord.staffName},'%')
        </if>
        <if test="staffJoinLeaveRecord.entryDateStart != null and staffJoinLeaveRecord.entryDateStart != '' ">
            and contract_start_time like concat('%',#{staffJoinLeaveRecord.entryDateStart},'%')
        </if>
        <if test="staffJoinLeaveRecord.entryDateEnd != null and staffJoinLeaveRecord.entryDateEnd != '' ">
            and contract_end_time like concat('%',#{staffJoinLeaveRecord.entryDateEnd},'%')
        </if>
    </select>
    <select id="staffJoinLeaveRecordList" resultType="com.ruoyi.business.entity.StaffJoinLeaveRecord">
        SELECT
        *
        FROM staff_join_leave_record
        where
        staff_state = #{staffJoinLeaveRecord.staffState}
        <if test="staffJoinLeaveRecord.staffName != null and staffJoinLeaveRecord.staffName != '' ">
            AND staff_name LIKE CONCAT('%',#{staffJoinLeaveRecord.staffName},'%')
        </if>
    </select>
    <select id="staffOnJobList" resultType="com.ruoyi.business.entity.StaffJoinLeaveRecord">
        select *
        from (select *,
                     ROW_NUMBER() over (PARTITION BY staff_no ORDER BY create_time DESC ) as rn
              from staff_join_leave_record
              where staff_state = 1) t
        where rn = 1
    </select>
</mapper>
main-business/src/main/resources/mapper/StaffOnJobMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.ruoyi.business.mapper.StaffOnJobMapper">
    <select id="staffOnJobListPage" resultType="com.ruoyi.business.entity.StaffOnJob">
        SELECT
        *
        FROM staff_on_job
        where 1=1
        <if test="staffOnJob.staffState != null and staffOnJob.staffState != '' ">
        AND staff_state = #{staffOnJob.staffState}
        </if>
        <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
            AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
        </if>
        <if test="staffOnJob.entryDateStart != null and staffOnJob.entryDateStart != '' ">
            AND contract_expire_time &gt;= to_date(#{staffOnJob.entryDateStart},'YYYY-MM-DD')
        </if>
        <if test="staffOnJob.entryDateEnd != null and staffOnJob.entryDateEnd != '' ">
            AND contract_expire_time &lt;= to_date(#{staffOnJob.entryDateEnd},'YYYY-MM-DD')
        </if>
    </select>
    <select id="staffOnJobList" resultType="com.ruoyi.business.entity.StaffOnJob">
        SELECT
        *
        FROM staff_on_job
        where 1=1
        <if test="staffOnJob.staffState != null and staffOnJob.staffState != '' ">
            AND staff_state = #{staffOnJob.staffState}
        </if>
        <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
            AND staff_name LIKE CONCAT('%',#{staffOnJob.staffName},'%')
        </if>
    </select>
</mapper>
ruoyi-admin/src/main/resources/application.yml.example
@@ -138,3 +138,6 @@
  excludes: /system/notice
  # åŒ¹é…é“¾æŽ¥
  urlPatterns: /system/*,/monitor/*,/tool/*
file:
  temp-dir: D:/Backup/桌面/download/temp/uploads
  upload-dir: D:/Backup/桌面/download/prod/uploads