feat(cost): 添加数据源注解和批量操作功能

- 为CostItemService、CostPriceService、CostProdDetailService、CostProdMetricService添加@DataSource注解
- 在CostProdDetailController中新增批量保存生产成本明细接口
- 实现CostProdDetailService的batchSaveWithDelete方法支持先删除再插入
- 添加CostProdDetailBo批量操作参数对象
- 在CostProdReportService中实现copyReport功能支持复制生产月报
- 配置数据源类型为KLP确保数据库连接正确
- 添加相应的映射器方法和SQL模板支持批量插入操作
This commit is contained in:
2026-06-09 10:39:19 +08:00
parent 75ff7790d8
commit c8350b5f0e
12 changed files with 284 additions and 49 deletions

View File

@@ -0,0 +1,40 @@
package com.ruoyi.cost.bo;
import com.ruoyi.cost.domain.CostProdDetail;
import java.util.List;
/**
* 生产成本明细批量操作参数
*
* @author ruoyi
* @date 2026-06-09
*/
public class CostProdDetailBo
{
/** 需删除的明细ID列表 */
private List<Long> detailIds;
/** 需保存的明细列表 */
private List<CostProdDetail> prodDetailList;
public List<Long> getDetailIds()
{
return detailIds;
}
public void setDetailIds(List<Long> detailIds)
{
this.detailIds = detailIds;
}
public List<CostProdDetail> getProdDetailList()
{
return prodDetailList;
}
public void setProdDetailList(List<CostProdDetail> prodDetailList)
{
this.prodDetailList = prodDetailList;
}
}

View File

@@ -18,12 +18,13 @@ import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.enums.BusinessType;
import com.ruoyi.cost.domain.CostProdDetail;
import com.ruoyi.cost.service.ICostProdDetailService;
import com.ruoyi.cost.bo.CostProdDetailBo;
import com.ruoyi.common.utils.poi.ExcelUtil;
import com.ruoyi.common.core.page.TableDataInfo;
/**
* 生产成本明细Controller
*
*
* @author ruoyi
* @date 2026-06-09
*/
@@ -101,4 +102,15 @@ public class CostProdDetailController extends BaseController
{
return toAjax(costProdDetailService.deleteCostProdDetailByDetailIds(detailIds));
}
/**
* 批量保存生产成本明细(先删除再插入)
*/
@PreAuthorize("@ss.hasPermi('cost:detail:add')")
@Log(title = "生产成本明细", businessType = BusinessType.INSERT)
@PostMapping("/batchSave")
public AjaxResult batchSave(@RequestBody CostProdDetailBo bo)
{
return toAjax(costProdDetailService.batchSaveWithDelete(bo));
}
}

View File

@@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.core.controller.BaseController;
@@ -80,6 +81,17 @@ public class CostProdReportController extends BaseController
return toAjax(costProdReportService.insertCostProdReport(costProdReport));
}
/**
* 复制生产月报
*/
@PreAuthorize("@ss.hasPermi('cost:report:add')")
@Log(title = "生产月报", businessType = BusinessType.INSERT)
@PostMapping("/copy")
public AjaxResult copy(@RequestParam Long sourceId, @RequestBody CostProdReport costProdReport)
{
return success(costProdReportService.copyReport(sourceId, costProdReport));
}
/**
* 修改生产月报
*/

View File

@@ -58,4 +58,12 @@ public interface CostProdDetailMapper
* @return 结果
*/
public int deleteCostProdDetailByDetailIds(Long[] detailIds);
/**
* 批量新增生产成本明细
*
* @param list 生产成本明细列表
* @return 结果
*/
public int insertBatch(List<CostProdDetail> list);
}

View File

