zouyu
19 小时以前 75b7a414ef821a07426790cb79c37811ae2f07ac
浪潮对接单点登录:mis管理系统配置修改
已添加6个文件
已修改21个文件
1019 ■■■■■ 文件已修改
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/aspect/CustomStorageWarningAspect.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffJoinLeaveRecordController.java 96 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/StaffJoinLeaveRecordMapper.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java 165 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/IStaffJoinLeaveRecordService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java 236 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-tide.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/staff/StaffOnJobMapper.xml 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -4,7 +4,7 @@
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.ruoyi</groupId>
    <artifactId>ruoyi-zlglxt</artifactId>
    <artifactId>ruoyi-mis</artifactId>
    <version>3.8.9</version>
    <packaging>jar</packaging>
src/main/java/com/ruoyi/procurementrecord/aspect/CustomStorageWarningAspect.java
@@ -36,7 +36,7 @@
    @Autowired
    private CustomStorageWarningRecordService customStorageWarningRecordService;
    @AfterReturning(value = "execution(* com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl.stockout(*)) || execution(* com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl.updateManagementByCustom(*))")
//    @AfterReturning(value = "execution(* com.ruoyi.procurementrecord.service.impl.ProcurementRecordOutServiceImpl.stockout(*)) || execution(* com.ruoyi.procurementrecord.service.impl.ProcurementRecordServiceImpl.updateManagementByCustom(*))")
    @Transactional(rollbackFor = Exception.class,isolation = Isolation.READ_COMMITTED)
    public void doAfterReturning(JoinPoint joinPoint) {
        Object[] args = joinPoint.getArgs();
src/main/java/com/ruoyi/purchase/controller/PaymentRegistrationController.java
@@ -71,7 +71,7 @@
    @Log(title = "付款登记", businessType = BusinessType.INSERT)
    @PostMapping
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody List<PaymentRegistration>  paymentRegistration) {
    public AjaxResult add(@RequestBody PaymentRegistration  paymentRegistration) {
        return toAjax(paymentRegistrationService.insertPaymentRegistration(paymentRegistration));
    }
src/main/java/com/ruoyi/purchase/controller/TicketRegistrationController.java
@@ -23,6 +23,7 @@
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import lombok.AllArgsConstructor;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.parameters.P;
import org.springframework.transaction.annotation.Transactional;
@@ -130,11 +131,9 @@
    @Log(title = "来票登记", businessType = BusinessType.INSERT)
    @PostMapping("/addOrUpdateRegistration")
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult addOrUpdateRegistration(@RequestBody List<TicketRegistrationDto> ticketRegistrationDto) throws IOException {
        if(CollectionUtils.isEmpty(ticketRegistrationDto)) return AjaxResult.error("请选择要保存的记录");
        for (TicketRegistrationDto ticketRegistrationDto1 : ticketRegistrationDto) {
            ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto1);
        }
    public AjaxResult addOrUpdateRegistration(@RequestBody TicketRegistrationDto ticketRegistrationDto) throws IOException {
        if(ObjectUtils.isEmpty(ticketRegistrationDto)) return AjaxResult.error("请选择要保存的记录");
        ticketRegistrationService.addOrUpdateRegistration(ticketRegistrationDto);
        return toAjax(1);
    }
src/main/java/com/ruoyi/purchase/service/IPaymentRegistrationService.java
@@ -41,7 +41,7 @@
     * @param paymentRegistration ä»˜æ¬¾ç™»è®°
     * @return ç»“æžœ
     */
    public int insertPaymentRegistration(List<PaymentRegistration>  paymentRegistration);
    public int insertPaymentRegistration(PaymentRegistration  paymentRegistration);
    /**
     * ä¿®æ”¹ä»˜æ¬¾ç™»è®°
src/main/java/com/ruoyi/purchase/service/impl/PaymentRegistrationServiceImpl.java
@@ -99,13 +99,12 @@
    /**
     * æ–°å¢žä»˜æ¬¾ç™»è®°
     *
     * @param paymentRegistrationList ä»˜æ¬¾ç™»è®°
     * @param paymentRegistration ä»˜æ¬¾ç™»è®°
     * @return ç»“æžœ
     */
    @Override
    public int insertPaymentRegistration(List<PaymentRegistration> paymentRegistrationList) {
    public int insertPaymentRegistration(PaymentRegistration paymentRegistration) {
        LoginUser userId = SecurityUtils.getLoginUser();
        for (PaymentRegistration paymentRegistration : paymentRegistrationList) {
            PaymentRegistration byId = paymentRegistration;
            if (!ObjectUtils.isEmpty(paymentRegistration.getId())){
                paymentRegistration = this.getById(paymentRegistration.getId());
@@ -113,18 +112,18 @@
            PurchaseLedger purchaseLedger = purchaseLedgerMapper.selectById(paymentRegistration.getPurchaseLedgerId());
            if(null==purchaseLedger) throw new RuntimeException("未找到采购单");
            // å·²å›žæ¬¾é‡‘额
            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(paymentRegistration.getSalesLedgerProductId());
            if(null==salesLedgerProduct) throw new RuntimeException("未找到采购单产品");
            if (salesLedgerProduct.getPendingTicketsTotal().compareTo(paymentRegistration.getCurrentPaymentAmount())<0){
                throw new RuntimeException("本次回款金额不能大于待回款金额");
            }
//            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectById(paymentRegistration.getSalesLedgerProductId());
//            if(null==salesLedgerProduct) throw new RuntimeException("未找到采购单产品");
//            if (salesLedgerProduct.getPendingTicketsTotal().compareTo(paymentRegistration.getCurrentPaymentAmount())<0){
//                throw new RuntimeException("本次回款金额不能大于待回款金额");
//            }
            paymentRegistration.setCreateTime(DateUtils.getNowDate());
            paymentRegistration.setUpdateTime(DateUtils.getNowDate());
            paymentRegistration.setRegistrantId(userId.getUserId());
            salesLedgerProduct.setTicketsTotal(salesLedgerProduct.getTicketsTotal().add(paymentRegistration.getCurrentPaymentAmount()));
            salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal()));
//            salesLedgerProduct.setTicketsTotal(salesLedgerProduct.getTicketsTotal().add(paymentRegistration.getCurrentPaymentAmount()));
//            salesLedgerProduct.setPendingTicketsTotal(salesLedgerProduct.getTaxInclusiveTotalPrice().subtract(salesLedgerProduct.getTicketsTotal()));
            paymentRegistrationMapper.insert(paymentRegistration);
            salesLedgerProductMapper.updateById(salesLedgerProduct);
//            salesLedgerProductMapper.updateById(salesLedgerProduct);
            // 2. å¤„理账户支出
            AccountExpense accountExpense = new AccountExpense();
            accountExpense.setExpenseDate(purchaseLedger.getEntryDate());
@@ -138,7 +137,6 @@
            accountExpense.setInputTime(new Date());
            accountExpense.setInputUser(userId.getNickName());
            accountExpenseService.save(accountExpense);
        }
        return 1;
    }
src/main/java/com/ruoyi/purchase/service/impl/PurchaseLedgerServiceImpl.java
@@ -182,7 +182,7 @@
        if (ObjectUtils.isNotEmpty(loginUser) && null != loginUser.getTenantId()) {
            purchaseLedger.setTenantId(loginUser.getTenantId());
        }
        purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : "");
        purchaseLedger.setSalesContractNo(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getSalesContractNo() : purchaseLedgerDto.getSalesContractNo());
        purchaseLedger.setSalesLedgerId(ObjectUtils.isNotEmpty(salesLedger) ? salesLedger.getId() : -1);
        purchaseLedger.setSupplierName(supplierManage.getSupplierName());
        purchaseLedger.setRecorderId(purchaseLedgerDto.getRecorderId());
