新火炬后端单体项目初始化代码
feat(cms):
- 在`CuttingInventoryServiceImpl`中添加了批量更新库存状态的方法,并添加了事务注解。
- 在`CuttingReceive`实体类中添加了领用单对库存状态变化功能
- 在`CuttingReceiveController`中添加了提交领用单的方法,并优化了部分方法的参数和逻辑。
- 在`CuttingReceiveDetailMapper.xml`中添加了库存ID字段,以让数据库能正常获取库存id。
- 在`CuttingReceiveServiceImpl`中实现了提交领用单的逻辑,并添加了日志记录。- 在`ICuttingInventoryService`接口中添加了批量更新库存状态的方法。
- 在`ICuttingReceiveService`接口中添加了提交领用单的方法。
已修改9个文件
188 ■■■■■ 文件已修改
src/main/java/org/jeecg/modules/cms/controller/CuttingInventoryController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/entity/CuttingReceive.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveDetailMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/ICuttingInventoryService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/org/jeecg/modules/cms/controller/CuttingInventoryController.java
@@ -1,8 +1,7 @@
package org.jeecg.modules.cms.controller;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.stream.Collectors;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
src/main/java/org/jeecg/modules/cms/controller/CuttingReceiveController.java
@@ -3,6 +3,7 @@
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
@@ -12,6 +13,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import io.micrometer.core.annotation.Timed;
import liquibase.pro.packaged.G;
import org.jeecg.common.api.vo.Result;
import org.jeecg.common.system.query.QueryGenerator;
@@ -43,10 +45,10 @@
import org.jeecg.common.aspect.annotation.AutoLog;
/**
 * @Description: 刀具领用单
 * @Author: jeecg-boot
 * @Date: 2025-07-28
 * @Version: V1.0
 * @Description:  刀具领用单
 * @Author:  jeecg-boot
 * @Date:  2025-07-28
 * @Version:  V1.0
 */
@Api(tags = "刀具领用单")
@RestController
@@ -58,14 +60,12 @@
    @Autowired
    private ICuttingReceiveDetailService cuttingReceiveDetailService;
    @Autowired
    private ICuttingInventoryService cuttingInventoryService;
    /**
     * 分页列表查询
     *
     * @param cuttingReceive
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    //@AutoLog(value = "刀具领用单-分页列表查询")
    @ApiOperation(value = "刀具领用单-分页列表查询", notes = "刀具领用单-分页列表查询")
@@ -75,16 +75,13 @@
                                                       @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
                                                       HttpServletRequest req) {
        QueryWrapper<CuttingReceive> queryWrapper = QueryGenerator.initQueryWrapper(cuttingReceive, req.getParameterMap());
        Page<CuttingReceive> page = new Page<CuttingReceive>(pageNo, pageSize);
        Page<CuttingReceive> page = new Page<>(pageNo, pageSize);
        IPage<CuttingReceive> pageList = cuttingReceiveService.page(page, queryWrapper);
        return Result.OK(pageList);
    }
    /**
     * 添加
     *
     * @param jSONObject
     * @return
     */
    @AutoLog(value = "刀具领用单-添加")
    @ApiOperation(value = "刀具领用单-添加", notes = "刀具领用单-添加")
@@ -99,23 +96,32 @@
        // 删除原有关联的明细数据
        List<CuttingReceiveDetail> cuttingReceiveDetailList = cuttingReceiveDetailService.lambdaQuery().eq(CuttingReceiveDetail::getOrderId, cuttingReceive.getId()).list();
        cuttingReceiveDetailService.removeBatchByIds(cuttingReceiveDetailList);
        // 重新添加新的明细数据
        JSONArray jsonArray = jSONObject.getJSONArray("detailData");
        List<CuttingReceiveDetail> list = jsonArray.toJavaList(CuttingReceiveDetail.class);
        for (int i = 0; i < list.size(); i++) {
            CuttingReceiveDetail temp = list.get(i);
        for (CuttingReceiveDetail temp : list) {
            temp.setOrderId(cuttingReceive.getId());
            cuttingReceiveDetailService.save(temp);
        }
        // 更新库存刀具状态为"已出库"
        if (!list.isEmpty()) {
            // 收集所有需要更新状态的库存ID
            List<String> inventoryIds = list.stream()
                    .map(CuttingReceiveDetail::getInventoryId) // 假设CuttingReceiveDetail中有inventoryId字段
                    .filter(id -> id != null && !id.isEmpty())
                    .collect(Collectors.toList());
            if (!inventoryIds.isEmpty()) {
                // 更新库存状态为"已出库"
                cuttingInventoryService.updateStatus(inventoryIds, "待出库");
            }
        }
        return Result.OK("添加成功!");
    }
    /**
     * 编辑
     *
     * @param cuttingReceive
     * @return
     */
    @AutoLog(value = "刀具领用单-编辑")
    @ApiOperation(value = "刀具领用单-编辑", notes = "刀具领用单-编辑")