@@ -2,18 +2,20 @@ package com.ruoyi.cost.service;
import java.util.List;
import com.ruoyi.cost.domain.CostProdDetail;
import com.ruoyi.cost.bo.CostProdDetailBo;
import org.springframework.transaction.annotation.Transactional;
/**
* 生产成本明细Service接口
*
*
* @author ruoyi
* @date 2026-06-09
*/
public interface ICostProdDetailService
public interface ICostProdDetailService
{
/**
* 查询生产成本明细
*
*
* @param detailId 生产成本明细主键
* @return 生产成本明细
*/
@@ -21,7 +23,7 @@ public interface ICostProdDetailService
/**
* 查询生产成本明细列表
*
*
* @param costProdDetail 生产成本明细
* @return 生产成本明细集合
*/
@@ -29,7 +31,7 @@ public interface ICostProdDetailService
/**
* 新增生产成本明细
*
*
* @param costProdDetail 生产成本明细
* @return 结果
*/
@@ -37,7 +39,7 @@ public interface ICostProdDetailService
/**
* 修改生产成本明细
*
*
* @param costProdDetail 生产成本明细
* @return 结果
*/
@@ -45,7 +47,7 @@ public interface ICostProdDetailService
/**
* 批量删除生产成本明细
*
*
* @param detailIds 需要删除的生产成本明细主键集合
* @return 结果
*/
@@ -53,9 +55,19 @@ public interface ICostProdDetailService
/**
* 删除生产成本明细信息
*
*
* @param detailId 生产成本明细主键
* @return 结果
*/
public int deleteCostProdDetailByDetailId(Long detailId);
/**
* 批量保存生产成本明细(先删除再插入)
*
* @param bo 批量操作参数
* @return 结果
*/
@Transactional(rollbackFor = Exception.class)
public Boolean batchSaveWithDelete(CostProdDetailBo bo);
}

View File

@@ -58,4 +58,14 @@ public interface ICostProdReportService
* @return 结果
*/
public int deleteCostProdReportByReportId(Long reportId);
/**
* 复制生产月报
* 明细列原样保留itemId不变指标列重新插入并更新config中的id引用
*
* @param sourceId 源报表ID
* @param bo 新报表覆盖字段
* @return 新报表
*/
public CostProdReport copyReport(Long sourceId, CostProdReport bo);
}

View File