@@ -204,7 +204,7 @@
        if (productList != null) {
            for (SalesLedgerProduct saleProduct : productList) {
                //是否推送质检,如果true就添加
                if (saleProduct.getIsChecked()) {
                if (Objects.nonNull(saleProduct.getIsChecked()) && saleProduct.getIsChecked()) {
                    addQualityInspect(purchaseLedger, saleProduct);
                }
            }
src/main/java/com/ruoyi/sales/controller/InvoiceRegistrationController.java
@@ -8,6 +8,7 @@
import com.ruoyi.sales.dto.SalesLedgerDto;
import com.ruoyi.sales.service.InvoiceRegistrationService;
import io.jsonwebtoken.lang.Collections;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
@@ -30,12 +31,9 @@
    @PostMapping("/save")
    @Log(title = "开票登记", businessType = com.ruoyi.framework.aspectj.lang.enums.BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult invoiceRegistrationSave(@RequestBody List<SalesLedgerDto> salesLedgerDto) {
        if(Collections.isEmpty(salesLedgerDto)) return AjaxResult.error("请选择要保存的记录");
        salesLedgerDto.forEach(item ->{
            invoiceRegistrationService.invoiceRegistrationSave(item);
        });
    public AjaxResult invoiceRegistrationSave(@RequestBody SalesLedgerDto salesLedgerDto) {
        if(ObjectUtils.isEmpty(salesLedgerDto)) return AjaxResult.error("请选择要保存的记录");
        invoiceRegistrationService.invoiceRegistrationSave(salesLedgerDto);
        return AjaxResult.success();
    }
src/main/java/com/ruoyi/sales/controller/ReceiptPaymentController.java
@@ -42,7 +42,7 @@
     * @return
     */
    @PostMapping("/saveOrUpdate")
    public AjaxResult receiptPaymentSaveOrUpdate (@RequestBody List<ReceiptPayment> receiptPayment) {
    public AjaxResult receiptPaymentSaveOrUpdate (@RequestBody ReceiptPayment receiptPayment) {
        receiptPaymentService.receiptPaymentSaveOrUpdate(receiptPayment);
        return AjaxResult.success();
    }
src/main/java/com/ruoyi/sales/dto/InvoiceLedgerDto.java
@@ -53,5 +53,8 @@
    @ApiModelProperty(value = "销售合同ID")
    private Integer salesLedgerId;
    @ApiModelProperty(value = "关联sales_ledger_product主键")
    private Integer salesLedgerProductId;
    private String paymentMethod;
}
src/main/java/com/ruoyi/sales/service/ReceiptPaymentService.java
@@ -19,7 +19,7 @@
     * @param receiptPayment
     * @return
     */
    int receiptPaymentSaveOrUpdate(List<ReceiptPayment> receiptPayment);
    int receiptPaymentSaveOrUpdate(ReceiptPayment receiptPayment);
    /**
     * å›žæ¬¾ç™»è®°ä¿®æ”¹
src/main/java/com/ruoyi/sales/service/impl/ReceiptPaymentServiceImpl.java
@@ -53,13 +53,12 @@
    /**
     * å›žæ¬¾ç™»è®°æ–°å¢ž
     * @param receiptPaymentList
     * @param receiptPayment
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int receiptPaymentSaveOrUpdate(List<ReceiptPayment> receiptPaymentList) {
        for (ReceiptPayment receiptPayment : receiptPaymentList) {
    public int receiptPaymentSaveOrUpdate(ReceiptPayment receiptPayment) {
            ReceiptPayment byId = receiptPayment;
            if (!ObjectUtils.isEmpty(receiptPayment.getId())){
                receiptPayment = this.getById(receiptPayment.getId());
@@ -107,7 +106,6 @@
                }
            }
            salesLedgerProductMapper.updateById(salesLedgerProduct);
        }
        return 1;
    }
src/main/java/com/ruoyi/staff/controller/StaffJoinLeaveRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,96 @@
package com.ruoyi.staff.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.basic.dto.SupplierManageDto;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.basic.service.ISupplierService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
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);
    }
}
src/main/java/com/ruoyi/staff/controller/StaffOnJobController.java
@@ -4,19 +4,16 @@
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.staff.dto.StaffOnJobDto;
import com.ruoyi.staff.pojo.StaffContract;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
import com.ruoyi.staff.service.IStaffOnJobService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid;
import java.util.List;
/**
@@ -24,7 +21,6 @@
 */
@RestController
@RequestMapping("/staff/staffOnJob")
@Api(tags = "员工台账")
public class StaffOnJobController {
    @Resource
@@ -47,64 +43,19 @@
     * @return
     */
    @GetMapping("/list")
    public AjaxResult staffOnJobList(StaffOnJob staffOnJob) {
        return AjaxResult.success(staffOnJobService.staffOnJobList(staffOnJob));
    }
    /**
     * æ–°å¢žå…¥èŒ
     * @param staffOnJob
     * @return
     */
    @PostMapping("")
    public AjaxResult add(@RequestBody StaffOnJobDto staffOnJob) {
        return AjaxResult.success(staffOnJobService.add(staffOnJob));
    }
    /**
     * æ›´æ–°å…¥èŒä¿¡æ¯
     * @param staffOnJobDto
     * @return
     */
    @PutMapping("/{id}")
    public AjaxResult update(@PathVariable("id") Long id, @RequestBody StaffOnJobDto staffOnJobDto) {
        return AjaxResult.success(staffOnJobService.update(id, staffOnJobDto));
    }
    /**
     * åˆ é™¤å…¥èŒ
     * @param ids
     * @return
     */
    @DeleteMapping("/del")
    public AjaxResult delStaffOnJobs(@RequestBody List<Integer> ids) {
        if(CollectionUtils.isEmpty(ids)){
            return AjaxResult.error("请选择至少一条数据");
        }
        return AjaxResult.success(staffOnJobService.delStaffOnJobs(ids));
    public AjaxResult staffOnJobList() {
        return AjaxResult.success(staffOnJobService.staffOnJobList());
    }
    /**
     * åœ¨èŒå‘˜å·¥è¯¦æƒ…
     * @param id
     * @param staffNo
     * @return
     */
    @GetMapping("/{id}")
    public AjaxResult staffOnJobDetail(@PathVariable("id") Long id) {
        return AjaxResult.success(staffOnJobService.staffOnJobDetail(id));
    @GetMapping("/staffNo")
    public AjaxResult staffOnJobDetail(String staffNo) {
        return AjaxResult.success(staffOnJobService.staffOnJobDetail(staffNo));
    }
    /**
     * ç»­ç­¾åˆåŒ
     * @param id
     * @param staffContract
     * @return
     */
    @PostMapping("/renewContract/{id}")
    public AjaxResult renewContract(@PathVariable("id") Long id, @RequestBody StaffContract staffContract) {
        return AjaxResult.success(staffOnJobService.renewContract(id, staffContract));
    }
    /**
     * åœ¨èŒå‘˜å·¥å¯¼å…¥
     */
@@ -126,17 +77,6 @@
    @PostMapping("/export")
    public void staffOnJobExport(HttpServletResponse response,StaffOnJob staffOnJob) {
        staffOnJobService.staffOnJobExport(response, staffOnJob);
    }
    /**
     * word模板合同在职员工导出
     * @param response
     * @param staffOnJob
     */
    @PostMapping("/exportCopy")
    @ApiOperation("word模板合同在职员工导出")
    public AjaxResult exportCopy(HttpServletResponse response,@RequestBody StaffOnJob staffOnJob) throws Exception{
       return AjaxResult.success(staffOnJobService.exportCopy(response, staffOnJob));
    }
src/main/java/com/ruoyi/staff/mapper/StaffJoinLeaveRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
package com.ruoyi.staff.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.basic.dto.SupplierManageDto;
import com.ruoyi.basic.excel.SupplierManageExcelDto;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.staff.pojo.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();
}
src/main/java/com/ruoyi/staff/mapper/StaffOnJobMapper.java
@@ -3,7 +3,7 @@
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.staff.dto.StaffOnJobDto;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -13,7 +13,7 @@
@Mapper
public interface StaffOnJobMapper extends BaseMapper<StaffOnJob> {
    IPage<StaffOnJobDto> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJob staffOnJob);
    IPage<StaffOnJob> staffOnJobListPage(Page page, @Param("staffOnJob") StaffOnJob staffOnJob);
    List<StaffOnJobDto> staffOnJobList(@Param("staffOnJob") StaffOnJob staffOnJob);
    List<StaffOnJob> staffOnJobList(@Param("staffOnJob") StaffOnJob staffOnJob);
}
src/main/java/com/ruoyi/staff/pojo/StaffJoinLeaveRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,165 @@
package com.ruoyi.staff.pojo;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.dto.DateQueryDto;
import com.ruoyi.framework.aspectj.lang.annotation.Excel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NonNull;
import javax.validation.constraints.NotBlank;
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 Integer probationPeriod;
    /**
     * å‘˜å·¥ç¼–号
     */
    @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;
}
src/main/java/com/ruoyi/staff/service/IStaffJoinLeaveRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.ruoyi.staff.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.basic.dto.SupplierManageDto;
import com.ruoyi.basic.pojo.SupplierManage;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import org.springframework.web.multipart.MultipartFile;
import javax.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);
}
src/main/java/com/ruoyi/staff/service/IStaffOnJobService.java
@@ -3,8 +3,7 @@
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.staff.dto.StaffOnJobDto;
import com.ruoyi.staff.pojo.StaffContract;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import org.springframework.web.multipart.MultipartFile;
@@ -14,23 +13,13 @@
public interface IStaffOnJobService extends IService<StaffOnJob> {
    IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob);
    IPage<StaffOnJob> staffOnJobListPage(Page page, StaffOnJob staffOnJob);
     StaffOnJobDto staffOnJobDetail(Long id);
    int add(StaffOnJobDto staffOnJob);
    int update(Long id, StaffOnJobDto staffOnJob);
    int delStaffOnJobs(List<Integer> ids);
    int renewContract(Long id, StaffContract staffContract);
    List<StaffJoinLeaveRecord> staffOnJobDetail(String staffNo);
    void staffOnJobExport(HttpServletResponse response, StaffOnJob staffOnJob);
    List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob);
    List<StaffJoinLeaveRecord> staffOnJobList();
    Boolean importData(MultipartFile file);
    String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception;
}
src/main/java/com/ruoyi/staff/service/impl/StaffJoinLeaveRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,169 @@
package com.ruoyi.staff.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.common.exception.base.BaseException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.function.Function;
@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);
    }
}
src/main/java/com/ruoyi/staff/service/impl/StaffOnJobServiceImpl.java
@@ -5,35 +5,20 @@
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.common.exception.base.BaseException;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.dto.WordDateDto;
import com.ruoyi.project.system.domain.SysPost;
import com.ruoyi.project.system.mapper.SysPostMapper;
import com.ruoyi.staff.dto.StaffOnJobDto;
import com.ruoyi.staff.mapper.StaffContractMapper;
import com.ruoyi.staff.mapper.StaffLeaveMapper;
import com.ruoyi.staff.mapper.StaffJoinLeaveRecordMapper;
import com.ruoyi.staff.mapper.StaffOnJobMapper;
import com.ruoyi.staff.pojo.StaffContract;
import com.ruoyi.staff.pojo.StaffLeave;
import com.ruoyi.staff.pojo.StaffJoinLeaveRecord;
import com.ruoyi.staff.pojo.StaffOnJob;
import com.ruoyi.staff.service.IStaffJoinLeaveRecordService;
import com.ruoyi.staff.service.IStaffOnJobService;
import freemarker.template.Configuration;
import freemarker.template.Template;
import lombok.AllArgsConstructor;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.nio.charset.StandardCharsets;
import java.time.Instant;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.*;
import java.util.List;
@AllArgsConstructor
@Service
@@ -42,143 +27,33 @@
    private StaffOnJobMapper staffOnJobMapper;
    private SysPostMapper sysPostMapper;
    private StaffContractMapper staffContractMapper;
    private StaffLeaveMapper staffLeaveMapper;
    private StaffJoinLeaveRecordMapper staffJoinLeaveRecordMapper;
    //在职员工台账分页查询
    @Override
    public IPage<StaffOnJobDto> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
    public IPage<StaffOnJob> staffOnJobListPage(Page page, StaffOnJob staffOnJob) {
        return staffOnJobMapper.staffOnJobListPage(page,staffOnJob);
    }
    //新增入职
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int add(StaffOnJobDto staffOnJobPrams) {
        String[] ignoreProperties = {"id"};//排除id属性
        // åˆ¤æ–­ç¼–号是否存在
        List<StaffOnJob> staffOnJobs = staffOnJobMapper.selectList(Wrappers.<StaffOnJob>lambdaQuery().eq(StaffOnJob::getStaffNo, staffOnJobPrams.getStaffNo()));
        if (staffOnJobs.size()>0){
            throw new BaseException("编号为"+staffOnJobPrams.getStaffNo()+"的员工已经存在,无法新增!!!");
        }
        // åˆ›å»ºå…¥èŒæ•°æ®
        staffOnJobPrams.setContractExpireTime(staffOnJobPrams.getContractEndTime());
        staffOnJobMapper.insert(staffOnJobPrams);
        // åˆ›å»ºåˆåŒè®°å½•
        StaffContract staffContract = new StaffContract();
        staffContract.setStaffOnJobId(staffOnJobPrams.getId());
        staffContract.setContractTerm(staffOnJobPrams.getContractTerm());
        staffContract.setContractStartTime(staffOnJobPrams.getContractStartTime());
        staffContract.setContractEndTime(staffOnJobPrams.getContractEndTime());
        return staffContractMapper.insert(staffContract);
    }
    //更新入职信息
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int update(Long id, StaffOnJobDto staffOnJobParams) {
        // åˆ¤æ–­å¯¹è±¡æ˜¯å¦å­˜åœ¨
        StaffOnJob job = staffOnJobMapper.selectById(id);
        if (job == null){
            throw new BaseException("编号为"+staffOnJobParams.getStaffNo()+"的员工不存在,无法更新!!!");
        }
        String[] ignoreProperties = {"id"};//排除id属性
        // èŽ·å–æœ€æ–°åˆåŒæ•°æ®ï¼Œå¹¶ä¸”æ›´æ–°
        StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
                .eq(StaffContract::getStaffOnJobId, id)
                .last("limit 1")
                .orderByDesc(StaffContract::getId));
        if (contract != null){
            BeanUtils.copyProperties(staffOnJobParams,contract,ignoreProperties);
            staffContractMapper.updateById(contract);
        }
        // æ›´æ–°å‘˜å·¥æ•°æ®
        BeanUtils.copyProperties(staffOnJobParams,job,ignoreProperties);
        job.setContractExpireTime(staffOnJobParams.getContractEndTime());
        return staffOnJobMapper.updateById(job);
    }
    //删除入职
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int delStaffOnJobs(List<Integer> ids) {
        // åˆ é™¤å…¥èŒæ•°æ®
        staffOnJobMapper.deleteBatchIds(ids);
        // åˆ é™¤ç¦»èŒæ•°æ®
        staffLeaveMapper.delete(Wrappers.<StaffLeave>lambdaQuery().in(StaffLeave::getStaffOnJobId, ids));
        // åˆ é™¤åˆåŒæ•°æ®
        return staffContractMapper.delete(Wrappers.<StaffContract>lambdaQuery().in(StaffContract::getStaffOnJobId, ids));
    }
    // ç»­ç­¾åˆåŒ
    @Override
    @Transactional(rollbackFor = Exception.class)
    public int renewContract(Long id, StaffContract staffContract) {
        // åˆ¤æ–­å¯¹è±¡æ˜¯å¦å­˜åœ¨
        StaffOnJob job = staffOnJobMapper.selectById(id);
        if (job == null){
            throw new BaseException("该员工不存在,无法更新!!!");
        }
        // å¢žåŠ åˆåŒ
        StaffContract newStaffContract = new StaffContract();
        newStaffContract.setStaffOnJobId(id);
        newStaffContract.setContractTerm(staffContract.getContractTerm());
        newStaffContract.setContractStartTime(staffContract.getContractStartTime());
        newStaffContract.setContractEndTime(staffContract.getContractEndTime());
        staffContractMapper.insert(newStaffContract);
        // æ›´æ–°å‘˜å·¥åˆåŒè¿‡æœŸæ—¶é—´
        job.setContractExpireTime(staffContract.getContractEndTime());
        staffOnJobMapper.updateById(job);
        return 0;
    }
    //在职员工详情
    @Override
    public StaffOnJobDto staffOnJobDetail(Long id) {
        StaffOnJob staffOnJob  = staffOnJobMapper.selectById(id);
        if (staffOnJob == null) {
            throw new IllegalArgumentException("该员工不存在");
        }
        StaffOnJobDto staffOnJobDto = new StaffOnJobDto();
        BeanUtils.copyProperties(staffOnJob, staffOnJobDto);
        // æŸ¥è¯¢å²—位名称
        SysPost post = sysPostMapper.selectPostById((long) staffOnJob.getSysPostId());
        staffOnJobDto.setPostName(post.getPostName());
        // æŸ¥è¯¢åˆåŒä¿¡æ¯
        StaffContract contract = staffContractMapper.selectOne(Wrappers.<StaffContract>lambdaQuery()
                .eq(StaffContract::getStaffOnJobId, staffOnJob.getId())
                .last("limit 1")
                .orderByDesc(StaffContract::getId));
        if (contract != null){
            staffOnJobDto.setContractTerm(contract.getContractTerm());
            staffOnJobDto.setContractStartTime(contract.getContractStartTime());
            staffOnJobDto.setContractEndTime(contract.getContractEndTime());
        }
        return staffOnJobDto;
    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<StaffOnJobDto> staffOnJobs = staffOnJobMapper.staffOnJobList(staffOnJob);
        ExcelUtil<StaffOnJobDto> util = new ExcelUtil<StaffOnJobDto>(StaffOnJobDto.class);
        List<StaffOnJob> staffOnJobs = staffOnJobMapper.staffOnJobList(staffOnJob);
        ExcelUtil<StaffOnJob> util = new ExcelUtil<StaffOnJob>(StaffOnJob.class);
        util.exportExcel(response, staffOnJobs, "在职员工台账导出");
    }
    @Override
    public List<StaffOnJobDto> staffOnJobList(StaffOnJob staffOnJob) {
        return staffOnJobMapper.staffOnJobList(staffOnJob);
    public List<StaffJoinLeaveRecord> staffOnJobList() {
        return staffJoinLeaveRecordMapper.staffOnJobList();
    }
    @Override
@@ -192,87 +67,6 @@
            return false;
        }
    }
    @Override
    public String exportCopy(HttpServletResponse response, StaffOnJob staffOnJob) throws Exception {
        String url = "/javaWork/product-inventory-management/file/prod/" + staffOnJob.getStaffName() + "-劳动合同书.docx";
        Configuration cfg = new Configuration(Configuration.VERSION_2_3_32);
        // è®¾ç½®æ¨¡æ¿æ–‡ä»¶æ‰€åœ¨ç›®å½•(绝对路径,例如:/templates/)
        cfg.setClassForTemplateLoading(StaffOnJobServiceImpl.class, "/static");
        cfg.setDefaultEncoding("UTF-8");
        //2.定义需要填充的变里
        // â‘  æž„造员工信息(实际项目中可从数据库/Excel读取)
        WordDateDto staff = new WordDateDto();
        BeanUtils.copyProperties(staffOnJob, staff);
        // é€šè¿‡åˆåŒå¹´é™ï¼ŒåˆåŒåˆ°æœŸæ—¥æœŸè®¡ç®—合同开始日期,在获取开始日期,结束日期的年月日数字
        // åˆåŒåˆ°æœŸæ—¥æœŸ - åˆåŒå¹´é™ï¼ˆDate类型)
        // 1. å°†Date转换为Instant(时间戳)
        Instant instant = staff.getContractExpireTime().toInstant();
        // ä¹Ÿå¯ä»¥æŒ‡å®šå…·ä½“时区,例如Asia/Shanghai:
        LocalDate localDate = instant.atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();  // åˆåŒç»“束时间
        LocalDate localDate1 = localDate.minusYears(Integer.parseInt(staff.getContractTerm()));// åˆåŒå¼€å§‹æ—¶é—´
        // ç­¾è®¢æ—¥æœŸè½¬æ¢lcoaldate
        LocalDate localDate2 = staff.getSignDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
        // è¯•用日期转换lcoaldate
        LocalDate localDate3 = staff.getTrialStartDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
        LocalDate localDate4 = staff.getTrialEndDate().toInstant().atZone(ZoneId.of("Asia/Shanghai")).toLocalDate();
        staff.setQyear(localDate2.getYear() + "");
        staff.setQmoth(localDate2.getMonthValue() + "");
        staff.setQday(localDate2.getDayOfMonth() + "");
        if(staff.getDateSelect().equals("A")){
            staff.setSyear(localDate1.getYear() + "");
            staff.setSmoth(localDate1.getMonthValue() + "");
            staff.setSday(localDate1.getDayOfMonth() + "");
            staff.setEyear(localDate.getDayOfMonth() + "");
            staff.setEmoth(localDate.getDayOfMonth() + "");
            staff.setEday(localDate.getDayOfMonth() + "");
            staff.setStyear(localDate3.getYear() + "");
            staff.setStmoth(localDate3.getMonthValue() + "");
            staff.setStday(localDate3.getDayOfMonth() + "");
            staff.setSeyear(localDate4.getYear() + "");
            staff.setSemoth(localDate4.getMonthValue() + "");
            staff.setSeday(localDate4.getDayOfMonth() + "");
        }else if (staff.getDateSelect().equals("B")){
            staff.setBsyear(localDate1.getYear() + "");
            staff.setBsmoth(localDate1.getMonthValue() + "");
            staff.setBsday(localDate1.getDayOfMonth() + "");
            staff.setBstyear(localDate3.getYear() + "");
            staff.setBstmoth(localDate3.getMonthValue() + "");
            staff.setBstday(localDate3.getDayOfMonth() + "");
            staff.setBseyear(localDate4.getYear() + "");
            staff.setBsemoth(localDate4.getMonthValue() + "");
            staff.setBseday(localDate4.getDayOfMonth() + "");
        }else if (staff.getDateSelect().equals("C")){
            staff.setCsyear(localDate1.getYear() + "");
            staff.setCsmoth(localDate1.getMonthValue() + "");
            staff.setCsday(localDate1.getDayOfMonth() + "");
        }
        Map<String,Object> data = new HashMap<>();
        data.put("item",staff);
        //3.加载XML æ¨¡æ¿
        Template template = cfg.getTemplate("劳动合同书.xml");
        //4.生成填充后的 XML å†…容
        StringWriter out = new StringWriter();
        template.process(data, out);
        String filledXml = out.toString();
        //5.将XML内容写入交件并改为.docx æ ¼å¼
        File outputFile = new File(url);
        try(FileOutputStream fos = new FileOutputStream(outputFile);
            OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8)) {
            osw.write(filledXml);
        }
        return url;
    }
}
src/main/resources/application-tide.yml
@@ -20,7 +20,7 @@
# å¼€å‘环境配置
server:
  # æœåŠ¡å™¨çš„HTTP端口,默认为8080
  port: 8034
  port: 7003
  servlet:
    # åº”用的访问路径
    context-path: /