@@ -128,44 +134,35 @@
    /**
     * 通过id删除
     *
     * @param id
     * @return
     */
    @AutoLog(value = "刀具领用单-通过id删除")
    @ApiOperation(value = "刀具领用单-通过id删除", notes = "刀具领用单-通过id删除")
    //@RequiresPermissions("org.jeecg.modules:cms_cutting_receive:delete")
    @DeleteMapping(value = "/delete")
    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
    public Result<String> delete(@RequestParam(name = "id") String id) {
        cuttingReceiveService.removeById(id);
        return Result.OK("删除成功!");
    }
    /**
     * 批量删除
     *
     * @param ids
     * @return
     */
    @AutoLog(value = "刀具领用单-批量删除")
    @ApiOperation(value = "刀具领用单-批量删除", notes = "刀具领用单-批量删除")
    //@RequiresPermissions("org.jeecg.modules:cms_cutting_receive:deleteBatch")
    @DeleteMapping(value = "/deleteBatch")
    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
    public Result<String> deleteBatch(@RequestParam(name = "ids") String ids) {
        this.cuttingReceiveService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.OK("批量删除成功!");
    }
    /**
     * 通过id查询
     *
     * @param id
     * @return
     */
    //@AutoLog(value = "刀具领用单-通过id查询")
    @ApiOperation(value = "刀具领用单-通过id查询", notes = "刀具领用单-通过id查询")
    @GetMapping(value = "/queryById")
    public Result<CuttingReceive> queryById(@RequestParam(name = "id", required = true) String id) {
    public Result<CuttingReceive> queryById(@RequestParam(name = "id") String id) {
        CuttingReceive cuttingReceive = cuttingReceiveService.getById(id);
        if (cuttingReceive == null) {
            return Result.error("未找到对应数据");
@@ -175,9 +172,6 @@
    /**
     * 导出excel
     *
     * @param request
     * @param cuttingReceive
     */
    //@RequiresPermissions("org.jeecg.modules:cms_cutting_receive:exportXls")
    @RequestMapping(value = "/exportXls")
@@ -187,10 +181,6 @@
    /**
     * 通过excel导入数据
     *
     * @param request
     * @param response
     * @return
     */
    //@RequiresPermissions("cms_cutting_receive:importExcel")
    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
@@ -200,9 +190,6 @@
    /**
     * 根据领用id查询领用明细
     *
     * @param orderId
     * @return
     */
    @GetMapping("/detailList")
    public Result<?> detailList(@RequestParam("orderId") String orderId) {
@@ -212,8 +199,6 @@
    /**
     * 选择库存刀具的列表
     *
     * @return
     */
    @GetMapping("/getInventoryToolList")
    public Result<?> getInventoryToolList(@RequestParam("pageNo") Integer pageNo,
@@ -222,4 +207,12 @@
        IPage<Map<String, Object>> inventoryTooList = cuttingReceiveService.getInventoryToolList(pageNo, pageSize, params);
        return Result.ok(inventoryTooList);
    }
    @GetMapping("/submit")
    @Timed(value = "cutting.inbound.submit", description = "刀具入库提交耗时")
    public Result<?> submit(@RequestParam("orderId") String orderId) {
        return cuttingReceiveService.submit(orderId);
    }
    //TODO: @GetMapping("/handleBack")
}
src/main/java/org/jeecg/modules/cms/entity/CuttingReceive.java
@@ -59,6 +59,7 @@
    /**领用单状态*/
    @Excel(name = "领用单状态", width = 15)
    @ApiModelProperty(value = "领用单状态")
    @Dict(dicCode = "order_status")
    private String orderStatus;
    /**领用人*/
    @Excel(name = "领用人", width = 15)
src/main/java/org/jeecg/modules/cms/mapper/xml/CuttingReceiveDetailMapper.xml
@@ -9,9 +9,10 @@
            t1.cutting_id cuttingId,
            t1.workpiece_material workpieceMaterial,
            t1.used_life usedLife,
            t2.cutting_barcode cuttingCBarcode,
            t2.cutting_barcode cuttingBarcode,
            t2.inventory_status inventoryStatus,
            t2.current_life currentLife,
            t2.id inventoryId,
            t3.cutting_code cuttingCode,
            t3.cutting_name cuttingName
        FROM
src/main/java/org/jeecg/modules/cms/service/ICuttingInventoryService.java
@@ -17,5 +17,6 @@
public interface ICuttingInventoryService extends IService<CuttingInventory> {
    IPage<Map<String, Object>> statisticsByCuttingIdAndStatus(Page<Map<String, Object>> page);
    void updateStatus(List<String> ids, String status);
}
src/main/java/org/jeecg/modules/cms/service/ICuttingReceiveService.java
@@ -1,6 +1,7 @@
package org.jeecg.modules.cms.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.cms.entity.CuttingReceive;
import com.baomidou.mybatisplus.extension.service.IService;
@@ -15,4 +16,5 @@
public interface ICuttingReceiveService extends IService<CuttingReceive> {
    IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params);
    Result<?> submit(String orderId);
}
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInboundServiceImpl.java
@@ -89,6 +89,13 @@
        // 条码生成规则示例:刀具ID + 序号(4位) + 随机数
        return cuttingId + String.format("%04d", index + 1) + (int) (Math.random() * 10000);
    }
    /**
     * 提交入库单
     *
     * @param orderId 入库单ID
     * @return 提交结果
     */
    @Override
    @Timed(value = "cutting.inbound.submit", description = "刀具入库提交耗时")
    public synchronized Result<?> submit(String orderId) {
@@ -160,8 +167,4 @@
            return Result.error("提交失败: " + e.getMessage());
        }
    }
}
src/main/java/org/jeecg/modules/cms/service/impl/CuttingInventoryServiceImpl.java
@@ -1,21 +1,19 @@
package org.jeecg.modules.cms.service.impl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.jeecg.modules.cms.entity.CuttingInventory;
import org.jeecg.modules.cms.mapper.CuttingInventoryMapper;
import org.jeecg.modules.cms.mapper.CuttingToolMapper;
import org.jeecg.modules.cms.service.ICuttingInventoryService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
/**
 * @Description: 刀具库存
@@ -30,4 +28,15 @@
        IPage<Map<String, Object>> result = baseMapper.statisticsByCuttingIdAndStatus(page);
        return result;
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void updateStatus(List<String> ids, String status) {
        if (ids != null && !ids.isEmpty() && StringUtils.isNotBlank(status)) {
            UpdateWrapper<CuttingInventory> updateWrapper = new UpdateWrapper<>();
            updateWrapper.in("id", ids);
            updateWrapper.set("inventory_status", status); // 根据实际数据库字段名调整
            this.update(updateWrapper);
        }
    }
}
src/main/java/org/jeecg/modules/cms/service/impl/CuttingReceiveServiceImpl.java
@@ -2,13 +2,22 @@
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.micrometer.core.annotation.Timed;
import lombok.extern.slf4j.Slf4j;
import org.jeecg.common.api.vo.Result;
import org.jeecg.modules.cms.entity.CuttingReceive;
import org.jeecg.modules.cms.entity.CuttingReceiveDetail;
import org.jeecg.modules.cms.mapper.CuttingReceiveMapper;
import org.jeecg.modules.cms.service.ICuttingInventoryService;
import org.jeecg.modules.cms.service.ICuttingReceiveDetailService;
import org.jeecg.modules.cms.service.ICuttingReceiveService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
@@ -17,12 +26,66 @@
 * @Date:   2025-07-28
 * @Version: V1.0
 */
