maven
6 天以前 214f90a39cdf2d401f9eb50084d062dab878a249
yys
1.车俩管理开发
2.调整生产管控流
已添加12个文件
已修改10个文件
739 ■■■■■ 文件已修改
src/main/java/com/ruoyi/CodeGenerator.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/CarInfoController.java 76 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/controller/CarInfoRecordController.java 74 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/CarInfoMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/mapper/CarInfoRecordMapper.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/CarInfo.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/pojo/CarInfoRecord.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/CarInfoRecordService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/CarInfoService.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/CarInfoRecordServiceImpl.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/approve/service/impl/CarInfoServiceImpl.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/controller/ProductOrderController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/CarInfoMapper.xml 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/approve/CarInfoRecordMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/production/ProductOrderMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/ruoyi/CodeGenerator.java
@@ -19,11 +19,11 @@
// æ¼”示例子,执行 main æ–¹æ³•控制台输入模块表名回车自动生成对应项目目录中
public class CodeGenerator {
    public static String database_url = "jdbc:mysql://127.0.0.1:3306/product-inventory-management-new";
    public static String database_url = "jdbc:mysql://127.0.0.1:3306/product-inventory-management-hsxnynew";
    public static String database_username = "root";
    public static String database_password= "123456";
    public static String author = "芯导软件(江苏)有限公司";
    public static String model = "account"; // æ¨¡å—
    public static String model = "approve"; // æ¨¡å—
    public static String setParent = "com.ruoyi."+ model; // åŒ…路径
    public static String tablePrefix = ""; // è®¾ç½®è¿‡æ»¤è¡¨å‰ç¼€
    public static void main(String[] args) {
src/main/java/com/ruoyi/approve/controller/CarInfoController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.mapper.CarInfoMapper;
import com.ruoyi.approve.pojo.CarInfo;
import com.ruoyi.approve.pojo.CarInfoRecord;
import com.ruoyi.approve.service.CarInfoRecordService;
import com.ruoyi.approve.service.CarInfoService;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * è½¦ä¿©ç®¡ç† å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:00:32
 */
@RestController
@RequestMapping("/carInfo")
@Api(tags = "车俩管理")
public class CarInfoController {
    @Autowired
    private CarInfoService carInfoService;
    @Autowired
    private CarInfoRecordService carInfoRecordService;
    @ApiOperation("分页查询车俩管理")
    @GetMapping("/listPage")
    public AjaxResult listPage(Page page, CarInfo carInfo) {
        return AjaxResult.success(carInfoService.listPage(page,carInfo));
    }
    @ApiOperation("新增车俩管理")
    @PostMapping("/add")
    @Log(title = "车俩管理", businessType = BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody CarInfo carInfo) {
        return carInfoService.save(carInfo) ? AjaxResult.success("新增成功") : AjaxResult.error("新增失败");
    }
    @ApiOperation("修改车俩管理")
    @PostMapping("/update")
    @Log(title = "车俩管理", businessType = BusinessType.UPDATE)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult update(@RequestBody CarInfo carInfo) {
        return carInfoService.updateById(carInfo) ? AjaxResult.success("修改成功") : AjaxResult.error("修改失败");
    }
    @ApiOperation("删除车俩管理")
    @DeleteMapping("/delete")
    @Log(title = "车俩管理", businessType = BusinessType.DELETE)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        if(CollectionUtils.isEmpty(ids)) return AjaxResult.error("请选择至少一条数据");
        carInfoService.removeByIds(ids);
        carInfoRecordService.remove(new LambdaQueryWrapper<CarInfoRecord>().in(CarInfoRecord::getCarInfoId,ids));
        return AjaxResult.success("删除成功");
    }
}
src/main/java/com/ruoyi/approve/controller/CarInfoRecordController.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,74 @@
package com.ruoyi.approve.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.mapper.CarInfoMapper;
import com.ruoyi.approve.pojo.CarInfo;
import com.ruoyi.approve.pojo.CarInfoRecord;
import com.ruoyi.approve.service.CarInfoRecordService;
import com.ruoyi.approve.service.impl.CarInfoServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.aspectj.lang.annotation.Log;
import com.ruoyi.framework.aspectj.lang.enums.BusinessType;
import com.ruoyi.framework.web.domain.AjaxResult;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
 * <p>
 * è½¦è¾†ç®¡ç†å­è¡¨ï¼ˆè¿˜è½¦è¡¨ï¼‰ å‰ç«¯æŽ§åˆ¶å™¨
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:01:21
 */
@RestController
@RequestMapping("/carInfoRecord")
@Api(tags = "车辆管理子表(还车表)")
public class CarInfoRecordController {
    @Autowired
    private CarInfoRecordService carInfoRecordService;
    @Autowired
    private CarInfoServiceImpl carInfoService;
    @GetMapping("/list")
    @ApiOperation("查询")
    public AjaxResult list(Page page, CarInfoRecord carInfoRecord) {
        return carInfoRecordService.getList(page,carInfoRecord);
    }
    @PostMapping("/add")
    @ApiOperation("用车")
    @Log(title = "车辆管理子表(还车表)", businessType = BusinessType.INSERT)
    @Transactional(rollbackFor = Exception.class)
    public AjaxResult add(@RequestBody CarInfoRecord carInfoRecord) {
        carInfoService.updateUsageStatus(carInfoRecord.getCarInfoId(),"使用中");
        return AjaxResult.success(carInfoRecordService.save(carInfoRecord));
    }
    @PostMapping("/update")
    @ApiOperation("修改")
    @Log(title = "车辆管理子表(还车表)", businessType = BusinessType.UPDATE)
    public AjaxResult update(@RequestBody CarInfoRecord carInfoRecord) {
        if(StringUtils.isNotEmpty(carInfoRecord.getUsageStatus())){
            carInfoService.updateUsageStatus(carInfoRecord.getCarInfoId(),"空闲");
        }
        return AjaxResult.success(carInfoRecordService.updateById(carInfoRecord));
    }
    @DeleteMapping("/delete")
    @ApiOperation("删除")
    @Log(title = "车辆管理子表(还车表)", businessType = BusinessType.DELETE)
    public AjaxResult delete(@RequestBody List<Long> ids) {
        return AjaxResult.success(carInfoRecordService.removeBatchByIds(ids));
    }
}
src/main/java/com/ruoyi/approve/mapper/CarInfoMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.approve.mapper;
import com.ruoyi.approve.pojo.CarInfo;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * è½¦ä¿©ç®¡ç† Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:00:32
 */
@Mapper
public interface CarInfoMapper extends BaseMapper<CarInfo> {
}
src/main/java/com/ruoyi/approve/mapper/CarInfoRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,18 @@
package com.ruoyi.approve.mapper;
import com.ruoyi.approve.pojo.CarInfoRecord;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
/**
 * <p>
 * è½¦è¾†ç®¡ç†å­è¡¨ï¼ˆè¿˜è½¦è¡¨ï¼‰ Mapper æŽ¥å£
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:01:21
 */
@Mapper
public interface CarInfoRecordMapper extends BaseMapper<CarInfoRecord> {
}
src/main/java/com/ruoyi/approve/pojo/CarInfo.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,81 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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 java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * è½¦ä¿©ç®¡ç†
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:00:32
 */
@Getter
@Setter
@TableName("car_info")
@ApiModel(value = "CarInfo对象", description = "车俩管理")
public class CarInfo implements Serializable {
    @TableField(exist = false)
    @ApiModelProperty("当前使用人")
    private String currentUserName;
    @TableField(exist = false)
    @ApiModelProperty("车辆管理子表(还车表)id")
    private Long carInfoRecordId;
    @TableField(exist = false)
    @ApiModelProperty("表显里程")
    private String odometerMileage;
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("车牌号")
    private String carNo;
    @ApiModelProperty("颜色")
    private String color;
    @ApiModelProperty("品牌")
    private String brand;
    @ApiModelProperty("使用状态")
    private String usageStatus;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    private LocalDateTime createTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
src/main/java/com/ruoyi/approve/pojo/CarInfoRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.approve.pojo;
import com.baomidou.mybatisplus.annotation.FieldFill;
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 java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import org.springframework.format.annotation.DateTimeFormat;
/**
 * <p>
 * è½¦è¾†ç®¡ç†å­è¡¨ï¼ˆè¿˜è½¦è¡¨ï¼‰
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:01:21
 */
@Getter
@Setter
@TableName("car_info_record")
@ApiModel(value = "CarInfoRecord对象", description = "车辆管理子表(还车表)")
public class CarInfoRecord implements Serializable {
    @ApiModelProperty("使用状态")
    @TableField(exist = false)
    private String usageStatus;
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("车辆管理id")
    private Long carInfoId;
    @ApiModelProperty("表现里程")
    private String odometerMileage;
    @ApiModelProperty("本次预计行驶里程")
    private String thisTripMileage;
    @ApiModelProperty("目的地")
    private String destination;
    @ApiModelProperty("还车日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate carReturnDate;
    @ApiModelProperty("借车日期")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private LocalDate carRentalDate;
    @ApiModelProperty("使用人")
    private String userName;
    @ApiModelProperty("备注")
    private String remark;
    @ApiModelProperty("创建时间")
    @TableField(fill = FieldFill.INSERT)
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime createTime;
    @ApiModelProperty("创建人")
    @TableField(fill = FieldFill.INSERT)
    private Integer createUser;
    @ApiModelProperty("修改时间")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    @ApiModelProperty("修改人")
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Integer updateUser;
}
src/main/java/com/ruoyi/approve/service/CarInfoRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
package com.ruoyi.approve.service;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.pojo.CarInfoRecord;
import com.baomidou.mybatisplus.extension.service.IService;
import com.ruoyi.framework.web.domain.AjaxResult;
/**
 * <p>
 * è½¦è¾†ç®¡ç†å­è¡¨ï¼ˆè¿˜è½¦è¡¨ï¼‰ æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:01:21
 */
public interface CarInfoRecordService extends IService<CarInfoRecord> {
    AjaxResult getList(Page page,CarInfoRecord carInfoRecord);
}
src/main/java/com/ruoyi/approve/service/CarInfoService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,20 @@
package com.ruoyi.approve.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.pojo.CarInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import org.aspectj.weaver.loadtime.Aj;
/**
 * <p>
 * è½¦ä¿©ç®¡ç† æœåŠ¡ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:00:32
 */
public interface CarInfoService extends IService<CarInfo> {
    IPage<CarInfo> listPage(Page page, CarInfo carInfo);
}
src/main/java/com/ruoyi/approve/service/impl/CarInfoRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,38 @@
package com.ruoyi.approve.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.pojo.CarInfoRecord;
import com.ruoyi.approve.mapper.CarInfoRecordMapper;
import com.ruoyi.approve.service.CarInfoRecordService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.framework.web.domain.AjaxResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * è½¦è¾†ç®¡ç†å­è¡¨ï¼ˆè¿˜è½¦è¡¨ï¼‰ æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:01:21
 */
@Service
public class CarInfoRecordServiceImpl extends ServiceImpl<CarInfoRecordMapper, CarInfoRecord> implements CarInfoRecordService {
    @Autowired
    private CarInfoRecordMapper carInfoRecordMapper;
    @Override
    public AjaxResult getList(Page page,CarInfoRecord carInfoRecord) {
        LambdaQueryWrapper<CarInfoRecord> carInfoRecordLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(carInfoRecord != null){
            if(carInfoRecord.getCarInfoId() != null){
                carInfoRecordLambdaQueryWrapper.eq(CarInfoRecord::getCarInfoId, carInfoRecord.getCarInfoId());
            }
        }
        carInfoRecordLambdaQueryWrapper.orderByDesc(CarInfoRecord::getCreateTime);
        return AjaxResult.success(carInfoRecordMapper.selectPage(page,carInfoRecordLambdaQueryWrapper));
    }
}
src/main/java/com/ruoyi/approve/service/impl/CarInfoServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,86 @@
package com.ruoyi.approve.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ruoyi.approve.mapper.CarInfoRecordMapper;
import com.ruoyi.approve.pojo.CarInfo;
import com.ruoyi.approve.mapper.CarInfoMapper;
import com.ruoyi.approve.pojo.CarInfoRecord;
import com.ruoyi.approve.service.CarInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.web.domain.AjaxResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
 * <p>
 * è½¦ä¿©ç®¡ç† æœåŠ¡å®žçŽ°ç±»
 * </p>
 *
 * @author èŠ¯å¯¼è½¯ä»¶ï¼ˆæ±Ÿè‹ï¼‰æœ‰é™å…¬å¸
 * @since 2026-01-21 03:00:32
 */
@Service
@Slf4j
public class CarInfoServiceImpl extends ServiceImpl<CarInfoMapper, CarInfo> implements CarInfoService {
    @Autowired
    private CarInfoMapper carInfoMapper;
    @Autowired
    private CarInfoRecordMapper carInfoRecordMapper;
    /**
     * æ”¹å˜è½¦è¾†ä½¿ç”¨çŠ¶æ€
     * @param id
     */
    public void updateUsageStatus(Long id, String usageStatus) {
        CarInfo carInfo = carInfoMapper.selectOne(new LambdaQueryWrapper<CarInfo>()
                .eq(CarInfo::getId, id)
                .last("limit 1"));
        if(carInfo == null) throw new RuntimeException("车辆不存在");
        if("使用中".equals(usageStatus) && "使用中".equals(carInfo.getUsageStatus())) throw new RuntimeException("车辆已使用中");
        carInfo.setUsageStatus(usageStatus);
        carInfoMapper.updateById(carInfo);
    }
    @Override
    public IPage<CarInfo> listPage(Page page, CarInfo carInfo) {
        LambdaQueryWrapper<CarInfo> carInfoLambdaQueryWrapper = new LambdaQueryWrapper<>();
        if(carInfo != null){
            if(StringUtils.isNotEmpty(carInfo.getCarNo())){
                carInfoLambdaQueryWrapper.like(CarInfo::getCarNo,carInfo.getCarNo());
            }
            if(StringUtils.isNotEmpty(carInfo.getBrand())){
                carInfoLambdaQueryWrapper.like(CarInfo::getBrand,carInfo.getBrand());
            }
            if(StringUtils.isNotEmpty(carInfo.getColor())){
                carInfoLambdaQueryWrapper.like(CarInfo::getColor,carInfo.getColor());
            }
            if(StringUtils.isNotEmpty(carInfo.getUsageStatus())){
                carInfoLambdaQueryWrapper.like(CarInfo::getUsageStatus,carInfo.getUsageStatus());
            }
        }
        carInfoLambdaQueryWrapper.orderByDesc(CarInfo::getCreateTime);
        Page<CarInfo> page1 = carInfoMapper.selectPage(page, carInfoLambdaQueryWrapper);
        for (CarInfo record : page1.getRecords()) {
            // å½“前使用人,表显里程
            CarInfoRecord carInfoRecord = carInfoRecordMapper.selectOne(new LambdaQueryWrapper<CarInfoRecord>()
                    .eq(CarInfoRecord::getCarInfoId, record.getId())
                    .orderByDesc(CarInfoRecord::getCreateTime)
                    .last("limit 1"));
            if(carInfoRecord != null){
                record.setCarInfoRecordId(carInfoRecord.getId());
                record.setOdometerMileage(carInfoRecord.getOdometerMileage());
                if("使用中".equals(record.getUsageStatus())){
                    record.setCurrentUserName(carInfoRecord.getUserName());
                }
            }
        }
        return page1;
    }
}
src/main/java/com/ruoyi/procurementrecord/dto/ProcurementRecordOutPageDto.java
@@ -27,6 +27,11 @@
    private String salesContractNo;
    /**
     * é‡‡è´­åˆåŒå·
     */
    private String purchaseContractNumber;
    /**
     * å®¢æˆ·åˆåŒå·
     */
    private String customerContractNo;
src/main/java/com/ruoyi/procurementrecord/service/impl/ProcurementRecordServiceImpl.java
@@ -775,7 +775,7 @@
                    .type(procurementDto.getType())
                    .warnNum(detail.getWarnNum())
                    .unitPrice(detail.getUnitPrice())
                    .totalPrice(detail.getInboundQuantity().multiply(detail.getUnitPrice()))
//                    .totalPrice(detail.getInboundQuantity().multiply(detail.getUnitPrice()))
                    .createTime(LocalDateTime.now())
                    .createUser(loginUser.getUserId())
                    .updateTime(LocalDateTime.now())
@@ -784,15 +784,6 @@
                    .productModelId(detail.getProductModelId())
                    .qualityInspectId(ObjectUtils.isNotNull(procurementDto.getQualityInspectId())?procurementDto.getQualityInspectId():0L);
            this.save(procurementRecordBuilder.build());
            // å…¥åº“成功减掉采购数量
//            LambdaQueryWrapper<SalesLedgerProduct> salesLedgerProductLambdaQueryWrapper = new LambdaQueryWrapper<>();
//            salesLedgerProductLambdaQueryWrapper.eq(SalesLedgerProduct::getId, detail.getId());
//            SalesLedgerProduct salesLedgerProduct = salesLedgerProductMapper.selectOne(salesLedgerProductLambdaQueryWrapper);
//            if(salesLedgerProduct == null){
//               throw new RuntimeException("未找到该商品");
//            }
//            salesLedgerProduct.setQuantity(salesLedgerProduct.getQuantity().subtract(detail.getInboundQuantity()));
//            salesLedgerProductMapper.updateById(salesLedgerProduct);
        }
        return 1;
    }
src/main/java/com/ruoyi/production/controller/ProductOrderController.java
@@ -15,6 +15,7 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
@@ -38,6 +39,18 @@
        return R.ok(1);
    }
    @ApiOperation("删除生产订单")
    @DeleteMapping("/delete")
    @Transactional(rollbackFor = Exception.class)
    public R delete(@RequestBody List<Long> ids) {
        // æ‰¹é‡åˆ é™¤äº§å“å­è¡¨
        if (!ids.isEmpty()) {
            salesLedgerProductService.removeByIds(ids);
        }
        salesLedgerProductService.deleteProductionData(ids);
        return R.ok(1);
    }
    @ApiOperation("分页查询")
    @GetMapping("page")