@@ -65,7 +65,7 @@
    druid:
      # ä¸»åº“数据源
      master:
        url: jdbc:mysql://10.136.12.71:3306/zlglxt-ruoyi-xinlan?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        url: jdbc:mysql://10.136.12.71:3306/mis_ruoyi?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
        username: root
        password: zttZTT123!
      # ä»Žåº“数据源
src/main/resources/mapper/purchase/PaymentRegistrationMapper.xml
@@ -128,7 +128,7 @@
    <select id="getPaymentRecordList" resultType="com.ruoyi.purchase.dto.PaymentHistoryRecordVo">
        SELECT * FROM(
             SELECT
                 T1.issue_date AS happenTime,
                 T1.enter_date AS happenTime,
                 IFNULL(T1.invoice_amount,0) AS invoiceAmount,
                 '1' AS type,
                 0 AS currentPaymentAmount
src/main/resources/mapper/sales/ReceiptPaymentMapper.xml
@@ -73,6 +73,7 @@
        T1.update_user,
        T1.tenant_id,
        T2.tax_rate,
        T2.sales_ledger_id,
        T3.sales_contract_no,
        T3.customer_contract_no,
        T3.customer_name,
@@ -133,7 +134,9 @@
            T1.invoice_total ,
            T2.tax_rate,
            T3.customer_name,
            T3.sales_contract_no
            T3.sales_contract_no,
            T2.sales_ledger_id,
            T2.sales_ledger_product_id
        FROM
            invoice_ledger T1
                LEFT JOIN
src/main/resources/mapper/sales/SalesLedgerProductMapper.xml
@@ -40,7 +40,7 @@
        sl.sales_contract_no,
        sl.customer_contract_no
        from sales_ledger_product slp
        left join sales_ledger sl on slp.sales_ledger_id = sl.id
        inner join sales_ledger sl on slp.sales_ledger_id = sl.id
        <where>
            slp.type = 1
            <if test="req.salesContractNo != null and req.salesContractNo != '' ">
@@ -72,7 +72,7 @@
        sl.sales_contract_no,
        sl.purchase_contract_number
        from sales_ledger_product slp
        left join purchase_ledger sl on slp.sales_ledger_id = sl.id
        inner join purchase_ledger sl on slp.sales_ledger_id = sl.id
        <where>
            slp.type = 2
            <if test="req.purchaseContractNumber != null and req.purchaseContractNumber != '' ">
src/main/resources/mapper/staff/StaffJoinLeaveRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,40 @@
<?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.staff.mapper.StaffJoinLeaveRecordMapper">
    <select id="staffJoinLeaveRecordListPage" resultType="com.ruoyi.staff.pojo.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>
        order by create_time desc
    </select>
    <select id="staffJoinLeaveRecordList" resultType="com.ruoyi.staff.pojo.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.staff.pojo.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>
src/main/resources/mapper/staff/StaffOnJobMapper.xml
@@ -3,16 +3,39 @@
<mapper namespace="com.ruoyi.staff.mapper.StaffOnJobMapper">
    <select id="staffOnJobListPage" resultType="com.ruoyi.staff.dto.StaffOnJobDto">
        SELECT
        staff_on_job.*,
        sp.post_name as postName,
        sd.dept_name as deptName
            id,
            staff_state,
            staff_no,
            staff_name,
            sex,
            native_place,
            adress,
            first_study,
            profession,
            identity_card,
            age,
            phone,
            emergency_contact,
            emergency_contact_phone,
            contract_term,
            contract_expire_time,
            trial_end_date,
            trial_start_date,
            salary_select,
            pro_salary,
            date_select,
            remark,
            sign_date,
            create_time,
            create_user,
            update_time,
            update_user,
            tenant_id,
            sys_post_id,
            sys_dept_id
        FROM staff_on_job
        LEFT JOIN
        sys_post sp ON sp.post_id = staff_on_job.sys_post_id
        LEFT JOIN
        sys_dept sd ON sd.dept_id = staff_on_job.sys_dept_id
        where 1=1
        <if test="staffOnJob.staffState != null">
        <where>
            <if test="staffOnJob.staffState != null and staffOnJob.staffState != '' ">
        AND staff_state = #{staffOnJob.staffState}
        </if>
        <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">
@@ -24,19 +47,43 @@
        <if test="staffOnJob.entryDateEnd != null and staffOnJob.entryDateEnd != '' ">
            AND  contract_expire_time &lt;= DATE_FORMAT(#{staffOnJob.entryDateEnd},'%Y-%m-%d')
        </if>
        </where>
    </select>
    <select id="staffOnJobList" resultType="com.ruoyi.staff.dto.StaffOnJobDto">
        SELECT
        staff_on_job.*,
        sp.post_name as postName,
        sd.dept_name as deptName
        id,
        staff_state,
        staff_no,
        staff_name,
        sex,
        native_place,
        adress,
        first_study,
        profession,
        identity_card,
        age,
        phone,
        emergency_contact,
        emergency_contact_phone,
        contract_term,
        contract_expire_time,
        trial_end_date,
        trial_start_date,
        salary_select,
        pro_salary,
        date_select,
        remark,
        sign_date,
        create_time,
        create_user,
        update_time,
        update_user,
        tenant_id,
        sys_post_id,
        sys_dept_id
        FROM staff_on_job
        LEFT JOIN
        sys_post sp ON sp.post_id = staff_on_job.sys_post_id
        LEFT JOIN
        sys_dept sd ON sd.dept_id = staff_on_job.sys_dept_id
        where 1=1
        <if test="staffOnJob.staffState != null">
        <if test="staffOnJob.staffState != null and staffOnJob.staffState != '' ">
            AND staff_state = #{staffOnJob.staffState}
        </if>
        <if test="staffOnJob.staffName != null and staffOnJob.staffName != '' ">