@@ -1,6 +1,9 @@
package com.ruoyi.cost.service.impl;
import java.util.List;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -10,19 +13,20 @@ import com.ruoyi.cost.service.ICostItemService;
/**
* 成本项目配置Service业务层处理
*
*
* @author ruoyi
* @date 2026-06-09
*/
@Service
public class CostItemServiceImpl implements ICostItemService
@DataSource(DataSourceType.KLP)
public class CostItemServiceImpl implements ICostItemService
{
@Autowired
private CostItemMapper costItemMapper;
/**
* 查询成本项目配置
*
*
* @param itemId 成本项目配置主键
* @return 成本项目配置
*/
@@ -34,7 +38,7 @@ public class CostItemServiceImpl implements ICostItemService
/**
* 查询成本项目配置列表
*
*
* @param costItem 成本项目配置
* @return 成本项目配置
*/
@@ -46,7 +50,7 @@ public class CostItemServiceImpl implements ICostItemService
/**
* 新增成本项目配置
*
*
* @param costItem 成本项目配置
* @return 结果
*/
@@ -59,7 +63,7 @@ public class CostItemServiceImpl implements ICostItemService
/**
* 修改成本项目配置
*
*
* @param costItem 成本项目配置
* @return 结果
*/
@@ -72,7 +76,7 @@ public class CostItemServiceImpl implements ICostItemService
/**
* 批量删除成本项目配置
*
*
* @param itemIds 需要删除的成本项目配置主键
* @return 结果
*/
@@ -84,7 +88,7 @@ public class CostItemServiceImpl implements ICostItemService
/**
* 删除成本项目配置信息
*
*
* @param itemId 成本项目配置主键
* @return 结果
*/

View File

@@ -1,6 +1,9 @@
package com.ruoyi.cost.service.impl;
import java.util.List;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -10,19 +13,20 @@ import com.ruoyi.cost.service.ICostPriceService;
/**
* 成本单价历史Service业务层处理
*
*
* @author ruoyi
* @date 2026-06-09
*/
@Service
public class CostPriceServiceImpl implements ICostPriceService
@DataSource(DataSourceType.KLP)
public class CostPriceServiceImpl implements ICostPriceService
{
@Autowired
private CostPriceMapper costPriceMapper;
/**
* 查询成本单价历史
*
*
* @param priceId 成本单价历史主键
* @return 成本单价历史
*/
@@ -34,7 +38,7 @@ public class CostPriceServiceImpl implements ICostPriceService
/**
* 查询成本单价历史列表
*
*
* @param costPrice 成本单价历史
* @return 成本单价历史
*/
@@ -46,7 +50,7 @@ public class CostPriceServiceImpl implements ICostPriceService
/**
* 新增成本单价历史
*
*
* @param costPrice 成本单价历史
* @return 结果
*/
@@ -59,7 +63,7 @@ public class CostPriceServiceImpl implements ICostPriceService
/**
* 修改成本单价历史
*
*
* @param costPrice 成本单价历史
* @return 结果
*/
@@ -72,7 +76,7 @@ public class CostPriceServiceImpl implements ICostPriceService
/**
* 批量删除成本单价历史
*
*
* @param priceIds 需要删除的成本单价历史主键
* @return 结果
*/
@@ -84,7 +88,7 @@ public class CostPriceServiceImpl implements ICostPriceService
/**
* 删除成本单价历史信息
*
*
* @param priceId 成本单价历史主键
* @return 结果
*/

View File

@@ -1,28 +1,36 @@
package com.ruoyi.cost.service.impl;
import java.util.List;
import java.util.stream.Collectors;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import com.ruoyi.cost.mapper.CostProdDetailMapper;
import com.ruoyi.cost.domain.CostProdDetail;
import com.ruoyi.cost.service.ICostProdDetailService;
import com.ruoyi.cost.bo.CostProdDetailBo;
/**
* 生产成本明细Service业务层处理
*
*
* @author ruoyi
* @date 2026-06-09
*/
@Service
public class CostProdDetailServiceImpl implements ICostProdDetailService
@DataSource(DataSourceType.KLP)
public class CostProdDetailServiceImpl implements ICostProdDetailService
{
@Autowired
private CostProdDetailMapper costProdDetailMapper;
/**
* 查询生产成本明细
*
*
* @param detailId 生产成本明细主键
* @return 生产成本明细
*/
@@ -34,7 +42,7 @@ public class CostProdDetailServiceImpl implements ICostProdDetailService
/**
* 查询生产成本明细列表
*
*
* @param costProdDetail 生产成本明细
* @return 生产成本明细
*/
@@ -46,7 +54,7 @@ public class CostProdDetailServiceImpl implements ICostProdDetailService
/**
* 新增生产成本明细
*
*
* @param costProdDetail 生产成本明细
* @return 结果
*/
@@ -59,7 +67,7 @@ public class CostProdDetailServiceImpl implements ICostProdDetailService
/**
* 修改生产成本明细
*
*
* @param costProdDetail 生产成本明细
* @return 结果
*/
@@ -72,7 +80,7 @@ public class CostProdDetailServiceImpl implements ICostProdDetailService
/**
* 批量删除生产成本明细
*
*
* @param detailIds 需要删除的生产成本明细主键
* @return 结果
*/
@@ -84,7 +92,7 @@ public class CostProdDetailServiceImpl implements ICostProdDetailService
/**
* 删除生产成本明细信息
*
*
* @param detailId 生产成本明细主键
* @return 结果
*/
@@ -93,4 +101,29 @@ public class CostProdDetailServiceImpl implements ICostProdDetailService
{
return costProdDetailMapper.deleteCostProdDetailByDetailId(detailId);
}
/**
* 批量保存生产成本明细(先删除再插入)
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean batchSaveWithDelete(CostProdDetailBo bo)
{
if (!CollectionUtils.isEmpty(bo.getProdDetailList()))
{
if (!CollectionUtils.isEmpty(bo.getDetailIds()))
{
// 转成Long[]后删除
Long[] ids = bo.getDetailIds().toArray(new Long[0]);
costProdDetailMapper.deleteCostProdDetailByDetailIds(ids);
}
// 设置createTime后批量插入
List<CostProdDetail> list = bo.getProdDetailList().stream()
.peek(item -> item.setCreateTime(DateUtils.getNowDate()))
.collect(Collectors.toList());
return costProdDetailMapper.insertBatch(list) > 0;
}
return false;
}
}

View File

@@ -1,6 +1,9 @@
package com.ruoyi.cost.service.impl;
import java.util.List;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.utils.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -10,19 +13,20 @@ import com.ruoyi.cost.service.ICostProdMetricService;
/**
* 生产指标明细Service业务层处理
*
*
* @author ruoyi
* @date 2026-06-09
*/
@Service
public class CostProdMetricServiceImpl implements ICostProdMetricService
@DataSource(DataSourceType.KLP)
public class CostProdMetricServiceImpl implements ICostProdMetricService
{
@Autowired
private CostProdMetricMapper costProdMetricMapper;
/**
* 查询生产指标明细
*
*
* @param metricId 生产指标明细主键
* @return 生产指标明细
*/
@@ -34,7 +38,7 @@ public class CostProdMetricServiceImpl implements ICostProdMetricService
/**
* 查询生产指标明细列表
*
*
* @param costProdMetric 生产指标明细
* @return 生产指标明细
*/
@@ -46,7 +50,7 @@ public class CostProdMetricServiceImpl implements ICostProdMetricService
/**
* 新增生产指标明细
*
*
* @param costProdMetric 生产指标明细
* @return 结果
*/
@@ -59,7 +63,7 @@ public class CostProdMetricServiceImpl implements ICostProdMetricService
/**
* 修改生产指标明细
*
*
* @param costProdMetric 生产指标明细
* @return 结果
*/
@@ -72,7 +76,7 @@ public class CostProdMetricServiceImpl implements ICostProdMetricService
/**
* 批量删除生产指标明细
*
*
* @param metricIds 需要删除的生产指标明细主键
* @return 结果
*/
@@ -84,7 +88,7 @@ public class CostProdMetricServiceImpl implements ICostProdMetricService
/**
* 删除生产指标明细信息
*
*
* @param metricId 生产指标明细主键
* @return 结果
*/

View File

@@ -1,28 +1,42 @@
package com.ruoyi.cost.service.impl;
import java.util.List;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.common.annotation.DataSource;
import com.ruoyi.common.enums.DataSourceType;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.cost.mapper.CostProdMetricMapper;
import com.ruoyi.cost.mapper.CostProdReportMapper;
import com.ruoyi.cost.domain.CostProdMetric;
import com.ruoyi.cost.domain.CostProdReport;
import com.ruoyi.cost.service.ICostProdReportService;
/**
* 生产月报Service业务层处理
*
*
* @author ruoyi
* @date 2026-06-09
*/
@Service
public class CostProdReportServiceImpl implements ICostProdReportService
@DataSource(DataSourceType.KLP)
public class CostProdReportServiceImpl implements ICostProdReportService
{
@Autowired
private CostProdReportMapper costProdReportMapper;
@Autowired
private CostProdMetricMapper costProdMetricMapper;
/**
* 查询生产月报
*
*
* @param reportId 生产月报主键
* @return 生产月报
*/
@@ -34,7 +48,7 @@ public class CostProdReportServiceImpl implements ICostProdReportService
/**
* 查询生产月报列表
*
*
* @param costProdReport 生产月报
* @return 生产月报
*/
@@ -46,7 +60,7 @@ public class CostProdReportServiceImpl implements ICostProdReportService
/**
* 新增生产月报
*
*
* @param costProdReport 生产月报
* @return 结果
*/
@@ -59,7 +73,7 @@ public class CostProdReportServiceImpl implements ICostProdReportService
/**
* 修改生产月报
*
*
* @param costProdReport 生产月报
* @return 结果
*/
@@ -72,7 +86,7 @@ public class CostProdReportServiceImpl implements ICostProdReportService
/**
* 批量删除生产月报
*
*
* @param reportIds 需要删除的生产月报主键
* @return 结果
*/
@@ -84,7 +98,7 @@ public class CostProdReportServiceImpl implements ICostProdReportService
/**
* 删除生产月报信息
*
*
* @param reportId 生产月报主键
* @return 结果
*/
@@ -93,4 +107,79 @@ public class CostProdReportServiceImpl implements ICostProdReportService
{
return costProdReportMapper.deleteCostProdReportByReportId(reportId);
}
/**
* 复制生产月报
* 明细列原样保留itemId不变指标列重新插入并更新config中的id引用
*/
@Override
public CostProdReport copyReport(Long sourceId, CostProdReport bo)
{
CostProdReport source = costProdReportMapper.selectCostProdReportByReportId(sourceId);
if (source == null)
{
throw new RuntimeException("源报表不存在");
}
// 创建新报表先插入以获取ID
CostProdReport newRp = new CostProdReport();
BeanUtils.copyProperties(source, newRp, "reportId", "colConfig");
newRp.setReportTitle(bo.getReportTitle() != null ? bo.getReportTitle() : source.getReportTitle() + "-副本");
if (bo.getReportDate() != null) {
newRp.setReportDate(bo.getReportDate());
}
if (bo.getLineType() != null) {
newRp.setLineType(bo.getLineType());
}
if (bo.getInputWeight() != null) {
newRp.setInputWeight(bo.getInputWeight());
}
if (bo.getOutputWeight() != null) {
newRp.setOutputWeight(bo.getOutputWeight());
}
if (bo.getRemark() != null) {
newRp.setRemark(bo.getRemark());
}
newRp.setCreateTime(DateUtils.getNowDate());
costProdReportMapper.insertCostProdReport(newRp);
Long newRid = newRp.getReportId();
// 处理colConfig为每个指标列重新插入metric记录更新id引用
String colConfig = source.getColConfig();
if (StringUtils.isNotBlank(colConfig))
{
JSONObject cfg = JSON.parseObject(colConfig);
JSONArray columns = cfg.getJSONArray("columns");
if (columns != null && columns.size() > 0)
{
for (int i = 0; i < columns.size(); i++)
{
JSONObject col = columns.getJSONObject(i);
if ("m".equals(col.getString("t")))
{
String idStr = col.getString("id");
Long oldMetricId = idStr != null ? Long.parseLong(idStr) : null;
if (oldMetricId != null)
{
CostProdMetric srcMetric = costProdMetricMapper.selectCostProdMetricByMetricId(oldMetricId);
if (srcMetric != null)
{
CostProdMetric newMetric = new CostProdMetric();
BeanUtils.copyProperties(srcMetric, newMetric, "metricId", "reportId");
newMetric.setReportId(newRid);
newMetric.setCreateTime(DateUtils.getNowDate());
costProdMetricMapper.insertCostProdMetric(newMetric);
col.put("id", String.valueOf(newMetric.getMetricId()));
}
}
}
}
newRp.setColConfig(cfg.toString());
newRp.setUpdateTime(DateUtils.getNowDate());
costProdReportMapper.updateCostProdReport(newRp);
}
}
return costProdReportMapper.selectCostProdReportByReportId(newRid);
}
}

View File

@@ -107,4 +107,11 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{detailId}
</foreach>
</delete>
<insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="detailId">
insert into cost_prod_detail (report_id, shift, detail_date, item_id, quantity, unit_price, amount, remark, del_flag, create_by, create_time, update_by, update_time) values
<foreach collection="list" item="item" separator=",">
(#{item.reportId}, #{item.shift}, #{item.detailDate}, #{item.itemId}, #{item.quantity}, #{item.unitPrice}, #{item.amount}, #{item.remark}, #{item.delFlag}, #{item.createBy}, #{item.createTime}, #{item.updateBy}, #{item.updateTime})
</foreach>
</insert>
</mapper>