src/main/java/com/ruoyi/production/dto/ProductOrderDto.java
@@ -13,15 +13,15 @@
public class ProductOrderDto extends ProductOrder {
    @ApiModelProperty(value = "销售合同号")
    @Excel(name = "销售合同号")
//    @Excel(name = "销售合同号")
    private String salesContractNo;
    @ApiModelProperty(value = "项目名")
    @Excel(name = "项目名")
//    @Excel(name = "项目名")
    private String projectName;
    @ApiModelProperty(value = "客户名称")
    @Excel(name = "客户名称")
//    @Excel(name = "客户名称")
    private String customerName;
    @ApiModelProperty(value = "产品名称")
src/main/java/com/ruoyi/production/service/impl/ProductionProductMainServiceImpl.java
@@ -5,6 +5,7 @@
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -15,8 +16,10 @@
import com.ruoyi.basic.pojo.ProductModel;
import com.ruoyi.common.utils.SecurityUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper;
import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordOut;
import com.ruoyi.procurementrecord.pojo.ProcurementRecordStorage;
import com.ruoyi.procurementrecord.utils.StockUtils;
import com.ruoyi.production.controller.ProductWorkOrderController;
import com.ruoyi.production.dto.ProductStructureDto;
@@ -28,6 +31,8 @@
import com.ruoyi.project.system.mapper.SysUserMapper;
import com.ruoyi.quality.mapper.*;
import com.ruoyi.quality.pojo.*;
import com.ruoyi.sales.mapper.SalesLedgerProductMapper;
import com.ruoyi.sales.pojo.SalesLedgerProduct;
import io.swagger.models.auth.In;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
@@ -43,6 +48,7 @@
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
@Service
@AllArgsConstructor
@@ -50,6 +56,7 @@
public class ProductionProductMainServiceImpl extends ServiceImpl<ProductionProductMainMapper, ProductionProductMain> implements ProductionProductMainService {
    private final ProcurementRecordOutMapper procurementRecordOutMapper;
    private ProcurementRecordMapper procurementRecordMapper;
    private ProductionProductMainMapper productionProductMainMapper;
    private ProductWorkOrderController productWorkOrderController;
@@ -62,6 +69,8 @@
    private ProductionProductOutputMapper productionProductOutputMapper;
    private ProcessRouteItemMapper processRouteItemMapper;
    private SalesLedgerProductMapper salesLedgerProductMapper;
    private ProductModelMapper productModelMapper;
@@ -155,6 +164,7 @@
        for (ProductStructureDto productStructureDto : productStructureDtos) {
            ProductModel productModel1 = productModelMapper.selectById(productStructureDto.getProductModelId());
            Product product = productMapper.selectById(productModel1.getProductId());
            // æŸ¥è¯¢äº§å“åº“å­˜
            BigDecimal stockQuantity = stockUtils.getStockQuantity(productModel1.getId()).get("stockQuantity");
            if (!(stockQuantity.compareTo(BigDecimal.ZERO) > 0)) {
                throw new RuntimeException(product.getProductName()+"产品的"+productModel1.getModel() + "的规格库存为0");
@@ -162,6 +172,11 @@
            if (stockQuantity.compareTo(productStructureDto.getUnitQuantity().multiply(dto.getQuantity())) < 0) {
                throw new RuntimeException(product.getProductName()+"产品的"+productModel1.getModel() + "的规格库存不足");
            }
            // æŸ¥è¯¢é‡‡è´­äº§å“
            List<SalesLedgerProduct> salesLedgerProducts = salesLedgerProductMapper.selectList(new LambdaQueryWrapper<SalesLedgerProduct>()
                    .eq(SalesLedgerProduct::getProductModelId, productStructureDto.getProductModelId())
                    .eq(SalesLedgerProduct::getType, 2));
            ProductionProductInput productionProductInput = new ProductionProductInput();
            productionProductInput.setProductModelId(productStructureDto.getProductModelId());
            productionProductInput.setQuantity(productStructureDto.getUnitQuantity().multiply(dto.getQuantity()));
@@ -172,16 +187,49 @@
            LocalDate now = LocalDate.now();
            ProcurementRecordOut procurementRecordOut1 = procurementRecordOutMapper.selectCode(dateFormat.format(now));
            Long aLong = procurementRecordOut1 == null ? 1L : Long.valueOf(procurementRecordOut1.getCode().split("LS" + dateFormat.format(now))[1]);
            ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                    .procurementRecordStorageId(0)
                    .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
                    .salesLedgerProductId(productionProductMain.getId())//关联报工产出
                    .inboundBatches(aLong.equals(0L) ? "第1批次" : "第" + (aLong + 1) + "批次")
                    .inboundNum(productionProductInput.getQuantity())
                    .type(4)
                    .createBy(user.getNickName())
                    .productModelId(productModel1.getId());
            procurementRecordOutMapper.insert(procurementRecordOut.build());
            // æŸ¥è¯¢é‡‡è´­å…¥åº“记录
            List<ProcurementRecordStorage> procurementRecordStorages = procurementRecordMapper.selectList(new LambdaQueryWrapper<ProcurementRecordStorage>()
                    .in(ProcurementRecordStorage::getSalesLedgerProductId, salesLedgerProducts.stream()
                            .map(SalesLedgerProduct::getId)
                            .collect(Collectors.toList()))
                    .orderByDesc(ProcurementRecordStorage::getInboundNum));
            if(CollectionUtils.isNotEmpty(procurementRecordStorages)) {
                // ç”Ÿäº§æ‰£é™¤é‡‡è´­åº“存原料
                BigDecimal quantity = productionProductInput.getQuantity();
                int i = 0;
                while (quantity.compareTo(BigDecimal.ZERO) > 0){
                    ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                            .procurementRecordStorageId(procurementRecordStorages.get(i).getId())
                            .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
                            .salesLedgerProductId(productionProductMain.getId())//关联报工产出
                            .inboundBatches(aLong.equals(0L) ? "第1批次" : "第" + (aLong + 1) + "批次")
                            .type(1)
                            .createBy(user.getNickName())
                            .productModelId(productModel1.getId());
                    if(quantity.compareTo(procurementRecordStorages.get(i).getInboundNum()) >= 0){
                        // ä¸‹æ–™æ•°é‡å¤§äºŽç­‰äºŽé‡‡è´­å…¥åº“数量,则出库数量为采购入库数量,并继续出库下一条记录
                        procurementRecordOut.inboundNum(procurementRecordStorages.get(i).getInboundNum());
                        quantity = quantity.subtract(procurementRecordStorages.get(i).getInboundNum());
                    }else{
                        procurementRecordOut.inboundNum(quantity);
                        quantity = BigDecimal.ZERO;
                    }
                    procurementRecordOutMapper.insert(procurementRecordOut.build());
                    i++;
                }
            }else{
                ProcurementRecordOut.ProcurementRecordOutBuilder procurementRecordOut = ProcurementRecordOut.builder()
                        .procurementRecordStorageId(0)
                        .code("LS" + dateFormat.format(now) + String.format("%03d", aLong + 1))
                        .salesLedgerProductId(productionProductMain.getId())//关联报工产出
                        .inboundBatches(aLong.equals(0L) ? "第1批次" : "第" + (aLong + 1) + "批次")
                        .inboundNum(productionProductInput.getQuantity())
                        .type(4)
                        .createBy(user.getNickName())
                        .productModelId(productModel1.getId());
                procurementRecordOutMapper.insert(procurementRecordOut.build());
            }
        }
        /*新增报工产出表*/
        ProductionProductOutput productionProductOutput = new ProductionProductOutput();
@@ -191,38 +239,37 @@
        productionProductOutputMapper.insert(productionProductOutput);
        //对应的过程检或者出厂检
        List<ProductProcessRouteItem> productProcessRouteItems = productProcessRouteItemMapper.selectList(Wrappers.<ProductProcessRouteItem>lambdaQuery().eq(ProductProcessRouteItem::getProductRouteId, productProcessRouteItem.getProductRouteId()));
        int inspectType = 1;
        if (productProcessRouteItem.getDragSort()==productProcessRouteItems.size()){
            //最后一道工序生成出厂检
            inspectType = 2;
            Product product = productMapper.selectById(productModel.getProductId());
            QualityInspect qualityInspect = new QualityInspect();
            qualityInspect.setProductId(product.getId());
            qualityInspect.setProductName(product.getProductName());
            qualityInspect.setModel(productModel.getModel());
            qualityInspect.setUnit(productModel.getUnit());
            qualityInspect.setQuantity(dto.getQuantity());
            qualityInspect.setProcess(productProcess.getName());
            qualityInspect.setInspectState(0);
            qualityInspect.setInspectType(2);  // åŽ»æŽ‰è‡ªåŠ¨è¿›å…¥è¿‡ç¨‹æ£€éªŒé€»è¾‘
            qualityInspect.setProductMainId(productionProductMain.getId());
            qualityInspect.setProductModelId(productModel.getId());
            qualityInspectMapper.insert(qualityInspect);
            List<QualityTestStandardBinding> qualityTestStandardBindings = qualityTestStandardBindingMapper.selectList(
                    new LambdaQueryWrapper<QualityTestStandardBinding>()
                            .eq(QualityTestStandardBinding::getProductId, product.getId()));
            if (qualityTestStandardBindings.size()>0){
                qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
                                .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandardBindings.get(0).getTestStandardId()))
                        .forEach(qualityTestStandardParam -> {
                            QualityInspectParam param = new QualityInspectParam();
                            BeanUtils.copyProperties(qualityTestStandardParam, param);
                            param.setId(null);
                            param.setInspectId(qualityInspect.getId());
                            qualityInspectParamMapper.insert(param);
                        });
            }
        }
        Product product = productMapper.selectById(productModel.getProductId());
        QualityInspect qualityInspect = new QualityInspect();
        qualityInspect.setProductId(product.getId());
        qualityInspect.setProductName(product.getProductName());
        qualityInspect.setModel(productModel.getModel());
        qualityInspect.setUnit(productModel.getUnit());
        qualityInspect.setQuantity(dto.getQuantity());
        qualityInspect.setProcess(productProcess.getName());
        qualityInspect.setInspectState(0);
        qualityInspect.setInspectType(inspectType);
        qualityInspect.setProductMainId(productionProductMain.getId());
        qualityInspect.setProductModelId(productModel.getId());
        qualityInspectMapper.insert(qualityInspect);
        List<QualityTestStandardBinding> qualityTestStandardBindings = qualityTestStandardBindingMapper.selectList(
                new LambdaQueryWrapper<QualityTestStandardBinding>()
                        .eq(QualityTestStandardBinding::getProductId, product.getId()));
        if (qualityTestStandardBindings.size()>0){
            qualityTestStandardParamMapper.selectList(Wrappers.<QualityTestStandardParam>lambdaQuery()
                    .eq(QualityTestStandardParam::getTestStandardId,qualityTestStandardBindings.get(0).getTestStandardId()))
                    .forEach(qualityTestStandardParam -> {
                QualityInspectParam param = new QualityInspectParam();
                BeanUtils.copyProperties(qualityTestStandardParam, param);
                param.setId(null);
                param.setInspectId(qualityInspect.getId());
                qualityInspectParamMapper.insert(param);
            });
        }
        /*更新工单和生产订单*/
        ProductWorkOrder productWorkOrder = productWorkOrderMapper.selectById(dto.getWorkOrderId());
        productWorkOrder.setCompleteQuantity(productWorkOrder.getCompleteQuantity().add(dto.getQuantity()));
src/main/java/com/ruoyi/sales/service/impl/SalesLedgerServiceImpl.java
@@ -503,6 +503,7 @@
        List<Long> productIds = products.stream()
                .map(SalesLedgerProduct::getId)
                .collect(Collectors.toList());
        //删除生产数据
        salesLedgerProductServiceImpl.deleteProductionData(productIds);
@@ -510,7 +511,6 @@
        if (!productIds.isEmpty()) {
            salesLedgerProductMapper.deleteBatchIds(productIds);
        }
        LambdaQueryWrapper<InvoiceRegistrationProduct> wrapper = new LambdaQueryWrapper<>();
        wrapper.in(InvoiceRegistrationProduct::getSalesLedgerId, idList);
        List<InvoiceRegistrationProduct> invoiceRegistrationProducts = invoiceRegistrationProductMapper.selectList(wrapper);
src/main/resources/mapper/approve/CarInfoMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,24 @@
<?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.approve.mapper.CarInfoMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.CarInfo">
        <id column="id" property="id" />
        <result column="car_no" property="carNo" />
        <result column="color" property="color" />
        <result column="status" property="status" />
        <result column="brand" property="brand" />
        <result column="usage_status" property="usageStatus" />
        <result column="borrowing_date" property="borrowingDate" />
        <result column="desc" property="desc" />
        <result column="odometer_mileage" property="odometerMileage" />
        <result column="this_trip_mileage" property="thisTripMileage" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
    </resultMap>
</mapper>
src/main/resources/mapper/approve/CarInfoRecordMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ruoyi.approve.mapper.CarInfoRecordMapper">
    <!-- é€šç”¨æŸ¥è¯¢æ˜ å°„结果 -->
    <resultMap id="BaseResultMap" type="com.ruoyi.approve.pojo.CarInfoRecord">
        <id column="id" property="id" />
        <result column="car_info_id" property="carInfoId" />
        <result column="odometer_mileage" property="odometerMileage" />
        <result column="car_return_date" property="carReturnDate" />
        <result column="user_name" property="userName" />
        <result column="remark" property="remark" />
        <result column="create_time" property="createTime" />
        <result column="create_user" property="createUser" />
        <result column="update_time" property="updateTime" />
        <result column="update_user" property="updateUser" />
    </resultMap>
</mapper>
src/main/resources/mapper/procurementrecord/ProcurementRecordMapper.xml
@@ -258,7 +258,7 @@
        t2.warn_num,
        t2.product_id
        from  procurement_record_storage t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 3
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        <where>
            t1.type = 2 and t1.sales_ledger_product_id != 0
src/main/resources/mapper/procurementrecord/ProcurementRecordOutMapper.xml
@@ -5,6 +5,7 @@
    <select id="listPage" resultType="com.ruoyi.procurementrecord.dto.ProcurementRecordOutPageDto">
        select
        t3.supplier_name,
        t3.purchase_contract_number,
        t2.product_category,
        t1.id,
        t1.code,
@@ -21,9 +22,9 @@
        t4.unit_price,
        t4.unit_price * t1.inbound_num as totalPrice
        from procurement_record_out t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 2
        left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
        left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 2
        left join purchase_ledger t3 on t3.id = t2.sales_ledger_id
        <where>
            and t1.type = 1
            <if test="req.supplierName != null and req.supplierName != ''">
@@ -117,9 +118,9 @@
        t4.unit_price,
        t4.unit_price * t1.inbound_num as totalPrice
        from procurement_record_out t1
        left join sales_ledger_product t2 on t2.id = t1.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        left join procurement_record_storage t4 on t4.id = t1.procurement_record_storage_id
        left join sales_ledger_product t2 on t2.id = t4.sales_ledger_product_id and t2.type = 1
        left join sales_ledger t3 on t3.id = t2.sales_ledger_id
        <where>
            and t1.type = 2
            <if test="req.customerName != null and req.customerName != ''">
src/main/resources/mapper/production/ProductOrderMapper.xml
@@ -15,15 +15,12 @@
    </resultMap>
    <select id="pageProductOrder" resultType="com.ruoyi.production.dto.ProductOrderDto">
        select po.*,
        sl.sales_contract_no,
        sl.customer_name,
        slp.product_category,
        slp.specification_model,
        ppr.process_route_code,
        pb.bom_no,
        ROUND(po.complete_quantity / po.quantity * 100, 2) AS completionStatus
        from product_order po
        left join sales_ledger sl on po.sales_ledger_id = sl.id
        left join sales_ledger_product slp on po.product_model_id = slp.id
        left join product_process_route ppr on po.id = ppr.product_order_id
        left join product_bom pb on pb.id = ppr.bom_id