@Slf4j
@Service
public class CuttingReceiveServiceImpl extends ServiceImpl<CuttingReceiveMapper, CuttingReceive> implements ICuttingReceiveService {
    @Autowired
    private ICuttingInventoryService cuttingInventoryService;
    @Autowired
    private ICuttingReceiveDetailService cuttingReceiveDetailService;
    @Override
    public IPage<Map<String, Object>> getInventoryToolList(Integer pageNo, Integer pageSize, Map<String, Object> params) {
        IPage<Map> pageData = new Page<Map>(pageNo, pageSize);
        return super.getBaseMapper().getInventoryToolList(pageData,params);
    }
    @Override
    @Timed(value = "cutting.receive.submit", description = "刀具领用提交耗时")
    public synchronized Result<?> submit(String orderId) {
        long startTime = System.currentTimeMillis();
        try {
            // 1. 更新领用单状态
            CuttingReceive cuttingReceive = this.getById(orderId);
            if (cuttingReceive == null) {
                return Result.error("未找到对应的领用单");
            }
            // 检查领用单状态,只允许状态为"1"的领用单提交
            if (!"1".equals(cuttingReceive.getOrderStatus())) {
                return Result.error("只有状态为未提交的领用单才能执行提交操作");
            }
            cuttingReceive.setOrderStatus("2"); // 设置为已领用状态
            boolean updateResult = this.updateById(cuttingReceive);
            if (!updateResult) {
                return Result.error("更新领用单状态失败,可能已被其他用户处理");
            }
            // 2. 获取领用明细
            List<CuttingReceiveDetail> detailList = cuttingReceiveDetailService.lambdaQuery()
                    .eq(CuttingReceiveDetail::getOrderId, orderId)
                    .list();
            // 3. 收集所有需要更新状态的库存ID
            List<String> inventoryIds = new ArrayList<>();
            for (CuttingReceiveDetail detail : detailList) {
                if (detail.getInventoryId() != null && !detail.getInventoryId().isEmpty()) {
                    inventoryIds.add(detail.getInventoryId());
                }
            }
            // 4. 批量更新库存状态为"已出库"
            if (!inventoryIds.isEmpty()) {
                cuttingInventoryService.updateStatus(inventoryIds, "已出库");
            }
            long endTime = System.currentTimeMillis();
            log.info("刀具领用提交完成,耗时: {} ms", (endTime - startTime));
            return Result.ok("提交成功");
        } catch (Exception e) {
            long endTime = System.currentTimeMillis();
            log.error("提交领用单失败,orderId: " + orderId + ",耗时: " + (endTime - startTime) + " ms", e);
            return Result.error("提交失败: " + e.getMessage());
        }
    }
}